diff --git a/.gitignore b/.gitignore index 08f570ad06..693a35c176 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties *.springBeans +20171220-JMeter.csv diff --git a/.travis.yml b/.travis.yml index 3a953a2e7b..3d28a5cd76 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,8 @@ language: java before_install: - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc -install: travis_wait 60 mvn -q test -fae +install: skip +script: travis_wait 60 mvn -q test -fae sudo: required diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..40f5c88746 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Eugen Paraschiv + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index d94a786bc2..271aea0767 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,14 @@ The "REST with Spring" Classes ============================== + After 5 months of work, here's the Master Class of REST With Spring:
**[>> THE REST WITH SPRING MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)** +And here's the Master Class of Learn Spring Security:
+**[>> LEARN SPRING SECURITY MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)** + + Spring Tutorials ================ diff --git a/activejdbc/pom.xml b/activejdbc/pom.xml new file mode 100644 index 0000000000..7a49d37411 --- /dev/null +++ b/activejdbc/pom.xml @@ -0,0 +1,129 @@ + + 4.0.0 + com.baeldung + activejdbc + 1.0-SNAPSHOT + jar + activejdbc + http://maven.apache.org + + UTF-8 + 1.4.13 + development.test,development + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + 1.8 + 1.8 + UTF-8 + + + + org.javalite + activejdbc-instrumentation + ${activejdbc.version} + + + process-classes + + instrument + + + + + + org.javalite + db-migrator-maven-plugin + ${activejdbc.version} + + ${project.basedir}/src/main/resources/database.properties + ${environments} + + + + mysql + mysql-connector-java + 5.1.34 + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + brief + true + false + + **/*Spec*.java + **/*Test*.java + + + **/helpers/* + **/*$* + + + + + + + + junit + junit + 4.12 + test + + + org.javalite + activejdbc + ${activejdbc.version} + + + opensymphony + oscache + + + + + mysql + mysql-connector-java + 5.1.34 + + + org.slf4j + slf4j-simple + 1.7.9 + + + + + snapshots1 + JavaLite Snapshots1 + http://repo.javalite.io/ + + true + always + warn + + + + + + snapshots2 + JavaLite Snapshots2 + http://repo.javalite.io/ + + true + always + warn + + + + diff --git a/activejdbc/src/main/java/com/baeldung/ActiveJDBCApp.java b/activejdbc/src/main/java/com/baeldung/ActiveJDBCApp.java new file mode 100644 index 0000000000..8906d3e759 --- /dev/null +++ b/activejdbc/src/main/java/com/baeldung/ActiveJDBCApp.java @@ -0,0 +1,61 @@ +package com.baeldung; + + +import com.baeldung.model.Employee; +import com.baeldung.model.Role; +import org.javalite.activejdbc.Base; +import org.javalite.activejdbc.LazyList; +import org.javalite.activejdbc.Model; + +public class ActiveJDBCApp +{ + public static void main( String[] args ) + { + try { + Base.open(); + ActiveJDBCApp app = new ActiveJDBCApp(); + app.create(); + app.update(); + app.delete(); + app.deleteCascade(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + Base.close(); + } + } + + protected void create() { + Employee employee = new Employee("Hugo","C","M","BN"); + employee.saveIt(); + employee.add(new Role("Java Developer","BN")); + LazyList all = Employee.findAll(); + System.out.println(all.size()); + } + + protected void update() { + Employee employee = Employee.findFirst("first_name = ?","Hugo"); + employee.set("last_namea","Choi").saveIt(); + employee = Employee.findFirst("last_name = ?","Choi"); + System.out.println(employee.getString("first_name") + " " + employee.getString("last_name")); + } + + protected void delete() { + Employee employee = Employee.findFirst("first_name = ?","Hugo"); + employee.delete(); + employee = Employee.findFirst("last_name = ?","Choi"); + if(null == employee){ + System.out.println("No such Employee found!"); + } + } + + protected void deleteCascade() { + create(); + Employee employee = Employee.findFirst("first_name = ?","Hugo"); + employee.deleteCascade(); + employee = Employee.findFirst("last_name = ?","C"); + if(null == employee){ + System.out.println("No such Employee found!"); + } + } +} diff --git a/activejdbc/src/main/java/com/baeldung/model/Employee.java b/activejdbc/src/main/java/com/baeldung/model/Employee.java new file mode 100644 index 0000000000..b7fa8aaf1f --- /dev/null +++ b/activejdbc/src/main/java/com/baeldung/model/Employee.java @@ -0,0 +1,19 @@ +package com.baeldung.model; + + +import org.javalite.activejdbc.Model; + +public class Employee extends Model { + + public Employee(){ + + } + + public Employee(String firstName, String lastName, String gender, String createdBy) { + set("first_name1",firstName); + set("last_name",lastName); + set("gender",gender); + set("created_by",createdBy); + } + +} diff --git a/activejdbc/src/main/java/com/baeldung/model/Role.java b/activejdbc/src/main/java/com/baeldung/model/Role.java new file mode 100644 index 0000000000..3f425dbe6b --- /dev/null +++ b/activejdbc/src/main/java/com/baeldung/model/Role.java @@ -0,0 +1,18 @@ +package com.baeldung.model; + + +import org.javalite.activejdbc.Model; +import org.javalite.activejdbc.annotations.Table; + +@Table("EMP_ROLES") +public class Role extends Model { + + public Role(){ + + } + + public Role(String role,String createdBy){ + set("role_name",role); + set("created_by",createdBy); + } +} diff --git a/activejdbc/src/main/migration/_create_tables.sql b/activejdbc/src/main/migration/_create_tables.sql new file mode 100644 index 0000000000..19fc1e72d7 --- /dev/null +++ b/activejdbc/src/main/migration/_create_tables.sql @@ -0,0 +1,25 @@ +# noinspection SqlNoDataSourceInspectionForFile + +create table organisation.employees +( + id int not null auto_increment + primary key, + first_name varchar(100) not null, + last_name varchar(100) not null, + gender varchar(1) not null, + created_at datetime not null, + updated_at datetime null, + created_by varchar(100) not null, + updated_by varchar(100) null +)ENGINE = InnoDB DEFAULT CHARSET = utf8; + +create table organisation.emp_roles +( + id int not null auto_increment primary key, + employee_id int not null, + role_name varchar(100) not null, + created_at datetime not null, + updated_at datetime null, + created_by varchar(100) not null, + updated_by varchar(100) null +)ENGINE = InnoDB DEFAULT CHARSET = utf8; diff --git a/activejdbc/src/main/resources/database.properties b/activejdbc/src/main/resources/database.properties new file mode 100644 index 0000000000..7e665fe8a1 --- /dev/null +++ b/activejdbc/src/main/resources/database.properties @@ -0,0 +1,10 @@ +development.driver=com.mysql.jdbc.Driver +development.username=root +development.password=123456 +development.url=jdbc:mysql://localhost/organisation + + +development.test.driver=com.mysql.jdbc.Driver +development.test.username=root +development.test.password=123456 +development.test.url=jdbc:mysql://localhost/organisation_test \ No newline at end of file diff --git a/activejdbc/src/test/java/com/baeldung/ActiveJDBCAppTest.java b/activejdbc/src/test/java/com/baeldung/ActiveJDBCAppTest.java new file mode 100644 index 0000000000..316dc34712 --- /dev/null +++ b/activejdbc/src/test/java/com/baeldung/ActiveJDBCAppTest.java @@ -0,0 +1,51 @@ +package com.baeldung; + +import com.baeldung.model.Employee; +import com.baeldung.model.Role; +import org.javalite.activejdbc.test.DBSpec; +import org.junit.Test; + +import java.util.List; + +public class ActiveJDBCAppTest extends DBSpec +{ + @Test + public void ifEmployeeCreated_thenIsValid() { + Employee employee = new Employee("B", "N", "M", "BN"); + the(employee).shouldBe("valid"); + } + + @Test + public void ifEmployeeCreatedWithRoles_thenShouldPersist() { + Employee employee = new Employee("B", "N", "M", "BN"); + employee.saveIt(); + employee.add(new Role("Java Developer","BN")); + employee.add(new Role("Lead Java Developer","BN")); + a(Role.count()).shouldBeEqual(2); + List roles = employee.getAll(Role.class).orderBy("created_at"); + the(roles.get(0).getRoleName()).shouldBeEqual("Java Developer"); + the(roles.get(1).getRoleName()).shouldBeEqual("Lead Java Developer"); + } + + @Test + public void ifEmployeeCreatedWithRoles_whenNameUpdated_thenShouldShowNewName() { + Employee employee = new Employee("Binesh", "N", "M", "BN"); + employee.saveIt(); + employee.add(new Role("Java Developer","BN")); + employee.add(new Role("Lead Java Developer","BN")); + employee = Employee.findFirst("first_name = ?", "Binesh"); + employee.set("last_name","Narayanan").saveIt(); + Employee updated = Employee.findFirst("first_name = ?", "Binesh"); + the(updated.getLastName()).shouldBeEqual("Narayanan"); + } + + @Test + public void ifEmployeeCreatedWithRoles_whenDeleted_thenShouldNotBeFound() { + Employee employee = new Employee("Binesh", "N", "M", "BN"); + employee.saveIt(); + employee.add(new Role("Java Developer","BN")); + employee.delete(); + employee = Employee.findFirst("first_name = ?", "Binesh"); + the(employee).shouldBeNull(); + } +} diff --git a/algorithms/README.md b/algorithms/README.md index b0c5ee9d77..31cb8076d9 100644 --- a/algorithms/README.md +++ b/algorithms/README.md @@ -14,3 +14,6 @@ - [Bubble Sort in Java](http://www.baeldung.com/java-bubble-sort) - [Introduction to JGraphT](http://www.baeldung.com/jgrapht) - [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm) +- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance) +- [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element) +- [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm) diff --git a/algorithms/pom.xml b/algorithms/pom.xml index e972f39494..8751cf45c0 100644 --- a/algorithms/pom.xml +++ b/algorithms/pom.xml @@ -9,6 +9,7 @@ 1.5.0 1.16.12 3.6.1 + 1.0.1 @@ -39,8 +40,18 @@ jgrapht-core 1.0.1 + + pl.allegro.finance + tradukisto + ${tradukisto.version} + + + org.assertj + assertj-core + 3.9.0 + test + - @@ -71,4 +82,4 @@ - + \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java b/algorithms/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java new file mode 100644 index 0000000000..822abdae02 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/kthlargest/FindKthLargest.java @@ -0,0 +1,111 @@ +package com.baeldung.algorithms.kthlargest; + +import java.util.Arrays; +import java.util.Collections; +import java.util.stream.IntStream; + +public class FindKthLargest { + + public int findKthLargestBySorting(Integer[] arr, int k) { + Arrays.sort(arr); + int targetIndex = arr.length - k; + return arr[targetIndex]; + } + + public int findKthLargestBySortingDesc(Integer[] arr, int k) { + Arrays.sort(arr, Collections.reverseOrder()); + return arr[k - 1]; + } + + public int findKthElementByQuickSelect(Integer[] arr, int left, int right, int k) { + if (k >= 0 && k <= right - left + 1) { + int pos = partition(arr, left, right); + if (pos - left == k) { + return arr[pos]; + } + if (pos - left > k) { + return findKthElementByQuickSelect(arr, left, pos - 1, k); + } + return findKthElementByQuickSelect(arr, pos + 1, right, k - pos + left - 1); + } + return 0; + } + + public int findKthElementByQuickSelectWithIterativePartition(Integer[] arr, int left, int right, int k) { + if (k >= 0 && k <= right - left + 1) { + int pos = partitionIterative(arr, left, right); + if (pos - left == k) { + return arr[pos]; + } + if (pos - left > k) { + return findKthElementByQuickSelectWithIterativePartition(arr, left, pos - 1, k); + } + return findKthElementByQuickSelectWithIterativePartition(arr, pos + 1, right, k - pos + left - 1); + } + return 0; + } + + private int partition(Integer[] arr, int left, int right) { + int pivot = arr[right]; + Integer[] leftArr; + Integer[] rightArr; + + leftArr = IntStream.range(left, right) + .filter(i -> arr[i] < pivot) + .map(i -> arr[i]) + .boxed() + .toArray(Integer[]::new); + + rightArr = IntStream.range(left, right) + .filter(i -> arr[i] > pivot) + .map(i -> arr[i]) + .boxed() + .toArray(Integer[]::new); + + int leftArraySize = leftArr.length; + System.arraycopy(leftArr, 0, arr, left, leftArraySize); + arr[leftArraySize + left] = pivot; + System.arraycopy(rightArr, 0, arr, left + leftArraySize + 1, rightArr.length); + + return left + leftArraySize; + } + + private int partitionIterative(Integer[] arr, int left, int right) { + int pivot = arr[right], i = left; + for (int j = left; j <= right - 1; j++) { + if (arr[j] <= pivot) { + swap(arr, i, j); + i++; + } + } + swap(arr, i, right); + return i; + } + + public int findKthElementByRandomizedQuickSelect(Integer[] arr, int left, int right, int k) { + if (k >= 0 && k <= right - left + 1) { + int pos = randomPartition(arr, left, right); + if (pos - left == k) { + return arr[pos]; + } + if (pos - left > k) { + return findKthElementByRandomizedQuickSelect(arr, left, pos - 1, k); + } + return findKthElementByRandomizedQuickSelect(arr, pos + 1, right, k - pos + left - 1); + } + return 0; + } + + private int randomPartition(Integer arr[], int left, int right) { + int n = right - left + 1; + int pivot = (int) (Math.random()) % n; + swap(arr, left + pivot, right); + return partition(arr, left, right); + } + + private void swap(Integer[] arr, int n1, int n2) { + int temp = arr[n2]; + arr[n2] = arr[n1]; + arr[n1] = temp; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java new file mode 100644 index 0000000000..08972251b8 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/BFSMazeSolver.java @@ -0,0 +1,52 @@ +package com.baeldung.algorithms.maze.solver; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class BFSMazeSolver { + private static final int[][] DIRECTIONS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; + + public List solve(Maze maze) { + LinkedList nextToVisit = new LinkedList<>(); + Coordinate start = maze.getEntry(); + nextToVisit.add(start); + + while (!nextToVisit.isEmpty()) { + Coordinate cur = nextToVisit.remove(); + + if (!maze.isValidLocation(cur.getX(), cur.getY()) || maze.isExplored(cur.getX(), cur.getY())) { + continue; + } + + if (maze.isWall(cur.getX(), cur.getY())) { + maze.setVisited(cur.getX(), cur.getY(), true); + continue; + } + + if (maze.isExit(cur.getX(), cur.getY())) { + return backtrackPath(cur); + } + + for (int[] direction : DIRECTIONS) { + Coordinate coordinate = new Coordinate(cur.getX() + direction[0], cur.getY() + direction[1], cur); + nextToVisit.add(coordinate); + maze.setVisited(cur.getX(), cur.getY(), true); + } + } + return Collections.emptyList(); + } + + private List backtrackPath(Coordinate cur) { + List path = new ArrayList<>(); + Coordinate iter = cur; + + while (iter != null) { + path.add(iter); + iter = iter.parent; + } + + return path; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java new file mode 100644 index 0000000000..09b2ced5e6 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Coordinate.java @@ -0,0 +1,31 @@ +package com.baeldung.algorithms.maze.solver; + +public class Coordinate { + int x; + int y; + Coordinate parent; + + public Coordinate(int x, int y) { + this.x = x; + this.y = y; + this.parent = null; + } + + public Coordinate(int x, int y, Coordinate parent) { + this.x = x; + this.y = y; + this.parent = parent; + } + + int getX() { + return x; + } + + int getY() { + return y; + } + + Coordinate getParent() { + return parent; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java new file mode 100644 index 0000000000..f9640066b9 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/DFSMazeSolver.java @@ -0,0 +1,48 @@ +package com.baeldung.algorithms.maze.solver; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DFSMazeSolver { + private static final int[][] DIRECTIONS = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; + + public List solve(Maze maze) { + List path = new ArrayList<>(); + if (explore(maze, maze.getEntry() + .getX(), + maze.getEntry() + .getY(), + path)) { + return path; + } + return Collections.emptyList(); + } + + private boolean explore(Maze maze, int row, int col, List path) { + if (!maze.isValidLocation(row, col) || maze.isWall(row, col) || maze.isExplored(row, col)) { + return false; + } + + path.add(new Coordinate(row, col)); + maze.setVisited(row, col, true); + + if (maze.isExit(row, col)) { + return true; + } + + for (int[] direction : DIRECTIONS) { + Coordinate coordinate = getNextCoordinate(row, col, direction[0], direction[1]); + if (explore(maze, coordinate.getX(), coordinate.getY(), path)) { + return true; + } + } + + path.remove(path.size() - 1); + return false; + } + + private Coordinate getNextCoordinate(int row, int col, int i, int j) { + return new Coordinate(row + i, col + j); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java new file mode 100644 index 0000000000..8aaa44d9b1 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/Maze.java @@ -0,0 +1,141 @@ +package com.baeldung.algorithms.maze.solver; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class Maze { + private static final int ROAD = 0; + private static final int WALL = 1; + private static final int START = 2; + private static final int EXIT = 3; + private static final int PATH = 4; + + private int[][] maze; + private boolean[][] visited; + private Coordinate start; + private Coordinate end; + + public Maze(File maze) throws FileNotFoundException { + String fileText = ""; + try (Scanner input = new Scanner(maze)) { + while (input.hasNextLine()) { + fileText += input.nextLine() + "\n"; + } + } + initializeMaze(fileText); + } + + private void initializeMaze(String text) { + if (text == null || (text = text.trim()).length() == 0) { + throw new IllegalArgumentException("empty lines data"); + } + + String[] lines = text.split("[\r]?\n"); + maze = new int[lines.length][lines[0].length()]; + visited = new boolean[lines.length][lines[0].length()]; + + for (int row = 0; row < getHeight(); row++) { + if (lines[row].length() != getWidth()) { + throw new IllegalArgumentException("line " + (row + 1) + " wrong length (was " + lines[row].length() + " but should be " + getWidth() + ")"); + } + + for (int col = 0; col < getWidth(); col++) { + if (lines[row].charAt(col) == '#') + maze[row][col] = WALL; + else if (lines[row].charAt(col) == 'S') { + maze[row][col] = START; + start = new Coordinate(row, col); + } else if (lines[row].charAt(col) == 'E') { + maze[row][col] = EXIT; + end = new Coordinate(row, col); + } else + maze[row][col] = ROAD; + } + } + } + + public int getHeight() { + return maze.length; + } + + public int getWidth() { + return maze[0].length; + } + + public Coordinate getEntry() { + return start; + } + + public Coordinate getExit() { + return end; + } + + public boolean isExit(int x, int y) { + return x == end.getX() && y == end.getY(); + } + + public boolean isStart(int x, int y) { + return x == start.getX() && y == start.getY(); + } + + public boolean isExplored(int row, int col) { + return visited[row][col]; + } + + public boolean isWall(int row, int col) { + return maze[row][col] == WALL; + } + + public void setVisited(int row, int col, boolean value) { + visited[row][col] = value; + } + + public boolean isValidLocation(int row, int col) { + if (row < 0 || row >= getHeight() || col < 0 || col >= getWidth()) { + return false; + } + return true; + } + + public void printPath(List path) { + int[][] tempMaze = Arrays.stream(maze) + .map(int[]::clone) + .toArray(int[][]::new); + for (Coordinate coordinate : path) { + if (isStart(coordinate.getX(), coordinate.getY()) || isExit(coordinate.getX(), coordinate.getY())) { + continue; + } + tempMaze[coordinate.getX()][coordinate.getY()] = PATH; + } + System.out.println(toString(tempMaze)); + } + + public String toString(int[][] maze) { + StringBuilder result = new StringBuilder(getWidth() * (getHeight() + 1)); + for (int row = 0; row < getHeight(); row++) { + for (int col = 0; col < getWidth(); col++) { + if (maze[row][col] == ROAD) { + result.append(' '); + } else if (maze[row][col] == WALL) { + result.append('#'); + } else if (maze[row][col] == START) { + result.append('S'); + } else if (maze[row][col] == EXIT) { + result.append('E'); + } else { + result.append('.'); + } + } + result.append('\n'); + } + return result.toString(); + } + + public void reset() { + for (int i = 0; i < visited.length; i++) + Arrays.fill(visited[i], false); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java new file mode 100644 index 0000000000..60263deba3 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/maze/solver/MazeDriver.java @@ -0,0 +1,34 @@ +package com.baeldung.algorithms.maze.solver; + +import java.io.File; +import java.util.List; + +public class MazeDriver { + public static void main(String[] args) throws Exception { + File maze1 = new File("src/main/resources/maze/maze1.txt"); + File maze2 = new File("src/main/resources/maze/maze2.txt"); + + execute(maze1); + execute(maze2); + } + + private static void execute(File file) throws Exception { + Maze maze = new Maze(file); + dfs(maze); + bfs(maze); + } + + private static void bfs(Maze maze) { + BFSMazeSolver bfs = new BFSMazeSolver(); + List path = bfs.solve(maze); + maze.printPath(path); + maze.reset(); + } + + private static void dfs(Maze maze) { + DFSMazeSolver dfs = new DFSMazeSolver(); + List path = dfs.solve(maze); + maze.printPath(path); + maze.reset(); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java new file mode 100644 index 0000000000..b646c686b2 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java @@ -0,0 +1,47 @@ +package com.baeldung.algorithms.multiswarm; + +/** + * Constants used by the Multi-swarm optimization algorithms. + * + * @author Donato Rimenti + * + */ +public class Constants { + + /** + * The inertia factor encourages a particle to continue moving in its + * current direction. + */ + public static final double INERTIA_FACTOR = 0.729; + + /** + * The cognitive weight encourages a particle to move toward its historical + * best-known position. + */ + public static final double COGNITIVE_WEIGHT = 1.49445; + + /** + * The social weight encourages a particle to move toward the best-known + * position found by any of the particle’s swarm-mates. + */ + public static final double SOCIAL_WEIGHT = 1.49445; + + /** + * The global weight encourages a particle to move toward the best-known + * position found by any particle in any swarm. + */ + public static final double GLOBAL_WEIGHT = 0.3645; + + /** + * Upper bound for the random generation. We use it to reduce the + * computation time since we can rawly estimate it. + */ + public static final int PARTICLE_UPPER_BOUND = 10000000; + + /** + * Private constructor for utility class. + */ + private Constants() { + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java new file mode 100644 index 0000000000..2d86ec8d94 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java @@ -0,0 +1,21 @@ +package com.baeldung.algorithms.multiswarm; + +/** + * Interface for a fitness function, used to decouple the main algorithm logic + * from the specific problem solution. + * + * @author Donato Rimenti + * + */ +public interface FitnessFunction { + + /** + * Returns the fitness of a particle given its position. + * + * @param particlePosition + * the position of the particle + * @return the fitness of the particle + */ + public double getFitness(long[] particlePosition); + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java new file mode 100644 index 0000000000..ef60726278 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java @@ -0,0 +1,227 @@ +package com.baeldung.algorithms.multiswarm; + +import java.util.Arrays; +import java.util.Random; + +/** + * Represents a collection of {@link Swarm}. + * + * @author Donato Rimenti + * + */ +public class Multiswarm { + + /** + * The swarms managed by this multiswarm. + */ + private Swarm[] swarms; + + /** + * The best position found within all the {@link #swarms}. + */ + private long[] bestPosition; + + /** + * The best fitness score found within all the {@link #swarms}. + */ + private double bestFitness = Double.NEGATIVE_INFINITY; + + /** + * A random generator. + */ + private Random random = new Random(); + + /** + * The fitness function used to determine how good is a particle. + */ + private FitnessFunction fitnessFunction; + + /** + * Instantiates a new Multiswarm. + * + * @param numSwarms + * the number of {@link #swarms} + * @param particlesPerSwarm + * the number of particle for each {@link #swarms} + * @param fitnessFunction + * the {@link #fitnessFunction} + */ + public Multiswarm(int numSwarms, int particlesPerSwarm, FitnessFunction fitnessFunction) { + this.fitnessFunction = fitnessFunction; + this.swarms = new Swarm[numSwarms]; + for (int i = 0; i < numSwarms; i++) { + swarms[i] = new Swarm(particlesPerSwarm); + } + } + + /** + * Main loop of the algorithm. Iterates all particles of all + * {@link #swarms}. For each particle, computes the new fitness and checks + * if a new best position has been found among itself, the swarm and all the + * swarms and finally updates the particle position and speed. + */ + public void mainLoop() { + for (Swarm swarm : swarms) { + for (Particle particle : swarm.getParticles()) { + + long[] particleOldPosition = particle.getPosition().clone(); + + // Calculate the particle fitness. + particle.setFitness(fitnessFunction.getFitness(particleOldPosition)); + + // Check if a new best position has been found for the particle + // itself, within the swarm and the multiswarm. + if (particle.getFitness() > particle.getBestFitness()) { + particle.setBestFitness(particle.getFitness()); + particle.setBestPosition(particleOldPosition); + + if (particle.getFitness() > swarm.getBestFitness()) { + swarm.setBestFitness(particle.getFitness()); + swarm.setBestPosition(particleOldPosition); + + if (swarm.getBestFitness() > bestFitness) { + bestFitness = swarm.getBestFitness(); + bestPosition = swarm.getBestPosition().clone(); + } + + } + } + + // Updates the particle position by adding the speed to the + // actual position. + long[] position = particle.getPosition(); + long[] speed = particle.getSpeed(); + + position[0] += speed[0]; + position[1] += speed[1]; + + // Updates the particle speed. + speed[0] = getNewParticleSpeedForIndex(particle, swarm, 0); + speed[1] = getNewParticleSpeedForIndex(particle, swarm, 1); + } + } + } + + /** + * Computes a new speed for a given particle of a given swarm on a given + * axis. The new speed is computed using the formula: + * + *
+	 * ({@link Constants#INERTIA_FACTOR} * {@link Particle#getSpeed()}) + 
+	 * (({@link Constants#COGNITIVE_WEIGHT} * random(0,1)) * ({@link Particle#getBestPosition()} - {@link Particle#getPosition()})) +
+	 * (({@link Constants#SOCIAL_WEIGHT} * random(0,1)) * ({@link Swarm#getBestPosition()} - {@link Particle#getPosition()})) + 
+	 * (({@link Constants#GLOBAL_WEIGHT} * random(0,1)) * ({@link #bestPosition} - {@link Particle#getPosition()}))
+	 * 
+ * + * @param particle + * the particle whose new speed needs to be computed + * @param swarm + * the swarm which contains the particle + * @param index + * the index of the particle axis whose speeds needs to be + * computed + * @return the new speed of the particle passed on the given axis + */ + private int getNewParticleSpeedForIndex(Particle particle, Swarm swarm, int index) { + return (int) ((Constants.INERTIA_FACTOR * particle.getSpeed()[index]) + + (randomizePercentage(Constants.COGNITIVE_WEIGHT) + * (particle.getBestPosition()[index] - particle.getPosition()[index])) + + (randomizePercentage(Constants.SOCIAL_WEIGHT) + * (swarm.getBestPosition()[index] - particle.getPosition()[index])) + + (randomizePercentage(Constants.GLOBAL_WEIGHT) + * (bestPosition[index] - particle.getPosition()[index]))); + } + + /** + * Returns a random number between 0 and the value passed as argument. + * + * @param value + * the value to randomize + * @return a random value between 0 and the one passed as argument + */ + private double randomizePercentage(double value) { + return random.nextDouble() * value; + } + + /** + * Gets the {@link #bestPosition}. + * + * @return the {@link #bestPosition} + */ + public long[] getBestPosition() { + return bestPosition; + } + + /** + * Gets the {@link #bestFitness}. + * + * @return the {@link #bestFitness} + */ + public double getBestFitness() { + return bestFitness; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(bestFitness); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + Arrays.hashCode(bestPosition); + result = prime * result + ((fitnessFunction == null) ? 0 : fitnessFunction.hashCode()); + result = prime * result + ((random == null) ? 0 : random.hashCode()); + result = prime * result + Arrays.hashCode(swarms); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Multiswarm other = (Multiswarm) obj; + if (Double.doubleToLongBits(bestFitness) != Double.doubleToLongBits(other.bestFitness)) + return false; + if (!Arrays.equals(bestPosition, other.bestPosition)) + return false; + if (fitnessFunction == null) { + if (other.fitnessFunction != null) + return false; + } else if (!fitnessFunction.equals(other.fitnessFunction)) + return false; + if (random == null) { + if (other.random != null) + return false; + } else if (!random.equals(other.random)) + return false; + if (!Arrays.equals(swarms, other.swarms)) + return false; + return true; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Multiswarm [swarms=" + Arrays.toString(swarms) + ", bestPosition=" + Arrays.toString(bestPosition) + + ", bestFitness=" + bestFitness + ", random=" + random + ", fitnessFunction=" + fitnessFunction + "]"; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java new file mode 100644 index 0000000000..5930a94267 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java @@ -0,0 +1,204 @@ +package com.baeldung.algorithms.multiswarm; + +import java.util.Arrays; + +/** + * Represents a particle, the basic component of a {@link Swarm}. + * + * @author Donato Rimenti + * + */ +public class Particle { + + /** + * The current position of this particle. + */ + private long[] position; + + /** + * The speed of this particle. + */ + private long[] speed; + + /** + * The fitness of this particle for the current position. + */ + private double fitness; + + /** + * The best position found by this particle. + */ + private long[] bestPosition; + + /** + * The best fitness found by this particle. + */ + private double bestFitness = Double.NEGATIVE_INFINITY; + + /** + * Instantiates a new Particle. + * + * @param initialPosition + * the initial {@link #position} + * @param initialSpeed + * the initial {@link #speed} + */ + public Particle(long[] initialPosition, long[] initialSpeed) { + this.position = initialPosition; + this.speed = initialSpeed; + } + + /** + * Gets the {@link #position}. + * + * @return the {@link #position} + */ + public long[] getPosition() { + return position; + } + + /** + * Gets the {@link #speed}. + * + * @return the {@link #speed} + */ + public long[] getSpeed() { + return speed; + } + + /** + * Gets the {@link #fitness}. + * + * @return the {@link #fitness} + */ + public double getFitness() { + return fitness; + } + + /** + * Gets the {@link #bestPosition}. + * + * @return the {@link #bestPosition} + */ + public long[] getBestPosition() { + return bestPosition; + } + + /** + * Gets the {@link #bestFitness}. + * + * @return the {@link #bestFitness} + */ + public double getBestFitness() { + return bestFitness; + } + + /** + * Sets the {@link #position}. + * + * @param position + * the new {@link #position} + */ + public void setPosition(long[] position) { + this.position = position; + } + + /** + * Sets the {@link #speed}. + * + * @param speed + * the new {@link #speed} + */ + public void setSpeed(long[] speed) { + this.speed = speed; + } + + /** + * Sets the {@link #fitness}. + * + * @param fitness + * the new {@link #fitness} + */ + public void setFitness(double fitness) { + this.fitness = fitness; + } + + /** + * Sets the {@link #bestPosition}. + * + * @param bestPosition + * the new {@link #bestPosition} + */ + public void setBestPosition(long[] bestPosition) { + this.bestPosition = bestPosition; + } + + /** + * Sets the {@link #bestFitness}. + * + * @param bestFitness + * the new {@link #bestFitness} + */ + public void setBestFitness(double bestFitness) { + this.bestFitness = bestFitness; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(bestFitness); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + Arrays.hashCode(bestPosition); + temp = Double.doubleToLongBits(fitness); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + Arrays.hashCode(position); + result = prime * result + Arrays.hashCode(speed); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Particle other = (Particle) obj; + if (Double.doubleToLongBits(bestFitness) != Double.doubleToLongBits(other.bestFitness)) + return false; + if (!Arrays.equals(bestPosition, other.bestPosition)) + return false; + if (Double.doubleToLongBits(fitness) != Double.doubleToLongBits(other.fitness)) + return false; + if (!Arrays.equals(position, other.position)) + return false; + if (!Arrays.equals(speed, other.speed)) + return false; + return true; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Particle [position=" + Arrays.toString(position) + ", speed=" + Arrays.toString(speed) + ", fitness=" + + fitness + ", bestPosition=" + Arrays.toString(bestPosition) + ", bestFitness=" + bestFitness + "]"; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java new file mode 100644 index 0000000000..e6d37bb7e6 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java @@ -0,0 +1,155 @@ +package com.baeldung.algorithms.multiswarm; + +import java.util.Arrays; +import java.util.Random; + +/** + * Represents a collection of {@link Particle}. + * + * @author Donato Rimenti + * + */ +public class Swarm { + + /** + * The particles of this swarm. + */ + private Particle[] particles; + + /** + * The best position found within the particles of this swarm. + */ + private long[] bestPosition; + + /** + * The best fitness score found within the particles of this swarm. + */ + private double bestFitness = Double.NEGATIVE_INFINITY; + + /** + * A random generator. + */ + private Random random = new Random(); + + /** + * Instantiates a new Swarm. + * + * @param numParticles + * the number of particles of the swarm + */ + public Swarm(int numParticles) { + particles = new Particle[numParticles]; + for (int i = 0; i < numParticles; i++) { + long[] initialParticlePosition = { random.nextInt(Constants.PARTICLE_UPPER_BOUND), + random.nextInt(Constants.PARTICLE_UPPER_BOUND) }; + long[] initialParticleSpeed = { random.nextInt(Constants.PARTICLE_UPPER_BOUND), + random.nextInt(Constants.PARTICLE_UPPER_BOUND) }; + particles[i] = new Particle(initialParticlePosition, initialParticleSpeed); + } + } + + /** + * Gets the {@link #particles}. + * + * @return the {@link #particles} + */ + public Particle[] getParticles() { + return particles; + } + + /** + * Gets the {@link #bestPosition}. + * + * @return the {@link #bestPosition} + */ + public long[] getBestPosition() { + return bestPosition; + } + + /** + * Gets the {@link #bestFitness}. + * + * @return the {@link #bestFitness} + */ + public double getBestFitness() { + return bestFitness; + } + + /** + * Sets the {@link #bestPosition}. + * + * @param bestPosition + * the new {@link #bestPosition} + */ + public void setBestPosition(long[] bestPosition) { + this.bestPosition = bestPosition; + } + + /** + * Sets the {@link #bestFitness}. + * + * @param bestFitness + * the new {@link #bestFitness} + */ + public void setBestFitness(double bestFitness) { + this.bestFitness = bestFitness; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(bestFitness); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + Arrays.hashCode(bestPosition); + result = prime * result + Arrays.hashCode(particles); + result = prime * result + ((random == null) ? 0 : random.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Swarm other = (Swarm) obj; + if (Double.doubleToLongBits(bestFitness) != Double.doubleToLongBits(other.bestFitness)) + return false; + if (!Arrays.equals(bestPosition, other.bestPosition)) + return false; + if (!Arrays.equals(particles, other.particles)) + return false; + if (random == null) { + if (other.random != null) + return false; + } else if (!random.equals(other.random)) + return false; + return true; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Swarm [particles=" + Arrays.toString(particles) + ", bestPosition=" + Arrays.toString(bestPosition) + + ", bestFitness=" + bestFitness + ", random=" + random + "]"; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java b/algorithms/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java new file mode 100644 index 0000000000..0fe2960f96 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/numberwordconverter/NumberWordConverter.java @@ -0,0 +1,75 @@ +package com.baeldung.algorithms.numberwordconverter; + +import java.math.BigDecimal; + +import pl.allegro.finance.tradukisto.MoneyConverters; + +public class NumberWordConverter { + + public static final String INVALID_INPUT_GIVEN = "Invalid input given"; + + public static final String[] ones = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; + + public static final String[] tens = { + "", // 0 + "", // 1 + "twenty", // 2 + "thirty", // 3 + "forty", // 4 + "fifty", // 5 + "sixty", // 6 + "seventy", // 7 + "eighty", // 8 + "ninety" // 9 + }; + + public static String getMoneyIntoWords(String input) { + MoneyConverters converter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; + return converter.asWords(new BigDecimal(input)); + } + + public static String getMoneyIntoWords(final double money) { + long dollar = (long) money; + long cents = Math.round((money - dollar) * 100); + if (money == 0D) { + return ""; + } + if (money < 0) { + return INVALID_INPUT_GIVEN; + } + String dollarPart = ""; + if (dollar > 0) { + dollarPart = convert(dollar) + " dollar" + (dollar == 1 ? "" : "s"); + } + String centsPart = ""; + if (cents > 0) { + if (dollarPart.length() > 0) { + centsPart = " and "; + } + centsPart += convert(cents) + " cent" + (cents == 1 ? "" : "s"); + } + return dollarPart + centsPart; + } + + private static String convert(final long n) { + if (n < 0) { + return INVALID_INPUT_GIVEN; + } + if (n < 20) { + return ones[(int) n]; + } + if (n < 100) { + return tens[(int) n / 10] + ((n % 10 != 0) ? " " : "") + ones[(int) n % 10]; + } + if (n < 1000) { + return ones[(int) n / 100] + " hundred" + ((n % 100 != 0) ? " " : "") + convert(n % 100); + } + if (n < 1_000_000) { + return convert(n / 1000) + " thousand" + ((n % 1000 != 0) ? " " : "") + convert(n % 1000); + } + if (n < 1_000_000_000) { + return convert(n / 1_000_000) + " million" + ((n % 1_000_000 != 0) ? " " : "") + convert(n % 1_000_000); + } + return convert(n / 1_000_000_000) + " billion" + ((n % 1_000_000_000 != 0) ? " " : "") + convert(n % 1_000_000_000); + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java b/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java new file mode 100644 index 0000000000..48d51a8848 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/prime/PrimeGenerator.java @@ -0,0 +1,59 @@ +package com.baeldung.algorithms.prime; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class PrimeGenerator { + public static List sieveOfEratosthenes(int n) { + final boolean prime[] = new boolean[n + 1]; + Arrays.fill(prime, true); + + for (int p = 2; p * p <= n; p++) { + if (prime[p]) { + for (int i = p * 2; i <= n; i += p) + prime[i] = false; + } + } + + final List primes = new LinkedList<>(); + for (int i = 2; i <= n; i++) { + if (prime[i]) + primes.add(i); + } + return primes; + } + + public static List primeNumbersBruteForce(int max) { + final List primeNumbers = new LinkedList(); + for (int i = 2; i <= max; i++) { + if (isPrimeBruteForce(i)) { + primeNumbers.add(i); + } + } + return primeNumbers; + } + + private static boolean isPrimeBruteForce(int x) { + for (int i = 2; i < x; i++) { + if (x % i == 0) { + return false; + } + } + return true; + } + + public static List primeNumbersTill(int max) { + return IntStream.rangeClosed(2, max) + .filter(x -> isPrime(x)) + .boxed() + .collect(Collectors.toList()); + } + + private static boolean isPrime(int x) { + return IntStream.rangeClosed(2, (int) (Math.sqrt(x))) + .allMatch(n -> x % n != 0); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java new file mode 100644 index 0000000000..4b37558aab --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/BacktrackingAlgorithm.java @@ -0,0 +1,104 @@ +package com.baeldung.algorithms.sudoku; + +import java.util.stream.IntStream; + +public class BacktrackingAlgorithm { + + private static final int BOARD_SIZE = 9; + private static final int SUBSECTION_SIZE = 3; + private static final int BOARD_START_INDEX = 0; + + private static final int NO_VALUE = 0; + private static final int MIN_VALUE = 1; + private static final int MAX_VALUE = 9; + + private static int[][] board = { + {8, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 3, 6, 0, 0, 0, 0, 0}, + {0, 7, 0, 0, 9, 0, 2, 0, 0}, + {0, 5, 0, 0, 0, 7, 0, 0, 0}, + {0, 0, 0, 0, 4, 5, 7, 0, 0}, + {0, 0, 0, 1, 0, 0, 0, 3, 0}, + {0, 0, 1, 0, 0, 0, 0, 6, 8}, + {0, 0, 8, 5, 0, 0, 0, 1, 0}, + {0, 9, 0, 0, 0, 0, 4, 0, 0} + }; + + public static void main(String[] args) { + BacktrackingAlgorithm solver = new BacktrackingAlgorithm(); + solver.solve(board); + solver.printBoard(); + } + + private void printBoard() { + for (int row = BOARD_START_INDEX; row < BOARD_SIZE; row++) { + for (int column = BOARD_START_INDEX; column < BOARD_SIZE; column++) { + System.out.print(board[row][column] + " "); + } + System.out.println(); + } + } + + private boolean solve(int[][] board) { + for (int row = BOARD_START_INDEX; row < BOARD_SIZE; row++) { + for (int column = BOARD_START_INDEX; column < BOARD_SIZE; column++) { + if (board[row][column] == NO_VALUE) { + for (int k = MIN_VALUE; k <= MAX_VALUE; k++) { + board[row][column] = k; + if (isValid(board, row, column) && solve(board)) { + return true; + } + board[row][column] = NO_VALUE; + } + return false; + } + } + } + return true; + } + + private boolean isValid(int[][] board, int row, int column) { + return rowConstraint(board, row) && + columnConstraint(board, column) && + subsectionConstraint(board, row, column); + } + + private boolean subsectionConstraint(int[][] board, int row, int column) { + boolean[] constraint = new boolean[BOARD_SIZE]; + int subsectionRowStart = (row / SUBSECTION_SIZE) * SUBSECTION_SIZE; + int subsectionRowEnd = subsectionRowStart + SUBSECTION_SIZE; + + int subsectionColumnStart = (column / SUBSECTION_SIZE) * SUBSECTION_SIZE; + int subsectionColumnEnd = subsectionColumnStart + SUBSECTION_SIZE; + + for (int r = subsectionRowStart; r < subsectionRowEnd; r++) { + for (int c = subsectionColumnStart; c < subsectionColumnEnd; c++) { + if (!checkConstraint(board, r, constraint, c)) return false; + } + } + return true; + } + + private boolean columnConstraint(int[][] board, int column) { + boolean[] constraint = new boolean[BOARD_SIZE]; + return IntStream.range(BOARD_START_INDEX, BOARD_SIZE) + .allMatch(row -> checkConstraint(board, row, constraint, column)); + } + + private boolean rowConstraint(int[][] board, int row) { + boolean[] constraint = new boolean[BOARD_SIZE]; + return IntStream.range(BOARD_START_INDEX, BOARD_SIZE) + .allMatch(column -> checkConstraint(board, row, constraint, column)); + } + + private boolean checkConstraint(int[][] board, int row, boolean[] constraint, int column) { + if (board[row][column] != NO_VALUE) { + if (!constraint[board[row][column] - 1]) { + constraint[board[row][column] - 1] = true; + } else { + return false; + } + } + return true; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java new file mode 100644 index 0000000000..46995ca42f --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/ColumnNode.java @@ -0,0 +1,33 @@ +package com.baeldung.algorithms.sudoku; + +class ColumnNode extends DancingNode { + int size; + String name; + + ColumnNode(String n) { + super(); + size = 0; + name = n; + C = this; + } + + void cover() { + unlinkLR(); + for (DancingNode i = this.D; i != this; i = i.D) { + for (DancingNode j = i.R; j != i; j = j.R) { + j.unlinkUD(); + j.C.size--; + } + } + } + + void uncover() { + for (DancingNode i = this.U; i != this; i = i.U) { + for (DancingNode j = i.L; j != i; j = j.L) { + j.C.size++; + j.relinkUD(); + } + } + relinkLR(); + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java new file mode 100644 index 0000000000..d3cbb2bd02 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinks.java @@ -0,0 +1,133 @@ +package com.baeldung.algorithms.sudoku; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class DancingLinks { + + private ColumnNode header; + private List answer; + + private void search(int k) { + if (header.R == header) { + handleSolution(answer); + } else { + ColumnNode c = selectColumnNodeHeuristic(); + c.cover(); + + for (DancingNode r = c.D; r != c; r = r.D) { + answer.add(r); + + for (DancingNode j = r.R; j != r; j = j.R) { + j.C.cover(); + } + + search(k + 1); + + r = answer.remove(answer.size() - 1); + c = r.C; + + for (DancingNode j = r.L; j != r; j = j.L) { + j.C.uncover(); + } + } + c.uncover(); + } + } + + private ColumnNode selectColumnNodeHeuristic() { + int min = Integer.MAX_VALUE; + ColumnNode ret = null; + for (ColumnNode c = (ColumnNode) header.R; c != header; c = (ColumnNode) c.R) { + if (c.size < min) { + min = c.size; + ret = c; + } + } + return ret; + } + + private ColumnNode makeDLXBoard(boolean[][] grid) { + final int COLS = grid[0].length; + + ColumnNode headerNode = new ColumnNode("header"); + List columnNodes = new ArrayList<>(); + + for (int i = 0; i < COLS; i++) { + ColumnNode n = new ColumnNode(Integer.toString(i)); + columnNodes.add(n); + headerNode = (ColumnNode) headerNode.hookRight(n); + } + headerNode = headerNode.R.C; + + for (boolean[] aGrid : grid) { + DancingNode prev = null; + for (int j = 0; j < COLS; j++) { + if (aGrid[j]) { + ColumnNode col = columnNodes.get(j); + DancingNode newNode = new DancingNode(col); + if (prev == null) + prev = newNode; + col.U.hookDown(newNode); + prev = prev.hookRight(newNode); + col.size++; + } + } + } + + headerNode.size = COLS; + + return headerNode; + } + + DancingLinks(boolean[][] cover) { + header = makeDLXBoard(cover); + } + + public void runSolver() { + answer = new LinkedList<>(); + search(0); + } + + private void handleSolution(List answer) { + int[][] result = parseBoard(answer); + printSolution(result); + } + + private int size = 9; + + private int[][] parseBoard(List answer) { + int[][] result = new int[size][size]; + for (DancingNode n : answer) { + DancingNode rcNode = n; + int min = Integer.parseInt(rcNode.C.name); + for (DancingNode tmp = n.R; tmp != n; tmp = tmp.R) { + int val = Integer.parseInt(tmp.C.name); + if (val < min) { + min = val; + rcNode = tmp; + } + } + int ans1 = Integer.parseInt(rcNode.C.name); + int ans2 = Integer.parseInt(rcNode.R.C.name); + int r = ans1 / size; + int c = ans1 % size; + int num = (ans2 % size) + 1; + result[r][c] = num; + } + return result; + } + + private static void printSolution(int[][] result) { + int size = result.length; + for (int[] aResult : result) { + StringBuilder ret = new StringBuilder(); + for (int j = 0; j < size; j++) { + ret.append(aResult[j]).append(" "); + } + System.out.println(ret); + } + System.out.println(); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java new file mode 100644 index 0000000000..df02ff3d11 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingLinksAlgorithm.java @@ -0,0 +1,121 @@ +package com.baeldung.algorithms.sudoku; + +import java.util.Arrays; + +public class DancingLinksAlgorithm { + private static final int BOARD_SIZE = 9; + private static final int SUBSECTION_SIZE = 3; + private static final int NO_VALUE = 0; + private static final int CONSTRAINTS = 4; + private static final int MIN_VALUE = 1; + private static final int MAX_VALUE = 9; + private static final int COVER_START_INDEX = 1; + + private static int[][] board = { + {8, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 3, 6, 0, 0, 0, 0, 0}, + {0, 7, 0, 0, 9, 0, 2, 0, 0}, + {0, 5, 0, 0, 0, 7, 0, 0, 0}, + {0, 0, 0, 0, 4, 5, 7, 0, 0}, + {0, 0, 0, 1, 0, 0, 0, 3, 0}, + {0, 0, 1, 0, 0, 0, 0, 6, 8}, + {0, 0, 8, 5, 0, 0, 0, 1, 0}, + {0, 9, 0, 0, 0, 0, 4, 0, 0} + }; + + public static void main(String[] args) { + DancingLinksAlgorithm solver = new DancingLinksAlgorithm(); + solver.solve(board); + } + + private void solve(int[][] board) { + boolean[][] cover = initializeExactCoverBoard(board); + DancingLinks dlx = new DancingLinks(cover); + dlx.runSolver(); + } + + private int getIndex(int row, int column, int num) { + return (row - 1) * BOARD_SIZE * BOARD_SIZE + (column - 1) * BOARD_SIZE + (num - 1); + } + + private boolean[][] createExactCoverBoard() { + boolean[][] coverBoard = new boolean[BOARD_SIZE * BOARD_SIZE * MAX_VALUE][BOARD_SIZE * BOARD_SIZE * CONSTRAINTS]; + + int hBase = 0; + hBase = checkCellConstraint(coverBoard, hBase); + hBase = checkRowConstraint(coverBoard, hBase); + hBase = checkColumnConstraint(coverBoard, hBase); + checkSubsectionConstraint(coverBoard, hBase); + + return coverBoard; + } + + private int checkSubsectionConstraint(boolean[][] coverBoard, int hBase) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row += SUBSECTION_SIZE) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column += SUBSECTION_SIZE) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int rowDelta = 0; rowDelta < SUBSECTION_SIZE; rowDelta++) { + for (int columnDelta = 0; columnDelta < SUBSECTION_SIZE; columnDelta++) { + int index = getIndex(row + rowDelta, column + columnDelta, n); + coverBoard[index][hBase] = true; + } + } + } + } + } + return hBase; + } + + private int checkColumnConstraint(boolean[][] coverBoard, int hBase) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + int index = getIndex(row, column, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkRowConstraint(boolean[][] coverBoard, int hBase) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++, hBase++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { + int index = getIndex(row, column, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private int checkCellConstraint(boolean[][] coverBoard, int hBase) { + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++, hBase++) { + for (int n = COVER_START_INDEX; n <= BOARD_SIZE; n++) { + int index = getIndex(row, column, n); + coverBoard[index][hBase] = true; + } + } + } + return hBase; + } + + private boolean[][] initializeExactCoverBoard(int[][] board) { + boolean[][] coverBoard = createExactCoverBoard(); + for (int row = COVER_START_INDEX; row <= BOARD_SIZE; row++) { + for (int column = COVER_START_INDEX; column <= BOARD_SIZE; column++) { + int n = board[row - 1][column - 1]; + if (n != NO_VALUE) { + for (int num = MIN_VALUE; num <= MAX_VALUE; num++) { + if (num != n) { + Arrays.fill(coverBoard[getIndex(row, column, num)], false); + } + } + } + } + } + return coverBoard; + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java new file mode 100644 index 0000000000..2422ff0dff --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/sudoku/DancingNode.java @@ -0,0 +1,50 @@ +package com.baeldung.algorithms.sudoku; + +class DancingNode { + DancingNode L, R, U, D; + ColumnNode C; + + DancingNode hookDown(DancingNode node) { + assert (this.C == node.C); + node.D = this.D; + node.D.U = node; + node.U = this; + this.D = node; + return node; + } + + DancingNode hookRight(DancingNode node) { + node.R = this.R; + node.R.L = node; + node.L = this; + this.R = node; + return node; + } + + void unlinkLR() { + this.L.R = this.R; + this.R.L = this.L; + } + + void relinkLR() { + this.L.R = this.R.L = this; + } + + void unlinkUD() { + this.U.D = this.D; + this.D.U = this.U; + } + + void relinkUD() { + this.U.D = this.D.U = this; + } + + DancingNode() { + L = R = U = D = this; + } + + DancingNode(ColumnNode c) { + this(); + C = c; + } +} \ No newline at end of file diff --git a/algorithms/src/main/resources/maze/maze1.txt b/algorithms/src/main/resources/maze/maze1.txt new file mode 100644 index 0000000000..0a6309d25b --- /dev/null +++ b/algorithms/src/main/resources/maze/maze1.txt @@ -0,0 +1,12 @@ +S ######## +# # +# ### ## # +# # # # +# # # # # +# ## ##### +# # # +# # # # # +##### #### +# # E +# # # # +########## \ No newline at end of file diff --git a/algorithms/src/main/resources/maze/maze2.txt b/algorithms/src/main/resources/maze/maze2.txt new file mode 100644 index 0000000000..22e6d0382a --- /dev/null +++ b/algorithms/src/main/resources/maze/maze2.txt @@ -0,0 +1,22 @@ +S ########################## +# # # # +# # #### ############### # +# # # # # # +# # #### # # ############### +# # # # # # # +# # # #### ### ########### # +# # # # # # +# ################## # +######### # # # # # +# # #### # ####### # # +# # ### ### # # # # # +# # ## # ##### # # +##### ####### # # # # # +# # ## ## #### # # +# ##### ####### # # +# # ############ +####### ######### # # +# # ######## # +# ####### ###### ## # E +# # # ## # +############################ \ No newline at end of file diff --git a/algorithms/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java new file mode 100644 index 0000000000..6fbb7c163a --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/kthlargest/FindKthLargestUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.algorithms.kthlargest; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.Before; +import org.junit.Test; + +public class FindKthLargestUnitTest { + + private FindKthLargest findKthLargest; + private Integer[] arr = { 3, 7, 1, 2, 8, 10, 4, 5, 6, 9 }; + + @Before + public void setup() { + findKthLargest = new FindKthLargest(); + } + + @Test + public void givenIntArray_whenFindKthLargestBySorting_thenGetResult() { + int k = 3; + assertThat(findKthLargest.findKthLargestBySorting(arr, k)).isEqualTo(8); + } + + @Test + public void givenIntArray_whenFindKthLargestBySortingDesc_thenGetResult() { + int k = 3; + assertThat(findKthLargest.findKthLargestBySortingDesc(arr, k)).isEqualTo(8); + } + + @Test + public void givenIntArray_whenFindKthLargestByQuickSelect_thenGetResult() { + int k = 3; + int kthLargest = arr.length - k; + assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); + } + + @Test + public void givenIntArray_whenFindKthElementByQuickSelectIterative_thenGetResult() { + int k = 3; + int kthLargest = arr.length - k; + assertThat(findKthLargest.findKthElementByQuickSelectWithIterativePartition(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); + } + + @Test + public void givenIntArray_whenFindKthSmallestByQuickSelect_thenGetResult() { + int k = 3; + assertThat(findKthLargest.findKthElementByQuickSelect(arr, 0, arr.length - 1, k - 1)).isEqualTo(3); + } + + @Test + public void givenIntArray_whenFindKthLargestByRandomizedQuickSelect_thenGetResult() { + int k = 3; + int kthLargest = arr.length - k; + assertThat(findKthLargest.findKthElementByRandomizedQuickSelect(arr, 0, arr.length - 1, kthLargest)).isEqualTo(8); + } + +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterTest.java b/algorithms/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterTest.java new file mode 100644 index 0000000000..a4a169f158 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/moneywords/NumberWordConverterTest.java @@ -0,0 +1,84 @@ +package com.baeldung.algorithms.moneywords; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.baeldung.algorithms.numberwordconverter.NumberWordConverter; + +public class NumberWordConverterTest { + + @Test + public void whenMoneyNegative_thenReturnInvalidInput() { + assertEquals(NumberWordConverter.INVALID_INPUT_GIVEN, NumberWordConverter.getMoneyIntoWords(-13)); + } + + @Test + public void whenZeroDollarsGiven_thenReturnEmptyString() { + assertEquals("", NumberWordConverter.getMoneyIntoWords(0)); + } + + @Test + public void whenOnlyDollarsGiven_thenReturnWords() { + assertEquals("one dollar", NumberWordConverter.getMoneyIntoWords(1)); + } + + @Test + public void whenOnlyCentsGiven_thenReturnWords() { + assertEquals("sixty cents", NumberWordConverter.getMoneyIntoWords(0.6)); + } + + @Test + public void whenAlmostAMillioDollarsGiven_thenReturnWords() { + String expectedResult = "nine hundred ninety nine thousand nine hundred ninety nine dollars"; + assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(999_999)); + } + + @Test + public void whenThirtyMillionDollarsGiven_thenReturnWords() { + String expectedResult = "thirty three million three hundred forty eight thousand nine hundred seventy eight dollars"; + assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(33_348_978)); + } + + @Test + public void whenTwoBillionDollarsGiven_thenReturnWords() { + String expectedResult = "two billion one hundred thirty three million two hundred forty seven thousand eight hundred ten dollars"; + assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(2_133_247_810)); + } + + @Test + public void whenGivenDollarsAndCents_thenReturnWords() { + String expectedResult = "nine hundred twenty four dollars and sixty cents"; + assertEquals(expectedResult, NumberWordConverter.getMoneyIntoWords(924.6)); + } + + @Test + public void whenOneDollarAndNoCents_thenReturnDollarSingular() { + assertEquals("one dollar", NumberWordConverter.getMoneyIntoWords(1)); + } + + @Test + public void whenNoDollarsAndOneCent_thenReturnCentSingular() { + assertEquals("one cent", NumberWordConverter.getMoneyIntoWords(0.01)); + } + + @Test + public void whenNoDollarsAndTwoCents_thenReturnCentsPlural() { + assertEquals("two cents", NumberWordConverter.getMoneyIntoWords(0.02)); + } + + @Test + public void whenNoDollarsAndNinetyNineCents_thenReturnWords() { + assertEquals("ninety nine cents", NumberWordConverter.getMoneyIntoWords(0.99)); + } + + @Test + public void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding() { + assertEquals("ninety six cents", NumberWordConverter.getMoneyIntoWords(0.959)); + } + + @Test + public void whenGivenDollarsAndCents_thenReturnWordsVersionTwo() { + assertEquals("three hundred ten £ 00/100", NumberWordConverter.getMoneyIntoWords("310")); + } +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java new file mode 100644 index 0000000000..726d4c135d --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java @@ -0,0 +1,52 @@ +package com.baeldung.algorithms.multiswarm; + +/** + * Specific fitness function implementation to solve the League of Legends + * problem. This is the problem statement:
+ *
+ * In League of Legends, a player's Effective Health when defending against + * physical damage is given by E=H(100+A)/100, where H is health and A is armor. + * Health costs 2.5 gold per unit, and Armor costs 18 gold per unit. You have + * 3600 gold, and you need to optimize the effectiveness E of your health and + * armor to survive as long as possible against the enemy team's attacks. How + * much of each should you buy?
+ *
+ * + * @author Donato Rimenti + * + */ +public class LolFitnessFunction implements FitnessFunction { + + /* + * (non-Javadoc) + * + * @see + * com.baeldung.algorithms.multiswarm.FitnessFunction#getFitness(long[]) + */ + @Override + public double getFitness(long[] particlePosition) { + + long health = particlePosition[0]; + long armor = particlePosition[1]; + + // No negatives values accepted. + if (health < 0 && armor < 0) { + return -(health * armor); + } else if (health < 0) { + return health; + } else if (armor < 0) { + return armor; + } + + // Checks if the solution is actually feasible provided our gold. + double cost = (health * 2.5) + (armor * 18); + if (cost > 3600) { + return 3600 - cost; + } else { + // Check how good is the solution. + long fitness = (health * (100 + armor)) / 100; + return fitness; + } + } + +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java new file mode 100644 index 0000000000..3455cd3932 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.algorithms.multiswarm; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +import com.baeldung.algorithms.support.MayFailRule; + +/** + * Test for {@link Multiswarm}. + * + * @author Donato Rimenti + * + */ +public class MultiswarmUnitTest { + + /** + * Rule for handling expected failures. We use this since this test may + * actually fail due to bad luck in the random generation. + */ + @Rule + public MayFailRule mayFailRule = new MayFailRule(); + + /** + * Tests the multiswarm algorithm with a generic problem. The problem is the + * following:
+ *
+ * In League of Legends, a player's Effective Health when defending against + * physical damage is given by E=H(100+A)/100, where H is health and A is + * armor. Health costs 2.5 gold per unit, and Armor costs 18 gold per unit. + * You have 3600 gold, and you need to optimize the effectiveness E of your + * health and armor to survive as long as possible against the enemy team's + * attacks. How much of each should you buy?
+ *
+ * The solution is H = 1080, A = 50 for a total fitness of 1620. Tested with + * 50 swarms each with 1000 particles. + */ + @Test + public void givenMultiswarm_whenThousandIteration_thenSolutionFound() { + Multiswarm multiswarm = new Multiswarm(50, 1000, new LolFitnessFunction()); + + // Iterates 1000 times through the main loop and prints the result. + for (int i = 0; i < 1000; i++) { + multiswarm.mainLoop(); + } + + System.out.println("Best fitness found: " + multiswarm.getBestFitness() + "[" + multiswarm.getBestPosition()[0] + + "," + multiswarm.getBestPosition()[1] + "]"); + Assert.assertEquals(1080, multiswarm.getBestPosition()[0]); + Assert.assertEquals(50, multiswarm.getBestPosition()[1]); + Assert.assertEquals(1620, (int) multiswarm.getBestFitness()); + } + +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java b/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java new file mode 100644 index 0000000000..4995e938b7 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/prime/PrimeGeneratorTest.java @@ -0,0 +1,28 @@ +package com.baeldung.algorithms.prime; + +import static com.baeldung.algorithms.prime.PrimeGenerator.*; + +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; + +public class PrimeGeneratorTest { + @Test + public void whenBruteForced_returnsSuccessfully() { + final List primeNumbers = primeNumbersBruteForce(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenOptimized_returnsSuccessfully() { + final List primeNumbers = primeNumbersTill(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenSieveOfEratosthenes_returnsSuccessfully() { + final List primeNumbers = sieveOfEratosthenes(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } +} diff --git a/algorithms/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms/src/test/java/com/baeldung/algorithms/support/MayFailRule.java new file mode 100644 index 0000000000..91df78ce4a --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/algorithms/support/MayFailRule.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.support; + +import org.junit.Rule; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +/** + * JUnit custom rule for managing tests that may fail due to heuristics or + * randomness. In order to use this, just instantiate this object as a public + * field inside the test class and annotate it with {@link Rule}. + * + * @author Donato Rimenti + * + */ +public class MayFailRule implements TestRule { + + /* + * (non-Javadoc) + * + * @see org.junit.rules.TestRule#apply(org.junit.runners.model.Statement, + * org.junit.runner.Description) + */ + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + try { + base.evaluate(); + } catch (Throwable e) { + // Ignore the exception since we expect this. + } + } + }; + } + +} diff --git a/animal-sniffer-mvn-plugin/pom.xml b/animal-sniffer-mvn-plugin/pom.xml index 3190950d9b..2356c7d5a2 100644 --- a/animal-sniffer-mvn-plugin/pom.xml +++ b/animal-sniffer-mvn-plugin/pom.xml @@ -9,7 +9,7 @@ http://maven.apache.org - 3.6.0 + 3.7.0 @@ -26,8 +26,8 @@ maven-compiler-plugin 3.7.0 - 1.6 - 1.6 + 1.8 + 1.8 diff --git a/annotations/annotation-processing/pom.xml b/annotations/annotation-processing/pom.xml index df6f9d44b7..b5219d57ba 100644 --- a/annotations/annotation-processing/pom.xml +++ b/annotations/annotation-processing/pom.xml @@ -15,7 +15,7 @@ 1.0-rc2 - 3.6.0 + 3.7.0 diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml new file mode 100644 index 0000000000..35549861c8 --- /dev/null +++ b/apache-curator/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + apache-curator + 0.0.1-SNAPSHOT + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 4.0.1 + 3.4.11 + 2.9.4 + + + 3.6.1 + 1.7.0 + + + + + + + + + org.apache.curator + curator-x-async + ${curator.version} + + + org.apache.zookeeper + zookeeper + + + + + + org.apache.curator + curator-recipes + ${curator.version} + + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + diff --git a/apache-curator/src/main/java/com/baeldung/apache/curator/modeled/HostConfig.java b/apache-curator/src/main/java/com/baeldung/apache/curator/modeled/HostConfig.java new file mode 100644 index 0000000000..bab7133742 --- /dev/null +++ b/apache-curator/src/main/java/com/baeldung/apache/curator/modeled/HostConfig.java @@ -0,0 +1,31 @@ +package com.baeldung.apache.curator.modeled; + +public class HostConfig { + private String hostname; + private int port; + + public HostConfig() { + + } + + public HostConfig(String hostname, int port) { + this.hostname = hostname; + this.port = port; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } +} diff --git a/apache-curator/src/test/java/com/baeldung/apache/curator/BaseTest.java b/apache-curator/src/test/java/com/baeldung/apache/curator/BaseTest.java new file mode 100644 index 0000000000..cfac3ee3f2 --- /dev/null +++ b/apache-curator/src/test/java/com/baeldung/apache/curator/BaseTest.java @@ -0,0 +1,22 @@ +package com.baeldung.apache.curator; + +import org.apache.curator.RetryPolicy; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.retry.RetryNTimes; +import org.junit.Before; + +public abstract class BaseTest { + + @Before + public void setup() { + org.apache.log4j.BasicConfigurator.configure(); + } + + protected CuratorFramework newClient() { + int sleepMsBetweenRetries = 100; + int maxRetries = 3; + RetryPolicy retryPolicy = new RetryNTimes(maxRetries, sleepMsBetweenRetries); + return CuratorFrameworkFactory.newClient("127.0.0.1:2181", retryPolicy); + } +} diff --git a/apache-curator/src/test/java/com/baeldung/apache/curator/configuration/ConfigurationManagementManualTest.java b/apache-curator/src/test/java/com/baeldung/apache/curator/configuration/ConfigurationManagementManualTest.java new file mode 100644 index 0000000000..d02ef8131d --- /dev/null +++ b/apache-curator/src/test/java/com/baeldung/apache/curator/configuration/ConfigurationManagementManualTest.java @@ -0,0 +1,89 @@ +package com.baeldung.apache.curator.configuration; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.x.async.AsyncCuratorFramework; +import org.junit.Test; + +import com.baeldung.apache.curator.BaseTest; + +public class ConfigurationManagementManualTest extends BaseTest { + + private static final String KEY_FORMAT = "/%s"; + + @Test + public void givenPath_whenCreateKey_thenValueIsStored() throws Exception { + try (CuratorFramework client = newClient()) { + client.start(); + AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client); + String key = getKey(); + String expected = "my_value"; + + // Create key nodes structure + client.create() + .forPath(key); + + // Set data value for our key + async.setData() + .forPath(key, expected.getBytes()); + + // Get data value + AtomicBoolean isEquals = new AtomicBoolean(); + async.getData() + .forPath(key) + .thenAccept( + data -> isEquals.set(new String(data).equals(expected))); + + await().until(() -> assertThat(isEquals.get()).isTrue()); + } + } + + @Test + public void givenPath_whenWatchAKeyAndStoreAValue_thenWatcherIsTriggered() + throws Exception { + try (CuratorFramework client = newClient()) { + client.start(); + AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client); + String key = getKey(); + String expected = "my_value"; + + // Create key structure + async.create() + .forPath(key); + + List changes = new ArrayList<>(); + + // Watch data value + async.watched() + .getData() + .forPath(key) + .event() + .thenAccept(watchedEvent -> { + try { + changes.add(new String(client.getData() + .forPath(watchedEvent.getPath()))); + } catch (Exception e) { + // fail ... + } + }); + + // Set data value for our key + async.setData() + .forPath(key, expected.getBytes()); + + await().until(() -> assertThat(changes.size() > 0).isTrue()); + } + } + + private String getKey() { + return String.format(KEY_FORMAT, UUID.randomUUID() + .toString()); + } +} diff --git a/apache-curator/src/test/java/com/baeldung/apache/curator/connection/ConnectionManagementManualTest.java b/apache-curator/src/test/java/com/baeldung/apache/curator/connection/ConnectionManagementManualTest.java new file mode 100644 index 0000000000..61fa1c7c2c --- /dev/null +++ b/apache-curator/src/test/java/com/baeldung/apache/curator/connection/ConnectionManagementManualTest.java @@ -0,0 +1,79 @@ +package com.baeldung.apache.curator.connection; + +import static com.jayway.awaitility.Awaitility.await; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.curator.RetryPolicy; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.retry.RetryNTimes; +import org.apache.curator.x.async.AsyncCuratorFramework; +import org.junit.Test; + +public class ConnectionManagementManualTest { + + @Test + public void givenRunningZookeeper_whenOpenConnection_thenClientIsOpened() + throws Exception { + int sleepMsBetweenRetries = 100; + int maxRetries = 3; + RetryPolicy retryPolicy = new RetryNTimes(maxRetries, + sleepMsBetweenRetries); + + try (CuratorFramework client = CuratorFrameworkFactory + .newClient("127.0.0.1:2181", retryPolicy)) { + client.start(); + + assertThat(client.checkExists() + .forPath("/")).isNotNull(); + } + } + + @Test + public void givenRunningZookeeper_whenOpenConnectionUsingAsyncNotBlocking_thenClientIsOpened() + throws InterruptedException { + int sleepMsBetweenRetries = 100; + int maxRetries = 3; + RetryPolicy retryPolicy = new RetryNTimes(maxRetries, + sleepMsBetweenRetries); + + try (CuratorFramework client = CuratorFrameworkFactory + .newClient("127.0.0.1:2181", retryPolicy)) { + client.start(); + AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client); + + AtomicBoolean exists = new AtomicBoolean(false); + + async.checkExists() + .forPath("/") + .thenAcceptAsync(s -> exists.set(s != null)); + + await().until(() -> assertThat(exists.get()).isTrue()); + } + } + + @Test + public void givenRunningZookeeper_whenOpenConnectionUsingAsyncBlocking_thenClientIsOpened() + throws InterruptedException { + int sleepMsBetweenRetries = 100; + int maxRetries = 3; + RetryPolicy retryPolicy = new RetryNTimes(maxRetries, + sleepMsBetweenRetries); + + try (CuratorFramework client = CuratorFrameworkFactory + .newClient("127.0.0.1:2181", retryPolicy)) { + client.start(); + AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client); + + AtomicBoolean exists = new AtomicBoolean(false); + + async.checkExists() + .forPath("/") + .thenAccept(s -> exists.set(s != null)); + + await().until(() -> assertThat(exists.get()).isTrue()); + } + } +} diff --git a/apache-curator/src/test/java/com/baeldung/apache/curator/modeled/ModelTypedExamplesManualTest.java b/apache-curator/src/test/java/com/baeldung/apache/curator/modeled/ModelTypedExamplesManualTest.java new file mode 100644 index 0000000000..4400c1d1aa --- /dev/null +++ b/apache-curator/src/test/java/com/baeldung/apache/curator/modeled/ModelTypedExamplesManualTest.java @@ -0,0 +1,49 @@ +package com.baeldung.apache.curator.modeled; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.x.async.AsyncCuratorFramework; +import org.apache.curator.x.async.modeled.JacksonModelSerializer; +import org.apache.curator.x.async.modeled.ModelSpec; +import org.apache.curator.x.async.modeled.ModeledFramework; +import org.apache.curator.x.async.modeled.ZPath; +import org.junit.Test; + +import com.baeldung.apache.curator.BaseTest; + +public class ModelTypedExamplesManualTest extends BaseTest { + + @Test + public void givenPath_whenStoreAModel_thenNodesAreCreated() + throws InterruptedException { + + ModelSpec mySpec = ModelSpec + .builder(ZPath.parseWithIds("/config/dev"), + JacksonModelSerializer.build(HostConfig.class)) + .build(); + + try (CuratorFramework client = newClient()) { + client.start(); + AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client); + ModeledFramework modeledClient = ModeledFramework + .wrap(async, mySpec); + + modeledClient.set(new HostConfig("host-name", 8080)); + + modeledClient.read() + .whenComplete((value, e) -> { + if (e != null) { + fail("Cannot read host config", e); + } else { + assertThat(value).isNotNull(); + assertThat(value.getHostname()).isEqualTo("host-name"); + assertThat(value.getPort()).isEqualTo(8080); + } + + }); + } + + } +} diff --git a/apache-curator/src/test/java/com/baeldung/apache/curator/recipes/RecipesManualTest.java b/apache-curator/src/test/java/com/baeldung/apache/curator/recipes/RecipesManualTest.java new file mode 100644 index 0000000000..04f4104e6b --- /dev/null +++ b/apache-curator/src/test/java/com/baeldung/apache/curator/recipes/RecipesManualTest.java @@ -0,0 +1,74 @@ +package com.baeldung.apache.curator.recipes; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.recipes.leader.LeaderSelector; +import org.apache.curator.framework.recipes.leader.LeaderSelectorListener; +import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex; +import org.apache.curator.framework.recipes.shared.SharedCount; +import org.apache.curator.framework.state.ConnectionState; +import org.junit.Test; + +import com.baeldung.apache.curator.BaseTest; + +public class RecipesManualTest extends BaseTest { + + @Test + public void givenRunningZookeeper_whenUsingLeaderElection_thenNoErrors() { + try (CuratorFramework client = newClient()) { + client.start(); + LeaderSelector leaderSelector = new LeaderSelector(client, "/mutex/select/leader/for/job/A", new LeaderSelectorListener() { + + @Override + public void stateChanged(CuratorFramework client, ConnectionState newState) { + + } + + @Override + public void takeLeadership(CuratorFramework client) throws Exception { + // I'm the leader of the job A ! + } + + }); + + leaderSelector.start(); + + // Wait until the job A is done among all the members + + leaderSelector.close(); + } + } + + @Test + public void givenRunningZookeeper_whenUsingSharedLock_thenNoErrors() throws Exception { + try (CuratorFramework client = newClient()) { + client.start(); + InterProcessSemaphoreMutex sharedLock = new InterProcessSemaphoreMutex(client, "/mutex/process/A"); + + sharedLock.acquire(); + + // Do process A + + sharedLock.release(); + } + } + + @Test + public void givenRunningZookeeper_whenUsingSharedCounter_thenCounterIsIncrement() throws Exception { + try (CuratorFramework client = newClient()) { + client.start(); + + try (SharedCount counter = new SharedCount(client, "/counters/A", 0)) { + counter.start(); + + counter.setCount(0); + counter.setCount(counter.getCount() + 1); + + assertThat(counter.getCount()).isEqualTo(1); + } + + } + } + +} diff --git a/apache-poi/README.md b/apache-poi/README.md index 10fe8ba2e7..c052bc9bf6 100644 --- a/apache-poi/README.md +++ b/apache-poi/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi) - [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel) +- [Creating a MS PowerPoint Presentation in Java](https://github.com/eugenp/tutorials/tree/master/apache-poi) diff --git a/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java b/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java new file mode 100644 index 0000000000..e2af4f8808 --- /dev/null +++ b/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java @@ -0,0 +1,224 @@ +package com.baeldung.poi.powerpoint; + +import org.apache.poi.sl.usermodel.AutoNumberingScheme; +import org.apache.poi.sl.usermodel.PictureData; +import org.apache.poi.sl.usermodel.TableCell; +import org.apache.poi.sl.usermodel.TextParagraph; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xslf.usermodel.*; + +import java.awt.*; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class for the PowerPoint presentation creation + */ +public class PowerPointHelper { + + /** + * Read an existing presentation + * + * @param fileLocation + * File location of the presentation + * @return instance of {@link XMLSlideShow} + * @throws IOException + */ + public XMLSlideShow readingExistingSlideShow(String fileLocation) throws IOException { + return new XMLSlideShow(new FileInputStream(fileLocation)); + } + + /** + * Create a sample presentation + * + * @param fileLocation + * File location of the presentation + * @throws IOException + */ + public void createPresentation(String fileLocation) throws IOException { + // Create presentation + XMLSlideShow ppt = new XMLSlideShow(); + + XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0); + + // Retriving the slide layout + XSLFSlideLayout layout = defaultMaster.getLayout(SlideLayout.TITLE_ONLY); + + // Creating the 1st slide + XSLFSlide slide1 = ppt.createSlide(layout); + XSLFTextShape title = slide1.getPlaceholder(0); + // Clearing text to remove the predefined one in the template + title.clearText(); + XSLFTextParagraph p = title.addNewTextParagraph(); + + XSLFTextRun r1 = p.addNewTextRun(); + r1.setText("Baeldung"); + r1.setFontColor(new Color(78, 147, 89)); + r1.setFontSize(48.); + + // Add Image + ClassLoader classLoader = getClass().getClassLoader(); + byte[] pictureData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("logo-leaf.png").getFile())); + + XSLFPictureData pd = ppt.addPicture(pictureData, PictureData.PictureType.PNG); + XSLFPictureShape picture = slide1.createPicture(pd); + picture.setAnchor(new Rectangle(320, 230, 100, 92)); + + // Creating 2nd slide + layout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT); + XSLFSlide slide2 = ppt.createSlide(layout); + + // setting the tile + title = slide2.getPlaceholder(0); + title.clearText(); + XSLFTextRun r = title.addNewTextParagraph().addNewTextRun(); + r.setText("Baeldung"); + + // Adding the link + XSLFHyperlink link = r.createHyperlink(); + link.setAddress("http://www.baeldung.com"); + + // setting the content + XSLFTextShape content = slide2.getPlaceholder(1); + content.clearText(); // unset any existing text + content.addNewTextParagraph().addNewTextRun().setText("First paragraph"); + content.addNewTextParagraph().addNewTextRun().setText("Second paragraph"); + content.addNewTextParagraph().addNewTextRun().setText("Third paragraph"); + + // Creating 3rd slide - List + layout = defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT); + XSLFSlide slide3 = ppt.createSlide(layout); + title = slide3.getPlaceholder(0); + title.clearText(); + r = title.addNewTextParagraph().addNewTextRun(); + r.setText("Lists"); + + content = slide3.getPlaceholder(1); + content.clearText(); + XSLFTextParagraph p1 = content.addNewTextParagraph(); + p1.setIndentLevel(0); + p1.setBullet(true); + r1 = p1.addNewTextRun(); + r1.setText("Bullet"); + + // the next three paragraphs form an auto-numbered list + XSLFTextParagraph p2 = content.addNewTextParagraph(); + p2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1); + p2.setIndentLevel(1); + XSLFTextRun r2 = p2.addNewTextRun(); + r2.setText("Numbered List Item - 1"); + + // Creating 4th slide + XSLFSlide slide4 = ppt.createSlide(); + createTable(slide4); + + // Save presentation + FileOutputStream out = new FileOutputStream(fileLocation); + ppt.write(out); + out.close(); + + // Closing presentation + ppt.close(); + } + + /** + * Delete a slide from the presentation + * + * @param ppt + * The presentation + * @param slideNumber + * The number of the slide to be deleted (0-based) + */ + public void deleteSlide(XMLSlideShow ppt, int slideNumber) { + ppt.removeSlide(slideNumber); + } + + /** + * Re-order the slides inside a presentation + * + * @param ppt + * The presentation + * @param slideNumber + * The number of the slide to move + * @param newSlideNumber + * The new position of the slide (0-base) + */ + public void reorderSlide(XMLSlideShow ppt, int slideNumber, int newSlideNumber) { + List slides = ppt.getSlides(); + + XSLFSlide secondSlide = slides.get(slideNumber); + ppt.setSlideOrder(secondSlide, newSlideNumber); + } + + /** + * Retrieve the placeholder inside a slide + * + * @param slide + * The slide + * @return List of placeholder inside a slide + */ + public List retrieveTemplatePlaceholders(XSLFSlide slide) { + List placeholders = new ArrayList<>(); + + for (XSLFShape shape : slide.getShapes()) { + if (shape instanceof XSLFAutoShape) { + placeholders.add(shape); + } + } + return placeholders; + } + + /** + * Create a table + * + * @param slide + * Slide + */ + private void createTable(XSLFSlide slide) { + + XSLFTable tbl = slide.createTable(); + tbl.setAnchor(new Rectangle(50, 50, 450, 300)); + + int numColumns = 3; + int numRows = 5; + + // header + XSLFTableRow headerRow = tbl.addRow(); + headerRow.setHeight(50); + for (int i = 0; i < numColumns; i++) { + XSLFTableCell th = headerRow.addCell(); + XSLFTextParagraph p = th.addNewTextParagraph(); + p.setTextAlign(TextParagraph.TextAlign.CENTER); + XSLFTextRun r = p.addNewTextRun(); + r.setText("Header " + (i + 1)); + r.setBold(true); + r.setFontColor(Color.white); + th.setFillColor(new Color(79, 129, 189)); + th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0); + th.setBorderColor(TableCell.BorderEdge.bottom, Color.white); + // all columns are equally sized + tbl.setColumnWidth(i, 150); + } + + // data + for (int rownum = 0; rownum < numRows; rownum++) { + XSLFTableRow tr = tbl.addRow(); + tr.setHeight(50); + for (int i = 0; i < numColumns; i++) { + XSLFTableCell cell = tr.addCell(); + XSLFTextParagraph p = cell.addNewTextParagraph(); + XSLFTextRun r = p.addNewTextRun(); + + r.setText("Cell " + (i * rownum + 1)); + if (rownum % 2 == 0) { + cell.setFillColor(new Color(208, 216, 232)); + } else { + cell.setFillColor(new Color(233, 247, 244)); + } + } + } + } +} diff --git a/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java b/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java new file mode 100644 index 0000000000..5319208e85 --- /dev/null +++ b/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java @@ -0,0 +1,77 @@ +package com.baeldung.poi.powerpoint; + +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.apache.poi.xslf.usermodel.XSLFSlide; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.List; + +public class PowerPointIntegrationTest { + + private PowerPointHelper pph; + private String fileLocation; + private static final String FILE_NAME = "presentation.pptx"; + + @Before + public void setUp() throws Exception { + File currDir = new File("."); + String path = currDir.getAbsolutePath(); + fileLocation = path.substring(0, path.length() - 1) + FILE_NAME; + + pph = new PowerPointHelper(); + pph.createPresentation(fileLocation); + } + + @Test + public void whenReadingAPresentation_thenOK() throws Exception { + XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation); + + Assert.assertNotNull(xmlSlideShow); + Assert.assertEquals(4, xmlSlideShow.getSlides().size()); + } + + @Test + public void whenRetrievingThePlaceholdersForEachSlide_thenOK() throws Exception { + XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation); + + List onlyTitleSlidePlaceholders = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(0)); + List titleAndBodySlidePlaceholders = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(1)); + List emptySlidePlaceholdes = pph.retrieveTemplatePlaceholders(xmlSlideShow.getSlides().get(3)); + + Assert.assertEquals(1, onlyTitleSlidePlaceholders.size()); + Assert.assertEquals(2, titleAndBodySlidePlaceholders.size()); + Assert.assertEquals(0, emptySlidePlaceholdes.size()); + + } + + @Test + public void whenSortingSlides_thenOK() throws Exception { + XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation); + XSLFSlide slide4 = xmlSlideShow.getSlides().get(3); + pph.reorderSlide(xmlSlideShow, 3, 1); + + Assert.assertEquals(slide4, xmlSlideShow.getSlides().get(1)); + } + + @Test + public void givenPresentation_whenDeletingASlide_thenOK() throws Exception { + XMLSlideShow xmlSlideShow = pph.readingExistingSlideShow(fileLocation); + pph.deleteSlide(xmlSlideShow, 3); + + Assert.assertEquals(3, xmlSlideShow.getSlides().size()); + } + + @After + public void tearDown() throws Exception { + File testFile = new File(fileLocation); + if (testFile.exists()) { + testFile.delete(); + } + pph = null; + } +} diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml index 711ddb5cee..2c5ef86837 100644 --- a/apache-shiro/pom.xml +++ b/apache-shiro/pom.xml @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.2 + 3.7.0 1.8 1.8 diff --git a/apache-spark/README.md b/apache-spark/README.md new file mode 100644 index 0000000000..fb8059eb27 --- /dev/null +++ b/apache-spark/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark) diff --git a/apache-tika/pom.xml b/apache-tika/pom.xml new file mode 100644 index 0000000000..34013dee89 --- /dev/null +++ b/apache-tika/pom.xml @@ -0,0 +1,25 @@ + + 4.0.0 + com.baeldung + apache-tika + 0.0.1-SNAPSHOT + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 1.17 + + + + + org.apache.tika + tika-parsers + ${tika.version} + + + \ No newline at end of file diff --git a/apache-tika/src/main/java/com/baeldung/tika/TikaAnalysis.java b/apache-tika/src/main/java/com/baeldung/tika/TikaAnalysis.java new file mode 100644 index 0000000000..85eafc7c08 --- /dev/null +++ b/apache-tika/src/main/java/com/baeldung/tika/TikaAnalysis.java @@ -0,0 +1,67 @@ +package com.baeldung.tika; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.tika.Tika; +import org.apache.tika.detect.DefaultDetector; +import org.apache.tika.detect.Detector; +import org.apache.tika.exception.TikaException; +import org.apache.tika.metadata.Metadata; +import org.apache.tika.mime.MediaType; +import org.apache.tika.parser.AutoDetectParser; +import org.apache.tika.parser.ParseContext; +import org.apache.tika.parser.Parser; +import org.apache.tika.sax.BodyContentHandler; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + +public class TikaAnalysis { + public static String detectDocTypeUsingDetector(InputStream stream) throws IOException { + Detector detector = new DefaultDetector(); + Metadata metadata = new Metadata(); + + MediaType mediaType = detector.detect(stream, metadata); + return mediaType.toString(); + } + + public static String detectDocTypeUsingFacade(InputStream stream) throws IOException { + Tika tika = new Tika(); + String mediaType = tika.detect(stream); + return mediaType; + } + + public static String extractContentUsingParser(InputStream stream) throws IOException, TikaException, SAXException { + Parser parser = new AutoDetectParser(); + ContentHandler handler = new BodyContentHandler(); + Metadata metadata = new Metadata(); + ParseContext context = new ParseContext(); + + parser.parse(stream, handler, metadata, context); + return handler.toString(); + } + + public static String extractContentUsingFacade(InputStream stream) throws IOException, TikaException { + Tika tika = new Tika(); + String content = tika.parseToString(stream); + return content; + } + + public static Metadata extractMetadatatUsingParser(InputStream stream) throws IOException, SAXException, TikaException { + Parser parser = new AutoDetectParser(); + ContentHandler handler = new BodyContentHandler(); + Metadata metadata = new Metadata(); + ParseContext context = new ParseContext(); + + parser.parse(stream, handler, metadata, context); + return metadata; + } + + public static Metadata extractMetadatatUsingFacade(InputStream stream) throws IOException, TikaException { + Tika tika = new Tika(); + Metadata metadata = new Metadata(); + + tika.parse(stream, metadata); + return metadata; + } +} diff --git a/apache-tika/src/test/java/com/baeldung/tika/TikaUnitTest.java b/apache-tika/src/test/java/com/baeldung/tika/TikaUnitTest.java new file mode 100644 index 0000000000..f8c2372d1f --- /dev/null +++ b/apache-tika/src/test/java/com/baeldung/tika/TikaUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.tika; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.tika.exception.TikaException; +import org.apache.tika.metadata.Metadata; +import org.junit.Test; +import org.xml.sax.SAXException; + +public class TikaUnitTest { + @Test + public void whenUsingDetector_thenDocumentTypeIsReturned() throws IOException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.txt"); + String mediaType = TikaAnalysis.detectDocTypeUsingDetector(stream); + + assertEquals("application/pdf", mediaType); + + stream.close(); + } + + @Test + public void whenUsingFacade_thenDocumentTypeIsReturned() throws IOException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.txt"); + String mediaType = TikaAnalysis.detectDocTypeUsingFacade(stream); + + assertEquals("application/pdf", mediaType); + + stream.close(); + } + + @Test + public void whenUsingParser_thenContentIsReturned() throws IOException, TikaException, SAXException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.docx"); + String content = TikaAnalysis.extractContentUsingParser(stream); + + assertThat(content, containsString("Apache Tika - a content analysis toolkit")); + assertThat(content, containsString("detects and extracts metadata and text")); + + stream.close(); + } + + @Test + public void whenUsingFacade_thenContentIsReturned() throws IOException, TikaException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.docx"); + String content = TikaAnalysis.extractContentUsingFacade(stream); + + assertThat(content, containsString("Apache Tika - a content analysis toolkit")); + assertThat(content, containsString("detects and extracts metadata and text")); + + stream.close(); + } + + @Test + public void whenUsingParser_thenMetadataIsReturned() throws IOException, TikaException, SAXException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.xlsx"); + Metadata metadata = TikaAnalysis.extractMetadatatUsingParser(stream); + + assertEquals("org.apache.tika.parser.DefaultParser", metadata.get("X-Parsed-By")); + assertEquals("Microsoft Office User", metadata.get("Author")); + + stream.close(); + } + + @Test + public void whenUsingFacade_thenMetadataIsReturned() throws IOException, TikaException { + InputStream stream = this.getClass().getClassLoader().getResourceAsStream("tika.xlsx"); + Metadata metadata = TikaAnalysis.extractMetadatatUsingFacade(stream); + + assertEquals("org.apache.tika.parser.DefaultParser", metadata.get("X-Parsed-By")); + assertEquals("Microsoft Office User", metadata.get("Author")); + + stream.close(); + } +} diff --git a/apache-tika/src/test/resources/tika.docx b/apache-tika/src/test/resources/tika.docx new file mode 100644 index 0000000000..0a01ccef55 Binary files /dev/null and b/apache-tika/src/test/resources/tika.docx differ diff --git a/apache-tika/src/test/resources/tika.txt b/apache-tika/src/test/resources/tika.txt new file mode 100644 index 0000000000..26923836de Binary files /dev/null and b/apache-tika/src/test/resources/tika.txt differ diff --git a/apache-tika/src/test/resources/tika.xlsx b/apache-tika/src/test/resources/tika.xlsx new file mode 100644 index 0000000000..110a0b2dd5 Binary files /dev/null and b/apache-tika/src/test/resources/tika.xlsx differ diff --git a/apache-zookeeper/pom.xml b/apache-zookeeper/pom.xml new file mode 100644 index 0000000000..3a6fc1787b --- /dev/null +++ b/apache-zookeeper/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + com.baeldung + apache-zookeeper + 0.0.1-SNAPSHOT + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.apache.zookeeper + zookeeper + 3.3.2 + + + com.sun.jmx + jmxri + + + com.sun.jdmk + jmxtools + + + javax.jms + jms + + + + + diff --git a/apache-zookeeper/src/main/java/com/baeldung/zookeeper/connection/ZKConnection.java b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/connection/ZKConnection.java new file mode 100644 index 0000000000..0678250d57 --- /dev/null +++ b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/connection/ZKConnection.java @@ -0,0 +1,33 @@ +package com.baeldung.zookeeper.connection; + +import java.io.IOException; +import java.util.concurrent.CountDownLatch; + +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.ZooKeeper; + +public class ZKConnection { + private ZooKeeper zoo; + final CountDownLatch connectionLatch = new CountDownLatch(1); + + public ZKConnection() { + } + + public ZooKeeper connect(String host) throws IOException, InterruptedException { + zoo = new ZooKeeper(host, 2000, new Watcher() { + public void process(WatchedEvent we) { + if (we.getState() == KeeperState.SyncConnected) { + connectionLatch.countDown(); + } + } + }); + connectionLatch.await(); + return zoo; + } + + public void close() throws InterruptedException { + zoo.close(); + } +} diff --git a/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManager.java b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManager.java new file mode 100644 index 0000000000..0c0ad52123 --- /dev/null +++ b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManager.java @@ -0,0 +1,35 @@ +package com.baeldung.zookeeper.manager; + +import org.apache.zookeeper.KeeperException; + +public interface ZKManager { + /** + * Create a Znode and save some data + * + * @param path + * @param data + * @throws KeeperException + * @throws InterruptedException + */ + public void create(String path, byte[] data) throws KeeperException, InterruptedException; + + /** + * Get ZNode Data + * + * @param path + * @param boolean watchFlag + * @throws KeeperException + * @throws InterruptedException + */ + public Object getZNodeData(String path, boolean watchFlag); + + /** + * Update the ZNode Data + * + * @param path + * @param data + * @throws KeeperException + * @throws InterruptedException + */ + public void update(String path, byte[] data) throws KeeperException, InterruptedException, KeeperException; +} diff --git a/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManagerImpl.java b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManagerImpl.java new file mode 100644 index 0000000000..adf76bc0f2 --- /dev/null +++ b/apache-zookeeper/src/main/java/com/baeldung/zookeeper/manager/ZKManagerImpl.java @@ -0,0 +1,58 @@ +package com.baeldung.zookeeper.manager; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; + +import com.baeldung.zookeeper.connection.ZKConnection; + +public class ZKManagerImpl implements ZKManager { + private static ZooKeeper zkeeper; + private static ZKConnection zkConnection; + + public ZKManagerImpl() { + initialize(); + } + + /** * Initialize connection */ + private void initialize() { + try { + zkConnection = new ZKConnection(); + zkeeper = zkConnection.connect("localhost"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public void closeConnection() { + try { + zkConnection.close(); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + } + + public void create(String path, byte[] data) throws KeeperException, InterruptedException { + zkeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } + + public Object getZNodeData(String path, boolean watchFlag) { + try { + byte[] b = null; + b = zkeeper.getData(path, null, null); + String data = new String(b, "UTF-8"); + System.out.println(data); + return data; + } catch (Exception e) { + System.out.println(e.getMessage()); + } + return null; + } + + public void update(String path, byte[] data) throws KeeperException, InterruptedException { + int version = zkeeper.exists(path, true) + .getVersion(); + zkeeper.setData(path, data, version); + } +} diff --git a/aws/src/main/java/com/baeldung/ec2/EC2Application.java b/aws/src/main/java/com/baeldung/ec2/EC2Application.java new file mode 100644 index 0000000000..6755188fcd --- /dev/null +++ b/aws/src/main/java/com/baeldung/ec2/EC2Application.java @@ -0,0 +1,137 @@ +package com.baeldung.ec2; + +import java.util.Arrays; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.ec2.AmazonEC2; +import com.amazonaws.services.ec2.AmazonEC2ClientBuilder; +import com.amazonaws.services.ec2.model.AuthorizeSecurityGroupIngressRequest; +import com.amazonaws.services.ec2.model.CreateKeyPairRequest; +import com.amazonaws.services.ec2.model.CreateKeyPairResult; +import com.amazonaws.services.ec2.model.CreateSecurityGroupRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesRequest; +import com.amazonaws.services.ec2.model.DescribeInstancesResult; +import com.amazonaws.services.ec2.model.DescribeKeyPairsRequest; +import com.amazonaws.services.ec2.model.DescribeKeyPairsResult; +import com.amazonaws.services.ec2.model.IpPermission; +import com.amazonaws.services.ec2.model.IpRange; +import com.amazonaws.services.ec2.model.MonitorInstancesRequest; +import com.amazonaws.services.ec2.model.RebootInstancesRequest; +import com.amazonaws.services.ec2.model.RunInstancesRequest; +import com.amazonaws.services.ec2.model.StartInstancesRequest; +import com.amazonaws.services.ec2.model.StopInstancesRequest; +import com.amazonaws.services.ec2.model.UnmonitorInstancesRequest; + +public class EC2Application { + + private static final AWSCredentials credentials; + + static { + // put your accesskey and secretkey here + credentials = new BasicAWSCredentials( + "", + "" + ); + } + + public static void main(String[] args) { + + // Set up the client + AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(Regions.US_EAST_1) + .build(); + + // Create a security group + CreateSecurityGroupRequest createSecurityGroupRequest = new CreateSecurityGroupRequest().withGroupName("BaeldungSecurityGroup") + .withDescription("Baeldung Security Group"); + ec2Client.createSecurityGroup(createSecurityGroupRequest); + + // Allow HTTP and SSH traffic + IpRange ipRange1 = new IpRange().withCidrIp("0.0.0.0/0"); + + IpPermission ipPermission1 = new IpPermission().withIpv4Ranges(Arrays.asList(new IpRange[] { ipRange1 })) + .withIpProtocol("tcp") + .withFromPort(80) + .withToPort(80); + + IpPermission ipPermission2 = new IpPermission().withIpv4Ranges(Arrays.asList(new IpRange[] { ipRange1 })) + .withIpProtocol("tcp") + .withFromPort(22) + .withToPort(22); + + AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest = new AuthorizeSecurityGroupIngressRequest() + .withGroupName("BaeldungSecurityGroup") + .withIpPermissions(ipPermission1, ipPermission2); + + ec2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest); + + // Create KeyPair + CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest() + .withKeyName("baeldung-key-pair"); + CreateKeyPairResult createKeyPairResult = ec2Client.createKeyPair(createKeyPairRequest); + String privateKey = createKeyPairResult + .getKeyPair() + .getKeyMaterial(); // make sure you keep it, the private key, Amazon doesn't store the private key + + // See what key-pairs you've got + DescribeKeyPairsRequest describeKeyPairsRequest = new DescribeKeyPairsRequest(); + DescribeKeyPairsResult describeKeyPairsResult = ec2Client.describeKeyPairs(describeKeyPairsRequest); + + // Launch an Amazon Instance + RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId("ami-97785bed") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html | https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/usingsharedamis-finding.html + .withInstanceType("t2.micro") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html + .withMinCount(1) + .withMaxCount(1) + .withKeyName("baeldung-key-pair") // optional - if not present, can't connect to instance + .withSecurityGroups("BaeldungSecurityGroup"); + + String yourInstanceId = ec2Client.runInstances(runInstancesRequest).getReservation().getInstances().get(0).getInstanceId(); + + // Start an Instance + StartInstancesRequest startInstancesRequest = new StartInstancesRequest() + .withInstanceIds(yourInstanceId); + + ec2Client.startInstances(startInstancesRequest); + + // Monitor Instances + MonitorInstancesRequest monitorInstancesRequest = new MonitorInstancesRequest() + .withInstanceIds(yourInstanceId); + + ec2Client.monitorInstances(monitorInstancesRequest); + + UnmonitorInstancesRequest unmonitorInstancesRequest = new UnmonitorInstancesRequest() + .withInstanceIds(yourInstanceId); + + ec2Client.unmonitorInstances(unmonitorInstancesRequest); + + // Reboot an Instance + + RebootInstancesRequest rebootInstancesRequest = new RebootInstancesRequest() + .withInstanceIds(yourInstanceId); + + ec2Client.rebootInstances(rebootInstancesRequest); + + // Stop an Instance + StopInstancesRequest stopInstancesRequest = new StopInstancesRequest() + .withInstanceIds(yourInstanceId); + + ec2Client.stopInstances(stopInstancesRequest) + .getStoppingInstances() + .get(0) + .getPreviousState() + .getName(); + + // Describe an Instance + DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest(); + DescribeInstancesResult response = ec2Client.describeInstances(describeInstancesRequest); + System.out.println(response.getReservations() + .get(0) + .getInstances() + .get(0) + .getKernelId()); + } +} diff --git a/bootique/dependency-reduced-pom.xml b/bootique/dependency-reduced-pom.xml index ed18f4e42a..ab09cfb7b1 100644 --- a/bootique/dependency-reduced-pom.xml +++ b/bootique/dependency-reduced-pom.xml @@ -28,8 +28,14 @@ junit junit - 3.8.1 + 4.12 test + + + hamcrest-core + org.hamcrest + + diff --git a/camel-api/pom.xml b/camel-api/pom.xml index 6db9f9bfd1..c342a73150 100644 --- a/camel-api/pom.xml +++ b/camel-api/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 3.6.0 + 3.7.0 2.19.1 2.19.1 1.5.4.RELEASE diff --git a/cas/cas-secured-app/README.md b/cas/cas-secured-app/README.md new file mode 100644 index 0000000000..01c5f91988 --- /dev/null +++ b/cas/cas-secured-app/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [CAS SSO With Spring Security](http://www.baeldung.com/spring-security-cas-sso) diff --git a/cas/cas-secured-app/pom.xml b/cas/cas-secured-app/pom.xml index f66d54ae67..d52597412e 100644 --- a/cas/cas-secured-app/pom.xml +++ b/cas/cas-secured-app/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT + 2.0.0.M7 @@ -65,18 +65,28 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/JdbcTest.java + **/*LiveTest.java + + + + +
- - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -88,14 +98,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -107,4 +109,5 @@ + diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java index fc05e3b38f..25cbb9bc9b 100644 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/CasSecuredAppApplication.java @@ -40,14 +40,14 @@ public class CasSecuredAppApplication { @Primary public AuthenticationEntryPoint authenticationEntryPoint(ServiceProperties sP) { CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); - entryPoint.setLoginUrl("https://localhost:8443/cas/login"); + entryPoint.setLoginUrl("https://localhost:6443/cas/login"); entryPoint.setServiceProperties(sP); return entryPoint; } @Bean public TicketValidator ticketValidator() { - return new Cas30ServiceTicketValidator("https://localhost:8443/cas"); + return new Cas30ServiceTicketValidator("https://localhost:6443/cas"); } @Bean @@ -71,7 +71,7 @@ public class CasSecuredAppApplication { @Bean public LogoutFilter logoutFilter() { LogoutFilter logoutFilter = new LogoutFilter( - "https://localhost:8443/cas/logout", securityContextLogoutHandler()); + "https://localhost:6443/cas/logout", securityContextLogoutHandler()); logoutFilter.setFilterProcessesUrl("/logout/cas"); return logoutFilter; } @@ -79,7 +79,7 @@ public class CasSecuredAppApplication { @Bean public SingleSignOutFilter singleSignOutFilter() { SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); - singleSignOutFilter.setCasServerUrlPrefix("https://localhost:8443/cas"); + singleSignOutFilter.setCasServerUrlPrefix("https://localhost:6443/cas"); singleSignOutFilter.setIgnoreInitConfiguration(true); return singleSignOutFilter; } diff --git a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java index 703e6abf7a..7faccbb125 100644 --- a/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java +++ b/cas/cas-secured-app/src/main/java/com/baeldung/cassecuredapp/controllers/AuthController.java @@ -1,6 +1,7 @@ package com.baeldung.cassecuredapp.controllers; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler; @@ -15,7 +16,7 @@ import javax.servlet.http.HttpServletResponse; @Controller public class AuthController { - private Logger logger = Logger.getLogger(AuthController.class); + private Logger logger = LogManager.getLogger(AuthController.class); @GetMapping("/logout") public String logout( diff --git a/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java similarity index 84% rename from cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java rename to cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java index 09dbaf0c61..2f2644e2ea 100644 --- a/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationTests.java +++ b/cas/cas-secured-app/src/test/java/com/baeldung/cassecuredapp/CasSecuredAppApplicationIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class CasSecuredAppApplicationTests { +public class CasSecuredAppApplicationIntegrationTest { @Test public void contextLoads() { diff --git a/cas/cas-server/etc/cas/thekeystore b/cas/cas-server/etc/cas/thekeystore deleted file mode 100644 index 15f9af2dae..0000000000 Binary files a/cas/cas-server/etc/cas/thekeystore and /dev/null differ diff --git a/cas/cas-server/etc/cas/thekeystore.crt b/cas/cas-server/etc/cas/thekeystore.crt deleted file mode 100644 index 5c7543f0c6..0000000000 Binary files a/cas/cas-server/etc/cas/thekeystore.crt and /dev/null differ diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml index e8625b48f7..9cae9c487b 100644 --- a/cas/cas-server/pom.xml +++ b/cas/cas-server/pom.xml @@ -52,7 +52,11 @@ org.apache.maven.plugins maven-compiler-plugin - 3.3 + 3.7.0 + + 1.8 + 1.8 + cas diff --git a/cas/cas-server/src/main/resources/application.properties b/cas/cas-server/src/main/resources/application.properties index 2d5e9a7277..018fd351ff 100644 --- a/cas/cas-server/src/main/resources/application.properties +++ b/cas/cas-server/src/main/resources/application.properties @@ -2,9 +2,9 @@ # CAS Server Context Configuration # server.context-path=/cas -server.port=8443 +server.port=6443 -server.ssl.key-store=file:/etc/cas/thekeystore +server.ssl.key-store=classpath:/etc/cas/thekeystore server.ssl.key-store-password=changeit server.ssl.key-password=changeit # server.ssl.ciphers= @@ -40,6 +40,12 @@ spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true +## +#CAS CONFIG LOCATION +# +cas.standalone.config=classpath:/etc/cas/config + + ## # CAS Cloud Bus Configuration # @@ -82,6 +88,7 @@ spring.thymeleaf.mode=HTML # CAS Log4j Configuration # # logging.config=file:/etc/cas/log4j2.xml + server.context-parameters.isLog4jAutoInitializationDisabled=true ## @@ -102,11 +109,12 @@ cas.authn.jdbc.query[0].sql=SELECT * FROM users WHERE email = ? cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect cas.authn.jdbc.query[0].user=root -cas.authn.jdbc.query[0].password= +cas.authn.jdbc.query[0].password=root cas.authn.jdbc.query[0].ddlAuto=none -cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver +#cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver +cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver cas.authn.jdbc.query[0].fieldPassword=password -cas.authn.jdbc.query[0].passwordEncoder.type=BCRYPT +cas.authn.jdbc.query[0].passwordEncoder.type=NONE ## diff --git a/cas/cas-server/src/main/resources/cas.properties b/cas/cas-server/src/main/resources/cas.properties index be2babcd14..f80f22fc11 100644 --- a/cas/cas-server/src/main/resources/cas.properties +++ b/cas/cas-server/src/main/resources/cas.properties @@ -1,16 +1,15 @@ -cas.server.name: https://localhost:8443 -cas.server.prefix: https://localhost:8443/cas +cas.server.name: https://localhost:6443 +cas.server.prefix: https://localhost:643/cas cas.adminPagesSecurity.ip=127\.0\.0\.1 -logging.config: file:/etc/cas/config/log4j2.xml - cas.serviceRegistry.initFromJson=true cas.serviceRegistry.config.location=classpath:/services cas.authn.accept.users= cas.authn.accept.name= + #CAS Database Authentication Property # cas.authn.jdbc.query[0].healthQuery= diff --git a/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql new file mode 100644 index 0000000000..79a4a48a82 --- /dev/null +++ b/cas/cas-server/src/main/resources/create_test_db_and_users_tbl.sql @@ -0,0 +1,16 @@ +-- Dumping database structure for test +CREATE DATABASE IF NOT EXISTS `test` /*!40100 DEFAULT CHARACTER SET latin1 */; +USE `test`; + +-- Dumping structure for table test.users +CREATE TABLE IF NOT EXISTS `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `email` varchar(50) DEFAULT NULL, + `password` text DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; + +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` (`id`, `email`, `password`) VALUES + (1, 'test@test.com', 'Mellon'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/config/application.yml b/cas/cas-server/src/main/resources/etc/cas/config/application.yml new file mode 100644 index 0000000000..be1f7c3edd --- /dev/null +++ b/cas/cas-server/src/main/resources/etc/cas/config/application.yml @@ -0,0 +1,2 @@ +info: + description: CAS Configuration \ No newline at end of file diff --git a/cas/cas-server/src/main/resources/etc/cas/config/cas.properties b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties new file mode 100644 index 0000000000..47a1477308 --- /dev/null +++ b/cas/cas-server/src/main/resources/etc/cas/config/cas.properties @@ -0,0 +1,7 @@ +cas.server.name: https://cas.example.org:8443 +cas.server.prefix: https://cas.example.org:8443/cas + +cas.adminPagesSecurity.ip=127\.0\.0\.1 + +logging.config: file:/etc/cas/config/log4j2.xml +# cas.serviceRegistry.config.location: classpath:/services diff --git a/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml b/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml new file mode 100644 index 0000000000..53b30b4228 --- /dev/null +++ b/cas/cas-server/src/main/resources/etc/cas/config/log4j2.xml @@ -0,0 +1,117 @@ + + + + + + . + + warn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore b/cas/cas-server/src/main/resources/etc/cas/thekeystore new file mode 100644 index 0000000000..86170dff16 Binary files /dev/null and b/cas/cas-server/src/main/resources/etc/cas/thekeystore differ diff --git a/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt b/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt new file mode 100644 index 0000000000..5bd9d5baba Binary files /dev/null and b/cas/cas-server/src/main/resources/etc/cas/thekeystore.crt differ diff --git a/checker-plugin/pom.xml b/checker-plugin/pom.xml new file mode 100644 index 0000000000..bc7a669d4f --- /dev/null +++ b/checker-plugin/pom.xml @@ -0,0 +1,114 @@ + + 4.0.0 + com.baeldung + checker-plugin + jar + 1.0-SNAPSHOT + checker-plugin + http://maven.apache.org + + + + + + ${org.checkerframework:jdk8:jar} + + + + + + + + + + org.checkerframework + checker-qual + 2.3.1 + + + org.checkerframework + checker + 2.3.1 + + + org.checkerframework + jdk8 + 2.3.1 + + + + org.checkerframework + compiler + 2.3.1 + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + + properties + + + + + + + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + 10000 + 10000 + + + + org.checkerframework.checker.nullness.NullnessChecker + org.checkerframework.checker.interning.InterningChecker + org.checkerframework.checker.fenum.FenumChecker + org.checkerframework.checker.formatter.FormatterChecker + org.checkerframework.checker.regex.RegexChecker + + + -AprintErrorStack + + + -Xbootclasspath/p:${annotatedJdk} + + + + + + -Awarns + + + + + + + diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java new file mode 100644 index 0000000000..f1769cfdea --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/FakeNumExample.java @@ -0,0 +1,42 @@ +package com.baeldung.typechecker; + +import org.checkerframework.checker.fenum.qual.Fenum; + +//@SuppressWarnings("fenum:assignment.type.incompatible") +public class FakeNumExample { + + // Here we use some String constants to represents countries. + static final @Fenum("country") String ITALY = "IT"; + static final @Fenum("country") String US = "US"; + static final @Fenum("country") String UNITED_KINGDOM = "UK"; + + // Here we use other String constants to represent planets instead. + static final @Fenum("planet") String MARS = "Mars"; + static final @Fenum("planet") String EARTH = "Earth"; + static final @Fenum("planet") String VENUS = "Venus"; + + // Now we write this method and we want to be sure that + // the String parameter has a value of a country, not that is just a String. + void greetCountries(@Fenum("country") String country) { + System.out.println("Hello " + country); + } + + // Similarly we're enforcing here that the provided + // parameter is a String that represent a planet. + void greetPlanets(@Fenum("planet") String planet) { + System.out.println("Hello " + planet); + } + + public static void main(String[] args) { + + FakeNumExample obj = new FakeNumExample(); + + // This will fail because we pass a planet-String to a method that + // accept a country-String. + obj.greetCountries(MARS); + + // Here the opposite happens. + obj.greetPlanets(US); + } + +} diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java new file mode 100644 index 0000000000..2fa53ff2c2 --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/FormatExample.java @@ -0,0 +1,23 @@ +package com.baeldung.typechecker; + +public class FormatExample { + + public static void main(String[] args) { + + // Just enabling org.checkerframework.checker.formatter.FormatterChecker + // we can be sure at compile time that the format strings we pass to format() + // are correct. Normally we would have those errors raised just at runtime. + // All those formats are in fact wrong. + + String.format("%y", 7); // error: invalid format string + + String.format("%d", "a string"); // error: invalid argument type for %d + + String.format("%d %s", 7); // error: missing argument for %s + + String.format("%d", 7, 3); // warning: unused argument 3 + + String.format("{0}", 7); // warning: unused argument 7, because {0} is wrong syntax + } + +} diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java new file mode 100644 index 0000000000..b3072b72ee --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/KeyForExample.java @@ -0,0 +1,31 @@ +package com.baeldung.typechecker; + +import org.checkerframework.checker.nullness.qual.KeyFor; + +import java.util.HashMap; +import java.util.Map; + +public class KeyForExample { + + private final Map config = new HashMap<>(); + + KeyForExample() { + + // Here we initialize a map to store + // some config data. + config.put("url", "http://1.2.3.4"); + config.put("name", "foobaz"); + } + + public void dumpPort() { + + // Here, we want to dump the port value stored in the + // config, so we declare that this key has to be + // present in the config map. + // Obviously that will fail because such key is not present + // in the map. + @KeyFor("config") String key = "port"; + System.out.println( config.get(key) ); + } + +} diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java new file mode 100644 index 0000000000..c4b9c6afe1 --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/MonotonicNotNullExample.java @@ -0,0 +1,28 @@ +package com.baeldung.typechecker; + +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; + +import java.util.Date; + +public class MonotonicNotNullExample { + + // The idea is we need this field to be to lazily initialized, + // so it starts as null but once it becomes not null + // it cannot return null. + // In these cases, we can use @MonotonicNonNull + @MonotonicNonNull private Date firstCall; + + public Date getFirstCall() { + if (firstCall == null) { + firstCall = new Date(); + } + return firstCall; + } + + public void reset() { + // This is reported as error because + // we wrongly set the field back to null. + firstCall = null; + } + +} diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java new file mode 100644 index 0000000000..c929eea23f --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/NonNullExample.java @@ -0,0 +1,27 @@ +package com.baeldung.typechecker; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class NonNullExample { + + // This method's parameter is annotated in order + // to tell the pluggable type system that it can never be null. + private static int countArgs(@NonNull String[] args) { + return args.length; + } + + // This method's parameter is annotated in order + // to tell the pluggable type system that it may be null. + public static void main(@Nullable String[] args) { + + // Here lies a potential error, + // because we pass a potential null reference to a method + // that does not accept nulls. + // The Checker Framework will spot this problem at compile time + // instead of runtime. + System.out.println(countArgs(args)); + + } + +} diff --git a/checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java b/checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java new file mode 100644 index 0000000000..9503865214 --- /dev/null +++ b/checker-plugin/src/main/java/com/baeldung/typechecker/RegexExample.java @@ -0,0 +1,18 @@ +package com.baeldung.typechecker; + +import org.checkerframework.checker.regex.qual.Regex; + +public class RegexExample { + + // For some reason we want to be sure that this regex + // contains at least one capturing group. + // However, we do an error and we forgot to define such + // capturing group in it. + @Regex(1) private static String findNumbers = "\\d*"; + + public static void main(String[] args) { + String message = "My phone number is +3911223344."; + message.matches(findNumbers); + } + +} diff --git a/eclipse/README.md b/core-groovy/README.md similarity index 66% rename from eclipse/README.md rename to core-groovy/README.md index ff12555376..5954a8ab7e 100644 --- a/eclipse/README.md +++ b/core-groovy/README.md @@ -1 +1,4 @@ +# Groovy + ## Relevant articles: + diff --git a/core-groovy/build.gradle b/core-groovy/build.gradle new file mode 100644 index 0000000000..300827ee7c --- /dev/null +++ b/core-groovy/build.gradle @@ -0,0 +1,13 @@ +group 'com.baeldung' +version '1.0-SNAPSHOT' + +apply plugin: 'groovy' + +repositories { + mavenCentral() +} + +dependencies { + compile 'org.codehaus.groovy:groovy-all:2.4.13' + testCompile 'org.spockframework:spock-core:1.1-groovy-2.4' +} diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml new file mode 100644 index 0000000000..91cbe66e35 --- /dev/null +++ b/core-groovy/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + core-groovy + 1.0-SNAPSHOT + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + central + http://jcenter.bintray.com + + + + + + org.codehaus.groovy + groovy + 2.4.13 + + + org.codehaus.groovy + groovy-all + 2.4.13 + + + org.codehaus.groovy + groovy-sql + 2.4.13 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.hsqldb + hsqldb + 2.4.0 + test + + + org.spockframework + spock-core + 1.1-groovy-2.4 + test + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.6 + + + + addSources + addTestSources + compile + compileTests + + + + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + maven-failsafe-plugin + 2.19.1 + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + junit5 + + integration-test + verify + + + + **/*Test5.java + + + + + + + + + + UTF-8 + 1.1.2 + 1.1.2 + 1.1.2 + 1.1.2 + 0.15 + 1.5.0 + + 5.0.0 + 1.0.0 + 4.12.0 + 4.12 + + + diff --git a/core-groovy/src/main/groovy/com/baeldung/json/Account.groovy b/core-groovy/src/main/groovy/com/baeldung/json/Account.groovy new file mode 100644 index 0000000000..84b294f0bd --- /dev/null +++ b/core-groovy/src/main/groovy/com/baeldung/json/Account.groovy @@ -0,0 +1,7 @@ +package com.baeldung.json + +class Account { + String id + BigDecimal value + Date createdAt +} \ No newline at end of file diff --git a/core-groovy/src/main/groovy/com/baeldung/json/JsonParser.groovy b/core-groovy/src/main/groovy/com/baeldung/json/JsonParser.groovy new file mode 100644 index 0000000000..6cda7c6fbd --- /dev/null +++ b/core-groovy/src/main/groovy/com/baeldung/json/JsonParser.groovy @@ -0,0 +1,27 @@ +package com.baeldung.json + +import groovy.json.JsonOutput +import groovy.json.JsonParserType +import groovy.json.JsonSlurper + +class JsonParser { + + Account toObject(String json) { + JsonSlurper jsonSlurper = new JsonSlurper() + jsonSlurper.parseText(json) as Account + } + + Account toObjectWithIndexOverlay(String json) { + JsonSlurper jsonSlurper = new JsonSlurper(type: JsonParserType.INDEX_OVERLAY) + jsonSlurper.parseText(json) as Account + } + + String toJson(Account account) { + JsonOutput.toJson(account) + } + + String prettyfy(String json) { + JsonOutput.prettyPrint(json) + } + +} diff --git a/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy b/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy new file mode 100644 index 0000000000..ac96a55773 --- /dev/null +++ b/core-groovy/src/test/groovy/com/baeldung/groovy/sql/SqlTest.groovy @@ -0,0 +1,229 @@ +package com.baeldung.groovy.sql + +import groovy.sql.GroovyResultSet +import groovy.sql.GroovyRowResult +import groovy.sql.Sql +import groovy.transform.CompileStatic +import static org.junit.Assert.* +import org.junit.Test + +class SqlTest { + + final Map dbConnParams = [url: 'jdbc:hsqldb:mem:testDB', user: 'sa', password: '', driver: 'org.hsqldb.jdbc.JDBCDriver'] + + @Test + void whenNewSqlInstance_thenDbIsAccessed() { + def sql = Sql.newInstance(dbConnParams) + sql.close() + sql.close() + } + + @Test + void whenTableDoesNotExist_thenSelectFails() { + try { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.eachRow('select * from PROJECT') {} + } + + fail("An exception should have been thrown") + } catch (ignored) { + //Ok + } + } + + @Test + void whenTableCreated_thenSelectIsPossible() { + Sql.withInstance(dbConnParams) { Sql sql -> + def result = sql.execute 'create table PROJECT_1 (id integer not null, name varchar(50), url varchar(100))' + + assertEquals(0, sql.updateCount) + assertFalse(result) + + result = sql.execute('select * from PROJECT_1') + + assertTrue(result) + } + } + + @Test + void whenIdentityColumn_thenInsertReturnsNewId() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_2 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + def ids = sql.executeInsert("INSERT INTO PROJECT_2 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") + + assertEquals(0, ids[0][0]) + + ids = sql.executeInsert("INSERT INTO PROJECT_2 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") + + assertEquals(1, ids[0][0]) + } + } + + @Test + void whenUpdate_thenNumberOfAffectedRows() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_3 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") + def count = sql.executeUpdate("UPDATE PROJECT_3 SET URL = 'https://' + URL") + + assertEquals(2, count) + } + } + + @Test + void whenEachRow_thenResultSetHasProperties() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_4 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") + + sql.eachRow("SELECT * FROM PROJECT_4") { GroovyResultSet rs -> + assertNotNull(rs.name) + assertNotNull(rs.url) + assertNotNull(rs[0]) + assertNotNull(rs[1]) + assertNotNull(rs[2]) + assertEquals(rs.name, rs['name']) + assertEquals(rs.url, rs['url']) + } + } + } + + @Test + void whenPagination_thenSubsetIsReturned() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") + def rows = sql.rows('SELECT * FROM PROJECT_5 ORDER BY NAME', 1, 1) + + assertEquals(1, rows.size()) + assertEquals('REST with Spring', rows[0].name) + } + } + + @Test + void whenParameters_thenReplacement() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_6 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute('INSERT INTO PROJECT_6 (NAME, URL) VALUES (?, ?)', 'tutorials', 'github.com/eugenp/tutorials') + sql.execute("INSERT INTO PROJECT_6 (NAME, URL) VALUES (:name, :url)", [name: 'REST with Spring', url: 'github.com/eugenp/REST-With-Spring']) + + def rows = sql.rows("SELECT * FROM PROJECT_6 WHERE NAME = 'tutorials'") + + assertEquals(1, rows.size()) + + rows = sql.rows("SELECT * FROM PROJECT_6 WHERE NAME = 'REST with Spring'") + + assertEquals(1, rows.size()) + } + } + + @Test + void whenParametersInGString_thenReplacement() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_7 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.execute "INSERT INTO PROJECT_7 (NAME, URL) VALUES (${'tutorials'}, ${'github.com/eugenp/tutorials'})" + def name = 'REST with Spring' + def url = 'github.com/eugenp/REST-With-Spring' + sql.execute "INSERT INTO PROJECT_7 (NAME, URL) VALUES (${name}, ${url})" + + def rows = sql.rows("SELECT * FROM PROJECT_7 WHERE NAME = 'tutorials'") + + assertEquals(1, rows.size()) + + rows = sql.rows("SELECT * FROM PROJECT_7 WHERE NAME = 'REST with Spring'") + + assertEquals(1, rows.size()) + } + } + + @Test + void whenTransactionRollback_thenNoDataInserted() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.withTransaction { + sql.execute 'create table PROJECT_8 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_8 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_8 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") + sql.rollback() + + def rows = sql.rows("SELECT * FROM PROJECT_8") + + assertEquals(0, rows.size()) + } + } + } + + @Test + void whenTransactionRollbackThenCommit_thenOnlyLastInserted() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.withTransaction { + sql.execute 'create table PROJECT_9 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + sql.rollback() + sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") + sql.rollback() + sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')") + } + + def rows = sql.rows("SELECT * FROM PROJECT_9") + + assertEquals(2, rows.size()) + } + } + + @Test + void whenException_thenTransactionIsRolledBack() { + Sql.withInstance(dbConnParams) { Sql sql -> + try { + sql.withTransaction { + sql.execute 'create table PROJECT_10 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_10 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + throw new Exception('rollback') + } + } catch (ignored) {} + + def rows = sql.rows("SELECT * FROM PROJECT_10") + + assertEquals(0, rows.size()) + } + } + + @Test + void givenCachedConnection_whenException_thenDataIsPersisted() { + Sql.withInstance(dbConnParams) { Sql sql -> + try { + sql.cacheConnection { + sql.execute 'create table PROJECT_11 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_11 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')") + throw new Exception('This does not rollback') + } + } catch (ignored) {} + + def rows = sql.rows("SELECT * FROM PROJECT_11") + + assertEquals(1, rows.size()) + } + } + + /*@Test + void whenModifyResultSet_thenDataIsChanged() { + Sql.withInstance(dbConnParams) { Sql sql -> + sql.execute 'create table PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))' + sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')") + sql.executeInsert("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')") + + sql.eachRow("SELECT * FROM PROJECT_5 FOR UPDATE ") { GroovyResultSet rs -> + rs['name'] = "The great ${rs.name}!" as String + rs.updateRow() + } + + sql.eachRow("SELECT * FROM PROJECT_5") { GroovyResultSet rs -> + assertTrue(rs.name.startsWith('The great ')) + } + } + }*/ + +} diff --git a/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy b/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy new file mode 100644 index 0000000000..c3842340a5 --- /dev/null +++ b/core-groovy/src/test/groovy/com/baeldung/json/JsonParserTest.groovy @@ -0,0 +1,66 @@ +package com.baeldung.json + +import spock.lang.Specification + +import java.text.SimpleDateFormat + +class JsonParserTest extends Specification { + + JsonParser jsonParser + + void setup () { + jsonParser = new JsonParser() + } + + def 'Should parse to Account given Json String' () { + given: + def json = '{"id":"1234","value":15.6}' + when: + def account = jsonParser.toObject(json) + then: + account + account instanceof Account + account.id == '1234' + account.value == 15.6 + } + + def 'Should parse to Account given Json String with date property' () { + given: + def json = '{"id":"1234","value":15.6,"createdAt":"2018-01-01T00:00:00+0000"}' + when: + def account = jsonParser.toObjectWithIndexOverlay(json) + then: + account + account instanceof Account + account.id == '1234' + account.value == 15.6 + println account.createdAt + account.createdAt == Date.parse('yyyy-MM-dd', '2018-01-01') + } + + def 'Should parse to Json given an Account object' () { + given: + Account account = new Account( + id: '123', + value: 15.6, + createdAt: new SimpleDateFormat('MM/dd/yyyy').parse('01/01/2018') + ) + when: + def json = jsonParser.toJson(account) + then: + json + json == '{"value":15.6,"createdAt":"2018-01-01T00:00:00+0000","id":"123"}' + } + + def 'Should prettify given a json string' () { + given: + String json = '{"value":15.6,"createdAt":"01/01/2018","id":"123456"}' + when: + def jsonPretty = jsonParser.prettyfy(json) + then: + jsonPretty + jsonPretty == '{\n "value": 15.6,\n "createdAt": "01/01/2018",\n "id": "123456"\n}' + } + + +} diff --git a/core-java-8/README.md b/core-java-8/README.md index 690bd48ed5..949577df19 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -30,3 +30,16 @@ - [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap) - [Merging Streams in Java](http://www.baeldung.com/java-merge-streams) - [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) +- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) +- [Copy a File with Java](http://www.baeldung.com/java-copy-file) +- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) +- [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods) +- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) +- [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream) +- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) +- [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency) +- [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) +- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) +- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection) +- [Java 8 StringJoiner](http://www.baeldung.com/java-string-joiner) +- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator) diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml index f5506f095e..75728ecd13 100644 --- a/core-java-8/pom.xml +++ b/core-java-8/pom.xml @@ -1,258 +1,296 @@ - - 4.0.0 - com.baeldung - core-java-8 - 0.1.0-SNAPSHOT - jar - - core-java-8 - - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - - com.google.guava - guava - ${guava.version} - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - - commons-io - commons-io - ${commons-io.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - - log4j - log4j - 1.2.17 - - - - commons-codec - commons-codec - ${commons-codec.version} - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - - org.assertj - assertj-core - ${assertj.version} - test - - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - - - - - - core-java-8 - - - src/main/resources - true - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - - - 21.0 - 3.5 - 3.6.1 - 2.5 - 4.1 - 4.01 - 1.10 - 1.16.12 - - - 3.6.1 - 1.7.0 - - + + 4.0.0 + com.baeldung + core-java-8 + 0.1.0-SNAPSHOT + jar + + core-java-8 + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + + log4j + log4j + 1.2.17 + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + org.openjdk.jmh + jmh-core + 1.19 + + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + + org.openjdk.jmh + jmh-generator-bytecode + 1.19 + + + + com.codepoetics + protonpack + ${protonpack.version} + + + + io.vavr + vavr + ${vavr.version} + + + + one.util + streamex + ${streamex.version} + + + + + core-java-8 + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + + + 21.0 + 3.5 + 3.6.1 + 2.5 + 4.1 + 4.01 + 1.10 + 1.16.12 + 0.9.0 + 1.13 + 0.6.5 + + + 3.6.1 + 1.7.0 + + \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java new file mode 100644 index 0000000000..034e6785a4 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java @@ -0,0 +1,5 @@ +package com.baeldung.annotations; + +@Deprecated +class ClassWithAnnotation { +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java new file mode 100644 index 0000000000..6f5da03b74 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations; + +class ClassWithDeprecatedMethod { + + @Deprecated + static void deprecatedMethod() { + + } +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java new file mode 100644 index 0000000000..cfa91f5951 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java @@ -0,0 +1,11 @@ +package com.baeldung.annotations; + +class ClassWithSafeVarargs { + + @SafeVarargs + final void iterateOverVarargs(T... args) { + for (T x : args) { + // do stuff with x + } + } +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java new file mode 100644 index 0000000000..fe22ec1c24 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations; + +class ClassWithSuppressWarnings { + + @SuppressWarnings("deprecation") + void useDeprecatedMethod() { + ClassWithDeprecatedMethod.deprecatedMethod(); // no warning is generated here + } +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java b/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java new file mode 100644 index 0000000000..4f16b27281 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java @@ -0,0 +1,8 @@ +package com.baeldung.annotations; + +@FunctionalInterface +interface IntConsumer { + + void accept(Integer number); + +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/Interval.java b/core-java-8/src/main/java/com/baeldung/annotations/Interval.java new file mode 100644 index 0000000000..f73e6e5b14 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/Interval.java @@ -0,0 +1,8 @@ +package com.baeldung.annotations; + +import java.lang.annotation.Repeatable; + +@Repeatable(Intervals.class) +@interface Interval { + int hour() default 1; +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java b/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java new file mode 100644 index 0000000000..2e11de8215 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations; + +public class IntervalUsage { + + @Interval(hour = 17) + @Interval(hour = 13) + void doPeriodicCleanup() { + } +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java b/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java new file mode 100644 index 0000000000..af469f18cc --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java @@ -0,0 +1,5 @@ +package com.baeldung.annotations; + +@interface Intervals { + Interval[] value(); +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java new file mode 100644 index 0000000000..6e71f446b0 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java @@ -0,0 +1,11 @@ +package com.baeldung.annotations; + +import java.lang.annotation.*; + +@Inherited +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.LOCAL_VARIABLE, ElementType.FIELD}) +@interface MyAnnotation { + +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java new file mode 100644 index 0000000000..37f40a624e --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java @@ -0,0 +1,16 @@ +package com.baeldung.annotations; + +class MyAnnotationTarget { + + // this is OK + @MyAnnotation + String someField; + + // @MyAnnotation <- this is invalid usage! + void doSomething() { + + // this also works + @MyAnnotation + String localVariable; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java b/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java new file mode 100644 index 0000000000..a4385bc786 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java @@ -0,0 +1,6 @@ +package com.baeldung.annotations; + +interface MyOperation { + + void perform(); +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java b/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java new file mode 100644 index 0000000000..e6a8ce76d3 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java @@ -0,0 +1,9 @@ +package com.baeldung.annotations; + +class MyOperationImpl implements MyOperation { + + @Override + public void perform() { + + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java b/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java index 31b45aab84..a842be8153 100644 --- a/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java +++ b/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java @@ -2,7 +2,6 @@ package com.baeldung.datetime; import java.time.Duration; import java.time.LocalTime; -import java.time.Period; public class UseDuration { diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java new file mode 100644 index 0000000000..438ecad140 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java @@ -0,0 +1,18 @@ +package com.baeldung.defaultstaticinterfacemethods.application; + +import com.baeldung.defaultstaticinterfacemethods.model.Car; +import com.baeldung.defaultstaticinterfacemethods.model.Vehicle; + +public class Application { + + public static void main(String[] args) { + + Vehicle car = new Car("BMW"); + System.out.println(car.getBrand()); + System.out.println(car.speedUp()); + System.out.println(car.slowDown()); + System.out.println(car.turnAlarmOn()); + System.out.println(car.turnAlarmOff()); + System.out.println(Vehicle.getHorsePower(2500, 480)); + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java new file mode 100644 index 0000000000..52ec2c3c15 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java @@ -0,0 +1,12 @@ +package com.baeldung.defaultstaticinterfacemethods.model; + +public interface Alarm { + + default String turnAlarmOn() { + return "Turning the alarm on."; + } + + default String turnAlarmOff() { + return "Turning the alarm off."; + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java new file mode 100644 index 0000000000..6ec6507e59 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java @@ -0,0 +1,25 @@ +package com.baeldung.defaultstaticinterfacemethods.model; + +public class Car implements Vehicle { + + private final String brand; + + public Car(String brand) { + this.brand = brand; + } + + @Override + public String getBrand() { + return brand; + } + + @Override + public String speedUp() { + return "The car is speeding up."; + } + + @Override + public String slowDown() { + return "The car is slowing down."; + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java new file mode 100644 index 0000000000..b1de93059a --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java @@ -0,0 +1,25 @@ +package com.baeldung.defaultstaticinterfacemethods.model; + +public class Motorbike implements Vehicle { + + private final String brand; + + public Motorbike(String brand) { + this.brand = brand; + } + + @Override + public String getBrand() { + return brand; + } + + @Override + public String speedUp() { + return "The motorbike is speeding up."; + } + + @Override + public String slowDown() { + return "The motorbike is slowing down."; + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java new file mode 100644 index 0000000000..abf329fafd --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java @@ -0,0 +1,35 @@ +package com.baeldung.defaultstaticinterfacemethods.model; + +public class MultiAlarmCar implements Vehicle, Alarm { + + private final String brand; + + public MultiAlarmCar(String brand) { + this.brand = brand; + } + + @Override + public String getBrand() { + return brand; + } + + @Override + public String speedUp() { + return "The motorbike is speeding up."; + } + + @Override + public String slowDown() { + return "The mootorbike is slowing down."; + } + + @Override + public String turnAlarmOn() { + return Vehicle.super.turnAlarmOn() + " " + Alarm.super.turnAlarmOn(); + } + + @Override + public String turnAlarmOff() { + return Vehicle.super.turnAlarmOff() + " " + Alarm.super.turnAlarmOff(); + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java new file mode 100644 index 0000000000..b0bdd63c2c --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java @@ -0,0 +1,22 @@ +package com.baeldung.defaultstaticinterfacemethods.model; + +public interface Vehicle { + + String getBrand(); + + String speedUp(); + + String slowDown(); + + default String turnAlarmOn() { + return "Turning the vehice alarm on."; + } + + default String turnAlarmOff() { + return "Turning the vehicle alarm off."; + } + + static int getHorsePower(int rpm, int torque) { + return (rpm * torque) / 5252; + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/findanelement/FindElementInAList.java b/core-java-8/src/main/java/com/baeldung/findanelement/FindElementInAList.java new file mode 100644 index 0000000000..2f402ee72b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/findanelement/FindElementInAList.java @@ -0,0 +1,71 @@ +package com.baeldung.findanelement; + +import java.util.List; +import java.util.ListIterator; +import org.apache.commons.collections4.IterableUtils; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +public class FindElementInAList { + + public T findUsingIndexOf(T element, List list) { + int index = list.indexOf(element); + if (index >= 0) { + return element; + } + return null; + } + + public boolean findUsingListIterator(T element, List list) { + ListIterator listIterator = list.listIterator(); + while (listIterator.hasNext()) { + T elementFromList = listIterator.next(); + if (elementFromList.equals(element)) { + return true; + } + } + return false; + } + + public boolean findUsingEnhancedForLoop(T element, List list) { + for (T elementFromList : list) { + if (element.equals(elementFromList)) { + return true; + } + } + return false; + } + + public T findUsingStream(T element, List list) { + return list.stream() + .filter(integer -> integer.equals(element)) + .findFirst() + .orElse(null); + } + + public T findUsingParallelStream(T element, List list) { + return list.parallelStream() + .filter(integer -> integer.equals(element)) + .findAny() + .orElse(null); + } + + public T findUsingGuava(T element, List list) { + T foundElement = Iterables.tryFind(list, new Predicate() { + public boolean apply(T input) { + return element.equals(input); + } + }).orNull(); + return foundElement; + } + + public T findUsingApacheCommon(T element, List list) { + T foundElement = IterableUtils.find(list, new org.apache.commons.collections4.Predicate() { + public boolean evaluate(T input) { + return element.equals(input); + } + }); + return foundElement; + } + +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java new file mode 100644 index 0000000000..5e7cfdb54f --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java @@ -0,0 +1,80 @@ +package com.baeldung.iterators; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Source code https://github.com/eugenp/tutorials + * + * @author Santosh Thakur + */ + +public class Iterators { + + public static int failFast1() { + ArrayList numbers = new ArrayList<>(); + + numbers.add(10); + numbers.add(20); + numbers.add(30); + numbers.add(40); + + Iterator iterator = numbers.iterator(); + while (iterator.hasNext()) { + Integer number = iterator.next(); + numbers.add(50); + } + + return numbers.size(); + } + + public static int failFast2() { + ArrayList numbers = new ArrayList<>(); + numbers.add(10); + numbers.add(20); + numbers.add(30); + numbers.add(40); + + Iterator iterator = numbers.iterator(); + while (iterator.hasNext()) { + if (iterator.next() == 30) { + // will not throw Exception + iterator.remove(); + } + } + + System.out.println("using iterator's remove method = " + numbers); + + iterator = numbers.iterator(); + while (iterator.hasNext()) { + if (iterator.next() == 40) { + // will throw Exception on + // next call of next() method + numbers.remove(2); + } + } + + return numbers.size(); + } + + public static int failSafe1() { + ConcurrentHashMap map = new ConcurrentHashMap<>(); + + map.put("First", 10); + map.put("Second", 20); + map.put("Third", 30); + map.put("Fourth", 40); + + Iterator iterator = map.keySet() + .iterator(); + + while (iterator.hasNext()) { + String key = iterator.next(); + map.put("Fifth", 50); + } + + return map.size(); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java b/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java new file mode 100644 index 0000000000..750807ce77 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/prime/PrimeGenerator.java @@ -0,0 +1,59 @@ +package com.baeldung.prime; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class PrimeGenerator { + public static List sieveOfEratosthenes(int n) { + final boolean prime[] = new boolean[n + 1]; + Arrays.fill(prime, true); + + for (int p = 2; p * p <= n; p++) { + if (prime[p]) { + for (int i = p * 2; i <= n; i += p) + prime[i] = false; + } + } + + final List primes = new LinkedList<>(); + for (int i = 2; i <= n; i++) { + if (prime[i]) + primes.add(i); + } + return primes; + } + + public static List primeNumbersBruteForce(int max) { + final List primeNumbers = new LinkedList(); + for (int i = 2; i <= max; i++) { + if (isPrimeBruteForce(i)) { + primeNumbers.add(i); + } + } + return primeNumbers; + } + + private static boolean isPrimeBruteForce(int x) { + for (int i = 2; i < x; i++) { + if (x % i == 0) { + return false; + } + } + return true; + } + + public static List primeNumbersTill(int max) { + return IntStream.rangeClosed(2, max) + .filter(x -> isPrime(x)) + .boxed() + .collect(Collectors.toList()); + } + + private static boolean isPrime(int x) { + return IntStream.rangeClosed(2, (int) (Math.sqrt(x))) + .allMatch(n -> x % n != 0); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Article.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Article.java new file mode 100644 index 0000000000..402ec6ec5f --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Article.java @@ -0,0 +1,44 @@ +package com.baeldung.spliteratorAPI; + +import java.util.List; + +public class Article { + private List listOfAuthors; + private int id; + private String name; + + public Article(String name) { + this.name = name; + } + + public Article(List listOfAuthors, int id) { + super(); + this.listOfAuthors = listOfAuthors; + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public List getListOfAuthors() { + return listOfAuthors; + } + + public void setListOfAuthors(List listOfAuthors) { + this.listOfAuthors = listOfAuthors; + } + +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Author.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Author.java new file mode 100644 index 0000000000..40c381f4a6 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Author.java @@ -0,0 +1,33 @@ +package com.baeldung.spliteratorAPI; + +public class Author { + private String name; + private int relatedArticleId; + + public Author(String name, int relatedArticleId) { + this.name = name; + this.relatedArticleId = relatedArticleId; + } + + public int getRelatedArticleId() { + return relatedArticleId; + } + + public void setRelatedArticleId(int relatedArticleId) { + this.relatedArticleId = relatedArticleId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "[name: " + name + ", relatedId: " + relatedArticleId + "]"; + } +} + diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Executor.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Executor.java new file mode 100644 index 0000000000..024d5dabdb --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Executor.java @@ -0,0 +1,19 @@ +package com.baeldung.spliteratorAPI; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Executor { + + public static int countAutors(Stream stream) { + RelatedAuthorCounter wordCounter = stream.reduce(new RelatedAuthorCounter(0, true), + RelatedAuthorCounter::accumulate, RelatedAuthorCounter::combine); + return wordCounter.getCounter(); + } + + public static List
generateElements() { + return Stream.generate(() -> new Article("Java")).limit(35000).collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorCounter.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorCounter.java new file mode 100644 index 0000000000..b7120b3af2 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorCounter.java @@ -0,0 +1,27 @@ +package com.baeldung.spliteratorAPI; + +public class RelatedAuthorCounter { + private final int counter; + private final boolean isRelated; + + public RelatedAuthorCounter(int counter, boolean isRelated) { + this.counter = counter; + this.isRelated = isRelated; + } + + public RelatedAuthorCounter accumulate(Author author) { + if (author.getRelatedArticleId() == 0) { + return isRelated ? this : new RelatedAuthorCounter(counter, true); + } else { + return isRelated ? new RelatedAuthorCounter(counter + 1, false) : this; + } + } + + public RelatedAuthorCounter combine(RelatedAuthorCounter RelatedAuthorCounter) { + return new RelatedAuthorCounter(counter + RelatedAuthorCounter.counter, RelatedAuthorCounter.isRelated); + } + + public int getCounter() { + return counter; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorSpliterator.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorSpliterator.java new file mode 100644 index 0000000000..0a7190964e --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/RelatedAuthorSpliterator.java @@ -0,0 +1,49 @@ +package com.baeldung.spliteratorAPI; + +import java.util.List; +import java.util.Spliterator; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +public class RelatedAuthorSpliterator implements Spliterator { + private final List list; + AtomicInteger current = new AtomicInteger(); + + public RelatedAuthorSpliterator(List list) { + this.list = list; + } + + @Override + public boolean tryAdvance(Consumer action) { + + action.accept(list.get(current.getAndIncrement())); + return current.get() < list.size(); + } + + @Override + public Spliterator trySplit() { + int currentSize = list.size() - current.get(); + if (currentSize < 10) { + return null; + } + for (int splitPos = currentSize / 2 + current.intValue(); splitPos < list.size(); splitPos++) { + if (list.get(splitPos).getRelatedArticleId() == 0) { + Spliterator spliterator = new RelatedAuthorSpliterator(list.subList(current.get(), splitPos)); + current.set(splitPos); + return spliterator; + } + } + return null; + } + + @Override + public long estimateSize() { + return list.size() - current.get(); + } + + @Override + public int characteristics() { + return CONCURRENT; + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Task.java b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Task.java new file mode 100644 index 0000000000..70435d1c75 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/spliteratorAPI/Task.java @@ -0,0 +1,27 @@ +package com.baeldung.spliteratorAPI; + +import java.util.Spliterator; +import java.util.concurrent.Callable; + +public class Task implements Callable { + private Spliterator
spliterator; + private final static String SUFFIX = "- published by Baeldung"; + + public Task(Spliterator
spliterator) { + this.spliterator = spliterator; + } + + @Override + public String call() { + int current = 0; + while (spliterator.tryAdvance(article -> { + article.setName(article.getName() + .concat(SUFFIX)); + })) { + current++; + } + ; + return Thread.currentThread() + .getName() + ":" + current; + } +} diff --git a/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java b/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java new file mode 100644 index 0000000000..b0afb65a35 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/stream/PrimitiveStreams.java @@ -0,0 +1,23 @@ +package com.baeldung.stream; + +import java.util.Arrays; +import java.util.stream.IntStream; + +class PrimitiveStreams { + + int min(int[] integers) { + return Arrays.stream(integers).min().getAsInt(); + } + + int max(int... integers) { + return IntStream.of(integers).max().getAsInt(); + } + + int sum(int... integers) { + return IntStream.of(integers).sum(); + } + + double avg(int... integers) { + return IntStream.of(integers).average().getAsDouble(); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/streamApi/Product.java b/core-java-8/src/main/java/com/baeldung/stream/Product.java similarity index 89% rename from core-java-8/src/main/java/com/baeldung/streamApi/Product.java rename to core-java-8/src/main/java/com/baeldung/stream/Product.java index 26b8bd6fed..e99a969b81 100644 --- a/core-java-8/src/main/java/com/baeldung/streamApi/Product.java +++ b/core-java-8/src/main/java/com/baeldung/stream/Product.java @@ -1,8 +1,6 @@ -package com.baeldung.streamApi; +package com.baeldung.stream; import java.util.List; -import java.util.Optional; -import java.util.stream.IntStream; import java.util.stream.Stream; /** diff --git a/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java b/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java index 364fdeffbb..f0d5f1aa7e 100644 --- a/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java +++ b/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java @@ -16,7 +16,7 @@ public class StreamApi { } public static String getLastElementUsingSkip(List valueList) { - long count = valueList.stream().count(); + long count = (long) valueList.size(); Stream stream = valueList.stream(); return stream.skip(count - 1).findFirst().orElse(null); } diff --git a/core-java/src/main/java/com/baeldung/stream/StreamIndices.java b/core-java-8/src/main/java/com/baeldung/stream/StreamIndices.java similarity index 100% rename from core-java/src/main/java/com/baeldung/stream/StreamIndices.java rename to core-java-8/src/main/java/com/baeldung/stream/StreamIndices.java diff --git a/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java new file mode 100644 index 0000000000..3a1016c63b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java @@ -0,0 +1,55 @@ +package com.baeldung.timezonedisplay; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class TimezoneDisplay { + + public enum OffsetBase { + GMT, UTC + } + + public List getTimeZoneList(OffsetBase base) { + Set availableZoneIds = ZoneId.getAvailableZoneIds(); + + LocalDateTime now = LocalDateTime.now(); + return availableZoneIds + .stream() + .map(ZoneId::of) + .sorted(new ZoneComparator()) + .map(id -> String.format("(%s%s) %s", base, getOffset(now, id), id.getId())) + .collect(Collectors.toList()); + } + + private String getOffset(LocalDateTime dateTime, ZoneId id) { + return dateTime + .atZone(id) + .getOffset() + .getId() + .replace("Z", "+00:00"); + } + + private class ZoneComparator implements Comparator { + + @Override + public int compare(ZoneId zoneId1, ZoneId zoneId2) { + LocalDateTime now = LocalDateTime.now(); + + ZoneOffset offset1 = now + .atZone(zoneId1) + .getOffset(); + + ZoneOffset offset2 = now + .atZone(zoneId2) + .getOffset(); + + return offset1.compareTo(offset2); + } + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java new file mode 100644 index 0000000000..aa9f84e21a --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java @@ -0,0 +1,18 @@ +package com.baeldung.timezonedisplay; + +import java.util.List; + +public class TimezoneDisplayApp { + + public static void main(String... args) { + TimezoneDisplay display = new TimezoneDisplay(); + + System.out.println("Time zones in UTC:"); + List utc = display.getTimeZoneList(TimezoneDisplay.OffsetBase.UTC); + utc.forEach(System.out::println); + + System.out.println("Time zones in GMT:"); + List gmt = display.getTimeZoneList(TimezoneDisplay.OffsetBase.GMT); + gmt.forEach(System.out::println); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java new file mode 100644 index 0000000000..015ca3f942 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java @@ -0,0 +1,61 @@ +package com.baeldung.counter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Mode; + +import com.baeldung.counter.CounterUtil.MutableInteger; + +@Fork(value = 1, warmups = 3) +@BenchmarkMode(Mode.All) +public class CounterStatistics { + + private static final Map counterMap = new HashMap<>(); + private static final Map counterWithMutableIntMap = new HashMap<>(); + private static final Map counterWithIntArrayMap = new HashMap<>(); + private static final Map counterWithLongWrapperMap = new HashMap<>(); + private static final Map counterWithLongWrapperStreamMap = new HashMap<>(); + + static { + CounterUtil.COUNTRY_NAMES = new String[10000]; + final String prefix = "NewString"; + Random random = new Random(); + for (int i=0; i<10000; i++) { + CounterUtil.COUNTRY_NAMES[i] = new String(prefix + random.nextInt(1000)); + } + } + + @Benchmark + public void wrapperAsCounter() { + CounterUtil.counterWithWrapperObject(counterMap); + } + + @Benchmark + public void lambdaExpressionWithWrapper() { + CounterUtil.counterWithLambdaAndWrapper(counterWithLongWrapperMap); + } + + @Benchmark + public void parallelStreamWithWrapper() { + CounterUtil.counterWithParallelStreamAndWrapper(counterWithLongWrapperStreamMap); + } + + @Benchmark + public void mutableIntegerAsCounter() { + CounterUtil.counterWithMutableInteger(counterWithMutableIntMap); + } + + @Benchmark + public void primitiveArrayAsCounter() { + CounterUtil.counterWithPrimitiveArray(counterWithIntArrayMap); + } + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java b/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java new file mode 100644 index 0000000000..657b510452 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterTest.java @@ -0,0 +1,53 @@ +package com.baeldung.counter; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.baeldung.counter.CounterUtil.MutableInteger; + +public class CounterTest { + + @Test + public void whenMapWithWrapperAsCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithWrapperObject(counterMap); + + assertEquals(3, counterMap.get("China") + .intValue()); + assertEquals(2, counterMap.get("India") + .intValue()); + } + + @Test + public void whenMapWithLambdaAndWrapperCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithLambdaAndWrapper(counterMap); + + assertEquals(3l, counterMap.get("China") + .longValue()); + assertEquals(2l, counterMap.get("India") + .longValue()); + } + + @Test + public void whenMapWithMutableIntegerCounter_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithMutableInteger(counterMap); + assertEquals(3, counterMap.get("China") + .getCount()); + assertEquals(2, counterMap.get("India") + .getCount()); + } + + @Test + public void whenMapWithPrimitiveArray_runsSuccessfully() { + Map counterMap = new HashMap<>(); + CounterUtil.counterWithPrimitiveArray(counterMap); + assertEquals(3, counterMap.get("China")[0]); + assertEquals(2, counterMap.get("India")[0]); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java new file mode 100644 index 0000000000..c2bf47e213 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java @@ -0,0 +1,57 @@ +package com.baeldung.counter; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CounterUtil { + + public static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" }; + + public static void counterWithWrapperObject(Map counterMap) { + for (String country : COUNTRY_NAMES) { + counterMap.compute(country, (k, v) -> v == null ? 1 : v + 1); + } + } + + public static void counterWithLambdaAndWrapper(Map counterMap) { + Stream.of(COUNTRY_NAMES) + .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting())); + } + + public static void counterWithParallelStreamAndWrapper(Map counterMap) { + Stream.of(COUNTRY_NAMES) + .parallel() + .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting())); + } + + public static class MutableInteger { + int count; + + public MutableInteger(int count) { + this.count = count; + } + + public void increment() { + this.count++; + } + + public int getCount() { + return this.count; + } + } + + public static void counterWithMutableInteger(Map counterMap) { + for (String country : COUNTRY_NAMES) { + counterMap.compute(country, (k, v) -> v == null ? new MutableInteger(0) : v) + .increment(); + } + } + + public static void counterWithPrimitiveArray(Map counterMap) { + for (String country : COUNTRY_NAMES) { + counterMap.compute(country, (k, v) -> v == null ? new int[] { 0 } : v)[0]++; + } + } + +} \ No newline at end of file diff --git a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java index e7a76d1ab9..6fb6d21b19 100644 --- a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java @@ -4,7 +4,6 @@ import java.time.LocalDate; import java.time.LocalTime; import java.time.Month; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java index 90e858f9ac..834179febd 100644 --- a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java @@ -4,7 +4,6 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; -import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java new file mode 100644 index 0000000000..7d4b06908a --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java @@ -0,0 +1,79 @@ +package com.baeldung.defaultistaticinterfacemethods.test; + +import com.baeldung.defaultstaticinterfacemethods.model.Car; +import com.baeldung.defaultstaticinterfacemethods.model.Motorbike; +import com.baeldung.defaultstaticinterfacemethods.model.Vehicle; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.assertj.core.api.Assertions.*; + +public class StaticDefaulInterfaceMethodUnitTest { + + private static Car car; + private static Motorbike motorbike; + + @BeforeClass + public static void setUpCarInstance() { + car = new Car("BMW"); + } + + @BeforeClass + public static void setUpMotorbikeInstance() { + motorbike = new Motorbike("Yamaha"); + } + + @Test + public void givenCarInstace_whenBrandisBMW_thenOneAssertion() { + assertThat(car.getBrand()).isEqualTo("BMW"); + } + + @Test + public void givenCarInstance_whenCallingSpeedUp_thenOneAssertion() { + assertThat(car.speedUp()).isEqualTo("The car is speeding up."); + } + + @Test + public void givenCarInstance_whenCallingSlowDown_thenOneAssertion() { + assertThat(car.slowDown()).isEqualTo("The car is slowing down."); + } + + @Test + public void givenCarInstance_whenCallingTurnAlarmOn_thenOneAssertion() { + assertThat(car.turnAlarmOn()).isEqualTo("Turning the vehice alarm on."); + } + + @Test + public void givenCarInstance_whenCallingTurnAlarmOff_thenOneAssertion() { + assertThat(car.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off."); + } + + @Test + public void givenVehicleInterface_whenCallinggetHorsePower_thenOneAssertion() { + assertThat(Vehicle.getHorsePower(2500, 480)).isEqualTo(228); + } + + @Test + public void givenMooorbikeInstace_whenBrandisYamaha_thenOneAssertion() { + assertThat(motorbike.getBrand()).isEqualTo("Yamaha"); + } + + @Test + public void givenMotorbikeInstance_whenCallingSpeedUp_thenOneAssertion() { + assertThat(motorbike.speedUp()).isEqualTo("The motorbike is speeding up."); + } + + @Test + public void givenMotorbikeInstance_whenCallingSlowDown_thenOneAssertion() { + assertThat(motorbike.slowDown()).isEqualTo("The motorbike is slowing down."); + } + + @Test + public void givenMotorbikeInstance_whenCallingTurnAlarmOn_thenOneAssertion() { + assertThat(motorbike.turnAlarmOn()).isEqualTo("Turning the vehice alarm on."); + } + + @Test + public void givenMotorbikeInstance_whenCallingTurnAlarmOff_thenOneAssertion() { + assertThat(motorbike.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off."); + } +} \ No newline at end of file diff --git a/core-java-8/src/test/java/com/baeldung/findanelement/FindAnElementTest.java b/core-java-8/src/test/java/com/baeldung/findanelement/FindAnElementTest.java new file mode 100644 index 0000000000..1fef2d98e7 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/findanelement/FindAnElementTest.java @@ -0,0 +1,116 @@ +package com.baeldung.findanelement; + +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; + +public class FindAnElementTest { + + private static List scores = new ArrayList<>(); + static { + scores.add(0); + scores.add(1); + scores.add(2); + } + + private static FindElementInAList findElementInAList = new FindElementInAList<>(); + + @Test + public void givenElement_whenFoundUsingIndexOf_thenReturnElement() { + Integer scoreToFind = 1; + Integer score = findElementInAList.findUsingIndexOf(scoreToFind, scores); + assertTrue(score.equals(scoreToFind)); + } + + @Test + public void givenElement_whenNotFoundUsingListIterator_thenReturnNull() { + boolean found = findElementInAList.findUsingListIterator(5, scores); + assertTrue(!found); + } + + @Test + public void givenElement_whenFoundListIterator_thenReturnElement() { + Integer scoreToFind = 1; + boolean found = findElementInAList.findUsingListIterator(scoreToFind, scores); + assertTrue(found); + } + + @Test + public void givenElement_whenNotFoundUsingIndexOf_thenReturnNull() { + Integer score = findElementInAList.findUsingIndexOf(5, scores); + assertNull(score); + } + + @Test + public void givenElement_whenFoundUsingEnhancedForLoop_thenReturnElement() { + Integer scoreToFind = 1; + boolean found = findElementInAList.findUsingEnhancedForLoop(scoreToFind, scores); + assertTrue(found); + } + + @Test + public void givenElement_whenNotFoundUsingEnhancedForLoop_thenReturnNull() { + Integer scoreToFind = 5; + boolean found = findElementInAList.findUsingEnhancedForLoop(scoreToFind, scores); + assertTrue(!found); + } + + @Test + public void givenElement_whenFoundUsingStream_thenReturnElement() { + Integer scoreToFind = 1; + Integer score = findElementInAList.findUsingStream(scoreToFind, scores); + assertTrue(score.equals(scoreToFind)); + } + + @Test + public void givenElement_whenNotFoundUsingStream_thenReturnNull() { + Integer scoreToFind = 5; + Integer score = findElementInAList.findUsingStream(scoreToFind, scores); + assertNull(score); + } + + @Test + public void givenElement_whenFoundUsingParallelStream_thenReturnElement() { + Integer scoreToFind = 1; + Integer score = findElementInAList.findUsingParallelStream(scoreToFind, scores); + assertTrue(score.equals(scoreToFind)); + } + + @Test + public void givenElement_whenNotFoundUsingParallelStream_thenReturnNull() { + Integer scoreToFind = 5; + Integer score = findElementInAList.findUsingParallelStream(scoreToFind, scores); + assertNull(score); + } + + @Test + public void givenElement_whenFoundUsingGuava_thenReturnElement() { + Integer scoreToFind = 1; + Integer score = findElementInAList.findUsingGuava(scoreToFind, scores); + assertTrue(score.equals(scoreToFind)); + } + + @Test + public void givenElement_whenNotFoundUsingGuava_thenReturnNull() { + Integer scoreToFind = 5; + Integer score = findElementInAList.findUsingGuava(scoreToFind, scores); + assertNull(score); + } + + @Test + public void givenElement_whenFoundUsingApacheCommons_thenReturnElement() { + Integer scoreToFind = 1; + Integer score = findElementInAList.findUsingApacheCommon(scoreToFind, scores); + assertTrue(score.equals(scoreToFind)); + } + + @Test + public void givenElement_whenNotFoundUsingApacheCommons_thenReturnNull() { + Integer scoreToFind = 5; + Integer score = findElementInAList.findUsingApacheCommon(scoreToFind, scores); + assertNull(score); + } + +} \ No newline at end of file diff --git a/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java b/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java new file mode 100644 index 0000000000..73793da7ae --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java @@ -0,0 +1,40 @@ +package com.baeldung.iterators; + +import static com.baeldung.iterators.Iterators.failFast1; +import static com.baeldung.iterators.Iterators.failFast2; +import static com.baeldung.iterators.Iterators.failSafe1; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.ConcurrentModificationException; + +import org.junit.Test; + +/** + * Source code https://github.com/eugenp/tutorials + * + * @author Santosh Thakur + */ + +public class IteratorsTest { + + @Test + public void whenFailFast_ThenThrowsException() { + assertThatThrownBy(() -> { + failFast1(); + }).isInstanceOf(ConcurrentModificationException.class); + } + + @Test + public void whenFailFast_ThenThrowsExceptionInSecondIteration() { + assertThatThrownBy(() -> { + failFast2(); + }).isInstanceOf(ConcurrentModificationException.class); + } + + @Test + public void whenFailSafe_ThenDoesNotThrowException() { + assertThat(failSafe1()).isGreaterThanOrEqualTo(0); + } + +} diff --git a/core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionUnitTest.java b/core-java-8/src/test/java/com/baeldung/java/conversion/IterableStreamConversionUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/conversion/IterableStreamConversionUnitTest.java rename to core-java-8/src/test/java/com/baeldung/java/conversion/IterableStreamConversionUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java index 73a10a57f4..5005cf7f47 100644 --- a/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.java8; -import com.baeldung.streamApi.Product; +import com.baeldung.stream.Product; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; diff --git a/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java index 1cac428285..2475716554 100644 --- a/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java +++ b/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java @@ -6,7 +6,6 @@ import java.util.Comparator; import org.junit.Before; import org.junit.Test; -import lombok.Data; import static org.junit.Assert.assertTrue; public class Java8ComparatorUnitTest { @@ -134,8 +133,7 @@ public class Java8ComparatorUnitTest { @Test public void whenThenComparing_thenSortedByAgeName() { - Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge) - .thenComparing(Employee::getName); + Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName); Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator); // System.out.println(Arrays.toString(someMoreEmployees)); @@ -144,8 +142,7 @@ public class Java8ComparatorUnitTest { @Test public void whenThenComparing_thenSortedByNameAge() { - Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName) - .thenComparingInt(Employee::getAge); + Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge); Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator); // System.out.println(Arrays.toString(someMoreEmployees)); diff --git a/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java b/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java new file mode 100644 index 0000000000..da96376009 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java @@ -0,0 +1,89 @@ +package com.baeldung.math; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class MathNewMethodsUnitTest { + + @Test + public void whenAddExactToInteger_thenExpectCorrectArithmeticResult() { + assertEquals(150, Math.addExact(100, 50)); // Returns 150 + } + + @Test + public void whenSubstractExactFromInteger_thenExpectCorrectArithmeticResult() { + assertEquals(50, Math.subtractExact(100, 50)); // Returns 50 + } + + @Test + public void whenDecrementExactInteger_thenExpectCorrectArithmeticResult() { + assertEquals(99, Math.decrementExact(100)); // Returns 99 + } + + @Test + public void whenIncrementExactToInteger_thenExpectCorrectArithmeticResult() { + assertEquals(101, Math.incrementExact(100)); // Returns 101 + } + + @Test + public void whenMultiplyExactTwoIntegers_thenExpectCorrectArithmeticResult() { + assertEquals(500, Math.multiplyExact(100, 5)); // Returns 500 + } + + @Test + public void whenNegateExactInteger_thenExpectCorrectArithmeticResult() { + assertEquals(-100, Math.negateExact(100)); // Returns -100 + } + + @Test(expected = ArithmeticException.class) + public void whenAddToMaxInteger_thenThrowsArithmeticException() { + Math.addExact(Integer.MAX_VALUE, 1); // Throws ArithmeticException + } + + @Test(expected = ArithmeticException.class) + public void whenDecrementMinInteger_thenThrowsArithmeticException() { + Math.decrementExact(Integer.MIN_VALUE); // Throws ArithmeticException + } + + @Test(expected = ArithmeticException.class) + public void whenIncrementMaxLong_thenThrowsArithmeticException() { + Math.incrementExact(Long.MAX_VALUE); // Throws ArithmeticException + } + + @Test(expected = ArithmeticException.class) + public void whenMultiplyMaxLong_thenThrowsArithmeticException() { + Math.multiplyExact(Long.MAX_VALUE, 2); // Throws ArithmeticException + } + + @Test(expected = ArithmeticException.class) + public void whenNegateMinInteger_thenThrowsArithmeticException() { + Math.negateExact(Integer.MIN_VALUE); // MinInt value: −2.147.483.648, but MaxInt Value: 2.147.483.647 => Throws ArithmeticException + } + + @Test(expected = ArithmeticException.class) + public void whenSubstractFromMinInteger_thenThrowsArithmeticException() { + Math.subtractExact(Integer.MIN_VALUE, 1); + } + + @Test + public void whenFloorDivTwoIntegers_thenExpectCorrectArithmeticResult() { + assertEquals(3, Math.floorDiv(7, 2)); // Exact quotient is 3.5 so floor(3.5) == 3 + assertEquals(-4, Math.floorDiv(-7, 2)); // Exact quotient is -3.5 so floor(-3.5) == -4 + } + + @Test + public void whenModDivTwoIntegers_thenExpectCorrectArithmeticResult() { + assertEquals(2, Math.floorMod(5, 3)); // Returns 2: floorMod for positive numbers returns the same as % operator + assertEquals(1, Math.floorMod(-5, 3)); // Returns 1 and not 2 because floorDiv(-5, 3) is -2 and not -1 and (-2*3) + (1) = -5 + } + + @Test + public void whenNextDownOfDouble_thenExpectCorrectNumber() { + double number = 3.0; + double expected = 2.999999999999; + double delta = 0.00000001; + assertEquals(expected, Math.nextDown(number), delta); // The delta defines the accepted error range + } + +} diff --git a/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java b/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java new file mode 100644 index 0000000000..e53e1c183e --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/prime/PrimeGeneratorTest.java @@ -0,0 +1,28 @@ +package com.baeldung.prime; + +import static com.baeldung.prime.PrimeGenerator.*; + +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import static org.junit.Assert.*; + +public class PrimeGeneratorTest { + @Test + public void whenBruteForced_returnsSuccessfully() { + final List primeNumbers = primeNumbersBruteForce(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenOptimized_returnsSuccessfully() { + final List primeNumbers = primeNumbersTill(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenSieveOfEratosthenes_returnsSuccessfully() { + final List primeNumbers = sieveOfEratosthenes(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java b/core-java-8/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java new file mode 100644 index 0000000000..d013907c9a --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.shufflingcollections; + +import org.junit.Test; + +import java.util.*; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ShufflingCollectionsUnitTest { + + @Test + public void whenShufflingList_thenListIsShuffled() { + List students = Arrays.asList("Foo", "Bar", "Baz", "Qux"); + + System.out.println("List before shuffling:"); + System.out.println(students); + + Collections.shuffle(students); + System.out.println("List after shuffling:"); + System.out.println(students); + } + + @Test + public void whenShufflingMapEntries_thenValuesAreShuffled() { + Map studentsById = new HashMap<>(); + studentsById.put(1, "Foo"); + studentsById.put(2, "Bar"); + studentsById.put(3, "Baz"); + studentsById.put(4, "Qux"); + + System.out.println("Students before shuffling:"); + System.out.println(studentsById.values()); + + List> shuffledStudentEntries = new ArrayList<>(studentsById.entrySet()); + Collections.shuffle(shuffledStudentEntries); + + List shuffledStudents = shuffledStudentEntries.stream() + .map(Map.Entry::getValue) + .collect(Collectors.toList()); + + System.out.println("Students after shuffling"); + System.out.println(shuffledStudents); + } + + @Test + public void whenShufflingSet_thenElementsAreShuffled() { + Set students = new HashSet<>(Arrays.asList("Foo", "Bar", "Baz", "Qux")); + + System.out.println("Set before shuffling:"); + System.out.println(students); + + List studentList = new ArrayList<>(students); + + Collections.shuffle(studentList); + System.out.println("Shuffled set elements:"); + System.out.println(studentList); + } + + @Test + public void whenShufflingWithSameRandomness_thenElementsAreShuffledDeterministically() { + List students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux"); + List students_2 = Arrays.asList("Foo", "Bar", "Baz", "Qux"); + + Collections.shuffle(students_1, new Random(5)); + Collections.shuffle(students_2, new Random(5)); + + assertThat(students_1).isEqualTo(students_2); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/spliteratorAPI/ExecutorTest.java b/core-java-8/src/test/java/com/baeldung/spliteratorAPI/ExecutorTest.java new file mode 100644 index 0000000000..64dd65cf5e --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/spliteratorAPI/ExecutorTest.java @@ -0,0 +1,44 @@ +package com.baeldung.spliteratorAPI; + +import java.util.Arrays; +import java.util.Spliterator; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static org.assertj.core.api.Assertions.*; +import org.junit.Before; +import org.junit.Test; + +public class ExecutorTest { + Article article; + Stream stream; + Spliterator spliterator; + Spliterator
split1; + Spliterator
split2; + + @Before + public void init() { + article = new Article(Arrays.asList(new Author("Ahmad", 0), new Author("Eugen", 0), new Author("Alice", 1), + new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), + new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), + new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), + new Author("Mike", 0), new Author("Alice", 1), new Author("Mike", 0), new Author("Alice", 1), + new Author("Mike", 0), new Author("Michał", 0), new Author("Loredana", 1)), 0); + stream = article.getListOfAuthors().stream(); + split1 = Executor.generateElements().spliterator(); + split2 = split1.trySplit(); + spliterator = new RelatedAuthorSpliterator(article.getListOfAuthors()); + } + + @Test + public void givenAstreamOfAuthors_whenProcessedInParallelWithCustomSpliterator_coubtProducessRightOutput() { + Stream stream2 = StreamSupport.stream(spliterator, true); + assertThat(Executor.countAutors(stream2.parallel())).isEqualTo(9); + } + + @Test + public void givenSpliterator_whenAppliedToAListOfArticle_thenSplittedInHalf() { + assertThat(new Task(split1).call()).containsSequence(Executor.generateElements().size() / 2 + ""); + assertThat(new Task(split2).call()).containsSequence(Executor.generateElements().size() / 2 + ""); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java new file mode 100644 index 0000000000..2c88dc5ec7 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java @@ -0,0 +1,99 @@ +package com.baeldung.stream; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class PrimitiveStreamsUnitTest { + + private PrimitiveStreams streams = new PrimitiveStreams(); + + @Test + public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() { + int[] integers = new int[] {20, 98, 12, 7, 35}; + int min = streams.min(integers); // returns 7 + + assertEquals(7, min); + } + + @Test + public void givenAnArrayOfIntegersWhenMaxIsCalledThenCorrectMaxIsReturned() { + int max = streams.max(20, 98, 12, 7, 35); + + assertEquals(98, max); + } + + @Test + public void givenAnArrayOfIntegersWhenSumIsCalledThenCorrectSumIsReturned() { + int sum = streams.sum(20, 98, 12, 7, 35); + + assertEquals(172, sum); + } + + @Test + public void givenAnArrayOfIntegersWhenAvgIsCalledThenCorrectAvgIsReturned() { + double avg = streams.avg(20, 98, 12, 7, 35); + + assertTrue(34.4 == avg); + } + + @Test + public void givenARangeOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { + int sum = IntStream.range(1, 10).sum(); + + assertEquals(45, sum); + } + + @Test + public void givenARangeClosedOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() { + int sum = IntStream.rangeClosed(1, 10).sum(); + + assertEquals(55, sum); + } + + @Test + public void givenARangeWhenForEachIsCalledThenTheIndicesWillBePrinted() { + IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println); + } + + @Test + public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() { + + int sum = Stream.of(33,45) + .mapToInt(i -> i) + .sum(); + + assertEquals(78, sum); + } + + @Test + public void givenAnIntStreamThenGetTheEvenIntegers() { + List evenInts = IntStream.rangeClosed(1, 10) + .filter(i -> i % 2 == 0) + .boxed() + .collect(Collectors.toList()); + + List expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList()); + + assertEquals(expected, evenInts); + } + + class Person { + private int age; + + Person(int age) { + this.age = age; + } + + int getAge() { + return age; + } + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/stream/StreamIndicesTest.java b/core-java-8/src/test/java/com/baeldung/stream/StreamIndicesTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/stream/StreamIndicesTest.java rename to core-java-8/src/test/java/com/baeldung/stream/StreamIndicesTest.java diff --git a/core-java/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java b/core-java-8/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java rename to core-java-8/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java b/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java new file mode 100644 index 0000000000..a72f811336 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java @@ -0,0 +1,101 @@ +package com.baeldung.stringjoiner; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class StringJoinerUnitTest { + private final String DELIMITER_COMMA = ","; + private final String DELIMITER_HYPHEN = "-"; + private final String PREFIX = "["; + private final String SUFFIX = "]"; + private final String EMPTY_JOINER = "empty"; + + @Test + public void whenJoinerWithoutPrefixSuffixWithoutEmptyValue_thenReturnDefault() { + StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA); + assertEquals(0, commaSeparatedJoiner.toString().length()); + } + + @Test + public void whenJoinerWithPrefixSuffixWithoutEmptyValue_thenReturnDefault() { + StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); + assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), PREFIX + SUFFIX); + } + + @Test + public void whenJoinerWithoutPrefixSuffixWithEmptyValue_thenReturnDefault() { + StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA); + commaSeparatedJoiner.setEmptyValue(EMPTY_JOINER); + + assertEquals(commaSeparatedJoiner.toString(), EMPTY_JOINER); + } + + @Test + public void whenJoinerWithPrefixSuffixWithEmptyValue_thenReturnDefault() { + StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); + commaSeparatedPrefixSuffixJoiner.setEmptyValue(EMPTY_JOINER); + + assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), EMPTY_JOINER); + } + + @Test + public void whenAddElements_thenJoinElements() { + StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); + rgbJoiner.add("Red") + .add("Green") + .add("Blue"); + + assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]"); + } + + @Test + public void whenAddListElements_thenJoinListElements() { + List rgbList = new ArrayList(); + rgbList.add("Red"); + rgbList.add("Green"); + rgbList.add("Blue"); + + StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); + + for (String color : rgbList) { + rgbJoiner.add(color); + } + + assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]"); + } + + @Test + public void whenMergeJoiners_thenReturnMerged() { + StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX); + StringJoiner cmybJoiner = new StringJoiner(DELIMITER_HYPHEN, PREFIX, SUFFIX); + + rgbJoiner.add("Red") + .add("Green") + .add("Blue"); + cmybJoiner.add("Cyan") + .add("Magenta") + .add("Yellow") + .add("Black"); + + rgbJoiner.merge(cmybJoiner); + + assertEquals(rgbJoiner.toString(), "[Red,Green,Blue,Cyan-Magenta-Yellow-Black]"); + } + + @Test + public void whenUsedWithinCollectors_thenJoin() { + List rgbList = Arrays.asList("Red", "Green", "Blue"); + String commaSeparatedRGB = rgbList.stream() + .map(color -> color.toString()) + .collect(Collectors.joining(",")); + + assertEquals(commaSeparatedRGB, "Red,Green,Blue"); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java index 7b5f781620..513f163da8 100644 --- a/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java +++ b/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java @@ -1,7 +1,6 @@ package com.baeldung.temporaladjusters; import com.baeldung.temporaladjuster.CustomTemporalAdjuster; -import org.junit.Assert; import org.junit.Test; import java.time.LocalDate; diff --git a/core-java-9/README.md b/core-java-9/README.md index 98c855caea..575376ccb7 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -18,3 +18,5 @@ - [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates) - [Java 9 java.util.Objects Additions](http://www.baeldung.com/java-9-objects-new) - [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) +- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) +- [Java 9 Variable Handles Demistyfied](http://www.baeldung.com/java-variable-handles) diff --git a/core-java-9/compile-httpclient.bat b/core-java-9/compile-httpclient.bat new file mode 100644 index 0000000000..9d845784cf --- /dev/null +++ b/core-java-9/compile-httpclient.bat @@ -0,0 +1,3 @@ +javac --module-path mods -d mods/com.baeldung.httpclient^ + src/modules/com.baeldung.httpclient/module-info.java^ + src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java \ No newline at end of file diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index f6792fdbd9..0f43265916 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -2,10 +2,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - core-java9 + core-java-9 0.2-SNAPSHOT - core-java9 + core-java-9 @@ -90,7 +90,7 @@ 1.7.21 1.2.1 - 3.6.0 + 3.7.0 2.19.1 diff --git a/core-java-9/run-httpclient.bat b/core-java-9/run-httpclient.bat new file mode 100644 index 0000000000..60b1eb7f68 --- /dev/null +++ b/core-java-9/run-httpclient.bat @@ -0,0 +1 @@ +java --module-path mods -m com.baeldung.httpclient/com.baeldung.httpclient.HttpClientExample \ No newline at end of file diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java new file mode 100644 index 0000000000..c794c57e87 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDate. + * + * @author abialas + * + */ +public class DateToLocalDateConverter { + + public static LocalDate convertToLocalDateViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { + return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); + } + + public static LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDate(); + } + + public static LocalDate convertToLocalDate(Date dateToConvert) { + return LocalDate.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java new file mode 100644 index 0000000000..17ca5b1122 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows a way to convert java.util.Date into java.time.LocalDateTime. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverter { + + public static LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { + return dateToConvert.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { + return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { + return Instant.ofEpochMilli(dateToConvert.getTime()) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + public static LocalDateTime convertToLocalDateTime(Date dateToConvert) { + return LocalDateTime.ofInstant(dateToConvert.toInstant(), ZoneId.systemDefault()); + } + +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java new file mode 100644 index 0000000000..f219dcf038 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java @@ -0,0 +1,27 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDateTime into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverter { + + public static Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { + return java.sql.Timestamp.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDateTime dateToConvert) { + return java.util.Date.from(dateToConvert.atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java new file mode 100644 index 0000000000..f9893da5d0 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java @@ -0,0 +1,28 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * Class which shows different ways of converting java.time.LocalDate into java.util.Date. + * + * @author abialas + * + */ +public class LocalDateToDateConverter { + + public static Date convertToDateViaSqlDate(LocalDate dateToConvert) { + return java.sql.Date.valueOf(dateToConvert); + } + + public static Date convertToDateViaInstant(LocalDate dateToConvert) { + return java.util.Date.from(dateToConvert.atStartOfDay() + .atZone(ZoneId.systemDefault()) + .toInstant()); + } + +} diff --git a/core-java-9/src/main/java/com/baeldung/java9/methodhandles/Book.java b/core-java-9/src/main/java/com/baeldung/java9/methodhandles/Book.java new file mode 100644 index 0000000000..479f62cb4e --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/methodhandles/Book.java @@ -0,0 +1,17 @@ +package com.baeldung.java9.methodhandles; + +public class Book { + + String id; + String title; + + public Book(String id, String title) { + this.id = id; + this.title = title; + } + + @SuppressWarnings("unused") + private String formatBook() { + return id + " > " + title; + } +} diff --git a/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java new file mode 100644 index 0000000000..de08c2164e --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.httpclient/com/baeldung/httpclient/HttpClientExample.java @@ -0,0 +1,84 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.httpclient; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import jdk.incubator.http.HttpClient; +import jdk.incubator.http.HttpRequest; +import jdk.incubator.http.HttpRequest.BodyProcessor; +import jdk.incubator.http.HttpResponse; +import jdk.incubator.http.HttpResponse.BodyHandler; + +/** + * + * @author pkaria + */ +public class HttpClientExample { + + public static void main(String[] args) throws Exception { + httpGetRequest(); + httpPostRequest(); + asynchronousRequest(); + asynchronousMultipleRequests(); + } + + public static void httpGetRequest() throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); + HttpRequest request = HttpRequest.newBuilder(httpURI).GET() + .headers("Accept-Enconding", "gzip, deflate").build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString()); + String responseBody = response.body(); + int responseStatusCode = response.statusCode(); + System.out.println(responseBody); + } + + public static void httpPostRequest() throws URISyntaxException, IOException, InterruptedException { + HttpClient client = HttpClient + .newBuilder() + .build(); + HttpRequest request = HttpRequest + .newBuilder(new URI("http://jsonplaceholder.typicode.com/posts")) + .POST(BodyProcessor.fromString("Sample Post Request")) + .build(); + HttpResponse response + = client.send(request, HttpResponse.BodyHandler.asString()); + String responseBody = response.body(); + System.out.println(responseBody); + } + + public static void asynchronousRequest() throws URISyntaxException { + HttpClient client = HttpClient.newHttpClient(); + URI httpURI = new URI("http://jsonplaceholder.typicode.com/posts/1"); + HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build(); + CompletableFuture> futureResponse = client.sendAsync(request, + HttpResponse.BodyHandler.asString()); + } + + public static void asynchronousMultipleRequests() throws URISyntaxException { + List targets = Arrays.asList(new URI("http://jsonplaceholder.typicode.com/posts/1"), new URI("http://jsonplaceholder.typicode.com/posts/2")); + HttpClient client = HttpClient.newHttpClient(); + List> futures = targets + .stream() + .map(target -> client + .sendAsync( + HttpRequest.newBuilder(target) + .GET() + .build(), + BodyHandler.asFile(Paths.get("base", target.getPath()))) + .thenApply(response -> response.body()) + .thenApply(path -> path.toFile())) + .collect(Collectors.toList()); + } +} diff --git a/core-java-9/src/modules/com.baeldung.httpclient/module-info.java b/core-java-9/src/modules/com.baeldung.httpclient/module-info.java new file mode 100644 index 0000000000..205c9ea725 --- /dev/null +++ b/core-java-9/src/modules/com.baeldung.httpclient/module-info.java @@ -0,0 +1,3 @@ +module com.baeldung.httpclient { + requires jdk.incubator.httpclient; +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java new file mode 100644 index 0000000000..ab69bba359 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterTest.java @@ -0,0 +1,89 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.java9.datetime.DateToLocalDateConverter; + +/** + * JUnits for {@link DateToLocalDateConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateConverterTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaInstant(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDate = DateToLocalDateConverter.convertToLocalDateViaSqlDate(dateToConvert); + + // then + assertEquals(2010, localDate.get(ChronoField.YEAR)); + assertEquals(11, localDate.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDate.get(ChronoField.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertToLocalDate() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10); + Date dateToConvert = calendar.getTime(); + + // when + LocalDate localDateTime = DateToLocalDateConverter.convertToLocalDate(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java new file mode 100644 index 0000000000..97c70ee5ac --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterTest.java @@ -0,0 +1,97 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +import com.baeldung.java9.datetime.DateToLocalDateTimeConverter; + +/** + * JUnits for {@link DateToLocalDateTimeConverter} class. + * + * @author abialas + * + */ +public class DateToLocalDateTimeConverterTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaInstant(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaMiliseconds() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaMilisecond(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaSqlTimestamp() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTimeViaSqlTimestamp(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertToLocalDateTime() { + // given + Calendar calendar = Calendar.getInstance(); + calendar.set(2010, 10, 10, 8, 20); + Date dateToConvert = calendar.getTime(); + + // when + LocalDateTime localDateTime = DateToLocalDateTimeConverter.convertToLocalDateTime(dateToConvert); + + // then + assertEquals(2010, localDateTime.get(ChronoField.YEAR)); + assertEquals(11, localDateTime.get(ChronoField.MONTH_OF_YEAR)); + assertEquals(10, localDateTime.get(ChronoField.DAY_OF_MONTH)); + assertEquals(8, localDateTime.get(ChronoField.HOUR_OF_DAY)); + assertEquals(20, localDateTime.get(ChronoField.MINUTE_OF_HOUR)); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java new file mode 100644 index 0000000000..2c6898381f --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterTest.java @@ -0,0 +1,61 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link LocalDateTimeToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateTimeToDateConverterTest { + + @Test + public void shouldReturn10thNovember2010time8hour20minWhenConvertViaInstant() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlTimestamp() { + // given + LocalDateTime dateToConvert = LocalDateTime.of(2010, 11, 10, 8, 20); + + // when + Date date = LocalDateTimeToDateConverter.convertToDateViaSqlTimestamp(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + assertEquals(8, calendar.get(Calendar.HOUR)); + assertEquals(20, calendar.get(Calendar.MINUTE)); + assertEquals(0, calendar.get(Calendar.SECOND)); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java new file mode 100644 index 0000000000..7f20d5d2d2 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterTest.java @@ -0,0 +1,55 @@ +/** + * + */ +package com.baeldung.java9.datetime; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; + +import org.junit.Test; + +/** + * + * JUnits for {@link LocalDateToDateConverter} class. + * + * @author abialas + * + */ +public class LocalDateToDateConverterTest { + + @Test + public void shouldReturn10thNovember2010WhenConvertViaInstant() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaInstant(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + + @Test + public void shouldReturn10thNovember2010WhenConvertViaSqlDate() { + // given + LocalDate dateToConvert = LocalDate.of(2010, 11, 10); + + // when + Date date = LocalDateToDateConverter.convertToDateViaSqlDate(dateToConvert); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // then + assertEquals(2010, calendar.get(Calendar.YEAR)); + assertEquals(10, calendar.get(Calendar.MONTH)); + assertEquals(10, calendar.get(Calendar.DAY_OF_MONTH)); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java new file mode 100644 index 0000000000..5cf3b9098f --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpClientTest.java @@ -0,0 +1,218 @@ +package com.baeldung.java9.httpclient; + +import jdk.incubator.http.HttpClient; +import jdk.incubator.http.HttpRequest; +import jdk.incubator.http.HttpResponse; +import org.junit.Test; + +import java.io.IOException; +import java.net.*; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.collection.IsEmptyCollection.empty; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.assertThat; + +/** + * Created by adam. + */ +public class HttpClientTest { + + @Test + public void shouldReturnSampleDataContentWhenConnectViaSystemProxy() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromString("Sample body")) + .build(); + + HttpResponse response = HttpClient.newBuilder() + .proxy(ProxySelector.getDefault()) + .build() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), containsString("Sample body")); + } + + @Test + public void shouldNotFollowRedirectWhenSetToDefaultNever() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("http://stackoverflow.com")) + .version(HttpClient.Version.HTTP_1_1) + .GET() + .build(); + HttpResponse response = HttpClient.newBuilder() + .build() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_MOVED_PERM)); + assertThat(response.body(), containsString("https://stackoverflow.com/")); + } + + @Test + public void shouldFollowRedirectWhenSetToAlways() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("http://stackoverflow.com")) + .version(HttpClient.Version.HTTP_1_1) + .GET() + .build(); + HttpResponse response = HttpClient.newBuilder() + .followRedirects(HttpClient.Redirect.ALWAYS) + .build() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.finalRequest() + .uri() + .toString(), equalTo("https://stackoverflow.com/")); + } + + @Test + public void shouldReturnOKStatusForAuthenticatedAccess() throws URISyntaxException, IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/basic-auth")) + .GET() + .build(); + HttpResponse response = HttpClient.newBuilder() + .authenticator(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication("postman", "password".toCharArray()); + } + }) + .build() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldSendRequestAsync() throws URISyntaxException, InterruptedException, ExecutionException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromString("Sample body")) + .build(); + CompletableFuture> response = HttpClient.newBuilder() + .build() + .sendAsync(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.get() + .statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldUseJustTwoThreadWhenProcessingSendAsyncRequest() throws URISyntaxException, InterruptedException, ExecutionException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .GET() + .build(); + + ExecutorService executorService = Executors.newFixedThreadPool(2); + + CompletableFuture> response1 = HttpClient.newBuilder() + .executor(executorService) + .build() + .sendAsync(request, HttpResponse.BodyHandler.asString()); + + CompletableFuture> response2 = HttpClient.newBuilder() + .executor(executorService) + .build() + .sendAsync(request, HttpResponse.BodyHandler.asString()); + + CompletableFuture> response3 = HttpClient.newBuilder() + .executor(executorService) + .build() + .sendAsync(request, HttpResponse.BodyHandler.asString()); + + CompletableFuture.allOf(response1, response2, response3) + .join(); + + assertThat(response1.get() + .statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response2.get() + .statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response3.get() + .statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldNotStoreCookieWhenPolicyAcceptNone() throws URISyntaxException, IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .GET() + .build(); + + HttpClient httpClient = HttpClient.newBuilder() + .cookieManager(new CookieManager(null, CookiePolicy.ACCEPT_NONE)) + .build(); + + httpClient.send(request, HttpResponse.BodyHandler.asString()); + + assertThat(httpClient.cookieManager() + .get() + .getCookieStore() + .getCookies(), empty()); + } + + @Test + public void shouldStoreCookieWhenPolicyAcceptAll() throws URISyntaxException, IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .GET() + .build(); + + HttpClient httpClient = HttpClient.newBuilder() + .cookieManager(new CookieManager(null, CookiePolicy.ACCEPT_ALL)) + .build(); + + httpClient.send(request, HttpResponse.BodyHandler.asString()); + + assertThat(httpClient.cookieManager() + .get() + .getCookieStore() + .getCookies(), not(empty())); + } + + @Test + public void shouldProcessMultipleRequestViaStream() throws URISyntaxException, ExecutionException, InterruptedException { + List targets = Arrays.asList(new URI("https://postman-echo.com/get?foo1=bar1"), new URI("https://postman-echo.com/get?foo2=bar2")); + + HttpClient client = HttpClient.newHttpClient(); + + List> futures = targets.stream() + .map(target -> client.sendAsync(HttpRequest.newBuilder(target) + .GET() + .build(), HttpResponse.BodyHandler.asString()) + .thenApply(response -> response.body())) + .collect(Collectors.toList()); + + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .join(); + + if (futures.get(0) + .get() + .contains("foo1")) { + assertThat(futures.get(0) + .get(), containsString("bar1")); + assertThat(futures.get(1) + .get(), containsString("bar2")); + } else { + assertThat(futures.get(1) + .get(), containsString("bar2")); + assertThat(futures.get(1) + .get(), containsString("bar1")); + } + + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java new file mode 100644 index 0000000000..7c0e9a90e0 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpRequestTest.java @@ -0,0 +1,171 @@ +package com.baeldung.java9.httpclient; + +import jdk.incubator.http.HttpClient; +import jdk.incubator.http.HttpRequest; +import jdk.incubator.http.HttpResponse; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.security.NoSuchAlgorithmException; +import java.time.Duration; + +import static java.time.temporal.ChronoUnit.SECONDS; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Created by adam. + */ +public class HttpRequestTest { + + @Test + public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .GET() + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldUseHttp2WhenWebsiteUsesHttp2() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://stackoverflow.com")) + .version(HttpClient.Version.HTTP_2) + .GET() + .build(); + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.version(), equalTo(HttpClient.Version.HTTP_2)); + } + + @Test + public void shouldFallbackToHttp1_1WhenWebsiteDoesNotUseHttp2() throws IOException, InterruptedException, URISyntaxException, NoSuchAlgorithmException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .version(HttpClient.Version.HTTP_2) + .GET() + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.version(), equalTo(HttpClient.Version.HTTP_1_1)); + } + + @Test + public void shouldReturnStatusOKWhenSendGetRequestWithDummyHeaders() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .headers("key1", "value1", "key2", "value2") + .GET() + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldReturnStatusOKWhenSendGetRequestTimeoutSet() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .timeout(Duration.of(10, SECONDS)) + .GET() + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldReturnNoContentWhenPostWithNoBody() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .POST(HttpRequest.noBody()) + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + } + + @Test + public void shouldReturnSampleDataContentWhenPostWithBodyText() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromString("Sample request body")) + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), containsString("Sample request body")); + } + + @Test + public void shouldReturnSampleDataContentWhenPostWithInputStream() throws IOException, InterruptedException, URISyntaxException { + byte[] sampleData = "Sample request body".getBytes(); + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromInputStream(() -> new ByteArrayInputStream(sampleData))) + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), containsString("Sample request body")); + } + + @Test + public void shouldReturnSampleDataContentWhenPostWithByteArrayProcessorStream() throws IOException, InterruptedException, URISyntaxException { + byte[] sampleData = "Sample request body".getBytes(); + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromByteArray(sampleData)) + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), containsString("Sample request body")); + } + + @Test + public void shouldReturnSampleDataContentWhenPostWithFileProcessorStream() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/post")) + .headers("Content-Type", "text/plain;charset=UTF-8") + .POST(HttpRequest.BodyProcessor.fromFile(Paths.get("src/test/resources/sample.txt"))) + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), containsString("Sample file content")); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java new file mode 100644 index 0000000000..80295ff34c --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/httpclient/HttpResponseTest.java @@ -0,0 +1,55 @@ +package com.baeldung.java9.httpclient; + +import jdk.incubator.http.HttpClient; +import jdk.incubator.http.HttpRequest; +import jdk.incubator.http.HttpResponse; +import org.junit.Test; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.assertThat; + +/** + * Created by adam. + */ +public class HttpResponseTest { + + @Test + public void shouldReturnStatusOKWhenSendGetRequest() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("https://postman-echo.com/get")) + .GET() + .build(); + + HttpResponse response = HttpClient.newHttpClient() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(response.statusCode(), equalTo(HttpURLConnection.HTTP_OK)); + assertThat(response.body(), not(isEmptyString())); + } + + @Test + public void shouldResponseURIDifferentThanRequestUIRWhenRedirect() throws IOException, InterruptedException, URISyntaxException { + HttpRequest request = HttpRequest.newBuilder() + .uri(new URI("http://stackoverflow.com")) + .version(HttpClient.Version.HTTP_1_1) + .GET() + .build(); + HttpResponse response = HttpClient.newBuilder() + .followRedirects(HttpClient.Redirect.ALWAYS) + .build() + .send(request, HttpResponse.BodyHandler.asString()); + + assertThat(request.uri() + .toString(), equalTo("http://stackoverflow.com")); + assertThat(response.uri() + .toString(), equalTo("https://stackoverflow.com/")); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/httpclient/SimpleHttpRequestsUnitTest.java b/core-java-9/src/test/java/com/baeldung/java9/httpclient/SimpleHttpRequestsUnitTest.java deleted file mode 100644 index 4a704139a1..0000000000 --- a/core-java-9/src/test/java/com/baeldung/java9/httpclient/SimpleHttpRequestsUnitTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.baeldung.java9.httpclient; - -import static java.net.HttpURLConnection.HTTP_OK; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.net.CookieManager; -import java.net.CookiePolicy; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.http.HttpClient; -import java.net.http.HttpHeaders; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLParameters; - -import org.junit.Before; -import org.junit.Test; - -public class SimpleHttpRequestsUnitTest { - - private URI httpURI; - - @Before - public void init() throws URISyntaxException { - httpURI = new URI("http://www.baeldung.com/"); - } - - @Test - public void quickGet() throws IOException, InterruptedException, URISyntaxException { - HttpRequest request = HttpRequest.create(httpURI).GET(); - HttpResponse response = request.response(); - int responseStatusCode = response.statusCode(); - String responseBody = response.body(HttpResponse.asString()); - assertTrue("Get response status code is bigger then 400", responseStatusCode < 400); - } - - @Test - public void asynchronousGet() throws URISyntaxException, IOException, InterruptedException, ExecutionException { - HttpRequest request = HttpRequest.create(httpURI).GET(); - long before = System.currentTimeMillis(); - CompletableFuture futureResponse = request.responseAsync(); - futureResponse.thenAccept(response -> { - String responseBody = response.body(HttpResponse.asString()); - }); - HttpResponse resp = futureResponse.get(); - HttpHeaders hs = resp.headers(); - assertTrue("There should be more then 1 header.", hs.map().size() > 1); - } - - @Test - public void postMehtod() throws URISyntaxException, IOException, InterruptedException { - HttpRequest.Builder requestBuilder = HttpRequest.create(httpURI); - requestBuilder.body(HttpRequest.fromString("param1=foo,param2=bar")).followRedirects(HttpClient.Redirect.SECURE); - HttpRequest request = requestBuilder.POST(); - HttpResponse response = request.response(); - int statusCode = response.statusCode(); - assertTrue("HTTP return code", statusCode == HTTP_OK); - } - - @Test - public void configureHttpClient() throws NoSuchAlgorithmException, URISyntaxException, IOException, InterruptedException { - CookieManager cManager = new CookieManager(); - cManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); - - SSLParameters sslParam = new SSLParameters(new String[] { "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" }, new String[] { "TLSv1.2" }); - - HttpClient.Builder hcBuilder = HttpClient.create(); - hcBuilder.cookieManager(cManager).sslContext(SSLContext.getDefault()).sslParameters(sslParam); - HttpClient httpClient = hcBuilder.build(); - HttpRequest.Builder reqBuilder = httpClient.request(new URI("https://www.facebook.com")); - - HttpRequest request = reqBuilder.followRedirects(HttpClient.Redirect.ALWAYS).GET(); - HttpResponse response = request.response(); - int statusCode = response.statusCode(); - assertTrue("HTTP return code", statusCode == HTTP_OK); - } - - SSLParameters getDefaultSSLParameters() throws NoSuchAlgorithmException { - SSLParameters sslP1 = SSLContext.getDefault().getSupportedSSLParameters(); - String[] proto = sslP1.getApplicationProtocols(); - String[] cifers = sslP1.getCipherSuites(); - System.out.println(printStringArr(proto)); - System.out.println(printStringArr(cifers)); - return sslP1; - } - - String printStringArr(String... args) { - if (args == null) { - return null; - } - StringBuilder sb = new StringBuilder(); - for (String s : args) { - sb.append(s); - sb.append("\n"); - } - return sb.toString(); - } - - String printHeaders(HttpHeaders h) { - if (h == null) { - return null; - } - - StringBuilder sb = new StringBuilder(); - Map> hMap = h.map(); - for (String k : hMap.keySet()) { - sb.append(k).append(":"); - List l = hMap.get(k); - if (l != null) { - l.forEach(s -> { - sb.append(s).append(","); - }); - } - sb.append("\n"); - } - return sb.toString(); - } -} diff --git a/core-java-9/src/test/java/com/baeldung/java9/methodhandles/MethodHandlesTest.java b/core-java-9/src/test/java/com/baeldung/java9/methodhandles/MethodHandlesTest.java new file mode 100644 index 0000000000..7646755358 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/methodhandles/MethodHandlesTest.java @@ -0,0 +1,152 @@ +package com.baeldung.java9.methodhandles; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.invoke.WrongMethodTypeException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +/** + * Test case for the {@link MethodHandles} API + */ +public class MethodHandlesTest { + + @Test + public void givenConcatMethodHandle_whenInvoked_thenCorrectlyConcatenated() throws Throwable { + + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(String.class, String.class); + MethodHandle concatMH = publicLookup.findVirtual(String.class, "concat", mt); + + String output = (String) concatMH.invoke("Effective ", "Java"); + + assertEquals("Effective Java", output); + } + + @Test + public void givenAsListMethodHandle_whenInvokingWithArguments_thenCorrectlyInvoked() throws Throwable { + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(List.class, Object[].class); + MethodHandle asListMH = publicLookup.findStatic(Arrays.class, "asList", mt); + + List list = (List) asListMH.invokeWithArguments(1, 2); + + assertThat(Arrays.asList(1, 2), is(list)); + } + + @Test + public void givenConstructorMethodHandle_whenInvoked_thenObjectCreatedCorrectly() throws Throwable { + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(void.class, String.class); + MethodHandle newIntegerMH = publicLookup.findConstructor(Integer.class, mt); + + Integer integer = (Integer) newIntegerMH.invoke("1"); + + assertEquals(1, integer.intValue()); + } + + @Test + public void givenAFieldWithoutGetter_whenCreatingAGetter_thenCorrectlyInvoked() throws Throwable { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandle getTitleMH = lookup.findGetter(Book.class, "title", String.class); + + Book book = new Book("ISBN-1234", "Effective Java"); + + assertEquals("Effective Java", getTitleMH.invoke(book)); + } + + @Test + public void givenPrivateMethod_whenCreatingItsMethodHandle_thenCorrectlyInvoked() throws Throwable { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + Method formatBookMethod = Book.class.getDeclaredMethod("formatBook"); + formatBookMethod.setAccessible(true); + + MethodHandle formatBookMH = lookup.unreflect(formatBookMethod); + + Book book = new Book("ISBN-123", "Java in Action"); + + assertEquals("ISBN-123 > Java in Action", formatBookMH.invoke(book)); + } + + @Test + public void givenReplaceMethod_whenUsingReflectionAndInvoked_thenCorrectlyReplaced() throws Throwable { + Method replaceMethod = String.class.getMethod("replace", char.class, char.class); + + String string = (String) replaceMethod.invoke("jovo", 'o', 'a'); + + assertEquals("java", string); + } + + @Test + public void givenReplaceMethodHandle_whenInvoked_thenCorrectlyReplaced() throws Throwable { + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(String.class, char.class, char.class); + MethodHandle replaceMH = publicLookup.findVirtual(String.class, "replace", mt); + + String replacedString = (String) replaceMH.invoke("jovo", Character.valueOf('o'), 'a'); + + assertEquals("java", replacedString); + } + + @Test + public void givenReplaceMethodHandle_whenInvokingExact_thenCorrectlyReplaced() throws Throwable { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType mt = MethodType.methodType(String.class, char.class, char.class); + MethodHandle replaceMH = lookup.findVirtual(String.class, "replace", mt); + + String s = (String) replaceMH.invokeExact("jovo", 'o', 'a'); + + assertEquals("java", s); + } + + @Test + public void givenSumMethodHandle_whenInvokingExact_thenSumIsCorrect() throws Throwable { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType mt = MethodType.methodType(int.class, int.class, int.class); + MethodHandle sumMH = lookup.findStatic(Integer.class, "sum", mt); + + int sum = (int) sumMH.invokeExact(1, 11); + + assertEquals(12, sum); + } + + @Test(expected = WrongMethodTypeException.class) + public void givenSumMethodHandleAndIncompatibleArguments_whenInvokingExact_thenException() throws Throwable { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType mt = MethodType.methodType(int.class, int.class, int.class); + MethodHandle sumMH = lookup.findStatic(Integer.class, "sum", mt); + + sumMH.invokeExact(Integer.valueOf(1), 11); + } + + @Test + public void givenSpreadedEqualsMethodHandle_whenInvokedOnArray_thenCorrectlyEvaluated() throws Throwable { + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(boolean.class, Object.class); + MethodHandle equalsMH = publicLookup.findVirtual(String.class, "equals", mt); + + MethodHandle methodHandle = equalsMH.asSpreader(Object[].class, 2); + + assertTrue((boolean) methodHandle.invoke(new Object[] { "java", "java" })); + assertFalse((boolean) methodHandle.invoke(new Object[] { "java", "jova" })); + } + + @Test + public void givenConcatMethodHandle_whenBindToAString_thenCorrectlyConcatenated() throws Throwable { + MethodHandles.Lookup publicLookup = MethodHandles.publicLookup(); + MethodType mt = MethodType.methodType(String.class, String.class); + MethodHandle concatMH = publicLookup.findVirtual(String.class, "concat", mt); + + MethodHandle bindedConcatMH = concatMH.bindTo("Hello "); + + assertEquals("Hello World!", bindedConcatMH.invoke("World!")); + } +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java new file mode 100644 index 0000000000..50766502ec --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java @@ -0,0 +1,106 @@ +package com.baeldung.java9.varhandles; + +import org.junit.Test; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + +import static org.assertj.core.api.Assertions.assertThat; + +public class VariableHandlesTest { + + public int publicTestVariable = 1; + private int privateTestVariable = 1; + public int variableToSet = 1; + public int variableToCompareAndSet = 1; + public int variableToGetAndAdd = 0; + public byte variableToBitwiseOr = 0; + + @Test + public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); + + assertThat(publicIntHandle.coordinateTypes().size() == 1); + assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandles.class); + + } + + @Test + public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle privateIntHandle = MethodHandles + .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) + .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class); + + assertThat(privateIntHandle.coordinateTypes().size() == 1); + assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesTest.class); + + } + + @Test + public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException { + VarHandle arrayVarHandle = MethodHandles + .arrayElementVarHandle(int[].class); + + assertThat(arrayVarHandle.coordinateTypes().size() == 2); + assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class); + } + + @Test + public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class); + + assertThat((int) publicIntHandle.get(this) == 1); + } + + @Test + public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToSet", int.class); + publicIntHandle.set(this, 15); + + assertThat((int) publicIntHandle.get(this) == 15); + } + + @Test + public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class); + publicIntHandle.compareAndSet(this, 1, 100); + + assertThat((int) publicIntHandle.get(this) == 100); + } + + @Test + public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class); + int before = (int) publicIntHandle.getAndAdd(this, 200); + + assertThat(before == 0); + assertThat((int) publicIntHandle.get(this) == 200); + } + + @Test + public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles + .lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class); + byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); + + assertThat(before == 0); + assertThat(variableToBitwiseOr == 127); + } +} diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index f1d95482d4..8122c71bcb 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -30,3 +30,7 @@ - [Guide to Volatile Keyword in Java](http://www.baeldung.com/java-volatile) - [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) - [Semaphores in Java](http://www.baeldung.com/java-semaphore) +- [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread) +- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) +- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) +- [ExecutorService - Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java index d742d3a55f..4d87978070 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java @@ -3,7 +3,6 @@ package com.baeldung.concurrent.daemon; public class NewThread extends Thread { public void run() { - long startTime = System.currentTimeMillis(); while (true) { for (int i = 0; i < 10; i++) { diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java index 2f0796b491..16d9aa4c9f 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java @@ -1,11 +1,18 @@ package com.baeldung.concurrent.executorservice; import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; public class DelayedCallable implements Callable { private String name; private long period; + private CountDownLatch latch; + + public DelayedCallable(String name, long period, CountDownLatch latch) { + this(name, period); + this.latch = latch; + } public DelayedCallable(String name, long period) { this.name = name; @@ -16,9 +23,15 @@ public class DelayedCallable implements Callable { try { Thread.sleep(period); + + if (latch != null) { + latch.countDown(); + } + } catch (InterruptedException ex) { // handle exception ex.printStackTrace(); + Thread.currentThread().interrupt(); } return name; diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java new file mode 100644 index 0000000000..9900d1c63d --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.prioritytaskexecution; + +public class Job implements Runnable { + private String jobName; + private JobPriority jobPriority; + + public Job(String jobName, JobPriority jobPriority) { + this.jobName = jobName; + this.jobPriority = jobPriority != null ? jobPriority : JobPriority.MEDIUM; + } + + public JobPriority getJobPriority() { + return jobPriority; + } + + @Override + public void run() { + try { + System.out.println("Job:" + jobName + + " Priority:" + jobPriority); + Thread.sleep(1000); + } catch (InterruptedException ignored) { + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java new file mode 100644 index 0000000000..d8092a9ce7 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java @@ -0,0 +1,7 @@ +package com.baeldung.concurrent.prioritytaskexecution; + +public enum JobPriority { + HIGH, + MEDIUM, + LOW +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java new file mode 100644 index 0000000000..ba55696d5a --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java @@ -0,0 +1,56 @@ +package com.baeldung.concurrent.prioritytaskexecution; + +import java.util.Comparator; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.TimeUnit; + +public class PriorityJobScheduler { + + private ExecutorService priorityJobPoolExecutor; + private ExecutorService priorityJobScheduler = + Executors.newSingleThreadExecutor(); + private PriorityBlockingQueue priorityQueue; + + public PriorityJobScheduler(Integer poolSize, Integer queueSize) { + priorityJobPoolExecutor = Executors.newFixedThreadPool(poolSize); + priorityQueue = new PriorityBlockingQueue(queueSize, + Comparator.comparing(Job::getJobPriority)); + + priorityJobScheduler.execute(()->{ + while (true) { + try { + priorityJobPoolExecutor.execute(priorityQueue.take()); + } catch (InterruptedException e) { + // exception needs special handling + break; + } + } + }); + } + + public void scheduleJob(Job job) { + priorityQueue.add(job); + } + + public int getQueuedTaskCount() { + return priorityQueue.size(); + } + + protected void close(ExecutorService scheduler) { + scheduler.shutdown(); + try { + if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) { + scheduler.shutdownNow(); + } + } catch (InterruptedException e) { + scheduler.shutdownNow(); + } + } + + public void closeScheduler() { + close(priorityJobPoolExecutor); + close(priorityJobScheduler); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java new file mode 100644 index 0000000000..e6522168bb --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java @@ -0,0 +1,53 @@ +package com.baeldung.concurrent.stopping; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class ControlSubThread implements Runnable { + + private Thread worker; + private int interval = 100; + private AtomicBoolean running = new AtomicBoolean(false); + private AtomicBoolean stopped = new AtomicBoolean(true); + + + public ControlSubThread(int sleepInterval) { + interval = sleepInterval; + } + + public void start() { + worker = new Thread(this); + worker.start(); + } + + public void stop() { + running.set(false); + } + + public void interrupt() { + running.set(false); + worker.interrupt(); + } + + boolean isRunning() { + return running.get(); + } + + boolean isStopped() { + return stopped.get(); + } + + public void run() { + running.set(true); + stopped.set(false); + while (running.get()) { + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread was interrupted, Failed to complete operation"); + } + // do something + } + stopped.set(true); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java new file mode 100644 index 0000000000..19c6d08c2d --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java @@ -0,0 +1,31 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class BlockedState { + public static void main(String[] args) throws InterruptedException { + Thread t1 = new Thread(new DemoThreadB()); + Thread t2 = new Thread(new DemoThreadB()); + + t1.start(); + t2.start(); + + Thread.sleep(1000); + + System.out.println(t2.getState()); + System.exit(0); + } +} + +class DemoThreadB implements Runnable { + @Override + public void run() { + commonResource(); + } + + public static synchronized void commonResource() { + while(true) { + // Infinite loop to mimic heavy processing + // Thread 't1' won't leave this method + // when Thread 't2' enters this + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java new file mode 100644 index 0000000000..b524cc5ec7 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java @@ -0,0 +1,14 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class NewState implements Runnable { + public static void main(String[] args) { + Runnable runnable = new NewState(); + Thread t = new Thread(runnable); + System.out.println(t.getState()); + } + + @Override + public void run() { + + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java new file mode 100644 index 0000000000..4aa8b36a76 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java @@ -0,0 +1,15 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class RunnableState implements Runnable { + public static void main(String[] args) { + Runnable runnable = new NewState(); + Thread t = new Thread(runnable); + t.start(); + System.out.println(t.getState()); + } + + @Override + public void run() { + + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java new file mode 100644 index 0000000000..7c8884dc22 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java @@ -0,0 +1,15 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class TerminatedState implements Runnable { + public static void main(String[] args) throws InterruptedException { + Thread t1 = new Thread(new TerminatedState()); + t1.start(); + Thread.sleep(1000); + System.out.println(t1.getState()); + } + + @Override + public void run() { + // No processing in this block + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java new file mode 100644 index 0000000000..8d005352eb --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class TimedWaitingState { + public static void main(String[] args) throws InterruptedException { + DemoThread obj1 = new DemoThread(); + Thread t1 = new Thread(obj1); + t1.start(); + // The following sleep will give enough time for ThreadScheduler + // to start processing of thread t1 + Thread.sleep(1000); + System.out.println(t1.getState()); + } +} + +class DemoThread implements Runnable { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java new file mode 100644 index 0000000000..98a6844309 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java @@ -0,0 +1,35 @@ +package com.baeldung.concurrent.threadlifecycle; + +public class WaitingState implements Runnable { + public static Thread t1; + + public static void main(String[] args) { + t1 = new Thread(new WaitingState()); + t1.start(); + } + + public void run() { + Thread t2 = new Thread(new DemoThreadWS()); + t2.start(); + + try { + t2.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + e.printStackTrace(); + } + } +} + +class DemoThreadWS implements Runnable { + public void run() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + e.printStackTrace(); + } + + System.out.println(WaitingState.t1.getState()); + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java new file mode 100644 index 0000000000..9d76c1fcd1 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java @@ -0,0 +1,39 @@ +package com.baeldung.concurrent.waitandnotify; + +public class Data { + private String packet; + + // True if receiver should wait + // False if sender should wait + private boolean transfer = true; + + public synchronized String receive() { + while (transfer) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + } + transfer = true; + + notifyAll(); + return packet; + } + + public synchronized void send(String packet) { + while (!transfer) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + } + transfer = false; + + this.packet = packet; + notifyAll(); + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java new file mode 100644 index 0000000000..d4fd1574c6 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java @@ -0,0 +1,12 @@ +package com.baeldung.concurrent.waitandnotify; + +public class NetworkDriver { + public static void main(String[] args) { + Data data = new Data(); + Thread sender = new Thread(new Sender(data)); + Thread receiver = new Thread(new Receiver(data)); + + sender.start(); + receiver.start(); + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java new file mode 100644 index 0000000000..21ba822bfd --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java @@ -0,0 +1,28 @@ +package com.baeldung.concurrent.waitandnotify; + +import java.util.concurrent.ThreadLocalRandom; + +public class Receiver implements Runnable { + private Data load; + + public Receiver(Data load) { + this.load = load; + } + + public void run() { + for(String receivedMessage = load.receive(); + !"End".equals(receivedMessage) ; + receivedMessage = load.receive()) { + + System.out.println(receivedMessage); + + //Thread.sleep() to mimic heavy server-side processing + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java new file mode 100644 index 0000000000..c365294cdd --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.waitandnotify; + +import java.util.concurrent.ThreadLocalRandom; + +public class Sender implements Runnable { + private Data data; + + public Sender(Data data) { + this.data = data; + } + + public void run() { + String packets[] = { + "First packet", + "Second packet", + "Third packet", + "Fourth packet", + "End" + }; + + for (String packet : packets) { + data.send(packet); + + //Thread.sleep() to mimic heavy server-side processing + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + } + } +} \ No newline at end of file diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java similarity index 56% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java index 0f461909ea..cd8b015be2 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java @@ -10,21 +10,82 @@ import java.util.concurrent.*; import static junit.framework.TestCase.assertTrue; -public class WaitingForThreadsToFinishTest { +public class WaitingForThreadsToFinishManualTest { - private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishTest.class); + private static final Logger LOG = LoggerFactory.getLogger(WaitingForThreadsToFinishManualTest.class); private final static ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); + public void awaitTerminationAfterShutdown(ExecutorService threadPool) { + threadPool.shutdown(); + try { + if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) { + threadPool.shutdownNow(); + } + } catch (InterruptedException ex) { + threadPool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + + @Test + public void givenMultipleThreads_whenUsingCountDownLatch_thenMainShoudWaitForAllToFinish() { + + ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); + + try { + long startTime = System.currentTimeMillis(); + + // create a CountDownLatch that waits for the 2 threads to finish + CountDownLatch latch = new CountDownLatch(2); + + for (int i = 0; i < 2; i++) { + WORKER_THREAD_POOL.submit(() -> { + try { + Thread.sleep(1000); + latch.countDown(); + } catch (InterruptedException e) { + e.printStackTrace(); + Thread.currentThread().interrupt(); + } + }); + } + + // wait for the latch to be decremented by the two threads + latch.await(); + + long processingTime = System.currentTimeMillis() - startTime; + assertTrue(processingTime >= 1000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + awaitTerminationAfterShutdown(WORKER_THREAD_POOL); + } + @Test public void givenMultipleThreads_whenInvokeAll_thenMainThreadShouldWaitForAllToFinish() { ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(10); - List> callables = Arrays.asList(new DelayedCallable("fast thread", 100), new DelayedCallable("slow thread", 3000)); - + List> callables = Arrays.asList( + new DelayedCallable("fast thread", 100), + new DelayedCallable("slow thread", 3000)); + try { long startProcessingTime = System.currentTimeMillis(); List> futures = WORKER_THREAD_POOL.invokeAll(callables); + + awaitTerminationAfterShutdown(WORKER_THREAD_POOL); + + try { + WORKER_THREAD_POOL.submit((Callable) () -> { + Thread.sleep(1000000); + return null; + }); + } catch (RejectedExecutionException ex) { + // + } long totalProcessingTime = System.currentTimeMillis() - startProcessingTime; assertTrue(totalProcessingTime >= 3000); @@ -39,9 +100,7 @@ public class WaitingForThreadsToFinishTest { } catch (ExecutionException | InterruptedException ex) { ex.printStackTrace(); - } - - WORKER_THREAD_POOL.shutdown(); + } } @Test @@ -49,14 +108,14 @@ public class WaitingForThreadsToFinishTest { CompletionService service = new ExecutorCompletionService<>(WORKER_THREAD_POOL); - List> callables = Arrays.asList(new DelayedCallable("fast thread", 100), new DelayedCallable("slow thread", 3000)); + List> callables = Arrays.asList( + new DelayedCallable("fast thread", 100), + new DelayedCallable("slow thread", 3000)); for (Callable callable : callables) { service.submit(callable); } - WORKER_THREAD_POOL.shutdown(); - try { long startProcessingTime = System.currentTimeMillis(); @@ -79,69 +138,8 @@ public class WaitingForThreadsToFinishTest { } catch (ExecutionException | InterruptedException ex) { ex.printStackTrace(); + } finally { + awaitTerminationAfterShutdown(WORKER_THREAD_POOL); } - - } - - @Test - public void givenMultipleThreads_whenUsingCompletableFutures_thenMainThreadShouldWaitForAllToFinish() { - - CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "Hello"; - }); - - CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "Beautiful"; - }); - - CompletableFuture future3 = CompletableFuture.supplyAsync(() -> { - - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return "World"; - }); - - long startProcessingTime = System.currentTimeMillis(); - CompletableFuture combinedFuture = CompletableFuture.allOf(future1, future2, future3); - combinedFuture.join(); - - long totalProcessingTime = System.currentTimeMillis() - startProcessingTime; - assertTrue(totalProcessingTime >= 5000 && totalProcessingTime < 6000); - - LOG.debug("Responses from all threads are available after " + totalProcessingTime + " milliseconds"); - - try { - String thread1Response = future1.get(); - assertTrue(thread1Response.equals("Hello")); - - String thread2Response = future2.get(); - assertTrue(thread2Response.equals("Beautiful")); - - String thread3Response = future3.get(); - assertTrue(thread3Response.equals("World")); - - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - WORKER_THREAD_POOL.shutdown(); } } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java new file mode 100644 index 0000000000..1e67fe45c1 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.concurrent.prioritytaskexecution; + +import org.junit.Test; + +public class PriorityJobSchedulerUnitTest { + private static int POOL_SIZE = 1; + private static int QUEUE_SIZE = 10; + + @Test + public void whenMultiplePriorityJobsQueued_thenHighestPriorityJobIsPicked() { + Job job1 = new Job("Job1", JobPriority.LOW); + Job job2 = new Job("Job2", JobPriority.MEDIUM); + Job job3 = new Job("Job3", JobPriority.HIGH); + Job job4 = new Job("Job4", JobPriority.MEDIUM); + Job job5 = new Job("Job5", JobPriority.LOW); + Job job6 = new Job("Job6", JobPriority.HIGH); + + PriorityJobScheduler pjs = new PriorityJobScheduler(POOL_SIZE, QUEUE_SIZE); + + pjs.scheduleJob(job1); + pjs.scheduleJob(job2); + pjs.scheduleJob(job3); + pjs.scheduleJob(job4); + pjs.scheduleJob(job5); + pjs.scheduleJob(job6); + + // ensure no tasks is pending before closing the scheduler + while (pjs.getQueuedTaskCount() != 0); + + // delay to avoid job sleep (added for demo) being interrupted + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } + + pjs.closeScheduler(); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java similarity index 87% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadTest.java rename to core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java index 4bd4848905..2a51f83e2b 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java @@ -1,24 +1,21 @@ package com.baeldung.concurrent.runnable; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.apache.commons.lang3.RandomUtils; -import org.junit.After; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RunnableVsThreadTest { +public class RunnableVsThreadLiveTest { private static Logger log = - LoggerFactory.getLogger(RunnableVsThreadTest.class); + LoggerFactory.getLogger(RunnableVsThreadLiveTest.class); private static ExecutorService executorService; @@ -77,9 +74,7 @@ public class RunnableVsThreadTest { public void givenACallableAsLambda_whenSubmitToES_thenResult() throws Exception { - Future future = executorService.submit(() -> { - return RandomUtils.nextInt(0, 100); - }); + Future future = executorService.submit(() -> RandomUtils.nextInt(0, 100)); log.info("Result from callable: {}", future.get()); } @@ -99,7 +94,7 @@ class SimpleThread extends Thread{ private String message; - public SimpleThread(String message) { + SimpleThread(String message) { this.message = message; } @@ -116,7 +111,7 @@ class SimpleRunnable implements Runnable { private String message; - public SimpleRunnable(String message) { + SimpleRunnable(String message) { this.message = message; } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java new file mode 100644 index 0000000000..9ea40824ca --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java @@ -0,0 +1,56 @@ +package com.baeldung.concurrent.stopping; + +import static com.jayway.awaitility.Awaitility.await; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.jayway.awaitility.Awaitility; + +public class StopThreadManualTest { + + @Test + public void whenStoppedThreadIsStopped() throws InterruptedException { + + int interval = 5; + + ControlSubThread controlSubThread = new ControlSubThread(interval); + controlSubThread.start(); + + // Give things a chance to get set up + Thread.sleep(interval); + assertTrue(controlSubThread.isRunning()); + assertFalse(controlSubThread.isStopped()); + + // Stop it and make sure the flags have been reversed + controlSubThread.stop(); + await() + .until(() -> assertTrue(controlSubThread.isStopped())); + } + + @Test + public void whenInterruptedThreadIsStopped() throws InterruptedException { + + int interval = 50; + + ControlSubThread controlSubThread = new ControlSubThread(interval); + controlSubThread.start(); + + // Give things a chance to get set up + Thread.sleep(interval); + assertTrue(controlSubThread.isRunning()); + assertFalse(controlSubThread.isStopped()); + + // Stop it and make sure the flags have been reversed + controlSubThread.interrupt(); + + // Wait less than the time we would normally sleep, and make sure we exited. + Awaitility.await() + .pollDelay(2, TimeUnit.MILLISECONDS) + .atMost(interval/ 10, TimeUnit.MILLISECONDS) + .until(controlSubThread::isStopped); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java new file mode 100644 index 0000000000..e2bc328df3 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java @@ -0,0 +1,66 @@ +package com.baeldung.concurrent.waitandnotify; + +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class NetworkIntegrationTest { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private String expected; + + @Before + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @Before + public void setUpExpectedOutput() { + StringWriter expectedStringWriter = new StringWriter(); + + PrintWriter printWriter = new PrintWriter(expectedStringWriter); + printWriter.println("First packet"); + printWriter.println("Second packet"); + printWriter.println("Third packet"); + printWriter.println("Fourth packet"); + printWriter.close(); + + expected = expectedStringWriter.toString(); + } + + @After + public void cleanUpStreams() { + System.setOut(null); + System.setErr(null); + } + + @Test + public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() { + Data data = new Data(); + Thread sender = new Thread(new Sender(data)); + Thread receiver = new Thread(new Receiver(data)); + + sender.start(); + receiver.start(); + + //wait for sender and receiver to finish before we test against expected + try { + sender.join(); + receiver.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + + assertEquals(expected, outContent.toString()); + } +} diff --git a/core-java-io/.gitignore b/core-java-io/.gitignore new file mode 100644 index 0000000000..c61d35324d --- /dev/null +++ b/core-java-io/.gitignore @@ -0,0 +1,5 @@ +0.* + +# Files generated by integration tests +# *.txt +/temp \ No newline at end of file diff --git a/core-java-io/README.md b/core-java-io/README.md new file mode 100644 index 0000000000..52485acfd5 --- /dev/null +++ b/core-java-io/README.md @@ -0,0 +1,25 @@ +========= + +## Core Java IO Cookbooks and Examples + +### Relevant Articles: +- [Java - Reading a Large File Efficiently](http://www.baeldung.com/java-read-lines-large-file) +- [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string) +- [Java – Write to File](http://www.baeldung.com/java-write-to-file) +- [Java - Convert File to InputStream](http://www.baeldung.com/convert-file-to-input-stream) +- [Java Scanner](http://www.baeldung.com/java-scanner) +- [Java – Byte Array to Writer](http://www.baeldung.com/java-convert-byte-array-to-writer) +- [Java – Directory Size](http://www.baeldung.com/java-folder-size) +- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) +- [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) +- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path) +- [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer) +- [Copy a File with Java](http://www.baeldung.com/java-copy-file) +- [Java – Append Data to a File](http://www.baeldung.com/java-append-to-file) +- [FileNotFoundException in Java](http://www.baeldung.com/java-filenotfound-exception) +- [How to Read a File in Java](http://www.baeldung.com/reading-file-in-java) +- [A Guide To NIO2 Asynchronous File Channel](http://www.baeldung.com/java-nio2-async-file-channel) +- [A Guide To NIO2 FileVisitor](http://www.baeldung.com/java-nio2-file-visitor) +- [A Guide To NIO2 File Attribute APIs](http://www.baeldung.com/java-nio2-file-attribute) +- [Introduction to the Java NIO2 File API](http://www.baeldung.com/java-nio-2-file-api) +- [Zipping and Unzipping in Java](http://www.baeldung.com/java-compress-and-uncompress) \ No newline at end of file diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml new file mode 100644 index 0000000000..b9fdca3502 --- /dev/null +++ b/core-java-io/pom.xml @@ -0,0 +1,401 @@ + + 4.0.0 + com.baeldung + core-java-io + 0.1.0-SNAPSHOT + jar + + core-java-io + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + org.unix4j + unix4j-command + ${unix4j.version} + + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + junit + junit + ${junit.version} + test + + + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.javamoney + moneta + 1.1 + + + + org.owasp.esapi + esapi + 2.1.0.1 + + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + org.hsqldb + hsqldb + 2.4.0 + runtime + + + + + core-java-io + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0-M1 + + 1.8 + 1.8 + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + 2.8.5 + + + 1.7.21 + 1.1.7 + + + 22.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + + + 1.3 + 4.12 + 2.8.9 + 3.6.1 + 1.7.0 + + + 3.7.0 + 2.19.1 + + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java b/core-java-io/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java rename to core-java-io/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java diff --git a/core-java-io/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java b/core-java-io/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java new file mode 100644 index 0000000000..7e6bb5d3b2 --- /dev/null +++ b/core-java-io/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java @@ -0,0 +1,42 @@ +package com.baeldung.filesystem.jndi; + +import java.io.File; +import java.util.Hashtable; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +public class LookupFSJNDI { + private InitialContext ctx = null; + + public LookupFSJNDI() throws NamingException { + super(); + init(); + } + + private void init() throws NamingException { + Hashtable env = new Hashtable(); + + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); + // URI to namespace (actual directory) + env.put(Context.PROVIDER_URL, "file:./src/test/resources"); + + ctx = new InitialContext(env); + } + + public InitialContext getCtx() { + return ctx; + } + + public File getFile(String fileName) { + File file; + try { + file = (File) getCtx().lookup(fileName); + } catch (NamingException e) { + file = null; + } + return file; + } + +} diff --git a/core-java/src/main/java/com/baeldung/java/nio/selector/EchoClient.java b/core-java-io/src/main/java/com/baeldung/java/nio/selector/EchoClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/java/nio/selector/EchoClient.java rename to core-java-io/src/main/java/com/baeldung/java/nio/selector/EchoClient.java diff --git a/core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java b/core-java-io/src/main/java/com/baeldung/java/nio/selector/EchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/java/nio/selector/EchoServer.java rename to core-java-io/src/main/java/com/baeldung/java/nio/selector/EchoServer.java diff --git a/core-java/src/main/java/com/baeldung/java/nio/selector/README.md b/core-java-io/src/main/java/com/baeldung/java/nio/selector/README.md similarity index 100% rename from core-java/src/main/java/com/baeldung/java/nio/selector/README.md rename to core-java-io/src/main/java/com/baeldung/java/nio/selector/README.md diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java b/core-java-io/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java rename to core-java-io/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java b/core-java-io/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java similarity index 100% rename from core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java rename to core-java-io/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java diff --git a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java b/core-java-io/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java similarity index 99% rename from core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java rename to core-java-io/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java index 35955032dc..4c35ffdb22 100644 --- a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java +++ b/core-java-io/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java @@ -10,7 +10,7 @@ import java.nio.file.WatchKey; import java.nio.file.WatchService; public class DirectoryWatcherExample { - + public static void main(String[] args) throws IOException, InterruptedException { WatchService watchService = FileSystems.getDefault().newWatchService(); Path path = Paths.get(System.getProperty("user.home")); @@ -25,5 +25,5 @@ public class DirectoryWatcherExample { watchService.close(); } - + } diff --git a/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java b/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java new file mode 100644 index 0000000000..ccc2066b36 --- /dev/null +++ b/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java @@ -0,0 +1,48 @@ +package com.baeldung.stream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.channels.FileChannel; +import java.nio.file.Files; + +import org.apache.commons.io.FileUtils; + +public class FileCopy { + + public static void copyFileUsingStream(File source, File dest) throws IOException { + InputStream is = null; + OutputStream os = null; + is = new FileInputStream(source); + os = new FileOutputStream(dest); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + is.close(); + os.close(); + } + + public static void copyFileUsingChannel(File source, File dest) throws IOException { + FileChannel sourceChannel = null; + FileChannel destChannel = null; + sourceChannel = new FileInputStream(source).getChannel(); + destChannel = new FileOutputStream(dest).getChannel(); + destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); + sourceChannel.close(); + destChannel.close(); + } + + public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException { + FileUtils.copyFile(source, dest); + } + + public static void copyFileUsingJavaFiles(File source, File dest) throws IOException { + Files.copy(source.toPath(), dest.toPath()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/unzip/UnzipFile.java b/core-java-io/src/main/java/com/baeldung/unzip/UnzipFile.java similarity index 100% rename from core-java/src/main/java/com/baeldung/unzip/UnzipFile.java rename to core-java-io/src/main/java/com/baeldung/unzip/UnzipFile.java diff --git a/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java b/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java new file mode 100644 index 0000000000..42f438732f --- /dev/null +++ b/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java @@ -0,0 +1,16 @@ +package com.baeldung.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import org.apache.commons.io.IOUtils; + +public class StreamUtils { + + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } +} diff --git a/core-java/src/main/java/com/baeldung/zip/ZipDirectory.java b/core-java-io/src/main/java/com/baeldung/zip/ZipDirectory.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zip/ZipDirectory.java rename to core-java-io/src/main/java/com/baeldung/zip/ZipDirectory.java diff --git a/core-java/src/main/java/com/baeldung/zip/ZipFile.java b/core-java-io/src/main/java/com/baeldung/zip/ZipFile.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zip/ZipFile.java rename to core-java-io/src/main/java/com/baeldung/zip/ZipFile.java diff --git a/core-java/src/main/java/com/baeldung/zip/ZipMultipleFiles.java b/core-java-io/src/main/java/com/baeldung/zip/ZipMultipleFiles.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zip/ZipMultipleFiles.java rename to core-java-io/src/main/java/com/baeldung/zip/ZipMultipleFiles.java diff --git a/core-java-io/src/main/resources/ESAPI.properties b/core-java-io/src/main/resources/ESAPI.properties new file mode 100644 index 0000000000..24dcaa9dfa --- /dev/null +++ b/core-java-io/src/main/resources/ESAPI.properties @@ -0,0 +1,453 @@ +# +# OWASP Enterprise Security API (ESAPI) Properties file -- PRODUCTION Version +# +# This file is part of the Open Web Application Security Project (OWASP) +# Enterprise Security API (ESAPI) project. For details, please see +# http://www.owasp.org/index.php/ESAPI. +# +# Copyright (c) 2008,2009 - The OWASP Foundation +# +# DISCUSS: This may cause a major backwards compatibility issue, etc. but +# from a name space perspective, we probably should have prefaced +# all the property names with ESAPI or at least OWASP. Otherwise +# there could be problems is someone loads this properties file into +# the System properties. We could also put this file into the +# esapi.jar file (perhaps as a ResourceBundle) and then allow an external +# ESAPI properties be defined that would overwrite these defaults. +# That keeps the application's properties relatively simple as usually +# they will only want to override a few properties. If looks like we +# already support multiple override levels of this in the +# DefaultSecurityConfiguration class, but I'm suggesting placing the +# defaults in the esapi.jar itself. That way, if the jar is signed, +# we could detect if those properties had been tampered with. (The +# code to check the jar signatures is pretty simple... maybe 70-90 LOC, +# but off course there is an execution penalty (similar to the way +# that the separate sunjce.jar used to be when a class from it was +# first loaded). Thoughts? +############################################################################### +# +# WARNING: Operating system protection should be used to lock down the .esapi +# resources directory and all the files inside and all the directories all the +# way up to the root directory of the file system. Note that if you are using +# file-based implementations, that some files may need to be read-write as they +# get updated dynamically. +# +# Before using, be sure to update the MasterKey and MasterSalt as described below. +# N.B.: If you had stored data that you have previously encrypted with ESAPI 1.4, +# you *must* FIRST decrypt it using ESAPI 1.4 and then (if so desired) +# re-encrypt it with ESAPI 2.0. If you fail to do this, you will NOT be +# able to decrypt your data with ESAPI 2.0. +# +# YOU HAVE BEEN WARNED!!! More details are in the ESAPI 2.0 Release Notes. +# +#=========================================================================== +# ESAPI Configuration +# +# If true, then print all the ESAPI properties set here when they are loaded. +# If false, they are not printed. Useful to reduce output when running JUnit tests. +# If you need to troubleshoot a properties related problem, turning this on may help. +# This is 'false' in the src/test/resources/.esapi version. It is 'true' by +# default for reasons of backward compatibility with earlier ESAPI versions. +ESAPI.printProperties=true + +# ESAPI is designed to be easily extensible. You can use the reference implementation +# or implement your own providers to take advantage of your enterprise's security +# infrastructure. The functions in ESAPI are referenced using the ESAPI locator, like: +# +# String ciphertext = +# ESAPI.encryptor().encrypt("Secret message"); // Deprecated in 2.0 +# CipherText cipherText = +# ESAPI.encryptor().encrypt(new PlainText("Secret message")); // Preferred +# +# Below you can specify the classname for the provider that you wish to use in your +# application. The only requirement is that it implement the appropriate ESAPI interface. +# This allows you to switch security implementations in the future without rewriting the +# entire application. +# +# ExperimentalAccessController requires ESAPI-AccessControlPolicy.xml in .esapi directory +ESAPI.AccessControl=org.owasp.esapi.reference.DefaultAccessController +# FileBasedAuthenticator requires users.txt file in .esapi directory +ESAPI.Authenticator=org.owasp.esapi.reference.FileBasedAuthenticator +ESAPI.Encoder=org.owasp.esapi.reference.DefaultEncoder +ESAPI.Encryptor=org.owasp.esapi.reference.crypto.JavaEncryptor + +ESAPI.Executor=org.owasp.esapi.reference.DefaultExecutor +ESAPI.HTTPUtilities=org.owasp.esapi.reference.DefaultHTTPUtilities +ESAPI.IntrusionDetector=org.owasp.esapi.reference.DefaultIntrusionDetector +# Log4JFactory Requires log4j.xml or log4j.properties in classpath - http://www.laliluna.de/log4j-tutorial.html +ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory +#ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory +ESAPI.Randomizer=org.owasp.esapi.reference.DefaultRandomizer +ESAPI.Validator=org.owasp.esapi.reference.DefaultValidator + +#=========================================================================== +# ESAPI Authenticator +# +Authenticator.AllowedLoginAttempts=3 +Authenticator.MaxOldPasswordHashes=13 +Authenticator.UsernameParameterName=username +Authenticator.PasswordParameterName=password +# RememberTokenDuration (in days) +Authenticator.RememberTokenDuration=14 +# Session Timeouts (in minutes) +Authenticator.IdleTimeoutDuration=20 +Authenticator.AbsoluteTimeoutDuration=120 + +#=========================================================================== +# ESAPI Encoder +# +# ESAPI canonicalizes input before validation to prevent bypassing filters with encoded attacks. +# Failure to canonicalize input is a very common mistake when implementing validation schemes. +# Canonicalization is automatic when using the ESAPI Validator, but you can also use the +# following code to canonicalize data. +# +# ESAPI.Encoder().canonicalize( "%22hello world"" ); +# +# Multiple encoding is when a single encoding format is applied multiple times. Allowing +# multiple encoding is strongly discouraged. +Encoder.AllowMultipleEncoding=false + +# Mixed encoding is when multiple different encoding formats are applied, or when +# multiple formats are nested. Allowing multiple encoding is strongly discouraged. +Encoder.AllowMixedEncoding=false + +# The default list of codecs to apply when canonicalizing untrusted data. The list should include the codecs +# for all downstream interpreters or decoders. For example, if the data is likely to end up in a URL, HTML, or +# inside JavaScript, then the list of codecs below is appropriate. The order of the list is not terribly important. +Encoder.DefaultCodecList=HTMLEntityCodec,PercentCodec,JavaScriptCodec + + +#=========================================================================== +# ESAPI Encryption +# +# The ESAPI Encryptor provides basic cryptographic functions with a simplified API. +# To get started, generate a new key using java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor +# There is not currently any support for key rotation, so be careful when changing your key and salt as it +# will invalidate all signed, encrypted, and hashed data. +# +# WARNING: Not all combinations of algorithms and key lengths are supported. +# If you choose to use a key length greater than 128, you MUST download the +# unlimited strength policy files and install in the lib directory of your JRE/JDK. +# See http://java.sun.com/javase/downloads/index.jsp for more information. +# +# Backward compatibility with ESAPI Java 1.4 is supported by the two deprecated API +# methods, Encryptor.encrypt(String) and Encryptor.decrypt(String). However, whenever +# possible, these methods should be avoided as they use ECB cipher mode, which in almost +# all circumstances a poor choice because of it's weakness. CBC cipher mode is the default +# for the new Encryptor encrypt / decrypt methods for ESAPI Java 2.0. In general, you +# should only use this compatibility setting if you have persistent data encrypted with +# version 1.4 and even then, you should ONLY set this compatibility mode UNTIL +# you have decrypted all of your old encrypted data and then re-encrypted it with +# ESAPI 2.0 using CBC mode. If you have some reason to mix the deprecated 1.4 mode +# with the new 2.0 methods, make sure that you use the same cipher algorithm for both +# (256-bit AES was the default for 1.4; 128-bit is the default for 2.0; see below for +# more details.) Otherwise, you will have to use the new 2.0 encrypt / decrypt methods +# where you can specify a SecretKey. (Note that if you are using the 256-bit AES, +# that requires downloading the special jurisdiction policy files mentioned above.) +# +# ***** IMPORTANT: Do NOT forget to replace these with your own values! ***** +# To calculate these values, you can run: +# java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor +# +Encryptor.MasterKey=tzfztf56ftv +Encryptor.MasterSalt=123456ztrewq + +# Provides the default JCE provider that ESAPI will "prefer" for its symmetric +# encryption and hashing. (That is it will look to this provider first, but it +# will defer to other providers if the requested algorithm is not implemented +# by this provider.) If left unset, ESAPI will just use your Java VM's current +# preferred JCE provider, which is generally set in the file +# "$JAVA_HOME/jre/lib/security/java.security". +# +# The main intent of this is to allow ESAPI symmetric encryption to be +# used with a FIPS 140-2 compliant crypto-module. For details, see the section +# "Using ESAPI Symmetric Encryption with FIPS 140-2 Cryptographic Modules" in +# the ESAPI 2.0 Symmetric Encryption User Guide, at: +# http://owasp-esapi-java.googlecode.com/svn/trunk/documentation/esapi4java-core-2.0-symmetric-crypto-user-guide.html +# However, this property also allows you to easily use an alternate JCE provider +# such as "Bouncy Castle" without having to make changes to "java.security". +# See Javadoc for SecurityProviderLoader for further details. If you wish to use +# a provider that is not known to SecurityProviderLoader, you may specify the +# fully-qualified class name of the JCE provider class that implements +# java.security.Provider. If the name contains a '.', this is interpreted as +# a fully-qualified class name that implements java.security.Provider. +# +# NOTE: Setting this property has the side-effect of changing it in your application +# as well, so if you are using JCE in your application directly rather than +# through ESAPI (you wouldn't do that, would you? ;-), it will change the +# preferred JCE provider there as well. +# +# Default: Keeps the JCE provider set to whatever JVM sets it to. +Encryptor.PreferredJCEProvider= + +# AES is the most widely used and strongest encryption algorithm. This +# should agree with your Encryptor.CipherTransformation property. +# By default, ESAPI Java 1.4 uses "PBEWithMD5AndDES" and which is +# very weak. It is essentially a password-based encryption key, hashed +# with MD5 around 1K times and then encrypted with the weak DES algorithm +# (56-bits) using ECB mode and an unspecified padding (it is +# JCE provider specific, but most likely "NoPadding"). However, 2.0 uses +# "AES/CBC/PKCSPadding". If you want to change these, change them here. +# Warning: This property does not control the default reference implementation for +# ESAPI 2.0 using JavaEncryptor. Also, this property will be dropped +# in the future. +# @deprecated +Encryptor.EncryptionAlgorithm=AES +# For ESAPI Java 2.0 - New encrypt / decrypt methods use this. +Encryptor.CipherTransformation=AES/CBC/PKCS5Padding + +# Applies to ESAPI 2.0 and later only! +# Comma-separated list of cipher modes that provide *BOTH* +# confidentiality *AND* message authenticity. (NIST refers to such cipher +# modes as "combined modes" so that's what we shall call them.) If any of these +# cipher modes are used then no MAC is calculated and stored +# in the CipherText upon encryption. Likewise, if one of these +# cipher modes is used with decryption, no attempt will be made +# to validate the MAC contained in the CipherText object regardless +# of whether it contains one or not. Since the expectation is that +# these cipher modes support support message authenticity already, +# injecting a MAC in the CipherText object would be at best redundant. +# +# Note that as of JDK 1.5, the SunJCE provider does not support *any* +# of these cipher modes. Of these listed, only GCM and CCM are currently +# NIST approved. YMMV for other JCE providers. E.g., Bouncy Castle supports +# GCM and CCM with "NoPadding" mode, but not with "PKCS5Padding" or other +# padding modes. +Encryptor.cipher_modes.combined_modes=GCM,CCM,IAPM,EAX,OCB,CWC + +# Applies to ESAPI 2.0 and later only! +# Additional cipher modes allowed for ESAPI 2.0 encryption. These +# cipher modes are in _addition_ to those specified by the property +# 'Encryptor.cipher_modes.combined_modes'. +# Note: We will add support for streaming modes like CFB & OFB once +# we add support for 'specified' to the property 'Encryptor.ChooseIVMethod' +# (probably in ESAPI 2.1). +# DISCUSS: Better name? +Encryptor.cipher_modes.additional_allowed=CBC + +# 128-bit is almost always sufficient and appears to be more resistant to +# related key attacks than is 256-bit AES. Use '_' to use default key size +# for cipher algorithms (where it makes sense because the algorithm supports +# a variable key size). Key length must agree to what's provided as the +# cipher transformation, otherwise this will be ignored after logging a +# warning. +# +# NOTE: This is what applies BOTH ESAPI 1.4 and 2.0. See warning above about mixing! +Encryptor.EncryptionKeyLength=128 + +# Because 2.0 uses CBC mode by default, it requires an initialization vector (IV). +# (All cipher modes except ECB require an IV.) There are two choices: we can either +# use a fixed IV known to both parties or allow ESAPI to choose a random IV. While +# the IV does not need to be hidden from adversaries, it is important that the +# adversary not be allowed to choose it. Also, random IVs are generally much more +# secure than fixed IVs. (In fact, it is essential that feed-back cipher modes +# such as CFB and OFB use a different IV for each encryption with a given key so +# in such cases, random IVs are much preferred. By default, ESAPI 2.0 uses random +# IVs. If you wish to use 'fixed' IVs, set 'Encryptor.ChooseIVMethod=fixed' and +# uncomment the Encryptor.fixedIV. +# +# Valid values: random|fixed|specified 'specified' not yet implemented; planned for 2.1 +Encryptor.ChooseIVMethod=random +# If you choose to use a fixed IV, then you must place a fixed IV here that +# is known to all others who are sharing your secret key. The format should +# be a hex string that is the same length as the cipher block size for the +# cipher algorithm that you are using. The following is an *example* for AES +# from an AES test vector for AES-128/CBC as described in: +# NIST Special Publication 800-38A (2001 Edition) +# "Recommendation for Block Cipher Modes of Operation". +# (Note that the block size for AES is 16 bytes == 128 bits.) +# +Encryptor.fixedIV=0x000102030405060708090a0b0c0d0e0f + +# Whether or not CipherText should use a message authentication code (MAC) with it. +# This prevents an adversary from altering the IV as well as allowing a more +# fool-proof way of determining the decryption failed because of an incorrect +# key being supplied. This refers to the "separate" MAC calculated and stored +# in CipherText, not part of any MAC that is calculated as a result of a +# "combined mode" cipher mode. +# +# If you are using ESAPI with a FIPS 140-2 cryptographic module, you *must* also +# set this property to false. +Encryptor.CipherText.useMAC=true + +# Whether or not the PlainText object may be overwritten and then marked +# eligible for garbage collection. If not set, this is still treated as 'true'. +Encryptor.PlainText.overwrite=true + +# Do not use DES except in a legacy situations. 56-bit is way too small key size. +#Encryptor.EncryptionKeyLength=56 +#Encryptor.EncryptionAlgorithm=DES + +# TripleDES is considered strong enough for most purposes. +# Note: There is also a 112-bit version of DESede. Using the 168-bit version +# requires downloading the special jurisdiction policy from Sun. +#Encryptor.EncryptionKeyLength=168 +#Encryptor.EncryptionAlgorithm=DESede + +Encryptor.HashAlgorithm=SHA-512 +Encryptor.HashIterations=1024 +Encryptor.DigitalSignatureAlgorithm=SHA1withDSA +Encryptor.DigitalSignatureKeyLength=1024 +Encryptor.RandomAlgorithm=SHA1PRNG +Encryptor.CharacterEncoding=UTF-8 + +# This is the Pseudo Random Function (PRF) that ESAPI's Key Derivation Function +# (KDF) normally uses. Note this is *only* the PRF used for ESAPI's KDF and +# *not* what is used for ESAPI's MAC. (Currently, HmacSHA1 is always used for +# the MAC, mostly to keep the overall size at a minimum.) +# +# Currently supported choices for JDK 1.5 and 1.6 are: +# HmacSHA1 (160 bits), HmacSHA256 (256 bits), HmacSHA384 (384 bits), and +# HmacSHA512 (512 bits). +# Note that HmacMD5 is *not* supported for the PRF used by the KDF even though +# the JDKs support it. See the ESAPI 2.0 Symmetric Encryption User Guide +# further details. +Encryptor.KDF.PRF=HmacSHA256 +#=========================================================================== +# ESAPI HttpUtilties +# +# The HttpUtilities provide basic protections to HTTP requests and responses. Primarily these methods +# protect against malicious data from attackers, such as unprintable characters, escaped characters, +# and other simple attacks. The HttpUtilities also provides utility methods for dealing with cookies, +# headers, and CSRF tokens. +# +# Default file upload location (remember to escape backslashes with \\) +HttpUtilities.UploadDir=C:\\ESAPI\\testUpload +HttpUtilities.UploadTempDir=C:\\temp +# Force flags on cookies, if you use HttpUtilities to set cookies +HttpUtilities.ForceHttpOnlySession=false +HttpUtilities.ForceSecureSession=false +HttpUtilities.ForceHttpOnlyCookies=true +HttpUtilities.ForceSecureCookies=true +# Maximum size of HTTP headers +HttpUtilities.MaxHeaderSize=4096 +# File upload configuration +HttpUtilities.ApprovedUploadExtensions=.zip,.pdf,.doc,.docx,.ppt,.pptx,.tar,.gz,.tgz,.rar,.war,.jar,.ear,.xls,.rtf,.properties,.java,.class,.txt,.xml,.jsp,.jsf,.exe,.dll +HttpUtilities.MaxUploadFileBytes=500000000 +# Using UTF-8 throughout your stack is highly recommended. That includes your database driver, +# container, and any other technologies you may be using. Failure to do this may expose you +# to Unicode transcoding injection attacks. Use of UTF-8 does not hinder internationalization. +HttpUtilities.ResponseContentType=text/html; charset=UTF-8 +# This is the name of the cookie used to represent the HTTP session +# Typically this will be the default "JSESSIONID" +HttpUtilities.HttpSessionIdName=JSESSIONID + + + +#=========================================================================== +# ESAPI Executor +# CHECKME - Not sure what this is used for, but surely it should be made OS independent. +Executor.WorkingDirectory=C:\\Windows\\Temp +Executor.ApprovedExecutables=C:\\Windows\\System32\\cmd.exe,C:\\Windows\\System32\\runas.exe + + +#=========================================================================== +# ESAPI Logging +# Set the application name if these logs are combined with other applications +Logger.ApplicationName=ExampleApplication +# If you use an HTML log viewer that does not properly HTML escape log data, you can set LogEncodingRequired to true +Logger.LogEncodingRequired=false +# Determines whether ESAPI should log the application name. This might be clutter in some single-server/single-app environments. +Logger.LogApplicationName=true +# Determines whether ESAPI should log the server IP and port. This might be clutter in some single-server environments. +Logger.LogServerIP=true +# LogFileName, the name of the logging file. Provide a full directory path (e.g., C:\\ESAPI\\ESAPI_logging_file) if you +# want to place it in a specific directory. +Logger.LogFileName=ESAPI_logging_file +# MaxLogFileSize, the max size (in bytes) of a single log file before it cuts over to a new one (default is 10,000,000) +Logger.MaxLogFileSize=10000000 + + +#=========================================================================== +# ESAPI Intrusion Detection +# +# Each event has a base to which .count, .interval, and .action are added +# The IntrusionException will fire if we receive "count" events within "interval" seconds +# The IntrusionDetector is configurable to take the following actions: log, logout, and disable +# (multiple actions separated by commas are allowed e.g. event.test.actions=log,disable +# +# Custom Events +# Names must start with "event." as the base +# Use IntrusionDetector.addEvent( "test" ) in your code to trigger "event.test" here +# You can also disable intrusion detection completely by changing +# the following parameter to true +# +IntrusionDetector.Disable=false +# +IntrusionDetector.event.test.count=2 +IntrusionDetector.event.test.interval=10 +IntrusionDetector.event.test.actions=disable,log + +# Exception Events +# All EnterpriseSecurityExceptions are registered automatically +# Call IntrusionDetector.getInstance().addException(e) for Exceptions that do not extend EnterpriseSecurityException +# Use the fully qualified classname of the exception as the base + +# any intrusion is an attack +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.count=1 +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.interval=1 +IntrusionDetector.org.owasp.esapi.errors.IntrusionException.actions=log,disable,logout + +# for test purposes +# CHECKME: Shouldn't there be something in the property name itself that designates +# that these are for testing??? +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.count=10 +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.interval=5 +IntrusionDetector.org.owasp.esapi.errors.IntegrityException.actions=log,disable,logout + +# rapid validation errors indicate scans or attacks in progress +# org.owasp.esapi.errors.ValidationException.count=10 +# org.owasp.esapi.errors.ValidationException.interval=10 +# org.owasp.esapi.errors.ValidationException.actions=log,logout + +# sessions jumping between hosts indicates session hijacking +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.count=2 +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.interval=10 +IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.actions=log,logout + + +#=========================================================================== +# ESAPI Validation +# +# The ESAPI Validator works on regular expressions with defined names. You can define names +# either here, or you may define application specific patterns in a separate file defined below. +# This allows enterprises to specify both organizational standards as well as application specific +# validation rules. +# +Validator.ConfigurationFile=validation.properties + +# Validators used by ESAPI +Validator.AccountName=^[a-zA-Z0-9]{3,20}$ +Validator.SystemCommand=^[a-zA-Z\\-\\/]{1,64}$ +Validator.RoleName=^[a-z]{1,20}$ + +#the word TEST below should be changed to your application +#name - only relative URL's are supported +Validator.Redirect=^\\/test.*$ + +# Global HTTP Validation Rules +# Values with Base64 encoded data (e.g. encrypted state) will need at least [a-zA-Z0-9\/+=] +Validator.HTTPScheme=^(http|https)$ +Validator.HTTPServerName=^[a-zA-Z0-9_.\\-]*$ +Validator.HTTPParameterName=^[a-zA-Z0-9_]{1,32}$ +Validator.HTTPParameterValue=^[a-zA-Z0-9.\\-\\/+=@_ ]*$ +Validator.HTTPCookieName=^[a-zA-Z0-9\\-_]{1,32}$ +Validator.HTTPCookieValue=^[a-zA-Z0-9\\-\\/+=_ ]*$ +Validator.HTTPHeaderName=^[a-zA-Z0-9\\-_]{1,32}$ +Validator.HTTPHeaderValue=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ +Validator.HTTPContextPath=^\\/?[a-zA-Z0-9.\\-\\/_]*$ +Validator.HTTPServletPath=^[a-zA-Z0-9.\\-\\/_]*$ +Validator.HTTPPath=^[a-zA-Z0-9.\\-_]*$ +Validator.HTTPQueryString=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ %]*$ +Validator.HTTPURI=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$ +Validator.HTTPURL=^.*$ +Validator.HTTPJSESSIONID=^[A-Z0-9]{10,30}$ + +# Validation of file related input +Validator.FileName=^[a-zA-Z0-9!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ +Validator.DirectoryName=^[a-zA-Z0-9:/\\\\!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$ + +# Validation of dates. Controls whether or not 'lenient' dates are accepted. +# See DataFormat.setLenient(boolean flag) for further details. +Validator.AcceptLenientDates=false + diff --git a/core-java/src/test/resources/fileToWriteTo.txt b/core-java-io/src/main/resources/META-INF/BenchmarkList old mode 100644 new mode 100755 similarity index 100% rename from core-java/src/test/resources/fileToWriteTo.txt rename to core-java-io/src/main/resources/META-INF/BenchmarkList diff --git a/core-java-io/src/main/resources/META-INF/persistence.xml b/core-java-io/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..3966afdcda --- /dev/null +++ b/core-java-io/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin b/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin new file mode 100644 index 0000000000..91fb6eb3b0 --- /dev/null +++ b/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin @@ -0,0 +1 @@ +com.baeldung.javac.SampleJavacPlugin \ No newline at end of file diff --git a/core-java-io/src/main/resources/countries.properties b/core-java-io/src/main/resources/countries.properties new file mode 100644 index 0000000000..e743b5a40b --- /dev/null +++ b/core-java-io/src/main/resources/countries.properties @@ -0,0 +1,3 @@ +UK +US +Germany diff --git a/core-java-io/src/main/resources/data.csv b/core-java-io/src/main/resources/data.csv new file mode 100644 index 0000000000..ec4ac10443 --- /dev/null +++ b/core-java-io/src/main/resources/data.csv @@ -0,0 +1,3 @@ +1|IND|India +2|MY|Malaysia +3|AU|Australia diff --git a/core-java-io/src/main/resources/datasource.properties b/core-java-io/src/main/resources/datasource.properties new file mode 100644 index 0000000000..61df0d45f7 --- /dev/null +++ b/core-java-io/src/main/resources/datasource.properties @@ -0,0 +1,6 @@ +dataSourceClassName=//TBD +dataSource.user=//TBD +dataSource.password=//TBD +dataSource.databaseName=//TBD +dataSource.portNumber=//TBD +dataSource.serverName=//TBD \ No newline at end of file diff --git a/core-java/src/main/resources/dirCompressed.zip b/core-java-io/src/main/resources/dirCompressed.zip similarity index 100% rename from core-java/src/main/resources/dirCompressed.zip rename to core-java-io/src/main/resources/dirCompressed.zip diff --git a/core-java-io/src/main/resources/js/bind.js b/core-java-io/src/main/resources/js/bind.js new file mode 100644 index 0000000000..652e646d0d --- /dev/null +++ b/core-java-io/src/main/resources/js/bind.js @@ -0,0 +1,15 @@ +var first = { + name: "Whiskey", + age: 5 +}; + +var second = { + volume: 100 +}; + +Object.bindProperties(first, second); + +print(first.volume); + +second.volume = 1000; +print(first.volume); diff --git a/core-java-io/src/main/resources/js/locations.js b/core-java-io/src/main/resources/js/locations.js new file mode 100644 index 0000000000..abfc944639 --- /dev/null +++ b/core-java-io/src/main/resources/js/locations.js @@ -0,0 +1 @@ +print(__FILE__, __LINE__, __DIR__); diff --git a/core-java-io/src/main/resources/js/math_module.js b/core-java-io/src/main/resources/js/math_module.js new file mode 100644 index 0000000000..267a100f36 --- /dev/null +++ b/core-java-io/src/main/resources/js/math_module.js @@ -0,0 +1,19 @@ +var math = { + increment: function (num) { + return ++num; + }, + + failFunc: function () { + try { + throw "BOOM"; + } catch (e if typeof e === 'string') { + print("String thrown: " + e); + } + catch (e) { + print("this shouldn't happen!"); + } + } +}; + + +math; diff --git a/core-java-io/src/main/resources/js/no_such.js b/core-java-io/src/main/resources/js/no_such.js new file mode 100644 index 0000000000..43b50c5cad --- /dev/null +++ b/core-java-io/src/main/resources/js/no_such.js @@ -0,0 +1,11 @@ +var demo = { + __noSuchProperty__: function (propName) { + print("Accessed non-existing property: " + propName); + }, + + __noSuchMethod__: function (methodName) { + print("Invoked non-existing method: " + methodName); + } +}; + +demo; diff --git a/core-java-io/src/main/resources/js/script.js b/core-java-io/src/main/resources/js/script.js new file mode 100644 index 0000000000..6f701ed59d --- /dev/null +++ b/core-java-io/src/main/resources/js/script.js @@ -0,0 +1 @@ +function increment(num) ++num; diff --git a/core-java-io/src/main/resources/js/trim.js b/core-java-io/src/main/resources/js/trim.js new file mode 100644 index 0000000000..81be009978 --- /dev/null +++ b/core-java-io/src/main/resources/js/trim.js @@ -0,0 +1,2 @@ +print(" hello world".trimLeft()); +print("hello world ".trimRight()); diff --git a/core-java-io/src/main/resources/js/typed_arrays.js b/core-java-io/src/main/resources/js/typed_arrays.js new file mode 100644 index 0000000000..6899b29373 --- /dev/null +++ b/core-java-io/src/main/resources/js/typed_arrays.js @@ -0,0 +1,9 @@ +function arrays(arr) { + + var javaIntArray = Java.to(arr, "int[]"); + print(javaIntArray[0]); + print(javaIntArray[1]); + print(javaIntArray[2]); +} + +arrays([100, "1654", true]); diff --git a/core-java-io/src/main/resources/log4j.properties b/core-java-io/src/main/resources/log4j.properties new file mode 100644 index 0000000000..621cf01735 --- /dev/null +++ b/core-java-io/src/main/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=DEBUG, A1 + +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n \ No newline at end of file diff --git a/core-java-io/src/main/resources/log4jstructuraldp.properties b/core-java-io/src/main/resources/log4jstructuraldp.properties new file mode 100644 index 0000000000..5bc2bfe4b9 --- /dev/null +++ b/core-java-io/src/main/resources/log4jstructuraldp.properties @@ -0,0 +1,9 @@ + +# Root logger +log4j.rootLogger=INFO, file, stdout + +# Write to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/mockito/src/main/resources/logback.xml b/core-java-io/src/main/resources/logback.xml similarity index 100% rename from mockito/src/main/resources/logback.xml rename to core-java-io/src/main/resources/logback.xml diff --git a/core-java/src/main/resources/multiCompressed.zip b/core-java-io/src/main/resources/multiCompressed.zip similarity index 100% rename from core-java/src/main/resources/multiCompressed.zip rename to core-java-io/src/main/resources/multiCompressed.zip diff --git a/core-java-io/src/test/java/com/baeldung/copyfiles/FileCopierTest.java b/core-java-io/src/test/java/com/baeldung/copyfiles/FileCopierTest.java new file mode 100644 index 0000000000..6d96d2fc0b --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/copyfiles/FileCopierTest.java @@ -0,0 +1,69 @@ +package com.baeldung.copyfiles; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.io.FileUtils; +import org.junit.Before; +import org.junit.Test; +import static org.assertj.core.api.Assertions.*; + +public class FileCopierTest { + File original = new File("src/test/resources/original.txt"); + + @Before + public void init() throws IOException { + if (!original.exists()) + Files.createFile(original.toPath()); + } + + @Test + public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException { + File copied = new File("src/test/resources/copiedWithIo.txt"); + try (InputStream in = new BufferedInputStream(new FileInputStream(original)); OutputStream out = new BufferedOutputStream(new FileOutputStream(copied))) { + byte[] buffer = new byte[1024]; + int lengthRead; + while ((lengthRead = in.read(buffer)) > 0) { + out.write(buffer, 0, lengthRead); + out.flush(); + } + } + assertThat(copied).exists(); + assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath()))); + } + + @Test + public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException { + File copied = new File("src/test/resources/copiedWithApacheCommons.txt"); + FileUtils.copyFile(original, copied); + assertThat(copied).exists(); + assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath()))); + } + + @Test + public void givenNIO2_whenCopied_thenCopyExistsWithSameContents() throws IOException { + Path copied = Paths.get("src/test/resources/copiedWithNio.txt"); + Path originalPath = original.toPath(); + Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING); + assertThat(copied).exists(); + assertThat(Files.readAllLines(originalPath).equals(Files.readAllLines(copied))); + } + + @Test + public void givenGuava_whenCopied_thenCopyExistsWithSameContents() throws IOException { + File copied = new File("src/test/resources/copiedWithApacheCommons.txt"); + com.google.common.io.Files.copy(original, copied); + assertThat(copied).exists(); + assertThat(Files.readAllLines(original.toPath()).equals(Files.readAllLines(copied.toPath()))); + } +} diff --git a/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java b/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java rename to core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java index ea71d1b5c1..7968967679 100644 --- a/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java +++ b/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java @@ -3,7 +3,6 @@ package com.baeldung.file; import org.apache.commons.io.FileUtils; import org.hamcrest.CoreMatchers; import org.hamcrest.Matchers; -import org.junit.Assert; import org.junit.Test; import java.io.BufferedReader; diff --git a/core-java-io/src/test/java/com/baeldung/file/FilesTest.java b/core-java-io/src/test/java/com/baeldung/file/FilesTest.java new file mode 100644 index 0000000000..a35cda8b23 --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/file/FilesTest.java @@ -0,0 +1,82 @@ +package com.baeldung.file; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; + +import com.google.common.base.Charsets; +import com.google.common.io.CharSink; +import com.google.common.io.FileWriteMode; +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.util.StreamUtils; + +public class FilesTest { + + public static final String fileName = "src/main/resources/countries.properties"; + + @Before + @After + public void setup() throws Exception { + PrintWriter writer = new PrintWriter(fileName); + writer.print("UK\r\n" + "US\r\n" + "Germany\r\n"); + writer.close(); + } + + @Test + public void whenAppendToFileUsingGuava_thenCorrect() throws IOException { + File file = new File(fileName); + CharSink chs = com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND); + chs.write("Spain\r\n"); + + assertThat(StreamUtils.getStringFromInputStream(new FileInputStream(fileName))).isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @Test + public void whenAppendToFileUsingFiles_thenCorrect() throws IOException { + Files.write(Paths.get(fileName), "Spain\r\n".getBytes(), StandardOpenOption.APPEND); + + assertThat(StreamUtils.getStringFromInputStream(new FileInputStream(fileName))).isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @Test + public void whenAppendToFileUsingFileUtils_thenCorrect() throws IOException { + File file = new File(fileName); + FileUtils.writeStringToFile(file, "Spain\r\n", StandardCharsets.UTF_8, true); + + assertThat(StreamUtils.getStringFromInputStream(new FileInputStream(fileName))).isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @Test + public void whenAppendToFileUsingFileOutputStream_thenCorrect() throws Exception { + FileOutputStream fos = new FileOutputStream(fileName, true); + fos.write("Spain\r\n".getBytes()); + fos.close(); + + assertThat(StreamUtils.getStringFromInputStream(new FileInputStream(fileName))).isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); + } + + @Test + public void whenAppendToFileUsingFileWriter_thenCorrect() throws IOException { + FileWriter fw = new FileWriter(fileName, true); + BufferedWriter bw = new BufferedWriter(fw); + bw.write("Spain"); + bw.newLine(); + bw.close(); + + assertThat(StreamUtils.getStringFromInputStream(new FileInputStream(fileName))).isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\n"); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java b/core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java similarity index 91% rename from core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java rename to core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java index 330ec3aee3..023a47cb97 100644 --- a/core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java +++ b/core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java @@ -35,7 +35,7 @@ public class LookupFSJNDIIntegrationTest { @Test public void givenInitialContext_whenLokupFileExists_thenSuccess() { - File file = fsjndi.getFile(FILENAME); - assertNotNull("File exists", file); + File file = fsjndi.getFile(FILENAME); + assertNotNull("File exists", file); } } diff --git a/core-java/src/test/java/com/baeldung/java/nio/selector/NioEchoLiveTest.java b/core-java-io/src/test/java/com/baeldung/java/nio/selector/NioEchoLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio/selector/NioEchoLiveTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio/selector/NioEchoLiveTest.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/FileIntegrationTest.java b/core-java-io/src/test/java/com/baeldung/java/nio2/FileIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/FileIntegrationTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/FileIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java b/core-java-io/src/test/java/com/baeldung/java/nio2/PathManualTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/PathManualTest.java index acfb2c08e9..969dff1da2 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/PathManualTest.java +++ b/core-java-io/src/test/java/com/baeldung/java/nio2/PathManualTest.java @@ -9,7 +9,6 @@ import java.net.URI; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Date; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/java/nio2/README.md b/core-java-io/src/test/java/com/baeldung/java/nio2/README.md similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/README.md rename to core-java-io/src/test/java/com/baeldung/java/nio2/README.md diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoIntegrationTest.java b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoIntegrationTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java similarity index 58% rename from core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java index e2f7a0303a..cf37b92565 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java +++ b/core-java-io/src/test/java/com/baeldung/java/nio2/async/AsyncFileIntegrationTest.java @@ -17,18 +17,19 @@ import java.util.concurrent.Future; import static org.junit.Assert.assertEquals; public class AsyncFileIntegrationTest { + @Test public void givenPath_whenReadsContentWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException { - Path path = Paths.get(URI.create(this.getClass().getClassLoader().getResource("file.txt").toString())); - AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); + final Path path = Paths.get(URI.create(this.getClass().getClassLoader().getResource("file.txt").toString())); + final AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); - ByteBuffer buffer = ByteBuffer.allocate(1024); + final ByteBuffer buffer = ByteBuffer.allocate(1024); - Future operation = fileChannel.read(buffer, 0); + final Future operation = fileChannel.read(buffer, 0); operation.get(); - String fileContent = new String(buffer.array()).trim(); + final String fileContent = new String(buffer.array()).trim(); buffer.clear(); assertEquals(fileContent, "baeldung.com"); @@ -36,18 +37,16 @@ public class AsyncFileIntegrationTest { @Test public void givenPath_whenReadsContentWithCompletionHandler_thenCorrect() throws IOException { - Path path = Paths.get(URI.create(AsyncFileIntegrationTest.class.getResource("/file.txt").toString())); - AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); + final Path path = Paths.get(URI.create(this.getClass().getClassLoader().getResource("file.txt").toString())); + final AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); - ByteBuffer buffer = ByteBuffer.allocate(1024); + final ByteBuffer buffer = ByteBuffer.allocate(1024); fileChannel.read(buffer, 0, buffer, new CompletionHandler() { - @Override public void completed(Integer result, ByteBuffer attachment) { // result is number of bytes read // attachment is the buffer - } @Override @@ -59,42 +58,40 @@ public class AsyncFileIntegrationTest { @Test public void givenPathAndContent_whenWritesToFileWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException { - String fileName = "temp"; - Path path = Paths.get(fileName); - AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE); + final String fileName = "temp"; + final Path path = Paths.get(fileName); + final AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE); - ByteBuffer buffer = ByteBuffer.allocate(1024); - long position = 0; + final ByteBuffer buffer = ByteBuffer.allocate(1024); + final long position = 0; buffer.put("hello world".getBytes()); buffer.flip(); - Future operation = fileChannel.write(buffer, position); + final Future operation = fileChannel.write(buffer, position); buffer.clear(); operation.get(); - String content = readContent(path); + final String content = readContent(path); assertEquals("hello world", content); } @Test public void givenPathAndContent_whenWritesToFileWithHandler_thenCorrect() throws IOException { - String fileName = UUID.randomUUID().toString(); - Path path = Paths.get(fileName); - AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE); + final String fileName = UUID.randomUUID().toString(); + final Path path = Paths.get(fileName); + final AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE); - ByteBuffer buffer = ByteBuffer.allocate(1024); + final ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("hello world".getBytes()); buffer.flip(); fileChannel.write(buffer, 0, buffer, new CompletionHandler() { - @Override public void completed(Integer result, ByteBuffer attachment) { // result is number of bytes written // attachment is the buffer - } @Override @@ -104,23 +101,25 @@ public class AsyncFileIntegrationTest { }); } - public static String readContent(Path file) throws ExecutionException, InterruptedException { + // + + private String readContent(Path file) throws ExecutionException, InterruptedException { AsynchronousFileChannel fileChannel = null; try { fileChannel = AsynchronousFileChannel.open(file, StandardOpenOption.READ); } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); } - ByteBuffer buffer = ByteBuffer.allocate(1024); + final ByteBuffer buffer = ByteBuffer.allocate(1024); - Future operation = fileChannel.read(buffer, 0); + final Future operation = fileChannel.read(buffer, 0); operation.get(); - String fileContent = new String(buffer.array()).trim(); + final String fileContent = new String(buffer.array()).trim(); buffer.clear(); return fileContent; } + } \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java b/core-java-io/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java rename to core-java-io/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java index 9f84aa60d6..4b6302e93c 100644 --- a/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java +++ b/core-java-io/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsIntegrationTest.java @@ -20,7 +20,6 @@ public class BasicAttribsIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(BasicAttribsIntegrationTest.class); - private static final String HOME = System.getProperty("user.home"); private static BasicFileAttributes basicAttribs; diff --git a/core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java b/core-java-io/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java rename to core-java-io/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java b/core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java similarity index 89% rename from core-java/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java rename to core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java index 7f83e379cd..1f3b380772 100644 --- a/core-java/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java +++ b/core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java @@ -55,12 +55,7 @@ public class JavaFolderSizeUnitTest { @Test public void whenGetFolderSizeUsingJava8_thenCorrect() throws IOException { final Path folder = Paths.get(path); - final long size = Files.walk(folder) - .filter(p -> p.toFile() - .isFile()) - .mapToLong(p -> p.toFile() - .length()) - .sum(); + final long size = Files.walk(folder).filter(p -> p.toFile().isFile()).mapToLong(p -> p.toFile().length()).sum(); assertEquals(EXPECTED_SIZE, size); } @@ -77,12 +72,8 @@ public class JavaFolderSizeUnitTest { public void whenGetFolderSizeUsingGuava_thenCorrect() { final File folder = new File(path); - final Iterable files = com.google.common.io.Files.fileTreeTraverser() - .breadthFirstTraversal(folder); - final long size = StreamSupport.stream(files.spliterator(), false) - .filter(File::isFile) - .mapToLong(File::length) - .sum(); + final Iterable files = com.google.common.io.Files.fileTreeTraverser().breadthFirstTraversal(folder); + final long size = StreamSupport.stream(files.spliterator(), false).filter(File::isFile).mapToLong(File::length).sum(); assertEquals(EXPECTED_SIZE, size); } diff --git a/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java b/core-java-io/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java similarity index 74% rename from core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java rename to core-java-io/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java index 0a0993a0d7..bb87529783 100644 --- a/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java +++ b/core-java-io/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java @@ -18,14 +18,13 @@ import static org.junit.Assert.assertNotNull; public class MappedByteBufferUnitTest { - @Test public void givenFileChannel_whenReadToTheMappedByteBuffer_thenShouldSuccess() throws Exception { - //given + // given CharBuffer charBuffer = null; Path pathToRead = getFileURIFromResources("fileToRead.txt"); - //when + // when try (FileChannel fileChannel = (FileChannel) Files.newByteChannel(pathToRead, EnumSet.of(StandardOpenOption.READ))) { MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size()); @@ -34,20 +33,19 @@ public class MappedByteBufferUnitTest { } } - //then + // then assertNotNull(charBuffer); assertEquals(charBuffer.toString(), "This is a content of the file"); } @Test public void givenPath_whenWriteToItUsingMappedByteBuffer_thenShouldSuccessfullyWrite() throws Exception { - //given - CharBuffer charBuffer = CharBuffer.wrap("This will be written to the file"); - Path pathToWrite = getFileURIFromResources("fileToWriteTo.txt"); + // given + final CharBuffer charBuffer = CharBuffer.wrap("This will be written to the file"); + final Path pathToWrite = getFileURIFromResources("fileToWriteTo.txt"); - //when - try (FileChannel fileChannel = (FileChannel) Files.newByteChannel(pathToWrite, - EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) { + // when + try (FileChannel fileChannel = (FileChannel) Files.newByteChannel(pathToWrite, EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) { MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, charBuffer.length()); if (mappedByteBuffer != null) { @@ -55,14 +53,16 @@ public class MappedByteBufferUnitTest { } } - //then - List fileContent = Files.readAllLines(pathToWrite); + // then + final List fileContent = Files.readAllLines(pathToWrite); assertEquals(fileContent.get(0), "This will be written to the file"); } - private Path getFileURIFromResources(String fileName) throws Exception { - ClassLoader classLoader = getClass().getClassLoader(); + // + + private final Path getFileURIFromResources(String fileName) throws Exception { + final ClassLoader classLoader = getClass().getClassLoader(); return Paths.get(classLoader.getResource(fileName).toURI()); } } diff --git a/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java b/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java new file mode 100644 index 0000000000..b4641083b9 --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.stream; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import org.junit.Test; + +public class FileCopyUnitTest { + + @Test + public void whenUsingStream_thenCopyFile() throws IOException { + final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_stream.txt"); + final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_stream.txt"); + FileCopy.copyFileUsingStream(src, dest); + + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingFiles_thenCopyFile() throws IOException { + final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_files.txt"); + final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_files.txt"); + FileCopy.copyFileUsingJavaFiles(src, dest); + + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingChannel_thenCopyFile() throws IOException { + final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_channel.txt"); + final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_channel.txt"); + FileCopy.copyFileUsingChannel(src, dest); + + assertTrue(dest.exists()); + dest.delete(); + } + + @Test + public void whenUsingApache_thenCopyFile() throws IOException { + final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_apache.txt"); + final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_apache.txt"); + FileCopy.copyFileUsingApacheCommonsIO(src, dest); + + assertTrue(dest.exists()); + dest.delete(); + } + +} diff --git a/core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java b/core-java-io/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java rename to core-java-io/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaFilePathUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaFilePathUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaFilePathUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaFilePathUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java similarity index 94% rename from core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java index 0e20e75869..f1bea1eefb 100644 --- a/core-java/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java +++ b/core-java-io/src/test/java/org/baeldung/java/io/JavaInputStreamToXUnitTest.java @@ -152,11 +152,11 @@ public class JavaInputStreamToXUnitTest { @Test public final void whenConvertingToFile_thenCorrect() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); - final File targetFile = new File("src/main/resources/targetFile.tmp"); + final File targetFile = new File("src/test/resources/targetFile.tmp"); final OutputStream outStream = new FileOutputStream(targetFile); outStream.write(buffer); @@ -166,8 +166,8 @@ public class JavaInputStreamToXUnitTest { @Test public final void whenConvertingInProgressToFile_thenCorrect() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); - final File targetFile = new File("src/main/resources/targetFile.tmp"); + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final File targetFile = new File("src/test/resources/targetFile.tmp"); final OutputStream outStream = new FileOutputStream(targetFile); final byte[] buffer = new byte[8 * 1024]; @@ -182,8 +182,8 @@ public class JavaInputStreamToXUnitTest { @Test public final void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); - final File targetFile = new File("src/main/resources/targetFile.tmp"); + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); + final File targetFile = new File("src/test/resources/targetFile.tmp"); java.nio.file.Files.copy(initialStream, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); @@ -192,11 +192,11 @@ public class JavaInputStreamToXUnitTest { @Test public final void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { - final InputStream initialStream = new FileInputStream(new File("src/main/resources/sample.txt")); + final InputStream initialStream = new FileInputStream(new File("src/test/resources/sample.txt")); final byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); - final File targetFile = new File("src/main/resources/targetFile.tmp"); + final File targetFile = new File("src/test/resources/targetFile.tmp"); Files.write(buffer, targetFile); IOUtils.closeQuietly(initialStream); @@ -204,13 +204,13 @@ public class JavaInputStreamToXUnitTest { @Test public final void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { - final InputStream initialStream = FileUtils.openInputStream(new File("src/main/resources/sample.txt")); + final InputStream initialStream = FileUtils.openInputStream(new File("src/test/resources/sample.txt")); - final File targetFile = new File("src/main/resources/targetFile.tmp"); + final File targetFile = new File("src/test/resources/targetFile.tmp"); FileUtils.copyInputStreamToFile(initialStream, targetFile); } - + @Test public final void givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect() throws IOException { String originalString = randomAlphabetic(8); @@ -225,7 +225,7 @@ public class JavaInputStreamToXUnitTest { buffer.flush(); byte[] byteArray = buffer.toByteArray(); - + String text = new String(byteArray, StandardCharsets.UTF_8); assertThat(text, equalTo(originalString)); } diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java similarity index 98% rename from core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java index 41d0a8a02a..b56841117e 100644 --- a/core-java/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java +++ b/core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java @@ -18,7 +18,6 @@ import static org.junit.Assert.assertTrue; public class JavaReadFromFileUnitTest { - private static final Logger LOG = LoggerFactory.getLogger(JavaReadFromFileUnitTest.class); @Test @@ -107,11 +106,12 @@ public class JavaReadFromFileUnitTest { @Test public void whenReadUTFEncodedFile_thenCorrect() throws IOException { - final String expected_value = "青空"; + final String expected_value = "é�’空"; final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/test/resources/test_read7.in"), "UTF-8")); final String currentLine = reader.readLine(); reader.close(); LOG.debug(currentLine); + assertEquals(expected_value, currentLine); } diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaScannerUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaScannerUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaScannerUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaScannerUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java similarity index 94% rename from core-java/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java index f58d66818b..08a4c673cd 100644 --- a/core-java/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java +++ b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToInputStreamUnitTest.java @@ -68,7 +68,7 @@ public class JavaXToInputStreamUnitTest { @Test public final void givenUsingPlainJava_whenConvertingFileToInputStream_thenCorrect() throws IOException { - final File initialFile = new File("src/main/resources/sample.txt"); + final File initialFile = new File("src/test/resources/sample.txt"); final InputStream targetStream = new FileInputStream(initialFile); IOUtils.closeQuietly(targetStream); @@ -76,7 +76,7 @@ public class JavaXToInputStreamUnitTest { @Test public final void givenUsingGuava_whenConvertingFileToInputStream_thenCorrect() throws IOException { - final File initialFile = new File("src/main/resources/sample.txt"); + final File initialFile = new File("src/test/resources/sample.txt"); final InputStream targetStream = Files.asByteSource(initialFile).openStream(); IOUtils.closeQuietly(targetStream); @@ -84,7 +84,7 @@ public class JavaXToInputStreamUnitTest { @Test public final void givenUsingCommonsIO_whenConvertingFileToInputStream_thenCorrect() throws IOException { - final File initialFile = new File("src/main/resources/sample.txt"); + final File initialFile = new File("src/test/resources/sample.txt"); final InputStream targetStream = FileUtils.openInputStream(initialFile); IOUtils.closeQuietly(targetStream); diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java b/core-java-io/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java rename to core-java-io/src/test/java/org/baeldung/java/io/JavaXToWriterUnitTest.java diff --git a/mockito/.gitignore b/core-java-io/src/test/resources/.gitignore similarity index 100% rename from mockito/.gitignore rename to core-java-io/src/test/resources/.gitignore diff --git a/core-java-io/src/test/resources/configuration.properties b/core-java-io/src/test/resources/configuration.properties new file mode 100644 index 0000000000..338be84946 --- /dev/null +++ b/core-java-io/src/test/resources/configuration.properties @@ -0,0 +1,4 @@ +# this is sample property file for PropertiesLoaderTest configuration needs +! this is also a comment +sampleConfEntry = sample String value +colonSeparatedEntry : colon separated entry value diff --git a/jee7/src/main/webapp/WEB-INF/beans.xml b/core-java-io/src/test/resources/copiedWithApacheCommons.txt similarity index 100% rename from jee7/src/main/webapp/WEB-INF/beans.xml rename to core-java-io/src/test/resources/copiedWithApacheCommons.txt diff --git a/spring-boot-actuator/README.MD b/core-java-io/src/test/resources/copiedWithIo.txt similarity index 100% rename from spring-boot-actuator/README.MD rename to core-java-io/src/test/resources/copiedWithIo.txt diff --git a/spring-rest-docs/src/main/resources/application.properties b/core-java-io/src/test/resources/copiedWithNio.txt similarity index 100% rename from spring-rest-docs/src/main/resources/application.properties rename to core-java-io/src/test/resources/copiedWithNio.txt diff --git a/core-java-io/src/test/resources/copyTest/dest/readme.txt b/core-java-io/src/test/resources/copyTest/dest/readme.txt new file mode 100644 index 0000000000..dfda31ee9f --- /dev/null +++ b/core-java-io/src/test/resources/copyTest/dest/readme.txt @@ -0,0 +1,2 @@ +files will be copied here and then deleted +remove `file.delete()` to see the files here diff --git a/core-java-io/src/test/resources/copyTest/src/test_apache.txt b/core-java-io/src/test/resources/copyTest/src/test_apache.txt new file mode 100644 index 0000000000..a6b651973d --- /dev/null +++ b/core-java-io/src/test/resources/copyTest/src/test_apache.txt @@ -0,0 +1 @@ +apache diff --git a/core-java-io/src/test/resources/copyTest/src/test_channel.txt b/core-java-io/src/test/resources/copyTest/src/test_channel.txt new file mode 100644 index 0000000000..6dca835871 --- /dev/null +++ b/core-java-io/src/test/resources/copyTest/src/test_channel.txt @@ -0,0 +1 @@ +channel diff --git a/core-java-io/src/test/resources/copyTest/src/test_files.txt b/core-java-io/src/test/resources/copyTest/src/test_files.txt new file mode 100644 index 0000000000..027271b9b2 --- /dev/null +++ b/core-java-io/src/test/resources/copyTest/src/test_files.txt @@ -0,0 +1 @@ +files diff --git a/core-java-io/src/test/resources/copyTest/src/test_stream.txt b/core-java-io/src/test/resources/copyTest/src/test_stream.txt new file mode 100644 index 0000000000..eac9b41cbe --- /dev/null +++ b/core-java-io/src/test/resources/copyTest/src/test_stream.txt @@ -0,0 +1 @@ +stream diff --git a/core-java-io/src/test/resources/dictionary.in b/core-java-io/src/test/resources/dictionary.in new file mode 100644 index 0000000000..0cc22a20b0 --- /dev/null +++ b/core-java-io/src/test/resources/dictionary.in @@ -0,0 +1,178691 @@ +AA +AAH +AAHED +AAHING +AAHS +AAL +AALII +AALIIS +AALS +AARDVARK +AARDVARKS +AARDWOLF +AARDWOLVES +AARGH +AARRGH +AARRGHH +AAS +AASVOGEL +AASVOGELS +AB +ABA +ABACA +ABACAS +ABACI +ABACK +ABACTERIAL +ABACUS +ABACUSES +ABAFT +ABAKA +ABAKAS +ABALONE +ABALONES +ABAMP +ABAMPERE +ABAMPERES +ABAMPS +ABANDON +ABANDONED +ABANDONER +ABANDONERS +ABANDONING +ABANDONMENT +ABANDONMENTS +ABANDONS +ABAPICAL +ABAS +ABASE +ABASED +ABASEDLY +ABASEMENT +ABASEMENTS +ABASER +ABASERS +ABASES +ABASH +ABASHED +ABASHEDLY +ABASHES +ABASHING +ABASHMENT +ABASHMENTS +ABASIA +ABASIAS +ABASING +ABATABLE +ABATE +ABATED +ABATEMENT +ABATEMENTS +ABATER +ABATERS +ABATES +ABATING +ABATIS +ABATISES +ABATOR +ABATORS +ABATTIS +ABATTISES +ABATTOIR +ABATTOIRS +ABAXIAL +ABAXILE +ABAYA +ABAYAS +ABBA +ABBACIES +ABBACY +ABBAS +ABBATIAL +ABBE +ABBES +ABBESS +ABBESSES +ABBEY +ABBEYS +ABBOT +ABBOTCIES +ABBOTCY +ABBOTS +ABBOTSHIP +ABBOTSHIPS +ABBREVIATE +ABBREVIATED +ABBREVIATES +ABBREVIATING +ABBREVIATION +ABBREVIATIONS +ABBREVIATOR +ABBREVIATORS +ABCOULOMB +ABCOULOMBS +ABDICABLE +ABDICATE +ABDICATED +ABDICATES +ABDICATING +ABDICATION +ABDICATIONS +ABDICATOR +ABDICATORS +ABDOMEN +ABDOMENS +ABDOMINA +ABDOMINAL +ABDOMINALLY +ABDOMINALS +ABDUCE +ABDUCED +ABDUCENS +ABDUCENT +ABDUCENTES +ABDUCES +ABDUCING +ABDUCT +ABDUCTED +ABDUCTEE +ABDUCTEES +ABDUCTING +ABDUCTION +ABDUCTIONS +ABDUCTOR +ABDUCTORES +ABDUCTORS +ABDUCTS +ABEAM +ABECEDARIAN +ABECEDARIANS +ABED +ABEGGING +ABELE +ABELES +ABELIA +ABELIAN +ABELIAS +ABELMOSK +ABELMOSKS +ABERRANCE +ABERRANCES +ABERRANCIES +ABERRANCY +ABERRANT +ABERRANTLY +ABERRANTS +ABERRATED +ABERRATION +ABERRATIONAL +ABERRATIONS +ABET +ABETMENT +ABETMENTS +ABETS +ABETTAL +ABETTALS +ABETTED +ABETTER +ABETTERS +ABETTING +ABETTOR +ABETTORS +ABEYANCE +ABEYANCES +ABEYANCIES +ABEYANCY +ABEYANT +ABFARAD +ABFARADS +ABHENRIES +ABHENRY +ABHENRYS +ABHOR +ABHORRED +ABHORRENCE +ABHORRENCES +ABHORRENT +ABHORRENTLY +ABHORRER +ABHORRERS +ABHORRING +ABHORS +ABIDANCE +ABIDANCES +ABIDE +ABIDED +ABIDER +ABIDERS +ABIDES +ABIDING +ABIDINGLY +ABIGAIL +ABIGAILS +ABILITIES +ABILITY +ABIOGENESES +ABIOGENESIS +ABIOGENIC +ABIOGENICALLY +ABIOGENIST +ABIOGENISTS +ABIOLOGICAL +ABIOSES +ABIOSIS +ABIOTIC +ABIOTICALLY +ABJECT +ABJECTION +ABJECTIONS +ABJECTLY +ABJECTNESS +ABJECTNESSES +ABJURATION +ABJURATIONS +ABJURE +ABJURED +ABJURER +ABJURERS +ABJURES +ABJURING +ABLATE +ABLATED +ABLATES +ABLATING +ABLATION +ABLATIONS +ABLATIVE +ABLATIVELY +ABLATIVES +ABLATOR +ABLATORS +ABLAUT +ABLAUTS +ABLAZE +ABLE +ABLED +ABLEGATE +ABLEGATES +ABLEISM +ABLEISMS +ABLEIST +ABLEISTS +ABLER +ABLES +ABLEST +ABLINGS +ABLINS +ABLOOM +ABLUENT +ABLUENTS +ABLUSH +ABLUTED +ABLUTION +ABLUTIONARY +ABLUTIONS +ABLY +ABMHO +ABMHOS +ABNEGATE +ABNEGATED +ABNEGATES +ABNEGATING +ABNEGATION +ABNEGATIONS +ABNEGATOR +ABNEGATORS +ABNORMAL +ABNORMALITIES +ABNORMALITY +ABNORMALLY +ABNORMALS +ABNORMITIES +ABNORMITY +ABO +ABOARD +ABODE +ABODED +ABODES +ABODING +ABOHM +ABOHMS +ABOIDEAU +ABOIDEAUS +ABOIDEAUX +ABOIL +ABOITEAU +ABOITEAUS +ABOITEAUX +ABOLISH +ABOLISHABLE +ABOLISHED +ABOLISHER +ABOLISHERS +ABOLISHES +ABOLISHING +ABOLISHMENT +ABOLISHMENTS +ABOLITION +ABOLITIONARY +ABOLITIONISM +ABOLITIONISMS +ABOLITIONIST +ABOLITIONISTS +ABOLITIONS +ABOLLA +ABOLLAE +ABOMA +ABOMAS +ABOMASA +ABOMASAL +ABOMASI +ABOMASUM +ABOMASUS +ABOMINABLE +ABOMINABLY +ABOMINATE +ABOMINATED +ABOMINATES +ABOMINATING +ABOMINATION +ABOMINATIONS +ABOMINATOR +ABOMINATORS +ABOON +ABORAL +ABORALLY +ABORIGINAL +ABORIGINALLY +ABORIGINALS +ABORIGINE +ABORIGINES +ABORNING +ABORT +ABORTED +ABORTER +ABORTERS +ABORTIFACIENT +ABORTIFACIENTS +ABORTING +ABORTION +ABORTIONIST +ABORTIONISTS +ABORTIONS +ABORTIVE +ABORTIVELY +ABORTIVENESS +ABORTIVENESSES +ABORTS +ABORTUS +ABORTUSES +ABOS +ABOUGHT +ABOULIA +ABOULIAS +ABOULIC +ABOUND +ABOUNDED +ABOUNDING +ABOUNDS +ABOUT +ABOVE +ABOVEBOARD +ABOVEGROUND +ABOVES +ABRACADABRA +ABRACADABRAS +ABRACHIA +ABRACHIAS +ABRADABLE +ABRADANT +ABRADANTS +ABRADE +ABRADED +ABRADER +ABRADERS +ABRADES +ABRADING +ABRASION +ABRASIONS +ABRASIVE +ABRASIVELY +ABRASIVENESS +ABRASIVENESSES +ABRASIVES +ABREACT +ABREACTED +ABREACTING +ABREACTION +ABREACTIONS +ABREACTS +ABREAST +ABRI +ABRIDGE +ABRIDGED +ABRIDGEMENT +ABRIDGEMENTS +ABRIDGER +ABRIDGERS +ABRIDGES +ABRIDGING +ABRIDGMENT +ABRIDGMENTS +ABRIS +ABROACH +ABROAD +ABROGABLE +ABROGATE +ABROGATED +ABROGATES +ABROGATING +ABROGATION +ABROGATIONS +ABROGATOR +ABROGATORS +ABROSIA +ABROSIAS +ABRUPT +ABRUPTER +ABRUPTEST +ABRUPTION +ABRUPTIONS +ABRUPTLY +ABRUPTNESS +ABRUPTNESSES +ABS +ABSCESS +ABSCESSED +ABSCESSES +ABSCESSING +ABSCISE +ABSCISED +ABSCISES +ABSCISIN +ABSCISING +ABSCISINS +ABSCISSA +ABSCISSAE +ABSCISSAS +ABSCISSION +ABSCISSIONS +ABSCOND +ABSCONDED +ABSCONDER +ABSCONDERS +ABSCONDING +ABSCONDS +ABSEIL +ABSEILED +ABSEILING +ABSEILS +ABSENCE +ABSENCES +ABSENT +ABSENTED +ABSENTEE +ABSENTEEISM +ABSENTEEISMS +ABSENTEES +ABSENTER +ABSENTERS +ABSENTING +ABSENTLY +ABSENTMINDED +ABSENTMINDEDLY +ABSENTS +ABSINTH +ABSINTHE +ABSINTHES +ABSINTHS +ABSOLUTE +ABSOLUTELY +ABSOLUTENESS +ABSOLUTENESSES +ABSOLUTER +ABSOLUTES +ABSOLUTEST +ABSOLUTION +ABSOLUTIONS +ABSOLUTISM +ABSOLUTISMS +ABSOLUTIST +ABSOLUTISTIC +ABSOLUTISTS +ABSOLUTIVE +ABSOLUTIZE +ABSOLUTIZED +ABSOLUTIZES +ABSOLUTIZING +ABSOLVE +ABSOLVED +ABSOLVENT +ABSOLVENTS +ABSOLVER +ABSOLVERS +ABSOLVES +ABSOLVING +ABSONANT +ABSORB +ABSORBABILITIES +ABSORBABILITY +ABSORBABLE +ABSORBANCE +ABSORBANCES +ABSORBANCIES +ABSORBANCY +ABSORBANT +ABSORBANTS +ABSORBED +ABSORBENCIES +ABSORBENCY +ABSORBENT +ABSORBENTS +ABSORBER +ABSORBERS +ABSORBING +ABSORBINGLY +ABSORBS +ABSORPTANCE +ABSORPTANCES +ABSORPTION +ABSORPTIONS +ABSORPTIVE +ABSORPTIVITIES +ABSORPTIVITY +ABSTAIN +ABSTAINED +ABSTAINER +ABSTAINERS +ABSTAINING +ABSTAINS +ABSTEMIOUS +ABSTEMIOUSLY +ABSTEMIOUSNESS +ABSTENTION +ABSTENTIONS +ABSTENTIOUS +ABSTERGE +ABSTERGED +ABSTERGES +ABSTERGING +ABSTINENCE +ABSTINENCES +ABSTINENT +ABSTINENTLY +ABSTRACT +ABSTRACTABLE +ABSTRACTED +ABSTRACTEDLY +ABSTRACTEDNESS +ABSTRACTER +ABSTRACTERS +ABSTRACTEST +ABSTRACTING +ABSTRACTION +ABSTRACTIONAL +ABSTRACTIONISM +ABSTRACTIONISMS +ABSTRACTIONIST +ABSTRACTIONISTS +ABSTRACTIONS +ABSTRACTIVE +ABSTRACTLY +ABSTRACTNESS +ABSTRACTNESSES +ABSTRACTOR +ABSTRACTORS +ABSTRACTS +ABSTRICT +ABSTRICTED +ABSTRICTING +ABSTRICTS +ABSTRUSE +ABSTRUSELY +ABSTRUSENESS +ABSTRUSENESSES +ABSTRUSER +ABSTRUSEST +ABSTRUSITIES +ABSTRUSITY +ABSURD +ABSURDER +ABSURDEST +ABSURDISM +ABSURDISMS +ABSURDIST +ABSURDISTS +ABSURDITIES +ABSURDITY +ABSURDLY +ABSURDNESS +ABSURDNESSES +ABSURDS +ABUBBLE +ABUILDING +ABULIA +ABULIAS +ABULIC +ABUNDANCE +ABUNDANCES +ABUNDANT +ABUNDANTLY +ABUSABLE +ABUSE +ABUSED +ABUSER +ABUSERS +ABUSES +ABUSING +ABUSIVE +ABUSIVELY +ABUSIVENESS +ABUSIVENESSES +ABUT +ABUTILON +ABUTILONS +ABUTMENT +ABUTMENTS +ABUTS +ABUTTAL +ABUTTALS +ABUTTED +ABUTTER +ABUTTERS +ABUTTING +ABUZZ +ABVOLT +ABVOLTS +ABWATT +ABWATTS +ABY +ABYE +ABYES +ABYING +ABYS +ABYSM +ABYSMAL +ABYSMALLY +ABYSMS +ABYSS +ABYSSAL +ABYSSES +ACACIA +ACACIAS +ACADEME +ACADEMES +ACADEMIA +ACADEMIAS +ACADEMIC +ACADEMICAL +ACADEMICALLY +ACADEMICIAN +ACADEMICIANS +ACADEMICISM +ACADEMICISMS +ACADEMICS +ACADEMIES +ACADEMISM +ACADEMISMS +ACADEMY +ACAJOU +ACAJOUS +ACALEPH +ACALEPHAE +ACALEPHE +ACALEPHES +ACALEPHS +ACANTHA +ACANTHAE +ACANTHI +ACANTHINE +ACANTHOCEPHALAN +ACANTHOID +ACANTHOUS +ACANTHUS +ACANTHUSES +ACAPNIA +ACAPNIAS +ACARBOSE +ACARBOSES +ACARI +ACARIASES +ACARIASIS +ACARICIDAL +ACARICIDE +ACARICIDES +ACARID +ACARIDAN +ACARIDANS +ACARIDS +ACARINE +ACARINES +ACAROID +ACAROLOGIES +ACAROLOGY +ACARPOUS +ACARUS +ACATALECTIC +ACATALECTICS +ACAUDAL +ACAUDATE +ACAULESCENT +ACAULINE +ACAULOSE +ACAULOUS +ACCEDE +ACCEDED +ACCEDENCE +ACCEDENCES +ACCEDER +ACCEDERS +ACCEDES +ACCEDING +ACCELERANDO +ACCELERANDOS +ACCELERANT +ACCELERANTS +ACCELERATE +ACCELERATED +ACCELERATES +ACCELERATING +ACCELERATINGLY +ACCELERATION +ACCELERATIONS +ACCELERATIVE +ACCELERATOR +ACCELERATORS +ACCELEROMETER +ACCELEROMETERS +ACCENT +ACCENTED +ACCENTING +ACCENTLESS +ACCENTOR +ACCENTORS +ACCENTS +ACCENTUAL +ACCENTUALLY +ACCENTUATE +ACCENTUATED +ACCENTUATES +ACCENTUATING +ACCENTUATION +ACCENTUATIONS +ACCEPT +ACCEPTABILITIES +ACCEPTABILITY +ACCEPTABLE +ACCEPTABLENESS +ACCEPTABLY +ACCEPTANCE +ACCEPTANCES +ACCEPTANT +ACCEPTATION +ACCEPTATIONS +ACCEPTED +ACCEPTEDLY +ACCEPTEE +ACCEPTEES +ACCEPTER +ACCEPTERS +ACCEPTING +ACCEPTINGLY +ACCEPTINGNESS +ACCEPTINGNESSES +ACCEPTIVE +ACCEPTOR +ACCEPTORS +ACCEPTS +ACCESS +ACCESSARIES +ACCESSARY +ACCESSED +ACCESSES +ACCESSIBILITIES +ACCESSIBILITY +ACCESSIBLE +ACCESSIBLENESS +ACCESSIBLY +ACCESSING +ACCESSION +ACCESSIONAL +ACCESSIONED +ACCESSIONING +ACCESSIONS +ACCESSORIAL +ACCESSORIES +ACCESSORISE +ACCESSORISED +ACCESSORISES +ACCESSORISING +ACCESSORIZE +ACCESSORIZED +ACCESSORIZES +ACCESSORIZING +ACCESSORY +ACCIACCATURA +ACCIACCATURAS +ACCIDENCE +ACCIDENCES +ACCIDENT +ACCIDENTAL +ACCIDENTALLY +ACCIDENTALNESS +ACCIDENTALS +ACCIDENTLY +ACCIDENTS +ACCIDIA +ACCIDIAS +ACCIDIE +ACCIDIES +ACCIPITER +ACCIPITERS +ACCIPITRINE +ACCIPITRINES +ACCLAIM +ACCLAIMED +ACCLAIMER +ACCLAIMERS +ACCLAIMING +ACCLAIMS +ACCLAMATION +ACCLAMATIONS +ACCLIMATE +ACCLIMATED +ACCLIMATES +ACCLIMATING +ACCLIMATION +ACCLIMATIONS +ACCLIMATISE +ACCLIMATISED +ACCLIMATISES +ACCLIMATISING +ACCLIMATIZATION +ACCLIMATIZE +ACCLIMATIZED +ACCLIMATIZER +ACCLIMATIZERS +ACCLIMATIZES +ACCLIMATIZING +ACCLIVITIES +ACCLIVITY +ACCLIVOUS +ACCOLADE +ACCOLADED +ACCOLADES +ACCOLADING +ACCOMMODATE +ACCOMMODATED +ACCOMMODATES +ACCOMMODATING +ACCOMMODATINGLY +ACCOMMODATION +ACCOMMODATIONAL +ACCOMMODATIONS +ACCOMMODATIVE +ACCOMMODATOR +ACCOMMODATORS +ACCOMPANIED +ACCOMPANIES +ACCOMPANIMENT +ACCOMPANIMENTS +ACCOMPANIST +ACCOMPANISTS +ACCOMPANY +ACCOMPANYING +ACCOMPLICE +ACCOMPLICES +ACCOMPLISH +ACCOMPLISHABLE +ACCOMPLISHED +ACCOMPLISHER +ACCOMPLISHERS +ACCOMPLISHES +ACCOMPLISHING +ACCOMPLISHMENT +ACCOMPLISHMENTS +ACCORD +ACCORDANCE +ACCORDANCES +ACCORDANT +ACCORDANTLY +ACCORDED +ACCORDER +ACCORDERS +ACCORDING +ACCORDINGLY +ACCORDION +ACCORDIONIST +ACCORDIONISTS +ACCORDIONS +ACCORDS +ACCOST +ACCOSTED +ACCOSTING +ACCOSTS +ACCOUCHEMENT +ACCOUCHEMENTS +ACCOUCHEUR +ACCOUCHEURS +ACCOUNT +ACCOUNTABILITY +ACCOUNTABLE +ACCOUNTABLENESS +ACCOUNTABLY +ACCOUNTANCIES +ACCOUNTANCY +ACCOUNTANT +ACCOUNTANTS +ACCOUNTANTSHIP +ACCOUNTANTSHIPS +ACCOUNTED +ACCOUNTING +ACCOUNTINGS +ACCOUNTS +ACCOUTER +ACCOUTERED +ACCOUTERING +ACCOUTERMENT +ACCOUTERMENTS +ACCOUTERS +ACCOUTRE +ACCOUTRED +ACCOUTREMENT +ACCOUTREMENTS +ACCOUTRES +ACCOUTRING +ACCREDIT +ACCREDITABLE +ACCREDITATION +ACCREDITATIONS +ACCREDITED +ACCREDITING +ACCREDITS +ACCRETE +ACCRETED +ACCRETES +ACCRETING +ACCRETION +ACCRETIONARY +ACCRETIONS +ACCRETIVE +ACCRUABLE +ACCRUAL +ACCRUALS +ACCRUE +ACCRUED +ACCRUEMENT +ACCRUEMENTS +ACCRUES +ACCRUING +ACCULTURATE +ACCULTURATED +ACCULTURATES +ACCULTURATING +ACCULTURATION +ACCULTURATIONAL +ACCULTURATIONS +ACCULTURATIVE +ACCUMBENT +ACCUMULATE +ACCUMULATED +ACCUMULATES +ACCUMULATING +ACCUMULATION +ACCUMULATIONS +ACCUMULATIVE +ACCUMULATIVELY +ACCUMULATOR +ACCUMULATORS +ACCURACIES +ACCURACY +ACCURATE +ACCURATELY +ACCURATENESS +ACCURATENESSES +ACCURSED +ACCURSEDLY +ACCURSEDNESS +ACCURSEDNESSES +ACCURST +ACCUSABLE +ACCUSABLY +ACCUSAL +ACCUSALS +ACCUSANT +ACCUSANTS +ACCUSATION +ACCUSATIONS +ACCUSATIVE +ACCUSATIVES +ACCUSATORY +ACCUSE +ACCUSED +ACCUSER +ACCUSERS +ACCUSES +ACCUSING +ACCUSINGLY +ACCUSTOM +ACCUSTOMATION +ACCUSTOMATIONS +ACCUSTOMED +ACCUSTOMEDNESS +ACCUSTOMING +ACCUSTOMS +ACE +ACED +ACEDIA +ACEDIAS +ACELDAMA +ACELDAMAS +ACELLULAR +ACENTRIC +ACEPHALIC +ACEPHALOUS +ACEQUIA +ACEQUIAS +ACERATE +ACERATED +ACERB +ACERBATE +ACERBATED +ACERBATES +ACERBATING +ACERBER +ACERBEST +ACERBIC +ACERBICALLY +ACERBITIES +ACERBITY +ACEROLA +ACEROLAS +ACEROSE +ACEROUS +ACERVATE +ACERVULI +ACERVULUS +ACES +ACESCENT +ACESCENTS +ACETA +ACETABULA +ACETABULAR +ACETABULUM +ACETABULUMS +ACETAL +ACETALDEHYDE +ACETALDEHYDES +ACETALS +ACETAMID +ACETAMIDE +ACETAMIDES +ACETAMIDS +ACETAMINOPHEN +ACETAMINOPHENS +ACETANILID +ACETANILIDE +ACETANILIDES +ACETANILIDS +ACETATE +ACETATED +ACETATES +ACETAZOLAMIDE +ACETAZOLAMIDES +ACETIC +ACETIFICATION +ACETIFICATIONS +ACETIFIED +ACETIFIER +ACETIFIERS +ACETIFIES +ACETIFY +ACETIFYING +ACETIN +ACETINS +ACETONE +ACETONES +ACETONIC +ACETONITRILE +ACETONITRILES +ACETOPHENETIDIN +ACETOSE +ACETOUS +ACETOXYL +ACETOXYLS +ACETUM +ACETYL +ACETYLATE +ACETYLATED +ACETYLATES +ACETYLATING +ACETYLATION +ACETYLATIONS +ACETYLATIVE +ACETYLCHOLINE +ACETYLCHOLINES +ACETYLENE +ACETYLENES +ACETYLENIC +ACETYLIC +ACETYLS +ACHALASIA +ACHALASIAS +ACHE +ACHED +ACHENE +ACHENES +ACHENIAL +ACHES +ACHIER +ACHIEST +ACHIEVABLE +ACHIEVE +ACHIEVED +ACHIEVEMENT +ACHIEVEMENTS +ACHIEVER +ACHIEVERS +ACHIEVES +ACHIEVING +ACHILLEA +ACHILLEAS +ACHINESS +ACHINESSES +ACHING +ACHINGLY +ACHIOTE +ACHIOTES +ACHIRAL +ACHLORHYDRIA +ACHLORHYDRIAS +ACHLORHYDRIC +ACHOLIA +ACHOLIAS +ACHONDRITE +ACHONDRITES +ACHONDRITIC +ACHONDROPLASIA +ACHONDROPLASIAS +ACHONDROPLASTIC +ACHOO +ACHROMAT +ACHROMATIC +ACHROMATICALLY +ACHROMATISM +ACHROMATISMS +ACHROMATIZE +ACHROMATIZED +ACHROMATIZES +ACHROMATIZING +ACHROMATS +ACHROMIC +ACHROMOUS +ACHY +ACICULA +ACICULAE +ACICULAR +ACICULAS +ACICULATE +ACICULUM +ACICULUMS +ACID +ACIDEMIA +ACIDEMIAS +ACIDHEAD +ACIDHEADS +ACIDIC +ACIDIFICATION +ACIDIFICATIONS +ACIDIFIED +ACIDIFIER +ACIDIFIERS +ACIDIFIES +ACIDIFY +ACIDIFYING +ACIDIMETER +ACIDIMETERS +ACIDIMETRIC +ACIDIMETRIES +ACIDIMETRY +ACIDITIES +ACIDITY +ACIDLY +ACIDNESS +ACIDNESSES +ACIDOPHIL +ACIDOPHILE +ACIDOPHILES +ACIDOPHILIC +ACIDOPHILS +ACIDOSES +ACIDOSIS +ACIDOTIC +ACIDS +ACIDULATE +ACIDULATED +ACIDULATES +ACIDULATING +ACIDULATION +ACIDULATIONS +ACIDULENT +ACIDULOUS +ACIDURIA +ACIDURIAS +ACIDY +ACIERATE +ACIERATED +ACIERATES +ACIERATING +ACIFORM +ACINAR +ACING +ACINI +ACINIC +ACINIFORM +ACINOSE +ACINOUS +ACINUS +ACKEE +ACKEES +ACKNOWLEDGE +ACKNOWLEDGED +ACKNOWLEDGEDLY +ACKNOWLEDGEMENT +ACKNOWLEDGES +ACKNOWLEDGING +ACKNOWLEDGMENT +ACKNOWLEDGMENTS +ACLINIC +ACMATIC +ACME +ACMES +ACMIC +ACNE +ACNED +ACNES +ACNODE +ACNODES +ACOCK +ACOELOMATE +ACOELOMATES +ACOELOUS +ACOLD +ACOLYTE +ACOLYTES +ACONITE +ACONITES +ACONITIC +ACONITUM +ACONITUMS +ACORN +ACORNED +ACORNS +ACOUSTIC +ACOUSTICAL +ACOUSTICALLY +ACOUSTICIAN +ACOUSTICIANS +ACOUSTICS +ACQUAINT +ACQUAINTANCE +ACQUAINTANCES +ACQUAINTED +ACQUAINTING +ACQUAINTS +ACQUEST +ACQUESTS +ACQUIESCE +ACQUIESCED +ACQUIESCENCE +ACQUIESCENCES +ACQUIESCENT +ACQUIESCENTLY +ACQUIESCES +ACQUIESCING +ACQUIRABLE +ACQUIRE +ACQUIRED +ACQUIREE +ACQUIREES +ACQUIREMENT +ACQUIREMENTS +ACQUIRER +ACQUIRERS +ACQUIRES +ACQUIRING +ACQUISITION +ACQUISITIONAL +ACQUISITIONS +ACQUISITIVE +ACQUISITIVELY +ACQUISITIVENESS +ACQUISITOR +ACQUISITORS +ACQUIT +ACQUITS +ACQUITTAL +ACQUITTALS +ACQUITTANCE +ACQUITTANCES +ACQUITTED +ACQUITTER +ACQUITTERS +ACQUITTING +ACRASIA +ACRASIAS +ACRASIN +ACRASINS +ACRE +ACREAGE +ACREAGES +ACRED +ACRES +ACRID +ACRIDER +ACRIDEST +ACRIDINE +ACRIDINES +ACRIDITIES +ACRIDITY +ACRIDLY +ACRIDNESS +ACRIDNESSES +ACRIFLAVINE +ACRIFLAVINES +ACRIMONIES +ACRIMONIOUS +ACRIMONIOUSLY +ACRIMONIOUSNESS +ACRIMONY +ACRITARCH +ACRITARCHS +ACRITICAL +ACROBAT +ACROBATIC +ACROBATICALLY +ACROBATICS +ACROBATS +ACROCENTRIC +ACROCENTRICS +ACRODONT +ACRODONTS +ACROGEN +ACROGENIC +ACROGENS +ACROLECT +ACROLECTS +ACROLEIN +ACROLEINS +ACROLITH +ACROLITHS +ACROMEGALIC +ACROMEGALICS +ACROMEGALIES +ACROMEGALY +ACROMIA +ACROMIAL +ACROMION +ACRONIC +ACRONICAL +ACRONYCAL +ACRONYM +ACRONYMIC +ACRONYMICALLY +ACRONYMS +ACROPETAL +ACROPETALLY +ACROPHOBE +ACROPHOBES +ACROPHOBIA +ACROPHOBIAS +ACROPOLIS +ACROPOLISES +ACROSOMAL +ACROSOME +ACROSOMES +ACROSPIRE +ACROSPIRES +ACROSS +ACROSTIC +ACROSTICAL +ACROSTICALLY +ACROSTICS +ACROTIC +ACROTISM +ACROTISMS +ACRYLAMIDE +ACRYLAMIDES +ACRYLATE +ACRYLATES +ACRYLIC +ACRYLICS +ACRYLONITRILE +ACRYLONITRILES +ACT +ACTA +ACTABILITIES +ACTABILITY +ACTABLE +ACTED +ACTIN +ACTINAL +ACTINALLY +ACTING +ACTINGS +ACTINIA +ACTINIAE +ACTINIAN +ACTINIANS +ACTINIAS +ACTINIC +ACTINICALLY +ACTINIDE +ACTINIDES +ACTINISM +ACTINISMS +ACTINIUM +ACTINIUMS +ACTINOID +ACTINOIDS +ACTINOLITE +ACTINOLITES +ACTINOMETER +ACTINOMETERS +ACTINOMETRIC +ACTINOMETRIES +ACTINOMETRY +ACTINOMORPHIC +ACTINOMORPHIES +ACTINOMORPHY +ACTINOMYCES +ACTINOMYCETE +ACTINOMYCETES +ACTINOMYCETOUS +ACTINOMYCIN +ACTINOMYCINS +ACTINOMYCOSES +ACTINOMYCOSIS +ACTINOMYCOTIC +ACTINON +ACTINONS +ACTINS +ACTION +ACTIONABLE +ACTIONABLY +ACTIONER +ACTIONERS +ACTIONLESS +ACTIONS +ACTIVATE +ACTIVATED +ACTIVATES +ACTIVATING +ACTIVATION +ACTIVATIONS +ACTIVATOR +ACTIVATORS +ACTIVE +ACTIVELY +ACTIVENESS +ACTIVENESSES +ACTIVES +ACTIVISM +ACTIVISMS +ACTIVIST +ACTIVISTIC +ACTIVISTS +ACTIVITIES +ACTIVITY +ACTIVIZE +ACTIVIZED +ACTIVIZES +ACTIVIZING +ACTOMYOSIN +ACTOMYOSINS +ACTOR +ACTORISH +ACTORLY +ACTORS +ACTRESS +ACTRESSES +ACTRESSY +ACTS +ACTUAL +ACTUALITIES +ACTUALITY +ACTUALIZATION +ACTUALIZATIONS +ACTUALIZE +ACTUALIZED +ACTUALIZES +ACTUALIZING +ACTUALLY +ACTUARIAL +ACTUARIALLY +ACTUARIES +ACTUARY +ACTUATE +ACTUATED +ACTUATES +ACTUATING +ACTUATION +ACTUATIONS +ACTUATOR +ACTUATORS +ACUATE +ACUITIES +ACUITY +ACULEATE +ACULEATED +ACULEI +ACULEUS +ACUMEN +ACUMENS +ACUMINATE +ACUMINATED +ACUMINATES +ACUMINATING +ACUMINOUS +ACUPRESSURE +ACUPRESSURES +ACUPUNCTURE +ACUPUNCTURES +ACUPUNCTURIST +ACUPUNCTURISTS +ACUTANCE +ACUTANCES +ACUTE +ACUTELY +ACUTENESS +ACUTENESSES +ACUTER +ACUTES +ACUTEST +ACYCLIC +ACYCLOVIR +ACYCLOVIRS +ACYL +ACYLATE +ACYLATED +ACYLATES +ACYLATING +ACYLATION +ACYLATIONS +ACYLOIN +ACYLOINS +ACYLS +AD +ADAGE +ADAGES +ADAGIAL +ADAGIO +ADAGIOS +ADAMANCE +ADAMANCES +ADAMANCIES +ADAMANCY +ADAMANT +ADAMANTINE +ADAMANTLY +ADAMANTS +ADAMSITE +ADAMSITES +ADAPT +ADAPTABILITIES +ADAPTABILITY +ADAPTABLE +ADAPTATION +ADAPTATIONAL +ADAPTATIONALLY +ADAPTATIONS +ADAPTED +ADAPTEDNESS +ADAPTEDNESSES +ADAPTER +ADAPTERS +ADAPTING +ADAPTION +ADAPTIONS +ADAPTIVE +ADAPTIVELY +ADAPTIVENESS +ADAPTIVENESSES +ADAPTIVITIES +ADAPTIVITY +ADAPTOR +ADAPTORS +ADAPTS +ADAXIAL +ADD +ADDABLE +ADDAX +ADDAXES +ADDED +ADDEDLY +ADDEND +ADDENDA +ADDENDS +ADDENDUM +ADDENDUMS +ADDER +ADDERS +ADDIBLE +ADDICT +ADDICTED +ADDICTING +ADDICTION +ADDICTIONS +ADDICTIVE +ADDICTS +ADDING +ADDITION +ADDITIONAL +ADDITIONALLY +ADDITIONS +ADDITIVE +ADDITIVELY +ADDITIVES +ADDITIVITIES +ADDITIVITY +ADDITORY +ADDLE +ADDLED +ADDLEPATED +ADDLES +ADDLING +ADDRESS +ADDRESSABILITY +ADDRESSABLE +ADDRESSED +ADDRESSEE +ADDRESSEES +ADDRESSER +ADDRESSERS +ADDRESSES +ADDRESSING +ADDRESSOR +ADDRESSORS +ADDREST +ADDS +ADDUCE +ADDUCED +ADDUCENT +ADDUCER +ADDUCERS +ADDUCES +ADDUCIBLE +ADDUCING +ADDUCT +ADDUCTED +ADDUCTING +ADDUCTION +ADDUCTIONS +ADDUCTIVE +ADDUCTOR +ADDUCTORS +ADDUCTS +ADEEM +ADEEMED +ADEEMING +ADEEMS +ADEMPTION +ADEMPTIONS +ADENINE +ADENINES +ADENITIS +ADENITISES +ADENOCARCINOMA +ADENOCARCINOMAS +ADENOHYPOPHYSES +ADENOHYPOPHYSIS +ADENOID +ADENOIDAL +ADENOIDS +ADENOMA +ADENOMAS +ADENOMATA +ADENOMATOUS +ADENOSES +ADENOSINE +ADENOSINES +ADENOSIS +ADENOVIRAL +ADENOVIRUS +ADENOVIRUSES +ADENYL +ADENYLS +ADEPT +ADEPTER +ADEPTEST +ADEPTLY +ADEPTNESS +ADEPTNESSES +ADEPTS +ADEQUACIES +ADEQUACY +ADEQUATE +ADEQUATELY +ADEQUATENESS +ADEQUATENESSES +ADHERABLE +ADHERE +ADHERED +ADHERENCE +ADHERENCES +ADHEREND +ADHERENDS +ADHERENT +ADHERENTLY +ADHERENTS +ADHERER +ADHERERS +ADHERES +ADHERING +ADHESION +ADHESIONAL +ADHESIONS +ADHESIVE +ADHESIVELY +ADHESIVENESS +ADHESIVENESSES +ADHESIVES +ADHIBIT +ADHIBITED +ADHIBITING +ADHIBITS +ADIABATIC +ADIABATICALLY +ADIEU +ADIEUS +ADIEUX +ADIOS +ADIPIC +ADIPOCERE +ADIPOCERES +ADIPOCYTE +ADIPOCYTES +ADIPOSE +ADIPOSES +ADIPOSIS +ADIPOSITIES +ADIPOSITY +ADIPOUS +ADIT +ADITS +ADJACENCE +ADJACENCES +ADJACENCIES +ADJACENCY +ADJACENT +ADJACENTLY +ADJECTIVAL +ADJECTIVALLY +ADJECTIVE +ADJECTIVELY +ADJECTIVES +ADJOIN +ADJOINED +ADJOINING +ADJOINS +ADJOINT +ADJOINTS +ADJOURN +ADJOURNED +ADJOURNING +ADJOURNMENT +ADJOURNMENTS +ADJOURNS +ADJUDGE +ADJUDGED +ADJUDGES +ADJUDGING +ADJUDICATE +ADJUDICATED +ADJUDICATES +ADJUDICATING +ADJUDICATION +ADJUDICATIONS +ADJUDICATIVE +ADJUDICATOR +ADJUDICATORS +ADJUDICATORY +ADJUNCT +ADJUNCTION +ADJUNCTIONS +ADJUNCTIVE +ADJUNCTLY +ADJUNCTS +ADJURATION +ADJURATIONS +ADJURATORY +ADJURE +ADJURED +ADJURER +ADJURERS +ADJURES +ADJURING +ADJUROR +ADJURORS +ADJUST +ADJUSTABILITIES +ADJUSTABILITY +ADJUSTABLE +ADJUSTED +ADJUSTER +ADJUSTERS +ADJUSTING +ADJUSTIVE +ADJUSTMENT +ADJUSTMENTAL +ADJUSTMENTS +ADJUSTOR +ADJUSTORS +ADJUSTS +ADJUTANCIES +ADJUTANCY +ADJUTANT +ADJUTANTS +ADJUVANT +ADJUVANTS +ADMAN +ADMASS +ADMASSES +ADMEASURE +ADMEASURED +ADMEASUREMENT +ADMEASUREMENTS +ADMEASURES +ADMEASURING +ADMEN +ADMINISTER +ADMINISTERED +ADMINISTERING +ADMINISTERS +ADMINISTRABLE +ADMINISTRANT +ADMINISTRANTS +ADMINISTRATE +ADMINISTRATED +ADMINISTRATES +ADMINISTRATING +ADMINISTRATION +ADMINISTRATIONS +ADMINISTRATIVE +ADMINISTRATOR +ADMINISTRATORS +ADMINISTRATRIX +ADMIRABILITIES +ADMIRABILITY +ADMIRABLE +ADMIRABLENESS +ADMIRABLENESSES +ADMIRABLY +ADMIRAL +ADMIRALS +ADMIRALTIES +ADMIRALTY +ADMIRATION +ADMIRATIONS +ADMIRE +ADMIRED +ADMIRER +ADMIRERS +ADMIRES +ADMIRING +ADMIRINGLY +ADMISSIBILITIES +ADMISSIBILITY +ADMISSIBLE +ADMISSION +ADMISSIONS +ADMISSIVE +ADMIT +ADMITS +ADMITTANCE +ADMITTANCES +ADMITTED +ADMITTEDLY +ADMITTEE +ADMITTEES +ADMITTER +ADMITTERS +ADMITTING +ADMIX +ADMIXED +ADMIXES +ADMIXING +ADMIXT +ADMIXTURE +ADMIXTURES +ADMONISH +ADMONISHED +ADMONISHER +ADMONISHERS +ADMONISHES +ADMONISHING +ADMONISHINGLY +ADMONISHMENT +ADMONISHMENTS +ADMONITION +ADMONITIONS +ADMONITOR +ADMONITORILY +ADMONITORS +ADMONITORY +ADNATE +ADNATION +ADNATIONS +ADNEXA +ADNEXAL +ADNOUN +ADNOUNS +ADO +ADOBE +ADOBELIKE +ADOBES +ADOBO +ADOBOS +ADOLESCENCE +ADOLESCENCES +ADOLESCENT +ADOLESCENTLY +ADOLESCENTS +ADONIS +ADONISES +ADOPT +ADOPTABILITIES +ADOPTABILITY +ADOPTABLE +ADOPTED +ADOPTEE +ADOPTEES +ADOPTER +ADOPTERS +ADOPTIANISM +ADOPTIANISMS +ADOPTING +ADOPTION +ADOPTIONISM +ADOPTIONISMS +ADOPTIONIST +ADOPTIONISTS +ADOPTIONS +ADOPTIVE +ADOPTIVELY +ADOPTS +ADORABILITIES +ADORABILITY +ADORABLE +ADORABLENESS +ADORABLENESSES +ADORABLY +ADORATION +ADORATIONS +ADORE +ADORED +ADORER +ADORERS +ADORES +ADORING +ADORINGLY +ADORN +ADORNED +ADORNER +ADORNERS +ADORNING +ADORNMENT +ADORNMENTS +ADORNS +ADOS +ADOWN +ADOZE +ADRENAL +ADRENALECTOMIES +ADRENALECTOMY +ADRENALIN +ADRENALINE +ADRENALINES +ADRENALINS +ADRENALIZED +ADRENALLY +ADRENALS +ADRENERGIC +ADRENERGICALLY +ADRENOCHROME +ADRENOCHROMES +ADRENOCORTICAL +ADRIFT +ADROIT +ADROITER +ADROITEST +ADROITLY +ADROITNESS +ADROITNESSES +ADS +ADSCITITIOUS +ADSCRIPT +ADSCRIPTS +ADSORB +ADSORBABLE +ADSORBATE +ADSORBATES +ADSORBED +ADSORBENT +ADSORBENTS +ADSORBER +ADSORBERS +ADSORBING +ADSORBS +ADSORPTION +ADSORPTIONS +ADSORPTIVE +ADULARIA +ADULARIAS +ADULATE +ADULATED +ADULATES +ADULATING +ADULATION +ADULATIONS +ADULATOR +ADULATORS +ADULATORY +ADULT +ADULTERANT +ADULTERANTS +ADULTERATE +ADULTERATED +ADULTERATES +ADULTERATING +ADULTERATION +ADULTERATIONS +ADULTERATOR +ADULTERATORS +ADULTERER +ADULTERERS +ADULTERESS +ADULTERESSES +ADULTERIES +ADULTERINE +ADULTEROUS +ADULTEROUSLY +ADULTERY +ADULTHOOD +ADULTHOODS +ADULTLIKE +ADULTLY +ADULTNESS +ADULTNESSES +ADULTRESS +ADULTRESSES +ADULTS +ADUMBRAL +ADUMBRATE +ADUMBRATED +ADUMBRATES +ADUMBRATING +ADUMBRATION +ADUMBRATIONS +ADUMBRATIVE +ADUMBRATIVELY +ADUNC +ADUNCATE +ADUNCOUS +ADUST +ADVANCE +ADVANCED +ADVANCEMENT +ADVANCEMENTS +ADVANCER +ADVANCERS +ADVANCES +ADVANCING +ADVANTAGE +ADVANTAGED +ADVANTAGEOUS +ADVANTAGEOUSLY +ADVANTAGES +ADVANTAGING +ADVECT +ADVECTED +ADVECTING +ADVECTION +ADVECTIONS +ADVECTIVE +ADVECTS +ADVENT +ADVENTITIA +ADVENTITIAL +ADVENTITIAS +ADVENTITIOUS +ADVENTITIOUSLY +ADVENTIVE +ADVENTIVES +ADVENTS +ADVENTURE +ADVENTURED +ADVENTURER +ADVENTURERS +ADVENTURES +ADVENTURESOME +ADVENTURESS +ADVENTURESSES +ADVENTURING +ADVENTURISM +ADVENTURISMS +ADVENTURIST +ADVENTURISTIC +ADVENTURISTS +ADVENTUROUS +ADVENTUROUSLY +ADVENTUROUSNESS +ADVERB +ADVERBIAL +ADVERBIALLY +ADVERBIALS +ADVERBS +ADVERSARIAL +ADVERSARIES +ADVERSARINESS +ADVERSARINESSES +ADVERSARY +ADVERSATIVE +ADVERSATIVELY +ADVERSATIVES +ADVERSE +ADVERSELY +ADVERSENESS +ADVERSENESSES +ADVERSITIES +ADVERSITY +ADVERT +ADVERTED +ADVERTENCE +ADVERTENCES +ADVERTENCIES +ADVERTENCY +ADVERTENT +ADVERTENTLY +ADVERTING +ADVERTISE +ADVERTISED +ADVERTISEMENT +ADVERTISEMENTS +ADVERTISER +ADVERTISERS +ADVERTISES +ADVERTISING +ADVERTISINGS +ADVERTIZE +ADVERTIZED +ADVERTIZEMENT +ADVERTIZEMENTS +ADVERTIZES +ADVERTIZING +ADVERTORIAL +ADVERTORIALS +ADVERTS +ADVICE +ADVICES +ADVISABILITIES +ADVISABILITY +ADVISABLE +ADVISABLENESS +ADVISABLENESSES +ADVISABLY +ADVISE +ADVISED +ADVISEDLY +ADVISEE +ADVISEES +ADVISEMENT +ADVISEMENTS +ADVISER +ADVISERS +ADVISES +ADVISING +ADVISOR +ADVISORIES +ADVISORS +ADVISORY +ADVOCACIES +ADVOCACY +ADVOCATE +ADVOCATED +ADVOCATES +ADVOCATING +ADVOCATION +ADVOCATIONS +ADVOCATIVE +ADVOCATOR +ADVOCATORS +ADVOWSON +ADVOWSONS +ADWOMAN +ADWOMEN +ADYNAMIA +ADYNAMIAS +ADYNAMIC +ADYTA +ADYTUM +ADZ +ADZE +ADZED +ADZES +ADZING +ADZUKI +ADZUKIS +AE +AECIA +AECIAL +AECIDIA +AECIDIAL +AECIDIUM +AECIOSPORE +AECIOSPORES +AECIUM +AEDES +AEDILE +AEDILES +AEDINE +AEGIS +AEGISES +AENEOUS +AENEUS +AEOLIAN +AEON +AEONIAN +AEONIC +AEONS +AEPYORNIS +AEPYORNISES +AEQUORIN +AEQUORINS +AERATE +AERATED +AERATES +AERATING +AERATION +AERATIONS +AERATOR +AERATORS +AERENCHYMA +AERENCHYMAS +AERIAL +AERIALIST +AERIALISTS +AERIALLY +AERIALS +AERIE +AERIED +AERIER +AERIES +AERIEST +AERIFIED +AERIFIES +AERIFORM +AERIFY +AERIFYING +AERILY +AERO +AEROBAT +AEROBATIC +AEROBATICS +AEROBATS +AEROBE +AEROBES +AEROBIA +AEROBIC +AEROBICALLY +AEROBICIZE +AEROBICIZED +AEROBICIZES +AEROBICIZING +AEROBICS +AEROBIOLOGICAL +AEROBIOLOGIES +AEROBIOLOGY +AEROBIOSES +AEROBIOSIS +AEROBIUM +AEROBRAKE +AEROBRAKED +AEROBRAKES +AEROBRAKING +AERODROME +AERODROMES +AERODUCT +AERODUCTS +AERODYNAMIC +AERODYNAMICAL +AERODYNAMICALLY +AERODYNAMICIST +AERODYNAMICISTS +AERODYNAMICS +AERODYNE +AERODYNES +AEROELASTIC +AEROELASTICITY +AEROEMBOLISM +AEROEMBOLISMS +AEROFOIL +AEROFOILS +AEROGEL +AEROGELS +AEROGRAM +AEROGRAMME +AEROGRAMMES +AEROGRAMS +AEROLITE +AEROLITES +AEROLITH +AEROLITHS +AEROLITIC +AEROLOGIC +AEROLOGIES +AEROLOGY +AEROMAGNETIC +AEROMECHANICS +AEROMEDICAL +AEROMEDICINE +AEROMEDICINES +AEROMETER +AEROMETERS +AEROMETRIES +AEROMETRY +AERONAUT +AERONAUTIC +AERONAUTICAL +AERONAUTICALLY +AERONAUTICS +AERONAUTS +AERONOMER +AERONOMERS +AERONOMIC +AERONOMICAL +AERONOMIES +AERONOMIST +AERONOMISTS +AERONOMY +AEROPAUSE +AEROPAUSES +AEROPHOBE +AEROPHOBES +AEROPHORE +AEROPHORES +AEROPHYTE +AEROPHYTES +AEROPLANE +AEROPLANES +AEROPULSE +AEROPULSES +AEROSAT +AEROSATS +AEROSCOPE +AEROSCOPES +AEROSOL +AEROSOLIZATION +AEROSOLIZATIONS +AEROSOLIZE +AEROSOLIZED +AEROSOLIZES +AEROSOLIZING +AEROSOLS +AEROSPACE +AEROSPACES +AEROSTAT +AEROSTATICS +AEROSTATS +AERUGO +AERUGOS +AERY +AESTHESIA +AESTHESIAS +AESTHETE +AESTHETES +AESTHETIC +AESTHETICAL +AESTHETICALLY +AESTHETICIAN +AESTHETICIANS +AESTHETICISM +AESTHETICISMS +AESTHETICIZE +AESTHETICIZED +AESTHETICIZES +AESTHETICIZING +AESTHETICS +AESTIVAL +AESTIVATE +AESTIVATED +AESTIVATES +AESTIVATING +AESTIVATION +AESTIVATIONS +AETHER +AETHEREAL +AETHERIC +AETHERS +AETIOLOGIES +AETIOLOGY +AFAR +AFARS +AFEARD +AFEARED +AFEBRILE +AFF +AFFABILITIES +AFFABILITY +AFFABLE +AFFABLY +AFFAIR +AFFAIRE +AFFAIRES +AFFAIRS +AFFECT +AFFECTABILITIES +AFFECTABILITY +AFFECTABLE +AFFECTATION +AFFECTATIONS +AFFECTED +AFFECTEDLY +AFFECTEDNESS +AFFECTEDNESSES +AFFECTER +AFFECTERS +AFFECTING +AFFECTINGLY +AFFECTION +AFFECTIONAL +AFFECTIONALLY +AFFECTIONATE +AFFECTIONATELY +AFFECTIONED +AFFECTIONLESS +AFFECTIONS +AFFECTIVE +AFFECTIVELY +AFFECTIVITIES +AFFECTIVITY +AFFECTLESS +AFFECTLESSNESS +AFFECTS +AFFENPINSCHER +AFFENPINSCHERS +AFFERENT +AFFERENTLY +AFFERENTS +AFFIANCE +AFFIANCED +AFFIANCES +AFFIANCING +AFFIANT +AFFIANTS +AFFICHE +AFFICHES +AFFICIONADO +AFFICIONADOS +AFFIDAVIT +AFFIDAVITS +AFFILIATE +AFFILIATED +AFFILIATES +AFFILIATING +AFFILIATION +AFFILIATIONS +AFFINAL +AFFINE +AFFINED +AFFINELY +AFFINES +AFFINITIES +AFFINITY +AFFIRM +AFFIRMABLE +AFFIRMANCE +AFFIRMANCES +AFFIRMANT +AFFIRMANTS +AFFIRMATION +AFFIRMATIONS +AFFIRMATIVE +AFFIRMATIVELY +AFFIRMATIVES +AFFIRMED +AFFIRMER +AFFIRMERS +AFFIRMING +AFFIRMS +AFFIX +AFFIXABLE +AFFIXAL +AFFIXATION +AFFIXATIONS +AFFIXED +AFFIXER +AFFIXERS +AFFIXES +AFFIXIAL +AFFIXING +AFFIXMENT +AFFIXMENTS +AFFIXTURE +AFFIXTURES +AFFLATUS +AFFLATUSES +AFFLICT +AFFLICTED +AFFLICTER +AFFLICTERS +AFFLICTING +AFFLICTION +AFFLICTIONS +AFFLICTIVE +AFFLICTIVELY +AFFLICTS +AFFLUENCE +AFFLUENCES +AFFLUENCIES +AFFLUENCY +AFFLUENT +AFFLUENTLY +AFFLUENTS +AFFLUX +AFFLUXES +AFFORD +AFFORDABILITIES +AFFORDABILITY +AFFORDABLE +AFFORDABLY +AFFORDED +AFFORDING +AFFORDS +AFFOREST +AFFORESTATION +AFFORESTATIONS +AFFORESTED +AFFORESTING +AFFORESTS +AFFRAY +AFFRAYED +AFFRAYER +AFFRAYERS +AFFRAYING +AFFRAYS +AFFRICATE +AFFRICATED +AFFRICATES +AFFRICATING +AFFRICATIVE +AFFRICATIVES +AFFRIGHT +AFFRIGHTED +AFFRIGHTING +AFFRIGHTS +AFFRONT +AFFRONTED +AFFRONTING +AFFRONTS +AFFUSION +AFFUSIONS +AFGHAN +AFGHANI +AFGHANIS +AFGHANS +AFICIONADA +AFICIONADAS +AFICIONADO +AFICIONADOS +AFIELD +AFIRE +AFLAME +AFLATOXIN +AFLATOXINS +AFLOAT +AFLUTTER +AFOOT +AFORE +AFOREHAND +AFOREMENTIONED +AFORESAID +AFORETHOUGHT +AFORETIME +AFOUL +AFRAID +AFREET +AFREETS +AFRESH +AFRIT +AFRITS +AFT +AFTER +AFTERBIRTH +AFTERBIRTHS +AFTERBURNER +AFTERBURNERS +AFTERCARE +AFTERCARES +AFTERCLAP +AFTERCLAPS +AFTERDAMP +AFTERDAMPS +AFTERDECK +AFTERDECKS +AFTEREFFECT +AFTEREFFECTS +AFTERGLOW +AFTERGLOWS +AFTERIMAGE +AFTERIMAGES +AFTERLIFE +AFTERLIFES +AFTERLIVES +AFTERMARKET +AFTERMARKETS +AFTERMATH +AFTERMATHS +AFTERMOST +AFTERNOON +AFTERNOONS +AFTERPAIN +AFTERPAINS +AFTERPIECE +AFTERPIECES +AFTERS +AFTERSHAVE +AFTERSHAVES +AFTERSHOCK +AFTERSHOCKS +AFTERTASTE +AFTERTASTES +AFTERTAX +AFTERTHOUGHT +AFTERTHOUGHTS +AFTERTIME +AFTERTIMES +AFTERWARD +AFTERWARDS +AFTERWORD +AFTERWORDS +AFTERWORLD +AFTERWORLDS +AFTMOST +AFTOSA +AFTOSAS +AG +AGA +AGAIN +AGAINST +AGALACTIA +AGALACTIAS +AGALLOCH +AGALLOCHS +AGALWOOD +AGALWOODS +AGAMA +AGAMAS +AGAMETE +AGAMETES +AGAMIC +AGAMID +AGAMIDS +AGAMOSPERMIES +AGAMOSPERMY +AGAMOUS +AGAPAE +AGAPAI +AGAPANTHUS +AGAPANTHUSES +AGAPE +AGAPEIC +AGAPES +AGAR +AGARIC +AGARICS +AGAROSE +AGAROSES +AGARS +AGAS +AGATE +AGATES +AGATEWARE +AGATEWARES +AGATIZE +AGATIZED +AGATIZES +AGATIZING +AGATOID +AGAVE +AGAVES +AGAZE +AGE +AGED +AGEDLY +AGEDNESS +AGEDNESSES +AGEE +AGEING +AGEINGS +AGEISM +AGEISMS +AGEIST +AGEISTS +AGELESS +AGELESSLY +AGELESSNESS +AGELESSNESSES +AGELONG +AGEMATE +AGEMATES +AGENCIES +AGENCY +AGENDA +AGENDALESS +AGENDAS +AGENDUM +AGENDUMS +AGENE +AGENES +AGENESES +AGENESIA +AGENESIAS +AGENESIS +AGENETIC +AGENIZE +AGENIZED +AGENIZES +AGENIZING +AGENT +AGENTED +AGENTIAL +AGENTING +AGENTINGS +AGENTIVAL +AGENTIVE +AGENTIVES +AGENTRIES +AGENTRY +AGENTS +AGER +AGERATUM +AGERATUMS +AGERS +AGES +AGGADA +AGGADAH +AGGADAHS +AGGADAS +AGGADIC +AGGADOT +AGGADOTH +AGGER +AGGERS +AGGIE +AGGIES +AGGIORNAMENTO +AGGIORNAMENTOS +AGGLOMERATE +AGGLOMERATED +AGGLOMERATES +AGGLOMERATING +AGGLOMERATION +AGGLOMERATIONS +AGGLOMERATIVE +AGGLUTINABILITY +AGGLUTINABLE +AGGLUTINATE +AGGLUTINATED +AGGLUTINATES +AGGLUTINATING +AGGLUTINATION +AGGLUTINATIONS +AGGLUTINATIVE +AGGLUTININ +AGGLUTININS +AGGLUTINOGEN +AGGLUTINOGENIC +AGGLUTINOGENS +AGGRADATION +AGGRADATIONS +AGGRADE +AGGRADED +AGGRADES +AGGRADING +AGGRANDISE +AGGRANDISED +AGGRANDISES +AGGRANDISING +AGGRANDIZE +AGGRANDIZED +AGGRANDIZEMENT +AGGRANDIZEMENTS +AGGRANDIZER +AGGRANDIZERS +AGGRANDIZES +AGGRANDIZING +AGGRAVATE +AGGRAVATED +AGGRAVATES +AGGRAVATING +AGGRAVATION +AGGRAVATIONS +AGGREGATE +AGGREGATED +AGGREGATELY +AGGREGATENESS +AGGREGATENESSES +AGGREGATES +AGGREGATING +AGGREGATION +AGGREGATIONAL +AGGREGATIONS +AGGREGATIVE +AGGREGATIVELY +AGGRESS +AGGRESSED +AGGRESSES +AGGRESSING +AGGRESSION +AGGRESSIONS +AGGRESSIVE +AGGRESSIVELY +AGGRESSIVENESS +AGGRESSIVITIES +AGGRESSIVITY +AGGRESSOR +AGGRESSORS +AGGRIEVE +AGGRIEVED +AGGRIEVEDLY +AGGRIEVEMENT +AGGRIEVEMENTS +AGGRIEVES +AGGRIEVING +AGGRO +AGGROS +AGHA +AGHAS +AGHAST +AGILE +AGILELY +AGILENESS +AGILENESSES +AGILITIES +AGILITY +AGIN +AGING +AGINGS +AGINNER +AGINNERS +AGIO +AGIOS +AGIOTAGE +AGIOTAGES +AGISM +AGISMS +AGIST +AGISTED +AGISTING +AGISTS +AGITA +AGITABLE +AGITAS +AGITATE +AGITATED +AGITATEDLY +AGITATES +AGITATING +AGITATION +AGITATIONAL +AGITATIONS +AGITATIVE +AGITATO +AGITATOR +AGITATORS +AGITPROP +AGITPROPS +AGLARE +AGLEAM +AGLEE +AGLET +AGLETS +AGLEY +AGLIMMER +AGLITTER +AGLOW +AGLY +AGLYCON +AGLYCONE +AGLYCONES +AGLYCONS +AGMA +AGMAS +AGMINATE +AGNAIL +AGNAILS +AGNATE +AGNATES +AGNATIC +AGNATICAL +AGNATION +AGNATIONS +AGNIZE +AGNIZED +AGNIZES +AGNIZING +AGNOMEN +AGNOMENS +AGNOMINA +AGNOSIA +AGNOSIAS +AGNOSTIC +AGNOSTICISM +AGNOSTICISMS +AGNOSTICS +AGO +AGOG +AGON +AGONAL +AGONE +AGONES +AGONIC +AGONIES +AGONISE +AGONISED +AGONISES +AGONISING +AGONIST +AGONISTES +AGONISTIC +AGONISTICALLY +AGONISTS +AGONIZE +AGONIZED +AGONIZES +AGONIZING +AGONIZINGLY +AGONS +AGONY +AGORA +AGORAE +AGORAPHOBE +AGORAPHOBES +AGORAPHOBIA +AGORAPHOBIAS +AGORAPHOBIC +AGORAPHOBICS +AGORAS +AGOROT +AGOROTH +AGOUTI +AGOUTIES +AGOUTIS +AGOUTY +AGRAFE +AGRAFES +AGRAFFE +AGRAFFES +AGRANULOCYTE +AGRANULOCYTES +AGRANULOCYTOSES +AGRANULOCYTOSIS +AGRAPHA +AGRAPHIA +AGRAPHIAS +AGRAPHIC +AGRARIAN +AGRARIANISM +AGRARIANISMS +AGRARIANS +AGRAVIC +AGREE +AGREEABILITIES +AGREEABILITY +AGREEABLE +AGREEABLENESS +AGREEABLENESSES +AGREEABLY +AGREED +AGREEING +AGREEMENT +AGREEMENTS +AGREES +AGRESTAL +AGRESTIC +AGRIA +AGRIAS +AGRIBUSINESS +AGRIBUSINESSES +AGRIBUSINESSMAN +AGRIBUSINESSMEN +AGRICHEMICAL +AGRICHEMICALS +AGRICULTURAL +AGRICULTURALIST +AGRICULTURALLY +AGRICULTURE +AGRICULTURES +AGRICULTURIST +AGRICULTURISTS +AGRIMONIES +AGRIMONY +AGROCHEMICAL +AGROCHEMICALS +AGROFORESTER +AGROFORESTERS +AGROFORESTRIES +AGROFORESTRY +AGROLOGIC +AGROLOGIES +AGROLOGY +AGRONOMIC +AGRONOMICALLY +AGRONOMIES +AGRONOMIST +AGRONOMISTS +AGRONOMY +AGROUND +AGRYPNIA +AGRYPNIAS +AGS +AGUACATE +AGUACATES +AGUE +AGUELIKE +AGUES +AGUEWEED +AGUEWEEDS +AGUISH +AGUISHLY +AH +AHA +AHCHOO +AHEAD +AHED +AHEM +AHI +AHIMSA +AHIMSAS +AHING +AHIS +AHISTORIC +AHISTORICAL +AHOLD +AHOLDS +AHORSE +AHOY +AHS +AHULL +AI +AIBLINS +AID +AIDE +AIDED +AIDER +AIDERS +AIDES +AIDFUL +AIDING +AIDLESS +AIDMAN +AIDMEN +AIDS +AIGLET +AIGLETS +AIGRET +AIGRETS +AIGRETTE +AIGRETTES +AIGUILLE +AIGUILLES +AIGUILLETTE +AIGUILLETTES +AIKIDO +AIKIDOS +AIL +AILANTHIC +AILANTHUS +AILANTHUSES +AILED +AILERON +AILERONS +AILING +AILMENT +AILMENTS +AILS +AILUROPHILE +AILUROPHILES +AILUROPHOBE +AILUROPHOBES +AIM +AIMED +AIMER +AIMERS +AIMFUL +AIMFULLY +AIMING +AIMLESS +AIMLESSLY +AIMLESSNESS +AIMLESSNESSES +AIMS +AIN +AINS +AINSELL +AINSELLS +AIOLI +AIOLIS +AIR +AIRBAG +AIRBAGS +AIRBOAT +AIRBOATS +AIRBORNE +AIRBOUND +AIRBRUSH +AIRBRUSHED +AIRBRUSHES +AIRBRUSHING +AIRBURST +AIRBURSTS +AIRBUS +AIRBUSES +AIRBUSSES +AIRCHECK +AIRCHECKS +AIRCOACH +AIRCOACHES +AIRCRAFT +AIRCREW +AIRCREWS +AIRDATE +AIRDATES +AIRDROME +AIRDROMES +AIRDROP +AIRDROPPED +AIRDROPPING +AIRDROPS +AIRED +AIRER +AIRERS +AIREST +AIRFARE +AIRFARES +AIRFIELD +AIRFIELDS +AIRFLOW +AIRFLOWS +AIRFOIL +AIRFOILS +AIRFRAME +AIRFRAMES +AIRFREIGHT +AIRFREIGHTED +AIRFREIGHTING +AIRFREIGHTS +AIRGLOW +AIRGLOWS +AIRHEAD +AIRHEADED +AIRHEADS +AIRHOLE +AIRHOLES +AIRIER +AIRIEST +AIRILY +AIRINESS +AIRINESSES +AIRING +AIRINGS +AIRLESS +AIRLESSNESS +AIRLESSNESSES +AIRLIFT +AIRLIFTED +AIRLIFTING +AIRLIFTS +AIRLIKE +AIRLINE +AIRLINER +AIRLINERS +AIRLINES +AIRMAIL +AIRMAILED +AIRMAILING +AIRMAILS +AIRMAN +AIRMANSHIP +AIRMANSHIPS +AIRMEN +AIRMOBILE +AIRN +AIRNS +AIRPARK +AIRPARKS +AIRPLANE +AIRPLANES +AIRPLAY +AIRPLAYS +AIRPORT +AIRPORTS +AIRPOST +AIRPOSTS +AIRPOWER +AIRPOWERS +AIRPROOF +AIRPROOFED +AIRPROOFING +AIRPROOFS +AIRS +AIRSCAPE +AIRSCAPES +AIRSCREW +AIRSCREWS +AIRSHED +AIRSHEDS +AIRSHIP +AIRSHIPS +AIRSHOT +AIRSHOTS +AIRSHOW +AIRSHOWS +AIRSICK +AIRSICKNESS +AIRSICKNESSES +AIRSPACE +AIRSPACES +AIRSPEED +AIRSPEEDS +AIRSTREAM +AIRSTREAMS +AIRSTRIKE +AIRSTRIKES +AIRSTRIP +AIRSTRIPS +AIRT +AIRTED +AIRTH +AIRTHED +AIRTHING +AIRTHS +AIRTIGHT +AIRTIGHTNESS +AIRTIGHTNESSES +AIRTIME +AIRTIMES +AIRTING +AIRTS +AIRWARD +AIRWAVE +AIRWAVES +AIRWAY +AIRWAYS +AIRWISE +AIRWOMAN +AIRWOMEN +AIRWORTHIER +AIRWORTHIEST +AIRWORTHINESS +AIRWORTHINESSES +AIRWORTHY +AIRY +AIS +AISLE +AISLED +AISLES +AISLEWAY +AISLEWAYS +AIT +AITCH +AITCHBONE +AITCHBONES +AITCHES +AITS +AIVER +AIVERS +AJAR +AJEE +AJIVA +AJIVAS +AJOWAN +AJOWANS +AJUGA +AJUGAS +AKEE +AKEES +AKELA +AKELAS +AKENE +AKENES +AKIMBO +AKIN +AKINESIA +AKINESIAS +AKINETIC +AKVAVIT +AKVAVITS +AL +ALA +ALABASTER +ALABASTERS +ALABASTRINE +ALACHLOR +ALACHLORS +ALACK +ALACKADAY +ALACRITIES +ALACRITOUS +ALACRITY +ALAE +ALAMEDA +ALAMEDAS +ALAMO +ALAMODE +ALAMODES +ALAMOS +ALAN +ALAND +ALANDS +ALANE +ALANG +ALANIN +ALANINE +ALANINES +ALANINS +ALANS +ALANT +ALANTS +ALANYL +ALANYLS +ALAR +ALARM +ALARMABLE +ALARMED +ALARMEDLY +ALARMING +ALARMINGLY +ALARMISM +ALARMISMS +ALARMIST +ALARMISTS +ALARMS +ALARUM +ALARUMED +ALARUMING +ALARUMS +ALARY +ALAS +ALASKA +ALASKAS +ALASTOR +ALASTORS +ALATE +ALATED +ALATES +ALATION +ALATIONS +ALB +ALBA +ALBACORE +ALBACORES +ALBAS +ALBATA +ALBATAS +ALBATROSS +ALBATROSSES +ALBEDO +ALBEDOES +ALBEDOS +ALBEIT +ALBERTITE +ALBERTITES +ALBESCENT +ALBICORE +ALBICORES +ALBINAL +ALBINIC +ALBINISM +ALBINISMS +ALBINISTIC +ALBINO +ALBINOS +ALBINOTIC +ALBITE +ALBITES +ALBITIC +ALBITICAL +ALBIZIA +ALBIZIAS +ALBIZZIA +ALBIZZIAS +ALBS +ALBUM +ALBUMEN +ALBUMENS +ALBUMIN +ALBUMINOUS +ALBUMINS +ALBUMINURIA +ALBUMINURIAS +ALBUMINURIC +ALBUMOSE +ALBUMOSES +ALBUMS +ALBURNOUS +ALBURNUM +ALBURNUMS +ALBUTEROL +ALBUTEROLS +ALCADE +ALCADES +ALCAHEST +ALCAHESTS +ALCAIC +ALCAICS +ALCAIDE +ALCAIDES +ALCALDE +ALCALDES +ALCAYDE +ALCAYDES +ALCAZAR +ALCAZARS +ALCHEMIC +ALCHEMICAL +ALCHEMICALLY +ALCHEMIES +ALCHEMIST +ALCHEMISTIC +ALCHEMISTICAL +ALCHEMISTS +ALCHEMIZE +ALCHEMIZED +ALCHEMIZES +ALCHEMIZING +ALCHEMY +ALCHYMIES +ALCHYMY +ALCID +ALCIDINE +ALCIDS +ALCOHOL +ALCOHOLIC +ALCOHOLICALLY +ALCOHOLICS +ALCOHOLISM +ALCOHOLISMS +ALCOHOLS +ALCOVE +ALCOVED +ALCOVES +ALCYONARIAN +ALCYONARIANS +ALDEHYDE +ALDEHYDES +ALDEHYDIC +ALDER +ALDERFLIES +ALDERFLY +ALDERMAN +ALDERMANIC +ALDERMEN +ALDERS +ALDERWOMAN +ALDERWOMEN +ALDICARB +ALDICARBS +ALDOL +ALDOLASE +ALDOLASES +ALDOLIZATION +ALDOLIZATIONS +ALDOLS +ALDOSE +ALDOSES +ALDOSTERONE +ALDOSTERONES +ALDOSTERONISM +ALDOSTERONISMS +ALDRIN +ALDRINS +ALE +ALEATORIC +ALEATORY +ALEC +ALECITHAL +ALECS +ALEE +ALEF +ALEFS +ALEGAR +ALEGARS +ALEHOUSE +ALEHOUSES +ALEMBIC +ALEMBICS +ALENCON +ALENCONS +ALEPH +ALEPHS +ALERT +ALERTED +ALERTER +ALERTEST +ALERTING +ALERTLY +ALERTNESS +ALERTNESSES +ALERTS +ALES +ALEURON +ALEURONE +ALEURONES +ALEURONIC +ALEURONS +ALEVIN +ALEVINS +ALEWIFE +ALEWIVES +ALEXANDER +ALEXANDERS +ALEXANDRINE +ALEXANDRINES +ALEXANDRITE +ALEXANDRITES +ALEXIA +ALEXIAS +ALEXIN +ALEXINE +ALEXINES +ALEXINS +ALFA +ALFAKI +ALFAKIS +ALFALFA +ALFALFAS +ALFAQUI +ALFAQUIN +ALFAQUINS +ALFAQUIS +ALFAS +ALFILARIA +ALFILARIAS +ALFILERIA +ALFILERIAS +ALFORJA +ALFORJAS +ALFREDO +ALFRESCO +ALGA +ALGAE +ALGAECIDE +ALGAECIDES +ALGAL +ALGAROBA +ALGAROBAS +ALGARROBA +ALGARROBAS +ALGARROBO +ALGARROBOS +ALGAS +ALGEBRA +ALGEBRAIC +ALGEBRAICALLY +ALGEBRAIST +ALGEBRAISTS +ALGEBRAS +ALGERINE +ALGERINES +ALGICIDAL +ALGICIDE +ALGICIDES +ALGID +ALGIDITIES +ALGIDITY +ALGIDNESS +ALGIDNESSES +ALGIN +ALGINATE +ALGINATES +ALGINS +ALGOID +ALGOLAGNIA +ALGOLAGNIAC +ALGOLAGNIACS +ALGOLAGNIAS +ALGOLOGICAL +ALGOLOGIES +ALGOLOGIST +ALGOLOGISTS +ALGOLOGY +ALGOMETER +ALGOMETERS +ALGOMETRIES +ALGOMETRY +ALGOR +ALGORISM +ALGORISMS +ALGORITHM +ALGORITHMIC +ALGORITHMICALLY +ALGORITHMS +ALGORS +ALGUM +ALGUMS +ALIAS +ALIASES +ALIASING +ALIASINGS +ALIBI +ALIBIED +ALIBIES +ALIBIING +ALIBIS +ALIBLE +ALICYCLIC +ALIDAD +ALIDADE +ALIDADES +ALIDADS +ALIEN +ALIENABILITIES +ALIENABILITY +ALIENABLE +ALIENAGE +ALIENAGES +ALIENATE +ALIENATED +ALIENATES +ALIENATING +ALIENATION +ALIENATIONS +ALIENATOR +ALIENATORS +ALIENED +ALIENEE +ALIENEES +ALIENER +ALIENERS +ALIENING +ALIENISM +ALIENISMS +ALIENIST +ALIENISTS +ALIENLY +ALIENNESS +ALIENNESSES +ALIENOR +ALIENORS +ALIENS +ALIF +ALIFORM +ALIFS +ALIGHT +ALIGHTED +ALIGHTING +ALIGHTMENT +ALIGHTMENTS +ALIGHTS +ALIGN +ALIGNED +ALIGNER +ALIGNERS +ALIGNING +ALIGNMENT +ALIGNMENTS +ALIGNS +ALIKE +ALIKENESS +ALIKENESSES +ALIMENT +ALIMENTAL +ALIMENTARY +ALIMENTATION +ALIMENTATIONS +ALIMENTED +ALIMENTING +ALIMENTS +ALIMONIED +ALIMONIES +ALIMONY +ALINE +ALINED +ALINEMENT +ALINEMENTS +ALINER +ALINERS +ALINES +ALINING +ALIPED +ALIPEDS +ALIPHATIC +ALIQUANT +ALIQUOT +ALIQUOTS +ALIST +ALIT +ALITERACIES +ALITERACY +ALITERATE +ALITERATES +ALIUNDE +ALIVE +ALIVENESS +ALIVENESSES +ALIYA +ALIYAH +ALIYAHS +ALIYAS +ALIYOS +ALIYOT +ALIZARIN +ALIZARINE +ALIZARINES +ALIZARINS +ALKAHEST +ALKAHESTIC +ALKAHESTS +ALKALI +ALKALIC +ALKALIES +ALKALIFIED +ALKALIFIES +ALKALIFY +ALKALIFYING +ALKALIMETER +ALKALIMETERS +ALKALIMETRIES +ALKALIMETRY +ALKALIN +ALKALINE +ALKALINITIES +ALKALINITY +ALKALINIZATION +ALKALINIZATIONS +ALKALINIZE +ALKALINIZED +ALKALINIZES +ALKALINIZING +ALKALIS +ALKALISE +ALKALISED +ALKALISES +ALKALISING +ALKALIZE +ALKALIZED +ALKALIZER +ALKALIZERS +ALKALIZES +ALKALIZING +ALKALOID +ALKALOIDAL +ALKALOIDS +ALKALOSES +ALKALOSIS +ALKALOTIC +ALKANE +ALKANES +ALKANET +ALKANETS +ALKENE +ALKENES +ALKIE +ALKIES +ALKINE +ALKINES +ALKOXIDE +ALKOXIDES +ALKOXY +ALKY +ALKYD +ALKYDS +ALKYL +ALKYLATE +ALKYLATED +ALKYLATES +ALKYLATING +ALKYLATION +ALKYLATIONS +ALKYLIC +ALKYLS +ALKYNE +ALKYNES +ALL +ALLANITE +ALLANITES +ALLANTOIC +ALLANTOID +ALLANTOIDES +ALLANTOIDS +ALLANTOIN +ALLANTOINS +ALLANTOIS +ALLARGANDO +ALLAY +ALLAYED +ALLAYER +ALLAYERS +ALLAYING +ALLAYS +ALLEE +ALLEES +ALLEGATION +ALLEGATIONS +ALLEGE +ALLEGED +ALLEGEDLY +ALLEGER +ALLEGERS +ALLEGES +ALLEGIANCE +ALLEGIANCES +ALLEGIANT +ALLEGIANTS +ALLEGING +ALLEGORIC +ALLEGORICAL +ALLEGORICALLY +ALLEGORICALNESS +ALLEGORIES +ALLEGORISE +ALLEGORISED +ALLEGORISES +ALLEGORISING +ALLEGORIST +ALLEGORISTS +ALLEGORIZATION +ALLEGORIZATIONS +ALLEGORIZE +ALLEGORIZED +ALLEGORIZER +ALLEGORIZERS +ALLEGORIZES +ALLEGORIZING +ALLEGORY +ALLEGRETTO +ALLEGRETTOS +ALLEGRO +ALLEGROS +ALLELE +ALLELES +ALLELIC +ALLELISM +ALLELISMS +ALLELOMORPH +ALLELOMORPHIC +ALLELOMORPHISM +ALLELOMORPHISMS +ALLELOMORPHS +ALLELOPATHIC +ALLELOPATHIES +ALLELOPATHY +ALLELUIA +ALLELUIAS +ALLEMANDE +ALLEMANDES +ALLERGEN +ALLERGENIC +ALLERGENICITIES +ALLERGENICITY +ALLERGENS +ALLERGIC +ALLERGIES +ALLERGIN +ALLERGINS +ALLERGIST +ALLERGISTS +ALLERGY +ALLETHRIN +ALLETHRINS +ALLEVIANT +ALLEVIANTS +ALLEVIATE +ALLEVIATED +ALLEVIATES +ALLEVIATING +ALLEVIATION +ALLEVIATIONS +ALLEVIATOR +ALLEVIATORS +ALLEY +ALLEYS +ALLEYWAY +ALLEYWAYS +ALLHEAL +ALLHEALS +ALLIABLE +ALLIACEOUS +ALLIANCE +ALLIANCES +ALLICIN +ALLICINS +ALLIED +ALLIES +ALLIGATOR +ALLIGATORS +ALLITERATE +ALLITERATED +ALLITERATES +ALLITERATING +ALLITERATION +ALLITERATIONS +ALLITERATIVE +ALLITERATIVELY +ALLIUM +ALLIUMS +ALLOANTIBODIES +ALLOANTIBODY +ALLOANTIGEN +ALLOANTIGENS +ALLOBAR +ALLOBARS +ALLOCABLE +ALLOCATABLE +ALLOCATE +ALLOCATED +ALLOCATES +ALLOCATING +ALLOCATION +ALLOCATIONS +ALLOCATOR +ALLOCATORS +ALLOCUTION +ALLOCUTIONS +ALLOD +ALLODIA +ALLODIAL +ALLODIUM +ALLODS +ALLOGAMIES +ALLOGAMOUS +ALLOGAMY +ALLOGENEIC +ALLOGENIC +ALLOGRAFT +ALLOGRAFTED +ALLOGRAFTING +ALLOGRAFTS +ALLOGRAPH +ALLOGRAPHIC +ALLOGRAPHS +ALLOMETRIC +ALLOMETRIES +ALLOMETRY +ALLOMORPH +ALLOMORPHIC +ALLOMORPHISM +ALLOMORPHISMS +ALLOMORPHS +ALLONGE +ALLONGES +ALLONYM +ALLONYMS +ALLOPATH +ALLOPATHIES +ALLOPATHS +ALLOPATHY +ALLOPATRIC +ALLOPATRICALLY +ALLOPATRIES +ALLOPATRY +ALLOPHANE +ALLOPHANES +ALLOPHONE +ALLOPHONES +ALLOPHONIC +ALLOPLASM +ALLOPLASMS +ALLOPOLYPLOID +ALLOPOLYPLOIDS +ALLOPOLYPLOIDY +ALLOPURINOL +ALLOPURINOLS +ALLOSAUR +ALLOSAURS +ALLOSAURUS +ALLOSAURUSES +ALLOSTERIC +ALLOSTERICALLY +ALLOSTERIES +ALLOSTERY +ALLOT +ALLOTETRAPLOID +ALLOTETRAPLOIDS +ALLOTETRAPLOIDY +ALLOTMENT +ALLOTMENTS +ALLOTROPE +ALLOTROPES +ALLOTROPIC +ALLOTROPIES +ALLOTROPY +ALLOTS +ALLOTTED +ALLOTTEE +ALLOTTEES +ALLOTTER +ALLOTTERS +ALLOTTING +ALLOTYPE +ALLOTYPES +ALLOTYPIC +ALLOTYPICALLY +ALLOTYPIES +ALLOTYPY +ALLOVER +ALLOVERS +ALLOW +ALLOWABLE +ALLOWABLES +ALLOWABLY +ALLOWANCE +ALLOWANCED +ALLOWANCES +ALLOWANCING +ALLOWED +ALLOWEDLY +ALLOWING +ALLOWS +ALLOXAN +ALLOXANS +ALLOY +ALLOYED +ALLOYING +ALLOYS +ALLS +ALLSEED +ALLSEEDS +ALLSORTS +ALLSPICE +ALLSPICES +ALLUDE +ALLUDED +ALLUDES +ALLUDING +ALLURE +ALLURED +ALLUREMENT +ALLUREMENTS +ALLURER +ALLURERS +ALLURES +ALLURING +ALLURINGLY +ALLUSION +ALLUSIONS +ALLUSIVE +ALLUSIVELY +ALLUSIVENESS +ALLUSIVENESSES +ALLUVIA +ALLUVIAL +ALLUVIALS +ALLUVION +ALLUVIONS +ALLUVIUM +ALLUVIUMS +ALLY +ALLYING +ALLYL +ALLYLIC +ALLYLS +ALMA +ALMAGEST +ALMAGESTS +ALMAH +ALMAHS +ALMANAC +ALMANACK +ALMANACKS +ALMANACS +ALMANDINE +ALMANDINES +ALMANDITE +ALMANDITES +ALMAS +ALME +ALMEH +ALMEHS +ALMEMAR +ALMEMARS +ALMES +ALMIGHTINESS +ALMIGHTINESSES +ALMIGHTY +ALMNER +ALMNERS +ALMOND +ALMONDS +ALMONDY +ALMONER +ALMONERS +ALMONRIES +ALMONRY +ALMOST +ALMS +ALMSGIVER +ALMSGIVERS +ALMSGIVING +ALMSGIVINGS +ALMSHOUSE +ALMSHOUSES +ALMSMAN +ALMSMEN +ALMUCE +ALMUCES +ALMUD +ALMUDE +ALMUDES +ALMUDS +ALMUG +ALMUGS +ALNICO +ALNICOS +ALODIA +ALODIAL +ALODIUM +ALOE +ALOES +ALOETIC +ALOFT +ALOGICAL +ALOGICALLY +ALOHA +ALOHAS +ALOIN +ALOINS +ALONE +ALONENESS +ALONENESSES +ALONG +ALONGSHORE +ALONGSIDE +ALOOF +ALOOFLY +ALOOFNESS +ALOOFNESSES +ALOPECIA +ALOPECIAS +ALOPECIC +ALOUD +ALOW +ALP +ALPACA +ALPACAS +ALPENGLOW +ALPENGLOWS +ALPENHORN +ALPENHORNS +ALPENSTOCK +ALPENSTOCKS +ALPHA +ALPHABET +ALPHABETED +ALPHABETIC +ALPHABETICAL +ALPHABETICALLY +ALPHABETING +ALPHABETIZATION +ALPHABETIZE +ALPHABETIZED +ALPHABETIZER +ALPHABETIZERS +ALPHABETIZES +ALPHABETIZING +ALPHABETS +ALPHAMERIC +ALPHANUMERIC +ALPHANUMERICAL +ALPHANUMERICS +ALPHAS +ALPHORN +ALPHORNS +ALPHOSIS +ALPHOSISES +ALPHYL +ALPHYLS +ALPINE +ALPINELY +ALPINES +ALPINISM +ALPINISMS +ALPINIST +ALPINISTS +ALPS +ALREADY +ALRIGHT +ALS +ALSIKE +ALSIKES +ALSO +ALT +ALTAR +ALTARPIECE +ALTARPIECES +ALTARS +ALTAZIMUTH +ALTAZIMUTHS +ALTER +ALTERABILITIES +ALTERABILITY +ALTERABLE +ALTERABLY +ALTERANT +ALTERANTS +ALTERATION +ALTERATIONS +ALTERCATE +ALTERCATED +ALTERCATES +ALTERCATING +ALTERCATION +ALTERCATIONS +ALTERED +ALTERER +ALTERERS +ALTERING +ALTERITIES +ALTERITY +ALTERNANT +ALTERNANTS +ALTERNATE +ALTERNATED +ALTERNATELY +ALTERNATES +ALTERNATING +ALTERNATION +ALTERNATIONS +ALTERNATIVE +ALTERNATIVELY +ALTERNATIVENESS +ALTERNATIVES +ALTERNATOR +ALTERNATORS +ALTERS +ALTHAEA +ALTHAEAS +ALTHEA +ALTHEAS +ALTHO +ALTHORN +ALTHORNS +ALTHOUGH +ALTIGRAPH +ALTIGRAPHS +ALTIMETER +ALTIMETERS +ALTIMETRIES +ALTIMETRY +ALTIPLANO +ALTIPLANOS +ALTITUDE +ALTITUDES +ALTITUDINAL +ALTITUDINOUS +ALTO +ALTOCUMULI +ALTOCUMULUS +ALTOGETHER +ALTOGETHERS +ALTOIST +ALTOISTS +ALTOS +ALTOSTRATI +ALTOSTRATUS +ALTRICIAL +ALTRUISM +ALTRUISMS +ALTRUIST +ALTRUISTIC +ALTRUISTICALLY +ALTRUISTS +ALTS +ALUDEL +ALUDELS +ALULA +ALULAE +ALULAR +ALUM +ALUMIN +ALUMINA +ALUMINAS +ALUMINATE +ALUMINATES +ALUMINE +ALUMINES +ALUMINIC +ALUMINIUM +ALUMINIUMS +ALUMINIZE +ALUMINIZED +ALUMINIZES +ALUMINIZING +ALUMINOSILICATE +ALUMINOUS +ALUMINS +ALUMINUM +ALUMINUMS +ALUMNA +ALUMNAE +ALUMNI +ALUMNUS +ALUMROOT +ALUMROOTS +ALUMS +ALUMSTONE +ALUMSTONES +ALUNITE +ALUNITES +ALVEOLAR +ALVEOLARLY +ALVEOLARS +ALVEOLATE +ALVEOLI +ALVEOLUS +ALVINE +ALWAY +ALWAYS +ALYSSUM +ALYSSUMS +AM +AMA +AMADAVAT +AMADAVATS +AMADOU +AMADOUS +AMAH +AMAHS +AMAIN +AMALGAM +AMALGAMATE +AMALGAMATED +AMALGAMATES +AMALGAMATING +AMALGAMATION +AMALGAMATIONS +AMALGAMATOR +AMALGAMATORS +AMALGAMS +AMANDINE +AMANITA +AMANITAS +AMANITIN +AMANITINS +AMANTADINE +AMANTADINES +AMANUENSES +AMANUENSIS +AMARANTH +AMARANTHINE +AMARANTHS +AMARELLE +AMARELLES +AMARETTI +AMARETTO +AMARETTOS +AMARNA +AMARONE +AMARONES +AMARYLLIS +AMARYLLISES +AMAS +AMASS +AMASSABLE +AMASSED +AMASSER +AMASSERS +AMASSES +AMASSING +AMASSMENT +AMASSMENTS +AMATEUR +AMATEURISH +AMATEURISHLY +AMATEURISHNESS +AMATEURISM +AMATEURISMS +AMATEURS +AMATIVE +AMATIVELY +AMATIVENESS +AMATIVENESSES +AMATOL +AMATOLS +AMATORY +AMAUROSES +AMAUROSIS +AMAUROTIC +AMAZE +AMAZED +AMAZEDLY +AMAZEMENT +AMAZEMENTS +AMAZES +AMAZING +AMAZINGLY +AMAZON +AMAZONIAN +AMAZONIANS +AMAZONITE +AMAZONITES +AMAZONS +AMAZONSTONE +AMAZONSTONES +AMBAGE +AMBAGES +AMBAGIOUS +AMBARI +AMBARIES +AMBARIS +AMBARY +AMBASSADOR +AMBASSADORIAL +AMBASSADORS +AMBASSADORSHIP +AMBASSADORSHIPS +AMBASSADRESS +AMBASSADRESSES +AMBEER +AMBEERS +AMBER +AMBERGRIS +AMBERGRISES +AMBERIES +AMBERINA +AMBERINAS +AMBERJACK +AMBERJACKS +AMBEROID +AMBEROIDS +AMBERS +AMBERY +AMBIANCE +AMBIANCES +AMBIDEXTERITIES +AMBIDEXTERITY +AMBIDEXTROUS +AMBIDEXTROUSLY +AMBIENCE +AMBIENCES +AMBIENT +AMBIENTS +AMBIGUITIES +AMBIGUITY +AMBIGUOUS +AMBIGUOUSLY +AMBIGUOUSNESS +AMBIGUOUSNESSES +AMBIPOLAR +AMBISEXUAL +AMBISEXUALITIES +AMBISEXUALITY +AMBISEXUALS +AMBIT +AMBITION +AMBITIONED +AMBITIONING +AMBITIONLESS +AMBITIONS +AMBITIOUS +AMBITIOUSLY +AMBITIOUSNESS +AMBITIOUSNESSES +AMBITS +AMBIVALENCE +AMBIVALENCES +AMBIVALENT +AMBIVALENTLY +AMBIVERSION +AMBIVERSIONS +AMBIVERT +AMBIVERTS +AMBLE +AMBLED +AMBLER +AMBLERS +AMBLES +AMBLING +AMBLYGONITE +AMBLYGONITES +AMBLYOPIA +AMBLYOPIAS +AMBLYOPIC +AMBO +AMBOINA +AMBOINAS +AMBONES +AMBOS +AMBOYNA +AMBOYNAS +AMBRIES +AMBROID +AMBROIDS +AMBROSIA +AMBROSIAL +AMBROSIALLY +AMBROSIAN +AMBROSIAS +AMBROTYPE +AMBROTYPES +AMBRY +AMBSACE +AMBSACES +AMBULACRA +AMBULACRAL +AMBULACRUM +AMBULANCE +AMBULANCES +AMBULANT +AMBULATE +AMBULATED +AMBULATES +AMBULATING +AMBULATION +AMBULATIONS +AMBULATOR +AMBULATORIES +AMBULATORILY +AMBULATORS +AMBULATORY +AMBULETTE +AMBULETTES +AMBUSCADE +AMBUSCADED +AMBUSCADER +AMBUSCADERS +AMBUSCADES +AMBUSCADING +AMBUSH +AMBUSHED +AMBUSHER +AMBUSHERS +AMBUSHES +AMBUSHING +AMBUSHMENT +AMBUSHMENTS +AMEBA +AMEBAE +AMEBAN +AMEBAS +AMEBEAN +AMEBIASES +AMEBIASIS +AMEBIC +AMEBOCYTE +AMEBOCYTES +AMEBOID +AMEER +AMEERATE +AMEERATES +AMEERS +AMELCORN +AMELCORNS +AMELIORATE +AMELIORATED +AMELIORATES +AMELIORATING +AMELIORATION +AMELIORATIONS +AMELIORATIVE +AMELIORATOR +AMELIORATORS +AMELIORATORY +AMELOBLAST +AMELOBLASTS +AMEN +AMENABILITIES +AMENABILITY +AMENABLE +AMENABLY +AMEND +AMENDABLE +AMENDATORY +AMENDED +AMENDER +AMENDERS +AMENDING +AMENDMENT +AMENDMENTS +AMENDS +AMENITIES +AMENITY +AMENORRHEA +AMENORRHEAS +AMENORRHEIC +AMENS +AMENT +AMENTIA +AMENTIAS +AMENTIFEROUS +AMENTS +AMERCE +AMERCED +AMERCEMENT +AMERCEMENTS +AMERCER +AMERCERS +AMERCES +AMERCIABLE +AMERCING +AMERICIUM +AMERICIUMS +AMESACE +AMESACES +AMETHYST +AMETHYSTINE +AMETHYSTS +AMETROPIA +AMETROPIAS +AMETROPIC +AMI +AMIA +AMIABILITIES +AMIABILITY +AMIABLE +AMIABLENESS +AMIABLENESSES +AMIABLY +AMIANTHUS +AMIANTHUSES +AMIANTUS +AMIANTUSES +AMIAS +AMICABILITIES +AMICABILITY +AMICABLE +AMICABLENESS +AMICABLENESSES +AMICABLY +AMICE +AMICES +AMICI +AMICUS +AMID +AMIDASE +AMIDASES +AMIDE +AMIDES +AMIDIC +AMIDIN +AMIDINE +AMIDINES +AMIDINS +AMIDO +AMIDOGEN +AMIDOGENS +AMIDOL +AMIDOLS +AMIDONE +AMIDONES +AMIDS +AMIDSHIP +AMIDSHIPS +AMIDST +AMIE +AMIES +AMIGA +AMIGAS +AMIGO +AMIGOS +AMIN +AMINE +AMINES +AMINIC +AMINITIES +AMINITY +AMINO +AMINOACIDURIA +AMINOACIDURIAS +AMINOPEPTIDASE +AMINOPEPTIDASES +AMINOPHYLLINE +AMINOPHYLLINES +AMINOPTERIN +AMINOPTERINS +AMINOPYRINE +AMINOPYRINES +AMINS +AMIR +AMIRATE +AMIRATES +AMIRS +AMIS +AMISS +AMITIES +AMITOSES +AMITOSIS +AMITOTIC +AMITOTICALLY +AMITRIPTYLINE +AMITRIPTYLINES +AMITROLE +AMITROLES +AMITY +AMMETER +AMMETERS +AMMINE +AMMINES +AMMINO +AMMO +AMMOCETE +AMMOCETES +AMMONAL +AMMONALS +AMMONIA +AMMONIAC +AMMONIACAL +AMMONIACS +AMMONIAS +AMMONIATE +AMMONIATED +AMMONIATES +AMMONIATING +AMMONIATION +AMMONIATIONS +AMMONIC +AMMONIFICATION +AMMONIFICATIONS +AMMONIFIED +AMMONIFIES +AMMONIFY +AMMONIFYING +AMMONITE +AMMONITES +AMMONITIC +AMMONIUM +AMMONIUMS +AMMONO +AMMONOID +AMMONOIDS +AMMOS +AMMUNITION +AMMUNITIONS +AMNESIA +AMNESIAC +AMNESIACS +AMNESIAS +AMNESIC +AMNESICS +AMNESTIC +AMNESTIED +AMNESTIES +AMNESTY +AMNESTYING +AMNIA +AMNIC +AMNIO +AMNIOCENTESES +AMNIOCENTESIS +AMNION +AMNIONIC +AMNIONS +AMNIOS +AMNIOTE +AMNIOTES +AMNIOTIC +AMOBARBITAL +AMOBARBITALS +AMOEBA +AMOEBAE +AMOEBAEAN +AMOEBAN +AMOEBAS +AMOEBEAN +AMOEBIASES +AMOEBIASIS +AMOEBIC +AMOEBOCYTE +AMOEBOCYTES +AMOEBOID +AMOK +AMOKS +AMOLE +AMOLES +AMONG +AMONGST +AMONTILLADO +AMONTILLADOS +AMORAL +AMORALISM +AMORALISMS +AMORALITIES +AMORALITY +AMORALLY +AMORETTI +AMORETTO +AMORETTOS +AMORINI +AMORINO +AMORIST +AMORISTIC +AMORISTS +AMOROSO +AMOROUS +AMOROUSLY +AMOROUSNESS +AMOROUSNESSES +AMORPHISM +AMORPHISMS +AMORPHOUS +AMORPHOUSLY +AMORPHOUSNESS +AMORPHOUSNESSES +AMORT +AMORTISE +AMORTISED +AMORTISES +AMORTISING +AMORTIZABLE +AMORTIZATION +AMORTIZATIONS +AMORTIZE +AMORTIZED +AMORTIZES +AMORTIZING +AMOSITE +AMOSITES +AMOTION +AMOTIONS +AMOUNT +AMOUNTED +AMOUNTING +AMOUNTS +AMOUR +AMOURS +AMOXICILLIN +AMOXICILLINS +AMOXYCILLIN +AMOXYCILLINS +AMP +AMPED +AMPERAGE +AMPERAGES +AMPERE +AMPERES +AMPEROMETRIC +AMPERSAND +AMPERSANDS +AMPHETAMINE +AMPHETAMINES +AMPHIBIA +AMPHIBIAN +AMPHIBIANS +AMPHIBIOUS +AMPHIBIOUSLY +AMPHIBIOUSNESS +AMPHIBOLE +AMPHIBOLES +AMPHIBOLIES +AMPHIBOLITE +AMPHIBOLITES +AMPHIBOLOGIES +AMPHIBOLOGY +AMPHIBOLY +AMPHIBRACH +AMPHIBRACHIC +AMPHIBRACHS +AMPHICTYONIC +AMPHICTYONIES +AMPHICTYONY +AMPHIDIPLOID +AMPHIDIPLOIDIES +AMPHIDIPLOIDS +AMPHIDIPLOIDY +AMPHIGORIES +AMPHIGORY +AMPHIMACER +AMPHIMACERS +AMPHIMIXES +AMPHIMIXIS +AMPHIOXI +AMPHIOXUS +AMPHIOXUSES +AMPHIPATHIC +AMPHIPHILE +AMPHIPHILES +AMPHIPHILIC +AMPHIPLOID +AMPHIPLOIDIES +AMPHIPLOIDS +AMPHIPLOIDY +AMPHIPOD +AMPHIPODS +AMPHIPROSTYLE +AMPHIPROSTYLES +AMPHISBAENA +AMPHISBAENAS +AMPHISBAENIC +AMPHITHEATER +AMPHITHEATERS +AMPHITHEATRIC +AMPHITHEATRICAL +AMPHORA +AMPHORAE +AMPHORAL +AMPHORAS +AMPHOTERIC +AMPICILLIN +AMPICILLINS +AMPING +AMPLE +AMPLENESS +AMPLENESSES +AMPLER +AMPLEST +AMPLEXUS +AMPLEXUSES +AMPLIDYNE +AMPLIDYNES +AMPLIFICATION +AMPLIFICATIONS +AMPLIFIED +AMPLIFIER +AMPLIFIERS +AMPLIFIES +AMPLIFY +AMPLIFYING +AMPLITUDE +AMPLITUDES +AMPLY +AMPOULE +AMPOULES +AMPS +AMPUL +AMPULE +AMPULES +AMPULLA +AMPULLAE +AMPULLAR +AMPULLARY +AMPULS +AMPUTATE +AMPUTATED +AMPUTATES +AMPUTATING +AMPUTATION +AMPUTATIONS +AMPUTATOR +AMPUTATORS +AMPUTEE +AMPUTEES +AMREETA +AMREETAS +AMRITA +AMRITAS +AMSINCKIA +AMSINCKIAS +AMTRAC +AMTRACK +AMTRACKS +AMTRACS +AMU +AMUCK +AMUCKS +AMULET +AMULETS +AMUS +AMUSABLE +AMUSE +AMUSED +AMUSEDLY +AMUSEMENT +AMUSEMENTS +AMUSER +AMUSERS +AMUSES +AMUSIA +AMUSIAS +AMUSING +AMUSINGLY +AMUSINGNESS +AMUSINGNESSES +AMUSIVE +AMYGDALA +AMYGDALAE +AMYGDALE +AMYGDALES +AMYGDALIN +AMYGDALINS +AMYGDALOID +AMYGDALOIDAL +AMYGDALOIDS +AMYGDULE +AMYGDULES +AMYL +AMYLASE +AMYLASES +AMYLENE +AMYLENES +AMYLIC +AMYLOGEN +AMYLOGENS +AMYLOID +AMYLOIDOSES +AMYLOIDOSIS +AMYLOIDS +AMYLOLYTIC +AMYLOPECTIN +AMYLOPECTINS +AMYLOPLAST +AMYLOPLASTS +AMYLOPSIN +AMYLOPSINS +AMYLOSE +AMYLOSES +AMYLS +AMYLUM +AMYLUMS +AMYOTONIA +AMYOTONIAS +AN +ANA +ANABAENA +ANABAENAS +ANABAPTISM +ANABAPTISMS +ANABAS +ANABASES +ANABASIS +ANABATIC +ANABIOSES +ANABIOSIS +ANABIOTIC +ANABLEPS +ANABLEPSES +ANABOLIC +ANABOLISM +ANABOLISMS +ANABRANCH +ANABRANCHES +ANACHRONIC +ANACHRONISM +ANACHRONISMS +ANACHRONISTIC +ANACHRONOUS +ANACHRONOUSLY +ANACLISES +ANACLISIS +ANACLITIC +ANACOLUTHA +ANACOLUTHIC +ANACOLUTHICALLY +ANACOLUTHON +ANACOLUTHONS +ANACONDA +ANACONDAS +ANACREONTIC +ANACREONTICS +ANACRUSES +ANACRUSIS +ANADEM +ANADEMS +ANADIPLOSES +ANADIPLOSIS +ANADROMOUS +ANAEMIA +ANAEMIAS +ANAEMIC +ANAEROBE +ANAEROBES +ANAEROBIA +ANAEROBIC +ANAEROBICALLY +ANAEROBIOSES +ANAEROBIOSIS +ANAEROBIUM +ANAESTHESIA +ANAESTHESIAS +ANAESTHETIC +ANAESTHETICS +ANAGENESES +ANAGENESIS +ANAGLYPH +ANAGLYPHIC +ANAGLYPHS +ANAGNORISES +ANAGNORISIS +ANAGOGE +ANAGOGES +ANAGOGIC +ANAGOGICAL +ANAGOGICALLY +ANAGOGIES +ANAGOGY +ANAGRAM +ANAGRAMMATIC +ANAGRAMMATICAL +ANAGRAMMATIZE +ANAGRAMMATIZED +ANAGRAMMATIZES +ANAGRAMMATIZING +ANAGRAMMED +ANAGRAMMING +ANAGRAMS +ANAL +ANALCIME +ANALCIMES +ANALCIMIC +ANALCITE +ANALCITES +ANALECTA +ANALECTIC +ANALECTS +ANALEMMA +ANALEMMAS +ANALEMMATA +ANALEMMATIC +ANALEPTIC +ANALEPTICS +ANALGESIA +ANALGESIAS +ANALGESIC +ANALGESICS +ANALGETIC +ANALGETICS +ANALGIA +ANALGIAS +ANALITIES +ANALITY +ANALLY +ANALOG +ANALOGIC +ANALOGICAL +ANALOGICALLY +ANALOGIES +ANALOGISM +ANALOGISMS +ANALOGIST +ANALOGISTS +ANALOGIZE +ANALOGIZED +ANALOGIZES +ANALOGIZING +ANALOGOUS +ANALOGOUSLY +ANALOGOUSNESS +ANALOGOUSNESSES +ANALOGS +ANALOGUE +ANALOGUES +ANALOGY +ANALPHABET +ANALPHABETIC +ANALPHABETICS +ANALPHABETISM +ANALPHABETISMS +ANALPHABETS +ANALYSAND +ANALYSANDS +ANALYSE +ANALYSED +ANALYSER +ANALYSERS +ANALYSES +ANALYSING +ANALYSIS +ANALYST +ANALYSTS +ANALYTE +ANALYTES +ANALYTIC +ANALYTICAL +ANALYTICALLY +ANALYTICITIES +ANALYTICITY +ANALYTICS +ANALYZABILITIES +ANALYZABILITY +ANALYZABLE +ANALYZATION +ANALYZATIONS +ANALYZE +ANALYZED +ANALYZER +ANALYZERS +ANALYZES +ANALYZING +ANAMNESES +ANAMNESIS +ANAMNESTIC +ANAMORPHIC +ANANKE +ANANKES +ANAPAEST +ANAPAESTS +ANAPEST +ANAPESTIC +ANAPESTICS +ANAPESTS +ANAPHASE +ANAPHASES +ANAPHASIC +ANAPHOR +ANAPHORA +ANAPHORAL +ANAPHORAS +ANAPHORIC +ANAPHORICALLY +ANAPHORS +ANAPHRODISIAC +ANAPHRODISIACS +ANAPHYLACTIC +ANAPHYLACTOID +ANAPHYLAXES +ANAPHYLAXIS +ANAPLASIA +ANAPLASIAS +ANAPLASMOSES +ANAPLASMOSIS +ANAPLASTIC +ANAPTYXES +ANAPTYXIS +ANARCH +ANARCHIC +ANARCHICAL +ANARCHICALLY +ANARCHIES +ANARCHISM +ANARCHISMS +ANARCHIST +ANARCHISTIC +ANARCHISTS +ANARCHS +ANARCHY +ANARTHRIA +ANARTHRIAS +ANARTHRIC +ANAS +ANASARCA +ANASARCAS +ANASARCOUS +ANASTIGMAT +ANASTIGMATIC +ANASTIGMATS +ANASTOMOSE +ANASTOMOSED +ANASTOMOSES +ANASTOMOSING +ANASTOMOSIS +ANASTOMOTIC +ANASTROPHE +ANASTROPHES +ANATASE +ANATASES +ANATHEMA +ANATHEMAS +ANATHEMATA +ANATHEMATIZE +ANATHEMATIZED +ANATHEMATIZES +ANATHEMATIZING +ANATOMIC +ANATOMICAL +ANATOMICALLY +ANATOMIES +ANATOMISE +ANATOMISED +ANATOMISES +ANATOMISING +ANATOMIST +ANATOMISTS +ANATOMIZE +ANATOMIZED +ANATOMIZES +ANATOMIZING +ANATOMY +ANATOXIN +ANATOXINS +ANATROPOUS +ANATTO +ANATTOS +ANCESTOR +ANCESTORED +ANCESTORING +ANCESTORS +ANCESTRAL +ANCESTRALLY +ANCESTRESS +ANCESTRESSES +ANCESTRIES +ANCESTRY +ANCHO +ANCHOR +ANCHORAGE +ANCHORAGES +ANCHORED +ANCHORESS +ANCHORESSES +ANCHORET +ANCHORETS +ANCHORING +ANCHORITE +ANCHORITES +ANCHORITIC +ANCHORITICALLY +ANCHORLESS +ANCHORMAN +ANCHORMEN +ANCHORPEOPLE +ANCHORPERSON +ANCHORPERSONS +ANCHORS +ANCHORWOMAN +ANCHORWOMEN +ANCHOS +ANCHOVETA +ANCHOVETAS +ANCHOVETTA +ANCHOVETTAS +ANCHOVIES +ANCHOVY +ANCHUSA +ANCHUSAS +ANCHUSIN +ANCHUSINS +ANCHYLOSE +ANCHYLOSED +ANCHYLOSES +ANCHYLOSING +ANCIENT +ANCIENTER +ANCIENTEST +ANCIENTLY +ANCIENTNESS +ANCIENTNESSES +ANCIENTRIES +ANCIENTRY +ANCIENTS +ANCILLA +ANCILLAE +ANCILLARIES +ANCILLARY +ANCILLAS +ANCIPITAL +ANCON +ANCONAL +ANCONE +ANCONEAL +ANCONES +ANCONOID +ANCRESS +ANCRESSES +ANCYLOSTOMIASES +ANCYLOSTOMIASIS +AND +ANDALUSITE +ANDALUSITES +ANDANTE +ANDANTES +ANDANTINI +ANDANTINO +ANDANTINOS +ANDESITE +ANDESITES +ANDESITIC +ANDESYTE +ANDESYTES +ANDIRON +ANDIRONS +ANDOUILLE +ANDOUILLES +ANDOUILLETTE +ANDOUILLETTES +ANDRADITE +ANDRADITES +ANDRO +ANDROCENTRIC +ANDROECIA +ANDROECIUM +ANDROGEN +ANDROGENESES +ANDROGENESIS +ANDROGENETIC +ANDROGENIC +ANDROGENS +ANDROGYNE +ANDROGYNES +ANDROGYNIES +ANDROGYNOUS +ANDROGYNY +ANDROID +ANDROIDS +ANDROLOGIES +ANDROLOGY +ANDROMEDA +ANDROMEDAS +ANDROS +ANDROSTERONE +ANDROSTERONES +ANDS +ANE +ANEAR +ANEARED +ANEARING +ANEARS +ANECDOTA +ANECDOTAGE +ANECDOTAGES +ANECDOTAL +ANECDOTALISM +ANECDOTALISMS +ANECDOTALIST +ANECDOTALISTS +ANECDOTALLY +ANECDOTE +ANECDOTES +ANECDOTIC +ANECDOTICAL +ANECDOTICALLY +ANECDOTIST +ANECDOTISTS +ANECHOIC +ANELASTIC +ANELASTICITIES +ANELASTICITY +ANELE +ANELED +ANELES +ANELING +ANEMIA +ANEMIAS +ANEMIC +ANEMICALLY +ANEMOGRAPH +ANEMOGRAPHS +ANEMOLOGIES +ANEMOLOGY +ANEMOMETER +ANEMOMETERS +ANEMOMETRIES +ANEMOMETRY +ANEMONE +ANEMONES +ANEMOPHILOUS +ANEMOSES +ANEMOSIS +ANENCEPHALIC +ANENCEPHALIES +ANENCEPHALY +ANENST +ANENT +ANERGIA +ANERGIAS +ANERGIC +ANERGIES +ANERGY +ANEROID +ANEROIDS +ANES +ANESTHESIA +ANESTHESIAS +ANESTHESIOLOGY +ANESTHETIC +ANESTHETICALLY +ANESTHETICS +ANESTHETIST +ANESTHETISTS +ANESTHETIZE +ANESTHETIZED +ANESTHETIZES +ANESTHETIZING +ANESTRI +ANESTROUS +ANESTRUS +ANETHOL +ANETHOLE +ANETHOLES +ANETHOLS +ANEUPLOID +ANEUPLOIDIES +ANEUPLOIDS +ANEUPLOIDY +ANEURIN +ANEURINS +ANEURISM +ANEURISMS +ANEURYSM +ANEURYSMAL +ANEURYSMS +ANEW +ANFRACTUOSITIES +ANFRACTUOSITY +ANFRACTUOUS +ANGA +ANGAKOK +ANGAKOKS +ANGARIA +ANGARIAS +ANGARIES +ANGARY +ANGAS +ANGEL +ANGELED +ANGELFISH +ANGELFISHES +ANGELIC +ANGELICA +ANGELICAL +ANGELICALLY +ANGELICAS +ANGELING +ANGELOLOGIES +ANGELOLOGIST +ANGELOLOGISTS +ANGELOLOGY +ANGELS +ANGELUS +ANGELUSES +ANGER +ANGERED +ANGERING +ANGERLESS +ANGERLY +ANGERS +ANGINA +ANGINAL +ANGINAS +ANGINOSE +ANGINOUS +ANGIOGENESES +ANGIOGENESIS +ANGIOGENIC +ANGIOGRAM +ANGIOGRAMS +ANGIOGRAPHIC +ANGIOGRAPHIES +ANGIOGRAPHY +ANGIOLOGIES +ANGIOLOGY +ANGIOMA +ANGIOMAS +ANGIOMATA +ANGIOMATOUS +ANGIOPLASTIES +ANGIOPLASTY +ANGIOSPERM +ANGIOSPERMOUS +ANGIOSPERMS +ANGIOTENSIN +ANGIOTENSINS +ANGLE +ANGLED +ANGLEPOD +ANGLEPODS +ANGLER +ANGLERFISH +ANGLERFISHES +ANGLERS +ANGLES +ANGLESITE +ANGLESITES +ANGLEWORM +ANGLEWORMS +ANGLICE +ANGLICISE +ANGLICISED +ANGLICISES +ANGLICISING +ANGLICISM +ANGLICISMS +ANGLICIZATION +ANGLICIZATIONS +ANGLICIZE +ANGLICIZED +ANGLICIZES +ANGLICIZING +ANGLING +ANGLINGS +ANGLO +ANGLOPHONE +ANGLOS +ANGORA +ANGORAS +ANGOSTURA +ANGOSTURAS +ANGRIER +ANGRIEST +ANGRILY +ANGRINESS +ANGRINESSES +ANGRY +ANGST +ANGSTROM +ANGSTROMS +ANGSTS +ANGUINE +ANGUISH +ANGUISHED +ANGUISHES +ANGUISHING +ANGULAR +ANGULARITIES +ANGULARITY +ANGULARLY +ANGULATE +ANGULATED +ANGULATES +ANGULATING +ANGULATION +ANGULATIONS +ANGULOSE +ANGULOUS +ANHEDONIA +ANHEDONIAS +ANHEDONIC +ANHINGA +ANHINGAS +ANHYDRIDE +ANHYDRIDES +ANHYDRITE +ANHYDRITES +ANHYDROUS +ANI +ANIL +ANILE +ANILIN +ANILINCTUS +ANILINCTUSES +ANILINE +ANILINES +ANILINGUS +ANILINGUSES +ANILINS +ANILITIES +ANILITY +ANILS +ANIMA +ANIMACIES +ANIMACY +ANIMADVERSION +ANIMADVERSIONS +ANIMADVERT +ANIMADVERTED +ANIMADVERTING +ANIMADVERTS +ANIMAL +ANIMALCULA +ANIMALCULE +ANIMALCULES +ANIMALCULUM +ANIMALIAN +ANIMALIC +ANIMALIER +ANIMALIERS +ANIMALISM +ANIMALISMS +ANIMALIST +ANIMALISTIC +ANIMALISTS +ANIMALITIES +ANIMALITY +ANIMALIZATION +ANIMALIZATIONS +ANIMALIZE +ANIMALIZED +ANIMALIZES +ANIMALIZING +ANIMALLIKE +ANIMALLY +ANIMALS +ANIMAS +ANIMATE +ANIMATED +ANIMATEDLY +ANIMATELY +ANIMATENESS +ANIMATENESSES +ANIMATER +ANIMATERS +ANIMATES +ANIMATING +ANIMATION +ANIMATIONS +ANIMATISM +ANIMATISMS +ANIMATIST +ANIMATISTS +ANIMATO +ANIMATOR +ANIMATORS +ANIMATRONIC +ANIMATRONICALLY +ANIME +ANIMES +ANIMI +ANIMIS +ANIMISM +ANIMISMS +ANIMIST +ANIMISTIC +ANIMISTS +ANIMOSITIES +ANIMOSITY +ANIMUS +ANIMUSES +ANION +ANIONIC +ANIONS +ANIS +ANISE +ANISEED +ANISEEDS +ANISEIKONIA +ANISEIKONIAS +ANISEIKONIC +ANISES +ANISETTE +ANISETTES +ANISIC +ANISOGAMIES +ANISOGAMOUS +ANISOGAMY +ANISOLE +ANISOLES +ANISOMETROPIA +ANISOMETROPIAS +ANISOMETROPIC +ANISOTROPIC +ANISOTROPICALLY +ANISOTROPIES +ANISOTROPISM +ANISOTROPISMS +ANISOTROPY +ANKERITE +ANKERITES +ANKH +ANKHS +ANKLE +ANKLEBONE +ANKLEBONES +ANKLED +ANKLES +ANKLET +ANKLETS +ANKLING +ANKUS +ANKUSES +ANKUSH +ANKUSHES +ANKYLOSAUR +ANKYLOSAURS +ANKYLOSAURUS +ANKYLOSAURUSES +ANKYLOSE +ANKYLOSED +ANKYLOSES +ANKYLOSING +ANKYLOSIS +ANKYLOSTOMIASES +ANKYLOSTOMIASIS +ANKYLOTIC +ANLACE +ANLACES +ANLAGE +ANLAGEN +ANLAGES +ANLAS +ANLASES +ANNA +ANNAL +ANNALIST +ANNALISTIC +ANNALISTS +ANNALS +ANNAS +ANNATES +ANNATTO +ANNATTOS +ANNEAL +ANNEALED +ANNEALER +ANNEALERS +ANNEALING +ANNEALS +ANNELID +ANNELIDAN +ANNELIDANS +ANNELIDS +ANNEX +ANNEXATION +ANNEXATIONAL +ANNEXATIONIST +ANNEXATIONISTS +ANNEXATIONS +ANNEXE +ANNEXED +ANNEXES +ANNEXING +ANNIHILATE +ANNIHILATED +ANNIHILATES +ANNIHILATING +ANNIHILATION +ANNIHILATIONS +ANNIHILATOR +ANNIHILATORS +ANNIHILATORY +ANNIVERSARIES +ANNIVERSARY +ANNONA +ANNONAS +ANNOTATE +ANNOTATED +ANNOTATES +ANNOTATING +ANNOTATION +ANNOTATIONS +ANNOTATIVE +ANNOTATOR +ANNOTATORS +ANNOUNCE +ANNOUNCED +ANNOUNCEMENT +ANNOUNCEMENTS +ANNOUNCER +ANNOUNCERS +ANNOUNCES +ANNOUNCING +ANNOY +ANNOYANCE +ANNOYANCES +ANNOYED +ANNOYER +ANNOYERS +ANNOYING +ANNOYINGLY +ANNOYS +ANNUAL +ANNUALIZE +ANNUALIZED +ANNUALIZES +ANNUALIZING +ANNUALLY +ANNUALS +ANNUITANT +ANNUITANTS +ANNUITIES +ANNUITY +ANNUL +ANNULAR +ANNULARLY +ANNULATE +ANNULATED +ANNULATION +ANNULATIONS +ANNULET +ANNULETS +ANNULI +ANNULLED +ANNULLING +ANNULMENT +ANNULMENTS +ANNULOSE +ANNULS +ANNULUS +ANNULUSES +ANNUNCIATE +ANNUNCIATED +ANNUNCIATES +ANNUNCIATING +ANNUNCIATION +ANNUNCIATIONS +ANNUNCIATOR +ANNUNCIATORS +ANNUNCIATORY +ANOA +ANOAS +ANODAL +ANODALLY +ANODE +ANODES +ANODIC +ANODICALLY +ANODIZATION +ANODIZATIONS +ANODIZE +ANODIZED +ANODIZES +ANODIZING +ANODYNE +ANODYNES +ANODYNIC +ANOINT +ANOINTED +ANOINTER +ANOINTERS +ANOINTING +ANOINTMENT +ANOINTMENTS +ANOINTS +ANOLE +ANOLES +ANOLYTE +ANOLYTES +ANOMALIES +ANOMALOUS +ANOMALOUSLY +ANOMALOUSNESS +ANOMALOUSNESSES +ANOMALY +ANOMIC +ANOMIE +ANOMIES +ANOMY +ANON +ANONYM +ANONYMITIES +ANONYMITY +ANONYMOUS +ANONYMOUSLY +ANONYMOUSNESS +ANONYMOUSNESSES +ANONYMS +ANOOPSIA +ANOOPSIAS +ANOPHELES +ANOPHELINE +ANOPHELINES +ANOPIA +ANOPIAS +ANOPSIA +ANOPSIAS +ANORAK +ANORAKS +ANORECTIC +ANORECTICS +ANORETIC +ANORETICS +ANOREXIA +ANOREXIAS +ANOREXIC +ANOREXICS +ANOREXIES +ANOREXIGENIC +ANOREXY +ANORTHIC +ANORTHITE +ANORTHITES +ANORTHITIC +ANORTHOSITE +ANORTHOSITES +ANORTHOSITIC +ANOSMATIC +ANOSMIA +ANOSMIAS +ANOSMIC +ANOTHER +ANOVULANT +ANOVULANTS +ANOVULAR +ANOVULATORY +ANOXEMIA +ANOXEMIAS +ANOXEMIC +ANOXIA +ANOXIAS +ANOXIC +ANSA +ANSAE +ANSATE +ANSATED +ANSERINE +ANSERINES +ANSEROUS +ANSWER +ANSWERABLE +ANSWERED +ANSWERER +ANSWERERS +ANSWERING +ANSWERS +ANT +ANTA +ANTACID +ANTACIDS +ANTAE +ANTAGONISM +ANTAGONISMS +ANTAGONIST +ANTAGONISTIC +ANTAGONISTS +ANTAGONIZE +ANTAGONIZED +ANTAGONIZES +ANTAGONIZING +ANTALGIC +ANTALGICS +ANTALKALI +ANTALKALIES +ANTALKALIS +ANTARCTIC +ANTAS +ANTBEAR +ANTBEARS +ANTE +ANTEATER +ANTEATERS +ANTEBELLUM +ANTECEDE +ANTECEDED +ANTECEDENCE +ANTECEDENCES +ANTECEDENT +ANTECEDENTLY +ANTECEDENTS +ANTECEDES +ANTECEDING +ANTECESSOR +ANTECESSORS +ANTECHAMBER +ANTECHAMBERS +ANTECHAPEL +ANTECHAPELS +ANTECHOIR +ANTECHOIRS +ANTED +ANTEDATE +ANTEDATED +ANTEDATES +ANTEDATING +ANTEDILUVIAN +ANTEDILUVIANS +ANTEED +ANTEFIX +ANTEFIXA +ANTEFIXAE +ANTEFIXAL +ANTEFIXES +ANTEING +ANTELOPE +ANTELOPES +ANTEMORTEM +ANTENATAL +ANTENATALLY +ANTENNA +ANTENNAE +ANTENNAL +ANTENNAS +ANTENNULAR +ANTENNULE +ANTENNULES +ANTENUPTIAL +ANTEPAST +ANTEPASTS +ANTEPENDIA +ANTEPENDIUM +ANTEPENDIUMS +ANTEPENULT +ANTEPENULTIMA +ANTEPENULTIMAS +ANTEPENULTIMATE +ANTEPENULTS +ANTERIOR +ANTERIORLY +ANTEROOM +ANTEROOMS +ANTES +ANTETYPE +ANTETYPES +ANTEVERT +ANTEVERTED +ANTEVERTING +ANTEVERTS +ANTHELIA +ANTHELICES +ANTHELION +ANTHELIONS +ANTHELIX +ANTHELIXES +ANTHELMINTIC +ANTHELMINTICS +ANTHEM +ANTHEMED +ANTHEMIA +ANTHEMIC +ANTHEMING +ANTHEMION +ANTHEMS +ANTHER +ANTHERAL +ANTHERID +ANTHERIDIA +ANTHERIDIAL +ANTHERIDIUM +ANTHERIDS +ANTHERS +ANTHESES +ANTHESIS +ANTHILL +ANTHILLS +ANTHOCYAN +ANTHOCYANIN +ANTHOCYANINS +ANTHOCYANS +ANTHODIA +ANTHODIUM +ANTHOID +ANTHOLOGICAL +ANTHOLOGIES +ANTHOLOGIST +ANTHOLOGISTS +ANTHOLOGIZE +ANTHOLOGIZED +ANTHOLOGIZER +ANTHOLOGIZERS +ANTHOLOGIZES +ANTHOLOGIZING +ANTHOLOGY +ANTHOPHILOUS +ANTHOPHYLLITE +ANTHOPHYLLITES +ANTHOZOAN +ANTHOZOANS +ANTHOZOIC +ANTHRACENE +ANTHRACENES +ANTHRACES +ANTHRACITE +ANTHRACITES +ANTHRACITIC +ANTHRACNOSE +ANTHRACNOSES +ANTHRANILATE +ANTHRANILATES +ANTHRAQUINONE +ANTHRAQUINONES +ANTHRAX +ANTHROPIC +ANTHROPICAL +ANTHROPOCENTRIC +ANTHROPOGENIC +ANTHROPOID +ANTHROPOIDS +ANTHROPOLOGICAL +ANTHROPOLOGIES +ANTHROPOLOGIST +ANTHROPOLOGISTS +ANTHROPOLOGY +ANTHROPOMETRIC +ANTHROPOMETRIES +ANTHROPOMETRY +ANTHROPOMORPH +ANTHROPOMORPHIC +ANTHROPOMORPHS +ANTHROPOPATHISM +ANTHROPOPHAGI +ANTHROPOPHAGIES +ANTHROPOPHAGOUS +ANTHROPOPHAGUS +ANTHROPOPHAGY +ANTHROPOSOPHIES +ANTHROPOSOPHY +ANTHURIUM +ANTHURIUMS +ANTI +ANTIABORTION +ANTIABORTIONIST +ANTIABUSE +ANTIACADEMIC +ANTIACNE +ANTIAGGRESSION +ANTIAGING +ANTIAIR +ANTIAIRCRAFT +ANTIAIRCRAFTS +ANTIALCOHOL +ANTIALCOHOLISM +ANTIALIEN +ANTIALLERGENIC +ANTIANEMIA +ANTIANXIETY +ANTIAPARTHEID +ANTIAPHRODISIAC +ANTIAR +ANTIARIN +ANTIARINS +ANTIARMOR +ANTIARRHYTHMIC +ANTIARS +ANTIARTHRITIC +ANTIARTHRITICS +ANTIARTHRITIS +ANTIASTHMA +ANTIATOM +ANTIATOMS +ANTIAUTHORITY +ANTIAUXIN +ANTIAUXINS +ANTIBACKLASH +ANTIBACTERIAL +ANTIBACTERIALS +ANTIBIAS +ANTIBILLBOARD +ANTIBIOSES +ANTIBIOSIS +ANTIBIOTIC +ANTIBIOTICALLY +ANTIBIOTICS +ANTIBLACK +ANTIBLACKISM +ANTIBLACKISMS +ANTIBODIES +ANTIBODY +ANTIBOSS +ANTIBOURGEOIS +ANTIBOYCOTT +ANTIBUG +ANTIBURGLAR +ANTIBURGLARY +ANTIBUSER +ANTIBUSERS +ANTIBUSINESS +ANTIBUSING +ANTIC +ANTICAKING +ANTICALLY +ANTICANCER +ANTICAPITALISM +ANTICAPITALISMS +ANTICAPITALIST +ANTICAR +ANTICARCINOGEN +ANTICARCINOGENS +ANTICARIES +ANTICELLULITE +ANTICENSORSHIP +ANTICHLOR +ANTICHLORS +ANTICHOICE +ANTICHOICER +ANTICHOICERS +ANTICHOLESTEROL +ANTICHOLINERGIC +ANTICHURCH +ANTICIGARETTE +ANTICIPANT +ANTICIPANTS +ANTICIPATABLE +ANTICIPATE +ANTICIPATED +ANTICIPATES +ANTICIPATING +ANTICIPATION +ANTICIPATIONS +ANTICIPATOR +ANTICIPATORS +ANTICIPATORY +ANTICITY +ANTICIVIC +ANTICK +ANTICKED +ANTICKING +ANTICKS +ANTICLASSICAL +ANTICLERICAL +ANTICLERICALISM +ANTICLERICALS +ANTICLIMACTIC +ANTICLIMACTICAL +ANTICLIMAX +ANTICLIMAXES +ANTICLINAL +ANTICLINE +ANTICLINES +ANTICLING +ANTICLOCKWISE +ANTICLOTTING +ANTICLY +ANTICOAGULANT +ANTICOAGULANTS +ANTICODON +ANTICODONS +ANTICOLD +ANTICOLLISION +ANTICOLONIAL +ANTICOLONIALISM +ANTICOLONIALIST +ANTICOMMERCIAL +ANTICOMMUNISM +ANTICOMMUNISMS +ANTICOMMUNIST +ANTICOMMUNISTS +ANTICOMPETITIVE +ANTICONSUMER +ANTICONVULSANT +ANTICONVULSANTS +ANTICONVULSIVE +ANTICONVULSIVES +ANTICORPORATE +ANTICORROSION +ANTICORROSIVE +ANTICORROSIVES +ANTICORRUPTION +ANTICRACK +ANTICREATIVE +ANTICRIME +ANTICRUELTY +ANTICS +ANTICULT +ANTICULTS +ANTICULTURAL +ANTICYCLONE +ANTICYCLONES +ANTICYCLONIC +ANTIDANDRUFF +ANTIDEFAMATION +ANTIDEMOCRATIC +ANTIDEPRESSANT +ANTIDEPRESSANTS +ANTIDEPRESSION +ANTIDERIVATIVE +ANTIDERIVATIVES +ANTIDESICCANT +ANTIDEVELOPMENT +ANTIDIABETIC +ANTIDIARRHEAL +ANTIDIARRHEALS +ANTIDILUTION +ANTIDOGMATIC +ANTIDORA +ANTIDOTAL +ANTIDOTALLY +ANTIDOTE +ANTIDOTED +ANTIDOTES +ANTIDOTING +ANTIDRAFT +ANTIDROMIC +ANTIDROMICALLY +ANTIDRUG +ANTIDUMPING +ANTIECONOMIC +ANTIEDUCATIONAL +ANTIEGALITARIAN +ANTIELECTRON +ANTIELECTRONS +ANTIELITE +ANTIELITES +ANTIELITISM +ANTIELITISMS +ANTIELITIST +ANTIEMETIC +ANTIEMETICS +ANTIENTROPIC +ANTIEPILEPSY +ANTIEPILEPTIC +ANTIEPILEPTICS +ANTIEROTIC +ANTIESTROGEN +ANTIESTROGENS +ANTIEVOLUTION +ANTIFAMILY +ANTIFASCISM +ANTIFASCISMS +ANTIFASCIST +ANTIFASCISTS +ANTIFASHION +ANTIFASHIONABLE +ANTIFASHIONS +ANTIFAT +ANTIFATIGUE +ANTIFEMALE +ANTIFEMININE +ANTIFEMINISM +ANTIFEMINISMS +ANTIFEMINIST +ANTIFEMINISTS +ANTIFERROMAGNET +ANTIFERTILITY +ANTIFILIBUSTER +ANTIFLU +ANTIFOAM +ANTIFOAMING +ANTIFOG +ANTIFOGGING +ANTIFORECLOSURE +ANTIFOREIGN +ANTIFOREIGNER +ANTIFORMALIST +ANTIFOULING +ANTIFRAUD +ANTIFREEZE +ANTIFREEZES +ANTIFRICTION +ANTIFUNGAL +ANTIFUNGALS +ANTIFUR +ANTIGAMBLING +ANTIGANG +ANTIGAY +ANTIGEN +ANTIGENE +ANTIGENES +ANTIGENIC +ANTIGENICALLY +ANTIGENICITIES +ANTIGENICITY +ANTIGENS +ANTIGLARE +ANTIGLOBULIN +ANTIGLOBULINS +ANTIGOVERNMENT +ANTIGRAFT +ANTIGRAVITIES +ANTIGRAVITY +ANTIGROWTH +ANTIGUERRILLA +ANTIGUN +ANTIHELICES +ANTIHELIX +ANTIHELIXES +ANTIHERO +ANTIHEROES +ANTIHEROIC +ANTIHEROINE +ANTIHEROINES +ANTIHERPES +ANTIHIJACK +ANTIHISTAMINE +ANTIHISTAMINES +ANTIHISTAMINIC +ANTIHISTAMINICS +ANTIHISTORICAL +ANTIHOMOSEXUAL +ANTIHUMAN +ANTIHUMANISM +ANTIHUMANISMS +ANTIHUMANISTIC +ANTIHUNTER +ANTIHUNTING +ANTIHYSTERIC +ANTIHYSTERICS +ANTIJAM +ANTIJAMMING +ANTIKICKBACK +ANTIKING +ANTIKINGS +ANTIKNOCK +ANTIKNOCKS +ANTILABOR +ANTILEAK +ANTILEFT +ANTILEPROSY +ANTILEUKEMIC +ANTILIBERAL +ANTILIBERALISM +ANTILIBERALISMS +ANTILIBERALS +ANTILIBERTARIAN +ANTILIFE +ANTILIFER +ANTILIFERS +ANTILITERATE +ANTILITTER +ANTILITTERING +ANTILOCK +ANTILOG +ANTILOGARITHM +ANTILOGARITHMS +ANTILOGICAL +ANTILOGIES +ANTILOGS +ANTILOGY +ANTILYNCHING +ANTIMACASSAR +ANTIMACASSARS +ANTIMACHO +ANTIMAGNETIC +ANTIMALARIA +ANTIMALARIAL +ANTIMALARIALS +ANTIMALE +ANTIMAN +ANTIMANAGEMENT +ANTIMARIJUANA +ANTIMARKET +ANTIMASK +ANTIMASKS +ANTIMATERIALISM +ANTIMATERIALIST +ANTIMATTER +ANTIMATTERS +ANTIMECHANIST +ANTIMECHANISTS +ANTIMERE +ANTIMERES +ANTIMERGER +ANTIMERIC +ANTIMETABOLIC +ANTIMETABOLITE +ANTIMETABOLITES +ANTIMICROBIAL +ANTIMICROBIALS +ANTIMILITARISM +ANTIMILITARISMS +ANTIMILITARIST +ANTIMILITARISTS +ANTIMILITARY +ANTIMINE +ANTIMISSILE +ANTIMITOTIC +ANTIMITOTICS +ANTIMODERN +ANTIMODERNIST +ANTIMODERNISTS +ANTIMONARCHICAL +ANTIMONARCHIST +ANTIMONARCHISTS +ANTIMONIAL +ANTIMONIALS +ANTIMONIC +ANTIMONIDE +ANTIMONIDES +ANTIMONIES +ANTIMONOPOLIST +ANTIMONOPOLISTS +ANTIMONOPOLY +ANTIMONY +ANTIMONYL +ANTIMONYLS +ANTIMOSQUITO +ANTIMUSIC +ANTIMUSICAL +ANTIMUSICS +ANTIMYCIN +ANTIMYCINS +ANTINARRATIVE +ANTINARRATIVES +ANTINATIONAL +ANTINATIONALIST +ANTINATURAL +ANTINATURE +ANTINAUSEA +ANTINEOPLASTIC +ANTINEPOTISM +ANTINEUTRINO +ANTINEUTRINOS +ANTINEUTRON +ANTINEUTRONS +ANTING +ANTINGS +ANTINODAL +ANTINODE +ANTINODES +ANTINOISE +ANTINOME +ANTINOMES +ANTINOMIAN +ANTINOMIANISM +ANTINOMIANISMS +ANTINOMIANS +ANTINOMIC +ANTINOMIES +ANTINOMY +ANTINOVEL +ANTINOVELIST +ANTINOVELISTS +ANTINOVELS +ANTINUCLEAR +ANTINUCLEON +ANTINUCLEONS +ANTINUKE +ANTINUKER +ANTINUKERS +ANTINUKES +ANTIOBESITY +ANTIOBSCENITY +ANTIOXIDANT +ANTIOXIDANTS +ANTIOZONANT +ANTIOZONANTS +ANTIPAPAL +ANTIPARALLEL +ANTIPARASITIC +ANTIPARTICLE +ANTIPARTICLES +ANTIPARTIES +ANTIPARTY +ANTIPASTI +ANTIPASTO +ANTIPASTOS +ANTIPATHETIC +ANTIPATHIES +ANTIPATHY +ANTIPERSONNEL +ANTIPERSPIRANT +ANTIPERSPIRANTS +ANTIPESTICIDE +ANTIPHLOGISTIC +ANTIPHON +ANTIPHONAL +ANTIPHONALLY +ANTIPHONALS +ANTIPHONARIES +ANTIPHONARY +ANTIPHONIES +ANTIPHONS +ANTIPHONY +ANTIPHRASES +ANTIPHRASIS +ANTIPILL +ANTIPIRACY +ANTIPLAGUE +ANTIPLAQUE +ANTIPLEASURE +ANTIPOACHING +ANTIPODAL +ANTIPODALS +ANTIPODE +ANTIPODEAN +ANTIPODEANS +ANTIPODES +ANTIPOETIC +ANTIPOLAR +ANTIPOLE +ANTIPOLES +ANTIPOLICE +ANTIPOLITICAL +ANTIPOLITICS +ANTIPOLLUTION +ANTIPOLLUTIONS +ANTIPOPE +ANTIPOPES +ANTIPOPULAR +ANTIPORN +ANTIPORNOGRAPHY +ANTIPOT +ANTIPOVERTY +ANTIPREDATOR +ANTIPRESS +ANTIPROGRESSIVE +ANTIPROTON +ANTIPROTONS +ANTIPRURITIC +ANTIPRURITICS +ANTIPSYCHOTIC +ANTIPSYCHOTICS +ANTIPYIC +ANTIPYICS +ANTIPYRETIC +ANTIPYRETICS +ANTIPYRINE +ANTIPYRINES +ANTIQUARIAN +ANTIQUARIANISM +ANTIQUARIANISMS +ANTIQUARIANS +ANTIQUARIES +ANTIQUARK +ANTIQUARKS +ANTIQUARY +ANTIQUATE +ANTIQUATED +ANTIQUATES +ANTIQUATING +ANTIQUATION +ANTIQUATIONS +ANTIQUE +ANTIQUED +ANTIQUELY +ANTIQUER +ANTIQUERS +ANTIQUES +ANTIQUING +ANTIQUITIES +ANTIQUITY +ANTIRABIES +ANTIRACHITIC +ANTIRACISM +ANTIRACISMS +ANTIRACIST +ANTIRACISTS +ANTIRADAR +ANTIRADARS +ANTIRADICAL +ANTIRADICALISM +ANTIRADICALISMS +ANTIRAPE +ANTIRATIONAL +ANTIRATIONALISM +ANTIRATIONALIST +ANTIRATIONALITY +ANTIREALISM +ANTIREALISMS +ANTIREALIST +ANTIREALISTS +ANTIRECESSION +ANTIRED +ANTIREFLECTION +ANTIREFLECTIVE +ANTIREFORM +ANTIREGULATORY +ANTIREJECTION +ANTIRELIGION +ANTIRELIGIOUS +ANTIRHEUMATIC +ANTIRHEUMATICS +ANTIRIOT +ANTIRITUALISM +ANTIRITUALISMS +ANTIROCK +ANTIROLL +ANTIROMANTIC +ANTIROMANTICISM +ANTIROMANTICS +ANTIROYAL +ANTIROYALIST +ANTIROYALISTS +ANTIRRHINUM +ANTIRRHINUMS +ANTIRUST +ANTIRUSTS +ANTIS +ANTISAG +ANTISATELLITE +ANTISCIENCE +ANTISCIENCES +ANTISCIENTIFIC +ANTISCORBUTIC +ANTISCORBUTICS +ANTISECRECY +ANTISEGREGATION +ANTISEIZURE +ANTISENSE +ANTISENTIMENTAL +ANTISEPARATIST +ANTISEPARATISTS +ANTISEPSES +ANTISEPSIS +ANTISEPTIC +ANTISEPTICALLY +ANTISEPTICS +ANTISERA +ANTISERUM +ANTISERUMS +ANTISEX +ANTISEXIST +ANTISEXISTS +ANTISEXUAL +ANTISEXUALITIES +ANTISEXUALITY +ANTISHARK +ANTISHIP +ANTISHOCK +ANTISHOCKS +ANTISHOPLIFTING +ANTISKID +ANTISLAVERY +ANTISLEEP +ANTISLIP +ANTISMOG +ANTISMOKE +ANTISMOKER +ANTISMOKERS +ANTISMOKING +ANTISMUGGLING +ANTISMUT +ANTISNOB +ANTISNOBS +ANTISOCIAL +ANTISOCIALIST +ANTISOCIALISTS +ANTISOCIALLY +ANTISOLAR +ANTISPAM +ANTISPASMODIC +ANTISPASMODICS +ANTISPECULATION +ANTISPECULATIVE +ANTISPENDING +ANTISTAT +ANTISTATE +ANTISTATIC +ANTISTATS +ANTISTICK +ANTISTORIES +ANTISTORY +ANTISTRESS +ANTISTRIKE +ANTISTROPHE +ANTISTROPHES +ANTISTROPHIC +ANTISTUDENT +ANTISTYLE +ANTISTYLES +ANTISUBMARINE +ANTISUBSIDY +ANTISUBVERSION +ANTISUBVERSIVE +ANTISUICIDE +ANTISYMMETRIC +ANTISYPHILITIC +ANTISYPHILITICS +ANTITAKEOVER +ANTITANK +ANTITARNISH +ANTITAX +ANTITECHNOLOGY +ANTITERRORISM +ANTITERRORISMS +ANTITERRORIST +ANTITERRORISTS +ANTITHEFT +ANTITHEORETICAL +ANTITHESES +ANTITHESIS +ANTITHETIC +ANTITHETICAL +ANTITHETICALLY +ANTITHROMBIN +ANTITHROMBINS +ANTITHYROID +ANTITOBACCO +ANTITOXIC +ANTITOXIN +ANTITOXINS +ANTITRADE +ANTITRADES +ANTITRADITIONAL +ANTITRAGI +ANTITRAGUS +ANTITRUST +ANTITRUSTER +ANTITRUSTERS +ANTITUBERCULAR +ANTITUBERCULOUS +ANTITUMOR +ANTITUMORAL +ANTITUMORS +ANTITUSSIVE +ANTITUSSIVES +ANTITYPE +ANTITYPES +ANTITYPHOID +ANTITYPIC +ANTIULCER +ANTIUNION +ANTIUNIVERSITY +ANTIURBAN +ANTIVENIN +ANTIVENINS +ANTIVENOM +ANTIVENOMS +ANTIVIOLENCE +ANTIVIRAL +ANTIVIRUS +ANTIVIRUSES +ANTIVITAMIN +ANTIVITAMINS +ANTIVIVISECTION +ANTIWAR +ANTIWEAR +ANTIWEED +ANTIWELFARE +ANTIWHALING +ANTIWHITE +ANTIWOMAN +ANTIWRINKLE +ANTLER +ANTLERED +ANTLERS +ANTLIKE +ANTLION +ANTLIONS +ANTONOMASIA +ANTONOMASIAS +ANTONYM +ANTONYMIC +ANTONYMIES +ANTONYMOUS +ANTONYMS +ANTONYMY +ANTRA +ANTRAL +ANTRE +ANTRES +ANTRORSE +ANTRUM +ANTRUMS +ANTS +ANTSIER +ANTSIEST +ANTSINESS +ANTSINESSES +ANTSY +ANURAL +ANURAN +ANURANS +ANURESES +ANURESIS +ANURETIC +ANURIA +ANURIAS +ANURIC +ANUROUS +ANUS +ANUSES +ANVIL +ANVILED +ANVILING +ANVILLED +ANVILLING +ANVILS +ANVILTOP +ANVILTOPS +ANXIETIES +ANXIETY +ANXIOLYTIC +ANXIOLYTICS +ANXIOUS +ANXIOUSLY +ANXIOUSNESS +ANXIOUSNESSES +ANY +ANYBODIES +ANYBODY +ANYHOW +ANYMORE +ANYON +ANYONE +ANYONS +ANYPLACE +ANYTHING +ANYTHINGS +ANYTIME +ANYWAY +ANYWAYS +ANYWHERE +ANYWHERES +ANYWISE +AORIST +AORISTIC +AORISTICALLY +AORISTS +AORTA +AORTAE +AORTAL +AORTAS +AORTIC +AORTOGRAPHIC +AORTOGRAPHIES +AORTOGRAPHY +AOUDAD +AOUDADS +APACE +APACHE +APACHES +APAGOGE +APAGOGES +APAGOGIC +APANAGE +APANAGES +APAREJO +APAREJOS +APART +APARTHEID +APARTHEIDS +APARTMENT +APARTMENTAL +APARTMENTS +APARTNESS +APARTNESSES +APATETIC +APATHETIC +APATHETICALLY +APATHIES +APATHY +APATITE +APATITES +APATOSAUR +APATOSAURS +APATOSAURUS +APATOSAURUSES +APE +APEAK +APED +APEEK +APELIKE +APER +APERCU +APERCUS +APERIENT +APERIENTS +APERIES +APERIODIC +APERIODICALLY +APERIODICITIES +APERIODICITY +APERITIF +APERITIFS +APERS +APERTURAL +APERTURE +APERTURED +APERTURES +APERY +APES +APETALIES +APETALOUS +APETALY +APEX +APEXES +APHAERESES +APHAERESIS +APHAERETIC +APHAGIA +APHAGIAS +APHANITE +APHANITES +APHANITIC +APHASIA +APHASIAC +APHASIACS +APHASIAS +APHASIC +APHASICS +APHELIA +APHELIAN +APHELION +APHELIONS +APHERESES +APHERESIS +APHERETIC +APHESES +APHESIS +APHETIC +APHETICALLY +APHID +APHIDES +APHIDIAN +APHIDIANS +APHIDS +APHIS +APHOLATE +APHOLATES +APHONIA +APHONIAS +APHONIC +APHONICS +APHORISE +APHORISED +APHORISES +APHORISING +APHORISM +APHORISMS +APHORIST +APHORISTIC +APHORISTICALLY +APHORISTS +APHORIZE +APHORIZED +APHORIZER +APHORIZERS +APHORIZES +APHORIZING +APHOTIC +APHRODISIAC +APHRODISIACAL +APHRODISIACS +APHRODITE +APHRODITES +APHTHA +APHTHAE +APHTHOUS +APHYLLIES +APHYLLOUS +APHYLLY +APIACEOUS +APIAN +APIARIAN +APIARIANS +APIARIES +APIARIST +APIARISTS +APIARY +APICAL +APICALLY +APICALS +APICES +APICULATE +APICULI +APICULTURAL +APICULTURE +APICULTURES +APICULTURIST +APICULTURISTS +APICULUS +APIECE +APIMANIA +APIMANIAS +APING +APIOLOGIES +APIOLOGY +APISH +APISHLY +APISHNESS +APISHNESSES +APIVOROUS +APLANATIC +APLASIA +APLASIAS +APLASTIC +APLENTY +APLITE +APLITES +APLITIC +APLOMB +APLOMBS +APNEA +APNEAL +APNEAS +APNEIC +APNOEA +APNOEAL +APNOEAS +APNOEIC +APO +APOAPSES +APOAPSIDES +APOAPSIS +APOCALYPSE +APOCALYPSES +APOCALYPTIC +APOCALYPTICAL +APOCALYPTICALLY +APOCALYPTICISM +APOCALYPTICISMS +APOCALYPTISM +APOCALYPTISMS +APOCALYPTIST +APOCALYPTISTS +APOCARP +APOCARPIES +APOCARPS +APOCARPY +APOCHROMATIC +APOCOPATE +APOCOPATED +APOCOPATES +APOCOPATING +APOCOPE +APOCOPES +APOCOPIC +APOCRINE +APOCRYPHA +APOCRYPHAL +APOCRYPHALLY +APOCRYPHALNESS +APOD +APODAL +APODEICTIC +APODICTIC +APODICTICALLY +APODOSES +APODOSIS +APODOUS +APODS +APOENZYME +APOENZYMES +APOGAMIC +APOGAMIES +APOGAMOUS +APOGAMY +APOGEAL +APOGEAN +APOGEE +APOGEES +APOGEIC +APOLIPOPROTEIN +APOLIPOPROTEINS +APOLITICAL +APOLITICALLY +APOLLO +APOLLOS +APOLOG +APOLOGAL +APOLOGETIC +APOLOGETICALLY +APOLOGETICS +APOLOGIA +APOLOGIAE +APOLOGIAS +APOLOGIES +APOLOGISE +APOLOGISED +APOLOGISES +APOLOGISING +APOLOGIST +APOLOGISTS +APOLOGIZE +APOLOGIZED +APOLOGIZER +APOLOGIZERS +APOLOGIZES +APOLOGIZING +APOLOGS +APOLOGUE +APOLOGUES +APOLOGY +APOLUNE +APOLUNES +APOMICT +APOMICTIC +APOMICTICALLY +APOMICTS +APOMIXES +APOMIXIS +APOMORPHINE +APOMORPHINES +APONEUROSES +APONEUROSIS +APONEUROTIC +APOPHASES +APOPHASIS +APOPHONIES +APOPHONY +APOPHTHEGM +APOPHTHEGMS +APOPHYGE +APOPHYGES +APOPHYLLITE +APOPHYLLITES +APOPHYSEAL +APOPHYSES +APOPHYSIS +APOPLECTIC +APOPLECTICALLY +APOPLEXIES +APOPLEXY +APOPTOSES +APOPTOSIS +APOPTOTIC +APORIA +APORIAS +APORT +APOS +APOSEMATIC +APOSEMATICALLY +APOSIOPESES +APOSIOPESIS +APOSIOPETIC +APOSPORIC +APOSPORIES +APOSPOROUS +APOSPORY +APOSTACIES +APOSTACY +APOSTASIES +APOSTASY +APOSTATE +APOSTATES +APOSTATISE +APOSTATISED +APOSTATISES +APOSTATISING +APOSTATIZE +APOSTATIZED +APOSTATIZES +APOSTATIZING +APOSTIL +APOSTILLE +APOSTILLES +APOSTILS +APOSTLE +APOSTLES +APOSTLESHIP +APOSTLESHIPS +APOSTOLATE +APOSTOLATES +APOSTOLIC +APOSTOLICITIES +APOSTOLICITY +APOSTROPHE +APOSTROPHES +APOSTROPHIC +APOSTROPHISE +APOSTROPHISED +APOSTROPHISES +APOSTROPHISING +APOSTROPHIZE +APOSTROPHIZED +APOSTROPHIZES +APOSTROPHIZING +APOTHECARIES +APOTHECARY +APOTHECE +APOTHECES +APOTHECIA +APOTHECIAL +APOTHECIUM +APOTHEGM +APOTHEGMATIC +APOTHEGMS +APOTHEM +APOTHEMS +APOTHEOSES +APOTHEOSIS +APOTHEOSIZE +APOTHEOSIZED +APOTHEOSIZES +APOTHEOSIZING +APOTROPAIC +APOTROPAICALLY +APP +APPAL +APPALL +APPALLED +APPALLING +APPALLINGLY +APPALLS +APPALOOSA +APPALOOSAS +APPALS +APPANAGE +APPANAGES +APPARAT +APPARATCHIK +APPARATCHIKI +APPARATCHIKS +APPARATS +APPARATUS +APPARATUSES +APPAREL +APPARELED +APPARELING +APPARELLED +APPARELLING +APPARELS +APPARENT +APPARENTLY +APPARENTNESS +APPARENTNESSES +APPARITION +APPARITIONAL +APPARITIONS +APPARITOR +APPARITORS +APPEAL +APPEALABILITIES +APPEALABILITY +APPEALABLE +APPEALED +APPEALER +APPEALERS +APPEALING +APPEALINGLY +APPEALS +APPEAR +APPEARANCE +APPEARANCES +APPEARED +APPEARING +APPEARS +APPEASABLE +APPEASE +APPEASED +APPEASEMENT +APPEASEMENTS +APPEASER +APPEASERS +APPEASES +APPEASING +APPEL +APPELLANT +APPELLANTS +APPELLATE +APPELLATION +APPELLATIONS +APPELLATIVE +APPELLATIVELY +APPELLATIVES +APPELLEE +APPELLEES +APPELLOR +APPELLORS +APPELS +APPEND +APPENDAGE +APPENDAGES +APPENDANT +APPENDANTS +APPENDECTOMIES +APPENDECTOMY +APPENDED +APPENDENT +APPENDENTS +APPENDICECTOMY +APPENDICES +APPENDICITIS +APPENDICITISES +APPENDICULAR +APPENDING +APPENDIX +APPENDIXES +APPENDS +APPERCEIVE +APPERCEIVED +APPERCEIVES +APPERCEIVING +APPERCEPTION +APPERCEPTIONS +APPERCEPTIVE +APPERTAIN +APPERTAINED +APPERTAINING +APPERTAINS +APPESTAT +APPESTATS +APPETENCE +APPETENCES +APPETENCIES +APPETENCY +APPETENT +APPETISER +APPETISERS +APPETISING +APPETITE +APPETITES +APPETITIVE +APPETIZER +APPETIZERS +APPETIZING +APPETIZINGLY +APPLAUD +APPLAUDABLE +APPLAUDABLY +APPLAUDED +APPLAUDER +APPLAUDERS +APPLAUDING +APPLAUDS +APPLAUSE +APPLAUSES +APPLE +APPLECART +APPLECARTS +APPLEJACK +APPLEJACKS +APPLES +APPLESAUCE +APPLESAUCES +APPLET +APPLETS +APPLIABLE +APPLIANCE +APPLIANCES +APPLICABILITIES +APPLICABILITY +APPLICABLE +APPLICANT +APPLICANTS +APPLICATION +APPLICATIONS +APPLICATIVE +APPLICATIVELY +APPLICATOR +APPLICATORS +APPLICATORY +APPLIED +APPLIER +APPLIERS +APPLIES +APPLIQUE +APPLIQUED +APPLIQUEING +APPLIQUES +APPLY +APPLYING +APPOGGIATURA +APPOGGIATURAS +APPOINT +APPOINTED +APPOINTEE +APPOINTEES +APPOINTER +APPOINTERS +APPOINTING +APPOINTIVE +APPOINTMENT +APPOINTMENTS +APPOINTOR +APPOINTORS +APPOINTS +APPORTION +APPORTIONABLE +APPORTIONED +APPORTIONING +APPORTIONMENT +APPORTIONMENTS +APPORTIONS +APPOSABLE +APPOSE +APPOSED +APPOSER +APPOSERS +APPOSES +APPOSING +APPOSITE +APPOSITELY +APPOSITENESS +APPOSITENESSES +APPOSITION +APPOSITIONAL +APPOSITIONS +APPOSITIVE +APPOSITIVELY +APPOSITIVES +APPRAISAL +APPRAISALS +APPRAISE +APPRAISED +APPRAISEE +APPRAISEES +APPRAISEMENT +APPRAISEMENTS +APPRAISER +APPRAISERS +APPRAISES +APPRAISING +APPRAISINGLY +APPRAISIVE +APPRECIABLE +APPRECIABLY +APPRECIATE +APPRECIATED +APPRECIATES +APPRECIATING +APPRECIATION +APPRECIATIONS +APPRECIATIVE +APPRECIATIVELY +APPRECIATOR +APPRECIATORS +APPRECIATORY +APPREHEND +APPREHENDED +APPREHENDING +APPREHENDS +APPREHENSIBLE +APPREHENSIBLY +APPREHENSION +APPREHENSIONS +APPREHENSIVE +APPREHENSIVELY +APPRENTICE +APPRENTICED +APPRENTICES +APPRENTICESHIP +APPRENTICESHIPS +APPRENTICING +APPRESSED +APPRESSORIA +APPRESSORIUM +APPRISE +APPRISED +APPRISER +APPRISERS +APPRISES +APPRISING +APPRIZE +APPRIZED +APPRIZER +APPRIZERS +APPRIZES +APPRIZING +APPROACH +APPROACHABILITY +APPROACHABLE +APPROACHED +APPROACHES +APPROACHING +APPROBATE +APPROBATED +APPROBATES +APPROBATING +APPROBATION +APPROBATIONS +APPROBATORY +APPROPRIABLE +APPROPRIATE +APPROPRIATED +APPROPRIATELY +APPROPRIATENESS +APPROPRIATES +APPROPRIATING +APPROPRIATION +APPROPRIATIONS +APPROPRIATIVE +APPROPRIATOR +APPROPRIATORS +APPROVABLE +APPROVABLY +APPROVAL +APPROVALS +APPROVE +APPROVED +APPROVER +APPROVERS +APPROVES +APPROVING +APPROVINGLY +APPROXIMATE +APPROXIMATED +APPROXIMATELY +APPROXIMATES +APPROXIMATING +APPROXIMATION +APPROXIMATIONS +APPROXIMATIVE +APPS +APPULSE +APPULSES +APPURTENANCE +APPURTENANCES +APPURTENANT +APPURTENANTS +APRACTIC +APRAXIA +APRAXIAS +APRAXIC +APRES +APRICOT +APRICOTS +APRIORITIES +APRIORITY +APRON +APRONED +APRONING +APRONLIKE +APRONS +APROPOS +APROTIC +APSE +APSES +APSIDAL +APSIDES +APSIS +APT +APTER +APTERAL +APTERIA +APTERIUM +APTEROUS +APTERYX +APTERYXES +APTEST +APTITUDE +APTITUDES +APTITUDINAL +APTITUDINALLY +APTLY +APTNESS +APTNESSES +APYRASE +APYRASES +APYRETIC +AQUA +AQUACADE +AQUACADES +AQUACULTURAL +AQUACULTURE +AQUACULTURES +AQUACULTURIST +AQUACULTURISTS +AQUAE +AQUAFARM +AQUAFARMED +AQUAFARMING +AQUAFARMS +AQUALUNG +AQUALUNGS +AQUAMARINE +AQUAMARINES +AQUANAUT +AQUANAUTS +AQUAPLANE +AQUAPLANED +AQUAPLANER +AQUAPLANERS +AQUAPLANES +AQUAPLANING +AQUARELLE +AQUARELLES +AQUARELLIST +AQUARELLISTS +AQUARIA +AQUARIAL +AQUARIAN +AQUARIANS +AQUARIST +AQUARISTS +AQUARIUM +AQUARIUMS +AQUAS +AQUATIC +AQUATICALLY +AQUATICS +AQUATINT +AQUATINTED +AQUATINTER +AQUATINTERS +AQUATINTING +AQUATINTIST +AQUATINTISTS +AQUATINTS +AQUATONE +AQUATONES +AQUAVIT +AQUAVITS +AQUEDUCT +AQUEDUCTS +AQUEOUS +AQUEOUSLY +AQUICULTURE +AQUICULTURES +AQUIFER +AQUIFEROUS +AQUIFERS +AQUILEGIA +AQUILEGIAS +AQUILINE +AQUILINITIES +AQUILINITY +AQUIVER +AR +ARABESK +ARABESKS +ARABESQUE +ARABESQUES +ARABIC +ARABICA +ARABICAS +ARABICIZATION +ARABICIZATIONS +ARABICIZE +ARABICIZED +ARABICIZES +ARABICIZING +ARABILITIES +ARABILITY +ARABINOSE +ARABINOSES +ARABINOSIDE +ARABINOSIDES +ARABIZE +ARABIZED +ARABIZES +ARABIZING +ARABLE +ARABLES +ARACEOUS +ARACHNID +ARACHNIDS +ARACHNOID +ARACHNOIDS +ARAGONITE +ARAGONITES +ARAGONITIC +ARAK +ARAKS +ARAME +ARAMES +ARAMID +ARAMIDS +ARANEID +ARANEIDAN +ARANEIDS +ARAPAIMA +ARAPAIMAS +ARAROBA +ARAROBAS +ARAUCARIA +ARAUCARIAN +ARAUCARIAS +ARB +ARBALEST +ARBALESTS +ARBALIST +ARBALISTS +ARBELEST +ARBELESTS +ARBITER +ARBITERS +ARBITRABLE +ARBITRAGE +ARBITRAGED +ARBITRAGER +ARBITRAGERS +ARBITRAGES +ARBITRAGEUR +ARBITRAGEURS +ARBITRAGING +ARBITRAL +ARBITRAMENT +ARBITRAMENTS +ARBITRARILY +ARBITRARINESS +ARBITRARINESSES +ARBITRARY +ARBITRATE +ARBITRATED +ARBITRATES +ARBITRATING +ARBITRATION +ARBITRATIONAL +ARBITRATIONS +ARBITRATIVE +ARBITRATOR +ARBITRATORS +ARBITRESS +ARBITRESSES +ARBOR +ARBOREAL +ARBOREALLY +ARBORED +ARBOREOUS +ARBORES +ARBORESCENCE +ARBORESCENCES +ARBORESCENT +ARBORETA +ARBORETUM +ARBORETUMS +ARBORICULTURAL +ARBORICULTURE +ARBORICULTURES +ARBORIST +ARBORISTS +ARBORIZATION +ARBORIZATIONS +ARBORIZE +ARBORIZED +ARBORIZES +ARBORIZING +ARBOROUS +ARBORS +ARBORVITAE +ARBORVITAES +ARBOUR +ARBOURED +ARBOURS +ARBOVIRAL +ARBOVIRUS +ARBOVIRUSES +ARBS +ARBUSCLE +ARBUSCLES +ARBUTE +ARBUTEAN +ARBUTES +ARBUTUS +ARBUTUSES +ARC +ARCADE +ARCADED +ARCADES +ARCADIA +ARCADIAN +ARCADIANS +ARCADIAS +ARCADING +ARCADINGS +ARCANA +ARCANE +ARCANUM +ARCANUMS +ARCATURE +ARCATURES +ARCCOSINE +ARCCOSINES +ARCED +ARCH +ARCHAEA +ARCHAEAL +ARCHAEAN +ARCHAEANS +ARCHAEBACTERIA +ARCHAEBACTERIUM +ARCHAEOLOGICAL +ARCHAEOLOGIES +ARCHAEOLOGIST +ARCHAEOLOGISTS +ARCHAEOLOGY +ARCHAEON +ARCHAEOPTERYX +ARCHAEOPTERYXES +ARCHAIC +ARCHAICAL +ARCHAICALLY +ARCHAISE +ARCHAISED +ARCHAISES +ARCHAISING +ARCHAISM +ARCHAISMS +ARCHAIST +ARCHAISTIC +ARCHAISTS +ARCHAIZE +ARCHAIZED +ARCHAIZER +ARCHAIZERS +ARCHAIZES +ARCHAIZING +ARCHANGEL +ARCHANGELIC +ARCHANGELS +ARCHBISHOP +ARCHBISHOPRIC +ARCHBISHOPRICS +ARCHBISHOPS +ARCHDEACON +ARCHDEACONRIES +ARCHDEACONRY +ARCHDEACONS +ARCHDIOCESAN +ARCHDIOCESE +ARCHDIOCESES +ARCHDUCAL +ARCHDUCHESS +ARCHDUCHESSES +ARCHDUCHIES +ARCHDUCHY +ARCHDUKE +ARCHDUKEDOM +ARCHDUKEDOMS +ARCHDUKES +ARCHEAN +ARCHED +ARCHEGONIA +ARCHEGONIAL +ARCHEGONIATE +ARCHEGONIATES +ARCHEGONIUM +ARCHENEMIES +ARCHENEMY +ARCHENTERON +ARCHENTERONS +ARCHEOLOGIES +ARCHEOLOGY +ARCHER +ARCHERFISH +ARCHERFISHES +ARCHERIES +ARCHERS +ARCHERY +ARCHES +ARCHESPORIA +ARCHESPORIAL +ARCHESPORIUM +ARCHETYPAL +ARCHETYPALLY +ARCHETYPE +ARCHETYPES +ARCHETYPICAL +ARCHFIEND +ARCHFIENDS +ARCHFOE +ARCHFOES +ARCHICARP +ARCHICARPS +ARCHIDIACONAL +ARCHIEPISCOPAL +ARCHIEPISCOPATE +ARCHIL +ARCHILS +ARCHIMANDRITE +ARCHIMANDRITES +ARCHINE +ARCHINES +ARCHING +ARCHINGS +ARCHIPELAGIC +ARCHIPELAGO +ARCHIPELAGOES +ARCHIPELAGOS +ARCHITECT +ARCHITECTONIC +ARCHITECTONICS +ARCHITECTS +ARCHITECTURAL +ARCHITECTURALLY +ARCHITECTURE +ARCHITECTURES +ARCHITRAVE +ARCHITRAVES +ARCHIVAL +ARCHIVE +ARCHIVED +ARCHIVES +ARCHIVING +ARCHIVIST +ARCHIVISTS +ARCHIVOLT +ARCHIVOLTS +ARCHLY +ARCHNESS +ARCHNESSES +ARCHON +ARCHONS +ARCHOSAUR +ARCHOSAURIAN +ARCHOSAURS +ARCHPRIEST +ARCHPRIESTS +ARCHRIVAL +ARCHRIVALS +ARCHWAY +ARCHWAYS +ARCIFORM +ARCING +ARCKED +ARCKING +ARCO +ARCS +ARCSINE +ARCSINES +ARCTANGENT +ARCTANGENTS +ARCTIC +ARCTICALLY +ARCTICS +ARCUATE +ARCUATED +ARCUATELY +ARCUATION +ARCUATIONS +ARCUS +ARCUSES +ARDEB +ARDEBS +ARDENCIES +ARDENCY +ARDENT +ARDENTLY +ARDOR +ARDORS +ARDOUR +ARDOURS +ARDUOUS +ARDUOUSLY +ARDUOUSNESS +ARDUOUSNESSES +ARE +AREA +AREAE +AREAL +AREALLY +AREAS +AREAWAY +AREAWAYS +ARECA +ARECAS +ARECOLINE +ARECOLINES +AREIC +ARENA +ARENACEOUS +ARENAS +ARENE +ARENES +ARENICOLOUS +ARENITE +ARENITES +ARENOSE +ARENOUS +AREOCENTRIC +AREOLA +AREOLAE +AREOLAR +AREOLAS +AREOLATE +AREOLATED +AREOLE +AREOLES +AREOLOGIES +AREOLOGY +AREPA +AREPAS +ARES +ARETE +ARETES +ARETHUSA +ARETHUSAS +ARF +ARFS +ARGAL +ARGALA +ARGALAS +ARGALI +ARGALIS +ARGALS +ARGENT +ARGENTAL +ARGENTIC +ARGENTIFEROUS +ARGENTINE +ARGENTINES +ARGENTITE +ARGENTITES +ARGENTOUS +ARGENTS +ARGENTUM +ARGENTUMS +ARGIL +ARGILLACEOUS +ARGILLITE +ARGILLITES +ARGILS +ARGINASE +ARGINASES +ARGININE +ARGININES +ARGLE +ARGLED +ARGLES +ARGLING +ARGOL +ARGOLS +ARGON +ARGONAUT +ARGONAUTS +ARGONS +ARGOSIES +ARGOSY +ARGOT +ARGOTIC +ARGOTS +ARGUABLE +ARGUABLY +ARGUE +ARGUED +ARGUER +ARGUERS +ARGUES +ARGUFIED +ARGUFIER +ARGUFIERS +ARGUFIES +ARGUFY +ARGUFYING +ARGUING +ARGUMENT +ARGUMENTA +ARGUMENTATION +ARGUMENTATIONS +ARGUMENTATIVE +ARGUMENTATIVELY +ARGUMENTIVE +ARGUMENTS +ARGUMENTUM +ARGUS +ARGUSES +ARGYLE +ARGYLES +ARGYLL +ARGYLLS +ARHAT +ARHATS +ARHATSHIP +ARHATSHIPS +ARIA +ARIARY +ARIAS +ARIBOFLAVINOSES +ARIBOFLAVINOSIS +ARID +ARIDER +ARIDEST +ARIDITIES +ARIDITY +ARIDLY +ARIDNESS +ARIDNESSES +ARIEL +ARIELS +ARIETTA +ARIETTAS +ARIETTE +ARIETTES +ARIGHT +ARIL +ARILED +ARILLATE +ARILLODE +ARILLODES +ARILLOID +ARILS +ARIOSE +ARIOSI +ARIOSO +ARIOSOS +ARISE +ARISEN +ARISES +ARISING +ARISTA +ARISTAE +ARISTAS +ARISTATE +ARISTO +ARISTOCRACIES +ARISTOCRACY +ARISTOCRAT +ARISTOCRATIC +ARISTOCRATS +ARISTOS +ARITHMETIC +ARITHMETICAL +ARITHMETICALLY +ARITHMETICIAN +ARITHMETICIANS +ARITHMETICS +ARK +ARKOSE +ARKOSES +ARKOSIC +ARKS +ARLES +ARM +ARMADA +ARMADAS +ARMADILLO +ARMADILLOS +ARMAGNAC +ARMAGNACS +ARMAMENT +ARMAMENTARIA +ARMAMENTARIUM +ARMAMENTS +ARMATURE +ARMATURED +ARMATURES +ARMATURING +ARMBAND +ARMBANDS +ARMCHAIR +ARMCHAIRS +ARMED +ARMER +ARMERS +ARMET +ARMETS +ARMFUL +ARMFULS +ARMHOLE +ARMHOLES +ARMIES +ARMIGER +ARMIGERAL +ARMIGERO +ARMIGEROS +ARMIGEROUS +ARMIGERS +ARMILLA +ARMILLAE +ARMILLARY +ARMILLAS +ARMING +ARMINGS +ARMISTICE +ARMISTICES +ARMLESS +ARMLET +ARMLETS +ARMLIKE +ARMLOAD +ARMLOADS +ARMLOCK +ARMLOCKS +ARMOIRE +ARMOIRES +ARMONICA +ARMONICAS +ARMOR +ARMORED +ARMORER +ARMORERS +ARMORIAL +ARMORIALLY +ARMORIALS +ARMORIES +ARMORING +ARMORLESS +ARMORS +ARMORY +ARMOUR +ARMOURED +ARMOURER +ARMOURERS +ARMOURIES +ARMOURING +ARMOURS +ARMOURY +ARMPIT +ARMPITS +ARMREST +ARMRESTS +ARMS +ARMSFUL +ARMURE +ARMURES +ARMY +ARMYWORM +ARMYWORMS +ARNATTO +ARNATTOS +ARNICA +ARNICAS +ARNOTTO +ARNOTTOS +AROID +AROIDS +AROINT +AROINTED +AROINTING +AROINTS +AROMA +AROMAS +AROMATASE +AROMATASES +AROMATHERAPIES +AROMATHERAPIST +AROMATHERAPISTS +AROMATHERAPY +AROMATIC +AROMATICALLY +AROMATICITIES +AROMATICITY +AROMATICS +AROMATIZATION +AROMATIZATIONS +AROMATIZE +AROMATIZED +AROMATIZES +AROMATIZING +AROSE +AROUND +AROUSABLE +AROUSAL +AROUSALS +AROUSE +AROUSED +AROUSER +AROUSERS +AROUSES +AROUSING +AROYNT +AROYNTED +AROYNTING +AROYNTS +ARPEGGIATE +ARPEGGIATED +ARPEGGIATES +ARPEGGIATING +ARPEGGIO +ARPEGGIOS +ARPEN +ARPENS +ARPENT +ARPENTS +ARQUEBUS +ARQUEBUSES +ARRACK +ARRACKS +ARRAIGN +ARRAIGNED +ARRAIGNER +ARRAIGNERS +ARRAIGNING +ARRAIGNMENT +ARRAIGNMENTS +ARRAIGNS +ARRANGE +ARRANGED +ARRANGEMENT +ARRANGEMENTS +ARRANGER +ARRANGERS +ARRANGES +ARRANGING +ARRANT +ARRANTLY +ARRAS +ARRASED +ARRASES +ARRAY +ARRAYAL +ARRAYALS +ARRAYED +ARRAYER +ARRAYERS +ARRAYING +ARRAYS +ARREAR +ARREARAGE +ARREARAGES +ARREARS +ARREST +ARRESTANT +ARRESTANTS +ARRESTED +ARRESTEE +ARRESTEES +ARRESTER +ARRESTERS +ARRESTING +ARRESTINGLY +ARRESTIVE +ARRESTMENT +ARRESTMENTS +ARRESTOR +ARRESTORS +ARRESTS +ARRHIZAL +ARRHYTHMIA +ARRHYTHMIAS +ARRHYTHMIC +ARRIBA +ARRIS +ARRISES +ARRIVAL +ARRIVALS +ARRIVE +ARRIVED +ARRIVER +ARRIVERS +ARRIVES +ARRIVING +ARRIVISTE +ARRIVISTES +ARROBA +ARROBAS +ARROGANCE +ARROGANCES +ARROGANCIES +ARROGANCY +ARROGANT +ARROGANTLY +ARROGATE +ARROGATED +ARROGATES +ARROGATING +ARROGATION +ARROGATIONS +ARROGATOR +ARROGATORS +ARRONDISSEMENT +ARRONDISSEMENTS +ARROW +ARROWED +ARROWHEAD +ARROWHEADS +ARROWING +ARROWLESS +ARROWLIKE +ARROWROOT +ARROWROOTS +ARROWS +ARROWWOOD +ARROWWOODS +ARROWWORM +ARROWWORMS +ARROWY +ARROYO +ARROYOS +ARS +ARSE +ARSENAL +ARSENALS +ARSENATE +ARSENATES +ARSENIC +ARSENICAL +ARSENICALS +ARSENICS +ARSENIDE +ARSENIDES +ARSENIOUS +ARSENITE +ARSENITES +ARSENO +ARSENOPYRITE +ARSENOPYRITES +ARSENOUS +ARSES +ARSHIN +ARSHINS +ARSINE +ARSINES +ARSINO +ARSIS +ARSON +ARSONIST +ARSONISTS +ARSONOUS +ARSONS +ARSPHENAMINE +ARSPHENAMINES +ART +ARTAL +ARTEFACT +ARTEFACTS +ARTEL +ARTELS +ARTEMISIA +ARTEMISIAS +ARTERIAL +ARTERIALLY +ARTERIALS +ARTERIES +ARTERIOGRAM +ARTERIOGRAMS +ARTERIOGRAPHIC +ARTERIOGRAPHIES +ARTERIOGRAPHY +ARTERIOLAR +ARTERIOLE +ARTERIOLES +ARTERIOVENOUS +ARTERITIDES +ARTERITIS +ARTERY +ARTFUL +ARTFULLY +ARTFULNESS +ARTFULNESSES +ARTHRALGIA +ARTHRALGIAS +ARTHRALGIC +ARTHRITIC +ARTHRITICALLY +ARTHRITICS +ARTHRITIDES +ARTHRITIS +ARTHRODESES +ARTHRODESIS +ARTHROPATHIES +ARTHROPATHY +ARTHROPOD +ARTHROPODAN +ARTHROPODS +ARTHROSCOPE +ARTHROSCOPES +ARTHROSCOPIC +ARTHROSCOPIES +ARTHROSCOPY +ARTHROSES +ARTHROSIS +ARTHROSPORE +ARTHROSPORES +ARTICHOKE +ARTICHOKES +ARTICLE +ARTICLED +ARTICLES +ARTICLING +ARTICULABLE +ARTICULACIES +ARTICULACY +ARTICULAR +ARTICULATE +ARTICULATED +ARTICULATELY +ARTICULATENESS +ARTICULATES +ARTICULATING +ARTICULATION +ARTICULATIONS +ARTICULATIVE +ARTICULATOR +ARTICULATORS +ARTICULATORY +ARTIER +ARTIEST +ARTIFACT +ARTIFACTS +ARTIFACTUAL +ARTIFICE +ARTIFICER +ARTIFICERS +ARTIFICES +ARTIFICIAL +ARTIFICIALITIES +ARTIFICIALITY +ARTIFICIALLY +ARTIFICIALNESS +ARTILLERIES +ARTILLERIST +ARTILLERISTS +ARTILLERY +ARTILLERYMAN +ARTILLERYMEN +ARTILY +ARTINESS +ARTINESSES +ARTIODACTYL +ARTIODACTYLS +ARTISAN +ARTISANAL +ARTISANS +ARTISANSHIP +ARTISANSHIPS +ARTIST +ARTISTE +ARTISTES +ARTISTIC +ARTISTICALLY +ARTISTRIES +ARTISTRY +ARTISTS +ARTLESS +ARTLESSLY +ARTLESSNESS +ARTLESSNESSES +ARTS +ARTSIER +ARTSIEST +ARTSINESS +ARTSINESSES +ARTSY +ARTWORK +ARTWORKS +ARTY +ARUGOLA +ARUGOLAS +ARUGULA +ARUGULAS +ARUM +ARUMS +ARUSPEX +ARUSPICES +ARVAL +ARVO +ARVOS +ARYL +ARYLS +ARYTENOID +ARYTENOIDS +ARYTHMIA +ARYTHMIAS +ARYTHMIC +AS +ASAFETIDA +ASAFETIDAS +ASAFOETIDA +ASAFOETIDAS +ASANA +ASANAS +ASARUM +ASARUMS +ASBESTIC +ASBESTINE +ASBESTOS +ASBESTOSES +ASBESTOSIS +ASBESTOUS +ASBESTUS +ASBESTUSES +ASCARED +ASCARIASES +ASCARIASIS +ASCARID +ASCARIDES +ASCARIDS +ASCARIS +ASCEND +ASCENDABLE +ASCENDANCE +ASCENDANCES +ASCENDANCIES +ASCENDANCY +ASCENDANT +ASCENDANTLY +ASCENDANTS +ASCENDED +ASCENDENCE +ASCENDENCES +ASCENDENCIES +ASCENDENCY +ASCENDENT +ASCENDENTS +ASCENDER +ASCENDERS +ASCENDIBLE +ASCENDING +ASCENDS +ASCENSION +ASCENSIONAL +ASCENSIONS +ASCENSIVE +ASCENT +ASCENTS +ASCERTAIN +ASCERTAINABLE +ASCERTAINED +ASCERTAINING +ASCERTAINMENT +ASCERTAINMENTS +ASCERTAINS +ASCESES +ASCESIS +ASCETIC +ASCETICAL +ASCETICALLY +ASCETICISM +ASCETICISMS +ASCETICS +ASCI +ASCIDIA +ASCIDIAN +ASCIDIANS +ASCIDIATE +ASCIDIUM +ASCITES +ASCITIC +ASCLEPIAD +ASCLEPIADS +ASCOCARP +ASCOCARPIC +ASCOCARPS +ASCOGONIA +ASCOGONIUM +ASCOMYCETE +ASCOMYCETES +ASCOMYCETOUS +ASCORBATE +ASCORBATES +ASCORBIC +ASCOSPORE +ASCOSPORES +ASCOSPORIC +ASCOT +ASCOTS +ASCRIBABLE +ASCRIBE +ASCRIBED +ASCRIBES +ASCRIBING +ASCRIPTION +ASCRIPTIONS +ASCRIPTIVE +ASCUS +ASDIC +ASDICS +ASEA +ASEPSES +ASEPSIS +ASEPTIC +ASEPTICALLY +ASEXUAL +ASEXUALITIES +ASEXUALITY +ASEXUALLY +ASH +ASHAMED +ASHAMEDLY +ASHCAKE +ASHCAKES +ASHCAN +ASHCANS +ASHED +ASHEN +ASHES +ASHFALL +ASHFALLS +ASHIER +ASHIEST +ASHINESS +ASHINESSES +ASHING +ASHLAR +ASHLARED +ASHLARING +ASHLARS +ASHLER +ASHLERED +ASHLERING +ASHLERS +ASHLESS +ASHMAN +ASHMEN +ASHORE +ASHPLANT +ASHPLANTS +ASHRAM +ASHRAMS +ASHTRAY +ASHTRAYS +ASHY +ASIDE +ASIDES +ASININE +ASININELY +ASININITIES +ASININITY +ASK +ASKANCE +ASKANT +ASKED +ASKER +ASKERS +ASKESES +ASKESIS +ASKEW +ASKEWNESS +ASKEWNESSES +ASKING +ASKINGS +ASKOI +ASKOS +ASKS +ASLANT +ASLEEP +ASLOPE +ASLOSH +ASOCIAL +ASOCIALS +ASP +ASPARAGINE +ASPARAGINES +ASPARAGUS +ASPARAGUSES +ASPARKLE +ASPARTAME +ASPARTAMES +ASPARTATE +ASPARTATES +ASPECT +ASPECTS +ASPECTUAL +ASPEN +ASPENS +ASPER +ASPERATE +ASPERATED +ASPERATES +ASPERATING +ASPERGES +ASPERGILL +ASPERGILLA +ASPERGILLI +ASPERGILLOSES +ASPERGILLOSIS +ASPERGILLS +ASPERGILLUM +ASPERGILLUMS +ASPERGILLUS +ASPERITIES +ASPERITY +ASPERS +ASPERSE +ASPERSED +ASPERSER +ASPERSERS +ASPERSES +ASPERSING +ASPERSION +ASPERSIONS +ASPERSIVE +ASPERSOR +ASPERSORS +ASPHALT +ASPHALTED +ASPHALTIC +ASPHALTING +ASPHALTITE +ASPHALTITES +ASPHALTS +ASPHALTUM +ASPHALTUMS +ASPHERIC +ASPHERICAL +ASPHODEL +ASPHODELS +ASPHYXIA +ASPHYXIAL +ASPHYXIAS +ASPHYXIATE +ASPHYXIATED +ASPHYXIATES +ASPHYXIATING +ASPHYXIATION +ASPHYXIATIONS +ASPHYXIES +ASPHYXY +ASPIC +ASPICS +ASPIDISTRA +ASPIDISTRAS +ASPIRANT +ASPIRANTS +ASPIRATA +ASPIRATAE +ASPIRATE +ASPIRATED +ASPIRATES +ASPIRATING +ASPIRATION +ASPIRATIONAL +ASPIRATIONS +ASPIRATOR +ASPIRATORS +ASPIRE +ASPIRED +ASPIRER +ASPIRERS +ASPIRES +ASPIRIN +ASPIRING +ASPIRINS +ASPIS +ASPISES +ASPISH +ASPS +ASQUINT +ASRAMA +ASRAMAS +ASS +ASSAGAI +ASSAGAIED +ASSAGAIING +ASSAGAIS +ASSAI +ASSAIL +ASSAILABLE +ASSAILANT +ASSAILANTS +ASSAILED +ASSAILER +ASSAILERS +ASSAILING +ASSAILS +ASSAIS +ASSASSIN +ASSASSINATE +ASSASSINATED +ASSASSINATES +ASSASSINATING +ASSASSINATION +ASSASSINATIONS +ASSASSINATOR +ASSASSINATORS +ASSASSINS +ASSAULT +ASSAULTED +ASSAULTER +ASSAULTERS +ASSAULTING +ASSAULTIVE +ASSAULTIVELY +ASSAULTIVENESS +ASSAULTS +ASSAY +ASSAYABLE +ASSAYED +ASSAYER +ASSAYERS +ASSAYING +ASSAYS +ASSEGAI +ASSEGAIED +ASSEGAIING +ASSEGAIS +ASSEMBLAGE +ASSEMBLAGES +ASSEMBLAGIST +ASSEMBLAGISTS +ASSEMBLE +ASSEMBLED +ASSEMBLER +ASSEMBLERS +ASSEMBLES +ASSEMBLIES +ASSEMBLING +ASSEMBLY +ASSEMBLYMAN +ASSEMBLYMEN +ASSEMBLYWOMAN +ASSEMBLYWOMEN +ASSENT +ASSENTATION +ASSENTATIONS +ASSENTED +ASSENTER +ASSENTERS +ASSENTING +ASSENTIVE +ASSENTOR +ASSENTORS +ASSENTS +ASSERT +ASSERTED +ASSERTEDLY +ASSERTER +ASSERTERS +ASSERTING +ASSERTION +ASSERTIONS +ASSERTIVE +ASSERTIVELY +ASSERTIVENESS +ASSERTIVENESSES +ASSERTOR +ASSERTORS +ASSERTS +ASSES +ASSESS +ASSESSABLE +ASSESSED +ASSESSES +ASSESSING +ASSESSMENT +ASSESSMENTS +ASSESSOR +ASSESSORS +ASSET +ASSETLESS +ASSETS +ASSEVERATE +ASSEVERATED +ASSEVERATES +ASSEVERATING +ASSEVERATION +ASSEVERATIONS +ASSEVERATIVE +ASSHOLE +ASSHOLES +ASSIDUITIES +ASSIDUITY +ASSIDUOUS +ASSIDUOUSLY +ASSIDUOUSNESS +ASSIDUOUSNESSES +ASSIGN +ASSIGNABILITIES +ASSIGNABILITY +ASSIGNABLE +ASSIGNAT +ASSIGNATION +ASSIGNATIONS +ASSIGNATS +ASSIGNED +ASSIGNEE +ASSIGNEES +ASSIGNER +ASSIGNERS +ASSIGNING +ASSIGNMENT +ASSIGNMENTS +ASSIGNOR +ASSIGNORS +ASSIGNS +ASSIMILABILITY +ASSIMILABLE +ASSIMILATE +ASSIMILATED +ASSIMILATES +ASSIMILATING +ASSIMILATION +ASSIMILATIONISM +ASSIMILATIONIST +ASSIMILATIONS +ASSIMILATIVE +ASSIMILATOR +ASSIMILATORS +ASSIMILATORY +ASSIST +ASSISTANCE +ASSISTANCES +ASSISTANT +ASSISTANTS +ASSISTANTSHIP +ASSISTANTSHIPS +ASSISTED +ASSISTER +ASSISTERS +ASSISTING +ASSISTIVE +ASSISTOR +ASSISTORS +ASSISTS +ASSIZE +ASSIZES +ASSLIKE +ASSOCIATE +ASSOCIATED +ASSOCIATES +ASSOCIATESHIP +ASSOCIATESHIPS +ASSOCIATING +ASSOCIATION +ASSOCIATIONAL +ASSOCIATIONISM +ASSOCIATIONISMS +ASSOCIATIONIST +ASSOCIATIONISTS +ASSOCIATIONS +ASSOCIATIVE +ASSOCIATIVELY +ASSOCIATIVITIES +ASSOCIATIVITY +ASSOIL +ASSOILED +ASSOILING +ASSOILMENT +ASSOILMENTS +ASSOILS +ASSONANCE +ASSONANCES +ASSONANT +ASSONANTAL +ASSONANTS +ASSORT +ASSORTATIVE +ASSORTATIVELY +ASSORTED +ASSORTER +ASSORTERS +ASSORTING +ASSORTMENT +ASSORTMENTS +ASSORTS +ASSUAGE +ASSUAGED +ASSUAGEMENT +ASSUAGEMENTS +ASSUAGER +ASSUAGERS +ASSUAGES +ASSUAGING +ASSUASIVE +ASSUMABILITIES +ASSUMABILITY +ASSUMABLE +ASSUMABLY +ASSUME +ASSUMED +ASSUMEDLY +ASSUMER +ASSUMERS +ASSUMES +ASSUMING +ASSUMPSIT +ASSUMPSITS +ASSUMPTION +ASSUMPTIONS +ASSUMPTIVE +ASSURABLE +ASSURANCE +ASSURANCES +ASSURE +ASSURED +ASSUREDLY +ASSUREDNESS +ASSUREDNESSES +ASSUREDS +ASSURER +ASSURERS +ASSURES +ASSURGENT +ASSURING +ASSUROR +ASSURORS +ASSWAGE +ASSWAGED +ASSWAGES +ASSWAGING +ASTARBOARD +ASTASIA +ASTASIAS +ASTATIC +ASTATINE +ASTATINES +ASTER +ASTERIA +ASTERIAS +ASTERIATED +ASTERISK +ASTERISKED +ASTERISKING +ASTERISKLESS +ASTERISKS +ASTERISM +ASTERISMS +ASTERN +ASTERNAL +ASTEROID +ASTEROIDAL +ASTEROIDS +ASTERS +ASTHENIA +ASTHENIAS +ASTHENIC +ASTHENICS +ASTHENIES +ASTHENOSPHERE +ASTHENOSPHERES +ASTHENOSPHERIC +ASTHENY +ASTHMA +ASTHMAS +ASTHMATIC +ASTHMATICALLY +ASTHMATICS +ASTIGMATIC +ASTIGMATICS +ASTIGMATISM +ASTIGMATISMS +ASTIGMIA +ASTIGMIAS +ASTILBE +ASTILBES +ASTIR +ASTOMATAL +ASTOMOUS +ASTONIED +ASTONIES +ASTONISH +ASTONISHED +ASTONISHES +ASTONISHING +ASTONISHINGLY +ASTONISHMENT +ASTONISHMENTS +ASTONY +ASTONYING +ASTOUND +ASTOUNDED +ASTOUNDING +ASTOUNDINGLY +ASTOUNDS +ASTRACHAN +ASTRACHANS +ASTRADDLE +ASTRAGAL +ASTRAGALI +ASTRAGALS +ASTRAGALUS +ASTRAKHAN +ASTRAKHANS +ASTRAL +ASTRALLY +ASTRALS +ASTRAY +ASTRICT +ASTRICTED +ASTRICTING +ASTRICTS +ASTRIDE +ASTRINGE +ASTRINGED +ASTRINGENCIES +ASTRINGENCY +ASTRINGENT +ASTRINGENTLY +ASTRINGENTS +ASTRINGES +ASTRINGING +ASTROBIOLOGIES +ASTROBIOLOGIST +ASTROBIOLOGISTS +ASTROBIOLOGY +ASTROCYTE +ASTROCYTES +ASTROCYTIC +ASTROCYTOMA +ASTROCYTOMAS +ASTROCYTOMATA +ASTRODOME +ASTRODOMES +ASTROLABE +ASTROLABES +ASTROLOGER +ASTROLOGERS +ASTROLOGICAL +ASTROLOGICALLY +ASTROLOGIES +ASTROLOGY +ASTROMETRIC +ASTROMETRIES +ASTROMETRY +ASTRONAUT +ASTRONAUTIC +ASTRONAUTICAL +ASTRONAUTICALLY +ASTRONAUTICS +ASTRONAUTS +ASTRONOMER +ASTRONOMERS +ASTRONOMIC +ASTRONOMICAL +ASTRONOMICALLY +ASTRONOMIES +ASTRONOMY +ASTROPHOTOGRAPH +ASTROPHYSICAL +ASTROPHYSICALLY +ASTROPHYSICIST +ASTROPHYSICISTS +ASTROPHYSICS +ASTUTE +ASTUTELY +ASTUTENESS +ASTUTENESSES +ASTYLAR +ASUNDER +ASWARM +ASWIRL +ASWOON +ASYLA +ASYLLABIC +ASYLUM +ASYLUMS +ASYMMETRIC +ASYMMETRICAL +ASYMMETRICALLY +ASYMMETRIES +ASYMMETRY +ASYMPTOMATIC +ASYMPTOTE +ASYMPTOTES +ASYMPTOTIC +ASYMPTOTICALLY +ASYNAPSES +ASYNAPSIS +ASYNCHRONIES +ASYNCHRONISM +ASYNCHRONISMS +ASYNCHRONOUS +ASYNCHRONOUSLY +ASYNCHRONY +ASYNDETA +ASYNDETIC +ASYNDETICALLY +ASYNDETON +ASYNDETONS +AT +ATABAL +ATABALS +ATABRINE +ATABRINES +ATACTIC +ATAGHAN +ATAGHANS +ATALAYA +ATALAYAS +ATAMAN +ATAMANS +ATAMASCO +ATAMASCOS +ATAP +ATAPS +ATARACTIC +ATARACTICS +ATARAXIA +ATARAXIAS +ATARAXIC +ATARAXICS +ATARAXIES +ATARAXY +ATAVIC +ATAVISM +ATAVISMS +ATAVIST +ATAVISTIC +ATAVISTICALLY +ATAVISTS +ATAXIA +ATAXIAS +ATAXIC +ATAXICS +ATAXIES +ATAXY +ATE +ATECHNIC +ATELECTASES +ATELECTASIS +ATELIC +ATELIER +ATELIERS +ATEMOYA +ATEMOYAS +ATEMPORAL +ATENOLOL +ATENOLOLS +ATES +ATHANASIES +ATHANASY +ATHEISM +ATHEISMS +ATHEIST +ATHEISTIC +ATHEISTICAL +ATHEISTICALLY +ATHEISTS +ATHELING +ATHELINGS +ATHENAEUM +ATHENAEUMS +ATHENEUM +ATHENEUMS +ATHEORETICAL +ATHEROGENESES +ATHEROGENESIS +ATHEROGENIC +ATHEROMA +ATHEROMAS +ATHEROMATA +ATHEROMATOUS +ATHEROSCLEROSES +ATHEROSCLEROSIS +ATHEROSCLEROTIC +ATHETOID +ATHETOSES +ATHETOSIS +ATHETOTIC +ATHIRST +ATHLETE +ATHLETES +ATHLETIC +ATHLETICALLY +ATHLETICISM +ATHLETICISMS +ATHLETICS +ATHODYD +ATHODYDS +ATHROCYTE +ATHROCYTES +ATHWART +ATHWARTSHIP +ATHWARTSHIPS +ATILT +ATINGLE +ATLANTES +ATLAS +ATLASES +ATLATL +ATLATLS +ATMA +ATMAN +ATMANS +ATMAS +ATMOMETER +ATMOMETERS +ATMOSPHERE +ATMOSPHERED +ATMOSPHERES +ATMOSPHERIC +ATMOSPHERICALLY +ATMOSPHERICS +ATOLL +ATOLLS +ATOM +ATOMIC +ATOMICAL +ATOMICALLY +ATOMICITIES +ATOMICITY +ATOMICS +ATOMIES +ATOMISE +ATOMISED +ATOMISER +ATOMISERS +ATOMISES +ATOMISING +ATOMISM +ATOMISMS +ATOMIST +ATOMISTIC +ATOMISTICALLY +ATOMISTS +ATOMIZATION +ATOMIZATIONS +ATOMIZE +ATOMIZED +ATOMIZER +ATOMIZERS +ATOMIZES +ATOMIZING +ATOMS +ATOMY +ATONABLE +ATONAL +ATONALISM +ATONALISMS +ATONALIST +ATONALISTS +ATONALITIES +ATONALITY +ATONALLY +ATONE +ATONEABLE +ATONED +ATONEMENT +ATONEMENTS +ATONER +ATONERS +ATONES +ATONIA +ATONIAS +ATONIC +ATONICITIES +ATONICITY +ATONICS +ATONIES +ATONING +ATONINGLY +ATONY +ATOP +ATOPIC +ATOPIES +ATOPY +ATRABILIOUS +ATRABILIOUSNESS +ATRAZINE +ATRAZINES +ATREMBLE +ATRESIA +ATRESIAS +ATRESIC +ATRETIC +ATRIA +ATRIAL +ATRIP +ATRIUM +ATRIUMS +ATROCIOUS +ATROCIOUSLY +ATROCIOUSNESS +ATROCIOUSNESSES +ATROCITIES +ATROCITY +ATROPHIA +ATROPHIAS +ATROPHIC +ATROPHIED +ATROPHIES +ATROPHY +ATROPHYING +ATROPIN +ATROPINE +ATROPINES +ATROPINS +ATROPISM +ATROPISMS +ATT +ATTABOY +ATTACH +ATTACHABLE +ATTACHE +ATTACHED +ATTACHER +ATTACHERS +ATTACHES +ATTACHING +ATTACHMENT +ATTACHMENTS +ATTACK +ATTACKED +ATTACKER +ATTACKERS +ATTACKING +ATTACKMAN +ATTACKMEN +ATTACKS +ATTAGIRL +ATTAIN +ATTAINABILITIES +ATTAINABILITY +ATTAINABLE +ATTAINDER +ATTAINDERS +ATTAINED +ATTAINER +ATTAINERS +ATTAINING +ATTAINMENT +ATTAINMENTS +ATTAINS +ATTAINT +ATTAINTED +ATTAINTING +ATTAINTS +ATTAR +ATTARS +ATTEMPER +ATTEMPERED +ATTEMPERING +ATTEMPERS +ATTEMPT +ATTEMPTABLE +ATTEMPTED +ATTEMPTER +ATTEMPTERS +ATTEMPTING +ATTEMPTS +ATTEND +ATTENDANCE +ATTENDANCES +ATTENDANT +ATTENDANTS +ATTENDED +ATTENDEE +ATTENDEES +ATTENDER +ATTENDERS +ATTENDING +ATTENDINGS +ATTENDS +ATTENT +ATTENTION +ATTENTIONAL +ATTENTIONS +ATTENTIVE +ATTENTIVELY +ATTENTIVENESS +ATTENTIVENESSES +ATTENUATE +ATTENUATED +ATTENUATES +ATTENUATING +ATTENUATION +ATTENUATIONS +ATTENUATOR +ATTENUATORS +ATTEST +ATTESTANT +ATTESTANTS +ATTESTATION +ATTESTATIONS +ATTESTED +ATTESTER +ATTESTERS +ATTESTING +ATTESTOR +ATTESTORS +ATTESTS +ATTIC +ATTICISM +ATTICISMS +ATTICIST +ATTICISTS +ATTICIZE +ATTICIZED +ATTICIZES +ATTICIZING +ATTICS +ATTIRE +ATTIRED +ATTIRES +ATTIRING +ATTITUDE +ATTITUDES +ATTITUDINAL +ATTITUDINALLY +ATTITUDINISE +ATTITUDINISED +ATTITUDINISES +ATTITUDINISING +ATTITUDINIZE +ATTITUDINIZED +ATTITUDINIZES +ATTITUDINIZING +ATTORN +ATTORNED +ATTORNEY +ATTORNEYS +ATTORNEYSHIP +ATTORNEYSHIPS +ATTORNING +ATTORNMENT +ATTORNMENTS +ATTORNS +ATTRACT +ATTRACTANCE +ATTRACTANCES +ATTRACTANCIES +ATTRACTANCY +ATTRACTANT +ATTRACTANTS +ATTRACTED +ATTRACTER +ATTRACTERS +ATTRACTING +ATTRACTION +ATTRACTIONS +ATTRACTIVE +ATTRACTIVELY +ATTRACTIVENESS +ATTRACTOR +ATTRACTORS +ATTRACTS +ATTRIBUTABLE +ATTRIBUTE +ATTRIBUTED +ATTRIBUTES +ATTRIBUTING +ATTRIBUTION +ATTRIBUTIONAL +ATTRIBUTIONS +ATTRIBUTIVE +ATTRIBUTIVELY +ATTRIBUTIVES +ATTRIT +ATTRITE +ATTRITED +ATTRITES +ATTRITING +ATTRITION +ATTRITIONAL +ATTRITIONS +ATTRITIVE +ATTRITS +ATTRITTED +ATTRITTING +ATTUNE +ATTUNED +ATTUNEMENT +ATTUNEMENTS +ATTUNES +ATTUNING +ATWAIN +ATWEEN +ATWITTER +ATYPIC +ATYPICAL +ATYPICALITIES +ATYPICALITY +ATYPICALLY +AUBADE +AUBADES +AUBERGE +AUBERGES +AUBERGINE +AUBERGINES +AUBRETIA +AUBRETIAS +AUBRIETA +AUBRIETAS +AUBRIETIA +AUBRIETIAS +AUBURN +AUBURNS +AUCTION +AUCTIONED +AUCTIONEER +AUCTIONEERS +AUCTIONING +AUCTIONS +AUCTORIAL +AUCUBA +AUCUBAS +AUDACIOUS +AUDACIOUSLY +AUDACIOUSNESS +AUDACIOUSNESSES +AUDACITIES +AUDACITY +AUDAD +AUDADS +AUDIAL +AUDIBILITIES +AUDIBILITY +AUDIBLE +AUDIBLED +AUDIBLES +AUDIBLING +AUDIBLY +AUDIENCE +AUDIENCES +AUDIENT +AUDIENTS +AUDILE +AUDILES +AUDING +AUDINGS +AUDIO +AUDIOBOOK +AUDIOBOOKS +AUDIOCASSETTE +AUDIOCASSETTES +AUDIOGENIC +AUDIOGRAM +AUDIOGRAMS +AUDIOLOGIC +AUDIOLOGICAL +AUDIOLOGIES +AUDIOLOGIST +AUDIOLOGISTS +AUDIOLOGY +AUDIOMETER +AUDIOMETERS +AUDIOMETRIC +AUDIOMETRIES +AUDIOMETRY +AUDIOPHILE +AUDIOPHILES +AUDIOS +AUDIOTAPE +AUDIOTAPED +AUDIOTAPES +AUDIOTAPING +AUDIOVISUAL +AUDIOVISUALS +AUDIPHONE +AUDIPHONES +AUDIT +AUDITABLE +AUDITED +AUDITEE +AUDITEES +AUDITING +AUDITION +AUDITIONED +AUDITIONING +AUDITIONS +AUDITIVE +AUDITIVES +AUDITOR +AUDITORIA +AUDITORIES +AUDITORILY +AUDITORIUM +AUDITORIUMS +AUDITORS +AUDITORY +AUDITS +AUGEND +AUGENDS +AUGER +AUGERS +AUGHT +AUGHTS +AUGITE +AUGITES +AUGITIC +AUGMENT +AUGMENTATION +AUGMENTATIONS +AUGMENTATIVE +AUGMENTATIVES +AUGMENTED +AUGMENTER +AUGMENTERS +AUGMENTING +AUGMENTOR +AUGMENTORS +AUGMENTS +AUGUR +AUGURAL +AUGURED +AUGURER +AUGURERS +AUGURIES +AUGURING +AUGURS +AUGURY +AUGUST +AUGUSTER +AUGUSTEST +AUGUSTLY +AUGUSTNESS +AUGUSTNESSES +AUK +AUKLET +AUKLETS +AUKS +AULD +AULDER +AULDEST +AULIC +AUNT +AUNTHOOD +AUNTHOODS +AUNTIE +AUNTIES +AUNTLIER +AUNTLIEST +AUNTLIKE +AUNTLY +AUNTS +AUNTY +AURA +AURAE +AURAL +AURALITIES +AURALITY +AURALLY +AURAR +AURAS +AURATE +AURATED +AUREATE +AUREATELY +AUREI +AUREOLA +AUREOLAE +AUREOLAS +AUREOLE +AUREOLED +AUREOLES +AUREOLING +AURES +AUREUS +AURIC +AURICLE +AURICLED +AURICLES +AURICULA +AURICULAE +AURICULAR +AURICULARS +AURICULAS +AURICULATE +AURIFEROUS +AURIFORM +AURIS +AURIST +AURISTS +AUROCHS +AUROCHSES +AURORA +AURORAE +AURORAL +AURORALLY +AURORAS +AUROREAN +AUROUS +AURUM +AURUMS +AUSCULTATE +AUSCULTATED +AUSCULTATES +AUSCULTATING +AUSCULTATION +AUSCULTATIONS +AUSCULTATORY +AUSFORM +AUSFORMED +AUSFORMING +AUSFORMS +AUSLANDER +AUSLANDERS +AUSPEX +AUSPICATE +AUSPICATED +AUSPICATES +AUSPICATING +AUSPICE +AUSPICES +AUSPICIOUS +AUSPICIOUSLY +AUSPICIOUSNESS +AUSTENITE +AUSTENITES +AUSTENITIC +AUSTERE +AUSTERELY +AUSTERENESS +AUSTERENESSES +AUSTERER +AUSTEREST +AUSTERITIES +AUSTERITY +AUSTRAL +AUSTRALES +AUSTRALS +AUSUBO +AUSUBOS +AUTACOID +AUTACOIDS +AUTARCH +AUTARCHIC +AUTARCHICAL +AUTARCHIES +AUTARCHS +AUTARCHY +AUTARKIC +AUTARKICAL +AUTARKIES +AUTARKIST +AUTARKISTS +AUTARKY +AUTECIOUS +AUTECISM +AUTECISMS +AUTECOLOGICAL +AUTECOLOGIES +AUTECOLOGY +AUTEUR +AUTEURISM +AUTEURISMS +AUTEURIST +AUTEURISTS +AUTEURS +AUTHENTIC +AUTHENTICALLY +AUTHENTICATE +AUTHENTICATED +AUTHENTICATES +AUTHENTICATING +AUTHENTICATION +AUTHENTICATIONS +AUTHENTICATOR +AUTHENTICATORS +AUTHENTICITIES +AUTHENTICITY +AUTHOR +AUTHORED +AUTHORESS +AUTHORESSES +AUTHORIAL +AUTHORING +AUTHORISE +AUTHORISED +AUTHORISES +AUTHORISING +AUTHORITARIAN +AUTHORITARIANS +AUTHORITATIVE +AUTHORITATIVELY +AUTHORITIES +AUTHORITY +AUTHORIZATION +AUTHORIZATIONS +AUTHORIZE +AUTHORIZED +AUTHORIZER +AUTHORIZERS +AUTHORIZES +AUTHORIZING +AUTHORS +AUTHORSHIP +AUTHORSHIPS +AUTISM +AUTISMS +AUTIST +AUTISTIC +AUTISTICALLY +AUTISTICS +AUTISTS +AUTO +AUTOANTIBODIES +AUTOANTIBODY +AUTOBAHN +AUTOBAHNEN +AUTOBAHNS +AUTOBIOGRAPHER +AUTOBIOGRAPHERS +AUTOBIOGRAPHIC +AUTOBIOGRAPHIES +AUTOBIOGRAPHY +AUTOBUS +AUTOBUSES +AUTOBUSSES +AUTOCADE +AUTOCADES +AUTOCATALYSES +AUTOCATALYSIS +AUTOCATALYTIC +AUTOCEPHALIES +AUTOCEPHALOUS +AUTOCEPHALY +AUTOCHTHON +AUTOCHTHONES +AUTOCHTHONOUS +AUTOCHTHONOUSLY +AUTOCHTHONS +AUTOCLAVE +AUTOCLAVED +AUTOCLAVES +AUTOCLAVING +AUTOCOID +AUTOCOIDS +AUTOCORRELATION +AUTOCRACIES +AUTOCRACY +AUTOCRAT +AUTOCRATIC +AUTOCRATICAL +AUTOCRATICALLY +AUTOCRATS +AUTOCRINE +AUTOCROSS +AUTOCROSSES +AUTODIDACT +AUTODIDACTIC +AUTODIDACTS +AUTODYNE +AUTODYNES +AUTOECIOUS +AUTOECIOUSLY +AUTOECISM +AUTOECISMS +AUTOED +AUTOEROTIC +AUTOEROTICISM +AUTOEROTICISMS +AUTOEROTISM +AUTOEROTISMS +AUTOFOCUS +AUTOFOCUSES +AUTOGAMIC +AUTOGAMIES +AUTOGAMOUS +AUTOGAMY +AUTOGENIC +AUTOGENIES +AUTOGENOUS +AUTOGENOUSLY +AUTOGENY +AUTOGIRO +AUTOGIROS +AUTOGRAFT +AUTOGRAFTED +AUTOGRAFTING +AUTOGRAFTS +AUTOGRAPH +AUTOGRAPHED +AUTOGRAPHIC +AUTOGRAPHICALLY +AUTOGRAPHIES +AUTOGRAPHING +AUTOGRAPHS +AUTOGRAPHY +AUTOGYRO +AUTOGYROS +AUTOHARP +AUTOHARPS +AUTOHYPNOSES +AUTOHYPNOSIS +AUTOHYPNOTIC +AUTOIMMUNE +AUTOIMMUNITIES +AUTOIMMUNITY +AUTOINFECTION +AUTOINFECTIONS +AUTOING +AUTOLOADING +AUTOLOGOUS +AUTOLYSATE +AUTOLYSATES +AUTOLYSE +AUTOLYSED +AUTOLYSES +AUTOLYSIN +AUTOLYSING +AUTOLYSINS +AUTOLYSIS +AUTOLYTIC +AUTOLYZATE +AUTOLYZATES +AUTOLYZE +AUTOLYZED +AUTOLYZES +AUTOLYZING +AUTOMAKER +AUTOMAKERS +AUTOMAN +AUTOMAT +AUTOMATA +AUTOMATABLE +AUTOMATE +AUTOMATED +AUTOMATES +AUTOMATIC +AUTOMATICALLY +AUTOMATICITIES +AUTOMATICITY +AUTOMATICS +AUTOMATING +AUTOMATION +AUTOMATIONS +AUTOMATISM +AUTOMATISMS +AUTOMATIST +AUTOMATISTS +AUTOMATIZATION +AUTOMATIZATIONS +AUTOMATIZE +AUTOMATIZED +AUTOMATIZES +AUTOMATIZING +AUTOMATON +AUTOMATONS +AUTOMATS +AUTOMEN +AUTOMOBILE +AUTOMOBILED +AUTOMOBILES +AUTOMOBILING +AUTOMOBILIST +AUTOMOBILISTS +AUTOMOBILITIES +AUTOMOBILITY +AUTOMORPHISM +AUTOMORPHISMS +AUTOMOTIVE +AUTONOMIC +AUTONOMICALLY +AUTONOMIES +AUTONOMIST +AUTONOMISTS +AUTONOMOUS +AUTONOMOUSLY +AUTONOMY +AUTONYM +AUTONYMS +AUTOPEN +AUTOPENS +AUTOPHAGIES +AUTOPHAGY +AUTOPHYTE +AUTOPHYTES +AUTOPILOT +AUTOPILOTS +AUTOPOLYPLOID +AUTOPOLYPLOIDS +AUTOPOLYPLOIDY +AUTOPSIC +AUTOPSIED +AUTOPSIES +AUTOPSIST +AUTOPSISTS +AUTOPSY +AUTOPSYING +AUTORADIOGRAM +AUTORADIOGRAMS +AUTORADIOGRAPH +AUTORADIOGRAPHS +AUTORADIOGRAPHY +AUTOROTATE +AUTOROTATED +AUTOROTATES +AUTOROTATING +AUTOROTATION +AUTOROTATIONS +AUTOROUTE +AUTOROUTES +AUTOS +AUTOSEXING +AUTOSOMAL +AUTOSOMALLY +AUTOSOME +AUTOSOMES +AUTOSTRADA +AUTOSTRADAS +AUTOSTRADE +AUTOSUGGEST +AUTOSUGGESTED +AUTOSUGGESTING +AUTOSUGGESTION +AUTOSUGGESTIONS +AUTOSUGGESTS +AUTOTELIC +AUTOTETRAPLOID +AUTOTETRAPLOIDS +AUTOTETRAPLOIDY +AUTOTOMIC +AUTOTOMIES +AUTOTOMIZE +AUTOTOMIZED +AUTOTOMIZES +AUTOTOMIZING +AUTOTOMOUS +AUTOTOMY +AUTOTOXIC +AUTOTOXIN +AUTOTOXINS +AUTOTRANSFORMER +AUTOTRANSFUSION +AUTOTROPH +AUTOTROPHIC +AUTOTROPHICALLY +AUTOTROPHIES +AUTOTROPHS +AUTOTROPHY +AUTOTYPE +AUTOTYPES +AUTOTYPIES +AUTOTYPY +AUTOWORKER +AUTOWORKERS +AUTOXIDATION +AUTOXIDATIONS +AUTUMN +AUTUMNAL +AUTUMNALLY +AUTUMNS +AUTUNITE +AUTUNITES +AUXESES +AUXESIS +AUXETIC +AUXETICS +AUXILIARIES +AUXILIARY +AUXIN +AUXINIC +AUXINS +AUXOTROPH +AUXOTROPHIC +AUXOTROPHIES +AUXOTROPHS +AUXOTROPHY +AVA +AVADAVAT +AVADAVATS +AVAIL +AVAILABILITIES +AVAILABILITY +AVAILABLE +AVAILABLENESS +AVAILABLENESSES +AVAILABLY +AVAILED +AVAILING +AVAILS +AVALANCHE +AVALANCHED +AVALANCHES +AVALANCHING +AVANT +AVARICE +AVARICES +AVARICIOUS +AVARICIOUSLY +AVARICIOUSNESS +AVASCULAR +AVASCULARITIES +AVASCULARITY +AVAST +AVATAR +AVATARS +AVAUNT +AVE +AVELLAN +AVELLANE +AVENGE +AVENGED +AVENGEFUL +AVENGER +AVENGERS +AVENGES +AVENGING +AVENS +AVENSES +AVENTAIL +AVENTAILS +AVENTURIN +AVENTURINE +AVENTURINES +AVENTURINS +AVENUE +AVENUES +AVER +AVERAGE +AVERAGED +AVERAGELY +AVERAGENESS +AVERAGENESSES +AVERAGES +AVERAGING +AVERMENT +AVERMENTS +AVERRABLE +AVERRED +AVERRING +AVERS +AVERSE +AVERSELY +AVERSENESS +AVERSENESSES +AVERSION +AVERSIONS +AVERSIVE +AVERSIVELY +AVERSIVENESS +AVERSIVENESSES +AVERSIVES +AVERT +AVERTABLE +AVERTED +AVERTER +AVERTERS +AVERTIBLE +AVERTING +AVERTS +AVES +AVGAS +AVGASES +AVGASSES +AVGOLEMONO +AVGOLEMONOS +AVIAN +AVIANIZE +AVIANIZED +AVIANIZES +AVIANIZING +AVIANS +AVIARIES +AVIARIST +AVIARISTS +AVIARY +AVIATE +AVIATED +AVIATES +AVIATIC +AVIATING +AVIATION +AVIATIONS +AVIATOR +AVIATORS +AVIATRESS +AVIATRESSES +AVIATRICE +AVIATRICES +AVIATRIX +AVIATRIXES +AVICULAR +AVICULTURE +AVICULTURES +AVICULTURIST +AVICULTURISTS +AVID +AVIDIN +AVIDINS +AVIDITIES +AVIDITY +AVIDLY +AVIDNESS +AVIDNESSES +AVIFAUNA +AVIFAUNAE +AVIFAUNAL +AVIFAUNAS +AVIGATOR +AVIGATORS +AVION +AVIONIC +AVIONICS +AVIONS +AVIRULENT +AVISO +AVISOS +AVITAMINOSES +AVITAMINOSIS +AVITAMINOTIC +AVO +AVOCADO +AVOCADOES +AVOCADOS +AVOCATION +AVOCATIONAL +AVOCATIONALLY +AVOCATIONS +AVOCET +AVOCETS +AVODIRE +AVODIRES +AVOID +AVOIDABLE +AVOIDABLY +AVOIDANCE +AVOIDANCES +AVOIDED +AVOIDER +AVOIDERS +AVOIDING +AVOIDS +AVOIRDUPOIS +AVOS +AVOSET +AVOSETS +AVOUCH +AVOUCHED +AVOUCHER +AVOUCHERS +AVOUCHES +AVOUCHING +AVOUCHMENT +AVOUCHMENTS +AVOW +AVOWABLE +AVOWABLY +AVOWAL +AVOWALS +AVOWED +AVOWEDLY +AVOWER +AVOWERS +AVOWING +AVOWS +AVULSE +AVULSED +AVULSES +AVULSING +AVULSION +AVULSIONS +AVUNCULAR +AVUNCULARITIES +AVUNCULARITY +AVUNCULARLY +AW +AWA +AWAIT +AWAITED +AWAITER +AWAITERS +AWAITING +AWAITS +AWAKE +AWAKED +AWAKEN +AWAKENED +AWAKENER +AWAKENERS +AWAKENING +AWAKENINGS +AWAKENS +AWAKES +AWAKING +AWARD +AWARDABLE +AWARDED +AWARDEE +AWARDEES +AWARDER +AWARDERS +AWARDING +AWARDS +AWARE +AWARENESS +AWARENESSES +AWASH +AWAY +AWAYNESS +AWAYNESSES +AWE +AWEARY +AWEATHER +AWED +AWEE +AWEIGH +AWEING +AWELESS +AWES +AWESOME +AWESOMELY +AWESOMENESS +AWESOMENESSES +AWESTRICKEN +AWESTRUCK +AWFUL +AWFULLER +AWFULLEST +AWFULLY +AWFULNESS +AWFULNESSES +AWHILE +AWHIRL +AWING +AWKWARD +AWKWARDER +AWKWARDEST +AWKWARDLY +AWKWARDNESS +AWKWARDNESSES +AWL +AWLESS +AWLS +AWLWORT +AWLWORTS +AWMOUS +AWN +AWNED +AWNING +AWNINGED +AWNINGS +AWNLESS +AWNS +AWNY +AWOKE +AWOKEN +AWOL +AWOLS +AWRY +AX +AXAL +AXE +AXED +AXEL +AXELS +AXEMAN +AXEMEN +AXENIC +AXENICALLY +AXES +AXIAL +AXIALITIES +AXIALITY +AXIALLY +AXIL +AXILE +AXILLA +AXILLAE +AXILLAR +AXILLARIES +AXILLARS +AXILLARY +AXILLAS +AXILS +AXING +AXIOLOGICAL +AXIOLOGICALLY +AXIOLOGIES +AXIOLOGY +AXIOM +AXIOMATIC +AXIOMATICALLY +AXIOMATISATION +AXIOMATISATIONS +AXIOMATIZATION +AXIOMATIZATIONS +AXIOMATIZE +AXIOMATIZED +AXIOMATIZES +AXIOMATIZING +AXIOMS +AXION +AXIONS +AXIS +AXISED +AXISES +AXISYMMETRIC +AXISYMMETRICAL +AXISYMMETRIES +AXISYMMETRY +AXITE +AXITES +AXLE +AXLED +AXLES +AXLETREE +AXLETREES +AXLIKE +AXMAN +AXMEN +AXOLOTL +AXOLOTLS +AXON +AXONAL +AXONE +AXONEMAL +AXONEME +AXONEMES +AXONES +AXONIC +AXONOMETRIC +AXONS +AXOPLASM +AXOPLASMIC +AXOPLASMS +AXSEED +AXSEEDS +AY +AYAH +AYAHS +AYAHUASCA +AYAHUASCAS +AYATOLLAH +AYATOLLAHS +AYE +AYES +AYIN +AYINS +AYS +AYURVEDA +AYURVEDAS +AYURVEDIC +AYURVEDICS +AZALEA +AZALEAS +AZAN +AZANS +AZATHIOPRINE +AZATHIOPRINES +AZEDARACH +AZEDARACHS +AZEOTROPE +AZEOTROPES +AZEOTROPIES +AZEOTROPY +AZIDE +AZIDES +AZIDO +AZIDOTHYMIDINE +AZIDOTHYMIDINES +AZIMUTH +AZIMUTHAL +AZIMUTHALLY +AZIMUTHS +AZINE +AZINES +AZLON +AZLONS +AZO +AZOIC +AZOLE +AZOLES +AZON +AZONAL +AZONIC +AZONS +AZOOSPERMIA +AZOOSPERMIAS +AZOTE +AZOTED +AZOTEMIA +AZOTEMIAS +AZOTEMIC +AZOTES +AZOTH +AZOTHS +AZOTIC +AZOTISE +AZOTISED +AZOTISES +AZOTISING +AZOTIZE +AZOTIZED +AZOTIZES +AZOTIZING +AZOTOBACTER +AZOTOBACTERS +AZOTURIA +AZOTURIAS +AZUKI +AZUKIS +AZULEJO +AZULEJOS +AZURE +AZURES +AZURITE +AZURITES +AZYGOS +AZYGOSES +AZYGOUS +BA +BAA +BAAED +BAAING +BAAL +BAALIM +BAALISM +BAALISMS +BAALS +BAAS +BAASES +BAASKAAP +BAASKAAPS +BAASKAP +BAASKAPS +BAASSKAP +BAASSKAPS +BABA +BABAS +BABASSU +BABASSUS +BABBITRIES +BABBITRY +BABBITT +BABBITTED +BABBITTING +BABBITTRIES +BABBITTRY +BABBITTS +BABBLE +BABBLED +BABBLEMENT +BABBLEMENTS +BABBLER +BABBLERS +BABBLES +BABBLING +BABBLINGS +BABE +BABEL +BABELS +BABES +BABESIA +BABESIAS +BABESIOSES +BABESIOSIS +BABICHE +BABICHES +BABIED +BABIER +BABIES +BABIEST +BABIRUSA +BABIRUSAS +BABIRUSSA +BABIRUSSAS +BABKA +BABKAS +BABOO +BABOOL +BABOOLS +BABOON +BABOONERIES +BABOONERY +BABOONISH +BABOONS +BABOOS +BABU +BABUL +BABULS +BABUS +BABUSHKA +BABUSHKAS +BABY +BABYDOLL +BABYDOLLS +BABYHOOD +BABYHOODS +BABYING +BABYISH +BABYISHLY +BABYPROOF +BABYPROOFED +BABYPROOFING +BABYPROOFS +BABYSAT +BABYSIT +BABYSITS +BABYSITTING +BACALAO +BACALAOS +BACCA +BACCAE +BACCALAUREATE +BACCALAUREATES +BACCARA +BACCARAS +BACCARAT +BACCARATS +BACCATE +BACCATED +BACCHANAL +BACCHANALIA +BACCHANALIAN +BACCHANALIANS +BACCHANALS +BACCHANT +BACCHANTE +BACCHANTES +BACCHANTS +BACCHIC +BACCHII +BACCHIUS +BACCIFORM +BACH +BACHED +BACHELOR +BACHELORDOM +BACHELORDOMS +BACHELORETTE +BACHELORETTES +BACHELORHOOD +BACHELORHOODS +BACHELORS +BACHES +BACHING +BACILLAR +BACILLARY +BACILLI +BACILLUS +BACITRACIN +BACITRACINS +BACK +BACKACHE +BACKACHES +BACKBEAT +BACKBEATS +BACKBENCH +BACKBENCHER +BACKBENCHERS +BACKBENCHES +BACKBEND +BACKBENDS +BACKBIT +BACKBITE +BACKBITER +BACKBITERS +BACKBITES +BACKBITING +BACKBITINGS +BACKBITTEN +BACKBLOCK +BACKBLOCKS +BACKBOARD +BACKBOARDS +BACKBONE +BACKBONED +BACKBONES +BACKBREAKER +BACKBREAKERS +BACKBREAKING +BACKCAST +BACKCASTS +BACKCHAT +BACKCHATS +BACKCHECK +BACKCHECKED +BACKCHECKING +BACKCHECKS +BACKCLOTH +BACKCLOTHS +BACKCOUNTRIES +BACKCOUNTRY +BACKCOURT +BACKCOURTMAN +BACKCOURTMEN +BACKCOURTS +BACKCROSS +BACKCROSSED +BACKCROSSES +BACKCROSSING +BACKDATE +BACKDATED +BACKDATES +BACKDATING +BACKDOOR +BACKDRAFT +BACKDRAFTS +BACKDROP +BACKDROPPED +BACKDROPPING +BACKDROPS +BACKDROPT +BACKED +BACKER +BACKERS +BACKFIELD +BACKFIELDS +BACKFILL +BACKFILLED +BACKFILLING +BACKFILLS +BACKFIRE +BACKFIRED +BACKFIRES +BACKFIRING +BACKFIT +BACKFITS +BACKFITTED +BACKFITTING +BACKFLIP +BACKFLIPPED +BACKFLIPPING +BACKFLIPS +BACKFLOW +BACKFLOWS +BACKGAMMON +BACKGAMMONS +BACKGROUND +BACKGROUNDED +BACKGROUNDER +BACKGROUNDERS +BACKGROUNDING +BACKGROUNDS +BACKHAND +BACKHANDED +BACKHANDEDLY +BACKHANDER +BACKHANDERS +BACKHANDING +BACKHANDS +BACKHAUL +BACKHAULED +BACKHAULING +BACKHAULS +BACKHOE +BACKHOED +BACKHOEING +BACKHOES +BACKHOUSE +BACKHOUSES +BACKING +BACKINGS +BACKLAND +BACKLANDS +BACKLASH +BACKLASHED +BACKLASHER +BACKLASHERS +BACKLASHES +BACKLASHING +BACKLESS +BACKLIGHT +BACKLIGHTED +BACKLIGHTING +BACKLIGHTS +BACKLIST +BACKLISTED +BACKLISTING +BACKLISTS +BACKLIT +BACKLOAD +BACKLOADED +BACKLOADING +BACKLOADS +BACKLOG +BACKLOGGED +BACKLOGGING +BACKLOGS +BACKMOST +BACKOUT +BACKOUTS +BACKPACK +BACKPACKED +BACKPACKER +BACKPACKERS +BACKPACKING +BACKPACKS +BACKPEDAL +BACKPEDALED +BACKPEDALING +BACKPEDALLED +BACKPEDALLING +BACKPEDALS +BACKREST +BACKRESTS +BACKROOM +BACKROOMS +BACKRUSH +BACKRUSHES +BACKS +BACKSAW +BACKSAWS +BACKSCATTER +BACKSCATTERED +BACKSCATTERING +BACKSCATTERINGS +BACKSCATTERS +BACKSEAT +BACKSEATS +BACKSET +BACKSETS +BACKSHORE +BACKSHORES +BACKSIDE +BACKSIDES +BACKSLAP +BACKSLAPPED +BACKSLAPPER +BACKSLAPPERS +BACKSLAPPING +BACKSLAPS +BACKSLASH +BACKSLASHES +BACKSLID +BACKSLIDDEN +BACKSLIDE +BACKSLIDER +BACKSLIDERS +BACKSLIDES +BACKSLIDING +BACKSPACE +BACKSPACED +BACKSPACES +BACKSPACING +BACKSPIN +BACKSPINS +BACKSPLASH +BACKSPLASHES +BACKSTAB +BACKSTABBED +BACKSTABBER +BACKSTABBERS +BACKSTABBING +BACKSTABBINGS +BACKSTABS +BACKSTAGE +BACKSTAGES +BACKSTAIR +BACKSTAIRS +BACKSTAMP +BACKSTAMPED +BACKSTAMPING +BACKSTAMPS +BACKSTAY +BACKSTAYS +BACKSTITCH +BACKSTITCHED +BACKSTITCHES +BACKSTITCHING +BACKSTOP +BACKSTOPPED +BACKSTOPPING +BACKSTOPS +BACKSTORIES +BACKSTORY +BACKSTREET +BACKSTREETS +BACKSTRETCH +BACKSTRETCHES +BACKSTROKE +BACKSTROKES +BACKSWEPT +BACKSWING +BACKSWINGS +BACKSWORD +BACKSWORDS +BACKTRACK +BACKTRACKED +BACKTRACKING +BACKTRACKS +BACKUP +BACKUPS +BACKWARD +BACKWARDLY +BACKWARDNESS +BACKWARDNESSES +BACKWARDS +BACKWASH +BACKWASHED +BACKWASHES +BACKWASHING +BACKWATER +BACKWATERS +BACKWOOD +BACKWOODS +BACKWOODSMAN +BACKWOODSMEN +BACKWOODSY +BACKWRAP +BACKWRAPS +BACKYARD +BACKYARDS +BACLOFEN +BACLOFENS +BACON +BACONS +BACTEREMIA +BACTEREMIAS +BACTEREMIC +BACTERIA +BACTERIAL +BACTERIALLY +BACTERIALS +BACTERIAS +BACTERICIDAL +BACTERICIDALLY +BACTERICIDE +BACTERICIDES +BACTERIN +BACTERINS +BACTERIOCIN +BACTERIOCINS +BACTERIOLOGIC +BACTERIOLOGICAL +BACTERIOLOGIES +BACTERIOLOGIST +BACTERIOLOGISTS +BACTERIOLOGY +BACTERIOLYSES +BACTERIOLYSIS +BACTERIOLYTIC +BACTERIOPHAGE +BACTERIOPHAGES +BACTERIOPHAGIES +BACTERIOPHAGY +BACTERIOSTASES +BACTERIOSTASIS +BACTERIOSTAT +BACTERIOSTATIC +BACTERIOSTATS +BACTERIUM +BACTERIURIA +BACTERIURIAS +BACTERIZATION +BACTERIZATIONS +BACTERIZE +BACTERIZED +BACTERIZES +BACTERIZING +BACTEROID +BACTEROIDS +BACULA +BACULINE +BACULUM +BACULUMS +BAD +BADASS +BADASSED +BADASSES +BADDER +BADDEST +BADDIE +BADDIES +BADDY +BADE +BADGE +BADGED +BADGELESS +BADGER +BADGERED +BADGERING +BADGERLY +BADGERS +BADGES +BADGING +BADINAGE +BADINAGED +BADINAGES +BADINAGING +BADLAND +BADLANDS +BADLY +BADMAN +BADMEN +BADMINTON +BADMINTONS +BADMOUTH +BADMOUTHED +BADMOUTHING +BADMOUTHS +BADNESS +BADNESSES +BADS +BAFF +BAFFED +BAFFIES +BAFFING +BAFFLE +BAFFLED +BAFFLEGAB +BAFFLEGABS +BAFFLEMENT +BAFFLEMENTS +BAFFLER +BAFFLERS +BAFFLES +BAFFLING +BAFFLINGLY +BAFFS +BAFFY +BAG +BAGASS +BAGASSE +BAGASSES +BAGATELLE +BAGATELLES +BAGEL +BAGELS +BAGFUL +BAGFULS +BAGGAGE +BAGGAGES +BAGGED +BAGGER +BAGGERS +BAGGIE +BAGGIER +BAGGIES +BAGGIEST +BAGGILY +BAGGINESS +BAGGINESSES +BAGGING +BAGGINGS +BAGGY +BAGHOUSE +BAGHOUSES +BAGLIKE +BAGMAN +BAGMEN +BAGNIO +BAGNIOS +BAGPIPE +BAGPIPED +BAGPIPER +BAGPIPERS +BAGPIPES +BAGPIPING +BAGS +BAGSFUL +BAGUET +BAGUETS +BAGUETTE +BAGUETTES +BAGWIG +BAGWIGS +BAGWORM +BAGWORMS +BAH +BAHADUR +BAHADURS +BAHT +BAHTS +BAHUVRIHI +BAHUVRIHIS +BAIDARKA +BAIDARKAS +BAIL +BAILABLE +BAILED +BAILEE +BAILEES +BAILER +BAILERS +BAILEY +BAILEYS +BAILIE +BAILIES +BAILIFF +BAILIFFS +BAILIFFSHIP +BAILIFFSHIPS +BAILING +BAILIWICK +BAILIWICKS +BAILMENT +BAILMENTS +BAILOR +BAILORS +BAILOUT +BAILOUTS +BAILS +BAILSMAN +BAILSMEN +BAIRN +BAIRNISH +BAIRNLIER +BAIRNLIEST +BAIRNLY +BAIRNS +BAIT +BAITED +BAITER +BAITERS +BAITFISH +BAITFISHES +BAITH +BAITING +BAITS +BAIZA +BAIZAS +BAIZE +BAIZES +BAKE +BAKEAPPLE +BAKEAPPLES +BAKED +BAKEHOUSE +BAKEHOUSES +BAKELITE +BAKELITES +BAKEMEAT +BAKEMEATS +BAKER +BAKERIES +BAKERS +BAKERY +BAKES +BAKESHOP +BAKESHOPS +BAKEWARE +BAKEWARES +BAKING +BAKINGS +BAKLAVA +BAKLAVAS +BAKLAWA +BAKLAWAS +BAKSHEESH +BAKSHEESHES +BAKSHISH +BAKSHISHED +BAKSHISHES +BAKSHISHING +BAL +BALACLAVA +BALACLAVAS +BALALAIKA +BALALAIKAS +BALANCE +BALANCED +BALANCER +BALANCERS +BALANCES +BALANCING +BALAS +BALASES +BALATA +BALATAS +BALBOA +BALBOAS +BALBRIGGAN +BALBRIGGANS +BALCONIED +BALCONIES +BALCONY +BALD +BALDACHIN +BALDACHINO +BALDACHINOS +BALDACHINS +BALDAQUIN +BALDAQUINS +BALDED +BALDER +BALDERDASH +BALDERDASHES +BALDEST +BALDFACED +BALDHEAD +BALDHEADS +BALDIES +BALDING +BALDISH +BALDLY +BALDNESS +BALDNESSES +BALDPATE +BALDPATED +BALDPATES +BALDRIC +BALDRICK +BALDRICKS +BALDRICS +BALDS +BALDY +BALE +BALED +BALEEN +BALEENS +BALEFIRE +BALEFIRES +BALEFUL +BALEFULLY +BALEFULNESS +BALEFULNESSES +BALER +BALERS +BALES +BALING +BALISAUR +BALISAURS +BALK +BALKANIZATION +BALKANIZATIONS +BALKANIZE +BALKANIZED +BALKANIZES +BALKANIZING +BALKED +BALKER +BALKERS +BALKIER +BALKIEST +BALKILY +BALKINESS +BALKINESSES +BALKING +BALKLINE +BALKLINES +BALKS +BALKY +BALL +BALLAD +BALLADE +BALLADEER +BALLADEERS +BALLADES +BALLADIC +BALLADIST +BALLADISTS +BALLADRIES +BALLADRY +BALLADS +BALLAST +BALLASTED +BALLASTER +BALLASTERS +BALLASTING +BALLASTS +BALLCARRIER +BALLCARRIERS +BALLED +BALLER +BALLERINA +BALLERINAS +BALLERS +BALLET +BALLETIC +BALLETOMANE +BALLETOMANES +BALLETOMANIA +BALLETOMANIAS +BALLETS +BALLGAME +BALLGAMES +BALLHANDLING +BALLHANDLINGS +BALLHAWK +BALLHAWKS +BALLIES +BALLING +BALLISTA +BALLISTAE +BALLISTIC +BALLISTICALLY +BALLISTICS +BALLON +BALLONET +BALLONETS +BALLONNE +BALLONNES +BALLONS +BALLOON +BALLOONED +BALLOONING +BALLOONINGS +BALLOONIST +BALLOONISTS +BALLOONS +BALLOT +BALLOTED +BALLOTER +BALLOTERS +BALLOTING +BALLOTS +BALLPARK +BALLPARKS +BALLPLAYER +BALLPLAYERS +BALLPOINT +BALLPOINTS +BALLROOM +BALLROOMS +BALLS +BALLSIER +BALLSIEST +BALLSY +BALLUTE +BALLUTES +BALLY +BALLYARD +BALLYARDS +BALLYHOO +BALLYHOOED +BALLYHOOING +BALLYHOOS +BALLYRAG +BALLYRAGGED +BALLYRAGGING +BALLYRAGS +BALM +BALMACAAN +BALMACAANS +BALMIER +BALMIEST +BALMILY +BALMINESS +BALMINESSES +BALMLIKE +BALMORAL +BALMORALS +BALMS +BALMY +BALNEAL +BALNEOLOGIES +BALNEOLOGY +BALONEY +BALONEYS +BALS +BALSA +BALSAM +BALSAMED +BALSAMIC +BALSAMING +BALSAMS +BALSAS +BALUSTER +BALUSTERS +BALUSTRADE +BALUSTRADED +BALUSTRADES +BAM +BAMBINI +BAMBINO +BAMBINOS +BAMBOO +BAMBOOS +BAMBOOZLE +BAMBOOZLED +BAMBOOZLEMENT +BAMBOOZLEMENTS +BAMBOOZLES +BAMBOOZLING +BAMMED +BAMMING +BAMS +BAN +BANAL +BANALITIES +BANALITY +BANALIZE +BANALIZED +BANALIZES +BANALIZING +BANALLY +BANANA +BANANAS +BANAUSIC +BANCO +BANCOS +BAND +BANDA +BANDAGE +BANDAGED +BANDAGER +BANDAGERS +BANDAGES +BANDAGING +BANDAID +BANDANA +BANDANAS +BANDANNA +BANDANNAS +BANDAS +BANDBOX +BANDBOXES +BANDEAU +BANDEAUS +BANDEAUX +BANDED +BANDER +BANDERILLA +BANDERILLAS +BANDERILLERO +BANDERILLEROS +BANDEROL +BANDEROLE +BANDEROLES +BANDEROLS +BANDERS +BANDICOOT +BANDICOOTS +BANDIED +BANDIES +BANDINESS +BANDINESSES +BANDING +BANDIT +BANDITO +BANDITOS +BANDITRIES +BANDITRY +BANDITS +BANDITTI +BANDLEADER +BANDLEADERS +BANDMASTER +BANDMASTERS +BANDMATE +BANDMATES +BANDOG +BANDOGS +BANDOLEER +BANDOLEERS +BANDOLIER +BANDOLIERS +BANDONEON +BANDONEONS +BANDORA +BANDORAS +BANDORE +BANDORES +BANDS +BANDSAW +BANDSAWS +BANDSHELL +BANDSHELLS +BANDSMAN +BANDSMEN +BANDSTAND +BANDSTANDS +BANDWAGON +BANDWAGONS +BANDWIDTH +BANDWIDTHS +BANDY +BANDYING +BANE +BANEBERRIES +BANEBERRY +BANED +BANEFUL +BANEFULLY +BANES +BANG +BANGED +BANGER +BANGERS +BANGING +BANGKOK +BANGKOKS +BANGLE +BANGLES +BANGS +BANGTAIL +BANGTAILS +BANI +BANIAN +BANIANS +BANING +BANISH +BANISHED +BANISHER +BANISHERS +BANISHES +BANISHING +BANISHMENT +BANISHMENTS +BANISTER +BANISTERED +BANISTERS +BANJAX +BANJAXED +BANJAXES +BANJAXING +BANJO +BANJOES +BANJOIST +BANJOISTS +BANJOS +BANK +BANKABILITIES +BANKABILITY +BANKABLE +BANKBOOK +BANKBOOKS +BANKCARD +BANKCARDS +BANKED +BANKER +BANKERLY +BANKERS +BANKING +BANKINGS +BANKIT +BANKITS +BANKNOTE +BANKNOTES +BANKROLL +BANKROLLED +BANKROLLER +BANKROLLERS +BANKROLLING +BANKROLLS +BANKRUPT +BANKRUPTCIES +BANKRUPTCY +BANKRUPTED +BANKRUPTING +BANKRUPTS +BANKS +BANKSIA +BANKSIAS +BANKSIDE +BANKSIDES +BANNABLE +BANNED +BANNER +BANNERED +BANNERET +BANNERETS +BANNERETTE +BANNERETTES +BANNERING +BANNEROL +BANNEROLS +BANNERS +BANNET +BANNETS +BANNING +BANNISTER +BANNISTERS +BANNOCK +BANNOCKS +BANNS +BANQUET +BANQUETED +BANQUETER +BANQUETERS +BANQUETING +BANQUETS +BANQUETTE +BANQUETTES +BANS +BANSHEE +BANSHEES +BANSHIE +BANSHIES +BANTAM +BANTAMS +BANTAMWEIGHT +BANTAMWEIGHTS +BANTENG +BANTENGS +BANTER +BANTERED +BANTERER +BANTERERS +BANTERING +BANTERINGLY +BANTERS +BANTIES +BANTLING +BANTLINGS +BANTY +BANYAN +BANYANS +BANZAI +BANZAIS +BAOBAB +BAOBABS +BAP +BAPS +BAPTISE +BAPTISED +BAPTISES +BAPTISIA +BAPTISIAS +BAPTISING +BAPTISM +BAPTISMAL +BAPTISMALLY +BAPTISMS +BAPTIST +BAPTISTERIES +BAPTISTERY +BAPTISTRIES +BAPTISTRY +BAPTISTS +BAPTIZE +BAPTIZED +BAPTIZER +BAPTIZERS +BAPTIZES +BAPTIZING +BAR +BARATHEA +BARATHEAS +BARB +BARBAL +BARBARIAN +BARBARIANISM +BARBARIANISMS +BARBARIANS +BARBARIC +BARBARICALLY +BARBARISM +BARBARISMS +BARBARITIES +BARBARITY +BARBARIZATION +BARBARIZATIONS +BARBARIZE +BARBARIZED +BARBARIZES +BARBARIZING +BARBAROUS +BARBAROUSLY +BARBAROUSNESS +BARBAROUSNESSES +BARBASCO +BARBASCOES +BARBASCOS +BARBATE +BARBE +BARBECUE +BARBECUED +BARBECUER +BARBECUERS +BARBECUES +BARBECUING +BARBED +BARBEL +BARBELL +BARBELLS +BARBELS +BARBEQUE +BARBEQUED +BARBEQUES +BARBEQUING +BARBER +BARBERED +BARBERING +BARBERRIES +BARBERRY +BARBERS +BARBERSHOP +BARBERSHOPS +BARBES +BARBET +BARBETS +BARBETTE +BARBETTES +BARBICAN +BARBICANS +BARBICEL +BARBICELS +BARBIE +BARBIES +BARBING +BARBITAL +BARBITALS +BARBITONE +BARBITONES +BARBITURATE +BARBITURATES +BARBLESS +BARBS +BARBULE +BARBULES +BARBUT +BARBUTS +BARBWIRE +BARBWIRES +BARCA +BARCAROLE +BARCAROLES +BARCAROLLE +BARCAROLLES +BARCAS +BARCHAN +BARCHANS +BARD +BARDE +BARDED +BARDES +BARDIC +BARDING +BARDOLATER +BARDOLATERS +BARDOLATRIES +BARDOLATRY +BARDS +BARE +BAREBACK +BAREBACKED +BAREBOAT +BAREBOATS +BAREBONED +BARED +BAREFACED +BAREFACEDLY +BAREFACEDNESS +BAREFACEDNESSES +BAREFIT +BAREFOOT +BAREFOOTED +BAREGE +BAREGES +BAREHAND +BAREHANDED +BAREHANDING +BAREHANDS +BAREHEAD +BAREHEADED +BARELY +BARENESS +BARENESSES +BARER +BARES +BARESARK +BARESARKS +BAREST +BARF +BARFED +BARFING +BARFLIES +BARFLY +BARFS +BARGAIN +BARGAINED +BARGAINER +BARGAINERS +BARGAINING +BARGAINS +BARGE +BARGEBOARD +BARGEBOARDS +BARGED +BARGEE +BARGEES +BARGELLO +BARGELLOS +BARGEMAN +BARGEMEN +BARGES +BARGHEST +BARGHESTS +BARGING +BARGUEST +BARGUESTS +BARHOP +BARHOPPED +BARHOPPING +BARHOPS +BARIATRIC +BARIC +BARILLA +BARILLAS +BARING +BARISTA +BARISTAS +BARITE +BARITES +BARITONAL +BARITONE +BARITONES +BARIUM +BARIUMS +BARK +BARKED +BARKEEP +BARKEEPER +BARKEEPERS +BARKEEPS +BARKENTINE +BARKENTINES +BARKER +BARKERS +BARKIER +BARKIEST +BARKING +BARKLESS +BARKS +BARKY +BARLEDUC +BARLEDUCS +BARLESS +BARLEY +BARLEYCORN +BARLEYCORNS +BARLEYS +BARLOW +BARLOWS +BARM +BARMAID +BARMAIDS +BARMAN +BARMEN +BARMIE +BARMIER +BARMIEST +BARMS +BARMY +BARN +BARNACLE +BARNACLED +BARNACLES +BARNED +BARNEY +BARNEYS +BARNIER +BARNIEST +BARNING +BARNLIKE +BARNS +BARNSTORM +BARNSTORMED +BARNSTORMER +BARNSTORMERS +BARNSTORMING +BARNSTORMS +BARNY +BARNYARD +BARNYARDS +BAROCEPTOR +BAROCEPTORS +BAROGRAM +BAROGRAMS +BAROGRAPH +BAROGRAPHIC +BAROGRAPHS +BAROMETER +BAROMETERS +BAROMETRIC +BAROMETRICALLY +BAROMETRIES +BAROMETRY +BARON +BARONAGE +BARONAGES +BARONESS +BARONESSES +BARONET +BARONETAGE +BARONETAGES +BARONETCIES +BARONETCY +BARONETS +BARONG +BARONGS +BARONIAL +BARONIES +BARONNE +BARONNES +BARONS +BARONY +BAROQUE +BAROQUELY +BAROQUES +BARORECEPTOR +BARORECEPTORS +BAROSAUR +BAROSAURS +BAROSCOPE +BAROSCOPES +BAROUCHE +BAROUCHES +BARQUE +BARQUENTINE +BARQUENTINES +BARQUES +BARQUETTE +BARQUETTES +BARRABLE +BARRACK +BARRACKED +BARRACKER +BARRACKERS +BARRACKING +BARRACKS +BARRACOON +BARRACOONS +BARRACOUTA +BARRACOUTAS +BARRACUDA +BARRACUDAS +BARRAGE +BARRAGED +BARRAGES +BARRAGING +BARRAMUNDA +BARRAMUNDAS +BARRAMUNDI +BARRAMUNDIS +BARRANCA +BARRANCAS +BARRANCO +BARRANCOS +BARRATER +BARRATERS +BARRATOR +BARRATORS +BARRATRIES +BARRATRY +BARRE +BARRED +BARREL +BARRELAGE +BARRELAGES +BARRELED +BARRELFUL +BARRELFULS +BARRELHEAD +BARRELHEADS +BARRELHOUSE +BARRELHOUSES +BARRELING +BARRELLED +BARRELLING +BARRELS +BARRELSFUL +BARREN +BARRENER +BARRENEST +BARRENLY +BARRENNESS +BARRENNESSES +BARRENS +BARRES +BARRET +BARRETOR +BARRETORS +BARRETRIES +BARRETRY +BARRETS +BARRETTE +BARRETTES +BARRICADE +BARRICADED +BARRICADES +BARRICADING +BARRICADO +BARRICADOED +BARRICADOES +BARRICADOING +BARRICADOS +BARRIER +BARRIERS +BARRING +BARRIO +BARRIOS +BARRISTER +BARRISTERS +BARROOM +BARROOMS +BARROW +BARROWS +BARS +BARSTOOL +BARSTOOLS +BARTEND +BARTENDED +BARTENDER +BARTENDERS +BARTENDING +BARTENDS +BARTER +BARTERED +BARTERER +BARTERERS +BARTERING +BARTERS +BARTISAN +BARTISANS +BARTIZAN +BARTIZANS +BARWARE +BARWARES +BARYE +BARYES +BARYON +BARYONIC +BARYONS +BARYTA +BARYTAS +BARYTE +BARYTES +BARYTIC +BARYTON +BARYTONE +BARYTONES +BARYTONS +BAS +BASAL +BASALLY +BASALT +BASALTES +BASALTIC +BASALTINE +BASALTS +BASCULE +BASCULES +BASE +BASEBALL +BASEBALLS +BASEBOARD +BASEBOARDS +BASEBORN +BASED +BASELESS +BASELINE +BASELINER +BASELINERS +BASELINES +BASELY +BASEMAN +BASEMEN +BASEMENT +BASEMENTLESS +BASEMENTS +BASENESS +BASENESSES +BASENJI +BASENJIS +BASEPLATE +BASEPLATES +BASER +BASERUNNING +BASERUNNINGS +BASES +BASEST +BASH +BASHAW +BASHAWS +BASHED +BASHER +BASHERS +BASHES +BASHFUL +BASHFULLY +BASHFULNESS +BASHFULNESSES +BASHING +BASHINGS +BASHLYK +BASHLYKS +BASIC +BASICALLY +BASICITIES +BASICITY +BASICS +BASIDIA +BASIDIAL +BASIDIOMYCETE +BASIDIOMYCETES +BASIDIOMYCETOUS +BASIDIOSPORE +BASIDIOSPORES +BASIDIUM +BASIFICATION +BASIFICATIONS +BASIFIED +BASIFIER +BASIFIERS +BASIFIES +BASIFIXED +BASIFY +BASIFYING +BASIL +BASILAR +BASILARY +BASILECT +BASILECTS +BASILIC +BASILICA +BASILICAE +BASILICAL +BASILICAN +BASILICAS +BASILISK +BASILISKS +BASILS +BASIN +BASINAL +BASINED +BASINET +BASINETS +BASINFUL +BASINFULS +BASING +BASINLIKE +BASINS +BASION +BASIONS +BASIPETAL +BASIPETALLY +BASIS +BASK +BASKED +BASKET +BASKETBALL +BASKETBALLS +BASKETFUL +BASKETFULS +BASKETLIKE +BASKETRIES +BASKETRY +BASKETS +BASKETSFUL +BASKETWORK +BASKETWORKS +BASKING +BASKS +BASMATI +BASMATIS +BASOPHIL +BASOPHILE +BASOPHILES +BASOPHILIA +BASOPHILIAS +BASOPHILIC +BASOPHILS +BASQUE +BASQUES +BASS +BASSES +BASSET +BASSETED +BASSETING +BASSETS +BASSETT +BASSETTED +BASSETTING +BASSETTS +BASSI +BASSINET +BASSINETS +BASSIST +BASSISTS +BASSLY +BASSNESS +BASSNESSES +BASSO +BASSOON +BASSOONIST +BASSOONISTS +BASSOONS +BASSOS +BASSWOOD +BASSWOODS +BASSY +BAST +BASTARD +BASTARDIES +BASTARDISE +BASTARDISED +BASTARDISES +BASTARDISING +BASTARDIZATION +BASTARDIZATIONS +BASTARDIZE +BASTARDIZED +BASTARDIZES +BASTARDIZING +BASTARDLY +BASTARDS +BASTARDY +BASTE +BASTED +BASTER +BASTERS +BASTES +BASTILE +BASTILES +BASTILLE +BASTILLES +BASTINADE +BASTINADED +BASTINADES +BASTINADING +BASTINADO +BASTINADOED +BASTINADOES +BASTINADOING +BASTING +BASTINGS +BASTION +BASTIONED +BASTIONS +BASTS +BAT +BATBOY +BATBOYS +BATCH +BATCHED +BATCHER +BATCHERS +BATCHES +BATCHING +BATE +BATEAU +BATEAUX +BATED +BATES +BATFISH +BATFISHES +BATFOWL +BATFOWLED +BATFOWLER +BATFOWLERS +BATFOWLING +BATFOWLS +BATGIRL +BATGIRLS +BATH +BATHE +BATHED +BATHER +BATHERS +BATHES +BATHETIC +BATHETICALLY +BATHHOUSE +BATHHOUSES +BATHING +BATHLESS +BATHMAT +BATHMATS +BATHOLITH +BATHOLITHIC +BATHOLITHS +BATHOS +BATHOSES +BATHROBE +BATHROBES +BATHROOM +BATHROOMS +BATHS +BATHTUB +BATHTUBS +BATHWATER +BATHWATERS +BATHYAL +BATHYMETRIC +BATHYMETRICAL +BATHYMETRICALLY +BATHYMETRIES +BATHYMETRY +BATHYPELAGIC +BATHYSCAPH +BATHYSCAPHE +BATHYSCAPHES +BATHYSCAPHS +BATHYSPHERE +BATHYSPHERES +BATIK +BATIKED +BATIKING +BATIKS +BATING +BATISTE +BATISTES +BATLIKE +BATMAN +BATMEN +BATON +BATONS +BATRACHIAN +BATRACHIANS +BATS +BATSMAN +BATSMEN +BATT +BATTAILOUS +BATTALIA +BATTALIAS +BATTALION +BATTALIONS +BATTEAU +BATTEAUX +BATTED +BATTEMENT +BATTEMENTS +BATTEN +BATTENED +BATTENER +BATTENERS +BATTENING +BATTENS +BATTER +BATTERED +BATTERER +BATTERERS +BATTERIE +BATTERIES +BATTERING +BATTERS +BATTERY +BATTIER +BATTIEST +BATTIK +BATTIKS +BATTINESS +BATTINESSES +BATTING +BATTINGS +BATTLE +BATTLED +BATTLEFIELD +BATTLEFIELDS +BATTLEFRONT +BATTLEFRONTS +BATTLEGROUND +BATTLEGROUNDS +BATTLEMENT +BATTLEMENTED +BATTLEMENTS +BATTLER +BATTLERS +BATTLES +BATTLESHIP +BATTLESHIPS +BATTLEWAGON +BATTLEWAGONS +BATTLING +BATTS +BATTU +BATTUE +BATTUES +BATTY +BATWING +BAUBEE +BAUBEES +BAUBLE +BAUBLES +BAUD +BAUDEKIN +BAUDEKINS +BAUDRONS +BAUDRONSES +BAUDS +BAUHINIA +BAUHINIAS +BAULK +BAULKED +BAULKIER +BAULKIEST +BAULKING +BAULKS +BAULKY +BAUSOND +BAUXITE +BAUXITES +BAUXITIC +BAWBEE +BAWBEES +BAWCOCK +BAWCOCKS +BAWD +BAWDIER +BAWDIES +BAWDIEST +BAWDILY +BAWDINESS +BAWDINESSES +BAWDRIC +BAWDRICS +BAWDRIES +BAWDRY +BAWDS +BAWDY +BAWL +BAWLED +BAWLER +BAWLERS +BAWLING +BAWLS +BAWSUNT +BAWTIE +BAWTIES +BAWTY +BAY +BAYADEER +BAYADEERS +BAYADERE +BAYADERES +BAYAMO +BAYAMOS +BAYARD +BAYARDS +BAYBERRIES +BAYBERRY +BAYED +BAYING +BAYMAN +BAYMEN +BAYONET +BAYONETED +BAYONETING +BAYONETS +BAYONETTED +BAYONETTING +BAYOU +BAYOUS +BAYS +BAYWOOD +BAYWOODS +BAZAAR +BAZAARS +BAZAR +BAZARS +BAZILLION +BAZILLIONS +BAZOO +BAZOOKA +BAZOOKAS +BAZOOMS +BAZOOS +BDELLIUM +BDELLIUMS +BE +BEACH +BEACHBALL +BEACHBALLS +BEACHBOY +BEACHBOYS +BEACHCOMB +BEACHCOMBED +BEACHCOMBER +BEACHCOMBERS +BEACHCOMBING +BEACHCOMBS +BEACHED +BEACHES +BEACHFRONT +BEACHFRONTS +BEACHGOER +BEACHGOERS +BEACHHEAD +BEACHHEADS +BEACHIER +BEACHIEST +BEACHING +BEACHSIDE +BEACHWEAR +BEACHY +BEACON +BEACONED +BEACONING +BEACONS +BEAD +BEADED +BEADER +BEADERS +BEADHOUSE +BEADHOUSES +BEADIER +BEADIEST +BEADILY +BEADINESS +BEADINESSES +BEADING +BEADINGS +BEADLE +BEADLEDOM +BEADLEDOMS +BEADLES +BEADLIKE +BEADMAN +BEADMEN +BEADROLL +BEADROLLS +BEADS +BEADSMAN +BEADSMEN +BEADWORK +BEADWORKS +BEADY +BEAGLE +BEAGLES +BEAK +BEAKED +BEAKER +BEAKERS +BEAKIER +BEAKIEST +BEAKLESS +BEAKLIKE +BEAKS +BEAKY +BEAM +BEAMED +BEAMIER +BEAMIEST +BEAMILY +BEAMING +BEAMINGLY +BEAMISH +BEAMISHLY +BEAMLESS +BEAMLIKE +BEAMS +BEAMY +BEAN +BEANBAG +BEANBAGS +BEANBALL +BEANBALLS +BEANED +BEANERIES +BEANERY +BEANIE +BEANIES +BEANING +BEANLIKE +BEANO +BEANOS +BEANPOLE +BEANPOLES +BEANS +BEANSTALK +BEANSTALKS +BEAR +BEARABILITIES +BEARABILITY +BEARABLE +BEARABLY +BEARBAITING +BEARBAITINGS +BEARBERRIES +BEARBERRY +BEARCAT +BEARCATS +BEARD +BEARDED +BEARDEDNESS +BEARDEDNESSES +BEARDING +BEARDLESS +BEARDS +BEARDTONGUE +BEARDTONGUES +BEARER +BEARERS +BEARGRASS +BEARGRASSES +BEARHUG +BEARHUGS +BEARING +BEARINGS +BEARISH +BEARISHLY +BEARISHNESS +BEARISHNESSES +BEARLIKE +BEARS +BEARSKIN +BEARSKINS +BEARWOOD +BEARWOODS +BEAST +BEASTIE +BEASTIES +BEASTINGS +BEASTLIER +BEASTLIEST +BEASTLINESS +BEASTLINESSES +BEASTLY +BEASTS +BEAT +BEATABLE +BEATEN +BEATER +BEATERS +BEATIFIC +BEATIFICALLY +BEATIFICATION +BEATIFICATIONS +BEATIFIED +BEATIFIES +BEATIFY +BEATIFYING +BEATING +BEATINGS +BEATITUDE +BEATITUDES +BEATLESS +BEATNIK +BEATNIKS +BEATS +BEAU +BEAUCOUP +BEAUCOUPS +BEAUISH +BEAUS +BEAUT +BEAUTEOUS +BEAUTEOUSLY +BEAUTEOUSNESS +BEAUTEOUSNESSES +BEAUTICIAN +BEAUTICIANS +BEAUTIES +BEAUTIFICATION +BEAUTIFICATIONS +BEAUTIFIED +BEAUTIFIER +BEAUTIFIERS +BEAUTIFIES +BEAUTIFUL +BEAUTIFULLER +BEAUTIFULLEST +BEAUTIFULLY +BEAUTIFULNESS +BEAUTIFULNESSES +BEAUTIFY +BEAUTIFYING +BEAUTS +BEAUTY +BEAUX +BEAVER +BEAVERBOARD +BEAVERBOARDS +BEAVERED +BEAVERING +BEAVERS +BEBEERINE +BEBEERINES +BEBEERU +BEBEERUS +BEBLOOD +BEBLOODED +BEBLOODING +BEBLOODS +BEBOP +BEBOPPER +BEBOPPERS +BEBOPS +BECALM +BECALMED +BECALMING +BECALMS +BECAME +BECAP +BECAPPED +BECAPPING +BECAPS +BECARPET +BECARPETED +BECARPETING +BECARPETS +BECAUSE +BECCAFICO +BECCAFICOS +BECHALK +BECHALKED +BECHALKING +BECHALKS +BECHAMEL +BECHAMELS +BECHANCE +BECHANCED +BECHANCES +BECHANCING +BECHARM +BECHARMED +BECHARMING +BECHARMS +BECK +BECKED +BECKET +BECKETS +BECKING +BECKON +BECKONED +BECKONER +BECKONERS +BECKONING +BECKONS +BECKS +BECLAMOR +BECLAMORED +BECLAMORING +BECLAMORS +BECLASP +BECLASPED +BECLASPING +BECLASPS +BECLOAK +BECLOAKED +BECLOAKING +BECLOAKS +BECLOG +BECLOGGED +BECLOGGING +BECLOGS +BECLOTHE +BECLOTHED +BECLOTHES +BECLOTHING +BECLOUD +BECLOUDED +BECLOUDING +BECLOUDS +BECLOWN +BECLOWNED +BECLOWNING +BECLOWNS +BECOME +BECOMES +BECOMING +BECOMINGLY +BECOMINGS +BECOWARD +BECOWARDED +BECOWARDING +BECOWARDS +BECQUEREL +BECQUERELS +BECRAWL +BECRAWLED +BECRAWLING +BECRAWLS +BECRIME +BECRIMED +BECRIMES +BECRIMING +BECROWD +BECROWDED +BECROWDING +BECROWDS +BECRUST +BECRUSTED +BECRUSTING +BECRUSTS +BECUDGEL +BECUDGELED +BECUDGELING +BECUDGELLED +BECUDGELLING +BECUDGELS +BECURSE +BECURSED +BECURSES +BECURSING +BECURST +BED +BEDABBLE +BEDABBLED +BEDABBLES +BEDABBLING +BEDAMN +BEDAMNED +BEDAMNING +BEDAMNS +BEDARKEN +BEDARKENED +BEDARKENING +BEDARKENS +BEDAUB +BEDAUBED +BEDAUBING +BEDAUBS +BEDAZZLE +BEDAZZLED +BEDAZZLEMENT +BEDAZZLEMENTS +BEDAZZLES +BEDAZZLING +BEDBOARD +BEDBOARDS +BEDBUG +BEDBUGS +BEDCHAIR +BEDCHAIRS +BEDCHAMBER +BEDCHAMBERS +BEDCLOTHES +BEDCOVER +BEDCOVERING +BEDCOVERINGS +BEDCOVERS +BEDDABLE +BEDDED +BEDDER +BEDDERS +BEDDING +BEDDINGS +BEDEAFEN +BEDEAFENED +BEDEAFENING +BEDEAFENS +BEDECK +BEDECKED +BEDECKING +BEDECKS +BEDEHOUSE +BEDEHOUSES +BEDEL +BEDELL +BEDELLS +BEDELS +BEDEMAN +BEDEMEN +BEDESMAN +BEDESMEN +BEDEVIL +BEDEVILED +BEDEVILING +BEDEVILLED +BEDEVILLING +BEDEVILMENT +BEDEVILMENTS +BEDEVILS +BEDEW +BEDEWED +BEDEWING +BEDEWS +BEDFAST +BEDFELLOW +BEDFELLOWS +BEDFRAME +BEDFRAMES +BEDGOWN +BEDGOWNS +BEDIAPER +BEDIAPERED +BEDIAPERING +BEDIAPERS +BEDIGHT +BEDIGHTED +BEDIGHTING +BEDIGHTS +BEDIM +BEDIMMED +BEDIMMING +BEDIMPLE +BEDIMPLED +BEDIMPLES +BEDIMPLING +BEDIMS +BEDIRTIED +BEDIRTIES +BEDIRTY +BEDIRTYING +BEDIZEN +BEDIZENED +BEDIZENING +BEDIZENMENT +BEDIZENMENTS +BEDIZENS +BEDLAM +BEDLAMITE +BEDLAMITES +BEDLAMP +BEDLAMPS +BEDLAMS +BEDLESS +BEDLIKE +BEDMAKER +BEDMAKERS +BEDMATE +BEDMATES +BEDOTTED +BEDOUIN +BEDOUINS +BEDPAN +BEDPANS +BEDPLATE +BEDPLATES +BEDPOST +BEDPOSTS +BEDQUILT +BEDQUILTS +BEDRAGGLE +BEDRAGGLED +BEDRAGGLES +BEDRAGGLING +BEDRAIL +BEDRAILS +BEDRAPE +BEDRAPED +BEDRAPES +BEDRAPING +BEDRENCH +BEDRENCHED +BEDRENCHES +BEDRENCHING +BEDRID +BEDRIDDEN +BEDRIVEL +BEDRIVELED +BEDRIVELING +BEDRIVELLED +BEDRIVELLING +BEDRIVELS +BEDROCK +BEDROCKS +BEDROLL +BEDROLLS +BEDROOM +BEDROOMED +BEDROOMS +BEDRUG +BEDRUGGED +BEDRUGGING +BEDRUGS +BEDS +BEDSHEET +BEDSHEETS +BEDSIDE +BEDSIDES +BEDSIT +BEDSITS +BEDSONIA +BEDSONIAS +BEDSORE +BEDSORES +BEDSPREAD +BEDSPREADS +BEDSPRING +BEDSPRINGS +BEDSTAND +BEDSTANDS +BEDSTEAD +BEDSTEADS +BEDSTRAW +BEDSTRAWS +BEDTICK +BEDTICKS +BEDTIME +BEDTIMES +BEDU +BEDUIN +BEDUINS +BEDUMB +BEDUMBED +BEDUMBING +BEDUMBS +BEDUNCE +BEDUNCED +BEDUNCES +BEDUNCING +BEDWARD +BEDWARDS +BEDWARF +BEDWARFED +BEDWARFING +BEDWARFS +BEDWARMER +BEDWARMERS +BEDWETTER +BEDWETTERS +BEE +BEEBEE +BEEBEES +BEEBREAD +BEEBREADS +BEECH +BEECHDROPS +BEECHEN +BEECHES +BEECHIER +BEECHIEST +BEECHMAST +BEECHMASTS +BEECHNUT +BEECHNUTS +BEECHWOOD +BEECHWOODS +BEECHY +BEEDI +BEEDIES +BEEF +BEEFALO +BEEFALOES +BEEFALOS +BEEFCAKE +BEEFCAKES +BEEFEATER +BEEFEATERS +BEEFED +BEEFIER +BEEFIEST +BEEFILY +BEEFINESS +BEEFINESSES +BEEFING +BEEFLESS +BEEFS +BEEFSTEAK +BEEFSTEAKS +BEEFWOOD +BEEFWOODS +BEEFY +BEEHIVE +BEEHIVES +BEEKEEPER +BEEKEEPERS +BEEKEEPING +BEEKEEPINGS +BEELIKE +BEELINE +BEELINED +BEELINES +BEELINING +BEEN +BEEP +BEEPED +BEEPER +BEEPERS +BEEPING +BEEPS +BEER +BEERIER +BEERIEST +BEERINESS +BEERINESSES +BEERS +BEERY +BEES +BEESTINGS +BEESWAX +BEESWAXES +BEESWING +BEESWINGS +BEET +BEETLE +BEETLED +BEETLER +BEETLERS +BEETLES +BEETLING +BEETROOT +BEETROOTS +BEETS +BEEVES +BEEYARD +BEEYARDS +BEEZER +BEEZERS +BEFALL +BEFALLEN +BEFALLING +BEFALLS +BEFELL +BEFINGER +BEFINGERED +BEFINGERING +BEFINGERS +BEFIT +BEFITS +BEFITTED +BEFITTING +BEFITTINGLY +BEFLAG +BEFLAGGED +BEFLAGGING +BEFLAGS +BEFLEA +BEFLEAED +BEFLEAING +BEFLEAS +BEFLECK +BEFLECKED +BEFLECKING +BEFLECKS +BEFLOWER +BEFLOWERED +BEFLOWERING +BEFLOWERS +BEFOG +BEFOGGED +BEFOGGING +BEFOGS +BEFOOL +BEFOOLED +BEFOOLING +BEFOOLS +BEFORE +BEFOREHAND +BEFORETIME +BEFOUL +BEFOULED +BEFOULER +BEFOULERS +BEFOULING +BEFOULS +BEFRET +BEFRETS +BEFRETTED +BEFRETTING +BEFRIEND +BEFRIENDED +BEFRIENDING +BEFRIENDS +BEFRINGE +BEFRINGED +BEFRINGES +BEFRINGING +BEFUDDLE +BEFUDDLED +BEFUDDLEMENT +BEFUDDLEMENTS +BEFUDDLES +BEFUDDLING +BEG +BEGALL +BEGALLED +BEGALLING +BEGALLS +BEGAN +BEGAT +BEGAZE +BEGAZED +BEGAZES +BEGAZING +BEGET +BEGETS +BEGETTER +BEGETTERS +BEGETTING +BEGGAR +BEGGARDOM +BEGGARDOMS +BEGGARED +BEGGARIES +BEGGARING +BEGGARLINESS +BEGGARLINESSES +BEGGARLY +BEGGARS +BEGGARWEED +BEGGARWEEDS +BEGGARY +BEGGED +BEGGING +BEGIN +BEGINNER +BEGINNERS +BEGINNING +BEGINNINGS +BEGINS +BEGIRD +BEGIRDED +BEGIRDING +BEGIRDLE +BEGIRDLED +BEGIRDLES +BEGIRDLING +BEGIRDS +BEGIRT +BEGLAD +BEGLADDED +BEGLADDING +BEGLADS +BEGLAMOR +BEGLAMORED +BEGLAMORING +BEGLAMORS +BEGLAMOUR +BEGLAMOURED +BEGLAMOURING +BEGLAMOURS +BEGLOOM +BEGLOOMED +BEGLOOMING +BEGLOOMS +BEGOGGLED +BEGONE +BEGONIA +BEGONIAS +BEGORAH +BEGORRA +BEGORRAH +BEGOT +BEGOTTEN +BEGRIM +BEGRIME +BEGRIMED +BEGRIMES +BEGRIMING +BEGRIMMED +BEGRIMMING +BEGRIMS +BEGROAN +BEGROANED +BEGROANING +BEGROANS +BEGRUDGE +BEGRUDGED +BEGRUDGER +BEGRUDGERS +BEGRUDGES +BEGRUDGING +BEGRUDGINGLY +BEGS +BEGUILE +BEGUILED +BEGUILEMENT +BEGUILEMENTS +BEGUILER +BEGUILERS +BEGUILES +BEGUILING +BEGUILINGLY +BEGUINE +BEGUINES +BEGULF +BEGULFED +BEGULFING +BEGULFS +BEGUM +BEGUMS +BEGUN +BEHALF +BEHALVES +BEHAVE +BEHAVED +BEHAVER +BEHAVERS +BEHAVES +BEHAVING +BEHAVIOR +BEHAVIORAL +BEHAVIORALLY +BEHAVIORISM +BEHAVIORISMS +BEHAVIORIST +BEHAVIORISTIC +BEHAVIORISTS +BEHAVIORS +BEHAVIOUR +BEHAVIOURS +BEHEAD +BEHEADAL +BEHEADALS +BEHEADED +BEHEADER +BEHEADERS +BEHEADING +BEHEADS +BEHELD +BEHEMOTH +BEHEMOTHS +BEHEST +BEHESTS +BEHIND +BEHINDHAND +BEHINDS +BEHOLD +BEHOLDEN +BEHOLDER +BEHOLDERS +BEHOLDING +BEHOLDS +BEHOOF +BEHOOVE +BEHOOVED +BEHOOVES +BEHOOVING +BEHOVE +BEHOVED +BEHOVES +BEHOVING +BEHOWL +BEHOWLED +BEHOWLING +BEHOWLS +BEIGE +BEIGES +BEIGNE +BEIGNES +BEIGNET +BEIGNETS +BEIGY +BEING +BEINGS +BEJABBERS +BEJABERS +BEJEEBERS +BEJEEZUS +BEJESUS +BEJEWEL +BEJEWELED +BEJEWELING +BEJEWELLED +BEJEWELLING +BEJEWELS +BEJUMBLE +BEJUMBLED +BEJUMBLES +BEJUMBLING +BEKISS +BEKISSED +BEKISSES +BEKISSING +BEKNIGHT +BEKNIGHTED +BEKNIGHTING +BEKNIGHTS +BEKNOT +BEKNOTS +BEKNOTTED +BEKNOTTING +BEL +BELABOR +BELABORED +BELABORING +BELABORS +BELABOUR +BELABOURED +BELABOURING +BELABOURS +BELACED +BELADIED +BELADIES +BELADY +BELADYING +BELATED +BELATEDLY +BELATEDNESS +BELATEDNESSES +BELAUD +BELAUDED +BELAUDING +BELAUDS +BELAY +BELAYED +BELAYER +BELAYERS +BELAYING +BELAYS +BELCH +BELCHED +BELCHER +BELCHERS +BELCHES +BELCHING +BELDAM +BELDAME +BELDAMES +BELDAMS +BELEAGUER +BELEAGUERED +BELEAGUERING +BELEAGUERMENT +BELEAGUERMENTS +BELEAGUERS +BELEAP +BELEAPED +BELEAPING +BELEAPS +BELEAPT +BELEMNITE +BELEMNITES +BELFRIED +BELFRIES +BELFRY +BELGA +BELGAS +BELIE +BELIED +BELIEF +BELIEFS +BELIER +BELIERS +BELIES +BELIEVABILITIES +BELIEVABILITY +BELIEVABLE +BELIEVABLY +BELIEVE +BELIEVED +BELIEVER +BELIEVERS +BELIEVES +BELIEVING +BELIKE +BELIQUOR +BELIQUORED +BELIQUORING +BELIQUORS +BELITTLE +BELITTLED +BELITTLEMENT +BELITTLEMENTS +BELITTLER +BELITTLERS +BELITTLES +BELITTLING +BELIVE +BELL +BELLADONNA +BELLADONNAS +BELLBIRD +BELLBIRDS +BELLBOY +BELLBOYS +BELLE +BELLED +BELLEEK +BELLEEKS +BELLES +BELLETRIST +BELLETRISTIC +BELLETRISTS +BELLFLOWER +BELLFLOWERS +BELLHOP +BELLHOPS +BELLICOSE +BELLICOSITIES +BELLICOSITY +BELLIED +BELLIES +BELLIGERENCE +BELLIGERENCES +BELLIGERENCIES +BELLIGERENCY +BELLIGERENT +BELLIGERENTLY +BELLIGERENTS +BELLING +BELLINGS +BELLMAN +BELLMEN +BELLOW +BELLOWED +BELLOWER +BELLOWERS +BELLOWING +BELLOWS +BELLPULL +BELLPULLS +BELLS +BELLWETHER +BELLWETHERS +BELLWORT +BELLWORTS +BELLY +BELLYACHE +BELLYACHED +BELLYACHER +BELLYACHERS +BELLYACHES +BELLYACHING +BELLYBAND +BELLYBANDS +BELLYFUL +BELLYFULS +BELLYING +BELLYLIKE +BELON +BELONG +BELONGED +BELONGING +BELONGINGNESS +BELONGINGNESSES +BELONGINGS +BELONGS +BELONS +BELOVED +BELOVEDS +BELOW +BELOWDECKS +BELOWGROUND +BELOWS +BELS +BELT +BELTED +BELTER +BELTERS +BELTING +BELTINGS +BELTLESS +BELTLINE +BELTLINES +BELTS +BELTWAY +BELTWAYS +BELUGA +BELUGAS +BELVEDERE +BELVEDERES +BELYING +BEMA +BEMADAM +BEMADAMED +BEMADAMING +BEMADAMS +BEMADDEN +BEMADDENED +BEMADDENING +BEMADDENS +BEMAS +BEMATA +BEMEAN +BEMEANED +BEMEANING +BEMEANS +BEMEDALED +BEMEDALLED +BEMINGLE +BEMINGLED +BEMINGLES +BEMINGLING +BEMIRE +BEMIRED +BEMIRES +BEMIRING +BEMIST +BEMISTED +BEMISTING +BEMISTS +BEMIX +BEMIXED +BEMIXES +BEMIXING +BEMIXT +BEMOAN +BEMOANED +BEMOANING +BEMOANS +BEMOCK +BEMOCKED +BEMOCKING +BEMOCKS +BEMUDDLE +BEMUDDLED +BEMUDDLES +BEMUDDLING +BEMURMUR +BEMURMURED +BEMURMURING +BEMURMURS +BEMUSE +BEMUSED +BEMUSEDLY +BEMUSEMENT +BEMUSEMENTS +BEMUSES +BEMUSING +BEMUZZLE +BEMUZZLED +BEMUZZLES +BEMUZZLING +BEN +BENADRYL +BENADRYLS +BENAME +BENAMED +BENAMES +BENAMING +BENCH +BENCHED +BENCHER +BENCHERS +BENCHES +BENCHING +BENCHLAND +BENCHLANDS +BENCHLESS +BENCHMARK +BENCHMARKED +BENCHMARKING +BENCHMARKINGS +BENCHMARKS +BENCHTOP +BENCHWARMER +BENCHWARMERS +BEND +BENDABLE +BENDAY +BENDAYED +BENDAYING +BENDAYS +BENDED +BENDEE +BENDEES +BENDER +BENDERS +BENDIER +BENDIEST +BENDING +BENDS +BENDWAYS +BENDWISE +BENDY +BENDYS +BENE +BENEATH +BENEDICK +BENEDICKS +BENEDICT +BENEDICTION +BENEDICTIONS +BENEDICTORY +BENEDICTS +BENEFACTION +BENEFACTIONS +BENEFACTOR +BENEFACTORS +BENEFACTRESS +BENEFACTRESSES +BENEFIC +BENEFICE +BENEFICED +BENEFICENCE +BENEFICENCES +BENEFICENT +BENEFICENTLY +BENEFICES +BENEFICIAL +BENEFICIALLY +BENEFICIALNESS +BENEFICIARIES +BENEFICIARY +BENEFICIATE +BENEFICIATED +BENEFICIATES +BENEFICIATING +BENEFICIATION +BENEFICIATIONS +BENEFICING +BENEFIT +BENEFITED +BENEFITER +BENEFITERS +BENEFITING +BENEFITS +BENEFITTED +BENEFITTING +BENEMPT +BENEMPTED +BENES +BENEVOLENCE +BENEVOLENCES +BENEVOLENT +BENEVOLENTLY +BENEVOLENTNESS +BENGALINE +BENGALINES +BENIGHTED +BENIGHTEDLY +BENIGHTEDNESS +BENIGHTEDNESSES +BENIGN +BENIGNANCIES +BENIGNANCY +BENIGNANT +BENIGNANTLY +BENIGNITIES +BENIGNITY +BENIGNLY +BENISON +BENISONS +BENJAMIN +BENJAMINS +BENNE +BENNES +BENNET +BENNETS +BENNI +BENNIES +BENNIS +BENNY +BENOMYL +BENOMYLS +BENS +BENT +BENTGRASS +BENTGRASSES +BENTHAL +BENTHIC +BENTHON +BENTHONIC +BENTHONS +BENTHOS +BENTHOSES +BENTO +BENTONITE +BENTONITES +BENTONITIC +BENTOS +BENTS +BENTWOOD +BENTWOODS +BENUMB +BENUMBED +BENUMBING +BENUMBS +BENZAL +BENZALDEHYDE +BENZALDEHYDES +BENZANTHRACENE +BENZANTHRACENES +BENZENE +BENZENES +BENZENOID +BENZENOIDS +BENZIDIN +BENZIDINE +BENZIDINES +BENZIDINS +BENZIMIDAZOLE +BENZIMIDAZOLES +BENZIN +BENZINE +BENZINES +BENZINS +BENZOAPYRENE +BENZOAPYRENES +BENZOATE +BENZOATES +BENZOCAINE +BENZOCAINES +BENZODIAZEPINE +BENZODIAZEPINES +BENZOFURAN +BENZOFURANS +BENZOIC +BENZOIN +BENZOINS +BENZOL +BENZOLE +BENZOLES +BENZOLS +BENZOPHENONE +BENZOPHENONES +BENZOYL +BENZOYLS +BENZYL +BENZYLIC +BENZYLS +BEPAINT +BEPAINTED +BEPAINTING +BEPAINTS +BEPIMPLE +BEPIMPLED +BEPIMPLES +BEPIMPLING +BEQUEATH +BEQUEATHAL +BEQUEATHALS +BEQUEATHED +BEQUEATHING +BEQUEATHS +BEQUEST +BEQUESTS +BERAKE +BERAKED +BERAKES +BERAKING +BERASCAL +BERASCALED +BERASCALING +BERASCALS +BERATE +BERATED +BERATES +BERATING +BERBERIN +BERBERINE +BERBERINES +BERBERINS +BERBERIS +BERBERISES +BERCEUSE +BERCEUSES +BERDACHE +BERDACHES +BEREAVE +BEREAVED +BEREAVEMENT +BEREAVEMENTS +BEREAVER +BEREAVERS +BEREAVES +BEREAVING +BEREFT +BERET +BERETS +BERETTA +BERETTAS +BERG +BERGAMOT +BERGAMOTS +BERGERE +BERGERES +BERGS +BERHYME +BERHYMED +BERHYMES +BERHYMING +BERIBBONED +BERIBERI +BERIBERIS +BERIMBAU +BERIMBAUS +BERIME +BERIMED +BERIMES +BERIMING +BERINGED +BERK +BERKELIUM +BERKELIUMS +BERKS +BERLIN +BERLINE +BERLINES +BERLINS +BERM +BERME +BERMED +BERMES +BERMING +BERMS +BERMUDAS +BERNICLE +BERNICLES +BEROBED +BEROUGED +BERRETTA +BERRETTAS +BERRIED +BERRIES +BERRY +BERRYING +BERRYLESS +BERRYLIKE +BERSEEM +BERSEEMS +BERSERK +BERSERKER +BERSERKERS +BERSERKLY +BERSERKS +BERTH +BERTHA +BERTHAS +BERTHED +BERTHING +BERTHS +BERYL +BERYLINE +BERYLLIUM +BERYLLIUMS +BERYLS +BES +BESCORCH +BESCORCHED +BESCORCHES +BESCORCHING +BESCOUR +BESCOURED +BESCOURING +BESCOURS +BESCREEN +BESCREENED +BESCREENING +BESCREENS +BESEECH +BESEECHED +BESEECHER +BESEECHERS +BESEECHES +BESEECHING +BESEECHINGLY +BESEEM +BESEEMED +BESEEMING +BESEEMS +BESES +BESET +BESETMENT +BESETMENTS +BESETS +BESETTER +BESETTERS +BESETTING +BESHADOW +BESHADOWED +BESHADOWING +BESHADOWS +BESHAME +BESHAMED +BESHAMES +BESHAMING +BESHIVER +BESHIVERED +BESHIVERING +BESHIVERS +BESHOUT +BESHOUTED +BESHOUTING +BESHOUTS +BESHREW +BESHREWED +BESHREWING +BESHREWS +BESHROUD +BESHROUDED +BESHROUDING +BESHROUDS +BESIDE +BESIDES +BESIEGE +BESIEGED +BESIEGER +BESIEGERS +BESIEGES +BESIEGING +BESLAVED +BESLIME +BESLIMED +BESLIMES +BESLIMING +BESMEAR +BESMEARED +BESMEARER +BESMEARERS +BESMEARING +BESMEARS +BESMILE +BESMILED +BESMILES +BESMILING +BESMIRCH +BESMIRCHED +BESMIRCHES +BESMIRCHING +BESMOKE +BESMOKED +BESMOKES +BESMOKING +BESMOOTH +BESMOOTHED +BESMOOTHING +BESMOOTHS +BESMUDGE +BESMUDGED +BESMUDGES +BESMUDGING +BESMUT +BESMUTS +BESMUTTED +BESMUTTING +BESNOW +BESNOWED +BESNOWING +BESNOWS +BESOM +BESOMS +BESOOTHE +BESOOTHED +BESOOTHES +BESOOTHING +BESOT +BESOTS +BESOTTED +BESOTTING +BESOUGHT +BESPAKE +BESPANGLE +BESPANGLED +BESPANGLES +BESPANGLING +BESPATTER +BESPATTERED +BESPATTERING +BESPATTERS +BESPEAK +BESPEAKING +BESPEAKS +BESPECTACLED +BESPOKE +BESPOKEN +BESPOUSE +BESPOUSED +BESPOUSES +BESPOUSING +BESPREAD +BESPREADING +BESPREADS +BESPRENT +BESPRINKLE +BESPRINKLED +BESPRINKLES +BESPRINKLING +BEST +BESTEAD +BESTEADED +BESTEADING +BESTEADS +BESTED +BESTIAL +BESTIALITIES +BESTIALITY +BESTIALIZE +BESTIALIZED +BESTIALIZES +BESTIALIZING +BESTIALLY +BESTIARIES +BESTIARY +BESTING +BESTIR +BESTIRRED +BESTIRRING +BESTIRS +BESTOW +BESTOWAL +BESTOWALS +BESTOWED +BESTOWER +BESTOWERS +BESTOWING +BESTOWS +BESTREW +BESTREWED +BESTREWING +BESTREWN +BESTREWS +BESTRID +BESTRIDDEN +BESTRIDE +BESTRIDES +BESTRIDING +BESTRODE +BESTROW +BESTROWED +BESTROWING +BESTROWN +BESTROWS +BESTS +BESTSELLERDOM +BESTSELLERDOMS +BESTUD +BESTUDDED +BESTUDDING +BESTUDS +BESWARM +BESWARMED +BESWARMING +BESWARMS +BET +BETA +BETAINE +BETAINES +BETAKE +BETAKEN +BETAKES +BETAKING +BETAS +BETATRON +BETATRONS +BETATTER +BETATTERED +BETATTERING +BETATTERS +BETAXED +BETEL +BETELNUT +BETELNUTS +BETELS +BETH +BETHANK +BETHANKED +BETHANKING +BETHANKS +BETHEL +BETHELS +BETHESDA +BETHESDAS +BETHINK +BETHINKING +BETHINKS +BETHORN +BETHORNED +BETHORNING +BETHORNS +BETHOUGHT +BETHS +BETHUMP +BETHUMPED +BETHUMPING +BETHUMPS +BETIDE +BETIDED +BETIDES +BETIDING +BETIME +BETIMES +BETISE +BETISES +BETOKEN +BETOKENED +BETOKENING +BETOKENS +BETON +BETONIES +BETONS +BETONY +BETOOK +BETRAY +BETRAYAL +BETRAYALS +BETRAYED +BETRAYER +BETRAYERS +BETRAYING +BETRAYS +BETROTH +BETROTHAL +BETROTHALS +BETROTHED +BETROTHEDS +BETROTHING +BETROTHS +BETS +BETTA +BETTAS +BETTED +BETTER +BETTERED +BETTERING +BETTERMENT +BETTERMENTS +BETTERS +BETTING +BETTOR +BETTORS +BETWEEN +BETWEENBRAIN +BETWEENBRAINS +BETWEENNESS +BETWEENNESSES +BETWEENTIMES +BETWEENWHILES +BETWIXT +BEUNCLED +BEVATRON +BEVATRONS +BEVEL +BEVELED +BEVELER +BEVELERS +BEVELING +BEVELLED +BEVELLER +BEVELLERS +BEVELLING +BEVELS +BEVERAGE +BEVERAGES +BEVIES +BEVOMIT +BEVOMITED +BEVOMITING +BEVOMITS +BEVOR +BEVORS +BEVY +BEWAIL +BEWAILED +BEWAILER +BEWAILERS +BEWAILING +BEWAILS +BEWARE +BEWARED +BEWARES +BEWARING +BEWEARIED +BEWEARIES +BEWEARY +BEWEARYING +BEWEEP +BEWEEPING +BEWEEPS +BEWEPT +BEWHISKERED +BEWIG +BEWIGGED +BEWIGGING +BEWIGS +BEWILDER +BEWILDERED +BEWILDEREDLY +BEWILDEREDNESS +BEWILDERING +BEWILDERINGLY +BEWILDERMENT +BEWILDERMENTS +BEWILDERS +BEWINGED +BEWITCH +BEWITCHED +BEWITCHER +BEWITCHERIES +BEWITCHERS +BEWITCHERY +BEWITCHES +BEWITCHING +BEWITCHINGLY +BEWITCHMENT +BEWITCHMENTS +BEWORM +BEWORMED +BEWORMING +BEWORMS +BEWORRIED +BEWORRIES +BEWORRY +BEWORRYING +BEWRAP +BEWRAPPED +BEWRAPPING +BEWRAPS +BEWRAPT +BEWRAY +BEWRAYED +BEWRAYER +BEWRAYERS +BEWRAYING +BEWRAYS +BEY +BEYLIC +BEYLICS +BEYLIK +BEYLIKS +BEYOND +BEYONDS +BEYS +BEZANT +BEZANTS +BEZAZZ +BEZAZZES +BEZEL +BEZELS +BEZIL +BEZILS +BEZIQUE +BEZIQUES +BEZOAR +BEZOARS +BEZZANT +BEZZANTS +BHAKTA +BHAKTAS +BHAKTI +BHAKTIS +BHANG +BHANGRA +BHANGRAS +BHANGS +BHARAL +BHARALS +BHEESTIE +BHEESTIES +BHEESTY +BHISTIE +BHISTIES +BHOOT +BHOOTS +BHUT +BHUTS +BI +BIACETYL +BIACETYLS +BIALI +BIALIES +BIALIS +BIALY +BIALYS +BIANNUAL +BIANNUALLY +BIAS +BIASED +BIASEDLY +BIASES +BIASING +BIASNESS +BIASNESSES +BIASSED +BIASSEDLY +BIASSES +BIASSING +BIATHLETE +BIATHLETES +BIATHLON +BIATHLONS +BIAXAL +BIAXIAL +BIAXIALLY +BIB +BIBASIC +BIBB +BIBBED +BIBBER +BIBBERIES +BIBBERS +BIBBERY +BIBBING +BIBBS +BIBCOCK +BIBCOCKS +BIBELOT +BIBELOTS +BIBLE +BIBLES +BIBLESS +BIBLICAL +BIBLICALLY +BIBLICISM +BIBLICISMS +BIBLICIST +BIBLICISTS +BIBLIKE +BIBLIOGRAPHER +BIBLIOGRAPHERS +BIBLIOGRAPHIC +BIBLIOGRAPHICAL +BIBLIOGRAPHIES +BIBLIOGRAPHY +BIBLIOLATER +BIBLIOLATERS +BIBLIOLATRIES +BIBLIOLATROUS +BIBLIOLATRY +BIBLIOLOGIES +BIBLIOLOGY +BIBLIOMANIA +BIBLIOMANIAC +BIBLIOMANIACAL +BIBLIOMANIACS +BIBLIOMANIAS +BIBLIOPEGIC +BIBLIOPEGIES +BIBLIOPEGIST +BIBLIOPEGISTS +BIBLIOPEGY +BIBLIOPHILE +BIBLIOPHILES +BIBLIOPHILIC +BIBLIOPHILIES +BIBLIOPHILISM +BIBLIOPHILISMS +BIBLIOPHILY +BIBLIOPOLE +BIBLIOPOLES +BIBLIOPOLIST +BIBLIOPOLISTS +BIBLIOTHECA +BIBLIOTHECAE +BIBLIOTHECAL +BIBLIOTHECAS +BIBLIOTHERAPIES +BIBLIOTHERAPY +BIBLIOTIC +BIBLIOTICS +BIBLIOTIST +BIBLIOTISTS +BIBLIST +BIBLISTS +BIBS +BIBULOUS +BIBULOUSLY +BIBULOUSNESS +BIBULOUSNESSES +BICAMERAL +BICAMERALISM +BICAMERALISMS +BICARB +BICARBONATE +BICARBONATES +BICARBS +BICAUDAL +BICE +BICENTENARIES +BICENTENARY +BICENTENNIAL +BICENTENNIALS +BICENTRIC +BICEP +BICEPS +BICEPSES +BICES +BICHROMATE +BICHROMATED +BICHROMATES +BICHROME +BICIPITAL +BICKER +BICKERED +BICKERER +BICKERERS +BICKERING +BICKERS +BICOASTAL +BICOLOR +BICOLORED +BICOLORS +BICOLOUR +BICOLOURS +BICOMPONENT +BICONCAVE +BICONCAVITIES +BICONCAVITY +BICONDITIONAL +BICONDITIONALS +BICONVEX +BICONVEXITIES +BICONVEXITY +BICORN +BICORNE +BICORNES +BICORNS +BICRON +BICRONS +BICULTURAL +BICULTURALISM +BICULTURALISMS +BICUSPID +BICUSPIDS +BICYCLE +BICYCLED +BICYCLER +BICYCLERS +BICYCLES +BICYCLIC +BICYCLING +BICYCLIST +BICYCLISTS +BID +BIDARKA +BIDARKAS +BIDARKEE +BIDARKEES +BIDDABILITIES +BIDDABILITY +BIDDABLE +BIDDABLY +BIDDEN +BIDDER +BIDDERS +BIDDIES +BIDDING +BIDDINGS +BIDDY +BIDE +BIDED +BIDENTAL +BIDENTATE +BIDER +BIDERS +BIDES +BIDET +BIDETS +BIDI +BIDIALECTAL +BIDIALECTALISM +BIDIALECTALISMS +BIDING +BIDIRECTIONAL +BIDIRECTIONALLY +BIDIS +BIDONVILLE +BIDONVILLES +BIDS +BIELD +BIELDED +BIELDING +BIELDS +BIENNALE +BIENNALES +BIENNIA +BIENNIAL +BIENNIALLY +BIENNIALS +BIENNIUM +BIENNIUMS +BIER +BIERS +BIESTINGS +BIFACE +BIFACES +BIFACIAL +BIFACIALLY +BIFARIOUS +BIFF +BIFFED +BIFFIES +BIFFIN +BIFFING +BIFFINS +BIFFS +BIFFY +BIFID +BIFIDITIES +BIFIDITY +BIFIDLY +BIFILAR +BIFILARLY +BIFLAGELLATE +BIFLEX +BIFOCAL +BIFOCALED +BIFOCALS +BIFOLD +BIFOLIATE +BIFORATE +BIFORKED +BIFORM +BIFORMED +BIFUNCTIONAL +BIFURCATE +BIFURCATED +BIFURCATES +BIFURCATING +BIFURCATION +BIFURCATIONS +BIG +BIGAMIES +BIGAMIST +BIGAMISTS +BIGAMOUS +BIGAMOUSLY +BIGAMY +BIGARADE +BIGARADES +BIGAROON +BIGAROONS +BIGARREAU +BIGARREAUS +BIGEMINAL +BIGEMINIES +BIGEMINY +BIGENERIC +BIGEYE +BIGEYES +BIGFEET +BIGFOOT +BIGFOOTED +BIGFOOTING +BIGFOOTS +BIGGER +BIGGEST +BIGGETY +BIGGIE +BIGGIES +BIGGIN +BIGGING +BIGGINGS +BIGGINS +BIGGISH +BIGGITY +BIGGY +BIGHEAD +BIGHEADED +BIGHEADS +BIGHEARTED +BIGHEARTEDLY +BIGHEARTEDNESS +BIGHORN +BIGHORNS +BIGHT +BIGHTED +BIGHTING +BIGHTS +BIGLY +BIGMOUTH +BIGMOUTHED +BIGMOUTHS +BIGNESS +BIGNESSES +BIGNONIA +BIGNONIAS +BIGOS +BIGOSES +BIGOT +BIGOTED +BIGOTEDLY +BIGOTRIES +BIGOTRY +BIGOTS +BIGS +BIGSTICK +BIGTIME +BIGWIG +BIGWIGS +BIHOURLY +BIJECTION +BIJECTIONS +BIJECTIVE +BIJOU +BIJOUS +BIJOUTERIE +BIJOUTERIES +BIJOUX +BIJUGATE +BIJUGOUS +BIKE +BIKED +BIKER +BIKERS +BIKES +BIKEWAY +BIKEWAYS +BIKIE +BIKIES +BIKING +BIKINI +BIKINIED +BIKINIS +BILABIAL +BILABIALS +BILABIATE +BILANDER +BILANDERS +BILATERAL +BILATERALISM +BILATERALISMS +BILATERALLY +BILAYER +BILAYERS +BILBERRIES +BILBERRY +BILBIES +BILBO +BILBOA +BILBOAS +BILBOES +BILBOS +BILBY +BILDUNGSROMAN +BILDUNGSROMANS +BILE +BILECTION +BILECTIONS +BILES +BILEVEL +BILEVELS +BILGE +BILGED +BILGES +BILGEWATER +BILGEWATERS +BILGIER +BILGIEST +BILGING +BILGY +BILHARZIA +BILHARZIAL +BILHARZIAS +BILHARZIASES +BILHARZIASIS +BILIARY +BILINEAR +BILINGUAL +BILINGUALISM +BILINGUALISMS +BILINGUALLY +BILINGUALS +BILIOUS +BILIOUSLY +BILIOUSNESS +BILIOUSNESSES +BILIRUBIN +BILIRUBINS +BILIVERDIN +BILIVERDINS +BILK +BILKED +BILKER +BILKERS +BILKING +BILKS +BILL +BILLABLE +BILLABONG +BILLABONGS +BILLBOARD +BILLBOARDED +BILLBOARDING +BILLBOARDS +BILLBUG +BILLBUGS +BILLED +BILLER +BILLERS +BILLET +BILLETED +BILLETER +BILLETERS +BILLETING +BILLETS +BILLFISH +BILLFISHES +BILLFOLD +BILLFOLDS +BILLHEAD +BILLHEADS +BILLHOOK +BILLHOOKS +BILLIARD +BILLIARDS +BILLIE +BILLIES +BILLING +BILLINGS +BILLINGSGATE +BILLINGSGATES +BILLION +BILLIONAIRE +BILLIONAIRES +BILLIONS +BILLIONTH +BILLIONTHS +BILLON +BILLONS +BILLOW +BILLOWED +BILLOWIER +BILLOWIEST +BILLOWING +BILLOWS +BILLOWY +BILLS +BILLY +BILLYCAN +BILLYCANS +BILLYCOCK +BILLYCOCKS +BILOBATE +BILOBATED +BILOBED +BILOBULAR +BILOCATION +BILOCATIONS +BILOCULAR +BILSTED +BILSTEDS +BILTONG +BILTONGS +BIMA +BIMAH +BIMAHS +BIMANOUS +BIMANUAL +BIMANUALLY +BIMAS +BIMBETTE +BIMBETTES +BIMBO +BIMBOES +BIMBOS +BIMENSAL +BIMESTER +BIMESTERS +BIMETAL +BIMETALLIC +BIMETALLICS +BIMETALLISM +BIMETALLISMS +BIMETALLIST +BIMETALLISTIC +BIMETALLISTS +BIMETALS +BIMETHYL +BIMETHYLS +BIMILLENARIES +BIMILLENARY +BIMILLENNIAL +BIMILLENNIALS +BIMODAL +BIMODALITIES +BIMODALITY +BIMOLECULAR +BIMOLECULARLY +BIMONTHLIES +BIMONTHLY +BIMORPH +BIMORPHEMIC +BIMORPHS +BIN +BINAL +BINARIES +BINARISM +BINARISMS +BINARY +BINATE +BINATELY +BINATIONAL +BINAURAL +BINAURALLY +BIND +BINDABLE +BINDER +BINDERIES +BINDERS +BINDERY +BINDI +BINDING +BINDINGLY +BINDINGNESS +BINDINGNESSES +BINDINGS +BINDIS +BINDLE +BINDLES +BINDS +BINDWEED +BINDWEEDS +BINE +BINER +BINERS +BINES +BINGE +BINGED +BINGEING +BINGER +BINGERS +BINGES +BINGING +BINGO +BINGOES +BINGOS +BINIT +BINITS +BINNACLE +BINNACLES +BINNED +BINNING +BINOCLE +BINOCLES +BINOCS +BINOCULAR +BINOCULARITIES +BINOCULARITY +BINOCULARLY +BINOCULARS +BINOMIAL +BINOMIALLY +BINOMIALS +BINS +BINT +BINTS +BINTURONG +BINTURONGS +BINUCLEAR +BINUCLEATE +BINUCLEATED +BIO +BIOACOUSTICS +BIOACTIVE +BIOACTIVITIES +BIOACTIVITY +BIOASSAY +BIOASSAYED +BIOASSAYING +BIOASSAYS +BIOAVAILABILITY +BIOAVAILABLE +BIOCENOSE +BIOCENOSES +BIOCENOSIS +BIOCHEMIC +BIOCHEMICAL +BIOCHEMICALLY +BIOCHEMICALS +BIOCHEMIST +BIOCHEMISTRIES +BIOCHEMISTRY +BIOCHEMISTS +BIOCHIP +BIOCHIPS +BIOCIDAL +BIOCIDE +BIOCIDES +BIOCLEAN +BIOCLIMATIC +BIOCOENOSES +BIOCOENOSIS +BIOCOMPATIBLE +BIOCONTROL +BIOCONTROLS +BIOCONVERSION +BIOCONVERSIONS +BIOCYCLE +BIOCYCLES +BIODEGRADABLE +BIODEGRADATION +BIODEGRADATIONS +BIODEGRADE +BIODEGRADED +BIODEGRADES +BIODEGRADING +BIODIVERSITIES +BIODIVERSITY +BIODYNAMIC +BIOELECTRIC +BIOELECTRICAL +BIOELECTRICITY +BIOENERGETIC +BIOENERGETICS +BIOENGINEER +BIOENGINEERED +BIOENGINEERING +BIOENGINEERINGS +BIOENGINEERS +BIOETHIC +BIOETHICAL +BIOETHICIST +BIOETHICISTS +BIOETHICS +BIOFEEDBACK +BIOFEEDBACKS +BIOFILM +BIOFILMS +BIOFOULER +BIOFOULERS +BIOFOULING +BIOFOULINGS +BIOFUEL +BIOFUELED +BIOFUELS +BIOG +BIOGAS +BIOGASES +BIOGASSES +BIOGEN +BIOGENESES +BIOGENESIS +BIOGENETIC +BIOGENETICALLY +BIOGENIC +BIOGENIES +BIOGENOUS +BIOGENS +BIOGENY +BIOGEOCHEMICAL +BIOGEOCHEMICALS +BIOGEOCHEMISTRY +BIOGEOGRAPHER +BIOGEOGRAPHERS +BIOGEOGRAPHIC +BIOGEOGRAPHICAL +BIOGEOGRAPHIES +BIOGEOGRAPHY +BIOGRAPHEE +BIOGRAPHEES +BIOGRAPHER +BIOGRAPHERS +BIOGRAPHIC +BIOGRAPHICAL +BIOGRAPHICALLY +BIOGRAPHIES +BIOGRAPHY +BIOGS +BIOHAZARD +BIOHAZARDS +BIOHERM +BIOHERMS +BIOLOGIC +BIOLOGICAL +BIOLOGICALLY +BIOLOGICALS +BIOLOGICS +BIOLOGIES +BIOLOGISM +BIOLOGISMS +BIOLOGIST +BIOLOGISTIC +BIOLOGISTS +BIOLOGY +BIOLUMINESCENCE +BIOLUMINESCENT +BIOLYSES +BIOLYSIS +BIOLYTIC +BIOMARKER +BIOMARKERS +BIOMASS +BIOMASSES +BIOMATERIAL +BIOMATERIALS +BIOMATHEMATICAL +BIOMATHEMATICS +BIOME +BIOMECHANICAL +BIOMECHANICALLY +BIOMECHANICS +BIOMEDICAL +BIOMEDICINE +BIOMEDICINES +BIOMES +BIOMETEOROLOGY +BIOMETER +BIOMETERS +BIOMETRIC +BIOMETRICAL +BIOMETRICIAN +BIOMETRICIANS +BIOMETRICS +BIOMETRIES +BIOMETRY +BIOMIMETIC +BIOMIMETICS +BIOMOLECULAR +BIOMOLECULE +BIOMOLECULES +BIOMORPH +BIOMORPHIC +BIOMORPHS +BIONIC +BIONICS +BIONOMIC +BIONOMICS +BIONOMIES +BIONOMIST +BIONOMISTS +BIONOMY +BIONT +BIONTIC +BIONTS +BIOPHILIA +BIOPHILIAS +BIOPHYSICAL +BIOPHYSICIST +BIOPHYSICISTS +BIOPHYSICS +BIOPIC +BIOPICS +BIOPIRACIES +BIOPIRACY +BIOPIRATE +BIOPIRATES +BIOPLASM +BIOPLASMS +BIOPOLYMER +BIOPOLYMERS +BIOPSIC +BIOPSIED +BIOPSIES +BIOPSY +BIOPSYING +BIOPTIC +BIOREACTOR +BIOREACTORS +BIOREGION +BIOREGIONAL +BIOREGIONALISM +BIOREGIONALISMS +BIOREGIONALIST +BIOREGIONALISTS +BIOREGIONS +BIOREMEDIATION +BIOREMEDIATIONS +BIORHYTHM +BIORHYTHMIC +BIORHYTHMS +BIOS +BIOSAFETIES +BIOSAFETY +BIOSCIENCE +BIOSCIENCES +BIOSCIENTIFIC +BIOSCIENTIST +BIOSCIENTISTS +BIOSCOPE +BIOSCOPES +BIOSCOPIES +BIOSCOPY +BIOSENSOR +BIOSENSORS +BIOSOCIAL +BIOSOCIALLY +BIOSOLID +BIOSOLIDS +BIOSPHERE +BIOSPHERES +BIOSPHERIC +BIOSTATISTICAL +BIOSTATISTICIAN +BIOSTATISTICS +BIOSTRATIGRAPHY +BIOSTROME +BIOSTROMES +BIOSYNTHESES +BIOSYNTHESIS +BIOSYNTHETIC +BIOSYSTEMATIC +BIOSYSTEMATICS +BIOSYSTEMATIST +BIOSYSTEMATISTS +BIOTA +BIOTAS +BIOTECH +BIOTECHNICAL +BIOTECHNOLOGIES +BIOTECHNOLOGIST +BIOTECHNOLOGY +BIOTECHS +BIOTELEMETRIC +BIOTELEMETRIES +BIOTELEMETRY +BIOTERROR +BIOTERRORS +BIOTIC +BIOTICAL +BIOTICS +BIOTIN +BIOTINS +BIOTITE +BIOTITES +BIOTITIC +BIOTOPE +BIOTOPES +BIOTOXIN +BIOTOXINS +BIOTRON +BIOTRONS +BIOTURBED +BIOTYPE +BIOTYPES +BIOTYPIC +BIOVULAR +BIOWEAPON +BIOWEAPONS +BIPACK +BIPACKS +BIPARENTAL +BIPARENTALLY +BIPAROUS +BIPARTED +BIPARTISAN +BIPARTISANISM +BIPARTISANISMS +BIPARTISANSHIP +BIPARTISANSHIPS +BIPARTITE +BIPARTITELY +BIPARTITION +BIPARTITIONS +BIPARTY +BIPED +BIPEDAL +BIPEDALISM +BIPEDALISMS +BIPEDALITIES +BIPEDALITY +BIPEDALLY +BIPEDS +BIPHASIC +BIPHENYL +BIPHENYLS +BIPINNATE +BIPINNATELY +BIPLANE +BIPLANES +BIPOD +BIPODS +BIPOLAR +BIPOLARITIES +BIPOLARITY +BIPOLARIZATION +BIPOLARIZATIONS +BIPOLARIZE +BIPOLARIZED +BIPOLARIZES +BIPOLARIZING +BIPROPELLANT +BIPROPELLANTS +BIPYRAMID +BIPYRAMIDAL +BIPYRAMIDS +BIQUADRATIC +BIQUADRATICS +BIRACIAL +BIRACIALISM +BIRACIALISMS +BIRADIAL +BIRADICAL +BIRADICALS +BIRAMOSE +BIRAMOUS +BIRCH +BIRCHED +BIRCHEN +BIRCHES +BIRCHING +BIRD +BIRDBATH +BIRDBATHS +BIRDBRAIN +BIRDBRAINED +BIRDBRAINS +BIRDCAGE +BIRDCAGES +BIRDCALL +BIRDCALLS +BIRDDOG +BIRDDOGGED +BIRDDOGGING +BIRDDOGS +BIRDED +BIRDER +BIRDERS +BIRDFARM +BIRDFARMS +BIRDFEED +BIRDFEEDS +BIRDHOUSE +BIRDHOUSES +BIRDIE +BIRDIED +BIRDIEING +BIRDIES +BIRDING +BIRDINGS +BIRDLIFE +BIRDLIKE +BIRDLIME +BIRDLIMED +BIRDLIMES +BIRDLIMING +BIRDMAN +BIRDMEN +BIRDS +BIRDSEED +BIRDSEEDS +BIRDSEYE +BIRDSEYES +BIRDSHOT +BIRDSONG +BIRDSONGS +BIRDWATCH +BIRDWATCHED +BIRDWATCHES +BIRDWATCHING +BIREFRINGENCE +BIREFRINGENCES +BIREFRINGENT +BIREME +BIREMES +BIRETTA +BIRETTAS +BIRIANI +BIRIANIS +BIRK +BIRKIE +BIRKIES +BIRKS +BIRL +BIRLE +BIRLED +BIRLER +BIRLERS +BIRLES +BIRLING +BIRLINGS +BIRLS +BIRO +BIROS +BIRR +BIRRED +BIRRETTA +BIRRETTAS +BIRRING +BIRROTCH +BIRRS +BIRSE +BIRSES +BIRTH +BIRTHDAY +BIRTHDAYS +BIRTHED +BIRTHING +BIRTHINGS +BIRTHMARK +BIRTHMARKS +BIRTHNAME +BIRTHNAMES +BIRTHPLACE +BIRTHPLACES +BIRTHRATE +BIRTHRATES +BIRTHRIGHT +BIRTHRIGHTS +BIRTHROOT +BIRTHROOTS +BIRTHS +BIRTHSTONE +BIRTHSTONES +BIRTHWORT +BIRTHWORTS +BIRYANI +BIRYANIS +BIS +BISCOTTI +BISCOTTO +BISCUIT +BISCUITS +BISCUITY +BISE +BISECT +BISECTED +BISECTING +BISECTION +BISECTIONAL +BISECTIONALLY +BISECTIONS +BISECTOR +BISECTORS +BISECTRICES +BISECTRIX +BISECTS +BISERIATE +BISERRATE +BISES +BISEXUAL +BISEXUALITIES +BISEXUALITY +BISEXUALLY +BISEXUALS +BISHOP +BISHOPED +BISHOPING +BISHOPRIC +BISHOPRICS +BISHOPS +BISK +BISKS +BISMUTH +BISMUTHAL +BISMUTHIC +BISMUTHS +BISNAGA +BISNAGAS +BISON +BISONS +BISONTINE +BISQUE +BISQUES +BISTATE +BISTER +BISTERED +BISTERS +BISTORT +BISTORTS +BISTOURIES +BISTOURY +BISTRE +BISTRED +BISTRES +BISTRO +BISTROIC +BISTROS +BISULCATE +BISULFATE +BISULFATES +BISULFIDE +BISULFIDES +BISULFITE +BISULFITES +BIT +BITABLE +BITARTRATE +BITARTRATES +BITCH +BITCHED +BITCHEN +BITCHERIES +BITCHERY +BITCHES +BITCHIER +BITCHIEST +BITCHILY +BITCHINESS +BITCHINESSES +BITCHING +BITCHY +BITE +BITEABLE +BITEPLATE +BITEPLATES +BITER +BITERS +BITES +BITEWING +BITEWINGS +BITING +BITINGLY +BITMAP +BITMAPPED +BITMAPS +BITS +BITSIER +BITSIEST +BITSTOCK +BITSTOCKS +BITSTREAM +BITSTREAMS +BITSY +BITT +BITTED +BITTEN +BITTER +BITTERBRUSH +BITTERBRUSHES +BITTERED +BITTERER +BITTEREST +BITTERING +BITTERISH +BITTERLY +BITTERN +BITTERNESS +BITTERNESSES +BITTERNS +BITTERNUT +BITTERNUTS +BITTERROOT +BITTERROOTS +BITTERS +BITTERSWEET +BITTERSWEETLY +BITTERSWEETNESS +BITTERSWEETS +BITTERWEED +BITTERWEEDS +BITTIER +BITTIEST +BITTINESS +BITTINESSES +BITTING +BITTINGS +BITTOCK +BITTOCKS +BITTS +BITTY +BITUMEN +BITUMENS +BITUMINIZATION +BITUMINIZATIONS +BITUMINIZE +BITUMINIZED +BITUMINIZES +BITUMINIZING +BITUMINOUS +BIUNIQUE +BIUNIQUENESS +BIUNIQUENESSES +BIVALENCE +BIVALENCES +BIVALENCIES +BIVALENCY +BIVALENT +BIVALENTS +BIVALVE +BIVALVED +BIVALVES +BIVARIATE +BIVINYL +BIVINYLS +BIVOUAC +BIVOUACKED +BIVOUACKING +BIVOUACKS +BIVOUACS +BIWEEKLIES +BIWEEKLY +BIYEARLY +BIZ +BIZARRE +BIZARRELY +BIZARRENESS +BIZARRENESSES +BIZARRERIE +BIZARRERIES +BIZARRES +BIZARRO +BIZARROS +BIZE +BIZES +BIZNAGA +BIZNAGAS +BIZONAL +BIZONE +BIZONES +BIZZES +BLAB +BLABBED +BLABBER +BLABBERED +BLABBERING +BLABBERMOUTH +BLABBERMOUTHS +BLABBERS +BLABBING +BLABBY +BLABS +BLACK +BLACKAMOOR +BLACKAMOORS +BLACKBALL +BLACKBALLED +BLACKBALLING +BLACKBALLS +BLACKBERRIES +BLACKBERRY +BLACKBIRD +BLACKBIRDED +BLACKBIRDER +BLACKBIRDERS +BLACKBIRDING +BLACKBIRDS +BLACKBOARD +BLACKBOARDS +BLACKBODIES +BLACKBODY +BLACKBOY +BLACKBOYS +BLACKBUCK +BLACKBUCKS +BLACKCAP +BLACKCAPS +BLACKCOCK +BLACKCOCKS +BLACKDAMP +BLACKDAMPS +BLACKED +BLACKEN +BLACKENED +BLACKENER +BLACKENERS +BLACKENING +BLACKENINGS +BLACKENS +BLACKER +BLACKEST +BLACKFACE +BLACKFACES +BLACKFIN +BLACKFINS +BLACKFISH +BLACKFISHES +BLACKFLIES +BLACKFLY +BLACKGUARD +BLACKGUARDED +BLACKGUARDING +BLACKGUARDISM +BLACKGUARDISMS +BLACKGUARDLY +BLACKGUARDS +BLACKGUM +BLACKGUMS +BLACKHANDER +BLACKHANDERS +BLACKHEAD +BLACKHEADS +BLACKHEART +BLACKHEARTS +BLACKING +BLACKINGS +BLACKISH +BLACKJACK +BLACKJACKED +BLACKJACKING +BLACKJACKS +BLACKLAND +BLACKLANDS +BLACKLEAD +BLACKLEADS +BLACKLEG +BLACKLEGS +BLACKLIST +BLACKLISTED +BLACKLISTER +BLACKLISTERS +BLACKLISTING +BLACKLISTS +BLACKLY +BLACKMAIL +BLACKMAILED +BLACKMAILER +BLACKMAILERS +BLACKMAILING +BLACKMAILS +BLACKNESS +BLACKNESSES +BLACKOUT +BLACKOUTS +BLACKPOLL +BLACKPOLLS +BLACKS +BLACKSMITH +BLACKSMITHING +BLACKSMITHINGS +BLACKSMITHS +BLACKSNAKE +BLACKSNAKES +BLACKTAIL +BLACKTAILS +BLACKTHORN +BLACKTHORNS +BLACKTOP +BLACKTOPPED +BLACKTOPPING +BLACKTOPS +BLACKWATER +BLACKWATERS +BLACKWOOD +BLACKWOODS +BLADDER +BLADDERLIKE +BLADDERNUT +BLADDERNUTS +BLADDERS +BLADDERWORT +BLADDERWORTS +BLADDERY +BLADE +BLADED +BLADELESS +BLADELIKE +BLADER +BLADERS +BLADES +BLADING +BLADINGS +BLAE +BLAEBERRIES +BLAEBERRY +BLAFF +BLAFFS +BLAGGING +BLAGGINGS +BLAH +BLAHS +BLAIN +BLAINS +BLAM +BLAMABLE +BLAMABLY +BLAME +BLAMEABLE +BLAMED +BLAMEFUL +BLAMEFULLY +BLAMELESS +BLAMELESSLY +BLAMELESSNESS +BLAMELESSNESSES +BLAMER +BLAMERS +BLAMES +BLAMEWORTHINESS +BLAMEWORTHY +BLAMING +BLAMS +BLANCH +BLANCHED +BLANCHER +BLANCHERS +BLANCHES +BLANCHING +BLANCMANGE +BLANCMANGES +BLAND +BLANDER +BLANDEST +BLANDISH +BLANDISHED +BLANDISHER +BLANDISHERS +BLANDISHES +BLANDISHING +BLANDISHMENT +BLANDISHMENTS +BLANDLY +BLANDNESS +BLANDNESSES +BLANK +BLANKED +BLANKER +BLANKEST +BLANKET +BLANKETED +BLANKETFLOWER +BLANKETFLOWERS +BLANKETING +BLANKETLIKE +BLANKETS +BLANKING +BLANKLY +BLANKNESS +BLANKNESSES +BLANKS +BLANQUETTE +BLANQUETTES +BLARE +BLARED +BLARES +BLARING +BLARNEY +BLARNEYED +BLARNEYING +BLARNEYS +BLASE +BLASPHEME +BLASPHEMED +BLASPHEMER +BLASPHEMERS +BLASPHEMES +BLASPHEMIES +BLASPHEMING +BLASPHEMOUS +BLASPHEMOUSLY +BLASPHEMOUSNESS +BLASPHEMY +BLAST +BLASTED +BLASTEMA +BLASTEMAL +BLASTEMAS +BLASTEMATA +BLASTEMATIC +BLASTEMIC +BLASTER +BLASTERS +BLASTIE +BLASTIER +BLASTIES +BLASTIEST +BLASTING +BLASTINGS +BLASTMENT +BLASTMENTS +BLASTOCOEL +BLASTOCOELE +BLASTOCOELES +BLASTOCOELIC +BLASTOCOELS +BLASTOCYST +BLASTOCYSTS +BLASTODERM +BLASTODERMS +BLASTODISC +BLASTODISCS +BLASTOFF +BLASTOFFS +BLASTOMA +BLASTOMAS +BLASTOMATA +BLASTOMERE +BLASTOMERES +BLASTOMYCOSES +BLASTOMYCOSIS +BLASTOPORE +BLASTOPORES +BLASTOPORIC +BLASTOSPORE +BLASTOSPORES +BLASTS +BLASTULA +BLASTULAE +BLASTULAR +BLASTULAS +BLASTULATION +BLASTULATIONS +BLASTY +BLAT +BLATANCIES +BLATANCY +BLATANT +BLATANTLY +BLATE +BLATHER +BLATHERED +BLATHERER +BLATHERERS +BLATHERING +BLATHERS +BLATHERSKITE +BLATHERSKITES +BLATS +BLATTED +BLATTER +BLATTERED +BLATTERING +BLATTERS +BLATTING +BLAUBOK +BLAUBOKS +BLAW +BLAWED +BLAWING +BLAWN +BLAWS +BLAXPLOITATION +BLAXPLOITATIONS +BLAZE +BLAZED +BLAZER +BLAZERED +BLAZERS +BLAZES +BLAZING +BLAZINGLY +BLAZON +BLAZONED +BLAZONER +BLAZONERS +BLAZONING +BLAZONINGS +BLAZONRIES +BLAZONRY +BLAZONS +BLEACH +BLEACHABLE +BLEACHED +BLEACHER +BLEACHERITE +BLEACHERITES +BLEACHERS +BLEACHES +BLEACHING +BLEAK +BLEAKER +BLEAKEST +BLEAKISH +BLEAKLY +BLEAKNESS +BLEAKNESSES +BLEAKS +BLEAR +BLEARED +BLEAREYED +BLEARIER +BLEARIEST +BLEARILY +BLEARINESS +BLEARINESSES +BLEARING +BLEARS +BLEARY +BLEAT +BLEATED +BLEATER +BLEATERS +BLEATING +BLEATS +BLEB +BLEBBING +BLEBBINGS +BLEBBY +BLEBS +BLED +BLEED +BLEEDER +BLEEDERS +BLEEDING +BLEEDINGS +BLEEDS +BLEEP +BLEEPED +BLEEPER +BLEEPERS +BLEEPING +BLEEPS +BLELLUM +BLELLUMS +BLEMISH +BLEMISHED +BLEMISHER +BLEMISHERS +BLEMISHES +BLEMISHING +BLENCH +BLENCHED +BLENCHER +BLENCHERS +BLENCHES +BLENCHING +BLEND +BLENDE +BLENDED +BLENDER +BLENDERS +BLENDES +BLENDING +BLENDS +BLENNIES +BLENNIOID +BLENNY +BLENT +BLEPHAROPLAST +BLEPHAROPLASTS +BLEPHAROPLASTY +BLEPHAROSPASM +BLEPHAROSPASMS +BLESBOK +BLESBOKS +BLESBUCK +BLESBUCKS +BLESS +BLESSED +BLESSEDER +BLESSEDEST +BLESSEDLY +BLESSEDNESS +BLESSEDNESSES +BLESSER +BLESSERS +BLESSES +BLESSING +BLESSINGS +BLEST +BLET +BLETHER +BLETHERED +BLETHERING +BLETHERS +BLETS +BLEW +BLIGHT +BLIGHTED +BLIGHTER +BLIGHTERS +BLIGHTIES +BLIGHTING +BLIGHTS +BLIGHTY +BLIMEY +BLIMP +BLIMPISH +BLIMPISHLY +BLIMPISHNESS +BLIMPISHNESSES +BLIMPS +BLIMY +BLIN +BLIND +BLINDAGE +BLINDAGES +BLINDED +BLINDER +BLINDERS +BLINDEST +BLINDFISH +BLINDFISHES +BLINDFOLD +BLINDFOLDED +BLINDFOLDING +BLINDFOLDS +BLINDGUT +BLINDGUTS +BLINDING +BLINDINGLY +BLINDLY +BLINDNESS +BLINDNESSES +BLINDS +BLINDSIDE +BLINDSIDED +BLINDSIDES +BLINDSIDING +BLINDWORM +BLINDWORMS +BLINI +BLINIS +BLINK +BLINKARD +BLINKARDS +BLINKED +BLINKER +BLINKERED +BLINKERING +BLINKERS +BLINKING +BLINKS +BLINTZ +BLINTZE +BLINTZES +BLIP +BLIPPED +BLIPPING +BLIPS +BLISS +BLISSED +BLISSES +BLISSFUL +BLISSFULLY +BLISSFULNESS +BLISSFULNESSES +BLISSING +BLISSLESS +BLISTER +BLISTERED +BLISTERING +BLISTERINGLY +BLISTERS +BLISTERY +BLITE +BLITES +BLITHE +BLITHEFUL +BLITHELY +BLITHER +BLITHERED +BLITHERING +BLITHERS +BLITHESOME +BLITHESOMELY +BLITHEST +BLITZ +BLITZED +BLITZER +BLITZERS +BLITZES +BLITZING +BLITZKRIEG +BLITZKRIEGS +BLIZZARD +BLIZZARDLY +BLIZZARDS +BLIZZARDY +BLOAT +BLOATED +BLOATER +BLOATERS +BLOATING +BLOATS +BLOATWARE +BLOATWARES +BLOB +BLOBBED +BLOBBING +BLOBS +BLOC +BLOCK +BLOCKABLE +BLOCKADE +BLOCKADED +BLOCKADER +BLOCKADERS +BLOCKADES +BLOCKADING +BLOCKAGE +BLOCKAGES +BLOCKBUST +BLOCKBUSTED +BLOCKBUSTER +BLOCKBUSTERS +BLOCKBUSTING +BLOCKBUSTINGS +BLOCKBUSTS +BLOCKED +BLOCKER +BLOCKERS +BLOCKHEAD +BLOCKHEADS +BLOCKHOUSE +BLOCKHOUSES +BLOCKIER +BLOCKIEST +BLOCKING +BLOCKISH +BLOCKS +BLOCKY +BLOCS +BLOG +BLOGGER +BLOGGERS +BLOGGING +BLOGGINGS +BLOGS +BLOKE +BLOKES +BLOND +BLONDE +BLONDER +BLONDES +BLONDEST +BLONDINE +BLONDINED +BLONDINES +BLONDINING +BLONDISH +BLONDNESS +BLONDNESSES +BLONDS +BLOOD +BLOODBATH +BLOODBATHS +BLOODCURDLING +BLOODED +BLOODFIN +BLOODFINS +BLOODGUILT +BLOODGUILTINESS +BLOODGUILTS +BLOODGUILTY +BLOODHOUND +BLOODHOUNDS +BLOODIED +BLOODIER +BLOODIES +BLOODIEST +BLOODILY +BLOODINESS +BLOODINESSES +BLOODING +BLOODINGS +BLOODLESS +BLOODLESSLY +BLOODLESSNESS +BLOODLESSNESSES +BLOODLETTING +BLOODLETTINGS +BLOODLIKE +BLOODLINE +BLOODLINES +BLOODLUST +BLOODLUSTS +BLOODMOBILE +BLOODMOBILES +BLOODRED +BLOODROOT +BLOODROOTS +BLOODS +BLOODSHED +BLOODSHEDS +BLOODSHOT +BLOODSTAIN +BLOODSTAINED +BLOODSTAINS +BLOODSTOCK +BLOODSTOCKS +BLOODSTONE +BLOODSTONES +BLOODSTREAM +BLOODSTREAMS +BLOODSUCKER +BLOODSUCKERS +BLOODSUCKING +BLOODTHIRSTILY +BLOODTHIRSTY +BLOODWORM +BLOODWORMS +BLOODWORT +BLOODWORTS +BLOODY +BLOODYING +BLOOEY +BLOOIE +BLOOM +BLOOMED +BLOOMER +BLOOMERIES +BLOOMERS +BLOOMERY +BLOOMIER +BLOOMIEST +BLOOMING +BLOOMLESS +BLOOMS +BLOOMY +BLOOP +BLOOPED +BLOOPER +BLOOPERS +BLOOPING +BLOOPS +BLOSSOM +BLOSSOMED +BLOSSOMING +BLOSSOMS +BLOSSOMY +BLOT +BLOTCH +BLOTCHED +BLOTCHES +BLOTCHIER +BLOTCHIEST +BLOTCHILY +BLOTCHING +BLOTCHY +BLOTLESS +BLOTS +BLOTTED +BLOTTER +BLOTTERS +BLOTTIER +BLOTTIEST +BLOTTING +BLOTTO +BLOTTY +BLOUSE +BLOUSED +BLOUSES +BLOUSIER +BLOUSIEST +BLOUSILY +BLOUSING +BLOUSON +BLOUSONS +BLOUSY +BLOVIATE +BLOVIATED +BLOVIATES +BLOVIATING +BLOVIATION +BLOVIATIONS +BLOW +BLOWBACK +BLOWBACKS +BLOWBALL +BLOWBALLS +BLOWBY +BLOWBYS +BLOWDOWN +BLOWDOWNS +BLOWED +BLOWER +BLOWERS +BLOWFISH +BLOWFISHES +BLOWFLIES +BLOWFLY +BLOWGUN +BLOWGUNS +BLOWHARD +BLOWHARDS +BLOWHOLE +BLOWHOLES +BLOWIER +BLOWIEST +BLOWINESS +BLOWINESSES +BLOWING +BLOWJOB +BLOWJOBS +BLOWN +BLOWOFF +BLOWOFFS +BLOWOUT +BLOWOUTS +BLOWPIPE +BLOWPIPES +BLOWS +BLOWSED +BLOWSIER +BLOWSIEST +BLOWSILY +BLOWSY +BLOWTORCH +BLOWTORCHED +BLOWTORCHES +BLOWTORCHING +BLOWTUBE +BLOWTUBES +BLOWUP +BLOWUPS +BLOWY +BLOWZED +BLOWZIER +BLOWZIEST +BLOWZILY +BLOWZY +BLUB +BLUBBED +BLUBBER +BLUBBERED +BLUBBERER +BLUBBERERS +BLUBBERING +BLUBBERS +BLUBBERY +BLUBBING +BLUBS +BLUCHER +BLUCHERS +BLUDGE +BLUDGED +BLUDGEON +BLUDGEONED +BLUDGEONING +BLUDGEONS +BLUDGER +BLUDGERS +BLUDGES +BLUDGING +BLUE +BLUEBALL +BLUEBALLS +BLUEBEARD +BLUEBEARDS +BLUEBEAT +BLUEBEATS +BLUEBELL +BLUEBELLS +BLUEBERRIES +BLUEBERRY +BLUEBILL +BLUEBILLS +BLUEBIRD +BLUEBIRDS +BLUEBLOOD +BLUEBLOODS +BLUEBONNET +BLUEBONNETS +BLUEBOOK +BLUEBOOKS +BLUEBOTTLE +BLUEBOTTLES +BLUECAP +BLUECAPS +BLUECOAT +BLUECOATS +BLUECURLS +BLUED +BLUEFIN +BLUEFINS +BLUEFISH +BLUEFISHES +BLUEGILL +BLUEGILLS +BLUEGRASS +BLUEGRASSES +BLUEGUM +BLUEGUMS +BLUEHEAD +BLUEHEADS +BLUEING +BLUEINGS +BLUEISH +BLUEJACK +BLUEJACKET +BLUEJACKETS +BLUEJACKS +BLUEJAY +BLUEJAYS +BLUEJEANS +BLUELINE +BLUELINER +BLUELINERS +BLUELINES +BLUELY +BLUENESS +BLUENESSES +BLUENOSE +BLUENOSED +BLUENOSES +BLUEPOINT +BLUEPOINTS +BLUEPRINT +BLUEPRINTED +BLUEPRINTING +BLUEPRINTS +BLUER +BLUES +BLUESHIFT +BLUESHIFTED +BLUESHIFTS +BLUESIER +BLUESIEST +BLUESMAN +BLUESMEN +BLUEST +BLUESTEM +BLUESTEMS +BLUESTOCKING +BLUESTOCKINGS +BLUESTONE +BLUESTONES +BLUESY +BLUET +BLUETICK +BLUETICKS +BLUETONGUE +BLUETONGUES +BLUETS +BLUEWEED +BLUEWEEDS +BLUEWOOD +BLUEWOODS +BLUEY +BLUEYS +BLUFF +BLUFFABLE +BLUFFED +BLUFFER +BLUFFERS +BLUFFEST +BLUFFING +BLUFFLY +BLUFFNESS +BLUFFNESSES +BLUFFS +BLUING +BLUINGS +BLUISH +BLUISHNESS +BLUISHNESSES +BLUME +BLUMED +BLUMES +BLUMING +BLUNDER +BLUNDERBUSS +BLUNDERBUSSES +BLUNDERED +BLUNDERER +BLUNDERERS +BLUNDERING +BLUNDERINGLY +BLUNDERS +BLUNGE +BLUNGED +BLUNGER +BLUNGERS +BLUNGES +BLUNGING +BLUNT +BLUNTED +BLUNTER +BLUNTEST +BLUNTING +BLUNTLY +BLUNTNESS +BLUNTNESSES +BLUNTS +BLUR +BLURB +BLURBED +BLURBING +BLURBIST +BLURBISTS +BLURBS +BLURRED +BLURREDLY +BLURRIER +BLURRIEST +BLURRILY +BLURRINESS +BLURRINESSES +BLURRING +BLURRINGLY +BLURRY +BLURS +BLURT +BLURTED +BLURTER +BLURTERS +BLURTING +BLURTS +BLUSH +BLUSHED +BLUSHER +BLUSHERS +BLUSHES +BLUSHFUL +BLUSHING +BLUSHINGLY +BLUSTER +BLUSTERED +BLUSTERER +BLUSTERERS +BLUSTERING +BLUSTERINGLY +BLUSTEROUS +BLUSTERS +BLUSTERY +BLYPE +BLYPES +BO +BOA +BOAR +BOARD +BOARDABLE +BOARDED +BOARDER +BOARDERS +BOARDING +BOARDINGHOUSE +BOARDINGHOUSES +BOARDINGS +BOARDLIKE +BOARDMAN +BOARDMEN +BOARDROOM +BOARDROOMS +BOARDS +BOARDSAILING +BOARDSAILINGS +BOARDSAILOR +BOARDSAILORS +BOARDWALK +BOARDWALKS +BOARFISH +BOARFISHES +BOARHOUND +BOARHOUNDS +BOARISH +BOARS +BOART +BOARTS +BOAS +BOAST +BOASTED +BOASTER +BOASTERS +BOASTFUL +BOASTFULLY +BOASTFULNESS +BOASTFULNESSES +BOASTING +BOASTS +BOAT +BOATABLE +BOATBILL +BOATBILLS +BOATBUILDER +BOATBUILDERS +BOATBUILDING +BOATBUILDINGS +BOATED +BOATEL +BOATELS +BOATER +BOATERS +BOATFUL +BOATFULS +BOATHOOK +BOATHOOKS +BOATHOUSE +BOATHOUSES +BOATING +BOATINGS +BOATLIFT +BOATLIFTED +BOATLIFTING +BOATLIFTS +BOATLIKE +BOATLOAD +BOATLOADS +BOATMAN +BOATMEN +BOATNECK +BOATNECKS +BOATS +BOATSMAN +BOATSMEN +BOATSWAIN +BOATSWAINS +BOATYARD +BOATYARDS +BOB +BOBBED +BOBBER +BOBBERIES +BOBBERS +BOBBERY +BOBBIES +BOBBIN +BOBBINET +BOBBINETS +BOBBING +BOBBINS +BOBBLE +BOBBLED +BOBBLES +BOBBLING +BOBBY +BOBBYSOX +BOBCAT +BOBCATS +BOBECHE +BOBECHES +BOBOLINK +BOBOLINKS +BOBS +BOBSLED +BOBSLEDDED +BOBSLEDDER +BOBSLEDDERS +BOBSLEDDING +BOBSLEDDINGS +BOBSLEDS +BOBSLEIGH +BOBSLEIGHS +BOBSTAY +BOBSTAYS +BOBTAIL +BOBTAILED +BOBTAILING +BOBTAILS +BOBWHITE +BOBWHITES +BOCACCIO +BOCACCIOS +BOCCE +BOCCES +BOCCI +BOCCIA +BOCCIAS +BOCCIE +BOCCIES +BOCCIS +BOCHE +BOCHES +BOCK +BOCKS +BOD +BODACIOUS +BODACIOUSLY +BODDHISATTVA +BODDHISATTVAS +BODE +BODED +BODEGA +BODEGAS +BODEMENT +BODEMENTS +BODES +BODHISATTVA +BODHISATTVAS +BODHRAN +BODHRANS +BODICE +BODICES +BODIED +BODIES +BODILESS +BODILY +BODING +BODINGLY +BODINGS +BODKIN +BODKINS +BODS +BODY +BODYBOARD +BODYBOARDED +BODYBOARDING +BODYBOARDS +BODYBUILDER +BODYBUILDERS +BODYBUILDING +BODYBUILDINGS +BODYCHECK +BODYCHECKED +BODYCHECKING +BODYCHECKS +BODYGUARD +BODYGUARDED +BODYGUARDING +BODYGUARDS +BODYING +BODYSUIT +BODYSUITS +BODYSURF +BODYSURFED +BODYSURFER +BODYSURFERS +BODYSURFING +BODYSURFS +BODYWORK +BODYWORKS +BOEHMITE +BOEHMITES +BOFF +BOFFED +BOFFIN +BOFFING +BOFFINS +BOFFO +BOFFOLA +BOFFOLAS +BOFFOS +BOFFS +BOG +BOGAN +BOGANS +BOGART +BOGARTED +BOGARTING +BOGARTS +BOGBEAN +BOGBEANS +BOGEY +BOGEYED +BOGEYING +BOGEYMAN +BOGEYMEN +BOGEYS +BOGGED +BOGGIER +BOGGIEST +BOGGINESS +BOGGINESSES +BOGGING +BOGGISH +BOGGLE +BOGGLED +BOGGLER +BOGGLERS +BOGGLES +BOGGLING +BOGGY +BOGIE +BOGIES +BOGLE +BOGLES +BOGS +BOGUS +BOGUSLY +BOGUSNESS +BOGUSNESSES +BOGWOOD +BOGWOODS +BOGY +BOGYISM +BOGYISMS +BOGYMAN +BOGYMEN +BOHEA +BOHEAS +BOHEMIA +BOHEMIAN +BOHEMIANISM +BOHEMIANISMS +BOHEMIANS +BOHEMIAS +BOHO +BOHOS +BOHRIUM +BOHRIUMS +BOHUNK +BOHUNKS +BOIL +BOILABLE +BOILED +BOILER +BOILERMAKER +BOILERMAKERS +BOILERPLATE +BOILERPLATES +BOILERS +BOILERSUIT +BOILERSUITS +BOILING +BOILINGLY +BOILOFF +BOILOFFS +BOILOVER +BOILOVERS +BOILS +BOING +BOINGS +BOINK +BOINKED +BOINKING +BOINKS +BOISERIE +BOISERIES +BOISTEROUS +BOISTEROUSLY +BOISTEROUSNESS +BOITE +BOITES +BOLA +BOLAR +BOLAS +BOLASES +BOLD +BOLDER +BOLDEST +BOLDFACE +BOLDFACED +BOLDFACES +BOLDFACING +BOLDLY +BOLDNESS +BOLDNESSES +BOLDS +BOLE +BOLECTION +BOLECTIONS +BOLERO +BOLEROS +BOLES +BOLETE +BOLETES +BOLETI +BOLETUS +BOLETUSES +BOLIDE +BOLIDES +BOLIVAR +BOLIVARES +BOLIVARS +BOLIVIA +BOLIVIANO +BOLIVIANOS +BOLIVIAS +BOLL +BOLLARD +BOLLARDS +BOLLED +BOLLING +BOLLIX +BOLLIXED +BOLLIXES +BOLLIXING +BOLLOCKS +BOLLOX +BOLLOXED +BOLLOXES +BOLLOXING +BOLLS +BOLLWORM +BOLLWORMS +BOLO +BOLOGNA +BOLOGNAS +BOLOGRAPH +BOLOGRAPHS +BOLOMETER +BOLOMETERS +BOLOMETRIC +BOLOMETRICALLY +BOLONEY +BOLONEYS +BOLOS +BOLSHEVIK +BOLSHEVIKI +BOLSHEVIKS +BOLSHEVISM +BOLSHEVISMS +BOLSHEVIZE +BOLSHEVIZED +BOLSHEVIZES +BOLSHEVIZING +BOLSHIE +BOLSHIES +BOLSHY +BOLSON +BOLSONS +BOLSTER +BOLSTERED +BOLSTERER +BOLSTERERS +BOLSTERING +BOLSTERS +BOLT +BOLTED +BOLTER +BOLTERS +BOLTHEAD +BOLTHEADS +BOLTHOLE +BOLTHOLES +BOLTING +BOLTLESS +BOLTLIKE +BOLTONIA +BOLTONIAS +BOLTROPE +BOLTROPES +BOLTS +BOLUS +BOLUSES +BOMB +BOMBABLE +BOMBARD +BOMBARDED +BOMBARDER +BOMBARDERS +BOMBARDIER +BOMBARDIERS +BOMBARDING +BOMBARDMENT +BOMBARDMENTS +BOMBARDON +BOMBARDONS +BOMBARDS +BOMBAST +BOMBASTER +BOMBASTERS +BOMBASTIC +BOMBASTICALLY +BOMBASTS +BOMBAX +BOMBAZINE +BOMBAZINES +BOMBE +BOMBED +BOMBER +BOMBERS +BOMBES +BOMBESIN +BOMBESINS +BOMBINATE +BOMBINATED +BOMBINATES +BOMBINATING +BOMBINATION +BOMBINATIONS +BOMBING +BOMBINGS +BOMBLET +BOMBLETS +BOMBLOAD +BOMBLOADS +BOMBPROOF +BOMBPROOFED +BOMBPROOFING +BOMBPROOFS +BOMBS +BOMBSHELL +BOMBSHELLS +BOMBSIGHT +BOMBSIGHTS +BOMBYCID +BOMBYCIDS +BOMBYCOID +BOMBYX +BOMBYXES +BONACI +BONACIS +BONANZA +BONANZAS +BONBON +BONBONS +BOND +BONDABLE +BONDAGE +BONDAGES +BONDED +BONDER +BONDERS +BONDHOLDER +BONDHOLDERS +BONDING +BONDINGS +BONDLESS +BONDMAID +BONDMAIDS +BONDMAN +BONDMEN +BONDS +BONDSMAN +BONDSMEN +BONDSTONE +BONDSTONES +BONDUC +BONDUCS +BONDWOMAN +BONDWOMEN +BONE +BONEBLACK +BONEBLACKS +BONED +BONEFISH +BONEFISHES +BONEFISHING +BONEFISHINGS +BONEHEAD +BONEHEADED +BONEHEADEDNESS +BONEHEADS +BONELESS +BONEMEAL +BONEMEALS +BONER +BONERS +BONES +BONESET +BONESETS +BONESETTER +BONESETTERS +BONEY +BONEYARD +BONEYARDS +BONEYER +BONEYEST +BONFIRE +BONFIRES +BONG +BONGED +BONGING +BONGO +BONGOES +BONGOIST +BONGOISTS +BONGOS +BONGS +BONHOMIE +BONHOMIES +BONHOMOUS +BONIATO +BONIATOS +BONIER +BONIEST +BONIFACE +BONIFACES +BONINESS +BONINESSES +BONING +BONITA +BONITAS +BONITO +BONITOES +BONITOS +BONK +BONKED +BONKERS +BONKING +BONKS +BONNE +BONNES +BONNET +BONNETED +BONNETING +BONNETS +BONNIE +BONNIER +BONNIEST +BONNILY +BONNINESS +BONNINESSES +BONNOCK +BONNOCKS +BONNY +BONNYCLABBER +BONNYCLABBERS +BONOBO +BONOBOS +BONSAI +BONSPELL +BONSPELLS +BONSPIEL +BONSPIELS +BONTEBOK +BONTEBOKS +BONUS +BONUSES +BONY +BONZE +BONZER +BONZES +BOO +BOOB +BOOBED +BOOBIE +BOOBIES +BOOBING +BOOBIRD +BOOBIRDS +BOOBISH +BOOBOISIE +BOOBOISIES +BOOBOO +BOOBOOS +BOOBS +BOOBY +BOOCOO +BOOCOOS +BOODIES +BOODLE +BOODLED +BOODLER +BOODLERS +BOODLES +BOODLING +BOODY +BOOED +BOOGER +BOOGERMAN +BOOGERMEN +BOOGERS +BOOGEY +BOOGEYED +BOOGEYING +BOOGEYMAN +BOOGEYMEN +BOOGEYS +BOOGIE +BOOGIED +BOOGIEING +BOOGIEMAN +BOOGIEMEN +BOOGIES +BOOGY +BOOGYING +BOOGYMAN +BOOGYMEN +BOOHOO +BOOHOOED +BOOHOOING +BOOHOOS +BOOING +BOOJUM +BOOJUMS +BOOK +BOOKABLE +BOOKBINDER +BOOKBINDERIES +BOOKBINDERS +BOOKBINDERY +BOOKBINDING +BOOKBINDINGS +BOOKCASE +BOOKCASES +BOOKED +BOOKEND +BOOKENDS +BOOKER +BOOKERS +BOOKFUL +BOOKFULS +BOOKIE +BOOKIES +BOOKING +BOOKINGS +BOOKISH +BOOKISHLY +BOOKISHNESS +BOOKISHNESSES +BOOKKEEPER +BOOKKEEPERS +BOOKKEEPING +BOOKKEEPINGS +BOOKLET +BOOKLETS +BOOKLICE +BOOKLORE +BOOKLORES +BOOKLOUSE +BOOKMAKER +BOOKMAKERS +BOOKMAKING +BOOKMAKINGS +BOOKMAN +BOOKMARK +BOOKMARKED +BOOKMARKER +BOOKMARKERS +BOOKMARKING +BOOKMARKS +BOOKMEN +BOOKMOBILE +BOOKMOBILES +BOOKOO +BOOKOOS +BOOKPLATE +BOOKPLATES +BOOKRACK +BOOKRACKS +BOOKREST +BOOKRESTS +BOOKS +BOOKSELLER +BOOKSELLERS +BOOKSELLING +BOOKSELLINGS +BOOKSHELF +BOOKSHELVES +BOOKSHOP +BOOKSHOPS +BOOKSTALL +BOOKSTALLS +BOOKSTAND +BOOKSTANDS +BOOKSTORE +BOOKSTORES +BOOKWORM +BOOKWORMS +BOOM +BOOMBOX +BOOMBOXES +BOOMED +BOOMER +BOOMERANG +BOOMERANGED +BOOMERANGING +BOOMERANGS +BOOMERS +BOOMIER +BOOMIEST +BOOMING +BOOMINGLY +BOOMKIN +BOOMKINS +BOOMLET +BOOMLETS +BOOMS +BOOMTOWN +BOOMTOWNS +BOOMY +BOON +BOONDOCK +BOONDOCKS +BOONDOGGLE +BOONDOGGLED +BOONDOGGLER +BOONDOGGLERS +BOONDOGGLES +BOONDOGGLING +BOONIES +BOONLESS +BOONS +BOOR +BOORISH +BOORISHLY +BOORISHNESS +BOORISHNESSES +BOORS +BOOS +BOOST +BOOSTED +BOOSTER +BOOSTERISM +BOOSTERISMS +BOOSTERS +BOOSTING +BOOSTS +BOOT +BOOTABLE +BOOTBLACK +BOOTBLACKS +BOOTED +BOOTEE +BOOTEES +BOOTERIES +BOOTERY +BOOTH +BOOTHS +BOOTIE +BOOTIES +BOOTING +BOOTJACK +BOOTJACKS +BOOTLACE +BOOTLACES +BOOTLEG +BOOTLEGGED +BOOTLEGGER +BOOTLEGGERS +BOOTLEGGING +BOOTLEGS +BOOTLESS +BOOTLESSLY +BOOTLESSNESS +BOOTLESSNESSES +BOOTLICK +BOOTLICKED +BOOTLICKER +BOOTLICKERS +BOOTLICKING +BOOTLICKS +BOOTS +BOOTSTRAP +BOOTSTRAPPED +BOOTSTRAPPING +BOOTSTRAPS +BOOTY +BOOZE +BOOZED +BOOZER +BOOZERS +BOOZES +BOOZIER +BOOZIEST +BOOZILY +BOOZINESS +BOOZINESSES +BOOZING +BOOZY +BOP +BOPEEP +BOPEEPS +BOPPED +BOPPER +BOPPERS +BOPPING +BOPS +BORA +BORACES +BORACIC +BORACITE +BORACITES +BORAGE +BORAGES +BORAL +BORALS +BORANE +BORANES +BORAS +BORATE +BORATED +BORATES +BORATING +BORAX +BORAXES +BORBORYGMI +BORBORYGMUS +BORDEAUX +BORDEL +BORDELLO +BORDELLOS +BORDELS +BORDER +BORDEREAU +BORDEREAUX +BORDERED +BORDERER +BORDERERS +BORDERING +BORDERLAND +BORDERLANDS +BORDERLINE +BORDERLINES +BORDERS +BORDURE +BORDURES +BORE +BOREAL +BOREAS +BOREASES +BORECOLE +BORECOLES +BORED +BOREDOM +BOREDOMS +BOREEN +BOREENS +BOREHOLE +BOREHOLES +BORER +BORERS +BORES +BORESCOPE +BORESCOPES +BORESOME +BORIC +BORIDE +BORIDES +BORING +BORINGLY +BORINGNESS +BORINGNESSES +BORINGS +BORK +BORKED +BORKING +BORKS +BORN +BORNE +BORNEOL +BORNEOLS +BORNITE +BORNITES +BORNITIC +BOROHYDRIDE +BOROHYDRIDES +BORON +BORONIC +BORONS +BOROSILICATE +BOROSILICATES +BOROUGH +BOROUGHS +BORRELIA +BORRELIAS +BORROW +BORROWED +BORROWER +BORROWERS +BORROWING +BORROWINGS +BORROWS +BORSCH +BORSCHES +BORSCHT +BORSCHTS +BORSHT +BORSHTS +BORSTAL +BORSTALS +BORT +BORTS +BORTY +BORTZ +BORTZES +BORZOI +BORZOIS +BOS +BOSCAGE +BOSCAGES +BOSCHBOK +BOSCHBOKS +BOSCHVARK +BOSCHVARKS +BOSH +BOSHBOK +BOSHBOKS +BOSHES +BOSHVARK +BOSHVARKS +BOSK +BOSKAGE +BOSKAGES +BOSKER +BOSKET +BOSKETS +BOSKIER +BOSKIEST +BOSKINESS +BOSKINESSES +BOSKS +BOSKY +BOSOM +BOSOMED +BOSOMING +BOSOMS +BOSOMY +BOSON +BOSONIC +BOSONS +BOSQUE +BOSQUES +BOSQUET +BOSQUETS +BOSS +BOSSDOM +BOSSDOMS +BOSSED +BOSSES +BOSSIER +BOSSIES +BOSSIEST +BOSSILY +BOSSINESS +BOSSINESSES +BOSSING +BOSSISM +BOSSISMS +BOSSY +BOSTON +BOSTONS +BOSUN +BOSUNS +BOT +BOTA +BOTANIC +BOTANICA +BOTANICAL +BOTANICALLY +BOTANICALS +BOTANICAS +BOTANIES +BOTANISE +BOTANISED +BOTANISES +BOTANISING +BOTANIST +BOTANISTS +BOTANIZE +BOTANIZED +BOTANIZER +BOTANIZERS +BOTANIZES +BOTANIZING +BOTANY +BOTAS +BOTCH +BOTCHED +BOTCHEDLY +BOTCHER +BOTCHERIES +BOTCHERS +BOTCHERY +BOTCHES +BOTCHIER +BOTCHIEST +BOTCHILY +BOTCHING +BOTCHY +BOTEL +BOTELS +BOTFLIES +BOTFLY +BOTH +BOTHER +BOTHERATION +BOTHERATIONS +BOTHERED +BOTHERING +BOTHERS +BOTHERSOME +BOTHIES +BOTHRIA +BOTHRIUM +BOTHRIUMS +BOTHY +BOTONEE +BOTONNEE +BOTRYOID +BOTRYOIDAL +BOTRYOSE +BOTRYTIS +BOTRYTISES +BOTS +BOTT +BOTTLE +BOTTLEBRUSH +BOTTLEBRUSHES +BOTTLED +BOTTLEFUL +BOTTLEFULS +BOTTLENECK +BOTTLENECKED +BOTTLENECKING +BOTTLENECKS +BOTTLER +BOTTLERS +BOTTLES +BOTTLING +BOTTLINGS +BOTTOM +BOTTOMED +BOTTOMER +BOTTOMERS +BOTTOMING +BOTTOMLAND +BOTTOMLANDS +BOTTOMLESS +BOTTOMLESSLY +BOTTOMLESSNESS +BOTTOMMOST +BOTTOMRIES +BOTTOMRY +BOTTOMS +BOTTS +BOTULIN +BOTULINAL +BOTULINS +BOTULINUM +BOTULINUMS +BOTULINUS +BOTULINUSES +BOTULISM +BOTULISMS +BOUBOU +BOUBOUS +BOUCHEE +BOUCHEES +BOUCLE +BOUCLES +BOUDIN +BOUDINS +BOUDOIR +BOUDOIRS +BOUFFANT +BOUFFANTS +BOUFFE +BOUFFES +BOUGAINVILLAEA +BOUGAINVILLAEAS +BOUGAINVILLEA +BOUGAINVILLEAS +BOUGH +BOUGHED +BOUGHLESS +BOUGHPOT +BOUGHPOTS +BOUGHS +BOUGHT +BOUGHTEN +BOUGIE +BOUGIES +BOUILLABAISSE +BOUILLABAISSES +BOUILLON +BOUILLONS +BOULDER +BOULDERED +BOULDERER +BOULDERERS +BOULDERING +BOULDERS +BOULDERY +BOULE +BOULES +BOULEVARD +BOULEVARDIER +BOULEVARDIERS +BOULEVARDS +BOULEVERSEMENT +BOULEVERSEMENTS +BOULLE +BOULLES +BOUNCE +BOUNCED +BOUNCER +BOUNCERS +BOUNCES +BOUNCIER +BOUNCIEST +BOUNCILY +BOUNCING +BOUNCINGLY +BOUNCY +BOUND +BOUNDABLE +BOUNDARIES +BOUNDARY +BOUNDED +BOUNDEDNESS +BOUNDEDNESSES +BOUNDEN +BOUNDER +BOUNDERISH +BOUNDERS +BOUNDING +BOUNDLESS +BOUNDLESSLY +BOUNDLESSNESS +BOUNDLESSNESSES +BOUNDNESS +BOUNDNESSES +BOUNDS +BOUNTEOUS +BOUNTEOUSLY +BOUNTEOUSNESS +BOUNTEOUSNESSES +BOUNTIED +BOUNTIES +BOUNTIFUL +BOUNTIFULLY +BOUNTIFULNESS +BOUNTIFULNESSES +BOUNTY +BOUQUET +BOUQUETS +BOURBON +BOURBONISM +BOURBONISMS +BOURBONS +BOURDON +BOURDONS +BOURG +BOURGEOIS +BOURGEOISE +BOURGEOISES +BOURGEOISIE +BOURGEOISIES +BOURGEOISIFIED +BOURGEOISIFIES +BOURGEOISIFY +BOURGEOISIFYING +BOURGEON +BOURGEONED +BOURGEONING +BOURGEONS +BOURGS +BOURGUIGNON +BOURGUIGNONNE +BOURN +BOURNE +BOURNES +BOURNS +BOURREE +BOURREES +BOURRIDE +BOURRIDES +BOURSE +BOURSES +BOURSIN +BOURSINS +BOURTREE +BOURTREES +BOUSE +BOUSED +BOUSES +BOUSING +BOUSOUKI +BOUSOUKIA +BOUSOUKIS +BOUSTROPHEDON +BOUSTROPHEDONIC +BOUSTROPHEDONS +BOUSY +BOUT +BOUTIQUE +BOUTIQUES +BOUTIQUEY +BOUTON +BOUTONNIERE +BOUTONNIERES +BOUTONS +BOUTS +BOUVARDIA +BOUVARDIAS +BOUVIER +BOUVIERS +BOUZOUKI +BOUZOUKIA +BOUZOUKIS +BOVID +BOVIDS +BOVINE +BOVINELY +BOVINES +BOVINITIES +BOVINITY +BOW +BOWDLERISE +BOWDLERISED +BOWDLERISES +BOWDLERISING +BOWDLERIZATION +BOWDLERIZATIONS +BOWDLERIZE +BOWDLERIZED +BOWDLERIZER +BOWDLERIZERS +BOWDLERIZES +BOWDLERIZING +BOWED +BOWEL +BOWELED +BOWELING +BOWELLED +BOWELLESS +BOWELLING +BOWELS +BOWER +BOWERBIRD +BOWERBIRDS +BOWERED +BOWERIES +BOWERING +BOWERS +BOWERY +BOWFIN +BOWFINS +BOWFRONT +BOWHEAD +BOWHEADS +BOWHUNTER +BOWHUNTERS +BOWING +BOWINGLY +BOWINGS +BOWKNOT +BOWKNOTS +BOWL +BOWLDER +BOWLDERS +BOWLED +BOWLEG +BOWLEGGED +BOWLEGS +BOWLER +BOWLERS +BOWLESS +BOWLFUL +BOWLFULS +BOWLIKE +BOWLINE +BOWLINES +BOWLING +BOWLINGS +BOWLLIKE +BOWLS +BOWMAN +BOWMEN +BOWPOT +BOWPOTS +BOWS +BOWSE +BOWSED +BOWSES +BOWSHOT +BOWSHOTS +BOWSING +BOWSPRIT +BOWSPRITS +BOWSTRING +BOWSTRINGED +BOWSTRINGING +BOWSTRINGS +BOWSTRUNG +BOWWOW +BOWWOWED +BOWWOWING +BOWWOWS +BOWYER +BOWYERS +BOX +BOXBALL +BOXBALLS +BOXBERRIES +BOXBERRY +BOXBOARD +BOXBOARDS +BOXCAR +BOXCARS +BOXED +BOXER +BOXERS +BOXES +BOXFISH +BOXFISHES +BOXFUL +BOXFULS +BOXHAUL +BOXHAULED +BOXHAULING +BOXHAULS +BOXIER +BOXIEST +BOXILY +BOXINESS +BOXINESSES +BOXING +BOXINGS +BOXLIKE +BOXTHORN +BOXTHORNS +BOXWOOD +BOXWOODS +BOXY +BOY +BOYAR +BOYARD +BOYARDS +BOYARISM +BOYARISMS +BOYARS +BOYCHICK +BOYCHICKS +BOYCHIK +BOYCHIKS +BOYCOTT +BOYCOTTED +BOYCOTTER +BOYCOTTERS +BOYCOTTING +BOYCOTTS +BOYFRIEND +BOYFRIENDS +BOYHOOD +BOYHOODS +BOYISH +BOYISHLY +BOYISHNESS +BOYISHNESSES +BOYLA +BOYLAS +BOYO +BOYOS +BOYS +BOYSENBERRIES +BOYSENBERRY +BOZO +BOZOS +BRA +BRABBLE +BRABBLED +BRABBLER +BRABBLERS +BRABBLES +BRABBLING +BRACE +BRACED +BRACELET +BRACELETS +BRACER +BRACERO +BRACEROS +BRACERS +BRACES +BRACH +BRACHES +BRACHET +BRACHETS +BRACHIA +BRACHIAL +BRACHIALS +BRACHIATE +BRACHIATED +BRACHIATES +BRACHIATING +BRACHIATION +BRACHIATIONS +BRACHIATOR +BRACHIATORS +BRACHIOPOD +BRACHIOPODS +BRACHIUM +BRACHS +BRACHYCEPHALIC +BRACHYCEPHALIES +BRACHYCEPHALY +BRACHYPTEROUS +BRACING +BRACINGLY +BRACINGS +BRACIOLA +BRACIOLAS +BRACIOLE +BRACIOLES +BRACKEN +BRACKENS +BRACKET +BRACKETED +BRACKETING +BRACKETS +BRACKISH +BRACKISHNESS +BRACKISHNESSES +BRACONID +BRACONIDS +BRACT +BRACTEAL +BRACTEATE +BRACTED +BRACTEOLE +BRACTEOLES +BRACTLESS +BRACTLET +BRACTLETS +BRACTS +BRAD +BRADAWL +BRADAWLS +BRADDED +BRADDING +BRADOON +BRADOONS +BRADS +BRADYCARDIA +BRADYCARDIAS +BRADYKININ +BRADYKININS +BRAE +BRAES +BRAG +BRAGGADOCIO +BRAGGADOCIOS +BRAGGART +BRAGGARTS +BRAGGED +BRAGGER +BRAGGERS +BRAGGEST +BRAGGIER +BRAGGIEST +BRAGGING +BRAGGY +BRAGS +BRAHMA +BRAHMAS +BRAID +BRAIDED +BRAIDER +BRAIDERS +BRAIDING +BRAIDINGS +BRAIDS +BRAIL +BRAILED +BRAILING +BRAILLE +BRAILLED +BRAILLER +BRAILLERS +BRAILLES +BRAILLEWRITER +BRAILLEWRITERS +BRAILLING +BRAILLIST +BRAILLISTS +BRAILS +BRAIN +BRAINCASE +BRAINCASES +BRAINCHILD +BRAINCHILDREN +BRAINED +BRAINIAC +BRAINIACS +BRAINIER +BRAINIEST +BRAINILY +BRAININESS +BRAININESSES +BRAINING +BRAINISH +BRAINLESS +BRAINLESSLY +BRAINLESSNESS +BRAINLESSNESSES +BRAINPAN +BRAINPANS +BRAINPOWER +BRAINPOWERS +BRAINS +BRAINSICK +BRAINSICKLY +BRAINSTEM +BRAINSTEMS +BRAINSTORM +BRAINSTORMED +BRAINSTORMER +BRAINSTORMERS +BRAINSTORMING +BRAINSTORMINGS +BRAINSTORMS +BRAINTEASER +BRAINTEASERS +BRAINWASH +BRAINWASHED +BRAINWASHER +BRAINWASHERS +BRAINWASHES +BRAINWASHING +BRAINWASHINGS +BRAINY +BRAISE +BRAISED +BRAISES +BRAISING +BRAIZE +BRAIZES +BRAKE +BRAKEAGE +BRAKEAGES +BRAKED +BRAKELESS +BRAKEMAN +BRAKEMEN +BRAKES +BRAKIER +BRAKIEST +BRAKING +BRAKY +BRALESS +BRAMBLE +BRAMBLED +BRAMBLES +BRAMBLIER +BRAMBLIEST +BRAMBLING +BRAMBLINGS +BRAMBLY +BRAN +BRANCH +BRANCHED +BRANCHES +BRANCHIA +BRANCHIAE +BRANCHIAL +BRANCHIER +BRANCHIEST +BRANCHING +BRANCHIOPOD +BRANCHIOPODS +BRANCHLESS +BRANCHLET +BRANCHLETS +BRANCHLINE +BRANCHLINES +BRANCHY +BRAND +BRANDED +BRANDER +BRANDERS +BRANDIED +BRANDIES +BRANDING +BRANDINGS +BRANDISH +BRANDISHED +BRANDISHES +BRANDISHING +BRANDLESS +BRANDLING +BRANDLINGS +BRANDS +BRANDY +BRANDYING +BRANK +BRANKS +BRANNED +BRANNER +BRANNERS +BRANNIER +BRANNIEST +BRANNIGAN +BRANNIGANS +BRANNING +BRANNY +BRANS +BRANT +BRANTAIL +BRANTAILS +BRANTS +BRAS +BRASH +BRASHER +BRASHES +BRASHEST +BRASHIER +BRASHIEST +BRASHLY +BRASHNESS +BRASHNESSES +BRASHY +BRASIER +BRASIERS +BRASIL +BRASILEIN +BRASILEINS +BRASILIN +BRASILINS +BRASILS +BRASS +BRASSAGE +BRASSAGES +BRASSARD +BRASSARDS +BRASSART +BRASSARTS +BRASSBOUND +BRASSED +BRASSERIE +BRASSERIES +BRASSES +BRASSICA +BRASSICAS +BRASSIE +BRASSIER +BRASSIERE +BRASSIERES +BRASSIES +BRASSIEST +BRASSILY +BRASSINESS +BRASSINESSES +BRASSING +BRASSISH +BRASSWARE +BRASSWARES +BRASSY +BRAT +BRATS +BRATTICE +BRATTICED +BRATTICES +BRATTICING +BRATTIER +BRATTIEST +BRATTINESS +BRATTINESSES +BRATTISH +BRATTLE +BRATTLED +BRATTLES +BRATTLING +BRATTY +BRATWURST +BRATWURSTS +BRAUNITE +BRAUNITES +BRAUNSCHWEIGER +BRAUNSCHWEIGERS +BRAVA +BRAVADO +BRAVADOES +BRAVADOS +BRAVAS +BRAVE +BRAVED +BRAVELY +BRAVENESS +BRAVENESSES +BRAVER +BRAVERIES +BRAVERS +BRAVERY +BRAVES +BRAVEST +BRAVI +BRAVING +BRAVO +BRAVOED +BRAVOES +BRAVOING +BRAVOS +BRAVURA +BRAVURAS +BRAVURE +BRAW +BRAWER +BRAWEST +BRAWL +BRAWLED +BRAWLER +BRAWLERS +BRAWLIE +BRAWLIER +BRAWLIEST +BRAWLING +BRAWLS +BRAWLY +BRAWN +BRAWNIER +BRAWNIEST +BRAWNILY +BRAWNINESS +BRAWNINESSES +BRAWNS +BRAWNY +BRAWS +BRAXIES +BRAXY +BRAY +BRAYED +BRAYER +BRAYERS +BRAYING +BRAYS +BRAZA +BRAZAS +BRAZE +BRAZED +BRAZEN +BRAZENED +BRAZENING +BRAZENLY +BRAZENNESS +BRAZENNESSES +BRAZENS +BRAZER +BRAZERS +BRAZES +BRAZIER +BRAZIERS +BRAZIL +BRAZILEIN +BRAZILEINS +BRAZILIN +BRAZILINS +BRAZILS +BRAZILWOOD +BRAZILWOODS +BRAZING +BREACH +BREACHED +BREACHER +BREACHERS +BREACHES +BREACHING +BREAD +BREADBASKET +BREADBASKETS +BREADBOARD +BREADBOARDED +BREADBOARDING +BREADBOARDS +BREADBOX +BREADBOXES +BREADED +BREADFRUIT +BREADFRUITS +BREADING +BREADLESS +BREADLINE +BREADLINES +BREADNUT +BREADNUTS +BREADROOT +BREADROOTS +BREADS +BREADSTUFF +BREADSTUFFS +BREADTH +BREADTHS +BREADTHWISE +BREADWINNER +BREADWINNERS +BREADWINNING +BREADWINNINGS +BREADY +BREAK +BREAKABLE +BREAKABLES +BREAKAGE +BREAKAGES +BREAKAWAY +BREAKAWAYS +BREAKDOWN +BREAKDOWNS +BREAKER +BREAKERS +BREAKEVEN +BREAKEVENS +BREAKFAST +BREAKFASTED +BREAKFASTER +BREAKFASTERS +BREAKFASTING +BREAKFASTS +BREAKFRONT +BREAKFRONTS +BREAKING +BREAKINGS +BREAKNECK +BREAKOUT +BREAKOUTS +BREAKS +BREAKTHROUGH +BREAKTHROUGHS +BREAKUP +BREAKUPS +BREAKWALL +BREAKWALLS +BREAKWATER +BREAKWATERS +BREAM +BREAMED +BREAMING +BREAMS +BREAST +BREASTBONE +BREASTBONES +BREASTED +BREASTFED +BREASTFEED +BREASTFEEDING +BREASTFEEDS +BREASTING +BREASTPIN +BREASTPINS +BREASTPLATE +BREASTPLATES +BREASTS +BREASTSTROKE +BREASTSTROKER +BREASTSTROKERS +BREASTSTROKES +BREASTWORK +BREASTWORKS +BREATH +BREATHABILITIES +BREATHABILITY +BREATHABLE +BREATHE +BREATHED +BREATHER +BREATHERS +BREATHES +BREATHIER +BREATHIEST +BREATHILY +BREATHINESS +BREATHINESSES +BREATHING +BREATHINGS +BREATHLESS +BREATHLESSLY +BREATHLESSNESS +BREATHS +BREATHTAKING +BREATHTAKINGLY +BREATHY +BRECCIA +BRECCIAL +BRECCIAS +BRECCIATE +BRECCIATED +BRECCIATES +BRECCIATING +BRECCIATION +BRECCIATIONS +BRECHAM +BRECHAMS +BRECHAN +BRECHANS +BRED +BREDE +BREDES +BREE +BREECH +BREECHBLOCK +BREECHBLOCKS +BREECHCLOTH +BREECHCLOTHS +BREECHCLOUT +BREECHCLOUTS +BREECHED +BREECHES +BREECHING +BREECHINGS +BREECHLOADER +BREECHLOADERS +BREED +BREEDER +BREEDERS +BREEDING +BREEDINGS +BREEDS +BREEKS +BREES +BREEZE +BREEZED +BREEZELESS +BREEZES +BREEZEWAY +BREEZEWAYS +BREEZIER +BREEZIEST +BREEZILY +BREEZINESS +BREEZINESSES +BREEZING +BREEZY +BREGMA +BREGMATA +BREGMATE +BREGMATIC +BREMSSTRAHLUNG +BREMSSTRAHLUNGS +BREN +BRENS +BRENT +BRENTS +BRETHREN +BREVE +BREVES +BREVET +BREVETCIES +BREVETCY +BREVETED +BREVETING +BREVETS +BREVETTED +BREVETTING +BREVIARIES +BREVIARY +BREVIER +BREVIERS +BREVITIES +BREVITY +BREW +BREWAGE +BREWAGES +BREWED +BREWER +BREWERIES +BREWERS +BREWERY +BREWING +BREWINGS +BREWIS +BREWISES +BREWPUB +BREWPUBS +BREWS +BREWSKI +BREWSKIES +BREWSKIS +BRIAR +BRIARD +BRIARDS +BRIARROOT +BRIARROOTS +BRIARS +BRIARWOOD +BRIARWOODS +BRIARY +BRIBABLE +BRIBE +BRIBED +BRIBEE +BRIBEES +BRIBER +BRIBERIES +BRIBERS +BRIBERY +BRIBES +BRIBING +BRICK +BRICKBAT +BRICKBATS +BRICKED +BRICKFIELD +BRICKFIELDS +BRICKIER +BRICKIEST +BRICKING +BRICKKILN +BRICKKILNS +BRICKLAYER +BRICKLAYERS +BRICKLAYING +BRICKLAYINGS +BRICKLE +BRICKLES +BRICKLIKE +BRICKS +BRICKWORK +BRICKWORKS +BRICKY +BRICKYARD +BRICKYARDS +BRICOLAGE +BRICOLAGES +BRICOLE +BRICOLES +BRIDAL +BRIDALLY +BRIDALS +BRIDE +BRIDEGROOM +BRIDEGROOMS +BRIDES +BRIDESMAID +BRIDESMAIDS +BRIDEWELL +BRIDEWELLS +BRIDGE +BRIDGEABLE +BRIDGED +BRIDGEHEAD +BRIDGEHEADS +BRIDGELESS +BRIDGES +BRIDGEWORK +BRIDGEWORKS +BRIDGING +BRIDGINGS +BRIDLE +BRIDLED +BRIDLER +BRIDLERS +BRIDLES +BRIDLING +BRIDOON +BRIDOONS +BRIE +BRIEF +BRIEFCASE +BRIEFCASES +BRIEFED +BRIEFER +BRIEFERS +BRIEFEST +BRIEFING +BRIEFINGS +BRIEFLESS +BRIEFLY +BRIEFNESS +BRIEFNESSES +BRIEFS +BRIER +BRIERROOT +BRIERROOTS +BRIERS +BRIERWOOD +BRIERWOODS +BRIERY +BRIES +BRIG +BRIGADE +BRIGADED +BRIGADES +BRIGADIER +BRIGADIERS +BRIGADING +BRIGAND +BRIGANDAGE +BRIGANDAGES +BRIGANDINE +BRIGANDINES +BRIGANDS +BRIGANTINE +BRIGANTINES +BRIGHT +BRIGHTEN +BRIGHTENED +BRIGHTENER +BRIGHTENERS +BRIGHTENING +BRIGHTENS +BRIGHTER +BRIGHTEST +BRIGHTISH +BRIGHTLY +BRIGHTNESS +BRIGHTNESSES +BRIGHTS +BRIGHTWORK +BRIGHTWORKS +BRIGS +BRILL +BRILLIANCE +BRILLIANCES +BRILLIANCIES +BRILLIANCY +BRILLIANT +BRILLIANTINE +BRILLIANTINES +BRILLIANTLY +BRILLIANTS +BRILLO +BRILLOS +BRILLS +BRIM +BRIMFUL +BRIMFULL +BRIMFULLY +BRIMLESS +BRIMMED +BRIMMER +BRIMMERS +BRIMMING +BRIMS +BRIMSTONE +BRIMSTONES +BRIMSTONY +BRIN +BRINDED +BRINDLE +BRINDLED +BRINDLES +BRINE +BRINED +BRINELESS +BRINER +BRINERS +BRINES +BRING +BRINGDOWN +BRINGDOWNS +BRINGER +BRINGERS +BRINGING +BRINGS +BRINIER +BRINIES +BRINIEST +BRININESS +BRININESSES +BRINING +BRINISH +BRINK +BRINKMANSHIP +BRINKMANSHIPS +BRINKS +BRINKSMANSHIP +BRINKSMANSHIPS +BRINS +BRINY +BRIO +BRIOCHE +BRIOCHES +BRIOLETTE +BRIOLETTES +BRIONIES +BRIONY +BRIOS +BRIQUET +BRIQUETS +BRIQUETTE +BRIQUETTED +BRIQUETTES +BRIQUETTING +BRIS +BRISANCE +BRISANCES +BRISANT +BRISES +BRISK +BRISKED +BRISKER +BRISKEST +BRISKET +BRISKETS +BRISKING +BRISKLY +BRISKNESS +BRISKNESSES +BRISKS +BRISLING +BRISLINGS +BRISS +BRISSES +BRISTLE +BRISTLED +BRISTLELIKE +BRISTLES +BRISTLETAIL +BRISTLETAILS +BRISTLIER +BRISTLIEST +BRISTLING +BRISTLY +BRISTOL +BRISTOLS +BRIT +BRITANNIA +BRITANNIAS +BRITCHES +BRITH +BRITHS +BRITS +BRITSKA +BRITSKAS +BRITT +BRITTANIA +BRITTANIAS +BRITTLE +BRITTLED +BRITTLELY +BRITTLENESS +BRITTLENESSES +BRITTLER +BRITTLES +BRITTLEST +BRITTLING +BRITTLY +BRITTS +BRITZKA +BRITZKAS +BRITZSKA +BRITZSKAS +BRO +BROACH +BROACHED +BROACHER +BROACHERS +BROACHES +BROACHING +BROAD +BROADAX +BROADAXE +BROADAXES +BROADBAND +BROADBANDS +BROADBEAN +BROADBEANS +BROADBILL +BROADBILLS +BROADCAST +BROADCASTED +BROADCASTER +BROADCASTERS +BROADCASTING +BROADCASTS +BROADCLOTH +BROADCLOTHS +BROADEN +BROADENED +BROADENER +BROADENERS +BROADENING +BROADENS +BROADER +BROADEST +BROADISH +BROADLEAF +BROADLEAVES +BROADLOOM +BROADLOOMS +BROADLY +BROADNESS +BROADNESSES +BROADS +BROADSCALE +BROADSHEET +BROADSHEETS +BROADSIDE +BROADSIDED +BROADSIDES +BROADSIDING +BROADSWORD +BROADSWORDS +BROADTAIL +BROADTAILS +BROCADE +BROCADED +BROCADES +BROCADING +BROCATEL +BROCATELLE +BROCATELLES +BROCATELS +BROCCOLI +BROCCOLIS +BROCHE +BROCHETTE +BROCHETTES +BROCHURE +BROCHURES +BROCK +BROCKAGE +BROCKAGES +BROCKET +BROCKETS +BROCKS +BROCOLI +BROCOLIS +BROGAN +BROGANS +BROGUE +BROGUERIES +BROGUERY +BROGUES +BROGUISH +BROIDER +BROIDERED +BROIDERER +BROIDERERS +BROIDERIES +BROIDERING +BROIDERS +BROIDERY +BROIL +BROILED +BROILER +BROILERS +BROILING +BROILS +BROKAGE +BROKAGES +BROKE +BROKEN +BROKENHEARTED +BROKENLY +BROKENNESS +BROKENNESSES +BROKER +BROKERAGE +BROKERAGES +BROKERED +BROKERING +BROKERINGS +BROKERS +BROKING +BROKINGS +BROLLIES +BROLLY +BROMAL +BROMALS +BROMATE +BROMATED +BROMATES +BROMATING +BROME +BROMEGRASS +BROMEGRASSES +BROMELAIN +BROMELAINS +BROMELIAD +BROMELIADS +BROMELIN +BROMELINS +BROMES +BROMIC +BROMID +BROMIDE +BROMIDES +BROMIDIC +BROMIDS +BROMIN +BROMINATE +BROMINATED +BROMINATES +BROMINATING +BROMINATION +BROMINATIONS +BROMINE +BROMINES +BROMINISM +BROMINISMS +BROMINS +BROMISM +BROMISMS +BROMIZE +BROMIZED +BROMIZES +BROMIZING +BROMO +BROMOCRIPTINE +BROMOCRIPTINES +BROMOS +BROMOURACIL +BROMOURACILS +BRONC +BRONCHI +BRONCHIA +BRONCHIAL +BRONCHIALLY +BRONCHIECTASES +BRONCHIECTASIS +BRONCHIOLAR +BRONCHIOLE +BRONCHIOLES +BRONCHITIC +BRONCHITIS +BRONCHITISES +BRONCHIUM +BRONCHO +BRONCHODILATOR +BRONCHODILATORS +BRONCHOGENIC +BRONCHOS +BRONCHOSCOPE +BRONCHOSCOPES +BRONCHOSCOPIC +BRONCHOSCOPIES +BRONCHOSCOPIST +BRONCHOSCOPISTS +BRONCHOSCOPY +BRONCHOSPASM +BRONCHOSPASMS +BRONCHOSPASTIC +BRONCHUS +BRONCO +BRONCOBUSTER +BRONCOBUSTERS +BRONCOS +BRONCS +BRONTOSAUR +BRONTOSAURS +BRONTOSAURUS +BRONTOSAURUSES +BRONZE +BRONZED +BRONZER +BRONZERS +BRONZES +BRONZIER +BRONZIEST +BRONZING +BRONZINGS +BRONZY +BROO +BROOCH +BROOCHES +BROOD +BROODED +BROODER +BROODERS +BROODIER +BROODIEST +BROODILY +BROODINESS +BROODINESSES +BROODING +BROODINGLY +BROODLESS +BROODMARE +BROODMARES +BROODS +BROODY +BROOK +BROOKED +BROOKIE +BROOKIES +BROOKING +BROOKITE +BROOKITES +BROOKLET +BROOKLETS +BROOKLIKE +BROOKLIME +BROOKLIMES +BROOKS +BROOM +BROOMBALL +BROOMBALLER +BROOMBALLERS +BROOMBALLS +BROOMCORN +BROOMCORNS +BROOMED +BROOMIER +BROOMIEST +BROOMING +BROOMRAPE +BROOMRAPES +BROOMS +BROOMSTICK +BROOMSTICKS +BROOMY +BROOS +BROS +BROSE +BROSES +BROSY +BROTH +BROTHEL +BROTHELS +BROTHER +BROTHERED +BROTHERHOOD +BROTHERHOODS +BROTHERING +BROTHERLINESS +BROTHERLINESSES +BROTHERLY +BROTHERS +BROTHS +BROTHY +BROUGHAM +BROUGHAMS +BROUGHT +BROUHAHA +BROUHAHAS +BROW +BROWALLIA +BROWALLIAS +BROWBAND +BROWBANDS +BROWBEAT +BROWBEATEN +BROWBEATING +BROWBEATS +BROWED +BROWLESS +BROWN +BROWNED +BROWNER +BROWNEST +BROWNFIELD +BROWNFIELDS +BROWNIE +BROWNIER +BROWNIES +BROWNIEST +BROWNING +BROWNISH +BROWNNESS +BROWNNESSES +BROWNNOSE +BROWNNOSED +BROWNNOSER +BROWNNOSERS +BROWNNOSES +BROWNNOSING +BROWNOUT +BROWNOUTS +BROWNS +BROWNSHIRT +BROWNSHIRTS +BROWNSTONE +BROWNSTONES +BROWNY +BROWRIDGE +BROWRIDGES +BROWS +BROWSABLE +BROWSABLES +BROWSE +BROWSED +BROWSER +BROWSERS +BROWSES +BROWSING +BRR +BRRR +BRUCELLA +BRUCELLAE +BRUCELLAS +BRUCELLOSES +BRUCELLOSIS +BRUCIN +BRUCINE +BRUCINES +BRUCINS +BRUGH +BRUGHS +BRUIN +BRUINS +BRUISE +BRUISED +BRUISER +BRUISERS +BRUISES +BRUISING +BRUIT +BRUITED +BRUITER +BRUITERS +BRUITING +BRUITS +BRULOT +BRULOTS +BRULYIE +BRULYIES +BRULZIE +BRULZIES +BRUMAL +BRUMBIES +BRUMBY +BRUME +BRUMES +BRUMMAGEM +BRUMMAGEMS +BRUMOUS +BRUNCH +BRUNCHED +BRUNCHER +BRUNCHERS +BRUNCHES +BRUNCHING +BRUNET +BRUNETS +BRUNETTE +BRUNETTES +BRUNG +BRUNIZEM +BRUNIZEMS +BRUNT +BRUNTS +BRUSH +BRUSHABILITIES +BRUSHABILITY +BRUSHBACK +BRUSHBACKS +BRUSHED +BRUSHER +BRUSHERS +BRUSHES +BRUSHFIRE +BRUSHFIRES +BRUSHIER +BRUSHIEST +BRUSHING +BRUSHLAND +BRUSHLANDS +BRUSHLESS +BRUSHOFF +BRUSHOFFS +BRUSHUP +BRUSHUPS +BRUSHWOOD +BRUSHWOODS +BRUSHWORK +BRUSHWORKS +BRUSHY +BRUSK +BRUSKER +BRUSKEST +BRUSQUE +BRUSQUELY +BRUSQUENESS +BRUSQUENESSES +BRUSQUER +BRUSQUERIE +BRUSQUERIES +BRUSQUEST +BRUT +BRUTAL +BRUTALISE +BRUTALISED +BRUTALISES +BRUTALISING +BRUTALITIES +BRUTALITY +BRUTALIZATION +BRUTALIZATIONS +BRUTALIZE +BRUTALIZED +BRUTALIZES +BRUTALIZING +BRUTALLY +BRUTE +BRUTED +BRUTELY +BRUTES +BRUTIFIED +BRUTIFIES +BRUTIFY +BRUTIFYING +BRUTING +BRUTISH +BRUTISHLY +BRUTISHNESS +BRUTISHNESSES +BRUTISM +BRUTISMS +BRUTS +BRUX +BRUXED +BRUXES +BRUXING +BRUXISM +BRUXISMS +BRYOLOGICAL +BRYOLOGIES +BRYOLOGIST +BRYOLOGISTS +BRYOLOGY +BRYONIES +BRYONY +BRYOPHYLLUM +BRYOPHYLLUMS +BRYOPHYTE +BRYOPHYTES +BRYOPHYTIC +BRYOZOAN +BRYOZOANS +BUB +BUBAL +BUBALE +BUBALES +BUBALINE +BUBALIS +BUBALISES +BUBALS +BUBBA +BUBBAS +BUBBIES +BUBBLE +BUBBLED +BUBBLEGUM +BUBBLEGUMS +BUBBLEHEAD +BUBBLEHEADED +BUBBLEHEADS +BUBBLER +BUBBLERS +BUBBLES +BUBBLIER +BUBBLIES +BUBBLIEST +BUBBLING +BUBBLY +BUBBY +BUBINGA +BUBINGAS +BUBKES +BUBO +BUBOED +BUBOES +BUBONIC +BUBS +BUBU +BUBUS +BUCCAL +BUCCALLY +BUCCANEER +BUCCANEERED +BUCCANEERING +BUCCANEERISH +BUCCANEERS +BUCCINATOR +BUCCINATORS +BUCK +BUCKAROO +BUCKAROOS +BUCKAYRO +BUCKAYROS +BUCKBEAN +BUCKBEANS +BUCKBOARD +BUCKBOARDS +BUCKBRUSH +BUCKBRUSHES +BUCKED +BUCKEEN +BUCKEENS +BUCKER +BUCKEROO +BUCKEROOS +BUCKERS +BUCKET +BUCKETED +BUCKETFUL +BUCKETFULS +BUCKETING +BUCKETS +BUCKETSFUL +BUCKEYE +BUCKEYES +BUCKHOUND +BUCKHOUNDS +BUCKING +BUCKISH +BUCKLE +BUCKLED +BUCKLER +BUCKLERED +BUCKLERING +BUCKLERS +BUCKLES +BUCKLING +BUCKO +BUCKOES +BUCKOS +BUCKRA +BUCKRAM +BUCKRAMED +BUCKRAMING +BUCKRAMS +BUCKRAS +BUCKS +BUCKSAW +BUCKSAWS +BUCKSHEE +BUCKSHEES +BUCKSHOT +BUCKSKIN +BUCKSKINNED +BUCKSKINS +BUCKTAIL +BUCKTAILS +BUCKTEETH +BUCKTHORN +BUCKTHORNS +BUCKTOOTH +BUCKTOOTHED +BUCKWHEAT +BUCKWHEATS +BUCKYBALL +BUCKYBALLS +BUCKYTUBE +BUCKYTUBES +BUCOLIC +BUCOLICALLY +BUCOLICS +BUD +BUDDED +BUDDER +BUDDERS +BUDDHA +BUDDHAS +BUDDIED +BUDDIES +BUDDING +BUDDINGS +BUDDLE +BUDDLEIA +BUDDLEIAS +BUDDLES +BUDDY +BUDDYING +BUDGE +BUDGED +BUDGER +BUDGERIGAR +BUDGERIGARS +BUDGERS +BUDGES +BUDGET +BUDGETARY +BUDGETED +BUDGETEER +BUDGETEERS +BUDGETER +BUDGETERS +BUDGETING +BUDGETS +BUDGIE +BUDGIES +BUDGING +BUDLESS +BUDLIKE +BUDS +BUDWORM +BUDWORMS +BUFF +BUFFABLE +BUFFALO +BUFFALOBERRIES +BUFFALOBERRY +BUFFALOED +BUFFALOES +BUFFALOFISH +BUFFALOFISHES +BUFFALOING +BUFFALOS +BUFFED +BUFFER +BUFFERED +BUFFERING +BUFFERS +BUFFEST +BUFFET +BUFFETED +BUFFETER +BUFFETERS +BUFFETING +BUFFETS +BUFFI +BUFFIER +BUFFIEST +BUFFING +BUFFLEHEAD +BUFFLEHEADS +BUFFO +BUFFOON +BUFFOONERIES +BUFFOONERY +BUFFOONISH +BUFFOONS +BUFFOS +BUFFS +BUFFY +BUG +BUGABOO +BUGABOOS +BUGBANE +BUGBANES +BUGBEAR +BUGBEARS +BUGEYE +BUGEYES +BUGGED +BUGGER +BUGGERED +BUGGERIES +BUGGERING +BUGGERS +BUGGERY +BUGGIER +BUGGIES +BUGGIEST +BUGGINESS +BUGGINESSES +BUGGING +BUGGY +BUGHOUSE +BUGHOUSES +BUGLE +BUGLED +BUGLER +BUGLERS +BUGLES +BUGLEWEED +BUGLEWEEDS +BUGLING +BUGLOSS +BUGLOSSES +BUGOUT +BUGOUTS +BUGS +BUGSEED +BUGSEEDS +BUGSHA +BUGSHAS +BUHL +BUHLS +BUHLWORK +BUHLWORKS +BUHR +BUHRS +BUHRSTONE +BUHRSTONES +BUILD +BUILDABLE +BUILDDOWN +BUILDDOWNS +BUILDED +BUILDER +BUILDERS +BUILDING +BUILDINGS +BUILDS +BUILDUP +BUILDUPS +BUILT +BUIRDLY +BULB +BULBAR +BULBED +BULBEL +BULBELS +BULBIL +BULBILS +BULBLET +BULBLETS +BULBOUS +BULBOUSLY +BULBS +BULBUL +BULBULS +BULGE +BULGED +BULGER +BULGERS +BULGES +BULGHUR +BULGHURS +BULGIER +BULGIEST +BULGINESS +BULGINESSES +BULGING +BULGINGLY +BULGUR +BULGURS +BULGY +BULIMIA +BULIMIAC +BULIMIAS +BULIMIC +BULIMICS +BULK +BULKAGE +BULKAGES +BULKED +BULKHEAD +BULKHEADS +BULKIER +BULKIEST +BULKILY +BULKINESS +BULKINESSES +BULKING +BULKS +BULKY +BULL +BULLA +BULLACE +BULLACES +BULLAE +BULLATE +BULLBAITING +BULLBAITINGS +BULLBAT +BULLBATS +BULLBRIER +BULLBRIERS +BULLDOG +BULLDOGGED +BULLDOGGER +BULLDOGGERS +BULLDOGGING +BULLDOGGINGS +BULLDOGS +BULLDOZE +BULLDOZED +BULLDOZER +BULLDOZERS +BULLDOZES +BULLDOZING +BULLDYKE +BULLDYKES +BULLED +BULLET +BULLETED +BULLETIN +BULLETINED +BULLETING +BULLETINING +BULLETINS +BULLETPROOF +BULLETS +BULLFIGHT +BULLFIGHTER +BULLFIGHTERS +BULLFIGHTING +BULLFIGHTINGS +BULLFIGHTS +BULLFINCH +BULLFINCHES +BULLFROG +BULLFROGS +BULLHEAD +BULLHEADED +BULLHEADEDLY +BULLHEADEDNESS +BULLHEADS +BULLHORN +BULLHORNS +BULLIED +BULLIER +BULLIES +BULLIEST +BULLING +BULLION +BULLIONS +BULLISH +BULLISHLY +BULLISHNESS +BULLISHNESSES +BULLMASTIFF +BULLMASTIFFS +BULLNECK +BULLNECKED +BULLNECKS +BULLNOSE +BULLNOSES +BULLOCK +BULLOCKS +BULLOCKY +BULLOUS +BULLPEN +BULLPENS +BULLPOUT +BULLPOUTS +BULLRING +BULLRINGS +BULLRUSH +BULLRUSHES +BULLS +BULLSHAT +BULLSHIT +BULLSHITS +BULLSHITTED +BULLSHITTING +BULLSHOT +BULLSHOTS +BULLSNAKE +BULLSNAKES +BULLTERRIER +BULLTERRIERS +BULLWEED +BULLWEEDS +BULLWHIP +BULLWHIPPED +BULLWHIPPING +BULLWHIPS +BULLY +BULLYBOY +BULLYBOYS +BULLYING +BULLYRAG +BULLYRAGGED +BULLYRAGGING +BULLYRAGS +BULRUSH +BULRUSHES +BULWARK +BULWARKED +BULWARKING +BULWARKS +BUM +BUMBERSHOOT +BUMBERSHOOTS +BUMBLE +BUMBLEBEE +BUMBLEBEES +BUMBLED +BUMBLER +BUMBLERS +BUMBLES +BUMBLING +BUMBLINGLY +BUMBLINGS +BUMBOAT +BUMBOATS +BUMELIA +BUMELIAS +BUMF +BUMFS +BUMFUZZLE +BUMFUZZLED +BUMFUZZLES +BUMFUZZLING +BUMKIN +BUMKINS +BUMMALO +BUMMALOS +BUMMED +BUMMER +BUMMERS +BUMMEST +BUMMING +BUMP +BUMPED +BUMPER +BUMPERED +BUMPERING +BUMPERS +BUMPH +BUMPHS +BUMPIER +BUMPIEST +BUMPILY +BUMPINESS +BUMPINESSES +BUMPING +BUMPKIN +BUMPKINISH +BUMPKINLY +BUMPKINS +BUMPS +BUMPTIOUS +BUMPTIOUSLY +BUMPTIOUSNESS +BUMPTIOUSNESSES +BUMPY +BUMS +BUN +BUNA +BUNAS +BUNCH +BUNCHBERRIES +BUNCHBERRY +BUNCHED +BUNCHES +BUNCHGRASS +BUNCHGRASSES +BUNCHIER +BUNCHIEST +BUNCHILY +BUNCHING +BUNCHY +BUNCO +BUNCOED +BUNCOING +BUNCOMBE +BUNCOMBES +BUNCOS +BUND +BUNDIST +BUNDISTS +BUNDLE +BUNDLED +BUNDLER +BUNDLERS +BUNDLES +BUNDLING +BUNDLINGS +BUNDS +BUNDT +BUNDTS +BUNG +BUNGALOW +BUNGALOWS +BUNGED +BUNGEE +BUNGEES +BUNGHOLE +BUNGHOLES +BUNGING +BUNGLE +BUNGLED +BUNGLER +BUNGLERS +BUNGLES +BUNGLESOME +BUNGLING +BUNGLINGLY +BUNGLINGS +BUNGS +BUNION +BUNIONS +BUNK +BUNKED +BUNKER +BUNKERED +BUNKERING +BUNKERS +BUNKHOUSE +BUNKHOUSES +BUNKING +BUNKMATE +BUNKMATES +BUNKO +BUNKOED +BUNKOING +BUNKOS +BUNKS +BUNKUM +BUNKUMS +BUNN +BUNNIES +BUNNS +BUNNY +BUNRAKU +BUNRAKUS +BUNS +BUNT +BUNTED +BUNTER +BUNTERS +BUNTING +BUNTINGS +BUNTLINE +BUNTLINES +BUNTS +BUNYA +BUNYAS +BUOY +BUOYAGE +BUOYAGES +BUOYANCE +BUOYANCES +BUOYANCIES +BUOYANCY +BUOYANT +BUOYANTLY +BUOYED +BUOYING +BUOYS +BUPKES +BUPKUS +BUPPIE +BUPPIES +BUPPY +BUPRESTID +BUPRESTIDS +BUQSHA +BUQSHAS +BUR +BURA +BURAN +BURANS +BURAS +BURB +BURBLE +BURBLED +BURBLER +BURBLERS +BURBLES +BURBLIER +BURBLIEST +BURBLING +BURBLY +BURBOT +BURBOTS +BURBS +BURD +BURDEN +BURDENED +BURDENER +BURDENERS +BURDENING +BURDENS +BURDENSOME +BURDIE +BURDIES +BURDOCK +BURDOCKS +BURDS +BUREAU +BUREAUCRACIES +BUREAUCRACY +BUREAUCRAT +BUREAUCRATESE +BUREAUCRATESES +BUREAUCRATIC +BUREAUCRATISE +BUREAUCRATISED +BUREAUCRATISES +BUREAUCRATISING +BUREAUCRATISM +BUREAUCRATISMS +BUREAUCRATIZE +BUREAUCRATIZED +BUREAUCRATIZES +BUREAUCRATIZING +BUREAUCRATS +BUREAUS +BUREAUX +BURET +BURETS +BURETTE +BURETTES +BURG +BURGAGE +BURGAGES +BURGEE +BURGEES +BURGEON +BURGEONED +BURGEONING +BURGEONS +BURGER +BURGERS +BURGESS +BURGESSES +BURGH +BURGHAL +BURGHER +BURGHERS +BURGHS +BURGLAR +BURGLARIES +BURGLARIOUS +BURGLARIOUSLY +BURGLARIZE +BURGLARIZED +BURGLARIZES +BURGLARIZING +BURGLARPROOF +BURGLARS +BURGLARY +BURGLE +BURGLED +BURGLES +BURGLING +BURGOMASTER +BURGOMASTERS +BURGONET +BURGONETS +BURGOO +BURGOOS +BURGOUT +BURGOUTS +BURGRAVE +BURGRAVES +BURGS +BURGUNDIES +BURGUNDY +BURIAL +BURIALS +BURIED +BURIER +BURIERS +BURIES +BURIN +BURINS +BURKA +BURKAS +BURKE +BURKED +BURKER +BURKERS +BURKES +BURKING +BURKITE +BURKITES +BURL +BURLADERO +BURLADEROS +BURLAP +BURLAPS +BURLED +BURLER +BURLERS +BURLESK +BURLESKS +BURLESQUE +BURLESQUED +BURLESQUELY +BURLESQUER +BURLESQUERS +BURLESQUES +BURLESQUING +BURLEY +BURLEYS +BURLIER +BURLIEST +BURLILY +BURLINESS +BURLINESSES +BURLING +BURLS +BURLY +BURN +BURNABLE +BURNABLES +BURNED +BURNER +BURNERS +BURNET +BURNETS +BURNIE +BURNIES +BURNING +BURNINGLY +BURNINGS +BURNISH +BURNISHED +BURNISHER +BURNISHERS +BURNISHES +BURNISHING +BURNISHINGS +BURNOOSE +BURNOOSED +BURNOOSES +BURNOUS +BURNOUSES +BURNOUT +BURNOUTS +BURNS +BURNSIDES +BURNT +BURP +BURPED +BURPING +BURPS +BURQA +BURQAS +BURR +BURRED +BURRER +BURRERS +BURRIER +BURRIEST +BURRING +BURRITO +BURRITOS +BURRO +BURROS +BURROW +BURROWED +BURROWER +BURROWERS +BURROWING +BURROWS +BURRS +BURRSTONE +BURRSTONES +BURRY +BURS +BURSA +BURSAE +BURSAL +BURSAR +BURSARIAL +BURSARIES +BURSARS +BURSARY +BURSAS +BURSATE +BURSE +BURSEED +BURSEEDS +BURSERA +BURSES +BURSIFORM +BURSITIS +BURSITISES +BURST +BURSTED +BURSTER +BURSTERS +BURSTING +BURSTONE +BURSTONES +BURSTS +BURTHEN +BURTHENED +BURTHENING +BURTHENS +BURTON +BURTONS +BURWEED +BURWEEDS +BURY +BURYING +BUS +BUSBAR +BUSBARS +BUSBIES +BUSBOY +BUSBOYS +BUSBY +BUSED +BUSES +BUSGIRL +BUSGIRLS +BUSH +BUSHBUCK +BUSHBUCKS +BUSHED +BUSHEL +BUSHELED +BUSHELER +BUSHELERS +BUSHELING +BUSHELLED +BUSHELLER +BUSHELLERS +BUSHELLING +BUSHELMAN +BUSHELMEN +BUSHELS +BUSHER +BUSHERS +BUSHES +BUSHFIRE +BUSHFIRES +BUSHGOAT +BUSHGOATS +BUSHIDO +BUSHIDOS +BUSHIER +BUSHIEST +BUSHILY +BUSHINESS +BUSHINESSES +BUSHING +BUSHINGS +BUSHLAND +BUSHLANDS +BUSHLESS +BUSHLIKE +BUSHMAN +BUSHMASTER +BUSHMASTERS +BUSHMEN +BUSHPIG +BUSHPIGS +BUSHRANGER +BUSHRANGERS +BUSHRANGING +BUSHRANGINGS +BUSHTIT +BUSHTITS +BUSHVELD +BUSHVELDS +BUSHWA +BUSHWAH +BUSHWAHS +BUSHWAS +BUSHWHACK +BUSHWHACKED +BUSHWHACKER +BUSHWHACKERS +BUSHWHACKING +BUSHWHACKS +BUSHY +BUSIED +BUSIER +BUSIES +BUSIEST +BUSILY +BUSINESS +BUSINESSES +BUSINESSLIKE +BUSINESSMAN +BUSINESSMEN +BUSINESSPEOPLE +BUSINESSPERSON +BUSINESSPERSONS +BUSINESSWOMAN +BUSINESSWOMEN +BUSING +BUSINGS +BUSK +BUSKED +BUSKER +BUSKERS +BUSKIN +BUSKINED +BUSKING +BUSKINS +BUSKS +BUSLOAD +BUSLOADS +BUSMAN +BUSMEN +BUSS +BUSSED +BUSSES +BUSSING +BUSSINGS +BUST +BUSTARD +BUSTARDS +BUSTED +BUSTER +BUSTERS +BUSTIC +BUSTICATE +BUSTICATED +BUSTICATES +BUSTICATING +BUSTICS +BUSTIER +BUSTIERS +BUSTIEST +BUSTINESS +BUSTINESSES +BUSTING +BUSTLE +BUSTLED +BUSTLER +BUSTLERS +BUSTLES +BUSTLINE +BUSTLINES +BUSTLING +BUSTLINGLY +BUSTS +BUSTY +BUSULFAN +BUSULFANS +BUSY +BUSYBODIES +BUSYBODY +BUSYING +BUSYNESS +BUSYNESSES +BUSYWORK +BUSYWORKS +BUT +BUTADIENE +BUTADIENES +BUTANE +BUTANES +BUTANOL +BUTANOLS +BUTANONE +BUTANONES +BUTCH +BUTCHER +BUTCHERED +BUTCHERER +BUTCHERERS +BUTCHERIES +BUTCHERING +BUTCHERLY +BUTCHERS +BUTCHERY +BUTCHES +BUTCHNESS +BUTCHNESSES +BUTE +BUTENE +BUTENES +BUTEO +BUTEONINE +BUTEONINES +BUTEOS +BUTES +BUTLE +BUTLED +BUTLER +BUTLERIES +BUTLERS +BUTLERY +BUTLES +BUTLING +BUTS +BUTT +BUTTALS +BUTTE +BUTTED +BUTTER +BUTTERBALL +BUTTERBALLS +BUTTERBUR +BUTTERBURS +BUTTERCUP +BUTTERCUPS +BUTTERED +BUTTERFAT +BUTTERFATS +BUTTERFINGERED +BUTTERFINGERS +BUTTERFISH +BUTTERFISHES +BUTTERFLIED +BUTTERFLIES +BUTTERFLY +BUTTERFLYER +BUTTERFLYERS +BUTTERFLYING +BUTTERIER +BUTTERIES +BUTTERIEST +BUTTERING +BUTTERLESS +BUTTERMILK +BUTTERMILKS +BUTTERNUT +BUTTERNUTS +BUTTERS +BUTTERSCOTCH +BUTTERSCOTCHES +BUTTERWEED +BUTTERWEEDS +BUTTERWORT +BUTTERWORTS +BUTTERY +BUTTES +BUTTHEAD +BUTTHEADS +BUTTIES +BUTTING +BUTTINSKI +BUTTINSKIES +BUTTINSKIS +BUTTINSKY +BUTTOCK +BUTTOCKS +BUTTON +BUTTONBALL +BUTTONBALLS +BUTTONBUSH +BUTTONBUSHES +BUTTONED +BUTTONER +BUTTONERS +BUTTONHOLE +BUTTONHOLED +BUTTONHOLER +BUTTONHOLERS +BUTTONHOLES +BUTTONHOLING +BUTTONHOOK +BUTTONHOOKED +BUTTONHOOKING +BUTTONHOOKS +BUTTONING +BUTTONLESS +BUTTONS +BUTTONWOOD +BUTTONWOODS +BUTTONY +BUTTRESS +BUTTRESSED +BUTTRESSES +BUTTRESSING +BUTTS +BUTTSTOCK +BUTTSTOCKS +BUTTY +BUTUT +BUTUTS +BUTYL +BUTYLATE +BUTYLATED +BUTYLATES +BUTYLATING +BUTYLATION +BUTYLATIONS +BUTYLENE +BUTYLENES +BUTYLS +BUTYRAL +BUTYRALDEHYDE +BUTYRALDEHYDES +BUTYRALS +BUTYRATE +BUTYRATES +BUTYRIC +BUTYRIN +BUTYRINS +BUTYROPHENONE +BUTYROPHENONES +BUTYROUS +BUTYRYL +BUTYRYLS +BUXOM +BUXOMER +BUXOMEST +BUXOMLY +BUXOMNESS +BUXOMNESSES +BUY +BUYABLE +BUYBACK +BUYBACKS +BUYER +BUYERS +BUYING +BUYOFF +BUYOFFS +BUYOUT +BUYOUTS +BUYS +BUZUKI +BUZUKIA +BUZUKIS +BUZZ +BUZZARD +BUZZARDS +BUZZCUT +BUZZCUTS +BUZZED +BUZZER +BUZZERS +BUZZES +BUZZING +BUZZINGLY +BUZZWIG +BUZZWIGS +BUZZWORD +BUZZWORDS +BWANA +BWANAS +BY +BYCATCH +BYCATCHES +BYE +BYELAW +BYELAWS +BYES +BYGONE +BYGONES +BYLAW +BYLAWS +BYLINE +BYLINED +BYLINER +BYLINERS +BYLINES +BYLINING +BYNAME +BYNAMES +BYPASS +BYPASSED +BYPASSES +BYPASSING +BYPAST +BYPATH +BYPATHS +BYPLAY +BYPLAYS +BYPRODUCT +BYPRODUCTS +BYRE +BYRES +BYRL +BYRLED +BYRLING +BYRLS +BYRNIE +BYRNIES +BYROAD +BYROADS +BYS +BYSSAL +BYSSI +BYSSINOSES +BYSSINOSIS +BYSSUS +BYSSUSES +BYSTANDER +BYSTANDERS +BYSTREET +BYSTREETS +BYTALK +BYTALKS +BYTE +BYTES +BYWAY +BYWAYS +BYWORD +BYWORDS +BYWORK +BYWORKS +BYZANT +BYZANTINE +BYZANTS +CAB +CABAL +CABALA +CABALAS +CABALETTA +CABALETTAS +CABALETTE +CABALISM +CABALISMS +CABALIST +CABALISTIC +CABALISTS +CABALLED +CABALLERO +CABALLEROS +CABALLING +CABALS +CABANA +CABANAS +CABARET +CABARETS +CABBAGE +CABBAGED +CABBAGES +CABBAGEWORM +CABBAGEWORMS +CABBAGEY +CABBAGING +CABBAGY +CABBALA +CABBALAH +CABBALAHS +CABBALAS +CABBALISM +CABBALISMS +CABBALIST +CABBALISTS +CABBED +CABBIE +CABBIES +CABBING +CABBY +CABDRIVER +CABDRIVERS +CABER +CABERNET +CABERNETS +CABERS +CABESTRO +CABESTROS +CABEZON +CABEZONE +CABEZONES +CABEZONS +CABILDO +CABILDOS +CABIN +CABINED +CABINET +CABINETMAKER +CABINETMAKERS +CABINETMAKING +CABINETMAKINGS +CABINETRIES +CABINETRY +CABINETS +CABINETWORK +CABINETWORKS +CABINING +CABINMATE +CABINMATES +CABINS +CABLE +CABLECAST +CABLECASTED +CABLECASTING +CABLECASTS +CABLED +CABLEGRAM +CABLEGRAMS +CABLER +CABLERS +CABLES +CABLET +CABLETS +CABLEWAY +CABLEWAYS +CABLING +CABMAN +CABMEN +CABOB +CABOBS +CABOCHED +CABOCHON +CABOCHONS +CABOMBA +CABOMBAS +CABOODLE +CABOODLES +CABOOSE +CABOOSES +CABOSHED +CABOTAGE +CABOTAGES +CABRESTA +CABRESTAS +CABRESTO +CABRESTOS +CABRETTA +CABRETTAS +CABRILLA +CABRILLAS +CABRIOLE +CABRIOLES +CABRIOLET +CABRIOLETS +CABS +CABSTAND +CABSTANDS +CACA +CACAO +CACAOS +CACAS +CACCIATORE +CACHALOT +CACHALOTS +CACHE +CACHECTIC +CACHED +CACHEPOT +CACHEPOTS +CACHES +CACHET +CACHETED +CACHETING +CACHETS +CACHEXIA +CACHEXIAS +CACHEXIC +CACHEXIES +CACHEXY +CACHING +CACHINNATE +CACHINNATED +CACHINNATES +CACHINNATING +CACHINNATION +CACHINNATIONS +CACHOU +CACHOUS +CACHUCHA +CACHUCHAS +CACIQUE +CACIQUES +CACIQUISM +CACIQUISMS +CACKLE +CACKLED +CACKLER +CACKLERS +CACKLES +CACKLING +CACODEMON +CACODEMONIC +CACODEMONS +CACODYL +CACODYLIC +CACODYLS +CACOETHES +CACOGRAPHICAL +CACOGRAPHIES +CACOGRAPHY +CACOMISTLE +CACOMISTLES +CACOMIXL +CACOMIXLE +CACOMIXLES +CACOMIXLS +CACONYM +CACONYMIES +CACONYMS +CACONYMY +CACOPHONIES +CACOPHONOUS +CACOPHONOUSLY +CACOPHONY +CACTI +CACTOID +CACTUS +CACTUSES +CACUMINAL +CACUMINALS +CAD +CADASTER +CADASTERS +CADASTRAL +CADASTRALLY +CADASTRE +CADASTRES +CADAVER +CADAVERIC +CADAVERINE +CADAVERINES +CADAVEROUS +CADAVEROUSLY +CADAVERS +CADDICE +CADDICES +CADDIE +CADDIED +CADDIES +CADDIS +CADDISED +CADDISES +CADDISFLIES +CADDISFLY +CADDISH +CADDISHLY +CADDISHNESS +CADDISHNESSES +CADDISWORM +CADDISWORMS +CADDY +CADDYING +CADE +CADELLE +CADELLES +CADENCE +CADENCED +CADENCES +CADENCIES +CADENCING +CADENCY +CADENT +CADENTIAL +CADENZA +CADENZAS +CADES +CADET +CADETS +CADETSHIP +CADETSHIPS +CADGE +CADGED +CADGER +CADGERS +CADGES +CADGING +CADGY +CADI +CADIS +CADMIC +CADMIUM +CADMIUMS +CADRE +CADRES +CADS +CADUCEAN +CADUCEI +CADUCEUS +CADUCITIES +CADUCITY +CADUCOUS +CAECA +CAECAL +CAECALLY +CAECILIAN +CAECILIANS +CAECUM +CAEOMA +CAEOMAS +CAESAR +CAESAREAN +CAESAREANS +CAESARIAN +CAESARIANS +CAESARISM +CAESARISMS +CAESARS +CAESIUM +CAESIUMS +CAESPITOSE +CAESTUS +CAESTUSES +CAESURA +CAESURAE +CAESURAL +CAESURAS +CAESURIC +CAFE +CAFES +CAFETERIA +CAFETERIAS +CAFETORIA +CAFETORIUM +CAFETORIUMS +CAFF +CAFFEIN +CAFFEINATED +CAFFEINE +CAFFEINES +CAFFEINIC +CAFFEINS +CAFFS +CAFTAN +CAFTANED +CAFTANS +CAGE +CAGED +CAGEFUL +CAGEFULS +CAGELIKE +CAGELING +CAGELINGS +CAGER +CAGERS +CAGES +CAGEY +CAGEYNESS +CAGEYNESSES +CAGIER +CAGIEST +CAGILY +CAGINESS +CAGINESSES +CAGING +CAGY +CAHIER +CAHIERS +CAHOOT +CAHOOTS +CAHOW +CAHOWS +CAID +CAIDS +CAIMAN +CAIMANS +CAIN +CAINS +CAIQUE +CAIQUES +CAIRD +CAIRDS +CAIRN +CAIRNED +CAIRNGORM +CAIRNGORMS +CAIRNS +CAIRNY +CAISSON +CAISSONS +CAITIFF +CAITIFFS +CAJAPUT +CAJAPUTS +CAJEPUT +CAJEPUTS +CAJOLE +CAJOLED +CAJOLEMENT +CAJOLEMENTS +CAJOLER +CAJOLERIES +CAJOLERS +CAJOLERY +CAJOLES +CAJOLING +CAJON +CAJONES +CAJUPUT +CAJUPUTS +CAKE +CAKED +CAKES +CAKEWALK +CAKEWALKED +CAKEWALKER +CAKEWALKERS +CAKEWALKING +CAKEWALKS +CAKEY +CAKIER +CAKIEST +CAKINESS +CAKINESSES +CAKING +CAKY +CALABASH +CALABASHES +CALABAZA +CALABAZAS +CALABOOSE +CALABOOSES +CALADIUM +CALADIUMS +CALAMANCO +CALAMANCOES +CALAMANCOS +CALAMANDER +CALAMANDERS +CALAMAR +CALAMARI +CALAMARIES +CALAMARIS +CALAMARS +CALAMARY +CALAMATA +CALAMATAS +CALAMI +CALAMINE +CALAMINED +CALAMINES +CALAMINING +CALAMINT +CALAMINTS +CALAMITE +CALAMITES +CALAMITIES +CALAMITOUS +CALAMITOUSLY +CALAMITY +CALAMONDIN +CALAMONDINS +CALAMUS +CALANDO +CALASH +CALASHES +CALATHI +CALATHOS +CALATHUS +CALCANEA +CALCANEAL +CALCANEI +CALCANEUM +CALCANEUS +CALCAR +CALCARATE +CALCAREOUS +CALCAREOUSLY +CALCARIA +CALCARS +CALCEATE +CALCEDONIES +CALCEDONY +CALCES +CALCIC +CALCICOLE +CALCICOLES +CALCICOLOUS +CALCIFEROL +CALCIFEROLS +CALCIFEROUS +CALCIFIC +CALCIFICATION +CALCIFICATIONS +CALCIFIED +CALCIFIES +CALCIFUGE +CALCIFUGES +CALCIFUGOUS +CALCIFY +CALCIFYING +CALCIMINE +CALCIMINED +CALCIMINES +CALCIMINING +CALCINATION +CALCINATIONS +CALCINE +CALCINED +CALCINES +CALCINING +CALCINOSES +CALCINOSIS +CALCITE +CALCITES +CALCITIC +CALCITONIN +CALCITONINS +CALCIUM +CALCIUMS +CALCSPAR +CALCSPARS +CALCTUFA +CALCTUFAS +CALCTUFF +CALCTUFFS +CALCULABLE +CALCULATE +CALCULATED +CALCULATEDLY +CALCULATEDNESS +CALCULATES +CALCULATING +CALCULATINGLY +CALCULATION +CALCULATIONAL +CALCULATIONS +CALCULATOR +CALCULATORS +CALCULI +CALCULOUS +CALCULUS +CALCULUSES +CALDARIA +CALDARIUM +CALDERA +CALDERAS +CALDRON +CALDRONS +CALECHE +CALECHES +CALEFACTORIES +CALEFACTORY +CALENDAL +CALENDAR +CALENDARED +CALENDARING +CALENDARS +CALENDER +CALENDERED +CALENDERER +CALENDERERS +CALENDERING +CALENDERS +CALENDRIC +CALENDRICAL +CALENDS +CALENDULA +CALENDULAS +CALENTURE +CALENTURES +CALESA +CALESAS +CALESCENT +CALF +CALFLIKE +CALFS +CALFSKIN +CALFSKINS +CALIBER +CALIBERS +CALIBRATE +CALIBRATED +CALIBRATES +CALIBRATING +CALIBRATION +CALIBRATIONS +CALIBRATOR +CALIBRATORS +CALIBRE +CALIBRED +CALIBRES +CALICES +CALICHE +CALICHES +CALICLE +CALICLES +CALICO +CALICOES +CALICOS +CALIF +CALIFATE +CALIFATES +CALIFORNIUM +CALIFORNIUMS +CALIFS +CALIGINOUS +CALIPASH +CALIPASHES +CALIPEE +CALIPEES +CALIPER +CALIPERED +CALIPERING +CALIPERS +CALIPH +CALIPHAL +CALIPHATE +CALIPHATES +CALIPHS +CALISAYA +CALISAYAS +CALISTHENIC +CALISTHENICS +CALIX +CALK +CALKED +CALKER +CALKERS +CALKIN +CALKING +CALKINGS +CALKINS +CALKS +CALL +CALLA +CALLABLE +CALLALOO +CALLALOOS +CALLAN +CALLANS +CALLANT +CALLANTS +CALLAS +CALLBACK +CALLBACKS +CALLBOARD +CALLBOARDS +CALLBOY +CALLBOYS +CALLED +CALLEE +CALLEES +CALLER +CALLERS +CALLET +CALLETS +CALLIGRAPHER +CALLIGRAPHERS +CALLIGRAPHIC +CALLIGRAPHIES +CALLIGRAPHIST +CALLIGRAPHISTS +CALLIGRAPHY +CALLING +CALLINGS +CALLIOPE +CALLIOPES +CALLIPEE +CALLIPEES +CALLIPER +CALLIPERED +CALLIPERING +CALLIPERS +CALLIPYGIAN +CALLIPYGOUS +CALLITHUMP +CALLITHUMPIAN +CALLITHUMPS +CALLOSE +CALLOSES +CALLOSITIES +CALLOSITY +CALLOUS +CALLOUSED +CALLOUSES +CALLOUSING +CALLOUSLY +CALLOUSNESS +CALLOUSNESSES +CALLOW +CALLOWER +CALLOWEST +CALLOWNESS +CALLOWNESSES +CALLS +CALLUS +CALLUSED +CALLUSES +CALLUSING +CALM +CALMATIVE +CALMATIVES +CALMED +CALMER +CALMEST +CALMING +CALMINGLY +CALMLY +CALMNESS +CALMNESSES +CALMODULIN +CALMODULINS +CALMS +CALO +CALOMEL +CALOMELS +CALORIC +CALORICALLY +CALORICS +CALORIE +CALORIES +CALORIFIC +CALORIMETER +CALORIMETERS +CALORIMETRIC +CALORIMETRIES +CALORIMETRY +CALORIZE +CALORIZED +CALORIZES +CALORIZING +CALORY +CALOS +CALOTTE +CALOTTES +CALOTYPE +CALOTYPES +CALOYER +CALOYERS +CALPAC +CALPACK +CALPACKS +CALPACS +CALPAIN +CALPAINS +CALQUE +CALQUED +CALQUES +CALQUING +CALTHROP +CALTHROPS +CALTRAP +CALTRAPS +CALTROP +CALTROPS +CALUMET +CALUMETS +CALUMNIATE +CALUMNIATED +CALUMNIATES +CALUMNIATING +CALUMNIATION +CALUMNIATIONS +CALUMNIATOR +CALUMNIATORS +CALUMNIES +CALUMNIOUS +CALUMNIOUSLY +CALUMNY +CALUTRON +CALUTRONS +CALVADOS +CALVADOSES +CALVARIA +CALVARIAL +CALVARIAN +CALVARIAS +CALVARIES +CALVARIUM +CALVARIUMS +CALVARY +CALVE +CALVED +CALVES +CALVING +CALVITIES +CALX +CALXES +CALYCATE +CALYCEAL +CALYCES +CALYCINAL +CALYCINE +CALYCLE +CALYCLES +CALYCULAR +CALYCULI +CALYCULUS +CALYPSO +CALYPSOES +CALYPSONIAN +CALYPSONIANS +CALYPSOS +CALYPTER +CALYPTERS +CALYPTRA +CALYPTRAS +CALYX +CALYXES +CALZONE +CALZONES +CAM +CAMAIL +CAMAILED +CAMAILS +CAMARADERIE +CAMARADERIES +CAMARILLA +CAMARILLAS +CAMAS +CAMASES +CAMASS +CAMASSES +CAMBER +CAMBERED +CAMBERING +CAMBERS +CAMBIA +CAMBIAL +CAMBISM +CAMBISMS +CAMBIST +CAMBISTS +CAMBIUM +CAMBIUMS +CAMBOGIA +CAMBOGIAS +CAMBRIC +CAMBRICS +CAMCORDER +CAMCORDERS +CAME +CAMEL +CAMELBACK +CAMELBACKS +CAMELEER +CAMELEERS +CAMELHAIR +CAMELHAIRS +CAMELIA +CAMELIAS +CAMELID +CAMELIDS +CAMELLIA +CAMELLIAS +CAMELLIKE +CAMELOPARD +CAMELOPARDS +CAMELS +CAMEO +CAMEOED +CAMEOING +CAMEOS +CAMERA +CAMERAE +CAMERAL +CAMERAMAN +CAMERAMEN +CAMERAPERSON +CAMERAPERSONS +CAMERAS +CAMERAWOMAN +CAMERAWOMEN +CAMERLENGO +CAMERLENGOS +CAMES +CAMION +CAMIONS +CAMISA +CAMISADE +CAMISADES +CAMISADO +CAMISADOES +CAMISADOS +CAMISAS +CAMISE +CAMISES +CAMISIA +CAMISIAS +CAMISOLE +CAMISOLES +CAMLET +CAMLETS +CAMMIE +CAMMIES +CAMO +CAMOMILE +CAMOMILES +CAMORRA +CAMORRAS +CAMORRIST +CAMORRISTA +CAMORRISTI +CAMORRISTS +CAMOS +CAMOUFLAGE +CAMOUFLAGEABLE +CAMOUFLAGED +CAMOUFLAGES +CAMOUFLAGIC +CAMOUFLAGING +CAMP +CAMPAGNA +CAMPAGNE +CAMPAIGN +CAMPAIGNED +CAMPAIGNER +CAMPAIGNERS +CAMPAIGNING +CAMPAIGNS +CAMPANILE +CAMPANILES +CAMPANILI +CAMPANOLOGIES +CAMPANOLOGIST +CAMPANOLOGISTS +CAMPANOLOGY +CAMPANULA +CAMPANULAS +CAMPANULATE +CAMPCRAFT +CAMPCRAFTS +CAMPED +CAMPER +CAMPERS +CAMPESINO +CAMPESINOS +CAMPESTRAL +CAMPFIRE +CAMPFIRES +CAMPGROUND +CAMPGROUNDS +CAMPHENE +CAMPHENES +CAMPHINE +CAMPHINES +CAMPHIRE +CAMPHIRES +CAMPHOL +CAMPHOLS +CAMPHOR +CAMPHORACEOUS +CAMPHORATE +CAMPHORATED +CAMPHORATES +CAMPHORATING +CAMPHORIC +CAMPHORS +CAMPI +CAMPIER +CAMPIEST +CAMPILY +CAMPINESS +CAMPINESSES +CAMPING +CAMPINGS +CAMPION +CAMPIONS +CAMPO +CAMPONG +CAMPONGS +CAMPOREE +CAMPOREES +CAMPOS +CAMPOUT +CAMPOUTS +CAMPS +CAMPSHIRT +CAMPSHIRTS +CAMPSITE +CAMPSITES +CAMPSTOOL +CAMPSTOOLS +CAMPUS +CAMPUSED +CAMPUSES +CAMPUSING +CAMPY +CAMPYLOBACTER +CAMPYLOBACTERS +CAMPYLOTROPOUS +CAMS +CAMSHAFT +CAMSHAFTS +CAN +CANAILLE +CANAILLES +CANAKIN +CANAKINS +CANAL +CANALBOAT +CANALBOATS +CANALED +CANALICULAR +CANALICULI +CANALICULUS +CANALING +CANALISE +CANALISED +CANALISES +CANALISING +CANALIZATION +CANALIZATIONS +CANALIZE +CANALIZED +CANALIZES +CANALIZING +CANALLED +CANALLER +CANALLERS +CANALLING +CANALS +CANAPE +CANAPES +CANARD +CANARDS +CANARIES +CANARY +CANASTA +CANASTAS +CANCAN +CANCANS +CANCEL +CANCELABLE +CANCELATION +CANCELATIONS +CANCELED +CANCELER +CANCELERS +CANCELING +CANCELLABLE +CANCELLATION +CANCELLATIONS +CANCELLED +CANCELLER +CANCELLERS +CANCELLING +CANCELLOUS +CANCELS +CANCER +CANCERED +CANCEROUS +CANCEROUSLY +CANCERS +CANCHA +CANCHAS +CANCROID +CANCROIDS +CANDELA +CANDELABRA +CANDELABRAS +CANDELABRUM +CANDELABRUMS +CANDELAS +CANDENT +CANDESCENCE +CANDESCENCES +CANDESCENT +CANDID +CANDIDA +CANDIDACIES +CANDIDACY +CANDIDAL +CANDIDAS +CANDIDATE +CANDIDATES +CANDIDATURE +CANDIDATURES +CANDIDER +CANDIDEST +CANDIDIASES +CANDIDIASIS +CANDIDLY +CANDIDNESS +CANDIDNESSES +CANDIDS +CANDIED +CANDIES +CANDLE +CANDLEBERRIES +CANDLEBERRY +CANDLED +CANDLEFISH +CANDLEFISHES +CANDLEHOLDER +CANDLEHOLDERS +CANDLELIGHT +CANDLELIGHTED +CANDLELIGHTER +CANDLELIGHTERS +CANDLELIGHTS +CANDLELIT +CANDLENUT +CANDLENUTS +CANDLEPIN +CANDLEPINS +CANDLEPOWER +CANDLEPOWERS +CANDLER +CANDLERS +CANDLES +CANDLESNUFFER +CANDLESNUFFERS +CANDLESTICK +CANDLESTICKS +CANDLEWICK +CANDLEWICKS +CANDLEWOOD +CANDLEWOODS +CANDLING +CANDOR +CANDORS +CANDOUR +CANDOURS +CANDY +CANDYFLOSS +CANDYFLOSSES +CANDYGRAM +CANDYGRAMS +CANDYING +CANDYTUFT +CANDYTUFTS +CANE +CANEBRAKE +CANEBRAKES +CANED +CANELLA +CANELLAS +CANEPHOR +CANEPHORS +CANER +CANERS +CANES +CANESCENT +CANEWARE +CANEWARES +CANFIELD +CANFIELDS +CANFUL +CANFULS +CANGUE +CANGUES +CANICULAR +CANID +CANIDS +CANIKIN +CANIKINS +CANINE +CANINES +CANING +CANINITIES +CANINITY +CANISTEL +CANISTELS +CANISTER +CANISTERS +CANITIES +CANKER +CANKERED +CANKERING +CANKEROUS +CANKERS +CANKERWORM +CANKERWORMS +CANNA +CANNABIC +CANNABIN +CANNABINOID +CANNABINOIDS +CANNABINOL +CANNABINOLS +CANNABINS +CANNABIS +CANNABISES +CANNAS +CANNED +CANNEL +CANNELLONI +CANNELON +CANNELONS +CANNELS +CANNER +CANNERIES +CANNERS +CANNERY +CANNIBAL +CANNIBALISE +CANNIBALISED +CANNIBALISES +CANNIBALISING +CANNIBALISM +CANNIBALISMS +CANNIBALISTIC +CANNIBALIZATION +CANNIBALIZE +CANNIBALIZED +CANNIBALIZES +CANNIBALIZING +CANNIBALS +CANNIE +CANNIER +CANNIEST +CANNIKIN +CANNIKINS +CANNILY +CANNINESS +CANNINESSES +CANNING +CANNINGS +CANNISTER +CANNISTERS +CANNOLI +CANNOLIS +CANNON +CANNONADE +CANNONADED +CANNONADES +CANNONADING +CANNONBALL +CANNONBALLED +CANNONBALLING +CANNONBALLS +CANNONED +CANNONEER +CANNONEERS +CANNONING +CANNONRIES +CANNONRY +CANNONS +CANNOT +CANNULA +CANNULAE +CANNULAR +CANNULAS +CANNULATE +CANNULATED +CANNULATES +CANNULATING +CANNY +CANOE +CANOEABLE +CANOED +CANOEING +CANOEIST +CANOEISTS +CANOER +CANOERS +CANOES +CANOLA +CANOLAS +CANON +CANONESS +CANONESSES +CANONIC +CANONICAL +CANONICALLY +CANONICALS +CANONICITIES +CANONICITY +CANONISE +CANONISED +CANONISES +CANONISING +CANONIST +CANONISTS +CANONIZATION +CANONIZATIONS +CANONIZE +CANONIZED +CANONIZER +CANONIZERS +CANONIZES +CANONIZING +CANONRIES +CANONRY +CANONS +CANOODLE +CANOODLED +CANOODLES +CANOODLING +CANOPIC +CANOPIED +CANOPIES +CANOPY +CANOPYING +CANOROUS +CANOROUSLY +CANOROUSNESS +CANOROUSNESSES +CANS +CANSFUL +CANSO +CANSOS +CANST +CANT +CANTABILE +CANTABILES +CANTAL +CANTALA +CANTALAS +CANTALOUP +CANTALOUPE +CANTALOUPES +CANTALOUPS +CANTALS +CANTANKEROUS +CANTANKEROUSLY +CANTATA +CANTATAS +CANTATRICE +CANTATRICES +CANTATRICI +CANTDOG +CANTDOGS +CANTED +CANTEEN +CANTEENS +CANTER +CANTERED +CANTERING +CANTERS +CANTHAL +CANTHARIDES +CANTHARIDIN +CANTHARIDINS +CANTHARIS +CANTHAXANTHIN +CANTHAXANTHINS +CANTHI +CANTHITIS +CANTHITISES +CANTHUS +CANTIC +CANTICLE +CANTICLES +CANTILENA +CANTILENAS +CANTILEVER +CANTILEVERED +CANTILEVERING +CANTILEVERS +CANTILLATE +CANTILLATED +CANTILLATES +CANTILLATING +CANTILLATION +CANTILLATIONS +CANTINA +CANTINAS +CANTING +CANTLE +CANTLES +CANTO +CANTON +CANTONAL +CANTONED +CANTONING +CANTONMENT +CANTONMENTS +CANTONS +CANTOR +CANTORIAL +CANTORS +CANTOS +CANTRAIP +CANTRAIPS +CANTRAP +CANTRAPS +CANTRIP +CANTRIPS +CANTS +CANTUS +CANTY +CANULA +CANULAE +CANULAR +CANULAS +CANULATE +CANULATED +CANULATES +CANULATING +CANVAS +CANVASBACK +CANVASBACKS +CANVASED +CANVASER +CANVASERS +CANVASES +CANVASING +CANVASLIKE +CANVASS +CANVASSED +CANVASSER +CANVASSERS +CANVASSES +CANVASSING +CANYON +CANYONEER +CANYONEERS +CANYONING +CANYONINGS +CANYONS +CANZONA +CANZONAS +CANZONE +CANZONES +CANZONET +CANZONETS +CANZONI +CAOUTCHOUC +CAOUTCHOUCS +CAP +CAPABILITIES +CAPABILITY +CAPABLE +CAPABLENESS +CAPABLENESSES +CAPABLER +CAPABLEST +CAPABLY +CAPACIOUS +CAPACIOUSLY +CAPACIOUSNESS +CAPACIOUSNESSES +CAPACITANCE +CAPACITANCES +CAPACITATE +CAPACITATED +CAPACITATES +CAPACITATING +CAPACITATION +CAPACITATIONS +CAPACITIES +CAPACITIVE +CAPACITIVELY +CAPACITOR +CAPACITORS +CAPACITY +CAPARISON +CAPARISONED +CAPARISONING +CAPARISONS +CAPE +CAPED +CAPELAN +CAPELANS +CAPELET +CAPELETS +CAPELIN +CAPELINS +CAPELLINI +CAPER +CAPERCAILLIE +CAPERCAILLIES +CAPERCAILZIE +CAPERCAILZIES +CAPERED +CAPERER +CAPERERS +CAPERING +CAPERS +CAPES +CAPESKIN +CAPESKINS +CAPEWORK +CAPEWORKS +CAPFUL +CAPFULS +CAPH +CAPHS +CAPIAS +CAPIASES +CAPILLARIES +CAPILLARITIES +CAPILLARITY +CAPILLARY +CAPITA +CAPITAL +CAPITALISE +CAPITALISED +CAPITALISES +CAPITALISING +CAPITALISM +CAPITALISMS +CAPITALIST +CAPITALISTIC +CAPITALISTS +CAPITALIZATION +CAPITALIZATIONS +CAPITALIZE +CAPITALIZED +CAPITALIZES +CAPITALIZING +CAPITALLY +CAPITALS +CAPITATE +CAPITATED +CAPITATION +CAPITATIONS +CAPITELLA +CAPITELLUM +CAPITOL +CAPITOLS +CAPITULA +CAPITULAR +CAPITULARIES +CAPITULARY +CAPITULATE +CAPITULATED +CAPITULATES +CAPITULATING +CAPITULATION +CAPITULATIONS +CAPITULUM +CAPIZ +CAPIZES +CAPLESS +CAPLET +CAPLETS +CAPLIN +CAPLINS +CAPMAKER +CAPMAKERS +CAPO +CAPOEIRA +CAPOEIRAS +CAPON +CAPONATA +CAPONATAS +CAPONIER +CAPONIERS +CAPONIZE +CAPONIZED +CAPONIZES +CAPONIZING +CAPONS +CAPORAL +CAPORALS +CAPOS +CAPOTE +CAPOTES +CAPOUCH +CAPOUCHES +CAPPED +CAPPELLETTI +CAPPER +CAPPERS +CAPPING +CAPPINGS +CAPPUCCINO +CAPPUCCINOS +CAPRIC +CAPRICCI +CAPRICCIO +CAPRICCIOS +CAPRICE +CAPRICES +CAPRICIOUS +CAPRICIOUSLY +CAPRICIOUSNESS +CAPRIFICATION +CAPRIFICATIONS +CAPRIFIG +CAPRIFIGS +CAPRINE +CAPRIOLE +CAPRIOLED +CAPRIOLES +CAPRIOLING +CAPRIS +CAPROCK +CAPROCKS +CAPROLACTAM +CAPROLACTAMS +CAPS +CAPSAICIN +CAPSAICINS +CAPSICIN +CAPSICINS +CAPSICUM +CAPSICUMS +CAPSID +CAPSIDAL +CAPSIDS +CAPSIZE +CAPSIZED +CAPSIZES +CAPSIZING +CAPSOMER +CAPSOMERE +CAPSOMERES +CAPSOMERS +CAPSTAN +CAPSTANS +CAPSTONE +CAPSTONES +CAPSULAR +CAPSULATE +CAPSULATED +CAPSULE +CAPSULED +CAPSULES +CAPSULING +CAPSULIZE +CAPSULIZED +CAPSULIZES +CAPSULIZING +CAPTAIN +CAPTAINCIES +CAPTAINCY +CAPTAINED +CAPTAINING +CAPTAINS +CAPTAINSHIP +CAPTAINSHIPS +CAPTAN +CAPTANS +CAPTION +CAPTIONED +CAPTIONING +CAPTIONLESS +CAPTIONS +CAPTIOUS +CAPTIOUSLY +CAPTIOUSNESS +CAPTIOUSNESSES +CAPTIVATE +CAPTIVATED +CAPTIVATES +CAPTIVATING +CAPTIVATION +CAPTIVATIONS +CAPTIVATOR +CAPTIVATORS +CAPTIVE +CAPTIVES +CAPTIVITIES +CAPTIVITY +CAPTOPRIL +CAPTOPRILS +CAPTOR +CAPTORS +CAPTURE +CAPTURED +CAPTURER +CAPTURERS +CAPTURES +CAPTURING +CAPUCHE +CAPUCHED +CAPUCHES +CAPUCHIN +CAPUCHINS +CAPUT +CAPYBARA +CAPYBARAS +CAR +CARABAO +CARABAOS +CARABID +CARABIDS +CARABIN +CARABINE +CARABINEER +CARABINEERS +CARABINER +CARABINERO +CARABINEROS +CARABINERS +CARABINES +CARABINIER +CARABINIERE +CARABINIERI +CARABINIERS +CARABINS +CARACAL +CARACALS +CARACARA +CARACARAS +CARACK +CARACKS +CARACOL +CARACOLE +CARACOLED +CARACOLER +CARACOLERS +CARACOLES +CARACOLING +CARACOLLED +CARACOLLING +CARACOLS +CARACUL +CARACULS +CARAFE +CARAFES +CARAGANA +CARAGANAS +CARAGEEN +CARAGEENS +CARAMBA +CARAMBOLA +CARAMBOLAS +CARAMEL +CARAMELISE +CARAMELISED +CARAMELISES +CARAMELISING +CARAMELIZE +CARAMELIZED +CARAMELIZES +CARAMELIZING +CARAMELS +CARANGID +CARANGIDS +CARANGOID +CARAPACE +CARAPACED +CARAPACES +CARAPAX +CARAPAXES +CARASSOW +CARASSOWS +CARAT +CARATE +CARATES +CARATS +CARAVAN +CARAVANED +CARAVANER +CARAVANERS +CARAVANING +CARAVANNED +CARAVANNER +CARAVANNERS +CARAVANNING +CARAVANS +CARAVANSARIES +CARAVANSARY +CARAVANSERAI +CARAVANSERAIS +CARAVEL +CARAVELLE +CARAVELLES +CARAVELS +CARAWAY +CARAWAYS +CARB +CARBACHOL +CARBACHOLS +CARBAMATE +CARBAMATES +CARBAMIC +CARBAMIDE +CARBAMIDES +CARBAMINO +CARBAMOYL +CARBAMOYLS +CARBAMYL +CARBAMYLS +CARBANION +CARBANIONS +CARBARN +CARBARNS +CARBARYL +CARBARYLS +CARBAZOLE +CARBAZOLES +CARBIDE +CARBIDES +CARBINE +CARBINEER +CARBINEERS +CARBINES +CARBINOL +CARBINOLS +CARBO +CARBOCYCLIC +CARBOHYDRASE +CARBOHYDRASES +CARBOHYDRATE +CARBOHYDRATES +CARBOLIC +CARBOLICS +CARBOLIZE +CARBOLIZED +CARBOLIZES +CARBOLIZING +CARBON +CARBONACEOUS +CARBONADE +CARBONADES +CARBONADO +CARBONADOED +CARBONADOES +CARBONADOING +CARBONADOS +CARBONARA +CARBONARAS +CARBONATE +CARBONATED +CARBONATES +CARBONATING +CARBONATION +CARBONATIONS +CARBONIC +CARBONIFEROUS +CARBONIUM +CARBONIUMS +CARBONIZATION +CARBONIZATIONS +CARBONIZE +CARBONIZED +CARBONIZES +CARBONIZING +CARBONLESS +CARBONNADE +CARBONNADES +CARBONOUS +CARBONS +CARBONYL +CARBONYLATION +CARBONYLATIONS +CARBONYLIC +CARBONYLS +CARBORA +CARBORAS +CARBOS +CARBOXYL +CARBOXYLASE +CARBOXYLASES +CARBOXYLATE +CARBOXYLATED +CARBOXYLATES +CARBOXYLATING +CARBOXYLATION +CARBOXYLATIONS +CARBOXYLIC +CARBOXYLS +CARBOY +CARBOYED +CARBOYS +CARBS +CARBUNCLE +CARBUNCLED +CARBUNCLES +CARBUNCULAR +CARBURET +CARBURETED +CARBURETING +CARBURETION +CARBURETIONS +CARBURETOR +CARBURETORS +CARBURETS +CARBURETTED +CARBURETTER +CARBURETTERS +CARBURETTING +CARBURETTOR +CARBURETTORS +CARBURISE +CARBURISED +CARBURISES +CARBURISING +CARBURIZATION +CARBURIZATIONS +CARBURIZE +CARBURIZED +CARBURIZES +CARBURIZING +CARCAJOU +CARCAJOUS +CARCANET +CARCANETS +CARCASE +CARCASES +CARCASS +CARCASSES +CARCEL +CARCELS +CARCERAL +CARCINOGEN +CARCINOGENESES +CARCINOGENESIS +CARCINOGENIC +CARCINOGENICITY +CARCINOGENS +CARCINOID +CARCINOIDS +CARCINOMA +CARCINOMAS +CARCINOMATA +CARCINOMATOSES +CARCINOMATOSIS +CARCINOMATOUS +CARCINOSARCOMA +CARCINOSARCOMAS +CARD +CARDAMOM +CARDAMOMS +CARDAMON +CARDAMONS +CARDAMUM +CARDAMUMS +CARDBOARD +CARDBOARDS +CARDCASE +CARDCASES +CARDED +CARDER +CARDERS +CARDHOLDER +CARDHOLDERS +CARDIA +CARDIAC +CARDIACS +CARDIAE +CARDIAS +CARDIGAN +CARDIGANS +CARDINAL +CARDINALATE +CARDINALATES +CARDINALITIES +CARDINALITY +CARDINALLY +CARDINALS +CARDINALSHIP +CARDINALSHIPS +CARDING +CARDINGS +CARDIO +CARDIOGENIC +CARDIOGRAM +CARDIOGRAMS +CARDIOGRAPH +CARDIOGRAPHIC +CARDIOGRAPHIES +CARDIOGRAPHS +CARDIOGRAPHY +CARDIOID +CARDIOIDS +CARDIOLOGICAL +CARDIOLOGIES +CARDIOLOGIST +CARDIOLOGISTS +CARDIOLOGY +CARDIOMYOPATHY +CARDIOPATHIES +CARDIOPATHY +CARDIOPULMONARY +CARDIOTHORACIC +CARDIOTONIC +CARDIOTONICS +CARDIOVASCULAR +CARDITIC +CARDITIS +CARDITISES +CARDON +CARDONS +CARDOON +CARDOONS +CARDPLAYER +CARDPLAYERS +CARDS +CARDSHARP +CARDSHARPER +CARDSHARPERS +CARDSHARPS +CARE +CARED +CAREEN +CAREENED +CAREENER +CAREENERS +CAREENING +CAREENS +CAREER +CAREERED +CAREERER +CAREERERS +CAREERING +CAREERISM +CAREERISMS +CAREERIST +CAREERISTS +CAREERS +CAREFREE +CAREFUL +CAREFULLER +CAREFULLEST +CAREFULLY +CAREFULNESS +CAREFULNESSES +CAREGIVER +CAREGIVERS +CAREGIVING +CAREGIVINGS +CARELESS +CARELESSLY +CARELESSNESS +CARELESSNESSES +CARER +CARERS +CARES +CARESS +CARESSED +CARESSER +CARESSERS +CARESSES +CARESSING +CARESSINGLY +CARESSIVE +CARESSIVELY +CARET +CARETAKE +CARETAKEN +CARETAKER +CARETAKERS +CARETAKES +CARETAKING +CARETAKINGS +CARETOOK +CARETS +CAREWORN +CAREX +CARFARE +CARFARES +CARFUL +CARFULS +CARGO +CARGOES +CARGOS +CARHOP +CARHOPPED +CARHOPPING +CARHOPS +CARIBE +CARIBES +CARIBOU +CARIBOUS +CARICATURAL +CARICATURE +CARICATURED +CARICATURES +CARICATURING +CARICATURIST +CARICATURISTS +CARICES +CARIED +CARIES +CARILLON +CARILLONNED +CARILLONNEUR +CARILLONNEURS +CARILLONNING +CARILLONS +CARINA +CARINAE +CARINAL +CARINAS +CARINATE +CARINATED +CARING +CARIOCA +CARIOCAS +CARIOGENIC +CARIOLE +CARIOLES +CARIOSITIES +CARIOSITY +CARIOUS +CARITAS +CARITASES +CARJACK +CARJACKED +CARJACKER +CARJACKERS +CARJACKING +CARJACKINGS +CARJACKS +CARK +CARKED +CARKING +CARKS +CARL +CARLE +CARLES +CARLESS +CARLIN +CARLINE +CARLINES +CARLING +CARLINGS +CARLINS +CARLISH +CARLOAD +CARLOADS +CARLS +CARMAGNOLE +CARMAGNOLES +CARMAKER +CARMAKERS +CARMAN +CARMEN +CARMINATIVE +CARMINATIVES +CARMINE +CARMINES +CARN +CARNAGE +CARNAGES +CARNAL +CARNALITIES +CARNALITY +CARNALLITE +CARNALLITES +CARNALLY +CARNASSIAL +CARNASSIALS +CARNATION +CARNATIONS +CARNAUBA +CARNAUBAS +CARNELIAN +CARNELIANS +CARNET +CARNETS +CARNEY +CARNEYS +CARNIE +CARNIES +CARNIFIED +CARNIFIES +CARNIFY +CARNIFYING +CARNITINE +CARNITINES +CARNIVAL +CARNIVALS +CARNIVORA +CARNIVORE +CARNIVORES +CARNIVORIES +CARNIVOROUS +CARNIVOROUSLY +CARNIVOROUSNESS +CARNIVORY +CARNOSAUR +CARNOSAURS +CARNOTITE +CARNOTITES +CARNS +CARNY +CAROACH +CAROACHES +CAROB +CAROBS +CAROCH +CAROCHE +CAROCHES +CAROL +CAROLED +CAROLER +CAROLERS +CAROLI +CAROLING +CAROLLED +CAROLLER +CAROLLERS +CAROLLING +CAROLS +CAROLUS +CAROLUSES +CAROM +CAROMED +CAROMING +CAROMS +CAROTENE +CAROTENES +CAROTENOID +CAROTENOIDS +CAROTID +CAROTIDAL +CAROTIDS +CAROTIN +CAROTINOID +CAROTINOIDS +CAROTINS +CAROUSAL +CAROUSALS +CAROUSE +CAROUSED +CAROUSEL +CAROUSELS +CAROUSER +CAROUSERS +CAROUSES +CAROUSING +CARP +CARPACCIO +CARPACCIOS +CARPAL +CARPALE +CARPALIA +CARPALS +CARPED +CARPEL +CARPELLARY +CARPELLATE +CARPELS +CARPENTER +CARPENTERED +CARPENTERING +CARPENTERS +CARPENTRIES +CARPENTRY +CARPER +CARPERS +CARPET +CARPETBAG +CARPETBAGGED +CARPETBAGGER +CARPETBAGGERIES +CARPETBAGGERS +CARPETBAGGERY +CARPETBAGGING +CARPETBAGS +CARPETED +CARPETING +CARPETINGS +CARPETS +CARPETWEED +CARPETWEEDS +CARPI +CARPING +CARPINGLY +CARPINGS +CARPOGONIA +CARPOGONIAL +CARPOGONIUM +CARPOLOGIES +CARPOLOGY +CARPOOL +CARPOOLED +CARPOOLER +CARPOOLERS +CARPOOLING +CARPOOLS +CARPOPHORE +CARPOPHORES +CARPORT +CARPORTS +CARPOSPORE +CARPOSPORES +CARPS +CARPUS +CARR +CARRACK +CARRACKS +CARRAGEEN +CARRAGEENAN +CARRAGEENANS +CARRAGEENIN +CARRAGEENINS +CARRAGEENS +CARRAGHEEN +CARRAGHEENS +CARREFOUR +CARREFOURS +CARREL +CARRELL +CARRELLS +CARRELS +CARRIAGE +CARRIAGES +CARRIAGEWAY +CARRIAGEWAYS +CARRIED +CARRIER +CARRIERS +CARRIES +CARRIOLE +CARRIOLES +CARRION +CARRIONS +CARRITCH +CARRITCHES +CARROCH +CARROCHES +CARROM +CARROMED +CARROMING +CARROMS +CARRONADE +CARRONADES +CARROT +CARROTIER +CARROTIEST +CARROTIN +CARROTINS +CARROTS +CARROTTOP +CARROTTOPPED +CARROTTOPS +CARROTY +CARROUSEL +CARROUSELS +CARRS +CARRY +CARRYALL +CARRYALLS +CARRYBACK +CARRYBACKS +CARRYFORWARD +CARRYFORWARDS +CARRYING +CARRYON +CARRYONS +CARRYOUT +CARRYOUTS +CARRYOVER +CARRYOVERS +CARS +CARSE +CARSES +CARSICK +CART +CARTABLE +CARTAGE +CARTAGES +CARTE +CARTED +CARTEL +CARTELISE +CARTELISED +CARTELISES +CARTELISING +CARTELIZATION +CARTELIZATIONS +CARTELIZE +CARTELIZED +CARTELIZES +CARTELIZING +CARTELS +CARTER +CARTERS +CARTES +CARTHORSE +CARTHORSES +CARTILAGE +CARTILAGES +CARTILAGINOUS +CARTING +CARTLOAD +CARTLOADS +CARTOGRAM +CARTOGRAMS +CARTOGRAPHER +CARTOGRAPHERS +CARTOGRAPHIC +CARTOGRAPHICAL +CARTOGRAPHIES +CARTOGRAPHY +CARTON +CARTONED +CARTONING +CARTONS +CARTOON +CARTOONED +CARTOONING +CARTOONINGS +CARTOONISH +CARTOONISHLY +CARTOONIST +CARTOONISTS +CARTOONLIKE +CARTOONS +CARTOONY +CARTOP +CARTOPPER +CARTOPPERS +CARTOUCH +CARTOUCHE +CARTOUCHES +CARTRIDGE +CARTRIDGES +CARTS +CARTULARIES +CARTULARY +CARTWHEEL +CARTWHEELED +CARTWHEELER +CARTWHEELERS +CARTWHEELING +CARTWHEELS +CARUNCLE +CARUNCLES +CARVACROL +CARVACROLS +CARVE +CARVED +CARVEL +CARVELS +CARVEN +CARVER +CARVERS +CARVES +CARVING +CARVINGS +CARWASH +CARWASHES +CARYATIC +CARYATID +CARYATIDES +CARYATIDS +CARYOPSES +CARYOPSIDES +CARYOPSIS +CARYOTIN +CARYOTINS +CASA +CASABA +CASABAS +CASAS +CASAVA +CASAVAS +CASBAH +CASBAHS +CASCABEL +CASCABELS +CASCABLE +CASCABLES +CASCADE +CASCADED +CASCADES +CASCADING +CASCARA +CASCARAS +CASCARILLA +CASCARILLAS +CASE +CASEASE +CASEASES +CASEATE +CASEATED +CASEATES +CASEATING +CASEATION +CASEATIONS +CASEBEARER +CASEBEARERS +CASEBOOK +CASEBOOKS +CASED +CASEFIED +CASEFIES +CASEFY +CASEFYING +CASEIC +CASEIN +CASEINATE +CASEINATES +CASEINS +CASELOAD +CASELOADS +CASEMATE +CASEMATED +CASEMATES +CASEMENT +CASEMENTS +CASEOSE +CASEOSES +CASEOUS +CASERN +CASERNE +CASERNES +CASERNS +CASES +CASETTE +CASETTES +CASEWORK +CASEWORKER +CASEWORKERS +CASEWORKS +CASEWORM +CASEWORMS +CASH +CASHABLE +CASHAW +CASHAWS +CASHBOOK +CASHBOOKS +CASHBOX +CASHBOXES +CASHED +CASHES +CASHEW +CASHEWS +CASHIER +CASHIERED +CASHIERING +CASHIERS +CASHING +CASHLESS +CASHMERE +CASHMERES +CASHOO +CASHOOS +CASHPOINT +CASHPOINTS +CASIMERE +CASIMERES +CASIMIRE +CASIMIRES +CASING +CASINGS +CASINI +CASINO +CASINOS +CASITA +CASITAS +CASK +CASKED +CASKET +CASKETED +CASKETING +CASKETS +CASKING +CASKS +CASKY +CASQUE +CASQUED +CASQUES +CASSABA +CASSABAS +CASSATA +CASSATAS +CASSATION +CASSATIONS +CASSAVA +CASSAVAS +CASSENA +CASSENAS +CASSENE +CASSENES +CASSEROLE +CASSEROLES +CASSETTE +CASSETTES +CASSIA +CASSIAS +CASSIMERE +CASSIMERES +CASSINA +CASSINAS +CASSINE +CASSINES +CASSINGLE +CASSINGLES +CASSINO +CASSINOS +CASSIS +CASSISES +CASSITERITE +CASSITERITES +CASSOCK +CASSOCKS +CASSOULET +CASSOULETS +CASSOWARIES +CASSOWARY +CAST +CASTABILITIES +CASTABILITY +CASTABLE +CASTANET +CASTANETS +CASTAWAY +CASTAWAYS +CASTE +CASTEISM +CASTEISMS +CASTELLAN +CASTELLANS +CASTELLATED +CASTER +CASTERS +CASTES +CASTIGATE +CASTIGATED +CASTIGATES +CASTIGATING +CASTIGATION +CASTIGATIONS +CASTIGATOR +CASTIGATORS +CASTING +CASTINGS +CASTLE +CASTLED +CASTLES +CASTLING +CASTOFF +CASTOFFS +CASTOR +CASTOREUM +CASTOREUMS +CASTORS +CASTRATE +CASTRATED +CASTRATER +CASTRATERS +CASTRATES +CASTRATI +CASTRATING +CASTRATION +CASTRATIONS +CASTRATO +CASTRATOR +CASTRATORS +CASTRATORY +CASTRATOS +CASTS +CASUAL +CASUALLY +CASUALNESS +CASUALNESSES +CASUALS +CASUALTIES +CASUALTY +CASUARINA +CASUARINAS +CASUIST +CASUISTIC +CASUISTICAL +CASUISTRIES +CASUISTRY +CASUISTS +CASUS +CAT +CATABOLIC +CATABOLICALLY +CATABOLISM +CATABOLISMS +CATABOLITE +CATABOLITES +CATABOLIZE +CATABOLIZED +CATABOLIZES +CATABOLIZING +CATACHRESES +CATACHRESIS +CATACHRESTIC +CATACHRESTICAL +CATACLYSM +CATACLYSMAL +CATACLYSMIC +CATACLYSMICALLY +CATACLYSMS +CATACOMB +CATACOMBS +CATADIOPTRIC +CATADROMOUS +CATAFALQUE +CATAFALQUES +CATALASE +CATALASES +CATALATIC +CATALECTIC +CATALECTICS +CATALEPSIES +CATALEPSY +CATALEPTIC +CATALEPTICALLY +CATALEPTICS +CATALEXES +CATALEXIS +CATALO +CATALOES +CATALOG +CATALOGED +CATALOGER +CATALOGERS +CATALOGIC +CATALOGING +CATALOGS +CATALOGUE +CATALOGUED +CATALOGUER +CATALOGUERS +CATALOGUES +CATALOGUING +CATALOS +CATALPA +CATALPAS +CATALYSES +CATALYSIS +CATALYST +CATALYSTS +CATALYTIC +CATALYTICALLY +CATALYZE +CATALYZED +CATALYZER +CATALYZERS +CATALYZES +CATALYZING +CATAMARAN +CATAMARANS +CATAMENIA +CATAMENIAL +CATAMITE +CATAMITES +CATAMOUNT +CATAMOUNTS +CATAPHORA +CATAPHORAS +CATAPHORESES +CATAPHORESIS +CATAPHORETIC +CATAPHORIC +CATAPHYLL +CATAPHYLLS +CATAPLASM +CATAPLASMS +CATAPLEXIES +CATAPLEXY +CATAPULT +CATAPULTED +CATAPULTING +CATAPULTS +CATARACT +CATARACTOUS +CATARACTS +CATARRH +CATARRHAL +CATARRHALLY +CATARRHINE +CATARRHINES +CATARRHS +CATASTROPHE +CATASTROPHES +CATASTROPHIC +CATASTROPHISM +CATASTROPHISMS +CATASTROPHIST +CATASTROPHISTS +CATATONIA +CATATONIAS +CATATONIC +CATATONICALLY +CATATONICS +CATAWBA +CATAWBAS +CATBIRD +CATBIRDS +CATBOAT +CATBOATS +CATBRIER +CATBRIERS +CATCALL +CATCALLED +CATCALLER +CATCALLERS +CATCALLING +CATCALLS +CATCH +CATCHABLE +CATCHALL +CATCHALLS +CATCHER +CATCHERS +CATCHES +CATCHFLIES +CATCHFLY +CATCHIER +CATCHIEST +CATCHING +CATCHMENT +CATCHMENTS +CATCHPENNY +CATCHPHRASE +CATCHPHRASES +CATCHPOLE +CATCHPOLES +CATCHPOLL +CATCHPOLLS +CATCHUP +CATCHUPS +CATCHWORD +CATCHWORDS +CATCHY +CATCLAW +CATCLAWS +CATE +CATECHESES +CATECHESIS +CATECHETICAL +CATECHIN +CATECHINS +CATECHISE +CATECHISED +CATECHISES +CATECHISING +CATECHISM +CATECHISMAL +CATECHISMS +CATECHIST +CATECHISTIC +CATECHISTS +CATECHIZATION +CATECHIZATIONS +CATECHIZE +CATECHIZED +CATECHIZER +CATECHIZERS +CATECHIZES +CATECHIZING +CATECHOL +CATECHOLAMINE +CATECHOLAMINES +CATECHOLS +CATECHU +CATECHUMEN +CATECHUMENS +CATECHUS +CATEGORIC +CATEGORICAL +CATEGORICALLY +CATEGORIES +CATEGORISE +CATEGORISED +CATEGORISES +CATEGORISING +CATEGORIZATION +CATEGORIZATIONS +CATEGORIZE +CATEGORIZED +CATEGORIZES +CATEGORIZING +CATEGORY +CATENA +CATENAE +CATENARIES +CATENARY +CATENAS +CATENATE +CATENATED +CATENATES +CATENATING +CATENATION +CATENATIONS +CATENOID +CATENOIDS +CATER +CATERAN +CATERANS +CATERCORNER +CATERCORNERED +CATERED +CATERER +CATERERS +CATERESS +CATERESSES +CATERING +CATERPILLAR +CATERPILLARS +CATERS +CATERWAUL +CATERWAULED +CATERWAULING +CATERWAULS +CATES +CATFACE +CATFACES +CATFACING +CATFACINGS +CATFALL +CATFALLS +CATFIGHT +CATFIGHTS +CATFISH +CATFISHES +CATGUT +CATGUTS +CATHARSES +CATHARSIS +CATHARTIC +CATHARTICS +CATHEAD +CATHEADS +CATHECT +CATHECTED +CATHECTIC +CATHECTING +CATHECTS +CATHEDRA +CATHEDRAE +CATHEDRAL +CATHEDRALS +CATHEDRAS +CATHEPSIN +CATHEPSINS +CATHEPTIC +CATHETER +CATHETERIZATION +CATHETERIZE +CATHETERIZED +CATHETERIZES +CATHETERIZING +CATHETERS +CATHEXES +CATHEXIS +CATHODAL +CATHODALLY +CATHODE +CATHODES +CATHODIC +CATHODICALLY +CATHOLIC +CATHOLICALLY +CATHOLICATE +CATHOLICATES +CATHOLICITIES +CATHOLICITY +CATHOLICIZE +CATHOLICIZED +CATHOLICIZES +CATHOLICIZING +CATHOLICOI +CATHOLICON +CATHOLICONS +CATHOLICOS +CATHOLICOSES +CATHOLICS +CATHOUSE +CATHOUSES +CATION +CATIONIC +CATIONICALLY +CATIONS +CATJANG +CATJANGS +CATKIN +CATKINATE +CATKINS +CATLIKE +CATLIN +CATLING +CATLINGS +CATLINS +CATMINT +CATMINTS +CATNAP +CATNAPER +CATNAPERS +CATNAPPED +CATNAPPER +CATNAPPERS +CATNAPPING +CATNAPS +CATNIP +CATNIPS +CATOPTRIC +CATRIGGED +CATS +CATSPAW +CATSPAWS +CATSUIT +CATSUITS +CATSUP +CATSUPS +CATTAIL +CATTAILS +CATTALO +CATTALOES +CATTALOS +CATTED +CATTERIES +CATTERY +CATTIE +CATTIER +CATTIES +CATTIEST +CATTILY +CATTINESS +CATTINESSES +CATTING +CATTISH +CATTISHLY +CATTLE +CATTLEMAN +CATTLEMEN +CATTLEYA +CATTLEYAS +CATTY +CATWALK +CATWALKS +CAUCUS +CAUCUSED +CAUCUSES +CAUCUSING +CAUCUSSED +CAUCUSSES +CAUCUSSING +CAUDAD +CAUDAL +CAUDALLY +CAUDATE +CAUDATED +CAUDATES +CAUDATION +CAUDATIONS +CAUDEX +CAUDEXES +CAUDICES +CAUDILLISMO +CAUDILLISMOS +CAUDILLO +CAUDILLOS +CAUDLE +CAUDLES +CAUGHT +CAUL +CAULD +CAULDRON +CAULDRONS +CAULDS +CAULES +CAULICLE +CAULICLES +CAULIFLOWER +CAULIFLOWERET +CAULIFLOWERETS +CAULIFLOWERS +CAULINE +CAULIS +CAULK +CAULKED +CAULKER +CAULKERS +CAULKING +CAULKINGS +CAULKS +CAULS +CAUSABLE +CAUSAL +CAUSALGIA +CAUSALGIAS +CAUSALGIC +CAUSALITIES +CAUSALITY +CAUSALLY +CAUSALS +CAUSATION +CAUSATIONS +CAUSATIVE +CAUSATIVELY +CAUSATIVES +CAUSE +CAUSED +CAUSELESS +CAUSER +CAUSERIE +CAUSERIES +CAUSERS +CAUSES +CAUSEWAY +CAUSEWAYED +CAUSEWAYING +CAUSEWAYS +CAUSEY +CAUSEYS +CAUSING +CAUSTIC +CAUSTICALLY +CAUSTICITIES +CAUSTICITY +CAUSTICS +CAUTERANT +CAUTERANTS +CAUTERIES +CAUTERIZATION +CAUTERIZATIONS +CAUTERIZE +CAUTERIZED +CAUTERIZES +CAUTERIZING +CAUTERY +CAUTION +CAUTIONARY +CAUTIONED +CAUTIONER +CAUTIONERS +CAUTIONING +CAUTIONS +CAUTIOUS +CAUTIOUSLY +CAUTIOUSNESS +CAUTIOUSNESSES +CAVALCADE +CAVALCADES +CAVALERO +CAVALEROS +CAVALETTI +CAVALIER +CAVALIERED +CAVALIERING +CAVALIERISM +CAVALIERISMS +CAVALIERLY +CAVALIERS +CAVALLA +CAVALLAS +CAVALLETTI +CAVALLIES +CAVALLY +CAVALRIES +CAVALRY +CAVALRYMAN +CAVALRYMEN +CAVATINA +CAVATINAS +CAVATINE +CAVE +CAVEAT +CAVEATED +CAVEATING +CAVEATOR +CAVEATORS +CAVEATS +CAVED +CAVEFISH +CAVEFISHES +CAVELIKE +CAVEMAN +CAVEMEN +CAVENDISH +CAVENDISHES +CAVER +CAVERN +CAVERNED +CAVERNICOLOUS +CAVERNING +CAVERNOUS +CAVERNOUSLY +CAVERNS +CAVERS +CAVES +CAVETTI +CAVETTO +CAVETTOS +CAVIAR +CAVIARE +CAVIARES +CAVIARS +CAVICORN +CAVIE +CAVIES +CAVIL +CAVILED +CAVILER +CAVILERS +CAVILING +CAVILLED +CAVILLER +CAVILLERS +CAVILLING +CAVILS +CAVING +CAVINGS +CAVITARY +CAVITATE +CAVITATED +CAVITATES +CAVITATING +CAVITATION +CAVITATIONS +CAVITIED +CAVITIES +CAVITY +CAVORT +CAVORTED +CAVORTER +CAVORTERS +CAVORTING +CAVORTS +CAVY +CAW +CAWED +CAWING +CAWS +CAY +CAYENNE +CAYENNED +CAYENNES +CAYMAN +CAYMANS +CAYS +CAYUSE +CAYUSES +CAZIQUE +CAZIQUES +CEANOTHUS +CEANOTHUSES +CEASE +CEASED +CEASEFIRE +CEASEFIRES +CEASELESS +CEASELESSLY +CEASELESSNESS +CEASELESSNESSES +CEASES +CEASING +CEBID +CEBIDS +CEBOID +CEBOIDS +CECA +CECAL +CECALLY +CECITIES +CECITY +CECROPIA +CECROPIAS +CECUM +CEDAR +CEDARBIRD +CEDARBIRDS +CEDARN +CEDARS +CEDARWOOD +CEDARWOODS +CEDARY +CEDE +CEDED +CEDER +CEDERS +CEDES +CEDI +CEDILLA +CEDILLAS +CEDING +CEDIS +CEDULA +CEDULAS +CEE +CEES +CEIBA +CEIBAS +CEIL +CEILED +CEILER +CEILERS +CEILI +CEILIDH +CEILIDHS +CEILING +CEILINGED +CEILINGS +CEILIS +CEILOMETER +CEILOMETERS +CEILS +CEINTURE +CEINTURES +CEL +CELADON +CELADONS +CELANDINE +CELANDINES +CELEB +CELEBRANT +CELEBRANTS +CELEBRATE +CELEBRATED +CELEBRATEDNESS +CELEBRATES +CELEBRATING +CELEBRATION +CELEBRATIONS +CELEBRATOR +CELEBRATORS +CELEBRATORY +CELEBRITIES +CELEBRITY +CELEBS +CELERIAC +CELERIACS +CELERIES +CELERITIES +CELERITY +CELERY +CELESTA +CELESTAS +CELESTE +CELESTES +CELESTIAL +CELESTIALLY +CELESTIALS +CELESTINE +CELESTINES +CELESTITE +CELESTITES +CELIAC +CELIACS +CELIBACIES +CELIBACY +CELIBATE +CELIBATES +CELIBATIC +CELL +CELLA +CELLAE +CELLAR +CELLARAGE +CELLARAGES +CELLARED +CELLARER +CELLARERS +CELLARET +CELLARETS +CELLARETTE +CELLARETTES +CELLARING +CELLARS +CELLARWAY +CELLARWAYS +CELLBLOCK +CELLBLOCKS +CELLED +CELLI +CELLING +CELLIST +CELLISTS +CELLMATE +CELLMATES +CELLO +CELLOBIOSE +CELLOBIOSES +CELLOIDIN +CELLOIDINS +CELLOPHANE +CELLOPHANES +CELLOS +CELLPHONE +CELLPHONES +CELLS +CELLULAR +CELLULARITIES +CELLULARITY +CELLULARS +CELLULASE +CELLULASES +CELLULE +CELLULES +CELLULITE +CELLULITES +CELLULITIS +CELLULITISES +CELLULOID +CELLULOIDS +CELLULOLYTIC +CELLULOSE +CELLULOSES +CELLULOSIC +CELLULOSICS +CELLULOUS +CELOM +CELOMATA +CELOMS +CELOSIA +CELOSIAS +CELOTEX +CELOTEXES +CELS +CELT +CELTS +CEMBALI +CEMBALIST +CEMBALISTS +CEMBALO +CEMBALOS +CEMENT +CEMENTA +CEMENTATION +CEMENTATIONS +CEMENTED +CEMENTER +CEMENTERS +CEMENTING +CEMENTITE +CEMENTITES +CEMENTITIOUS +CEMENTS +CEMENTUM +CEMENTUMS +CEMETERIES +CEMETERY +CENACLE +CENACLES +CENOBITE +CENOBITES +CENOBITIC +CENOSPECIES +CENOTAPH +CENOTAPHS +CENOTE +CENOTES +CENOZOIC +CENSE +CENSED +CENSER +CENSERS +CENSES +CENSING +CENSOR +CENSORED +CENSORIAL +CENSORING +CENSORIOUS +CENSORIOUSLY +CENSORIOUSNESS +CENSORS +CENSORSHIP +CENSORSHIPS +CENSUAL +CENSURABLE +CENSURE +CENSURED +CENSURER +CENSURERS +CENSURES +CENSURING +CENSUS +CENSUSED +CENSUSES +CENSUSING +CENT +CENTAI +CENTAL +CENTALS +CENTARE +CENTARES +CENTAS +CENTAUR +CENTAUREA +CENTAUREAS +CENTAURIC +CENTAURIES +CENTAURS +CENTAURY +CENTAVO +CENTAVOS +CENTENARIAN +CENTENARIANS +CENTENARIES +CENTENARY +CENTENNIAL +CENTENNIALLY +CENTENNIALS +CENTER +CENTERBOARD +CENTERBOARDS +CENTERED +CENTEREDNESS +CENTEREDNESSES +CENTERFOLD +CENTERFOLDS +CENTERING +CENTERINGS +CENTERLESS +CENTERLINE +CENTERLINES +CENTERPIECE +CENTERPIECES +CENTERS +CENTESES +CENTESIMAL +CENTESIMI +CENTESIMO +CENTESIMOS +CENTESIS +CENTIARE +CENTIARES +CENTIGRADE +CENTIGRAM +CENTIGRAMS +CENTILE +CENTILES +CENTILITER +CENTILITERS +CENTILLION +CENTILLIONS +CENTIME +CENTIMES +CENTIMETER +CENTIMETERS +CENTIMO +CENTIMORGAN +CENTIMORGANS +CENTIMOS +CENTIPEDE +CENTIPEDES +CENTNER +CENTNERS +CENTO +CENTONES +CENTOS +CENTRA +CENTRAL +CENTRALER +CENTRALEST +CENTRALISE +CENTRALISED +CENTRALISES +CENTRALISING +CENTRALISM +CENTRALISMS +CENTRALIST +CENTRALISTIC +CENTRALISTS +CENTRALITIES +CENTRALITY +CENTRALIZATION +CENTRALIZATIONS +CENTRALIZE +CENTRALIZED +CENTRALIZER +CENTRALIZERS +CENTRALIZES +CENTRALIZING +CENTRALLY +CENTRALS +CENTRE +CENTRED +CENTRES +CENTRIC +CENTRICAL +CENTRICALLY +CENTRICITIES +CENTRICITY +CENTRIFUGAL +CENTRIFUGALLY +CENTRIFUGALS +CENTRIFUGATION +CENTRIFUGATIONS +CENTRIFUGE +CENTRIFUGED +CENTRIFUGES +CENTRIFUGING +CENTRING +CENTRINGS +CENTRIOLE +CENTRIOLES +CENTRIPETAL +CENTRIPETALLY +CENTRISM +CENTRISMS +CENTRIST +CENTRISTS +CENTROID +CENTROIDS +CENTROMERE +CENTROMERES +CENTROMERIC +CENTROSOME +CENTROSOMES +CENTROSYMMETRIC +CENTRUM +CENTRUMS +CENTS +CENTU +CENTUM +CENTUMS +CENTUPLE +CENTUPLED +CENTUPLES +CENTUPLING +CENTURIAL +CENTURIES +CENTURION +CENTURIONS +CENTURY +CEORL +CEORLISH +CEORLS +CEP +CEPE +CEPES +CEPHALAD +CEPHALEXIN +CEPHALEXINS +CEPHALIC +CEPHALICALLY +CEPHALIN +CEPHALINS +CEPHALIZATION +CEPHALIZATIONS +CEPHALOMETRIC +CEPHALOMETRIES +CEPHALOMETRY +CEPHALOPOD +CEPHALOPODS +CEPHALORIDINE +CEPHALORIDINES +CEPHALOSPORIN +CEPHALOSPORINS +CEPHALOTHIN +CEPHALOTHINS +CEPHALOTHORACES +CEPHALOTHORAX +CEPHALOTHORAXES +CEPHALOUS +CEPHEID +CEPHEIDS +CEPS +CERACEOUS +CERAMAL +CERAMALS +CERAMIC +CERAMICIST +CERAMICISTS +CERAMICS +CERAMIDE +CERAMIDES +CERAMIST +CERAMISTS +CERASTES +CERATE +CERATED +CERATES +CERATIN +CERATINS +CERATODUS +CERATODUSES +CERATOID +CERATOPSIAN +CERATOPSIANS +CERCAL +CERCARIA +CERCARIAE +CERCARIAL +CERCARIAN +CERCARIANS +CERCARIAS +CERCI +CERCIS +CERCISES +CERCUS +CERE +CEREAL +CEREALS +CEREBELLA +CEREBELLAR +CEREBELLUM +CEREBELLUMS +CEREBRA +CEREBRAL +CEREBRALLY +CEREBRALS +CEREBRATE +CEREBRATED +CEREBRATES +CEREBRATING +CEREBRATION +CEREBRATIONS +CEREBRIC +CEREBROSIDE +CEREBROSIDES +CEREBROSPINAL +CEREBROVASCULAR +CEREBRUM +CEREBRUMS +CERECLOTH +CERECLOTHS +CERED +CEREMENT +CEREMENTS +CEREMONIAL +CEREMONIALISM +CEREMONIALISMS +CEREMONIALIST +CEREMONIALISTS +CEREMONIALLY +CEREMONIALS +CEREMONIES +CEREMONIOUS +CEREMONIOUSLY +CEREMONIOUSNESS +CEREMONY +CERES +CEREUS +CEREUSES +CERIA +CERIAS +CERIC +CERING +CERIPH +CERIPHS +CERISE +CERISES +CERITE +CERITES +CERIUM +CERIUMS +CERMET +CERMETS +CERNUOUS +CERO +CEROS +CEROTIC +CEROTYPE +CEROTYPES +CEROUS +CERTAIN +CERTAINER +CERTAINEST +CERTAINLY +CERTAINTIES +CERTAINTY +CERTES +CERTIFIABLE +CERTIFIABLY +CERTIFICATE +CERTIFICATED +CERTIFICATES +CERTIFICATING +CERTIFICATION +CERTIFICATIONS +CERTIFICATORY +CERTIFIED +CERTIFIER +CERTIFIERS +CERTIFIES +CERTIFY +CERTIFYING +CERTIORARI +CERTIORARIS +CERTITUDE +CERTITUDES +CERULEAN +CERULEANS +CERULOPLASMIN +CERULOPLASMINS +CERUMEN +CERUMENS +CERUMINOUS +CERUSE +CERUSES +CERUSITE +CERUSITES +CERUSSITE +CERUSSITES +CERVELAS +CERVELASES +CERVELAT +CERVELATS +CERVEZA +CERVEZAS +CERVICAL +CERVICES +CERVICITIS +CERVICITISES +CERVID +CERVINE +CERVIX +CERVIXES +CESAREAN +CESAREANS +CESARIAN +CESARIANS +CESIUM +CESIUMS +CESPITOSE +CESS +CESSATION +CESSATIONS +CESSED +CESSES +CESSING +CESSION +CESSIONS +CESSPIT +CESSPITS +CESSPOOL +CESSPOOLS +CESTA +CESTAS +CESTI +CESTODE +CESTODES +CESTOI +CESTOID +CESTOIDS +CESTOS +CESTUS +CESTUSES +CESURA +CESURAE +CESURAS +CETACEAN +CETACEANS +CETACEOUS +CETANE +CETANES +CETE +CETES +CETOLOGIES +CETOLOGIST +CETOLOGISTS +CETOLOGY +CEVICHE +CEVICHES +CHABAZITE +CHABAZITES +CHABLIS +CHABOUK +CHABOUKS +CHABUK +CHABUKS +CHACHKA +CHACHKAS +CHACMA +CHACMAS +CHACONNE +CHACONNES +CHAD +CHADAR +CHADARIM +CHADARS +CHADLESS +CHADOR +CHADORS +CHADRI +CHADS +CHAEBOL +CHAEBOLS +CHAETA +CHAETAE +CHAETAL +CHAETOGNATH +CHAETOGNATHS +CHAETOPOD +CHAETOPODS +CHAFE +CHAFED +CHAFER +CHAFERS +CHAFES +CHAFF +CHAFFED +CHAFFER +CHAFFERED +CHAFFERER +CHAFFERERS +CHAFFERING +CHAFFERS +CHAFFIER +CHAFFIEST +CHAFFINCH +CHAFFINCHES +CHAFFING +CHAFFS +CHAFFY +CHAFING +CHAGRIN +CHAGRINED +CHAGRINING +CHAGRINNED +CHAGRINNING +CHAGRINS +CHAI +CHAIN +CHAINE +CHAINED +CHAINES +CHAINFALL +CHAINFALLS +CHAINING +CHAINMAN +CHAINMEN +CHAINS +CHAINSAW +CHAINSAWED +CHAINSAWING +CHAINSAWS +CHAINWHEEL +CHAINWHEELS +CHAIR +CHAIRED +CHAIRING +CHAIRLIFT +CHAIRLIFTS +CHAIRMAN +CHAIRMANED +CHAIRMANING +CHAIRMANNED +CHAIRMANNING +CHAIRMANS +CHAIRMANSHIP +CHAIRMANSHIPS +CHAIRMEN +CHAIRPERSON +CHAIRPERSONS +CHAIRS +CHAIRWOMAN +CHAIRWOMEN +CHAIS +CHAISE +CHAISES +CHAKRA +CHAKRAS +CHALAH +CHALAHS +CHALAZA +CHALAZAE +CHALAZAL +CHALAZAS +CHALAZIA +CHALAZION +CHALAZIONS +CHALCEDONIC +CHALCEDONIES +CHALCEDONY +CHALCID +CHALCIDS +CHALCOCITE +CHALCOCITES +CHALCOGEN +CHALCOGENIDE +CHALCOGENIDES +CHALCOGENS +CHALCOPYRITE +CHALCOPYRITES +CHALDRON +CHALDRONS +CHALEH +CHALEHS +CHALET +CHALETS +CHALICE +CHALICED +CHALICES +CHALK +CHALKBOARD +CHALKBOARDS +CHALKED +CHALKIER +CHALKIEST +CHALKING +CHALKS +CHALKY +CHALLA +CHALLAH +CHALLAHS +CHALLAS +CHALLENGE +CHALLENGED +CHALLENGER +CHALLENGERS +CHALLENGES +CHALLENGING +CHALLENGINGLY +CHALLIE +CHALLIES +CHALLIS +CHALLISES +CHALLOT +CHALLOTH +CHALLY +CHALONE +CHALONES +CHALOT +CHALOTH +CHALUMEAU +CHALUMEAUS +CHALUPA +CHALUPAS +CHALUTZ +CHALUTZIM +CHALYBEATE +CHALYBEATES +CHAM +CHAMADE +CHAMADES +CHAMAEPHYTE +CHAMAEPHYTES +CHAMBER +CHAMBERED +CHAMBERING +CHAMBERLAIN +CHAMBERLAINS +CHAMBERMAID +CHAMBERMAIDS +CHAMBERS +CHAMBRAY +CHAMBRAYS +CHAMELEON +CHAMELEONIC +CHAMELEONLIKE +CHAMELEONS +CHAMFER +CHAMFERED +CHAMFERER +CHAMFERERS +CHAMFERING +CHAMFERS +CHAMFRAIN +CHAMFRAINS +CHAMFRON +CHAMFRONS +CHAMISA +CHAMISAS +CHAMISE +CHAMISES +CHAMISO +CHAMISOS +CHAMMIED +CHAMMIES +CHAMMY +CHAMMYING +CHAMOIS +CHAMOISED +CHAMOISES +CHAMOISING +CHAMOIX +CHAMOMILE +CHAMOMILES +CHAMP +CHAMPAC +CHAMPACA +CHAMPACAS +CHAMPACS +CHAMPAGNE +CHAMPAGNES +CHAMPAIGN +CHAMPAIGNS +CHAMPAK +CHAMPAKS +CHAMPED +CHAMPER +CHAMPERS +CHAMPERTIES +CHAMPERTOUS +CHAMPERTY +CHAMPIGNON +CHAMPIGNONS +CHAMPING +CHAMPION +CHAMPIONED +CHAMPIONING +CHAMPIONS +CHAMPIONSHIP +CHAMPIONSHIPS +CHAMPLEVE +CHAMPLEVES +CHAMPS +CHAMPY +CHAMS +CHANCE +CHANCED +CHANCEFUL +CHANCEL +CHANCELLERIES +CHANCELLERY +CHANCELLOR +CHANCELLORIES +CHANCELLORS +CHANCELLORSHIP +CHANCELLORSHIPS +CHANCELLORY +CHANCELS +CHANCER +CHANCERIES +CHANCERS +CHANCERY +CHANCES +CHANCIER +CHANCIEST +CHANCILY +CHANCINESS +CHANCINESSES +CHANCING +CHANCRE +CHANCRES +CHANCROID +CHANCROIDAL +CHANCROIDS +CHANCROUS +CHANCY +CHANDELIER +CHANDELIERED +CHANDELIERS +CHANDELLE +CHANDELLED +CHANDELLES +CHANDELLING +CHANDLER +CHANDLERIES +CHANDLERS +CHANDLERY +CHANFRON +CHANFRONS +CHANG +CHANGE +CHANGEABILITIES +CHANGEABILITY +CHANGEABLE +CHANGEABLENESS +CHANGEABLY +CHANGED +CHANGEFUL +CHANGEFULLY +CHANGEFULNESS +CHANGEFULNESSES +CHANGELESS +CHANGELESSLY +CHANGELESSNESS +CHANGELING +CHANGELINGS +CHANGEOVER +CHANGEOVERS +CHANGER +CHANGERS +CHANGES +CHANGEUP +CHANGEUPS +CHANGING +CHANGS +CHANNEL +CHANNELED +CHANNELER +CHANNELERS +CHANNELING +CHANNELIZATION +CHANNELIZATIONS +CHANNELIZE +CHANNELIZED +CHANNELIZES +CHANNELIZING +CHANNELLED +CHANNELLING +CHANNELS +CHANOYU +CHANOYUS +CHANSON +CHANSONNIER +CHANSONNIERS +CHANSONS +CHANT +CHANTABLE +CHANTAGE +CHANTAGES +CHANTED +CHANTER +CHANTERELLE +CHANTERELLES +CHANTERS +CHANTEUSE +CHANTEUSES +CHANTEY +CHANTEYS +CHANTICLEER +CHANTICLEERS +CHANTIES +CHANTING +CHANTOR +CHANTORS +CHANTRIES +CHANTRY +CHANTS +CHANTY +CHAO +CHAOS +CHAOSES +CHAOTIC +CHAOTICALLY +CHAP +CHAPARAJOS +CHAPAREJOS +CHAPARRAL +CHAPARRALS +CHAPATI +CHAPATIS +CHAPATTI +CHAPATTIS +CHAPBOOK +CHAPBOOKS +CHAPE +CHAPEAU +CHAPEAUS +CHAPEAUX +CHAPEL +CHAPELS +CHAPERON +CHAPERONAGE +CHAPERONAGES +CHAPERONE +CHAPERONED +CHAPERONES +CHAPERONING +CHAPERONS +CHAPES +CHAPFALLEN +CHAPITER +CHAPITERS +CHAPLAIN +CHAPLAINCIES +CHAPLAINCY +CHAPLAINS +CHAPLET +CHAPLETED +CHAPLETS +CHAPMAN +CHAPMEN +CHAPPATI +CHAPPATIS +CHAPPED +CHAPPIE +CHAPPIES +CHAPPING +CHAPS +CHAPT +CHAPTER +CHAPTERAL +CHAPTERED +CHAPTERING +CHAPTERS +CHAQUETA +CHAQUETAS +CHAR +CHARABANC +CHARABANCS +CHARACID +CHARACIDS +CHARACIN +CHARACINS +CHARACTER +CHARACTERED +CHARACTERFUL +CHARACTERIES +CHARACTERING +CHARACTERISTIC +CHARACTERISTICS +CHARACTERIZE +CHARACTERIZED +CHARACTERIZES +CHARACTERIZING +CHARACTERLESS +CHARACTERS +CHARACTERY +CHARADE +CHARADES +CHARAS +CHARASES +CHARBROIL +CHARBROILED +CHARBROILER +CHARBROILERS +CHARBROILING +CHARBROILS +CHARCOAL +CHARCOALED +CHARCOALING +CHARCOALS +CHARCOALY +CHARCUTERIE +CHARCUTERIES +CHARD +CHARDONNAY +CHARDONNAYS +CHARDS +CHARE +CHARED +CHARES +CHARGE +CHARGEABLE +CHARGED +CHARGEHAND +CHARGEHANDS +CHARGER +CHARGERS +CHARGES +CHARGING +CHARGRILL +CHARGRILLED +CHARGRILLING +CHARGRILLS +CHARIER +CHARIEST +CHARILY +CHARINESS +CHARINESSES +CHARING +CHARIOT +CHARIOTED +CHARIOTEER +CHARIOTEERS +CHARIOTING +CHARIOTS +CHARISM +CHARISMA +CHARISMAS +CHARISMATA +CHARISMATIC +CHARISMATICS +CHARISMS +CHARITABLE +CHARITABLENESS +CHARITABLY +CHARITIES +CHARITY +CHARIVARI +CHARIVARIED +CHARIVARIING +CHARIVARIS +CHARK +CHARKA +CHARKAS +CHARKED +CHARKHA +CHARKHAS +CHARKING +CHARKS +CHARLADIES +CHARLADY +CHARLATAN +CHARLATANISM +CHARLATANISMS +CHARLATANRIES +CHARLATANRY +CHARLATANS +CHARLEY +CHARLEYS +CHARLIE +CHARLIES +CHARLOCK +CHARLOCKS +CHARLOTTE +CHARLOTTES +CHARM +CHARMED +CHARMER +CHARMERS +CHARMEUSE +CHARMEUSES +CHARMING +CHARMINGER +CHARMINGEST +CHARMINGLY +CHARMLESS +CHARMS +CHARNEL +CHARNELS +CHARPAI +CHARPAIS +CHARPOY +CHARPOYS +CHARQUI +CHARQUID +CHARQUIS +CHARR +CHARRED +CHARRIER +CHARRIEST +CHARRING +CHARRO +CHARROS +CHARRS +CHARRY +CHARS +CHART +CHARTABLE +CHARTED +CHARTER +CHARTERED +CHARTERER +CHARTERERS +CHARTERING +CHARTERS +CHARTING +CHARTIST +CHARTISTS +CHARTLESS +CHARTREUSE +CHARTREUSES +CHARTS +CHARTULARIES +CHARTULARY +CHARWOMAN +CHARWOMEN +CHARY +CHASE +CHASEABLE +CHASED +CHASER +CHASERS +CHASES +CHASING +CHASINGS +CHASM +CHASMAL +CHASMED +CHASMIC +CHASMS +CHASMY +CHASSE +CHASSED +CHASSEING +CHASSEPOT +CHASSEPOTS +CHASSES +CHASSEUR +CHASSEURS +CHASSIS +CHASTE +CHASTELY +CHASTEN +CHASTENED +CHASTENER +CHASTENERS +CHASTENESS +CHASTENESSES +CHASTENING +CHASTENS +CHASTER +CHASTEST +CHASTISE +CHASTISED +CHASTISEMENT +CHASTISEMENTS +CHASTISER +CHASTISERS +CHASTISES +CHASTISING +CHASTITIES +CHASTITY +CHASUBLE +CHASUBLES +CHAT +CHATCHKA +CHATCHKAS +CHATCHKE +CHATCHKES +CHATEAU +CHATEAUBRIAND +CHATEAUBRIANDS +CHATEAUS +CHATEAUX +CHATELAIN +CHATELAINE +CHATELAINES +CHATELAINS +CHATOYANCE +CHATOYANCES +CHATOYANCIES +CHATOYANCY +CHATOYANT +CHATOYANTS +CHATROOM +CHATROOMS +CHATS +CHATTED +CHATTEL +CHATTELS +CHATTER +CHATTERBOX +CHATTERBOXES +CHATTERED +CHATTERER +CHATTERERS +CHATTERING +CHATTERS +CHATTERY +CHATTIER +CHATTIEST +CHATTILY +CHATTINESS +CHATTINESSES +CHATTING +CHATTY +CHAUFER +CHAUFERS +CHAUFFER +CHAUFFERS +CHAUFFEUR +CHAUFFEURED +CHAUFFEURING +CHAUFFEURS +CHAULMOOGRA +CHAULMOOGRAS +CHAUNT +CHAUNTED +CHAUNTER +CHAUNTERS +CHAUNTING +CHAUNTS +CHAUSSES +CHAUSSURE +CHAUSSURES +CHAUTAUQUA +CHAUTAUQUAS +CHAUVINISM +CHAUVINISMS +CHAUVINIST +CHAUVINISTIC +CHAUVINISTS +CHAW +CHAWBACON +CHAWBACONS +CHAWED +CHAWER +CHAWERS +CHAWING +CHAWS +CHAY +CHAYOTE +CHAYOTES +CHAYS +CHAZAN +CHAZANIM +CHAZANS +CHAZZAN +CHAZZANIM +CHAZZANS +CHAZZEN +CHAZZENIM +CHAZZENS +CHEAP +CHEAPEN +CHEAPENED +CHEAPENER +CHEAPENERS +CHEAPENING +CHEAPENS +CHEAPER +CHEAPEST +CHEAPIE +CHEAPIES +CHEAPISH +CHEAPISHLY +CHEAPJACK +CHEAPJACKS +CHEAPLY +CHEAPNESS +CHEAPNESSES +CHEAPO +CHEAPOS +CHEAPS +CHEAPSKATE +CHEAPSKATES +CHEAT +CHEATABLE +CHEATED +CHEATER +CHEATERS +CHEATING +CHEATS +CHEBEC +CHEBECS +CHECHAKO +CHECHAKOS +CHECK +CHECKABLE +CHECKBOOK +CHECKBOOKS +CHECKED +CHECKER +CHECKERBERRIES +CHECKERBERRY +CHECKERBOARD +CHECKERBOARDS +CHECKERED +CHECKERING +CHECKERS +CHECKING +CHECKLESS +CHECKLIST +CHECKLISTED +CHECKLISTING +CHECKLISTS +CHECKMARK +CHECKMARKED +CHECKMARKING +CHECKMARKS +CHECKMATE +CHECKMATED +CHECKMATES +CHECKMATING +CHECKOFF +CHECKOFFS +CHECKOUT +CHECKOUTS +CHECKPOINT +CHECKPOINTS +CHECKREIN +CHECKREINS +CHECKROOM +CHECKROOMS +CHECKROW +CHECKROWED +CHECKROWING +CHECKROWS +CHECKS +CHECKSUM +CHECKSUMS +CHECKUP +CHECKUPS +CHEDDAR +CHEDDARS +CHEDDARY +CHEDDITE +CHEDDITES +CHEDER +CHEDERS +CHEDITE +CHEDITES +CHEECHAKO +CHEECHAKOS +CHEEK +CHEEKBONE +CHEEKBONES +CHEEKED +CHEEKFUL +CHEEKFULS +CHEEKIER +CHEEKIEST +CHEEKILY +CHEEKINESS +CHEEKINESSES +CHEEKING +CHEEKLESS +CHEEKS +CHEEKY +CHEEP +CHEEPED +CHEEPER +CHEEPERS +CHEEPING +CHEEPS +CHEER +CHEERED +CHEERER +CHEERERS +CHEERFUL +CHEERFULLER +CHEERFULLEST +CHEERFULLY +CHEERFULNESS +CHEERFULNESSES +CHEERIER +CHEERIEST +CHEERILY +CHEERINESS +CHEERINESSES +CHEERING +CHEERIO +CHEERIOS +CHEERLEAD +CHEERLEADER +CHEERLEADERS +CHEERLEADING +CHEERLEADS +CHEERLED +CHEERLESS +CHEERLESSLY +CHEERLESSNESS +CHEERLESSNESSES +CHEERLY +CHEERO +CHEEROS +CHEERS +CHEERY +CHEESE +CHEESEBURGER +CHEESEBURGERS +CHEESECAKE +CHEESECAKES +CHEESECLOTH +CHEESECLOTHS +CHEESED +CHEESEPARING +CHEESEPARINGS +CHEESES +CHEESIER +CHEESIEST +CHEESILY +CHEESINESS +CHEESINESSES +CHEESING +CHEESY +CHEETAH +CHEETAHS +CHEF +CHEFDOM +CHEFDOMS +CHEFED +CHEFFED +CHEFFING +CHEFING +CHEFS +CHEGOE +CHEGOES +CHELA +CHELAE +CHELAS +CHELASHIP +CHELASHIPS +CHELATABLE +CHELATE +CHELATED +CHELATES +CHELATING +CHELATION +CHELATIONS +CHELATOR +CHELATORS +CHELICERA +CHELICERAE +CHELICERAL +CHELIFORM +CHELIPED +CHELIPEDS +CHELOID +CHELOIDS +CHELONIAN +CHELONIANS +CHEMIC +CHEMICAL +CHEMICALLY +CHEMICALS +CHEMICS +CHEMIOSMOTIC +CHEMISE +CHEMISES +CHEMISETTE +CHEMISETTES +CHEMISM +CHEMISMS +CHEMISORB +CHEMISORBED +CHEMISORBING +CHEMISORBS +CHEMISORPTION +CHEMISORPTIONS +CHEMIST +CHEMISTRIES +CHEMISTRY +CHEMISTS +CHEMO +CHEMOAUTOTROPHY +CHEMOKINE +CHEMOKINES +CHEMORECEPTION +CHEMORECEPTIONS +CHEMORECEPTIVE +CHEMORECEPTOR +CHEMORECEPTORS +CHEMOS +CHEMOSORB +CHEMOSORBED +CHEMOSORBING +CHEMOSORBS +CHEMOSTAT +CHEMOSTATS +CHEMOSURGERIES +CHEMOSURGERY +CHEMOSURGICAL +CHEMOSYNTHESES +CHEMOSYNTHESIS +CHEMOSYNTHETIC +CHEMOTACTIC +CHEMOTACTICALLY +CHEMOTAXES +CHEMOTAXIS +CHEMOTAXONOMIC +CHEMOTAXONOMIES +CHEMOTAXONOMIST +CHEMOTAXONOMY +CHEMOTHERAPIES +CHEMOTHERAPIST +CHEMOTHERAPISTS +CHEMOTHERAPY +CHEMOTROPISM +CHEMOTROPISMS +CHEMURGIC +CHEMURGIES +CHEMURGY +CHENILLE +CHENILLES +CHENOPOD +CHENOPODS +CHEONGSAM +CHEONGSAMS +CHEQUE +CHEQUER +CHEQUERED +CHEQUERING +CHEQUERS +CHEQUES +CHERIMOYA +CHERIMOYAS +CHERISH +CHERISHABLE +CHERISHED +CHERISHER +CHERISHERS +CHERISHES +CHERISHING +CHERNOZEM +CHERNOZEMIC +CHERNOZEMS +CHEROOT +CHEROOTS +CHERRIES +CHERRY +CHERRYLIKE +CHERRYSTONE +CHERRYSTONES +CHERT +CHERTIER +CHERTIEST +CHERTS +CHERTY +CHERUB +CHERUBIC +CHERUBICALLY +CHERUBIM +CHERUBIMS +CHERUBLIKE +CHERUBS +CHERVIL +CHERVILS +CHESHIRE +CHESHIRES +CHESS +CHESSBOARD +CHESSBOARDS +CHESSES +CHESSMAN +CHESSMEN +CHEST +CHESTED +CHESTERFIELD +CHESTERFIELDS +CHESTFUL +CHESTFULS +CHESTIER +CHESTIEST +CHESTILY +CHESTNUT +CHESTNUTS +CHESTS +CHESTY +CHETAH +CHETAHS +CHETH +CHETHS +CHETRUM +CHETRUMS +CHEVALET +CHEVALETS +CHEVALIER +CHEVALIERS +CHEVELURE +CHEVELURES +CHEVERON +CHEVERONS +CHEVIED +CHEVIES +CHEVIOT +CHEVIOTS +CHEVRE +CHEVRES +CHEVRET +CHEVRETS +CHEVRON +CHEVRONS +CHEVY +CHEVYING +CHEW +CHEWABLE +CHEWED +CHEWER +CHEWERS +CHEWIER +CHEWIEST +CHEWINESS +CHEWINESSES +CHEWING +CHEWINK +CHEWINKS +CHEWS +CHEWY +CHEZ +CHI +CHIA +CHIANTI +CHIANTIS +CHIAO +CHIAROSCURIST +CHIAROSCURISTS +CHIAROSCURO +CHIAROSCUROS +CHIAS +CHIASM +CHIASMA +CHIASMAL +CHIASMAS +CHIASMATA +CHIASMATIC +CHIASMI +CHIASMIC +CHIASMS +CHIASMUS +CHIASTIC +CHIAUS +CHIAUSES +CHIBOUK +CHIBOUKS +CHIBOUQUE +CHIBOUQUES +CHIC +CHICA +CHICALOTE +CHICALOTES +CHICANE +CHICANED +CHICANER +CHICANERIES +CHICANERS +CHICANERY +CHICANES +CHICANING +CHICANO +CHICANOS +CHICAS +CHICCORIES +CHICCORY +CHICER +CHICEST +CHICHI +CHICHIER +CHICHIEST +CHICHIS +CHICK +CHICKADEE +CHICKADEES +CHICKAREE +CHICKAREES +CHICKEE +CHICKEES +CHICKEN +CHICKENED +CHICKENHEARTED +CHICKENING +CHICKENS +CHICKENSHIT +CHICKENSHITS +CHICKORIES +CHICKORY +CHICKPEA +CHICKPEAS +CHICKS +CHICKWEED +CHICKWEEDS +CHICLE +CHICLES +CHICLY +CHICNESS +CHICNESSES +CHICO +CHICORIES +CHICORY +CHICOS +CHICS +CHID +CHIDDEN +CHIDE +CHIDED +CHIDER +CHIDERS +CHIDES +CHIDING +CHIDINGLY +CHIEF +CHIEFDOM +CHIEFDOMS +CHIEFER +CHIEFEST +CHIEFLY +CHIEFS +CHIEFSHIP +CHIEFSHIPS +CHIEFTAIN +CHIEFTAINCIES +CHIEFTAINCY +CHIEFTAINS +CHIEFTAINSHIP +CHIEFTAINSHIPS +CHIEL +CHIELD +CHIELDS +CHIELS +CHIFFCHAFF +CHIFFCHAFFS +CHIFFON +CHIFFONADE +CHIFFONADES +CHIFFONIER +CHIFFONIERS +CHIFFONS +CHIFFOROBE +CHIFFOROBES +CHIGETAI +CHIGETAIS +CHIGGER +CHIGGERS +CHIGNON +CHIGNONED +CHIGNONS +CHIGOE +CHIGOES +CHILBLAIN +CHILBLAINS +CHILD +CHILDBEARING +CHILDBEARINGS +CHILDBED +CHILDBEDS +CHILDBIRTH +CHILDBIRTHS +CHILDCARE +CHILDCARES +CHILDE +CHILDES +CHILDHOOD +CHILDHOODS +CHILDING +CHILDISH +CHILDISHLY +CHILDISHNESS +CHILDISHNESSES +CHILDLESS +CHILDLESSNESS +CHILDLESSNESSES +CHILDLIER +CHILDLIEST +CHILDLIKE +CHILDLIKENESS +CHILDLIKENESSES +CHILDLY +CHILDPROOF +CHILDREN +CHILE +CHILES +CHILI +CHILIAD +CHILIADAL +CHILIADIC +CHILIADS +CHILIARCH +CHILIARCHS +CHILIASM +CHILIASMS +CHILIAST +CHILIASTIC +CHILIASTS +CHILIDOG +CHILIDOGS +CHILIES +CHILIS +CHILL +CHILLED +CHILLER +CHILLERS +CHILLEST +CHILLI +CHILLIER +CHILLIES +CHILLIEST +CHILLILY +CHILLINESS +CHILLINESSES +CHILLING +CHILLINGLY +CHILLIS +CHILLNESS +CHILLNESSES +CHILLS +CHILLUM +CHILLUMS +CHILLY +CHILOPOD +CHILOPODS +CHILTEPIN +CHILTEPINS +CHIMAERA +CHIMAERAS +CHIMAERIC +CHIMAERISM +CHIMAERISMS +CHIMAR +CHIMARS +CHIMB +CHIMBLEY +CHIMBLEYS +CHIMBLIES +CHIMBLY +CHIMBS +CHIME +CHIMED +CHIMER +CHIMERA +CHIMERAS +CHIMERE +CHIMERES +CHIMERIC +CHIMERICAL +CHIMERICALLY +CHIMERISM +CHIMERISMS +CHIMERS +CHIMES +CHIMICHANGA +CHIMICHANGAS +CHIMING +CHIMLA +CHIMLAS +CHIMLEY +CHIMLEYS +CHIMNEY +CHIMNEYLIKE +CHIMNEYPIECE +CHIMNEYPIECES +CHIMNEYS +CHIMP +CHIMPANZEE +CHIMPANZEES +CHIMPS +CHIN +CHINA +CHINABERRIES +CHINABERRY +CHINAS +CHINAWARE +CHINAWARES +CHINBONE +CHINBONES +CHINCAPIN +CHINCAPINS +CHINCH +CHINCHERINCHEE +CHINCHERINCHEES +CHINCHES +CHINCHIER +CHINCHIEST +CHINCHILLA +CHINCHILLAS +CHINCHY +CHINE +CHINED +CHINES +CHINING +CHINK +CHINKAPIN +CHINKAPINS +CHINKED +CHINKIER +CHINKIEST +CHINKING +CHINKS +CHINKY +CHINLESS +CHINNED +CHINNING +CHINO +CHINOISERIE +CHINOISERIES +CHINONE +CHINONES +CHINOOK +CHINOOKS +CHINOS +CHINQUAPIN +CHINQUAPINS +CHINS +CHINSTRAP +CHINSTRAPS +CHINTS +CHINTSES +CHINTZ +CHINTZES +CHINTZIER +CHINTZIEST +CHINTZY +CHINWAG +CHINWAGGED +CHINWAGGING +CHINWAGS +CHIONODOXA +CHIONODOXAS +CHIP +CHIPBOARD +CHIPBOARDS +CHIPMUCK +CHIPMUCKS +CHIPMUNK +CHIPMUNKS +CHIPOTLE +CHIPOTLES +CHIPPABLE +CHIPPED +CHIPPER +CHIPPERED +CHIPPERING +CHIPPERS +CHIPPIE +CHIPPIER +CHIPPIES +CHIPPIEST +CHIPPING +CHIPPY +CHIPS +CHIRAL +CHIRALITIES +CHIRALITY +CHIRIMOYA +CHIRIMOYAS +CHIRK +CHIRKED +CHIRKER +CHIRKEST +CHIRKING +CHIRKS +CHIRM +CHIRMED +CHIRMING +CHIRMS +CHIRO +CHIROGRAPHER +CHIROGRAPHERS +CHIROGRAPHIC +CHIROGRAPHICAL +CHIROGRAPHIES +CHIROGRAPHY +CHIROMANCER +CHIROMANCERS +CHIROMANCIES +CHIROMANCY +CHIRONOMID +CHIRONOMIDS +CHIROPODIES +CHIROPODIST +CHIROPODISTS +CHIROPODY +CHIROPRACTIC +CHIROPRACTICS +CHIROPRACTOR +CHIROPRACTORS +CHIROPTER +CHIROPTERAN +CHIROPTERANS +CHIROPTERS +CHIROS +CHIRP +CHIRPED +CHIRPER +CHIRPERS +CHIRPIER +CHIRPIEST +CHIRPILY +CHIRPING +CHIRPS +CHIRPY +CHIRR +CHIRRE +CHIRRED +CHIRREN +CHIRRES +CHIRRING +CHIRRS +CHIRRUP +CHIRRUPED +CHIRRUPING +CHIRRUPS +CHIRRUPY +CHIRU +CHIRURGEON +CHIRURGEONS +CHIRUS +CHIS +CHISEL +CHISELED +CHISELER +CHISELERS +CHISELING +CHISELLED +CHISELLER +CHISELLERS +CHISELLING +CHISELS +CHIT +CHITAL +CHITCHAT +CHITCHATS +CHITCHATTED +CHITCHATTING +CHITIN +CHITINOID +CHITINOUS +CHITINS +CHITLIN +CHITLING +CHITLINGS +CHITLINS +CHITON +CHITONS +CHITOSAN +CHITOSANS +CHITS +CHITTER +CHITTERED +CHITTERING +CHITTERLINGS +CHITTERS +CHITTIES +CHITTY +CHIVALRIC +CHIVALRIES +CHIVALROUS +CHIVALROUSLY +CHIVALROUSNESS +CHIVALRY +CHIVAREE +CHIVAREED +CHIVAREEING +CHIVAREES +CHIVARI +CHIVARIED +CHIVARIES +CHIVARIING +CHIVE +CHIVES +CHIVIED +CHIVIES +CHIVVIED +CHIVVIES +CHIVVY +CHIVVYING +CHIVY +CHIVYING +CHLAMYDES +CHLAMYDIA +CHLAMYDIAE +CHLAMYDIAL +CHLAMYDOSPORE +CHLAMYDOSPORES +CHLAMYS +CHLAMYSES +CHLOASMA +CHLOASMAS +CHLOASMATA +CHLORACNE +CHLORACNES +CHLORAL +CHLORALOSE +CHLORALOSED +CHLORALOSES +CHLORALS +CHLORAMINE +CHLORAMINES +CHLORAMPHENICOL +CHLORATE +CHLORATES +CHLORDAN +CHLORDANE +CHLORDANES +CHLORDANS +CHLORELLA +CHLORELLAS +CHLORENCHYMA +CHLORENCHYMAS +CHLORIC +CHLORID +CHLORIDE +CHLORIDES +CHLORIDIC +CHLORIDS +CHLORIN +CHLORINATE +CHLORINATED +CHLORINATES +CHLORINATING +CHLORINATION +CHLORINATIONS +CHLORINATOR +CHLORINATORS +CHLORINE +CHLORINES +CHLORINITIES +CHLORINITY +CHLORINS +CHLORITE +CHLORITES +CHLORITIC +CHLOROBENZENE +CHLOROBENZENES +CHLOROFORM +CHLOROFORMED +CHLOROFORMING +CHLOROFORMS +CHLOROHYDRIN +CHLOROHYDRINS +CHLOROPHYLL +CHLOROPHYLLOUS +CHLOROPHYLLS +CHLOROPICRIN +CHLOROPICRINS +CHLOROPLAST +CHLOROPLASTIC +CHLOROPLASTS +CHLOROPRENE +CHLOROPRENES +CHLOROQUINE +CHLOROQUINES +CHLOROSES +CHLOROSIS +CHLOROTHIAZIDE +CHLOROTHIAZIDES +CHLOROTIC +CHLOROUS +CHLORPROMAZINE +CHLORPROMAZINES +CHLORPROPAMIDE +CHLORPROPAMIDES +CHOANA +CHOANAE +CHOANOCYTE +CHOANOCYTES +CHOCK +CHOCKABLOCK +CHOCKED +CHOCKFUL +CHOCKFULL +CHOCKING +CHOCKS +CHOCOHOLIC +CHOCOHOLICS +CHOCOLATE +CHOCOLATES +CHOCOLATEY +CHOCOLATIER +CHOCOLATIERS +CHOCOLATY +CHOICE +CHOICELY +CHOICENESS +CHOICENESSES +CHOICER +CHOICES +CHOICEST +CHOIR +CHOIRBOY +CHOIRBOYS +CHOIRED +CHOIRGIRL +CHOIRGIRLS +CHOIRING +CHOIRMASTER +CHOIRMASTERS +CHOIRS +CHOKE +CHOKEABLE +CHOKEBERRIES +CHOKEBERRY +CHOKEBORE +CHOKEBORES +CHOKECHERRIES +CHOKECHERRY +CHOKED +CHOKEDAMP +CHOKEDAMPS +CHOKEHOLD +CHOKEHOLDS +CHOKER +CHOKERS +CHOKES +CHOKEY +CHOKIER +CHOKIEST +CHOKING +CHOKINGLY +CHOKY +CHOLA +CHOLANGIOGRAM +CHOLANGIOGRAMS +CHOLANGIOGRAPHY +CHOLAS +CHOLATE +CHOLATES +CHOLECALCIFEROL +CHOLECYST +CHOLECYSTECTOMY +CHOLECYSTITIS +CHOLECYSTITISES +CHOLECYSTOKININ +CHOLECYSTS +CHOLELITHIASES +CHOLELITHIASIS +CHOLENT +CHOLENTS +CHOLER +CHOLERA +CHOLERAIC +CHOLERAS +CHOLERIC +CHOLERICALLY +CHOLEROID +CHOLERS +CHOLESTASES +CHOLESTASIS +CHOLESTATIC +CHOLESTERIC +CHOLESTEROL +CHOLESTEROLS +CHOLESTYRAMINE +CHOLESTYRAMINES +CHOLINE +CHOLINERGIC +CHOLINERGICALLY +CHOLINES +CHOLINESTERASE +CHOLINESTERASES +CHOLLA +CHOLLAS +CHOLO +CHOLOS +CHOMP +CHOMPED +CHOMPER +CHOMPERS +CHOMPING +CHOMPS +CHON +CHONDRIOSOME +CHONDRIOSOMES +CHONDRITE +CHONDRITES +CHONDRITIC +CHONDROCRANIA +CHONDROCRANIUM +CHONDROCRANIUMS +CHONDROITIN +CHONDROITINS +CHONDROMA +CHONDROMAS +CHONDROMATA +CHONDRULE +CHONDRULES +CHOOK +CHOOKS +CHOOSE +CHOOSER +CHOOSERS +CHOOSES +CHOOSEY +CHOOSIER +CHOOSIEST +CHOOSING +CHOOSY +CHOP +CHOPFALLEN +CHOPHOUSE +CHOPHOUSES +CHOPIN +CHOPINE +CHOPINES +CHOPINS +CHOPLOGIC +CHOPLOGICS +CHOPPED +CHOPPER +CHOPPERED +CHOPPERING +CHOPPERS +CHOPPIER +CHOPPIEST +CHOPPILY +CHOPPINESS +CHOPPINESSES +CHOPPING +CHOPPY +CHOPS +CHOPSOCKIES +CHOPSOCKY +CHOPSTICK +CHOPSTICKS +CHORAGI +CHORAGIC +CHORAGUS +CHORAGUSES +CHORAL +CHORALE +CHORALES +CHORALLY +CHORALS +CHORD +CHORDAL +CHORDAMESODERM +CHORDAMESODERMS +CHORDATE +CHORDATES +CHORDED +CHORDING +CHORDS +CHORE +CHOREA +CHOREAL +CHOREAS +CHOREATIC +CHORED +CHOREGI +CHOREGUS +CHOREGUSES +CHOREIC +CHOREIFORM +CHOREMAN +CHOREMEN +CHOREOGRAPH +CHOREOGRAPHED +CHOREOGRAPHER +CHOREOGRAPHERS +CHOREOGRAPHIC +CHOREOGRAPHIES +CHOREOGRAPHING +CHOREOGRAPHS +CHOREOGRAPHY +CHOREOID +CHORES +CHORIAL +CHORIAMB +CHORIAMBS +CHORIC +CHORINE +CHORINES +CHORING +CHORIOALLANTOIC +CHORIOALLANTOIS +CHORIOCARCINOMA +CHORIOID +CHORIOIDS +CHORION +CHORIONIC +CHORIONS +CHORISTER +CHORISTERS +CHORIZO +CHORIZOS +CHOROGRAPHER +CHOROGRAPHERS +CHOROGRAPHIC +CHOROGRAPHIES +CHOROGRAPHY +CHOROID +CHOROIDAL +CHOROIDS +CHORTEN +CHORTENS +CHORTLE +CHORTLED +CHORTLER +CHORTLERS +CHORTLES +CHORTLING +CHORUS +CHORUSED +CHORUSES +CHORUSING +CHORUSSED +CHORUSSES +CHORUSSING +CHOSE +CHOSEN +CHOSES +CHOTT +CHOTTS +CHOUGH +CHOUGHS +CHOUSE +CHOUSED +CHOUSER +CHOUSERS +CHOUSES +CHOUSH +CHOUSHES +CHOUSING +CHOW +CHOWCHOW +CHOWCHOWS +CHOWDER +CHOWDERED +CHOWDERHEAD +CHOWDERHEADED +CHOWDERHEADS +CHOWDERING +CHOWDERS +CHOWED +CHOWHOUND +CHOWHOUNDS +CHOWING +CHOWS +CHOWSE +CHOWSED +CHOWSES +CHOWSING +CHOWTIME +CHOWTIMES +CHRESARD +CHRESARDS +CHRESTOMATHIES +CHRESTOMATHY +CHRISM +CHRISMA +CHRISMAL +CHRISMATION +CHRISMATIONS +CHRISMON +CHRISMONS +CHRISMS +CHRISOM +CHRISOMS +CHRISTEN +CHRISTENED +CHRISTENING +CHRISTENINGS +CHRISTENS +CHRISTIANIA +CHRISTIANIAS +CHRISTIE +CHRISTIES +CHRISTY +CHROMA +CHROMAFFIN +CHROMAS +CHROMATE +CHROMATES +CHROMATIC +CHROMATICALLY +CHROMATICISM +CHROMATICISMS +CHROMATICITIES +CHROMATICITY +CHROMATICS +CHROMATID +CHROMATIDS +CHROMATIN +CHROMATINIC +CHROMATINS +CHROMATOGRAM +CHROMATOGRAMS +CHROMATOGRAPH +CHROMATOGRAPHED +CHROMATOGRAPHER +CHROMATOGRAPHIC +CHROMATOGRAPHS +CHROMATOGRAPHY +CHROMATOLYSES +CHROMATOLYSIS +CHROMATOLYTIC +CHROMATOPHORE +CHROMATOPHORES +CHROME +CHROMED +CHROMES +CHROMIC +CHROMIDE +CHROMIDES +CHROMIER +CHROMIEST +CHROMINANCE +CHROMINANCES +CHROMING +CHROMINGS +CHROMITE +CHROMITES +CHROMIUM +CHROMIUMS +CHROMIZE +CHROMIZED +CHROMIZES +CHROMIZING +CHROMO +CHROMOCENTER +CHROMOCENTERS +CHROMODYNAMICS +CHROMOGEN +CHROMOGENIC +CHROMOGENS +CHROMOMERE +CHROMOMERES +CHROMOMERIC +CHROMONEMA +CHROMONEMATA +CHROMONEMATIC +CHROMOPHIL +CHROMOPHOBE +CHROMOPHORE +CHROMOPHORES +CHROMOPHORIC +CHROMOPLAST +CHROMOPLASTS +CHROMOPROTEIN +CHROMOPROTEINS +CHROMOS +CHROMOSOMAL +CHROMOSOMALLY +CHROMOSOME +CHROMOSOMES +CHROMOSPHERE +CHROMOSPHERES +CHROMOSPHERIC +CHROMOUS +CHROMY +CHROMYL +CHROMYLS +CHRONAXIE +CHRONAXIES +CHRONAXY +CHRONIC +CHRONICALLY +CHRONICITIES +CHRONICITY +CHRONICLE +CHRONICLED +CHRONICLER +CHRONICLERS +CHRONICLES +CHRONICLING +CHRONICS +CHRONOBIOLOGIC +CHRONOBIOLOGIES +CHRONOBIOLOGIST +CHRONOBIOLOGY +CHRONOGRAM +CHRONOGRAMS +CHRONOGRAPH +CHRONOGRAPHIC +CHRONOGRAPHIES +CHRONOGRAPHS +CHRONOGRAPHY +CHRONOLOGER +CHRONOLOGERS +CHRONOLOGIC +CHRONOLOGICAL +CHRONOLOGICALLY +CHRONOLOGIES +CHRONOLOGIST +CHRONOLOGISTS +CHRONOLOGY +CHRONOMETER +CHRONOMETERS +CHRONOMETRIC +CHRONOMETRICAL +CHRONOMETRIES +CHRONOMETRY +CHRONON +CHRONONS +CHRONOTHERAPIES +CHRONOTHERAPY +CHRYSALID +CHRYSALIDES +CHRYSALIDS +CHRYSALIS +CHRYSALISES +CHRYSANTHEMUM +CHRYSANTHEMUMS +CHRYSAROBIN +CHRYSAROBINS +CHRYSOBERYL +CHRYSOBERYLS +CHRYSOLITE +CHRYSOLITES +CHRYSOMELID +CHRYSOMELIDS +CHRYSOPHYTE +CHRYSOPHYTES +CHRYSOPRASE +CHRYSOPRASES +CHRYSOTILE +CHRYSOTILES +CHTHONIAN +CHTHONIC +CHUB +CHUBASCO +CHUBASCOS +CHUBBIER +CHUBBIEST +CHUBBILY +CHUBBINESS +CHUBBINESSES +CHUBBY +CHUBS +CHUCK +CHUCKAWALLA +CHUCKAWALLAS +CHUCKED +CHUCKHOLE +CHUCKHOLES +CHUCKIES +CHUCKING +CHUCKLE +CHUCKLED +CHUCKLEHEAD +CHUCKLEHEADED +CHUCKLEHEADS +CHUCKLER +CHUCKLERS +CHUCKLES +CHUCKLESOME +CHUCKLING +CHUCKLINGLY +CHUCKS +CHUCKWALLA +CHUCKWALLAS +CHUCKY +CHUDDAH +CHUDDAHS +CHUDDAR +CHUDDARS +CHUDDER +CHUDDERS +CHUFA +CHUFAS +CHUFF +CHUFFED +CHUFFER +CHUFFEST +CHUFFIER +CHUFFIEST +CHUFFING +CHUFFS +CHUFFY +CHUG +CHUGALUG +CHUGALUGGED +CHUGALUGGING +CHUGALUGS +CHUGGED +CHUGGER +CHUGGERS +CHUGGING +CHUGS +CHUKAR +CHUKARS +CHUKKA +CHUKKAR +CHUKKARS +CHUKKAS +CHUKKER +CHUKKERS +CHUM +CHUMMED +CHUMMIER +CHUMMIEST +CHUMMILY +CHUMMINESS +CHUMMINESSES +CHUMMING +CHUMMY +CHUMP +CHUMPED +CHUMPING +CHUMPS +CHUMS +CHUMSHIP +CHUMSHIPS +CHUNK +CHUNKED +CHUNKIER +CHUNKIEST +CHUNKILY +CHUNKING +CHUNKS +CHUNKY +CHUNNEL +CHUNNELS +CHUNTER +CHUNTERED +CHUNTERING +CHUNTERS +CHUPPA +CHUPPAH +CHUPPAHS +CHUPPAS +CHURCH +CHURCHED +CHURCHES +CHURCHGOER +CHURCHGOERS +CHURCHGOING +CHURCHGOINGS +CHURCHIANITIES +CHURCHIANITY +CHURCHIER +CHURCHIEST +CHURCHING +CHURCHINGS +CHURCHLESS +CHURCHLIER +CHURCHLIEST +CHURCHLINESS +CHURCHLINESSES +CHURCHLY +CHURCHMAN +CHURCHMANSHIP +CHURCHMANSHIPS +CHURCHMEN +CHURCHWARDEN +CHURCHWARDENS +CHURCHWOMAN +CHURCHWOMEN +CHURCHY +CHURCHYARD +CHURCHYARDS +CHURL +CHURLISH +CHURLISHLY +CHURLISHNESS +CHURLISHNESSES +CHURLS +CHURN +CHURNED +CHURNER +CHURNERS +CHURNING +CHURNINGS +CHURNS +CHURR +CHURRED +CHURRIGUERESQUE +CHURRING +CHURRO +CHURROS +CHURRS +CHUTE +CHUTED +CHUTES +CHUTING +CHUTIST +CHUTISTS +CHUTNEE +CHUTNEES +CHUTNEY +CHUTNEYS +CHUTZPA +CHUTZPAH +CHUTZPAHS +CHUTZPAS +CHYLE +CHYLES +CHYLOMICRON +CHYLOMICRONS +CHYLOUS +CHYME +CHYMES +CHYMIC +CHYMICS +CHYMIST +CHYMISTS +CHYMOSIN +CHYMOSINS +CHYMOTRYPSIN +CHYMOTRYPSINS +CHYMOTRYPTIC +CHYMOUS +CHYTRID +CHYTRIDS +CIAO +CIBOL +CIBOLS +CIBORIA +CIBORIUM +CIBOULE +CIBOULES +CICADA +CICADAE +CICADAS +CICALA +CICALAS +CICALE +CICATRICE +CICATRICES +CICATRICIAL +CICATRIX +CICATRIXES +CICATRIZATION +CICATRIZATIONS +CICATRIZE +CICATRIZED +CICATRIZES +CICATRIZING +CICELIES +CICELY +CICERO +CICERONE +CICERONES +CICERONI +CICEROS +CICHLID +CICHLIDAE +CICHLIDS +CICISBEI +CICISBEISM +CICISBEISMS +CICISBEO +CICISBEOS +CICOREE +CICOREES +CIDER +CIDERS +CIG +CIGAR +CIGARET +CIGARETS +CIGARETTE +CIGARETTES +CIGARILLO +CIGARILLOS +CIGARLIKE +CIGARS +CIGS +CIGUATERA +CIGUATERAS +CILANTRO +CILANTROS +CILIA +CILIARY +CILIATE +CILIATED +CILIATELY +CILIATES +CILIATION +CILIATIONS +CILICE +CILICES +CILIOLATE +CILIUM +CIMBALOM +CIMBALOMS +CIMETIDINE +CIMETIDINES +CIMEX +CIMICES +CINCH +CINCHED +CINCHES +CINCHING +CINCHONA +CINCHONAS +CINCHONIC +CINCHONINE +CINCHONINES +CINCHONISM +CINCHONISMS +CINCTURE +CINCTURED +CINCTURES +CINCTURING +CINDER +CINDERED +CINDERING +CINDEROUS +CINDERS +CINDERY +CINE +CINEAST +CINEASTE +CINEASTES +CINEASTS +CINEMA +CINEMAGOER +CINEMAGOERS +CINEMAS +CINEMATHEQUE +CINEMATHEQUES +CINEMATIC +CINEMATICALLY +CINEMATIZE +CINEMATIZED +CINEMATIZES +CINEMATIZING +CINEMATOGRAPH +CINEMATOGRAPHER +CINEMATOGRAPHIC +CINEMATOGRAPHS +CINEMATOGRAPHY +CINEOL +CINEOLE +CINEOLES +CINEOLS +CINEPHILE +CINEPHILES +CINERARIA +CINERARIAS +CINERARIUM +CINERARY +CINEREOUS +CINERIN +CINERINS +CINES +CINGULA +CINGULAR +CINGULATE +CINGULUM +CINNABAR +CINNABARINE +CINNABARS +CINNAMIC +CINNAMON +CINNAMONS +CINNAMONY +CINNAMYL +CINNAMYLS +CINQUAIN +CINQUAINS +CINQUE +CINQUECENTIST +CINQUECENTISTS +CINQUECENTO +CINQUECENTOS +CINQUEFOIL +CINQUEFOILS +CINQUES +CION +CIONS +CIOPPINO +CIOPPINOS +CIPHER +CIPHERED +CIPHERER +CIPHERERS +CIPHERING +CIPHERS +CIPHERTEXT +CIPHERTEXTS +CIPHONIES +CIPHONY +CIPOLIN +CIPOLINS +CIPOLLINO +CIPOLLINOS +CIRCA +CIRCADIAN +CIRCINATE +CIRCINATELY +CIRCLE +CIRCLED +CIRCLER +CIRCLERS +CIRCLES +CIRCLET +CIRCLETS +CIRCLING +CIRCUIT +CIRCUITAL +CIRCUITED +CIRCUITIES +CIRCUITING +CIRCUITOUS +CIRCUITOUSLY +CIRCUITOUSNESS +CIRCUITRIES +CIRCUITRY +CIRCUITS +CIRCUITY +CIRCULAR +CIRCULARISE +CIRCULARISED +CIRCULARISES +CIRCULARISING +CIRCULARITIES +CIRCULARITY +CIRCULARIZATION +CIRCULARIZE +CIRCULARIZED +CIRCULARIZES +CIRCULARIZING +CIRCULARLY +CIRCULARNESS +CIRCULARNESSES +CIRCULARS +CIRCULATABLE +CIRCULATE +CIRCULATED +CIRCULATES +CIRCULATING +CIRCULATION +CIRCULATIONS +CIRCULATIVE +CIRCULATOR +CIRCULATORS +CIRCULATORY +CIRCUMAMBIENT +CIRCUMAMBIENTLY +CIRCUMAMBULATE +CIRCUMAMBULATED +CIRCUMAMBULATES +CIRCUMCENTER +CIRCUMCENTERS +CIRCUMCIRCLE +CIRCUMCIRCLES +CIRCUMCISE +CIRCUMCISED +CIRCUMCISER +CIRCUMCISERS +CIRCUMCISES +CIRCUMCISING +CIRCUMCISION +CIRCUMCISIONS +CIRCUMFERENCE +CIRCUMFERENCES +CIRCUMFERENTIAL +CIRCUMFLEX +CIRCUMFLEXES +CIRCUMFLUENT +CIRCUMFLUOUS +CIRCUMFUSE +CIRCUMFUSED +CIRCUMFUSES +CIRCUMFUSING +CIRCUMFUSION +CIRCUMFUSIONS +CIRCUMJACENT +CIRCUMLOCUTION +CIRCUMLOCUTIONS +CIRCUMLOCUTORY +CIRCUMLUNAR +CIRCUMNAVIGATE +CIRCUMNAVIGATED +CIRCUMNAVIGATES +CIRCUMNAVIGATOR +CIRCUMPOLAR +CIRCUMSCISSILE +CIRCUMSCRIBE +CIRCUMSCRIBED +CIRCUMSCRIBES +CIRCUMSCRIBING +CIRCUMSCRIPTION +CIRCUMSPECT +CIRCUMSPECTION +CIRCUMSPECTIONS +CIRCUMSPECTLY +CIRCUMSTANCE +CIRCUMSTANCED +CIRCUMSTANCES +CIRCUMSTANTIAL +CIRCUMSTANTIATE +CIRCUMSTELLAR +CIRCUMVALLATE +CIRCUMVALLATED +CIRCUMVALLATES +CIRCUMVALLATING +CIRCUMVALLATION +CIRCUMVENT +CIRCUMVENTED +CIRCUMVENTING +CIRCUMVENTION +CIRCUMVENTIONS +CIRCUMVENTS +CIRCUMVOLUTION +CIRCUMVOLUTIONS +CIRCUS +CIRCUSES +CIRCUSY +CIRE +CIRES +CIRQUE +CIRQUES +CIRRATE +CIRRHOSED +CIRRHOSES +CIRRHOSIS +CIRRHOTIC +CIRRHOTICS +CIRRI +CIRRIFORM +CIRRIPED +CIRRIPEDE +CIRRIPEDES +CIRRIPEDS +CIRROCUMULI +CIRROCUMULUS +CIRROSE +CIRROSTRATI +CIRROSTRATUS +CIRROUS +CIRRUS +CIRSOID +CIS +CISALPINE +CISCO +CISCOES +CISCOS +CISLUNAR +CISPLATIN +CISPLATINS +CISSIES +CISSOID +CISSOIDS +CISSY +CIST +CISTED +CISTERN +CISTERNA +CISTERNAE +CISTERNAL +CISTERNS +CISTRON +CISTRONIC +CISTRONS +CISTS +CISTUS +CISTUSES +CITABLE +CITADEL +CITADELS +CITATION +CITATIONAL +CITATIONS +CITATOR +CITATORS +CITATORY +CITE +CITEABLE +CITED +CITER +CITERS +CITES +CITHARA +CITHARAS +CITHER +CITHERN +CITHERNS +CITHERS +CITHREN +CITHRENS +CITIED +CITIES +CITIFICATION +CITIFICATIONS +CITIFIED +CITIFIES +CITIFY +CITIFYING +CITING +CITIZEN +CITIZENESS +CITIZENESSES +CITIZENLY +CITIZENRIES +CITIZENRY +CITIZENS +CITIZENSHIP +CITIZENSHIPS +CITOLA +CITOLAS +CITOLE +CITOLES +CITRAL +CITRALS +CITRATE +CITRATED +CITRATES +CITREOUS +CITRIC +CITRICULTURE +CITRICULTURES +CITRICULTURIST +CITRICULTURISTS +CITRIN +CITRINE +CITRINES +CITRININ +CITRININS +CITRINS +CITRON +CITRONELLA +CITRONELLAL +CITRONELLALS +CITRONELLAS +CITRONELLOL +CITRONELLOLS +CITRONS +CITROUS +CITRULLINE +CITRULLINES +CITRUS +CITRUSES +CITRUSY +CITTERN +CITTERNS +CITY +CITYFIED +CITYSCAPE +CITYSCAPES +CITYWARD +CITYWIDE +CIVET +CIVETLIKE +CIVETS +CIVIC +CIVICALLY +CIVICISM +CIVICISMS +CIVICS +CIVIE +CIVIES +CIVIL +CIVILIAN +CIVILIANIZATION +CIVILIANIZE +CIVILIANIZED +CIVILIANIZES +CIVILIANIZING +CIVILIANS +CIVILISATION +CIVILISATIONS +CIVILISE +CIVILISED +CIVILISES +CIVILISING +CIVILITIES +CIVILITY +CIVILIZATION +CIVILIZATIONAL +CIVILIZATIONS +CIVILIZE +CIVILIZED +CIVILIZER +CIVILIZERS +CIVILIZES +CIVILIZING +CIVILLY +CIVILNESS +CIVILNESSES +CIVISM +CIVISMS +CIVVIES +CIVVY +CLABBER +CLABBERED +CLABBERING +CLABBERS +CLACH +CLACHAN +CLACHANS +CLACHS +CLACK +CLACKED +CLACKER +CLACKERS +CLACKING +CLACKS +CLAD +CLADDAGH +CLADDAGHS +CLADDED +CLADDING +CLADDINGS +CLADE +CLADES +CLADISM +CLADISMS +CLADIST +CLADISTIC +CLADISTICALLY +CLADISTICS +CLADISTS +CLADOCERAN +CLADOCERANS +CLADODE +CLADODES +CLADODIAL +CLADOGENESES +CLADOGENESIS +CLADOGENETIC +CLADOGRAM +CLADOGRAMS +CLADOPHYLL +CLADOPHYLLS +CLADS +CLAFOUTI +CLAFOUTIS +CLAG +CLAGGED +CLAGGING +CLAGS +CLAIM +CLAIMABLE +CLAIMANT +CLAIMANTS +CLAIMED +CLAIMER +CLAIMERS +CLAIMING +CLAIMS +CLAIRAUDIENCE +CLAIRAUDIENCES +CLAIRAUDIENT +CLAIRAUDIENTLY +CLAIRVOYANCE +CLAIRVOYANCES +CLAIRVOYANT +CLAIRVOYANTLY +CLAIRVOYANTS +CLAM +CLAMANT +CLAMANTLY +CLAMBAKE +CLAMBAKES +CLAMBER +CLAMBERED +CLAMBERER +CLAMBERERS +CLAMBERING +CLAMBERS +CLAMLIKE +CLAMMED +CLAMMER +CLAMMERS +CLAMMIER +CLAMMIEST +CLAMMILY +CLAMMINESS +CLAMMINESSES +CLAMMING +CLAMMY +CLAMOR +CLAMORED +CLAMORER +CLAMORERS +CLAMORING +CLAMOROUS +CLAMOROUSLY +CLAMOROUSNESS +CLAMOROUSNESSES +CLAMORS +CLAMOUR +CLAMOURED +CLAMOURING +CLAMOURS +CLAMP +CLAMPDOWN +CLAMPDOWNS +CLAMPED +CLAMPER +CLAMPERS +CLAMPING +CLAMPS +CLAMS +CLAMSHELL +CLAMSHELLS +CLAMWORM +CLAMWORMS +CLAN +CLANDESTINE +CLANDESTINELY +CLANDESTINENESS +CLANDESTINITIES +CLANDESTINITY +CLANG +CLANGED +CLANGER +CLANGERS +CLANGING +CLANGOR +CLANGORED +CLANGORING +CLANGOROUS +CLANGOROUSLY +CLANGORS +CLANGOUR +CLANGOURED +CLANGOURING +CLANGOURS +CLANGS +CLANK +CLANKED +CLANKIER +CLANKIEST +CLANKING +CLANKINGLY +CLANKS +CLANKY +CLANNISH +CLANNISHLY +CLANNISHNESS +CLANNISHNESSES +CLANS +CLANSMAN +CLANSMEN +CLAP +CLAPBOARD +CLAPBOARDED +CLAPBOARDING +CLAPBOARDS +CLAPPED +CLAPPER +CLAPPERCLAW +CLAPPERCLAWED +CLAPPERCLAWING +CLAPPERCLAWS +CLAPPERS +CLAPPING +CLAPS +CLAPT +CLAPTRAP +CLAPTRAPS +CLAQUE +CLAQUER +CLAQUERS +CLAQUES +CLAQUEUR +CLAQUEURS +CLARENCE +CLARENCES +CLARET +CLARETS +CLARIES +CLARIFICATION +CLARIFICATIONS +CLARIFIED +CLARIFIER +CLARIFIERS +CLARIFIES +CLARIFY +CLARIFYING +CLARINET +CLARINETIST +CLARINETISTS +CLARINETS +CLARINETTIST +CLARINETTISTS +CLARION +CLARIONED +CLARIONET +CLARIONETS +CLARIONING +CLARIONS +CLARITIES +CLARITY +CLARKIA +CLARKIAS +CLARO +CLAROES +CLAROS +CLARY +CLASH +CLASHED +CLASHER +CLASHERS +CLASHES +CLASHING +CLASP +CLASPED +CLASPER +CLASPERS +CLASPING +CLASPS +CLASPT +CLASS +CLASSABLE +CLASSED +CLASSER +CLASSERS +CLASSES +CLASSIC +CLASSICAL +CLASSICALITIES +CLASSICALITY +CLASSICALLY +CLASSICALS +CLASSICISM +CLASSICISMS +CLASSICIST +CLASSICISTIC +CLASSICISTS +CLASSICIZE +CLASSICIZED +CLASSICIZES +CLASSICIZING +CLASSICO +CLASSICS +CLASSIER +CLASSIEST +CLASSIFIABLE +CLASSIFICATION +CLASSIFICATIONS +CLASSIFICATORY +CLASSIFIED +CLASSIFIER +CLASSIFIERS +CLASSIFIES +CLASSIFY +CLASSIFYING +CLASSILY +CLASSINESS +CLASSINESSES +CLASSING +CLASSIS +CLASSISM +CLASSISMS +CLASSIST +CLASSISTS +CLASSLESS +CLASSLESSNESS +CLASSLESSNESSES +CLASSMATE +CLASSMATES +CLASSON +CLASSONS +CLASSROOM +CLASSROOMS +CLASSWORK +CLASSWORKS +CLASSY +CLAST +CLASTIC +CLASTICS +CLASTS +CLATHRATE +CLATHRATES +CLATTER +CLATTERED +CLATTERER +CLATTERERS +CLATTERING +CLATTERINGLY +CLATTERS +CLATTERY +CLAUCHT +CLAUDICATION +CLAUDICATIONS +CLAUGHT +CLAUGHTED +CLAUGHTING +CLAUGHTS +CLAUSAL +CLAUSE +CLAUSES +CLAUSTRA +CLAUSTRAL +CLAUSTROPHOBE +CLAUSTROPHOBES +CLAUSTROPHOBIA +CLAUSTROPHOBIAS +CLAUSTROPHOBIC +CLAUSTRUM +CLAVATE +CLAVATELY +CLAVATION +CLAVATIONS +CLAVE +CLAVER +CLAVERED +CLAVERING +CLAVERS +CLAVES +CLAVI +CLAVICHORD +CLAVICHORDIST +CLAVICHORDISTS +CLAVICHORDS +CLAVICLE +CLAVICLES +CLAVICORN +CLAVICULAR +CLAVIER +CLAVIERIST +CLAVIERISTIC +CLAVIERISTS +CLAVIERS +CLAVIFORM +CLAVUS +CLAW +CLAWBACK +CLAWBACKS +CLAWED +CLAWER +CLAWERS +CLAWHAMMER +CLAWING +CLAWLESS +CLAWLIKE +CLAWS +CLAXON +CLAXONS +CLAY +CLAYBANK +CLAYBANKS +CLAYED +CLAYEY +CLAYIER +CLAYIEST +CLAYING +CLAYISH +CLAYLIKE +CLAYMORE +CLAYMORES +CLAYPAN +CLAYPANS +CLAYS +CLAYSTONE +CLAYSTONES +CLAYTONIA +CLAYTONIAS +CLAYWARE +CLAYWARES +CLEAN +CLEANABILITIES +CLEANABILITY +CLEANABLE +CLEANED +CLEANER +CLEANERS +CLEANEST +CLEANHANDED +CLEANING +CLEANLIER +CLEANLIEST +CLEANLINESS +CLEANLINESSES +CLEANLY +CLEANNESS +CLEANNESSES +CLEANS +CLEANSE +CLEANSED +CLEANSER +CLEANSERS +CLEANSES +CLEANSING +CLEANUP +CLEANUPS +CLEAR +CLEARABLE +CLEARANCE +CLEARANCES +CLEARCUT +CLEARCUTS +CLEARCUTTING +CLEARED +CLEARER +CLEARERS +CLEAREST +CLEAREYED +CLEARHEADED +CLEARHEADEDLY +CLEARHEADEDNESS +CLEARING +CLEARINGHOUSE +CLEARINGHOUSES +CLEARINGS +CLEARLY +CLEARNESS +CLEARNESSES +CLEARS +CLEARSTORIES +CLEARSTORY +CLEARWEED +CLEARWEEDS +CLEARWING +CLEARWINGS +CLEAT +CLEATED +CLEATING +CLEATS +CLEAVABLE +CLEAVAGE +CLEAVAGES +CLEAVE +CLEAVED +CLEAVER +CLEAVERS +CLEAVES +CLEAVING +CLEEK +CLEEKED +CLEEKING +CLEEKS +CLEF +CLEFS +CLEFT +CLEFTED +CLEFTING +CLEFTS +CLEIDOIC +CLEISTOGAMIC +CLEISTOGAMIES +CLEISTOGAMOUS +CLEISTOGAMOUSLY +CLEISTOGAMY +CLEMATIS +CLEMATISES +CLEMENCIES +CLEMENCY +CLEMENT +CLEMENTLY +CLENCH +CLENCHED +CLENCHER +CLENCHERS +CLENCHES +CLENCHING +CLEOME +CLEOMES +CLEPE +CLEPED +CLEPES +CLEPING +CLEPSYDRA +CLEPSYDRAE +CLEPSYDRAS +CLEPT +CLERESTORIES +CLERESTORY +CLERGIES +CLERGY +CLERGYMAN +CLERGYMEN +CLERGYWOMAN +CLERGYWOMEN +CLERIC +CLERICAL +CLERICALISM +CLERICALISMS +CLERICALIST +CLERICALISTS +CLERICALLY +CLERICALS +CLERICS +CLERID +CLERIDS +CLERIHEW +CLERIHEWS +CLERISIES +CLERISY +CLERK +CLERKDOM +CLERKDOMS +CLERKED +CLERKING +CLERKISH +CLERKLIER +CLERKLIEST +CLERKLY +CLERKS +CLERKSHIP +CLERKSHIPS +CLEVEITE +CLEVEITES +CLEVER +CLEVERER +CLEVEREST +CLEVERISH +CLEVERLY +CLEVERNESS +CLEVERNESSES +CLEVIS +CLEVISES +CLEW +CLEWED +CLEWING +CLEWS +CLICHE +CLICHED +CLICHES +CLICK +CLICKABLE +CLICKED +CLICKER +CLICKERS +CLICKING +CLICKLESS +CLICKS +CLICKWRAP +CLIENT +CLIENTAGE +CLIENTAGES +CLIENTAL +CLIENTELE +CLIENTELES +CLIENTLESS +CLIENTS +CLIFF +CLIFFIER +CLIFFIEST +CLIFFLIKE +CLIFFS +CLIFFY +CLIFT +CLIFTS +CLIMACTERIC +CLIMACTERICS +CLIMACTIC +CLIMACTICALLY +CLIMATAL +CLIMATE +CLIMATES +CLIMATIC +CLIMATICALLY +CLIMATIZE +CLIMATIZED +CLIMATIZES +CLIMATIZING +CLIMATOLOGICAL +CLIMATOLOGIES +CLIMATOLOGIST +CLIMATOLOGISTS +CLIMATOLOGY +CLIMAX +CLIMAXED +CLIMAXES +CLIMAXING +CLIMAXLESS +CLIMB +CLIMBABLE +CLIMBDOWN +CLIMBDOWNS +CLIMBED +CLIMBER +CLIMBERS +CLIMBING +CLIMBS +CLIME +CLIMES +CLINAL +CLINALLY +CLINCH +CLINCHED +CLINCHER +CLINCHERS +CLINCHES +CLINCHING +CLINCHINGLY +CLINE +CLINES +CLING +CLINGED +CLINGER +CLINGERS +CLINGFISH +CLINGFISHES +CLINGIER +CLINGIEST +CLINGING +CLINGS +CLINGSTONE +CLINGSTONES +CLINGY +CLINIC +CLINICAL +CLINICALLY +CLINICIAN +CLINICIANS +CLINICS +CLINK +CLINKED +CLINKER +CLINKERED +CLINKERING +CLINKERS +CLINKING +CLINKS +CLINOMETER +CLINOMETERS +CLINQUANT +CLINQUANTS +CLINTONIA +CLINTONIAS +CLIOMETRIC +CLIOMETRICIAN +CLIOMETRICIANS +CLIOMETRICS +CLIP +CLIPBOARD +CLIPBOARDS +CLIPPABLE +CLIPPED +CLIPPER +CLIPPERS +CLIPPING +CLIPPINGS +CLIPS +CLIPSHEET +CLIPSHEETS +CLIPT +CLIQUE +CLIQUED +CLIQUES +CLIQUEY +CLIQUIER +CLIQUIEST +CLIQUING +CLIQUISH +CLIQUISHLY +CLIQUISHNESS +CLIQUISHNESSES +CLIQUY +CLITELLA +CLITELLUM +CLITIC +CLITICIZE +CLITICIZED +CLITICIZES +CLITICIZING +CLITICS +CLITORAL +CLITORECTOMIES +CLITORECTOMY +CLITORIC +CLITORIDECTOMY +CLITORIDES +CLITORIS +CLITORISES +CLIVERS +CLIVIA +CLIVIAS +CLOACA +CLOACAE +CLOACAL +CLOACAS +CLOAK +CLOAKED +CLOAKING +CLOAKROOM +CLOAKROOMS +CLOAKS +CLOBBER +CLOBBERED +CLOBBERING +CLOBBERS +CLOCHARD +CLOCHARDS +CLOCHE +CLOCHES +CLOCK +CLOCKED +CLOCKER +CLOCKERS +CLOCKING +CLOCKLIKE +CLOCKS +CLOCKWISE +CLOCKWORK +CLOCKWORKS +CLOD +CLODDIER +CLODDIEST +CLODDISH +CLODDISHNESS +CLODDISHNESSES +CLODDY +CLODHOPPER +CLODHOPPERS +CLODHOPPING +CLODPATE +CLODPATES +CLODPOLE +CLODPOLES +CLODPOLL +CLODPOLLS +CLODS +CLOFIBRATE +CLOFIBRATES +CLOG +CLOGGED +CLOGGER +CLOGGERS +CLOGGIER +CLOGGIEST +CLOGGILY +CLOGGING +CLOGGY +CLOGS +CLOISONNE +CLOISONNES +CLOISTER +CLOISTERED +CLOISTERING +CLOISTERS +CLOISTRAL +CLOISTRESS +CLOISTRESSES +CLOMB +CLOMIPHENE +CLOMIPHENES +CLOMP +CLOMPED +CLOMPING +CLOMPS +CLON +CLONAL +CLONALLY +CLONE +CLONED +CLONER +CLONERS +CLONES +CLONIC +CLONICITIES +CLONICITY +CLONIDINE +CLONIDINES +CLONING +CLONINGS +CLONISM +CLONISMS +CLONK +CLONKED +CLONKING +CLONKS +CLONS +CLONUS +CLONUSES +CLOOT +CLOOTS +CLOP +CLOPPED +CLOPPING +CLOPS +CLOQUE +CLOQUES +CLOSABLE +CLOSE +CLOSEABLE +CLOSED +CLOSEDOWN +CLOSEDOWNS +CLOSEFISTED +CLOSELY +CLOSEMOUTHED +CLOSENESS +CLOSENESSES +CLOSEOUT +CLOSEOUTS +CLOSER +CLOSERS +CLOSES +CLOSEST +CLOSESTOOL +CLOSESTOOLS +CLOSET +CLOSETED +CLOSETFUL +CLOSETFULS +CLOSETING +CLOSETS +CLOSEUP +CLOSEUPS +CLOSING +CLOSINGS +CLOSTRIDIA +CLOSTRIDIAL +CLOSTRIDIUM +CLOSURE +CLOSURED +CLOSURES +CLOSURING +CLOT +CLOTH +CLOTHBOUND +CLOTHE +CLOTHED +CLOTHES +CLOTHESHORSE +CLOTHESHORSES +CLOTHESLINE +CLOTHESLINED +CLOTHESLINES +CLOTHESLINING +CLOTHESPIN +CLOTHESPINS +CLOTHESPRESS +CLOTHESPRESSES +CLOTHIER +CLOTHIERS +CLOTHING +CLOTHINGS +CLOTHLIKE +CLOTHS +CLOTS +CLOTTED +CLOTTING +CLOTTY +CLOTURE +CLOTURED +CLOTURES +CLOTURING +CLOUD +CLOUDBERRIES +CLOUDBERRY +CLOUDBURST +CLOUDBURSTS +CLOUDED +CLOUDIER +CLOUDIEST +CLOUDILY +CLOUDINESS +CLOUDINESSES +CLOUDING +CLOUDLAND +CLOUDLANDS +CLOUDLESS +CLOUDLESSLY +CLOUDLESSNESS +CLOUDLESSNESSES +CLOUDLET +CLOUDLETS +CLOUDLIKE +CLOUDS +CLOUDSCAPE +CLOUDSCAPES +CLOUDY +CLOUGH +CLOUGHS +CLOUR +CLOURED +CLOURING +CLOURS +CLOUT +CLOUTED +CLOUTER +CLOUTERS +CLOUTING +CLOUTS +CLOVE +CLOVEN +CLOVER +CLOVERED +CLOVERLEAF +CLOVERLEAFS +CLOVERLEAVES +CLOVERS +CLOVERY +CLOVES +CLOWDER +CLOWDERS +CLOWN +CLOWNED +CLOWNERIES +CLOWNERY +CLOWNING +CLOWNISH +CLOWNISHLY +CLOWNISHNESS +CLOWNISHNESSES +CLOWNS +CLOXACILLIN +CLOXACILLINS +CLOY +CLOYED +CLOYING +CLOYINGLY +CLOYS +CLOZAPINE +CLOZAPINES +CLOZE +CLOZES +CLUB +CLUBABLE +CLUBBABLE +CLUBBED +CLUBBER +CLUBBERS +CLUBBIER +CLUBBIEST +CLUBBINESS +CLUBBINESSES +CLUBBING +CLUBBISH +CLUBBY +CLUBFACE +CLUBFACES +CLUBFEET +CLUBFOOT +CLUBFOOTED +CLUBHAND +CLUBHANDS +CLUBHAUL +CLUBHAULED +CLUBHAULING +CLUBHAULS +CLUBHEAD +CLUBHEADS +CLUBHOUSE +CLUBHOUSES +CLUBMAN +CLUBMEN +CLUBROOM +CLUBROOMS +CLUBROOT +CLUBROOTS +CLUBS +CLUBWOMAN +CLUBWOMEN +CLUCK +CLUCKED +CLUCKING +CLUCKS +CLUE +CLUED +CLUEING +CLUELESS +CLUES +CLUING +CLUMBER +CLUMBERS +CLUMP +CLUMPED +CLUMPIER +CLUMPIEST +CLUMPING +CLUMPISH +CLUMPLIKE +CLUMPS +CLUMPY +CLUMSIER +CLUMSIEST +CLUMSILY +CLUMSINESS +CLUMSINESSES +CLUMSY +CLUNG +CLUNK +CLUNKED +CLUNKER +CLUNKERS +CLUNKIER +CLUNKIEST +CLUNKING +CLUNKS +CLUNKY +CLUPEID +CLUPEIDS +CLUPEOID +CLUPEOIDS +CLUSTER +CLUSTERED +CLUSTERING +CLUSTERS +CLUSTERY +CLUTCH +CLUTCHED +CLUTCHES +CLUTCHING +CLUTCHY +CLUTTER +CLUTTERED +CLUTTERING +CLUTTERS +CLUTTERY +CLYPEAL +CLYPEATE +CLYPEI +CLYPEUS +CLYSTER +CLYSTERS +CNIDA +CNIDAE +CNIDARIAN +CNIDARIANS +COACERVATE +COACERVATES +COACERVATION +COACERVATIONS +COACH +COACHABLE +COACHED +COACHER +COACHERS +COACHES +COACHING +COACHMAN +COACHMEN +COACHWORK +COACHWORKS +COACT +COACTED +COACTING +COACTION +COACTIONS +COACTIVE +COACTOR +COACTORS +COACTS +COADAPTATION +COADAPTATIONS +COADAPTED +COADJUTOR +COADJUTORS +COADJUTRICES +COADJUTRIX +COADMIRE +COADMIRED +COADMIRES +COADMIRING +COADMIT +COADMITS +COADMITTED +COADMITTING +COADUNATE +COAEVAL +COAEVALS +COAGENCIES +COAGENCY +COAGENT +COAGENTS +COAGULA +COAGULABILITIES +COAGULABILITY +COAGULABLE +COAGULANT +COAGULANTS +COAGULASE +COAGULASES +COAGULATE +COAGULATED +COAGULATES +COAGULATING +COAGULATION +COAGULATIONS +COAGULUM +COAGULUMS +COAL +COALA +COALAS +COALBIN +COALBINS +COALBOX +COALBOXES +COALED +COALER +COALERS +COALESCE +COALESCED +COALESCENCE +COALESCENCES +COALESCENT +COALESCES +COALESCING +COALFIELD +COALFIELDS +COALFISH +COALFISHES +COALHOLE +COALHOLES +COALIER +COALIEST +COALIFICATION +COALIFICATIONS +COALIFIED +COALIFIES +COALIFY +COALIFYING +COALING +COALITION +COALITIONIST +COALITIONISTS +COALITIONS +COALLESS +COALPIT +COALPITS +COALS +COALSACK +COALSACKS +COALSHED +COALSHEDS +COALY +COALYARD +COALYARDS +COAMING +COAMINGS +COANCHOR +COANCHORED +COANCHORING +COANCHORS +COANNEX +COANNEXED +COANNEXES +COANNEXING +COAPPEAR +COAPPEARED +COAPPEARING +COAPPEARS +COAPT +COAPTATION +COAPTATIONS +COAPTED +COAPTING +COAPTS +COARCTATE +COARCTATION +COARCTATIONS +COARSE +COARSELY +COARSEN +COARSENED +COARSENESS +COARSENESSES +COARSENING +COARSENS +COARSER +COARSEST +COASSIST +COASSISTED +COASSISTING +COASSISTS +COASSUME +COASSUMED +COASSUMES +COASSUMING +COAST +COASTAL +COASTALLY +COASTED +COASTER +COASTERS +COASTGUARD +COASTGUARDMAN +COASTGUARDMEN +COASTGUARDS +COASTGUARDSMAN +COASTGUARDSMEN +COASTING +COASTINGS +COASTLAND +COASTLANDS +COASTLINE +COASTLINES +COASTS +COASTWARD +COASTWARDS +COASTWISE +COAT +COATDRESS +COATDRESSES +COATED +COATEE +COATEES +COATER +COATERS +COATI +COATIMUNDI +COATIMUNDIS +COATING +COATINGS +COATIS +COATLESS +COATRACK +COATRACKS +COATROOM +COATROOMS +COATS +COATTAIL +COATTAILS +COATTEND +COATTENDED +COATTENDING +COATTENDS +COATTEST +COATTESTED +COATTESTING +COATTESTS +COAUTHOR +COAUTHORED +COAUTHORING +COAUTHORS +COAUTHORSHIP +COAUTHORSHIPS +COAX +COAXAL +COAXED +COAXER +COAXERS +COAXES +COAXIAL +COAXIALLY +COAXING +COAXINGLY +COB +COBALAMIN +COBALAMINS +COBALT +COBALTIC +COBALTINE +COBALTINES +COBALTITE +COBALTITES +COBALTOUS +COBALTS +COBB +COBBER +COBBERS +COBBIER +COBBIEST +COBBLE +COBBLED +COBBLER +COBBLERS +COBBLES +COBBLESTONE +COBBLESTONED +COBBLESTONES +COBBLING +COBBS +COBBY +COBELLIGERENT +COBELLIGERENTS +COBIA +COBIAS +COBLE +COBLES +COBNUT +COBNUTS +COBRA +COBRAS +COBS +COBWEB +COBWEBBED +COBWEBBIER +COBWEBBIEST +COBWEBBING +COBWEBBY +COBWEBS +COCA +COCAIN +COCAINE +COCAINES +COCAINISM +COCAINISMS +COCAINIZATION +COCAINIZATIONS +COCAINIZE +COCAINIZED +COCAINIZES +COCAINIZING +COCAINS +COCAPTAIN +COCAPTAINED +COCAPTAINING +COCAPTAINS +COCARBOXYLASE +COCARBOXYLASES +COCARCINOGEN +COCARCINOGENIC +COCARCINOGENS +COCAS +COCATALYST +COCATALYSTS +COCCAL +COCCI +COCCIC +COCCID +COCCIDIA +COCCIDIOSES +COCCIDIOSIS +COCCIDIUM +COCCIDS +COCCOID +COCCOIDAL +COCCOIDS +COCCOLITH +COCCOLITHS +COCCOUS +COCCUS +COCCYGEAL +COCCYGES +COCCYX +COCCYXES +COCHAIR +COCHAIRED +COCHAIRING +COCHAIRMAN +COCHAIRMEN +COCHAIRPERSON +COCHAIRPERSONS +COCHAIRS +COCHAIRWOMAN +COCHAIRWOMEN +COCHAMPION +COCHAMPIONS +COCHIN +COCHINEAL +COCHINEALS +COCHINS +COCHLEA +COCHLEAE +COCHLEAR +COCHLEAS +COCHLEATE +COCINERA +COCINERAS +COCK +COCKADE +COCKADED +COCKADES +COCKALORUM +COCKALORUMS +COCKAMAMIE +COCKAMAMY +COCKAPOO +COCKAPOOS +COCKATEEL +COCKATEELS +COCKATIEL +COCKATIELS +COCKATOO +COCKATOOS +COCKATRICE +COCKATRICES +COCKBILL +COCKBILLED +COCKBILLING +COCKBILLS +COCKBOAT +COCKBOATS +COCKCHAFER +COCKCHAFERS +COCKCROW +COCKCROWS +COCKED +COCKER +COCKERED +COCKEREL +COCKERELS +COCKERING +COCKERS +COCKEYE +COCKEYED +COCKEYEDLY +COCKEYEDNESS +COCKEYEDNESSES +COCKEYES +COCKFIGHT +COCKFIGHTING +COCKFIGHTINGS +COCKFIGHTS +COCKHORSE +COCKHORSES +COCKIER +COCKIEST +COCKILY +COCKINESS +COCKINESSES +COCKING +COCKISH +COCKLE +COCKLEBUR +COCKLEBURS +COCKLED +COCKLES +COCKLESHELL +COCKLESHELLS +COCKLIKE +COCKLING +COCKLOFT +COCKLOFTS +COCKNEY +COCKNEYFIED +COCKNEYFIES +COCKNEYFY +COCKNEYFYING +COCKNEYISH +COCKNEYISM +COCKNEYISMS +COCKNEYS +COCKPIT +COCKPITS +COCKROACH +COCKROACHES +COCKS +COCKSCOMB +COCKSCOMBS +COCKSFOOT +COCKSFOOTS +COCKSHIES +COCKSHUT +COCKSHUTS +COCKSHY +COCKSPUR +COCKSPURS +COCKSUCKER +COCKSUCKERS +COCKSURE +COCKSURELY +COCKSURENESS +COCKSURENESSES +COCKSWAIN +COCKSWAINS +COCKTAIL +COCKTAILED +COCKTAILING +COCKTAILS +COCKUP +COCKUPS +COCKY +COCO +COCOA +COCOANUT +COCOANUTS +COCOAS +COCOBOLA +COCOBOLAS +COCOBOLO +COCOBOLOS +COCOMAT +COCOMATS +COCOMPOSER +COCOMPOSERS +COCONSPIRATOR +COCONSPIRATORS +COCONUT +COCONUTS +COCOON +COCOONED +COCOONING +COCOONINGS +COCOONS +COCOPLUM +COCOPLUMS +COCOS +COCOTTE +COCOTTES +COCOUNSEL +COCOUNSELED +COCOUNSELING +COCOUNSELLED +COCOUNSELLING +COCOUNSELS +COCOYAM +COCOYAMS +COCOZELLE +COCOZELLES +COCREATE +COCREATED +COCREATES +COCREATING +COCREATOR +COCREATORS +COCULTIVATE +COCULTIVATED +COCULTIVATES +COCULTIVATING +COCULTIVATION +COCULTIVATIONS +COCULTURE +COCULTURED +COCULTURES +COCULTURING +COCURATOR +COCURATORS +COCURRICULAR +COD +CODA +CODABLE +CODAS +CODDED +CODDER +CODDERS +CODDING +CODDLE +CODDLED +CODDLER +CODDLERS +CODDLES +CODDLING +CODE +CODEBOOK +CODEBOOKS +CODEBTOR +CODEBTORS +CODEC +CODECS +CODED +CODEFENDANT +CODEFENDANTS +CODEIA +CODEIAS +CODEIN +CODEINA +CODEINAS +CODEINE +CODEINES +CODEINS +CODELESS +CODEN +CODENS +CODEPENDENCE +CODEPENDENCES +CODEPENDENCIES +CODEPENDENCY +CODEPENDENT +CODEPENDENTS +CODER +CODERIVE +CODERIVED +CODERIVES +CODERIVING +CODERS +CODES +CODESIGN +CODESIGNED +CODESIGNING +CODESIGNS +CODETERMINATION +CODEVELOP +CODEVELOPED +CODEVELOPER +CODEVELOPERS +CODEVELOPING +CODEVELOPS +CODEX +CODFISH +CODFISHES +CODGER +CODGERS +CODICES +CODICIL +CODICILLARY +CODICILS +CODICOLOGICAL +CODICOLOGIES +CODICOLOGY +CODIFIABILITIES +CODIFIABILITY +CODIFICATION +CODIFICATIONS +CODIFIED +CODIFIER +CODIFIERS +CODIFIES +CODIFY +CODIFYING +CODING +CODIRECT +CODIRECTED +CODIRECTING +CODIRECTION +CODIRECTIONS +CODIRECTOR +CODIRECTORS +CODIRECTS +CODISCOVER +CODISCOVERED +CODISCOVERER +CODISCOVERERS +CODISCOVERING +CODISCOVERS +CODLIN +CODLING +CODLINGS +CODLINS +CODOMINANT +CODOMINANTS +CODON +CODONS +CODPIECE +CODPIECES +CODRIVE +CODRIVEN +CODRIVER +CODRIVERS +CODRIVES +CODRIVING +CODROVE +CODS +CODSWALLOP +CODSWALLOPS +COED +COEDIT +COEDITED +COEDITING +COEDITOR +COEDITORS +COEDITS +COEDS +COEDUCATION +COEDUCATIONAL +COEDUCATIONALLY +COEDUCATIONS +COEFFECT +COEFFECTS +COEFFICIENT +COEFFICIENTS +COELACANTH +COELACANTHS +COELENTERA +COELENTERATE +COELENTERATES +COELENTERON +COELIAC +COELOM +COELOMATA +COELOMATE +COELOMATES +COELOME +COELOMES +COELOMIC +COELOMS +COELOSTAT +COELOSTATS +COEMBODIED +COEMBODIES +COEMBODY +COEMBODYING +COEMPLOY +COEMPLOYED +COEMPLOYING +COEMPLOYS +COEMPT +COEMPTED +COEMPTING +COEMPTS +COENACT +COENACTED +COENACTING +COENACTS +COENAMOR +COENAMORED +COENAMORING +COENAMORS +COENDURE +COENDURED +COENDURES +COENDURING +COENOBITE +COENOBITES +COENOCYTE +COENOCYTES +COENOCYTIC +COENOSARC +COENOSARCS +COENURE +COENURES +COENURI +COENURUS +COENZYMATIC +COENZYMATICALLY +COENZYME +COENZYMES +COEQUAL +COEQUALITIES +COEQUALITY +COEQUALLY +COEQUALS +COEQUATE +COEQUATED +COEQUATES +COEQUATING +COERCE +COERCED +COERCER +COERCERS +COERCES +COERCIBLE +COERCIBLY +COERCING +COERCION +COERCIONS +COERCIVE +COERCIVELY +COERCIVENESS +COERCIVENESSES +COERCIVITIES +COERCIVITY +COERECT +COERECTED +COERECTING +COERECTS +COESITE +COESITES +COETANEOUS +COETERNAL +COEVAL +COEVALITIES +COEVALITY +COEVALLY +COEVALS +COEVOLUTION +COEVOLUTIONARY +COEVOLUTIONS +COEVOLVE +COEVOLVED +COEVOLVES +COEVOLVING +COEXECUTOR +COEXECUTORS +COEXERT +COEXERTED +COEXERTING +COEXERTS +COEXIST +COEXISTED +COEXISTENCE +COEXISTENCES +COEXISTENT +COEXISTING +COEXISTS +COEXTEND +COEXTENDED +COEXTENDING +COEXTENDS +COEXTENSIVE +COEXTENSIVELY +COFACTOR +COFACTORS +COFAVORITE +COFAVORITES +COFEATURE +COFEATURED +COFEATURES +COFEATURING +COFF +COFFEE +COFFEEHOUSE +COFFEEHOUSES +COFFEEMAKER +COFFEEMAKERS +COFFEEPOT +COFFEEPOTS +COFFEES +COFFER +COFFERDAM +COFFERDAMS +COFFERED +COFFERING +COFFERS +COFFIN +COFFINED +COFFING +COFFINING +COFFINS +COFFLE +COFFLED +COFFLES +COFFLING +COFFRET +COFFRETS +COFFS +COFINANCE +COFINANCED +COFINANCES +COFINANCING +COFOUND +COFOUNDED +COFOUNDER +COFOUNDERS +COFOUNDING +COFOUNDS +COFT +COFUNCTION +COFUNCTIONS +COG +COGENCIES +COGENCY +COGENERATION +COGENERATIONS +COGENERATOR +COGENERATORS +COGENT +COGENTLY +COGGED +COGGING +COGITABLE +COGITATE +COGITATED +COGITATES +COGITATING +COGITATION +COGITATIONS +COGITATIVE +COGITATOR +COGITATORS +COGITO +COGITOS +COGNAC +COGNACS +COGNATE +COGNATELY +COGNATES +COGNATION +COGNATIONS +COGNISE +COGNISED +COGNISES +COGNISING +COGNITION +COGNITIONAL +COGNITIONS +COGNITIVE +COGNITIVELY +COGNIZABLE +COGNIZABLY +COGNIZANCE +COGNIZANCES +COGNIZANT +COGNIZE +COGNIZED +COGNIZER +COGNIZERS +COGNIZES +COGNIZING +COGNOMEN +COGNOMENS +COGNOMINA +COGNOMINAL +COGNOSCENTE +COGNOSCENTI +COGNOSCIBLE +COGNOVIT +COGNOVITS +COGON +COGONS +COGS +COGWAY +COGWAYS +COGWHEEL +COGWHEELS +COHABIT +COHABITANT +COHABITANTS +COHABITATION +COHABITATIONS +COHABITED +COHABITER +COHABITERS +COHABITING +COHABITS +COHEAD +COHEADED +COHEADING +COHEADS +COHEIR +COHEIRESS +COHEIRESSES +COHEIRS +COHERE +COHERED +COHERENCE +COHERENCES +COHERENCIES +COHERENCY +COHERENT +COHERENTLY +COHERER +COHERERS +COHERES +COHERING +COHESION +COHESIONLESS +COHESIONS +COHESIVE +COHESIVELY +COHESIVENESS +COHESIVENESSES +COHO +COHOBATE +COHOBATED +COHOBATES +COHOBATING +COHOG +COHOGS +COHOLDER +COHOLDERS +COHOMOLOGICAL +COHOMOLOGIES +COHOMOLOGY +COHORT +COHORTS +COHOS +COHOSH +COHOSHES +COHOST +COHOSTED +COHOSTESS +COHOSTESSED +COHOSTESSES +COHOSTESSING +COHOSTING +COHOSTS +COHOUSING +COHOUSINGS +COHUNE +COHUNES +COIF +COIFED +COIFFE +COIFFED +COIFFES +COIFFEUR +COIFFEURS +COIFFEUSE +COIFFEUSES +COIFFING +COIFFURE +COIFFURED +COIFFURES +COIFFURING +COIFING +COIFS +COIGN +COIGNE +COIGNED +COIGNES +COIGNING +COIGNS +COIL +COILABILITIES +COILABILITY +COILED +COILER +COILERS +COILING +COILS +COIN +COINABLE +COINAGE +COINAGES +COINCIDE +COINCIDED +COINCIDENCE +COINCIDENCES +COINCIDENT +COINCIDENTAL +COINCIDENTALLY +COINCIDENTLY +COINCIDES +COINCIDING +COINED +COINER +COINERS +COINFECT +COINFECTED +COINFECTING +COINFECTS +COINFER +COINFERRED +COINFERRING +COINFERS +COINHERE +COINHERED +COINHERES +COINHERING +COINING +COINMATE +COINMATES +COINS +COINSURANCE +COINSURANCES +COINSURE +COINSURED +COINSURER +COINSURERS +COINSURES +COINSURING +COINTER +COINTERRED +COINTERRING +COINTERS +COINTREAU +COINTREAUS +COINVENT +COINVENTED +COINVENTING +COINVENTOR +COINVENTORS +COINVENTS +COINVESTIGATOR +COINVESTIGATORS +COINVESTOR +COINVESTORS +COIR +COIRS +COISTREL +COISTRELS +COISTRIL +COISTRILS +COITAL +COITALLY +COITION +COITIONAL +COITIONS +COITUS +COITUSES +COJOIN +COJOINED +COJOINING +COJOINS +COJONES +COKE +COKED +COKEHEAD +COKEHEADS +COKELIKE +COKES +COKING +COKY +COL +COLA +COLANDER +COLANDERS +COLAS +COLATITUDE +COLATITUDES +COLBY +COLBYS +COLCANNON +COLCANNONS +COLCHICINE +COLCHICINES +COLCHICUM +COLCHICUMS +COLCOTHAR +COLCOTHARS +COLD +COLDBLOOD +COLDCOCK +COLDCOCKED +COLDCOCKING +COLDCOCKS +COLDER +COLDEST +COLDHEARTED +COLDHEARTEDLY +COLDHEARTEDNESS +COLDISH +COLDLY +COLDNESS +COLDNESSES +COLDS +COLE +COLEAD +COLEADER +COLEADERS +COLEADING +COLEADS +COLECTOMIES +COLECTOMY +COLED +COLEMANITE +COLEMANITES +COLEOPTERA +COLEOPTERAN +COLEOPTERANS +COLEOPTERIST +COLEOPTERISTS +COLEOPTEROUS +COLEOPTILE +COLEOPTILES +COLEORHIZA +COLEORHIZAE +COLES +COLESEED +COLESEEDS +COLESLAW +COLESLAWS +COLESSEE +COLESSEES +COLESSOR +COLESSORS +COLEUS +COLEUSES +COLEWORT +COLEWORTS +COLIC +COLICIN +COLICINE +COLICINES +COLICINS +COLICKIER +COLICKIEST +COLICKY +COLICROOT +COLICROOTS +COLICS +COLICWEED +COLICWEEDS +COLIES +COLIFORM +COLIFORMS +COLIN +COLINEAR +COLINEARITIES +COLINEARITY +COLINS +COLIPHAGE +COLIPHAGES +COLISEUM +COLISEUMS +COLISTIN +COLISTINS +COLITIC +COLITIS +COLITISES +COLLABORATE +COLLABORATED +COLLABORATES +COLLABORATING +COLLABORATION +COLLABORATIONS +COLLABORATIVE +COLLABORATIVELY +COLLABORATIVES +COLLABORATOR +COLLABORATORS +COLLAGE +COLLAGED +COLLAGEN +COLLAGENASE +COLLAGENASES +COLLAGENOUS +COLLAGENS +COLLAGES +COLLAGING +COLLAGIST +COLLAGISTS +COLLAPSE +COLLAPSED +COLLAPSES +COLLAPSIBILITY +COLLAPSIBLE +COLLAPSING +COLLAR +COLLARBONE +COLLARBONES +COLLARD +COLLARDS +COLLARED +COLLARET +COLLARETS +COLLARING +COLLARLESS +COLLARS +COLLATE +COLLATED +COLLATERAL +COLLATERALITIES +COLLATERALITY +COLLATERALIZE +COLLATERALIZED +COLLATERALIZES +COLLATERALIZING +COLLATERALLY +COLLATERALS +COLLATES +COLLATING +COLLATION +COLLATIONS +COLLATOR +COLLATORS +COLLEAGUE +COLLEAGUES +COLLEAGUESHIP +COLLEAGUESHIPS +COLLECT +COLLECTABLE +COLLECTABLES +COLLECTANEA +COLLECTED +COLLECTEDLY +COLLECTEDNESS +COLLECTEDNESSES +COLLECTIBLE +COLLECTIBLES +COLLECTING +COLLECTION +COLLECTIONS +COLLECTIVE +COLLECTIVELY +COLLECTIVES +COLLECTIVISE +COLLECTIVISED +COLLECTIVISES +COLLECTIVISING +COLLECTIVISM +COLLECTIVISMS +COLLECTIVIST +COLLECTIVISTIC +COLLECTIVISTS +COLLECTIVITIES +COLLECTIVITY +COLLECTIVIZE +COLLECTIVIZED +COLLECTIVIZES +COLLECTIVIZING +COLLECTOR +COLLECTORS +COLLECTORSHIP +COLLECTORSHIPS +COLLECTS +COLLEEN +COLLEENS +COLLEGE +COLLEGER +COLLEGERS +COLLEGES +COLLEGIA +COLLEGIAL +COLLEGIALITIES +COLLEGIALITY +COLLEGIALLY +COLLEGIAN +COLLEGIANS +COLLEGIATE +COLLEGIATELY +COLLEGIUM +COLLEGIUMS +COLLEMBOLAN +COLLEMBOLANS +COLLEMBOLOUS +COLLENCHYMA +COLLENCHYMAS +COLLENCHYMATOUS +COLLET +COLLETED +COLLETING +COLLETS +COLLIDE +COLLIDED +COLLIDER +COLLIDERS +COLLIDES +COLLIDING +COLLIE +COLLIED +COLLIER +COLLIERIES +COLLIERS +COLLIERY +COLLIES +COLLIESHANGIE +COLLIESHANGIES +COLLIGATE +COLLIGATED +COLLIGATES +COLLIGATING +COLLIGATION +COLLIGATIONS +COLLIGATIVE +COLLIMATE +COLLIMATED +COLLIMATES +COLLIMATING +COLLIMATION +COLLIMATIONS +COLLIMATOR +COLLIMATORS +COLLINEAR +COLLINEARITIES +COLLINEARITY +COLLINS +COLLINSES +COLLINSIA +COLLINSIAS +COLLISION +COLLISIONAL +COLLISIONALLY +COLLISIONS +COLLOCATE +COLLOCATED +COLLOCATES +COLLOCATING +COLLOCATION +COLLOCATIONAL +COLLOCATIONS +COLLODION +COLLODIONS +COLLOGUE +COLLOGUED +COLLOGUES +COLLOGUING +COLLOID +COLLOIDAL +COLLOIDALLY +COLLOIDS +COLLOP +COLLOPS +COLLOQUIA +COLLOQUIAL +COLLOQUIALISM +COLLOQUIALISMS +COLLOQUIALITIES +COLLOQUIALITY +COLLOQUIALLY +COLLOQUIALS +COLLOQUIES +COLLOQUIST +COLLOQUISTS +COLLOQUIUM +COLLOQUIUMS +COLLOQUY +COLLOTYPE +COLLOTYPES +COLLOTYPIES +COLLOTYPY +COLLUDE +COLLUDED +COLLUDER +COLLUDERS +COLLUDES +COLLUDING +COLLUSION +COLLUSIONS +COLLUSIVE +COLLUSIVELY +COLLUVIA +COLLUVIAL +COLLUVIUM +COLLUVIUMS +COLLY +COLLYING +COLLYRIA +COLLYRIUM +COLLYRIUMS +COLLYWOBBLES +COLOBI +COLOBOMA +COLOBOMATA +COLOBUS +COLOBUSES +COLOCATE +COLOCATED +COLOCATES +COLOCATING +COLOCYNTH +COLOCYNTHS +COLOG +COLOGARITHM +COLOGARITHMS +COLOGNE +COLOGNED +COLOGNES +COLOGS +COLOMBARD +COLOMBARDS +COLON +COLONE +COLONEL +COLONELCIES +COLONELCY +COLONELS +COLONES +COLONI +COLONIAL +COLONIALISM +COLONIALISMS +COLONIALIST +COLONIALISTIC +COLONIALISTS +COLONIALIZE +COLONIALIZED +COLONIALIZES +COLONIALIZING +COLONIALLY +COLONIALNESS +COLONIALNESSES +COLONIALS +COLONIC +COLONICS +COLONIES +COLONISATION +COLONISATIONS +COLONISE +COLONISED +COLONISES +COLONISING +COLONIST +COLONISTS +COLONITIS +COLONITISES +COLONIZATION +COLONIZATIONIST +COLONIZATIONS +COLONIZE +COLONIZED +COLONIZER +COLONIZERS +COLONIZES +COLONIZING +COLONNADE +COLONNADED +COLONNADES +COLONS +COLONUS +COLONY +COLOPHON +COLOPHONIES +COLOPHONS +COLOPHONY +COLOR +COLORABLE +COLORABLY +COLORADO +COLORANT +COLORANTS +COLORATION +COLORATIONS +COLORATURA +COLORATURAS +COLORBRED +COLORBREED +COLORBREEDING +COLORBREEDS +COLORCAST +COLORCASTED +COLORCASTING +COLORCASTS +COLORECTAL +COLORED +COLOREDS +COLORER +COLORERS +COLORFAST +COLORFASTNESS +COLORFASTNESSES +COLORFUL +COLORFULLY +COLORFULNESS +COLORFULNESSES +COLORIFIC +COLORIMETER +COLORIMETERS +COLORIMETRIC +COLORIMETRIES +COLORIMETRY +COLORING +COLORINGS +COLORISM +COLORISMS +COLORIST +COLORISTIC +COLORISTICALLY +COLORISTS +COLORIZATION +COLORIZATIONS +COLORIZE +COLORIZED +COLORIZER +COLORIZERS +COLORIZES +COLORIZING +COLORLESS +COLORLESSLY +COLORLESSNESS +COLORLESSNESSES +COLORMAN +COLORMEN +COLORPOINT +COLORPOINTS +COLORS +COLORWAY +COLORWAYS +COLOSSAL +COLOSSALLY +COLOSSEUM +COLOSSEUMS +COLOSSI +COLOSSUS +COLOSSUSES +COLOSTOMIES +COLOSTOMY +COLOSTRAL +COLOSTRUM +COLOSTRUMS +COLOTOMIES +COLOTOMY +COLOUR +COLOURED +COLOURER +COLOURERS +COLOURING +COLOURS +COLPITIS +COLPITISES +COLPORTAGE +COLPORTAGES +COLPORTEUR +COLPORTEURS +COLS +COLT +COLTER +COLTERS +COLTISH +COLTISHLY +COLTISHNESS +COLTISHNESSES +COLTS +COLTSFOOT +COLTSFOOTS +COLUBRID +COLUBRIDS +COLUBRINE +COLUGO +COLUGOS +COLUMBARIA +COLUMBARIES +COLUMBARIUM +COLUMBARY +COLUMBIC +COLUMBINE +COLUMBINES +COLUMBITE +COLUMBITES +COLUMBIUM +COLUMBIUMS +COLUMEL +COLUMELLA +COLUMELLAE +COLUMELLAR +COLUMELS +COLUMN +COLUMNAL +COLUMNAR +COLUMNEA +COLUMNEAS +COLUMNED +COLUMNIATION +COLUMNIATIONS +COLUMNIST +COLUMNISTIC +COLUMNISTS +COLUMNS +COLURE +COLURES +COLY +COLZA +COLZAS +COMA +COMADE +COMAE +COMAKE +COMAKER +COMAKERS +COMAKES +COMAKING +COMAL +COMANAGE +COMANAGED +COMANAGEMENT +COMANAGEMENTS +COMANAGER +COMANAGERS +COMANAGES +COMANAGING +COMAS +COMATE +COMATES +COMATIC +COMATIK +COMATIKS +COMATOSE +COMATULA +COMATULAE +COMATULID +COMATULIDS +COMB +COMBAT +COMBATANT +COMBATANTS +COMBATED +COMBATER +COMBATERS +COMBATING +COMBATIVE +COMBATIVELY +COMBATIVENESS +COMBATIVENESSES +COMBATS +COMBATTED +COMBATTING +COMBE +COMBED +COMBER +COMBERS +COMBES +COMBINABLE +COMBINATION +COMBINATIONAL +COMBINATIONS +COMBINATIVE +COMBINATORIAL +COMBINATORIALLY +COMBINATORICS +COMBINATORY +COMBINE +COMBINED +COMBINEDS +COMBINER +COMBINERS +COMBINES +COMBING +COMBINGS +COMBINING +COMBLIKE +COMBO +COMBOS +COMBS +COMBUST +COMBUSTED +COMBUSTIBILITY +COMBUSTIBLE +COMBUSTIBLES +COMBUSTIBLY +COMBUSTING +COMBUSTION +COMBUSTIONS +COMBUSTIVE +COMBUSTOR +COMBUSTORS +COMBUSTS +COME +COMEBACK +COMEBACKS +COMEDIAN +COMEDIANS +COMEDIC +COMEDICALLY +COMEDIENNE +COMEDIENNES +COMEDIES +COMEDO +COMEDONES +COMEDOS +COMEDOWN +COMEDOWNS +COMEDY +COMELIER +COMELIEST +COMELILY +COMELINESS +COMELINESSES +COMELY +COMEMBER +COMEMBERS +COMER +COMERS +COMES +COMESTIBLE +COMESTIBLES +COMET +COMETARY +COMETH +COMETHER +COMETHERS +COMETIC +COMETS +COMEUPPANCE +COMEUPPANCES +COMFIER +COMFIEST +COMFINESS +COMFINESSES +COMFIT +COMFITS +COMFORT +COMFORTABLE +COMFORTABLENESS +COMFORTABLY +COMFORTED +COMFORTER +COMFORTERS +COMFORTING +COMFORTINGLY +COMFORTLESS +COMFORTS +COMFREY +COMFREYS +COMFY +COMIC +COMICAL +COMICALITIES +COMICALITY +COMICALLY +COMICS +COMING +COMINGLE +COMINGLED +COMINGLES +COMINGLING +COMINGS +COMITIA +COMITIAL +COMITIES +COMITY +COMIX +COMMA +COMMAND +COMMANDABLE +COMMANDANT +COMMANDANTS +COMMANDED +COMMANDEER +COMMANDEERED +COMMANDEERING +COMMANDEERS +COMMANDER +COMMANDERIES +COMMANDERS +COMMANDERSHIP +COMMANDERSHIPS +COMMANDERY +COMMANDING +COMMANDINGLY +COMMANDMENT +COMMANDMENTS +COMMANDO +COMMANDOES +COMMANDOS +COMMANDS +COMMAS +COMMATA +COMMEMORATE +COMMEMORATED +COMMEMORATES +COMMEMORATING +COMMEMORATION +COMMEMORATIONS +COMMEMORATIVE +COMMEMORATIVELY +COMMEMORATIVES +COMMEMORATOR +COMMEMORATORS +COMMENCE +COMMENCED +COMMENCEMENT +COMMENCEMENTS +COMMENCER +COMMENCERS +COMMENCES +COMMENCING +COMMEND +COMMENDABLE +COMMENDABLY +COMMENDAM +COMMENDAMS +COMMENDATION +COMMENDATIONS +COMMENDATORY +COMMENDED +COMMENDER +COMMENDERS +COMMENDING +COMMENDS +COMMENSAL +COMMENSALISM +COMMENSALISMS +COMMENSALLY +COMMENSALS +COMMENSURABLE +COMMENSURABLY +COMMENSURATE +COMMENSURATELY +COMMENSURATION +COMMENSURATIONS +COMMENT +COMMENTARIES +COMMENTARY +COMMENTATE +COMMENTATED +COMMENTATES +COMMENTATING +COMMENTATOR +COMMENTATORS +COMMENTED +COMMENTER +COMMENTERS +COMMENTING +COMMENTS +COMMERCE +COMMERCED +COMMERCES +COMMERCIAL +COMMERCIALISE +COMMERCIALISED +COMMERCIALISES +COMMERCIALISING +COMMERCIALISM +COMMERCIALISMS +COMMERCIALIST +COMMERCIALISTIC +COMMERCIALISTS +COMMERCIALITIES +COMMERCIALITY +COMMERCIALIZE +COMMERCIALIZED +COMMERCIALIZES +COMMERCIALIZING +COMMERCIALLY +COMMERCIALS +COMMERCING +COMMIE +COMMIES +COMMINATION +COMMINATIONS +COMMINATORY +COMMINGLE +COMMINGLED +COMMINGLES +COMMINGLING +COMMINUTE +COMMINUTED +COMMINUTES +COMMINUTING +COMMINUTION +COMMINUTIONS +COMMISERATE +COMMISERATED +COMMISERATES +COMMISERATING +COMMISERATINGLY +COMMISERATION +COMMISERATIONS +COMMISERATIVE +COMMISSAR +COMMISSARIAL +COMMISSARIAT +COMMISSARIATS +COMMISSARIES +COMMISSARS +COMMISSARY +COMMISSION +COMMISSIONAIRE +COMMISSIONAIRES +COMMISSIONED +COMMISSIONER +COMMISSIONERS +COMMISSIONING +COMMISSIONS +COMMISSURAL +COMMISSURE +COMMISSURES +COMMIT +COMMITMENT +COMMITMENTS +COMMITS +COMMITTABLE +COMMITTAL +COMMITTALS +COMMITTED +COMMITTEE +COMMITTEEMAN +COMMITTEEMEN +COMMITTEES +COMMITTEEWOMAN +COMMITTEEWOMEN +COMMITTING +COMMIX +COMMIXED +COMMIXES +COMMIXING +COMMIXT +COMMIXTURE +COMMIXTURES +COMMODE +COMMODES +COMMODIFICATION +COMMODIFIED +COMMODIFIES +COMMODIFY +COMMODIFYING +COMMODIOUS +COMMODIOUSLY +COMMODIOUSNESS +COMMODITIES +COMMODITY +COMMODORE +COMMODORES +COMMON +COMMONAGE +COMMONAGES +COMMONALITIES +COMMONALITY +COMMONALTIES +COMMONALTY +COMMONER +COMMONERS +COMMONEST +COMMONLY +COMMONNESS +COMMONNESSES +COMMONPLACE +COMMONPLACENESS +COMMONPLACES +COMMONS +COMMONSENSE +COMMONSENSIBLE +COMMONSENSICAL +COMMONWEAL +COMMONWEALS +COMMONWEALTH +COMMONWEALTHS +COMMOTION +COMMOTIONS +COMMOVE +COMMOVED +COMMOVES +COMMOVING +COMMUNAL +COMMUNALISM +COMMUNALISMS +COMMUNALIST +COMMUNALISTS +COMMUNALITIES +COMMUNALITY +COMMUNALIZE +COMMUNALIZED +COMMUNALIZES +COMMUNALIZING +COMMUNALLY +COMMUNARD +COMMUNARDS +COMMUNE +COMMUNED +COMMUNER +COMMUNERS +COMMUNES +COMMUNICABILITY +COMMUNICABLE +COMMUNICABLY +COMMUNICANT +COMMUNICANTS +COMMUNICATE +COMMUNICATED +COMMUNICATEE +COMMUNICATEES +COMMUNICATES +COMMUNICATING +COMMUNICATION +COMMUNICATIONAL +COMMUNICATIONS +COMMUNICATIVE +COMMUNICATIVELY +COMMUNICATOR +COMMUNICATORS +COMMUNICATORY +COMMUNING +COMMUNION +COMMUNIONS +COMMUNIQUE +COMMUNIQUES +COMMUNISE +COMMUNISED +COMMUNISES +COMMUNISING +COMMUNISM +COMMUNISMS +COMMUNIST +COMMUNISTIC +COMMUNISTICALLY +COMMUNISTS +COMMUNITARIAN +COMMUNITARIANS +COMMUNITIES +COMMUNITY +COMMUNIZATION +COMMUNIZATIONS +COMMUNIZE +COMMUNIZED +COMMUNIZES +COMMUNIZING +COMMUTABLE +COMMUTATE +COMMUTATED +COMMUTATES +COMMUTATING +COMMUTATION +COMMUTATIONS +COMMUTATIVE +COMMUTATIVITIES +COMMUTATIVITY +COMMUTATOR +COMMUTATORS +COMMUTE +COMMUTED +COMMUTER +COMMUTERS +COMMUTES +COMMUTING +COMMY +COMONOMER +COMONOMERS +COMORBID +COMOSE +COMOUS +COMP +COMPACT +COMPACTED +COMPACTER +COMPACTERS +COMPACTEST +COMPACTIBLE +COMPACTING +COMPACTION +COMPACTIONS +COMPACTLY +COMPACTNESS +COMPACTNESSES +COMPACTOR +COMPACTORS +COMPACTS +COMPADRE +COMPADRES +COMPANIED +COMPANIES +COMPANION +COMPANIONABLE +COMPANIONABLY +COMPANIONATE +COMPANIONED +COMPANIONING +COMPANIONS +COMPANIONSHIP +COMPANIONSHIPS +COMPANIONWAY +COMPANIONWAYS +COMPANY +COMPANYING +COMPARABILITIES +COMPARABILITY +COMPARABLE +COMPARABLENESS +COMPARABLY +COMPARATIST +COMPARATISTS +COMPARATIVE +COMPARATIVELY +COMPARATIVENESS +COMPARATIVES +COMPARATIVIST +COMPARATIVISTS +COMPARATOR +COMPARATORS +COMPARE +COMPARED +COMPARER +COMPARERS +COMPARES +COMPARING +COMPARISON +COMPARISONS +COMPART +COMPARTED +COMPARTING +COMPARTMENT +COMPARTMENTAL +COMPARTMENTED +COMPARTMENTING +COMPARTMENTS +COMPARTS +COMPAS +COMPASS +COMPASSABLE +COMPASSED +COMPASSES +COMPASSING +COMPASSION +COMPASSIONATE +COMPASSIONATED +COMPASSIONATELY +COMPASSIONATES +COMPASSIONATING +COMPASSIONLESS +COMPASSIONS +COMPATIBILITIES +COMPATIBILITY +COMPATIBLE +COMPATIBLENESS +COMPATIBLES +COMPATIBLY +COMPATRIOT +COMPATRIOTIC +COMPATRIOTS +COMPED +COMPEER +COMPEERED +COMPEERING +COMPEERS +COMPEL +COMPELLABLE +COMPELLATION +COMPELLATIONS +COMPELLED +COMPELLER +COMPELLERS +COMPELLING +COMPELLINGLY +COMPELS +COMPEND +COMPENDIA +COMPENDIOUS +COMPENDIOUSLY +COMPENDIOUSNESS +COMPENDIUM +COMPENDIUMS +COMPENDS +COMPENSABILITY +COMPENSABLE +COMPENSATE +COMPENSATED +COMPENSATES +COMPENSATING +COMPENSATION +COMPENSATIONAL +COMPENSATIONS +COMPENSATIVE +COMPENSATOR +COMPENSATORS +COMPENSATORY +COMPERE +COMPERED +COMPERES +COMPERING +COMPETE +COMPETED +COMPETENCE +COMPETENCES +COMPETENCIES +COMPETENCY +COMPETENT +COMPETENTLY +COMPETES +COMPETING +COMPETITION +COMPETITIONS +COMPETITIVE +COMPETITIVELY +COMPETITIVENESS +COMPETITOR +COMPETITORS +COMPILATION +COMPILATIONS +COMPILE +COMPILED +COMPILER +COMPILERS +COMPILES +COMPILING +COMPING +COMPLACENCE +COMPLACENCES +COMPLACENCIES +COMPLACENCY +COMPLACENT +COMPLACENTLY +COMPLAIN +COMPLAINANT +COMPLAINANTS +COMPLAINED +COMPLAINER +COMPLAINERS +COMPLAINING +COMPLAININGLY +COMPLAINS +COMPLAINT +COMPLAINTS +COMPLAISANCE +COMPLAISANCES +COMPLAISANT +COMPLAISANTLY +COMPLEAT +COMPLECT +COMPLECTED +COMPLECTING +COMPLECTS +COMPLEMENT +COMPLEMENTAL +COMPLEMENTARIES +COMPLEMENTARILY +COMPLEMENTARITY +COMPLEMENTARY +COMPLEMENTATION +COMPLEMENTED +COMPLEMENTING +COMPLEMENTIZER +COMPLEMENTIZERS +COMPLEMENTS +COMPLETE +COMPLETED +COMPLETELY +COMPLETENESS +COMPLETENESSES +COMPLETER +COMPLETERS +COMPLETES +COMPLETEST +COMPLETING +COMPLETION +COMPLETIONS +COMPLETIVE +COMPLEX +COMPLEXATION +COMPLEXATIONS +COMPLEXED +COMPLEXER +COMPLEXES +COMPLEXEST +COMPLEXIFIED +COMPLEXIFIES +COMPLEXIFY +COMPLEXIFYING +COMPLEXING +COMPLEXION +COMPLEXIONAL +COMPLEXIONED +COMPLEXIONS +COMPLEXITIES +COMPLEXITY +COMPLEXLY +COMPLEXNESS +COMPLEXNESSES +COMPLIANCE +COMPLIANCES +COMPLIANCIES +COMPLIANCY +COMPLIANT +COMPLIANTLY +COMPLICACIES +COMPLICACY +COMPLICATE +COMPLICATED +COMPLICATEDLY +COMPLICATEDNESS +COMPLICATES +COMPLICATING +COMPLICATION +COMPLICATIONS +COMPLICE +COMPLICES +COMPLICIT +COMPLICITIES +COMPLICITOUS +COMPLICITY +COMPLIED +COMPLIER +COMPLIERS +COMPLIES +COMPLIMENT +COMPLIMENTARILY +COMPLIMENTARY +COMPLIMENTED +COMPLIMENTING +COMPLIMENTS +COMPLIN +COMPLINE +COMPLINES +COMPLINS +COMPLOT +COMPLOTS +COMPLOTTED +COMPLOTTING +COMPLY +COMPLYING +COMPO +COMPONE +COMPONENT +COMPONENTIAL +COMPONENTS +COMPONY +COMPORT +COMPORTED +COMPORTING +COMPORTMENT +COMPORTMENTS +COMPORTS +COMPOS +COMPOSE +COMPOSED +COMPOSEDLY +COMPOSEDNESS +COMPOSEDNESSES +COMPOSER +COMPOSERS +COMPOSES +COMPOSING +COMPOSITE +COMPOSITED +COMPOSITELY +COMPOSITES +COMPOSITING +COMPOSITION +COMPOSITIONAL +COMPOSITIONALLY +COMPOSITIONS +COMPOSITOR +COMPOSITORS +COMPOST +COMPOSTED +COMPOSTER +COMPOSTERS +COMPOSTING +COMPOSTS +COMPOSURE +COMPOSURES +COMPOTE +COMPOTES +COMPOUND +COMPOUNDABLE +COMPOUNDED +COMPOUNDER +COMPOUNDERS +COMPOUNDING +COMPOUNDS +COMPRADOR +COMPRADORE +COMPRADORES +COMPRADORS +COMPREHEND +COMPREHENDED +COMPREHENDIBLE +COMPREHENDING +COMPREHENDS +COMPREHENSIBLE +COMPREHENSIBLY +COMPREHENSION +COMPREHENSIONS +COMPREHENSIVE +COMPREHENSIVELY +COMPRESS +COMPRESSED +COMPRESSEDLY +COMPRESSES +COMPRESSIBILITY +COMPRESSIBLE +COMPRESSING +COMPRESSION +COMPRESSIONAL +COMPRESSIONS +COMPRESSIVE +COMPRESSIVELY +COMPRESSOR +COMPRESSORS +COMPRISAL +COMPRISALS +COMPRISE +COMPRISED +COMPRISES +COMPRISING +COMPRIZE +COMPRIZED +COMPRIZES +COMPRIZING +COMPROMISE +COMPROMISED +COMPROMISER +COMPROMISERS +COMPROMISES +COMPROMISING +COMPS +COMPT +COMPTED +COMPTING +COMPTROLLER +COMPTROLLERS +COMPTROLLERSHIP +COMPTS +COMPULSION +COMPULSIONS +COMPULSIVE +COMPULSIVELY +COMPULSIVENESS +COMPULSIVITIES +COMPULSIVITY +COMPULSORILY +COMPULSORY +COMPUNCTION +COMPUNCTIONS +COMPUNCTIOUS +COMPURGATION +COMPURGATIONS +COMPURGATOR +COMPURGATORS +COMPUTABILITIES +COMPUTABILITY +COMPUTABLE +COMPUTATION +COMPUTATIONAL +COMPUTATIONALLY +COMPUTATIONS +COMPUTE +COMPUTED +COMPUTER +COMPUTERDOM +COMPUTERDOMS +COMPUTERESE +COMPUTERESES +COMPUTERISE +COMPUTERISED +COMPUTERISES +COMPUTERISING +COMPUTERIST +COMPUTERISTS +COMPUTERIZABLE +COMPUTERIZATION +COMPUTERIZE +COMPUTERIZED +COMPUTERIZES +COMPUTERIZING +COMPUTERLESS +COMPUTERLIKE +COMPUTERNIK +COMPUTERNIKS +COMPUTERPHOBE +COMPUTERPHOBES +COMPUTERPHOBIA +COMPUTERPHOBIAS +COMPUTERPHOBIC +COMPUTERS +COMPUTES +COMPUTING +COMPUTIST +COMPUTISTS +COMRADE +COMRADELINESS +COMRADELINESSES +COMRADELY +COMRADERIES +COMRADERY +COMRADES +COMRADESHIP +COMRADESHIPS +COMSYMP +COMSYMPS +COMTE +COMTES +CON +CONATION +CONATIONS +CONATIVE +CONATUS +CONCANAVALIN +CONCANAVALINS +CONCATENATE +CONCATENATED +CONCATENATES +CONCATENATING +CONCATENATION +CONCATENATIONS +CONCAVE +CONCAVED +CONCAVELY +CONCAVES +CONCAVING +CONCAVITIES +CONCAVITY +CONCEAL +CONCEALABLE +CONCEALED +CONCEALER +CONCEALERS +CONCEALING +CONCEALINGLY +CONCEALMENT +CONCEALMENTS +CONCEALS +CONCEDE +CONCEDED +CONCEDEDLY +CONCEDER +CONCEDERS +CONCEDES +CONCEDING +CONCEIT +CONCEITED +CONCEITEDLY +CONCEITEDNESS +CONCEITEDNESSES +CONCEITING +CONCEITS +CONCEIVABILITY +CONCEIVABLE +CONCEIVABLENESS +CONCEIVABLY +CONCEIVE +CONCEIVED +CONCEIVER +CONCEIVERS +CONCEIVES +CONCEIVING +CONCELEBRANT +CONCELEBRANTS +CONCELEBRATE +CONCELEBRATED +CONCELEBRATES +CONCELEBRATING +CONCELEBRATION +CONCELEBRATIONS +CONCENT +CONCENTER +CONCENTERED +CONCENTERING +CONCENTERS +CONCENTRATE +CONCENTRATED +CONCENTRATEDLY +CONCENTRATES +CONCENTRATING +CONCENTRATION +CONCENTRATIONS +CONCENTRATIVE +CONCENTRATOR +CONCENTRATORS +CONCENTRIC +CONCENTRICALLY +CONCENTRICITIES +CONCENTRICITY +CONCENTS +CONCEPT +CONCEPTACLE +CONCEPTACLES +CONCEPTI +CONCEPTION +CONCEPTIONAL +CONCEPTIONS +CONCEPTIVE +CONCEPTS +CONCEPTUAL +CONCEPTUALISE +CONCEPTUALISED +CONCEPTUALISES +CONCEPTUALISING +CONCEPTUALISM +CONCEPTUALISMS +CONCEPTUALIST +CONCEPTUALISTIC +CONCEPTUALISTS +CONCEPTUALITIES +CONCEPTUALITY +CONCEPTUALIZE +CONCEPTUALIZED +CONCEPTUALIZER +CONCEPTUALIZERS +CONCEPTUALIZES +CONCEPTUALIZING +CONCEPTUALLY +CONCEPTUS +CONCEPTUSES +CONCERN +CONCERNED +CONCERNING +CONCERNMENT +CONCERNMENTS +CONCERNS +CONCERT +CONCERTED +CONCERTEDLY +CONCERTEDNESS +CONCERTEDNESSES +CONCERTGOER +CONCERTGOERS +CONCERTGOING +CONCERTGOINGS +CONCERTI +CONCERTINA +CONCERTINAS +CONCERTING +CONCERTINO +CONCERTINOS +CONCERTIZE +CONCERTIZED +CONCERTIZES +CONCERTIZING +CONCERTMASTER +CONCERTMASTERS +CONCERTMEISTER +CONCERTMEISTERS +CONCERTO +CONCERTOS +CONCERTS +CONCESSION +CONCESSIONAIRE +CONCESSIONAIRES +CONCESSIONAL +CONCESSIONARY +CONCESSIONER +CONCESSIONERS +CONCESSIONS +CONCESSIVE +CONCESSIVELY +CONCH +CONCHA +CONCHAE +CONCHAL +CONCHAS +CONCHES +CONCHIE +CONCHIES +CONCHO +CONCHOID +CONCHOIDAL +CONCHOIDALLY +CONCHOIDS +CONCHOLOGIES +CONCHOLOGIST +CONCHOLOGISTS +CONCHOLOGY +CONCHOS +CONCHS +CONCHY +CONCIERGE +CONCIERGES +CONCILIAR +CONCILIARLY +CONCILIATE +CONCILIATED +CONCILIATES +CONCILIATING +CONCILIATION +CONCILIATIONS +CONCILIATIVE +CONCILIATOR +CONCILIATORS +CONCILIATORY +CONCINNITIES +CONCINNITY +CONCISE +CONCISELY +CONCISENESS +CONCISENESSES +CONCISER +CONCISEST +CONCISION +CONCISIONS +CONCLAVE +CONCLAVES +CONCLUDE +CONCLUDED +CONCLUDER +CONCLUDERS +CONCLUDES +CONCLUDING +CONCLUSION +CONCLUSIONARY +CONCLUSIONS +CONCLUSIVE +CONCLUSIVELY +CONCLUSIVENESS +CONCLUSORY +CONCOCT +CONCOCTED +CONCOCTER +CONCOCTERS +CONCOCTING +CONCOCTION +CONCOCTIONS +CONCOCTIVE +CONCOCTOR +CONCOCTORS +CONCOCTS +CONCOMITANCE +CONCOMITANCES +CONCOMITANT +CONCOMITANTLY +CONCOMITANTS +CONCORD +CONCORDAL +CONCORDANCE +CONCORDANCES +CONCORDANT +CONCORDANTLY +CONCORDAT +CONCORDATS +CONCORDS +CONCOURS +CONCOURSE +CONCOURSES +CONCRESCENCE +CONCRESCENCES +CONCRESCENT +CONCRETE +CONCRETED +CONCRETELY +CONCRETENESS +CONCRETENESSES +CONCRETES +CONCRETING +CONCRETION +CONCRETIONARY +CONCRETIONS +CONCRETISM +CONCRETISMS +CONCRETIST +CONCRETISTS +CONCRETIZATION +CONCRETIZATIONS +CONCRETIZE +CONCRETIZED +CONCRETIZES +CONCRETIZING +CONCUBINAGE +CONCUBINAGES +CONCUBINE +CONCUBINES +CONCUPISCENCE +CONCUPISCENCES +CONCUPISCENT +CONCUPISCIBLE +CONCUR +CONCURRED +CONCURRENCE +CONCURRENCES +CONCURRENCIES +CONCURRENCY +CONCURRENT +CONCURRENTLY +CONCURRENTS +CONCURRING +CONCURS +CONCUSS +CONCUSSED +CONCUSSES +CONCUSSING +CONCUSSION +CONCUSSIONS +CONCUSSIVE +CONDEMN +CONDEMNABLE +CONDEMNATION +CONDEMNATIONS +CONDEMNATORY +CONDEMNED +CONDEMNER +CONDEMNERS +CONDEMNING +CONDEMNOR +CONDEMNORS +CONDEMNS +CONDENSABLE +CONDENSATE +CONDENSATES +CONDENSATION +CONDENSATIONAL +CONDENSATIONS +CONDENSE +CONDENSED +CONDENSER +CONDENSERS +CONDENSES +CONDENSIBLE +CONDENSING +CONDESCEND +CONDESCENDED +CONDESCENDENCE +CONDESCENDENCES +CONDESCENDING +CONDESCENDINGLY +CONDESCENDS +CONDESCENSION +CONDESCENSIONS +CONDIGN +CONDIGNLY +CONDIMENT +CONDIMENTAL +CONDIMENTS +CONDITION +CONDITIONABLE +CONDITIONAL +CONDITIONALITY +CONDITIONALLY +CONDITIONALS +CONDITIONED +CONDITIONER +CONDITIONERS +CONDITIONING +CONDITIONS +CONDO +CONDOES +CONDOLATORY +CONDOLE +CONDOLED +CONDOLENCE +CONDOLENCES +CONDOLENT +CONDOLER +CONDOLERS +CONDOLES +CONDOLING +CONDOM +CONDOMINIUM +CONDOMINIUMS +CONDOMS +CONDONABLE +CONDONATION +CONDONATIONS +CONDONE +CONDONED +CONDONER +CONDONERS +CONDONES +CONDONING +CONDOR +CONDORES +CONDORS +CONDOS +CONDOTTIERE +CONDOTTIERI +CONDUCE +CONDUCED +CONDUCER +CONDUCERS +CONDUCES +CONDUCING +CONDUCIVE +CONDUCIVENESS +CONDUCIVENESSES +CONDUCT +CONDUCTANCE +CONDUCTANCES +CONDUCTED +CONDUCTIBILITY +CONDUCTIBLE +CONDUCTIMETRIC +CONDUCTING +CONDUCTION +CONDUCTIONS +CONDUCTIVE +CONDUCTIVITIES +CONDUCTIVITY +CONDUCTOMETRIC +CONDUCTOR +CONDUCTORIAL +CONDUCTORS +CONDUCTRESS +CONDUCTRESSES +CONDUCTS +CONDUIT +CONDUITS +CONDUPLICATE +CONDYLAR +CONDYLE +CONDYLES +CONDYLOID +CONDYLOMA +CONDYLOMAS +CONDYLOMATA +CONDYLOMATOUS +CONE +CONED +CONEFLOWER +CONEFLOWERS +CONELRAD +CONELRADS +CONENOSE +CONENOSES +CONEPATE +CONEPATES +CONEPATL +CONEPATLS +CONES +CONEY +CONEYS +CONFAB +CONFABBED +CONFABBING +CONFABS +CONFABULATE +CONFABULATED +CONFABULATES +CONFABULATING +CONFABULATION +CONFABULATIONS +CONFABULATOR +CONFABULATORS +CONFABULATORY +CONFECT +CONFECTED +CONFECTING +CONFECTION +CONFECTIONARIES +CONFECTIONARY +CONFECTIONER +CONFECTIONERIES +CONFECTIONERS +CONFECTIONERY +CONFECTIONS +CONFECTS +CONFEDERACIES +CONFEDERACY +CONFEDERAL +CONFEDERATE +CONFEDERATED +CONFEDERATES +CONFEDERATING +CONFEDERATION +CONFEDERATIONS +CONFEDERATIVE +CONFER +CONFEREE +CONFEREES +CONFERENCE +CONFERENCES +CONFERENCING +CONFERENCINGS +CONFERENTIAL +CONFERMENT +CONFERMENTS +CONFERRABLE +CONFERRAL +CONFERRALS +CONFERRED +CONFERREE +CONFERREES +CONFERRENCE +CONFERRENCES +CONFERRER +CONFERRERS +CONFERRING +CONFERS +CONFERVA +CONFERVAE +CONFERVAL +CONFERVAS +CONFESS +CONFESSABLE +CONFESSED +CONFESSEDLY +CONFESSES +CONFESSING +CONFESSION +CONFESSIONAL +CONFESSIONALISM +CONFESSIONALIST +CONFESSIONALLY +CONFESSIONALS +CONFESSIONS +CONFESSOR +CONFESSORS +CONFETTI +CONFETTO +CONFIDANT +CONFIDANTE +CONFIDANTES +CONFIDANTS +CONFIDE +CONFIDED +CONFIDENCE +CONFIDENCES +CONFIDENT +CONFIDENTIAL +CONFIDENTIALITY +CONFIDENTIALLY +CONFIDENTLY +CONFIDER +CONFIDERS +CONFIDES +CONFIDING +CONFIDINGLY +CONFIDINGNESS +CONFIDINGNESSES +CONFIGURATION +CONFIGURATIONAL +CONFIGURATIONS +CONFIGURATIVE +CONFIGURE +CONFIGURED +CONFIGURES +CONFIGURING +CONFINE +CONFINED +CONFINEMENT +CONFINEMENTS +CONFINER +CONFINERS +CONFINES +CONFINING +CONFIRM +CONFIRMABILITY +CONFIRMABLE +CONFIRMAND +CONFIRMANDS +CONFIRMATION +CONFIRMATIONAL +CONFIRMATIONS +CONFIRMATORY +CONFIRMED +CONFIRMEDLY +CONFIRMEDNESS +CONFIRMEDNESSES +CONFIRMER +CONFIRMERS +CONFIRMING +CONFIRMS +CONFISCABLE +CONFISCATABLE +CONFISCATE +CONFISCATED +CONFISCATES +CONFISCATING +CONFISCATION +CONFISCATIONS +CONFISCATOR +CONFISCATORS +CONFISCATORY +CONFIT +CONFITEOR +CONFITEORS +CONFITS +CONFITURE +CONFITURES +CONFLAGRANT +CONFLAGRATION +CONFLAGRATIONS +CONFLATE +CONFLATED +CONFLATES +CONFLATING +CONFLATION +CONFLATIONS +CONFLICT +CONFLICTED +CONFLICTFUL +CONFLICTING +CONFLICTINGLY +CONFLICTION +CONFLICTIONS +CONFLICTIVE +CONFLICTS +CONFLICTUAL +CONFLUENCE +CONFLUENCES +CONFLUENT +CONFLUENTS +CONFLUX +CONFLUXES +CONFOCAL +CONFOCALLY +CONFORM +CONFORMABLE +CONFORMABLY +CONFORMAL +CONFORMANCE +CONFORMANCES +CONFORMATION +CONFORMATIONAL +CONFORMATIONS +CONFORMED +CONFORMER +CONFORMERS +CONFORMING +CONFORMISM +CONFORMISMS +CONFORMIST +CONFORMISTS +CONFORMITIES +CONFORMITY +CONFORMS +CONFOUND +CONFOUNDED +CONFOUNDEDLY +CONFOUNDER +CONFOUNDERS +CONFOUNDING +CONFOUNDINGLY +CONFOUNDS +CONFRATERNITIES +CONFRATERNITY +CONFRERE +CONFRERES +CONFRONT +CONFRONTAL +CONFRONTALS +CONFRONTATION +CONFRONTATIONAL +CONFRONTATIONS +CONFRONTED +CONFRONTER +CONFRONTERS +CONFRONTING +CONFRONTS +CONFUSE +CONFUSED +CONFUSEDLY +CONFUSEDNESS +CONFUSEDNESSES +CONFUSES +CONFUSING +CONFUSINGLY +CONFUSION +CONFUSIONAL +CONFUSIONS +CONFUTATION +CONFUTATIONS +CONFUTATIVE +CONFUTE +CONFUTED +CONFUTER +CONFUTERS +CONFUTES +CONFUTING +CONGA +CONGAED +CONGAING +CONGAS +CONGE +CONGEAL +CONGEALED +CONGEALER +CONGEALERS +CONGEALING +CONGEALMENT +CONGEALMENTS +CONGEALS +CONGEE +CONGEED +CONGEEING +CONGEES +CONGELATION +CONGELATIONS +CONGENER +CONGENERIC +CONGENEROUS +CONGENERS +CONGENIAL +CONGENIALITIES +CONGENIALITY +CONGENIALLY +CONGENITAL +CONGENITALLY +CONGER +CONGERIES +CONGERS +CONGES +CONGEST +CONGESTED +CONGESTING +CONGESTION +CONGESTIONS +CONGESTIVE +CONGESTS +CONGII +CONGIUS +CONGLOBATE +CONGLOBATED +CONGLOBATES +CONGLOBATING +CONGLOBATION +CONGLOBATIONS +CONGLOBE +CONGLOBED +CONGLOBES +CONGLOBING +CONGLOMERATE +CONGLOMERATED +CONGLOMERATES +CONGLOMERATEUR +CONGLOMERATEURS +CONGLOMERATIC +CONGLOMERATING +CONGLOMERATION +CONGLOMERATIONS +CONGLOMERATIVE +CONGLOMERATOR +CONGLOMERATORS +CONGLUTINATE +CONGLUTINATED +CONGLUTINATES +CONGLUTINATING +CONGLUTINATION +CONGLUTINATIONS +CONGO +CONGOES +CONGOS +CONGOU +CONGOUS +CONGRATS +CONGRATULATE +CONGRATULATED +CONGRATULATES +CONGRATULATING +CONGRATULATION +CONGRATULATIONS +CONGRATULATOR +CONGRATULATORS +CONGRATULATORY +CONGREGANT +CONGREGANTS +CONGREGATE +CONGREGATED +CONGREGATES +CONGREGATING +CONGREGATION +CONGREGATIONAL +CONGREGATIONS +CONGREGATOR +CONGREGATORS +CONGRESS +CONGRESSED +CONGRESSES +CONGRESSING +CONGRESSIONAL +CONGRESSIONALLY +CONGRESSMAN +CONGRESSMEN +CONGRESSPEOPLE +CONGRESSPERSON +CONGRESSPERSONS +CONGRESSWOMAN +CONGRESSWOMEN +CONGRUENCE +CONGRUENCES +CONGRUENCIES +CONGRUENCY +CONGRUENT +CONGRUENTLY +CONGRUITIES +CONGRUITY +CONGRUOUS +CONGRUOUSLY +CONGRUOUSNESS +CONGRUOUSNESSES +CONI +CONIC +CONICAL +CONICALLY +CONICITIES +CONICITY +CONICS +CONIDIA +CONIDIAL +CONIDIAN +CONIDIOPHORE +CONIDIOPHORES +CONIDIUM +CONIES +CONIFER +CONIFEROUS +CONIFERS +CONIINE +CONIINES +CONIN +CONINE +CONINES +CONING +CONINS +CONIOSES +CONIOSIS +CONIUM +CONIUMS +CONJECTURAL +CONJECTURALLY +CONJECTURE +CONJECTURED +CONJECTURER +CONJECTURERS +CONJECTURES +CONJECTURING +CONJOIN +CONJOINED +CONJOINER +CONJOINERS +CONJOINING +CONJOINS +CONJOINT +CONJOINTLY +CONJUGAL +CONJUGALITIES +CONJUGALITY +CONJUGALLY +CONJUGANT +CONJUGANTS +CONJUGATE +CONJUGATED +CONJUGATELY +CONJUGATENESS +CONJUGATENESSES +CONJUGATES +CONJUGATING +CONJUGATION +CONJUGATIONAL +CONJUGATIONALLY +CONJUGATIONS +CONJUNCT +CONJUNCTION +CONJUNCTIONAL +CONJUNCTIONALLY +CONJUNCTIONS +CONJUNCTIVA +CONJUNCTIVAE +CONJUNCTIVAL +CONJUNCTIVAS +CONJUNCTIVE +CONJUNCTIVELY +CONJUNCTIVES +CONJUNCTIVITIS +CONJUNCTS +CONJUNCTURE +CONJUNCTURES +CONJUNTO +CONJUNTOS +CONJURATION +CONJURATIONS +CONJURE +CONJURED +CONJURER +CONJURERS +CONJURES +CONJURING +CONJUROR +CONJURORS +CONK +CONKED +CONKER +CONKERS +CONKING +CONKS +CONKY +CONN +CONNATE +CONNATELY +CONNATION +CONNATIONS +CONNATURAL +CONNATURALITIES +CONNATURALITY +CONNATURALLY +CONNECT +CONNECTABLE +CONNECTED +CONNECTEDLY +CONNECTEDNESS +CONNECTEDNESSES +CONNECTER +CONNECTERS +CONNECTIBLE +CONNECTING +CONNECTION +CONNECTIONAL +CONNECTIONS +CONNECTIVE +CONNECTIVELY +CONNECTIVES +CONNECTIVITIES +CONNECTIVITY +CONNECTOR +CONNECTORS +CONNECTS +CONNED +CONNER +CONNERS +CONNEXION +CONNEXIONS +CONNING +CONNIPTION +CONNIPTIONS +CONNIVANCE +CONNIVANCES +CONNIVE +CONNIVED +CONNIVENT +CONNIVER +CONNIVERIES +CONNIVERS +CONNIVERY +CONNIVES +CONNIVING +CONNOISSEUR +CONNOISSEURS +CONNOISSEURSHIP +CONNOTATION +CONNOTATIONAL +CONNOTATIONS +CONNOTATIVE +CONNOTATIVELY +CONNOTE +CONNOTED +CONNOTES +CONNOTING +CONNS +CONNUBIAL +CONNUBIALISM +CONNUBIALISMS +CONNUBIALITIES +CONNUBIALITY +CONNUBIALLY +CONODONT +CONODONTS +CONOID +CONOIDAL +CONOIDS +CONOMINEE +CONOMINEES +CONQUER +CONQUERED +CONQUERER +CONQUERERS +CONQUERING +CONQUEROR +CONQUERORS +CONQUERS +CONQUEST +CONQUESTS +CONQUIAN +CONQUIANS +CONQUISTADOR +CONQUISTADORES +CONQUISTADORS +CONS +CONSANGUINE +CONSANGUINEOUS +CONSANGUINITIES +CONSANGUINITY +CONSCIENCE +CONSCIENCELESS +CONSCIENCES +CONSCIENTIOUS +CONSCIENTIOUSLY +CONSCIONABLE +CONSCIOUS +CONSCIOUSES +CONSCIOUSLY +CONSCIOUSNESS +CONSCIOUSNESSES +CONSCRIBE +CONSCRIBED +CONSCRIBES +CONSCRIBING +CONSCRIPT +CONSCRIPTED +CONSCRIPTING +CONSCRIPTION +CONSCRIPTIONS +CONSCRIPTS +CONSECRATE +CONSECRATED +CONSECRATES +CONSECRATING +CONSECRATION +CONSECRATIONS +CONSECRATIVE +CONSECRATOR +CONSECRATORS +CONSECRATORY +CONSECUTION +CONSECUTIONS +CONSECUTIVE +CONSECUTIVELY +CONSECUTIVENESS +CONSENSUAL +CONSENSUALLY +CONSENSUS +CONSENSUSES +CONSENT +CONSENTANEOUS +CONSENTANEOUSLY +CONSENTED +CONSENTER +CONSENTERS +CONSENTING +CONSENTINGLY +CONSENTS +CONSEQUENCE +CONSEQUENCES +CONSEQUENT +CONSEQUENTIAL +CONSEQUENTIALLY +CONSEQUENTLY +CONSEQUENTS +CONSERVANCIES +CONSERVANCY +CONSERVATION +CONSERVATIONAL +CONSERVATIONIST +CONSERVATIONS +CONSERVATISM +CONSERVATISMS +CONSERVATIVE +CONSERVATIVELY +CONSERVATIVES +CONSERVATIZE +CONSERVATIZED +CONSERVATIZES +CONSERVATIZING +CONSERVATOIRE +CONSERVATOIRES +CONSERVATOR +CONSERVATORIAL +CONSERVATORIES +CONSERVATORS +CONSERVATORSHIP +CONSERVATORY +CONSERVE +CONSERVED +CONSERVER +CONSERVERS +CONSERVES +CONSERVING +CONSIDER +CONSIDERABLE +CONSIDERABLES +CONSIDERABLY +CONSIDERATE +CONSIDERATELY +CONSIDERATENESS +CONSIDERATION +CONSIDERATIONS +CONSIDERED +CONSIDERING +CONSIDERS +CONSIGLIERE +CONSIGLIERI +CONSIGN +CONSIGNABLE +CONSIGNATION +CONSIGNATIONS +CONSIGNED +CONSIGNEE +CONSIGNEES +CONSIGNER +CONSIGNERS +CONSIGNING +CONSIGNMENT +CONSIGNMENTS +CONSIGNOR +CONSIGNORS +CONSIGNS +CONSIST +CONSISTED +CONSISTENCE +CONSISTENCES +CONSISTENCIES +CONSISTENCY +CONSISTENT +CONSISTENTLY +CONSISTING +CONSISTORIAL +CONSISTORIES +CONSISTORY +CONSISTS +CONSOCIATE +CONSOCIATED +CONSOCIATES +CONSOCIATING +CONSOCIATION +CONSOCIATIONAL +CONSOCIATIONS +CONSOL +CONSOLATION +CONSOLATIONS +CONSOLATORY +CONSOLE +CONSOLED +CONSOLER +CONSOLERS +CONSOLES +CONSOLIDATE +CONSOLIDATED +CONSOLIDATES +CONSOLIDATING +CONSOLIDATION +CONSOLIDATIONS +CONSOLIDATOR +CONSOLIDATORS +CONSOLING +CONSOLINGLY +CONSOLS +CONSOMME +CONSOMMES +CONSONANCE +CONSONANCES +CONSONANCIES +CONSONANCY +CONSONANT +CONSONANTAL +CONSONANTLY +CONSONANTS +CONSORT +CONSORTED +CONSORTIA +CONSORTING +CONSORTIUM +CONSORTIUMS +CONSORTS +CONSPECIFIC +CONSPECIFICS +CONSPECTUS +CONSPECTUSES +CONSPICUITIES +CONSPICUITY +CONSPICUOUS +CONSPICUOUSLY +CONSPICUOUSNESS +CONSPIRACIES +CONSPIRACY +CONSPIRATION +CONSPIRATIONAL +CONSPIRATIONS +CONSPIRATOR +CONSPIRATORIAL +CONSPIRATORS +CONSPIRE +CONSPIRED +CONSPIRER +CONSPIRERS +CONSPIRES +CONSPIRING +CONSTABLE +CONSTABLES +CONSTABULARIES +CONSTABULARY +CONSTANCIES +CONSTANCY +CONSTANT +CONSTANTAN +CONSTANTANS +CONSTANTLY +CONSTANTS +CONSTATIVE +CONSTATIVES +CONSTELLATE +CONSTELLATED +CONSTELLATES +CONSTELLATING +CONSTELLATION +CONSTELLATIONS +CONSTELLATORY +CONSTERNATE +CONSTERNATED +CONSTERNATES +CONSTERNATING +CONSTERNATION +CONSTERNATIONS +CONSTIPATE +CONSTIPATED +CONSTIPATES +CONSTIPATING +CONSTIPATION +CONSTIPATIONS +CONSTITUENCIES +CONSTITUENCY +CONSTITUENT +CONSTITUENTLY +CONSTITUENTS +CONSTITUTE +CONSTITUTED +CONSTITUTES +CONSTITUTING +CONSTITUTION +CONSTITUTIONAL +CONSTITUTIONALS +CONSTITUTIONS +CONSTITUTIVE +CONSTITUTIVELY +CONSTRAIN +CONSTRAINED +CONSTRAINEDLY +CONSTRAINING +CONSTRAINS +CONSTRAINT +CONSTRAINTS +CONSTRICT +CONSTRICTED +CONSTRICTING +CONSTRICTION +CONSTRICTIONS +CONSTRICTIVE +CONSTRICTOR +CONSTRICTORS +CONSTRICTS +CONSTRINGE +CONSTRINGED +CONSTRINGENT +CONSTRINGES +CONSTRINGING +CONSTRUABLE +CONSTRUAL +CONSTRUALS +CONSTRUCT +CONSTRUCTED +CONSTRUCTIBLE +CONSTRUCTING +CONSTRUCTION +CONSTRUCTIONAL +CONSTRUCTIONIST +CONSTRUCTIONS +CONSTRUCTIVE +CONSTRUCTIVELY +CONSTRUCTIVISM +CONSTRUCTIVISMS +CONSTRUCTIVIST +CONSTRUCTIVISTS +CONSTRUCTOR +CONSTRUCTORS +CONSTRUCTS +CONSTRUE +CONSTRUED +CONSTRUER +CONSTRUERS +CONSTRUES +CONSTRUING +CONSUBSTANTIAL +CONSUETUDE +CONSUETUDES +CONSUETUDINARY +CONSUL +CONSULAR +CONSULATE +CONSULATES +CONSULS +CONSULSHIP +CONSULSHIPS +CONSULT +CONSULTANCIES +CONSULTANCY +CONSULTANT +CONSULTANTS +CONSULTANTSHIP +CONSULTANTSHIPS +CONSULTATION +CONSULTATIONS +CONSULTATIVE +CONSULTED +CONSULTER +CONSULTERS +CONSULTING +CONSULTIVE +CONSULTOR +CONSULTORS +CONSULTS +CONSUMABLE +CONSUMABLES +CONSUME +CONSUMED +CONSUMEDLY +CONSUMER +CONSUMERISM +CONSUMERISMS +CONSUMERIST +CONSUMERISTIC +CONSUMERISTS +CONSUMERS +CONSUMERSHIP +CONSUMERSHIPS +CONSUMES +CONSUMING +CONSUMMATE +CONSUMMATED +CONSUMMATELY +CONSUMMATES +CONSUMMATING +CONSUMMATION +CONSUMMATIONS +CONSUMMATIVE +CONSUMMATOR +CONSUMMATORS +CONSUMMATORY +CONSUMPTION +CONSUMPTIONS +CONSUMPTIVE +CONSUMPTIVELY +CONSUMPTIVES +CONTACT +CONTACTED +CONTACTEE +CONTACTEES +CONTACTING +CONTACTOR +CONTACTORS +CONTACTS +CONTAGIA +CONTAGION +CONTAGIONS +CONTAGIOUS +CONTAGIOUSLY +CONTAGIOUSNESS +CONTAGIUM +CONTAIN +CONTAINABLE +CONTAINED +CONTAINER +CONTAINERBOARD +CONTAINERBOARDS +CONTAINERISE +CONTAINERISED +CONTAINERISES +CONTAINERISING +CONTAINERIZE +CONTAINERIZED +CONTAINERIZES +CONTAINERIZING +CONTAINERLESS +CONTAINERPORT +CONTAINERPORTS +CONTAINERS +CONTAINERSHIP +CONTAINERSHIPS +CONTAINING +CONTAINMENT +CONTAINMENTS +CONTAINS +CONTAMINANT +CONTAMINANTS +CONTAMINATE +CONTAMINATED +CONTAMINATES +CONTAMINATING +CONTAMINATION +CONTAMINATIONS +CONTAMINATIVE +CONTAMINATOR +CONTAMINATORS +CONTE +CONTEMN +CONTEMNED +CONTEMNER +CONTEMNERS +CONTEMNING +CONTEMNOR +CONTEMNORS +CONTEMNS +CONTEMPLATE +CONTEMPLATED +CONTEMPLATES +CONTEMPLATING +CONTEMPLATION +CONTEMPLATIONS +CONTEMPLATIVE +CONTEMPLATIVELY +CONTEMPLATIVES +CONTEMPLATOR +CONTEMPLATORS +CONTEMPO +CONTEMPORANEITY +CONTEMPORANEOUS +CONTEMPORARIES +CONTEMPORARILY +CONTEMPORARY +CONTEMPORIZE +CONTEMPORIZED +CONTEMPORIZES +CONTEMPORIZING +CONTEMPT +CONTEMPTIBILITY +CONTEMPTIBLE +CONTEMPTIBLY +CONTEMPTS +CONTEMPTUOUS +CONTEMPTUOUSLY +CONTEND +CONTENDED +CONTENDER +CONTENDERS +CONTENDING +CONTENDS +CONTENT +CONTENTED +CONTENTEDLY +CONTENTEDNESS +CONTENTEDNESSES +CONTENTING +CONTENTION +CONTENTIONS +CONTENTIOUS +CONTENTIOUSLY +CONTENTIOUSNESS +CONTENTMENT +CONTENTMENTS +CONTENTS +CONTERMINOUS +CONTERMINOUSLY +CONTES +CONTESSA +CONTESSAS +CONTEST +CONTESTABLE +CONTESTANT +CONTESTANTS +CONTESTATION +CONTESTATIONS +CONTESTED +CONTESTER +CONTESTERS +CONTESTING +CONTESTS +CONTEXT +CONTEXTLESS +CONTEXTS +CONTEXTUAL +CONTEXTUALIZE +CONTEXTUALIZED +CONTEXTUALIZES +CONTEXTUALIZING +CONTEXTUALLY +CONTEXTURE +CONTEXTURES +CONTIGUITIES +CONTIGUITY +CONTIGUOUS +CONTIGUOUSLY +CONTIGUOUSNESS +CONTINENCE +CONTINENCES +CONTINENT +CONTINENTAL +CONTINENTALLY +CONTINENTALS +CONTINENTLY +CONTINENTS +CONTINGENCE +CONTINGENCES +CONTINGENCIES +CONTINGENCY +CONTINGENT +CONTINGENTLY +CONTINGENTS +CONTINUA +CONTINUAL +CONTINUALLY +CONTINUANCE +CONTINUANCES +CONTINUANT +CONTINUANTS +CONTINUATE +CONTINUATION +CONTINUATIONS +CONTINUATIVE +CONTINUATOR +CONTINUATORS +CONTINUE +CONTINUED +CONTINUER +CONTINUERS +CONTINUES +CONTINUING +CONTINUINGLY +CONTINUITIES +CONTINUITY +CONTINUO +CONTINUOS +CONTINUOUS +CONTINUOUSLY +CONTINUOUSNESS +CONTINUUM +CONTINUUMS +CONTO +CONTORT +CONTORTED +CONTORTING +CONTORTION +CONTORTIONIST +CONTORTIONISTIC +CONTORTIONISTS +CONTORTIONS +CONTORTIVE +CONTORTS +CONTOS +CONTOUR +CONTOURED +CONTOURING +CONTOURS +CONTRA +CONTRABAND +CONTRABANDIST +CONTRABANDISTS +CONTRABANDS +CONTRABASS +CONTRABASSES +CONTRABASSIST +CONTRABASSISTS +CONTRABASSOON +CONTRABASSOONS +CONTRACEPTION +CONTRACEPTIONS +CONTRACEPTIVE +CONTRACEPTIVES +CONTRACT +CONTRACTED +CONTRACTIBILITY +CONTRACTIBLE +CONTRACTILE +CONTRACTILITIES +CONTRACTILITY +CONTRACTING +CONTRACTION +CONTRACTIONAL +CONTRACTIONARY +CONTRACTIONS +CONTRACTIVE +CONTRACTOR +CONTRACTORS +CONTRACTS +CONTRACTUAL +CONTRACTUALLY +CONTRACTURE +CONTRACTURES +CONTRADICT +CONTRADICTABLE +CONTRADICTED +CONTRADICTING +CONTRADICTION +CONTRADICTIONS +CONTRADICTIOUS +CONTRADICTOR +CONTRADICTORIES +CONTRADICTORILY +CONTRADICTORS +CONTRADICTORY +CONTRADICTS +CONTRAIL +CONTRAILS +CONTRAINDICATE +CONTRAINDICATED +CONTRAINDICATES +CONTRALATERAL +CONTRALTI +CONTRALTO +CONTRALTOS +CONTRAOCTAVE +CONTRAOCTAVES +CONTRAPOSITION +CONTRAPOSITIONS +CONTRAPOSITIVE +CONTRAPOSITIVES +CONTRAPTION +CONTRAPTIONS +CONTRAPUNTAL +CONTRAPUNTALLY +CONTRAPUNTIST +CONTRAPUNTISTS +CONTRARIAN +CONTRARIANS +CONTRARIES +CONTRARIETIES +CONTRARIETY +CONTRARILY +CONTRARINESS +CONTRARINESSES +CONTRARIOUS +CONTRARIWISE +CONTRARY +CONTRAS +CONTRAST +CONTRASTABLE +CONTRASTED +CONTRASTING +CONTRASTIVE +CONTRASTIVELY +CONTRASTS +CONTRASTY +CONTRAVENE +CONTRAVENED +CONTRAVENER +CONTRAVENERS +CONTRAVENES +CONTRAVENING +CONTRAVENTION +CONTRAVENTIONS +CONTREDANSE +CONTREDANSES +CONTRETEMPS +CONTRIBUTE +CONTRIBUTED +CONTRIBUTES +CONTRIBUTING +CONTRIBUTION +CONTRIBUTIONS +CONTRIBUTIVE +CONTRIBUTIVELY +CONTRIBUTOR +CONTRIBUTORS +CONTRIBUTORY +CONTRITE +CONTRITELY +CONTRITENESS +CONTRITENESSES +CONTRITION +CONTRITIONS +CONTRIVANCE +CONTRIVANCES +CONTRIVE +CONTRIVED +CONTRIVER +CONTRIVERS +CONTRIVES +CONTRIVING +CONTROL +CONTROLLABILITY +CONTROLLABLE +CONTROLLED +CONTROLLER +CONTROLLERS +CONTROLLERSHIP +CONTROLLERSHIPS +CONTROLLING +CONTROLMENT +CONTROLMENTS +CONTROLS +CONTROVERSIAL +CONTROVERSIALLY +CONTROVERSIES +CONTROVERSY +CONTROVERT +CONTROVERTED +CONTROVERTER +CONTROVERTERS +CONTROVERTIBLE +CONTROVERTING +CONTROVERTS +CONTUMACIES +CONTUMACIOUS +CONTUMACIOUSLY +CONTUMACY +CONTUMELIES +CONTUMELIOUS +CONTUMELIOUSLY +CONTUMELY +CONTUSE +CONTUSED +CONTUSES +CONTUSING +CONTUSION +CONTUSIONS +CONTUSIVE +CONUNDRUM +CONUNDRUMS +CONURBATION +CONURBATIONS +CONUS +CONVALESCE +CONVALESCED +CONVALESCENCE +CONVALESCENCES +CONVALESCENT +CONVALESCENTS +CONVALESCES +CONVALESCING +CONVECT +CONVECTED +CONVECTING +CONVECTION +CONVECTIONAL +CONVECTIONS +CONVECTIVE +CONVECTOR +CONVECTORS +CONVECTS +CONVENE +CONVENED +CONVENER +CONVENERS +CONVENES +CONVENIENCE +CONVENIENCES +CONVENIENCIES +CONVENIENCY +CONVENIENT +CONVENIENTLY +CONVENING +CONVENOR +CONVENORS +CONVENT +CONVENTED +CONVENTICLE +CONVENTICLER +CONVENTICLERS +CONVENTICLES +CONVENTING +CONVENTION +CONVENTIONAL +CONVENTIONALISM +CONVENTIONALIST +CONVENTIONALITY +CONVENTIONALIZE +CONVENTIONALLY +CONVENTIONEER +CONVENTIONEERS +CONVENTIONS +CONVENTS +CONVENTUAL +CONVENTUALLY +CONVENTUALS +CONVERGE +CONVERGED +CONVERGENCE +CONVERGENCES +CONVERGENCIES +CONVERGENCY +CONVERGENT +CONVERGES +CONVERGING +CONVERSABLE +CONVERSANCE +CONVERSANCES +CONVERSANCIES +CONVERSANCY +CONVERSANT +CONVERSATION +CONVERSATIONAL +CONVERSATIONS +CONVERSAZIONE +CONVERSAZIONES +CONVERSAZIONI +CONVERSE +CONVERSED +CONVERSELY +CONVERSER +CONVERSERS +CONVERSES +CONVERSING +CONVERSION +CONVERSIONAL +CONVERSIONS +CONVERSO +CONVERSOS +CONVERT +CONVERTAPLANE +CONVERTAPLANES +CONVERTED +CONVERTER +CONVERTERS +CONVERTIBILITY +CONVERTIBLE +CONVERTIBLENESS +CONVERTIBLES +CONVERTIBLY +CONVERTING +CONVERTIPLANE +CONVERTIPLANES +CONVERTOR +CONVERTORS +CONVERTS +CONVEX +CONVEXES +CONVEXITIES +CONVEXITY +CONVEXLY +CONVEY +CONVEYANCE +CONVEYANCER +CONVEYANCERS +CONVEYANCES +CONVEYANCING +CONVEYANCINGS +CONVEYED +CONVEYER +CONVEYERS +CONVEYING +CONVEYOR +CONVEYORISE +CONVEYORISED +CONVEYORISES +CONVEYORISING +CONVEYORIZATION +CONVEYORIZE +CONVEYORIZED +CONVEYORIZES +CONVEYORIZING +CONVEYORS +CONVEYS +CONVICT +CONVICTED +CONVICTING +CONVICTION +CONVICTIONS +CONVICTS +CONVINCE +CONVINCED +CONVINCER +CONVINCERS +CONVINCES +CONVINCING +CONVINCINGLY +CONVINCINGNESS +CONVIVIAL +CONVIVIALITIES +CONVIVIALITY +CONVIVIALLY +CONVOCATION +CONVOCATIONAL +CONVOCATIONS +CONVOKE +CONVOKED +CONVOKER +CONVOKERS +CONVOKES +CONVOKING +CONVOLUTE +CONVOLUTED +CONVOLUTES +CONVOLUTING +CONVOLUTION +CONVOLUTIONS +CONVOLVE +CONVOLVED +CONVOLVES +CONVOLVING +CONVOLVULI +CONVOLVULUS +CONVOLVULUSES +CONVOY +CONVOYED +CONVOYING +CONVOYS +CONVULSANT +CONVULSANTS +CONVULSE +CONVULSED +CONVULSES +CONVULSING +CONVULSION +CONVULSIONARY +CONVULSIONS +CONVULSIVE +CONVULSIVELY +CONVULSIVENESS +CONY +COO +COOCH +COOCHES +COOCOO +COOED +COOEE +COOEED +COOEEING +COOEES +COOER +COOERS +COOEY +COOEYED +COOEYING +COOEYS +COOF +COOFS +COOING +COOINGLY +COOK +COOKABLE +COOKBOOK +COOKBOOKS +COOKED +COOKER +COOKERIES +COOKERS +COOKERY +COOKEY +COOKEYS +COOKHOUSE +COOKHOUSES +COOKIE +COOKIES +COOKING +COOKINGS +COOKLESS +COOKOFF +COOKOFFS +COOKOUT +COOKOUTS +COOKS +COOKSHACK +COOKSHACKS +COOKSHOP +COOKSHOPS +COOKSTOVE +COOKSTOVES +COOKTOP +COOKTOPS +COOKWARE +COOKWARES +COOKY +COOL +COOLANT +COOLANTS +COOLDOWN +COOLDOWNS +COOLED +COOLER +COOLERS +COOLEST +COOLHEADED +COOLIE +COOLIES +COOLING +COOLISH +COOLLY +COOLNESS +COOLNESSES +COOLS +COOLTH +COOLTHS +COOLY +COOMB +COOMBE +COOMBES +COOMBS +COON +COONCAN +COONCANS +COONHOUND +COONHOUNDS +COONS +COONSKIN +COONSKINS +COONTIE +COONTIES +COOP +COOPED +COOPER +COOPERAGE +COOPERAGES +COOPERATE +COOPERATED +COOPERATES +COOPERATING +COOPERATION +COOPERATIONIST +COOPERATIONISTS +COOPERATIONS +COOPERATIVE +COOPERATIVELY +COOPERATIVENESS +COOPERATIVES +COOPERATOR +COOPERATORS +COOPERED +COOPERIES +COOPERING +COOPERS +COOPERY +COOPING +COOPS +COOPT +COOPTED +COOPTING +COOPTION +COOPTIONS +COOPTS +COORDINATE +COORDINATED +COORDINATELY +COORDINATENESS +COORDINATES +COORDINATING +COORDINATION +COORDINATIONS +COORDINATIVE +COORDINATOR +COORDINATORS +COOS +COOT +COOTER +COOTERS +COOTIE +COOTIES +COOTS +COP +COPACETIC +COPAIBA +COPAIBAS +COPAL +COPALM +COPALMS +COPALS +COPARCENARIES +COPARCENARY +COPARCENER +COPARCENERS +COPARENT +COPARENTED +COPARENTING +COPARENTS +COPARTNER +COPARTNERED +COPARTNERING +COPARTNERS +COPARTNERSHIP +COPARTNERSHIPS +COPASETIC +COPASTOR +COPASTORS +COPATRON +COPATRONS +COPAY +COPAYMENT +COPAYMENTS +COPAYS +COPE +COPECK +COPECKS +COPED +COPEMATE +COPEMATES +COPEN +COPENS +COPEPOD +COPEPODS +COPER +COPERS +COPES +COPESETIC +COPESTONE +COPESTONES +COPIED +COPIER +COPIERS +COPIES +COPIHUE +COPIHUES +COPILOT +COPILOTS +COPING +COPINGS +COPINGSTONE +COPINGSTONES +COPIOUS +COPIOUSLY +COPIOUSNESS +COPIOUSNESSES +COPLANAR +COPLANARITIES +COPLANARITY +COPLOT +COPLOTS +COPLOTTED +COPLOTTING +COPOLYMER +COPOLYMERIC +COPOLYMERIZE +COPOLYMERIZED +COPOLYMERIZES +COPOLYMERIZING +COPOLYMERS +COPOUT +COPOUTS +COPPED +COPPER +COPPERAH +COPPERAHS +COPPERAS +COPPERASES +COPPERED +COPPERHEAD +COPPERHEADS +COPPERING +COPPERPLATE +COPPERPLATES +COPPERS +COPPERSMITH +COPPERSMITHS +COPPERY +COPPICE +COPPICED +COPPICES +COPPICING +COPPING +COPPRA +COPPRAS +COPRA +COPRAH +COPRAHS +COPRAS +COPREMIA +COPREMIAS +COPREMIC +COPRESENT +COPRESENTED +COPRESENTING +COPRESENTS +COPRESIDENT +COPRESIDENTS +COPRINCE +COPRINCES +COPRINCIPAL +COPRINCIPALS +COPRISONER +COPRISONERS +COPROCESSING +COPROCESSOR +COPROCESSORS +COPRODUCE +COPRODUCED +COPRODUCER +COPRODUCERS +COPRODUCES +COPRODUCING +COPRODUCT +COPRODUCTION +COPRODUCTIONS +COPRODUCTS +COPROLITE +COPROLITES +COPROLITIC +COPROLOGIES +COPROLOGY +COPROMOTER +COPROMOTERS +COPROPHAGIES +COPROPHAGOUS +COPROPHAGY +COPROPHILIA +COPROPHILIAC +COPROPHILIACS +COPROPHILIAS +COPROPHILOUS +COPROPRIETOR +COPROPRIETORS +COPROSPERITIES +COPROSPERITY +COPS +COPSE +COPSES +COPTER +COPTERS +COPUBLISH +COPUBLISHED +COPUBLISHER +COPUBLISHERS +COPUBLISHES +COPUBLISHING +COPULA +COPULAE +COPULAR +COPULAS +COPULATE +COPULATED +COPULATES +COPULATING +COPULATION +COPULATIONS +COPULATIVE +COPULATIVES +COPULATORY +COPURIFIED +COPURIFIES +COPURIFY +COPURIFYING +COPY +COPYABLE +COPYBOOK +COPYBOOKS +COPYBOY +COPYBOYS +COPYCAT +COPYCATS +COPYCATTED +COPYCATTING +COPYDESK +COPYDESKS +COPYEDIT +COPYEDITED +COPYEDITING +COPYEDITS +COPYGIRL +COPYGIRLS +COPYHOLD +COPYHOLDER +COPYHOLDERS +COPYHOLDS +COPYING +COPYIST +COPYISTS +COPYLEFT +COPYLEFTS +COPYREAD +COPYREADER +COPYREADERS +COPYREADING +COPYREADS +COPYRIGHT +COPYRIGHTABLE +COPYRIGHTED +COPYRIGHTING +COPYRIGHTS +COPYWRITER +COPYWRITERS +COQUET +COQUETRIES +COQUETRY +COQUETS +COQUETTE +COQUETTED +COQUETTES +COQUETTING +COQUETTISH +COQUETTISHLY +COQUETTISHNESS +COQUILLE +COQUILLES +COQUINA +COQUINAS +COQUITO +COQUITOS +COR +CORACLE +CORACLES +CORACOID +CORACOIDS +CORAL +CORALBELLS +CORALBERRIES +CORALBERRY +CORALLINE +CORALLINES +CORALLOID +CORALROOT +CORALROOTS +CORALS +CORANTO +CORANTOES +CORANTOS +CORBAN +CORBANS +CORBEIL +CORBEILLE +CORBEILLES +CORBEILS +CORBEL +CORBELED +CORBELING +CORBELINGS +CORBELLED +CORBELLING +CORBELS +CORBICULA +CORBICULAE +CORBIE +CORBIES +CORBINA +CORBINAS +CORBY +CORD +CORDAGE +CORDAGES +CORDATE +CORDATELY +CORDED +CORDELLE +CORDELLED +CORDELLES +CORDELLING +CORDER +CORDERS +CORDGRASS +CORDGRASSES +CORDIAL +CORDIALITIES +CORDIALITY +CORDIALLY +CORDIALNESS +CORDIALNESSES +CORDIALS +CORDIERITE +CORDIERITES +CORDIFORM +CORDILLERA +CORDILLERAN +CORDILLERAS +CORDING +CORDINGS +CORDITE +CORDITES +CORDLESS +CORDLESSES +CORDLIKE +CORDOBA +CORDOBAS +CORDON +CORDONED +CORDONING +CORDONNET +CORDONNETS +CORDONS +CORDOVAN +CORDOVANS +CORDS +CORDUROY +CORDUROYED +CORDUROYING +CORDUROYS +CORDWAIN +CORDWAINER +CORDWAINERIES +CORDWAINERS +CORDWAINERY +CORDWAINS +CORDWOOD +CORDWOODS +CORE +CORECIPIENT +CORECIPIENTS +CORED +COREDEEM +COREDEEMED +COREDEEMING +COREDEEMS +COREIGN +COREIGNS +CORELATE +CORELATED +CORELATES +CORELATING +CORELESS +CORELIGIONIST +CORELIGIONISTS +COREMIA +COREMIUM +COREOPSIS +COREPRESSOR +COREPRESSORS +COREQUISITE +COREQUISITES +CORER +CORERS +CORES +CORESEARCHER +CORESEARCHERS +CORESIDENT +CORESIDENTIAL +CORESIDENTS +CORESPONDENT +CORESPONDENTS +CORF +CORGI +CORGIS +CORIA +CORIACEOUS +CORIANDER +CORIANDERS +CORING +CORIUM +CORK +CORKAGE +CORKAGES +CORKBOARD +CORKBOARDS +CORKED +CORKER +CORKERS +CORKIER +CORKIEST +CORKINESS +CORKINESSES +CORKING +CORKLIKE +CORKS +CORKSCREW +CORKSCREWED +CORKSCREWING +CORKSCREWS +CORKWOOD +CORKWOODS +CORKY +CORM +CORMEL +CORMELS +CORMLIKE +CORMOID +CORMORANT +CORMORANTS +CORMOUS +CORMS +CORN +CORNBALL +CORNBALLS +CORNBRAID +CORNBRAIDED +CORNBRAIDING +CORNBRAIDS +CORNBREAD +CORNBREADS +CORNCAKE +CORNCAKES +CORNCOB +CORNCOBS +CORNCRAKE +CORNCRAKES +CORNCRIB +CORNCRIBS +CORNEA +CORNEAL +CORNEAS +CORNED +CORNEITIS +CORNEITISES +CORNEL +CORNELIAN +CORNELIANS +CORNELS +CORNEOUS +CORNER +CORNERBACK +CORNERBACKS +CORNERED +CORNERING +CORNERMAN +CORNERMEN +CORNERS +CORNERSTONE +CORNERSTONES +CORNERWAYS +CORNERWISE +CORNET +CORNETCIES +CORNETCY +CORNETIST +CORNETISTS +CORNETS +CORNETTIST +CORNETTISTS +CORNFED +CORNFIELD +CORNFIELDS +CORNFLAKES +CORNFLOWER +CORNFLOWERS +CORNHUSK +CORNHUSKING +CORNHUSKINGS +CORNHUSKS +CORNICE +CORNICED +CORNICES +CORNICHE +CORNICHES +CORNICHON +CORNICHONS +CORNICING +CORNICLE +CORNICLES +CORNIER +CORNIEST +CORNIFICATION +CORNIFICATIONS +CORNIFIED +CORNIFIES +CORNIFY +CORNIFYING +CORNILY +CORNINESS +CORNINESSES +CORNING +CORNMEAL +CORNMEALS +CORNPONE +CORNPONES +CORNROW +CORNROWED +CORNROWING +CORNROWS +CORNS +CORNSTALK +CORNSTALKS +CORNSTARCH +CORNSTARCHES +CORNU +CORNUA +CORNUAL +CORNUCOPIA +CORNUCOPIAN +CORNUCOPIAS +CORNUS +CORNUSES +CORNUTE +CORNUTED +CORNUTO +CORNUTOS +CORNY +CORODIES +CORODY +COROLLA +COROLLARIES +COROLLARY +COROLLAS +COROLLATE +COROMANDEL +COROMANDELS +CORONA +CORONACH +CORONACHS +CORONAE +CORONAGRAPH +CORONAGRAPHS +CORONAL +CORONALLY +CORONALS +CORONARIES +CORONARY +CORONAS +CORONATE +CORONATED +CORONATES +CORONATING +CORONATION +CORONATIONS +CORONEL +CORONELS +CORONER +CORONERS +CORONET +CORONETED +CORONETS +CORONOGRAPH +CORONOGRAPHS +CORONOID +COROTATE +COROTATED +COROTATES +COROTATING +COROTATION +COROTATIONS +CORPORA +CORPORAL +CORPORALITIES +CORPORALITY +CORPORALLY +CORPORALS +CORPORATE +CORPORATELY +CORPORATES +CORPORATION +CORPORATIONS +CORPORATISM +CORPORATISMS +CORPORATIST +CORPORATIVE +CORPORATIVISM +CORPORATIVISMS +CORPORATOR +CORPORATORS +CORPOREAL +CORPOREALITIES +CORPOREALITY +CORPOREALLY +CORPOREALNESS +CORPOREALNESSES +CORPOREITIES +CORPOREITY +CORPOSANT +CORPOSANTS +CORPS +CORPSE +CORPSES +CORPSMAN +CORPSMEN +CORPULENCE +CORPULENCES +CORPULENCIES +CORPULENCY +CORPULENT +CORPULENTLY +CORPUS +CORPUSCLE +CORPUSCLES +CORPUSCULAR +CORPUSES +CORRADE +CORRADED +CORRADES +CORRADING +CORRAL +CORRALLED +CORRALLING +CORRALS +CORRASION +CORRASIONS +CORRASIVE +CORRECT +CORRECTABLE +CORRECTED +CORRECTER +CORRECTEST +CORRECTING +CORRECTION +CORRECTIONAL +CORRECTIONS +CORRECTITUDE +CORRECTITUDES +CORRECTIVE +CORRECTIVELY +CORRECTIVES +CORRECTLY +CORRECTNESS +CORRECTNESSES +CORRECTOR +CORRECTORS +CORRECTS +CORRELATABLE +CORRELATE +CORRELATED +CORRELATES +CORRELATING +CORRELATION +CORRELATIONAL +CORRELATIONS +CORRELATIVE +CORRELATIVELY +CORRELATIVES +CORRELATOR +CORRELATORS +CORRESPOND +CORRESPONDED +CORRESPONDENCE +CORRESPONDENCES +CORRESPONDENCY +CORRESPONDENT +CORRESPONDENTS +CORRESPONDING +CORRESPONDINGLY +CORRESPONDS +CORRESPONSIVE +CORRIDA +CORRIDAS +CORRIDOR +CORRIDORS +CORRIE +CORRIES +CORRIGENDA +CORRIGENDUM +CORRIGIBILITIES +CORRIGIBILITY +CORRIGIBLE +CORRIVAL +CORRIVALS +CORROBORANT +CORROBORATE +CORROBORATED +CORROBORATES +CORROBORATING +CORROBORATION +CORROBORATIONS +CORROBORATIVE +CORROBORATOR +CORROBORATORS +CORROBORATORY +CORROBOREE +CORROBOREES +CORRODE +CORRODED +CORRODES +CORRODIBLE +CORRODIES +CORRODING +CORRODY +CORROSION +CORROSIONS +CORROSIVE +CORROSIVELY +CORROSIVENESS +CORROSIVENESSES +CORROSIVES +CORRUGATE +CORRUGATED +CORRUGATES +CORRUGATING +CORRUGATION +CORRUGATIONS +CORRUPT +CORRUPTED +CORRUPTER +CORRUPTERS +CORRUPTEST +CORRUPTIBILITY +CORRUPTIBLE +CORRUPTIBLY +CORRUPTING +CORRUPTION +CORRUPTIONIST +CORRUPTIONISTS +CORRUPTIONS +CORRUPTIVE +CORRUPTIVELY +CORRUPTLY +CORRUPTNESS +CORRUPTNESSES +CORRUPTOR +CORRUPTORS +CORRUPTS +CORS +CORSAC +CORSACS +CORSAGE +CORSAGES +CORSAIR +CORSAIRS +CORSE +CORSELET +CORSELETS +CORSELETTE +CORSELETTES +CORSES +CORSET +CORSETED +CORSETIERE +CORSETIERES +CORSETING +CORSETRIES +CORSETRY +CORSETS +CORSLET +CORSLETS +CORTEGE +CORTEGES +CORTEX +CORTEXES +CORTICAL +CORTICALLY +CORTICATE +CORTICES +CORTICOID +CORTICOIDS +CORTICOSE +CORTICOSTEROID +CORTICOSTEROIDS +CORTICOSTERONE +CORTICOSTERONES +CORTICOTROPHIN +CORTICOTROPHINS +CORTICOTROPIN +CORTICOTROPINS +CORTIN +CORTINA +CORTINAS +CORTINS +CORTISOL +CORTISOLS +CORTISONE +CORTISONES +CORULER +CORULERS +CORUNDUM +CORUNDUMS +CORUSCANT +CORUSCATE +CORUSCATED +CORUSCATES +CORUSCATING +CORUSCATION +CORUSCATIONS +CORVEE +CORVEES +CORVES +CORVET +CORVETS +CORVETTE +CORVETTES +CORVID +CORVIDS +CORVINA +CORVINAS +CORVINE +CORY +CORYBANT +CORYBANTES +CORYBANTIC +CORYBANTS +CORYDALIS +CORYDALISES +CORYMB +CORYMBED +CORYMBOSE +CORYMBOSELY +CORYMBOUS +CORYMBS +CORYNEBACTERIA +CORYNEBACTERIAL +CORYNEBACTERIUM +CORYNEFORM +CORYPHAEI +CORYPHAEUS +CORYPHEE +CORYPHEES +CORYZA +CORYZAL +CORYZAS +COS +COSCRIPT +COSCRIPTED +COSCRIPTING +COSCRIPTS +COSEC +COSECANT +COSECANTS +COSECS +COSEISMAL +COSEISMALS +COSEISMIC +COSEISMICS +COSES +COSET +COSETS +COSEY +COSEYS +COSH +COSHED +COSHER +COSHERED +COSHERING +COSHERS +COSHES +COSHING +COSIE +COSIED +COSIER +COSIES +COSIEST +COSIGN +COSIGNATORIES +COSIGNATORY +COSIGNED +COSIGNER +COSIGNERS +COSIGNING +COSIGNS +COSILY +COSINE +COSINES +COSINESS +COSINESSES +COSMETIC +COSMETICALLY +COSMETICIAN +COSMETICIANS +COSMETICIZE +COSMETICIZED +COSMETICIZES +COSMETICIZING +COSMETICS +COSMETOLOGIES +COSMETOLOGIST +COSMETOLOGISTS +COSMETOLOGY +COSMIC +COSMICAL +COSMICALLY +COSMID +COSMIDS +COSMISM +COSMISMS +COSMIST +COSMISTS +COSMOCHEMICAL +COSMOCHEMIST +COSMOCHEMISTRY +COSMOCHEMISTS +COSMOGENIC +COSMOGONIC +COSMOGONICAL +COSMOGONIES +COSMOGONIST +COSMOGONISTS +COSMOGONY +COSMOGRAPHER +COSMOGRAPHERS +COSMOGRAPHIC +COSMOGRAPHICAL +COSMOGRAPHIES +COSMOGRAPHY +COSMOLINE +COSMOLINED +COSMOLINES +COSMOLINING +COSMOLOGICAL +COSMOLOGICALLY +COSMOLOGIES +COSMOLOGIST +COSMOLOGISTS +COSMOLOGY +COSMONAUT +COSMONAUTS +COSMOPOLIS +COSMOPOLISES +COSMOPOLITAN +COSMOPOLITANISM +COSMOPOLITANS +COSMOPOLITE +COSMOPOLITES +COSMOPOLITISM +COSMOPOLITISMS +COSMOS +COSMOSES +COSMOTRON +COSMOTRONS +COSPONSOR +COSPONSORED +COSPONSORING +COSPONSORS +COSPONSORSHIP +COSPONSORSHIPS +COSS +COSSACK +COSSACKS +COSSET +COSSETED +COSSETING +COSSETS +COST +COSTA +COSTAE +COSTAL +COSTALLY +COSTAR +COSTARD +COSTARDS +COSTARRED +COSTARRING +COSTARS +COSTATE +COSTED +COSTER +COSTERMONGER +COSTERMONGERS +COSTERS +COSTING +COSTIVE +COSTIVELY +COSTIVENESS +COSTIVENESSES +COSTLESS +COSTLESSLY +COSTLIER +COSTLIEST +COSTLINESS +COSTLINESSES +COSTLY +COSTMARIES +COSTMARY +COSTREL +COSTRELS +COSTS +COSTUME +COSTUMED +COSTUMER +COSTUMERIES +COSTUMERS +COSTUMERY +COSTUMES +COSTUMEY +COSTUMIER +COSTUMIERS +COSTUMING +COSURFACTANT +COSURFACTANTS +COSY +COSYING +COT +COTAN +COTANGENT +COTANGENTS +COTANS +COTE +COTEAU +COTEAUX +COTED +COTENANCIES +COTENANCY +COTENANT +COTENANTS +COTERIE +COTERIES +COTERMINOUS +COTERMINOUSLY +COTES +COTHURN +COTHURNAL +COTHURNI +COTHURNS +COTHURNUS +COTIDAL +COTILLION +COTILLIONS +COTILLON +COTILLONS +COTING +COTINGA +COTINGAS +COTININE +COTININES +COTONEASTER +COTONEASTERS +COTQUEAN +COTQUEANS +COTRANSDUCE +COTRANSDUCED +COTRANSDUCES +COTRANSDUCING +COTRANSDUCTION +COTRANSDUCTIONS +COTRANSFER +COTRANSFERS +COTRANSPORT +COTRANSPORTED +COTRANSPORTING +COTRANSPORTS +COTRUSTEE +COTRUSTEES +COTS +COTTA +COTTAE +COTTAGE +COTTAGER +COTTAGERS +COTTAGES +COTTAGEY +COTTAR +COTTARS +COTTAS +COTTER +COTTERED +COTTERLESS +COTTERS +COTTIER +COTTIERS +COTTON +COTTONED +COTTONING +COTTONMOUTH +COTTONMOUTHS +COTTONS +COTTONSEED +COTTONSEEDS +COTTONTAIL +COTTONTAILS +COTTONWEED +COTTONWEEDS +COTTONWOOD +COTTONWOODS +COTTONY +COTURNIX +COTURNIXES +COTYLEDON +COTYLEDONARY +COTYLEDONS +COTYLOID +COTYLOSAUR +COTYLOSAURS +COTYPE +COTYPES +COUCH +COUCHANT +COUCHED +COUCHER +COUCHERS +COUCHES +COUCHETTE +COUCHETTES +COUCHING +COUCHINGS +COUDE +COUGAR +COUGARS +COUGH +COUGHED +COUGHER +COUGHERS +COUGHING +COUGHS +COULD +COULDEST +COULDST +COULEE +COULEES +COULIBIAC +COULIBIACS +COULIS +COULISSE +COULISSES +COULOIR +COULOIRS +COULOMB +COULOMBIC +COULOMBS +COULOMETER +COULOMETERS +COULOMETRIC +COULOMETRICALLY +COULOMETRIES +COULOMETRY +COULTER +COULTERS +COUMARIC +COUMARIN +COUMARINS +COUMARONE +COUMARONES +COUMAROU +COUMAROUS +COUNCIL +COUNCILLOR +COUNCILLORS +COUNCILLORSHIP +COUNCILLORSHIPS +COUNCILMAN +COUNCILMANIC +COUNCILMEN +COUNCILOR +COUNCILORS +COUNCILS +COUNCILWOMAN +COUNCILWOMEN +COUNSEL +COUNSELED +COUNSELEE +COUNSELEES +COUNSELING +COUNSELINGS +COUNSELLED +COUNSELLING +COUNSELLINGS +COUNSELLOR +COUNSELLORS +COUNSELOR +COUNSELORS +COUNSELORSHIP +COUNSELORSHIPS +COUNSELS +COUNT +COUNTABILITIES +COUNTABILITY +COUNTABLE +COUNTABLY +COUNTDOWN +COUNTDOWNS +COUNTED +COUNTENANCE +COUNTENANCED +COUNTENANCER +COUNTENANCERS +COUNTENANCES +COUNTENANCING +COUNTER +COUNTERACT +COUNTERACTED +COUNTERACTING +COUNTERACTION +COUNTERACTIONS +COUNTERACTIVE +COUNTERACTS +COUNTERAGENT +COUNTERAGENTS +COUNTERARGUE +COUNTERARGUED +COUNTERARGUES +COUNTERARGUING +COUNTERARGUMENT +COUNTERASSAULT +COUNTERASSAULTS +COUNTERATTACK +COUNTERATTACKED +COUNTERATTACKER +COUNTERATTACKS +COUNTERBALANCE +COUNTERBALANCED +COUNTERBALANCES +COUNTERBID +COUNTERBIDS +COUNTERBLAST +COUNTERBLASTS +COUNTERBLOCKADE +COUNTERBLOW +COUNTERBLOWS +COUNTERCAMPAIGN +COUNTERCHANGE +COUNTERCHANGED +COUNTERCHANGES +COUNTERCHANGING +COUNTERCHARGE +COUNTERCHARGED +COUNTERCHARGES +COUNTERCHARGING +COUNTERCHECK +COUNTERCHECKED +COUNTERCHECKING +COUNTERCHECKS +COUNTERCLAIM +COUNTERCLAIMED +COUNTERCLAIMING +COUNTERCLAIMS +COUNTERCOUP +COUNTERCOUPS +COUNTERCRIES +COUNTERCRY +COUNTERCULTURAL +COUNTERCULTURE +COUNTERCULTURES +COUNTERCURRENT +COUNTERCURRENTS +COUNTERCYCLICAL +COUNTERDEMAND +COUNTERDEMANDS +COUNTERED +COUNTEREFFORT +COUNTEREFFORTS +COUNTEREVIDENCE +COUNTEREXAMPLE +COUNTEREXAMPLES +COUNTERFACTUAL +COUNTERFEIT +COUNTERFEITED +COUNTERFEITER +COUNTERFEITERS +COUNTERFEITING +COUNTERFEITS +COUNTERFIRE +COUNTERFIRES +COUNTERFLOW +COUNTERFLOWS +COUNTERFOIL +COUNTERFOILS +COUNTERFORCE +COUNTERFORCES +COUNTERGUERILLA +COUNTERIMAGE +COUNTERIMAGES +COUNTERING +COUNTERINSTANCE +COUNTERION +COUNTERIONS +COUNTERIRRITANT +COUNTERMAN +COUNTERMAND +COUNTERMANDED +COUNTERMANDING +COUNTERMANDS +COUNTERMARCH +COUNTERMARCHED +COUNTERMARCHES +COUNTERMARCHING +COUNTERMEASURE +COUNTERMEASURES +COUNTERMELODIES +COUNTERMELODY +COUNTERMEMO +COUNTERMEMOS +COUNTERMEN +COUNTERMINE +COUNTERMINES +COUNTERMOVE +COUNTERMOVED +COUNTERMOVEMENT +COUNTERMOVES +COUNTERMOVING +COUNTERMYTH +COUNTERMYTHS +COUNTEROFFER +COUNTEROFFERS +COUNTERORDER +COUNTERORDERED +COUNTERORDERING +COUNTERORDERS +COUNTERPANE +COUNTERPANES +COUNTERPART +COUNTERPARTS +COUNTERPETITION +COUNTERPICKET +COUNTERPICKETED +COUNTERPICKETS +COUNTERPLAN +COUNTERPLANS +COUNTERPLAY +COUNTERPLAYER +COUNTERPLAYERS +COUNTERPLAYS +COUNTERPLEA +COUNTERPLEAS +COUNTERPLOT +COUNTERPLOTS +COUNTERPLOTTED +COUNTERPLOTTING +COUNTERPLOY +COUNTERPLOYS +COUNTERPOINT +COUNTERPOINTED +COUNTERPOINTING +COUNTERPOINTS +COUNTERPOISE +COUNTERPOISED +COUNTERPOISES +COUNTERPOISING +COUNTERPOSE +COUNTERPOSED +COUNTERPOSES +COUNTERPOSING +COUNTERPOWER +COUNTERPOWERS +COUNTERPRESSURE +COUNTERPROJECT +COUNTERPROJECTS +COUNTERPROPOSAL +COUNTERPROTEST +COUNTERPROTESTS +COUNTERPUNCH +COUNTERPUNCHED +COUNTERPUNCHER +COUNTERPUNCHERS +COUNTERPUNCHES +COUNTERPUNCHING +COUNTERQUESTION +COUNTERRAID +COUNTERRAIDS +COUNTERRALLIED +COUNTERRALLIES +COUNTERRALLY +COUNTERRALLYING +COUNTERREACTION +COUNTERREFORM +COUNTERREFORMER +COUNTERREFORMS +COUNTERRESPONSE +COUNTERS +COUNTERSHADING +COUNTERSHADINGS +COUNTERSHOT +COUNTERSHOTS +COUNTERSIGN +COUNTERSIGNED +COUNTERSIGNING +COUNTERSIGNS +COUNTERSINK +COUNTERSINKING +COUNTERSINKS +COUNTERSNIPER +COUNTERSNIPERS +COUNTERSPELL +COUNTERSPELLS +COUNTERSPIES +COUNTERSPY +COUNTERSTAIN +COUNTERSTAINED +COUNTERSTAINING +COUNTERSTAINS +COUNTERSTATE +COUNTERSTATED +COUNTERSTATES +COUNTERSTATING +COUNTERSTEP +COUNTERSTEPS +COUNTERSTRATEGY +COUNTERSTREAM +COUNTERSTREAMS +COUNTERSTRICKEN +COUNTERSTRIKE +COUNTERSTRIKES +COUNTERSTRIKING +COUNTERSTROKE +COUNTERSTROKES +COUNTERSTRUCK +COUNTERSTYLE +COUNTERSTYLES +COUNTERSUE +COUNTERSUED +COUNTERSUES +COUNTERSUING +COUNTERSUIT +COUNTERSUITS +COUNTERSUNK +COUNTERTACTIC +COUNTERTACTICS +COUNTERTENDENCY +COUNTERTENOR +COUNTERTENORS +COUNTERTERROR +COUNTERTERRORS +COUNTERTHREAT +COUNTERTHREATS +COUNTERTHRUST +COUNTERTHRUSTS +COUNTERTOP +COUNTERTOPS +COUNTERTRADE +COUNTERTRADES +COUNTERTREND +COUNTERTRENDS +COUNTERVAIL +COUNTERVAILED +COUNTERVAILING +COUNTERVAILS +COUNTERVIEW +COUNTERVIEWS +COUNTERVIOLENCE +COUNTERWEIGHT +COUNTERWEIGHTED +COUNTERWEIGHTS +COUNTERWORLD +COUNTERWORLDS +COUNTESS +COUNTESSES +COUNTIAN +COUNTIANS +COUNTIES +COUNTING +COUNTINGHOUSE +COUNTINGHOUSES +COUNTLESS +COUNTLESSLY +COUNTRIES +COUNTRIFIED +COUNTRY +COUNTRYFIED +COUNTRYISH +COUNTRYMAN +COUNTRYMEN +COUNTRYSEAT +COUNTRYSEATS +COUNTRYSIDE +COUNTRYSIDES +COUNTRYWIDE +COUNTRYWOMAN +COUNTRYWOMEN +COUNTS +COUNTY +COUP +COUPE +COUPED +COUPES +COUPING +COUPLE +COUPLED +COUPLEDOM +COUPLEDOMS +COUPLEMENT +COUPLEMENTS +COUPLER +COUPLERS +COUPLES +COUPLET +COUPLETS +COUPLING +COUPLINGS +COUPON +COUPONING +COUPONINGS +COUPONS +COUPS +COURAGE +COURAGEOUS +COURAGEOUSLY +COURAGEOUSNESS +COURAGES +COURANT +COURANTE +COURANTES +COURANTO +COURANTOES +COURANTOS +COURANTS +COURGETTE +COURGETTES +COURIER +COURIERS +COURLAN +COURLANS +COURSE +COURSED +COURSER +COURSERS +COURSES +COURSEWARE +COURSEWARES +COURSING +COURSINGS +COURT +COURTED +COURTEOUS +COURTEOUSLY +COURTEOUSNESS +COURTEOUSNESSES +COURTER +COURTERS +COURTESAN +COURTESANS +COURTESIED +COURTESIES +COURTESY +COURTESYING +COURTEZAN +COURTEZANS +COURTHOUSE +COURTHOUSES +COURTIER +COURTIERS +COURTING +COURTLIER +COURTLIEST +COURTLINESS +COURTLINESSES +COURTLY +COURTROOM +COURTROOMS +COURTS +COURTSHIP +COURTSHIPS +COURTSIDE +COURTSIDES +COURTYARD +COURTYARDS +COUSCOUS +COUSCOUSES +COUSIN +COUSINAGE +COUSINAGES +COUSINHOOD +COUSINHOODS +COUSINLY +COUSINRIES +COUSINRY +COUSINS +COUSINSHIP +COUSINSHIPS +COUTEAU +COUTEAUX +COUTER +COUTERS +COUTH +COUTHER +COUTHEST +COUTHIE +COUTHIER +COUTHIEST +COUTHS +COUTURE +COUTURES +COUTURIER +COUTURIERE +COUTURIERES +COUTURIERS +COUVADE +COUVADES +COVALENCE +COVALENCES +COVALENCIES +COVALENCY +COVALENT +COVALENTLY +COVARIANCE +COVARIANCES +COVARIANT +COVARIATE +COVARIATES +COVARIATION +COVARIATIONS +COVARIED +COVARIES +COVARY +COVARYING +COVE +COVED +COVELLINE +COVELLINES +COVELLITE +COVELLITES +COVEN +COVENANT +COVENANTAL +COVENANTED +COVENANTEE +COVENANTEES +COVENANTER +COVENANTERS +COVENANTING +COVENANTOR +COVENANTORS +COVENANTS +COVENS +COVER +COVERABLE +COVERAGE +COVERAGES +COVERALL +COVERALLED +COVERALLS +COVERED +COVERER +COVERERS +COVERING +COVERINGS +COVERLESS +COVERLET +COVERLETS +COVERLID +COVERLIDS +COVERS +COVERSINE +COVERSINES +COVERSLIP +COVERSLIPS +COVERT +COVERTLY +COVERTNESS +COVERTNESSES +COVERTS +COVERTURE +COVERTURES +COVERUP +COVERUPS +COVES +COVET +COVETABLE +COVETED +COVETER +COVETERS +COVETING +COVETINGLY +COVETOUS +COVETOUSLY +COVETOUSNESS +COVETOUSNESSES +COVETS +COVEY +COVEYS +COVIN +COVING +COVINGS +COVINS +COW +COWAGE +COWAGES +COWARD +COWARDICE +COWARDICES +COWARDLINESS +COWARDLINESSES +COWARDLY +COWARDS +COWBANE +COWBANES +COWBELL +COWBELLS +COWBERRIES +COWBERRY +COWBIND +COWBINDS +COWBIRD +COWBIRDS +COWBOY +COWBOYED +COWBOYING +COWBOYS +COWCATCHER +COWCATCHERS +COWED +COWEDLY +COWER +COWERED +COWERING +COWERS +COWFISH +COWFISHES +COWFLAP +COWFLAPS +COWFLOP +COWFLOPS +COWGIRL +COWGIRLS +COWHAGE +COWHAGES +COWHAND +COWHANDS +COWHERB +COWHERBS +COWHERD +COWHERDS +COWHIDE +COWHIDED +COWHIDES +COWHIDING +COWIER +COWIEST +COWING +COWINNER +COWINNERS +COWL +COWLED +COWLICK +COWLICKS +COWLING +COWLINGS +COWLS +COWLSTAFF +COWLSTAFFS +COWLSTAVES +COWMAN +COWMEN +COWORKER +COWORKERS +COWPAT +COWPATS +COWPEA +COWPEAS +COWPIE +COWPIES +COWPLOP +COWPLOPS +COWPOKE +COWPOKES +COWPOX +COWPOXES +COWPUNCHER +COWPUNCHERS +COWRIE +COWRIES +COWRITE +COWRITER +COWRITERS +COWRITES +COWRITING +COWRITTEN +COWROTE +COWRY +COWS +COWSHED +COWSHEDS +COWSKIN +COWSKINS +COWSLIP +COWSLIPS +COWY +COX +COXA +COXAE +COXAL +COXALGIA +COXALGIAS +COXALGIC +COXALGIES +COXALGY +COXCOMB +COXCOMBIC +COXCOMBICAL +COXCOMBRIES +COXCOMBRY +COXCOMBS +COXED +COXES +COXING +COXITIDES +COXITIS +COXLESS +COXSWAIN +COXSWAINED +COXSWAINING +COXSWAINS +COY +COYDOG +COYDOGS +COYED +COYER +COYEST +COYING +COYISH +COYLY +COYNESS +COYNESSES +COYOTE +COYOTES +COYOTILLO +COYOTILLOS +COYPOU +COYPOUS +COYPU +COYPUS +COYS +COZ +COZEN +COZENAGE +COZENAGES +COZENED +COZENER +COZENERS +COZENING +COZENS +COZES +COZEY +COZEYS +COZIE +COZIED +COZIER +COZIES +COZIEST +COZILY +COZINESS +COZINESSES +COZY +COZYING +COZZES +CRAAL +CRAALED +CRAALING +CRAALS +CRAB +CRABAPPLE +CRABAPPLES +CRABBED +CRABBEDLY +CRABBEDNESS +CRABBEDNESSES +CRABBER +CRABBERS +CRABBIER +CRABBIEST +CRABBILY +CRABBING +CRABBY +CRABEATER +CRABEATERS +CRABGRASS +CRABGRASSES +CRABLIKE +CRABMEAT +CRABMEATS +CRABS +CRABSTICK +CRABSTICKS +CRABWISE +CRACK +CRACKAJACK +CRACKAJACKS +CRACKBACK +CRACKBACKS +CRACKBRAIN +CRACKBRAINED +CRACKBRAINS +CRACKDOWN +CRACKDOWNS +CRACKED +CRACKER +CRACKERJACK +CRACKERJACKS +CRACKERS +CRACKHEAD +CRACKHEADS +CRACKING +CRACKINGS +CRACKLE +CRACKLED +CRACKLES +CRACKLEWARE +CRACKLEWARES +CRACKLIER +CRACKLIEST +CRACKLING +CRACKLINGS +CRACKLY +CRACKNEL +CRACKNELS +CRACKPOT +CRACKPOTS +CRACKS +CRACKSMAN +CRACKSMEN +CRACKUP +CRACKUPS +CRACKY +CRADLE +CRADLED +CRADLER +CRADLERS +CRADLES +CRADLESONG +CRADLESONGS +CRADLING +CRAFT +CRAFTED +CRAFTER +CRAFTERS +CRAFTIER +CRAFTIEST +CRAFTILY +CRAFTINESS +CRAFTINESSES +CRAFTING +CRAFTS +CRAFTSMAN +CRAFTSMANLIKE +CRAFTSMANLY +CRAFTSMANSHIP +CRAFTSMANSHIPS +CRAFTSMEN +CRAFTSPEOPLE +CRAFTSPERSON +CRAFTSPERSONS +CRAFTSWOMAN +CRAFTSWOMEN +CRAFTWORK +CRAFTWORKS +CRAFTY +CRAG +CRAGGED +CRAGGIER +CRAGGIEST +CRAGGILY +CRAGGINESS +CRAGGINESSES +CRAGGY +CRAGS +CRAGSMAN +CRAGSMEN +CRAKE +CRAKES +CRAM +CRAMBE +CRAMBES +CRAMBO +CRAMBOES +CRAMBOS +CRAMMED +CRAMMER +CRAMMERS +CRAMMING +CRAMOISIE +CRAMOISIES +CRAMOISY +CRAMP +CRAMPED +CRAMPFISH +CRAMPFISHES +CRAMPIER +CRAMPIEST +CRAMPING +CRAMPIT +CRAMPITS +CRAMPON +CRAMPONS +CRAMPOON +CRAMPOONS +CRAMPS +CRAMPY +CRAMS +CRANBERRIES +CRANBERRY +CRANCH +CRANCHED +CRANCHES +CRANCHING +CRANE +CRANED +CRANES +CRANESBILL +CRANESBILLS +CRANIA +CRANIAL +CRANIALLY +CRANIATE +CRANIATES +CRANING +CRANIOCEREBRAL +CRANIOFACIAL +CRANIOLOGIES +CRANIOLOGY +CRANIOMETRIES +CRANIOMETRY +CRANIOSACRAL +CRANIOTOMIES +CRANIOTOMY +CRANIUM +CRANIUMS +CRANK +CRANKCASE +CRANKCASES +CRANKED +CRANKER +CRANKEST +CRANKIER +CRANKIEST +CRANKILY +CRANKINESS +CRANKINESSES +CRANKING +CRANKISH +CRANKLE +CRANKLED +CRANKLES +CRANKLING +CRANKLY +CRANKOUS +CRANKPIN +CRANKPINS +CRANKS +CRANKSHAFT +CRANKSHAFTS +CRANKY +CRANNIED +CRANNIES +CRANNOG +CRANNOGE +CRANNOGES +CRANNOGS +CRANNY +CRANREUCH +CRANREUCHS +CRAP +CRAPE +CRAPED +CRAPELIKE +CRAPES +CRAPING +CRAPOLA +CRAPOLAS +CRAPPED +CRAPPER +CRAPPERS +CRAPPIE +CRAPPIER +CRAPPIES +CRAPPIEST +CRAPPING +CRAPPY +CRAPS +CRAPSHOOT +CRAPSHOOTER +CRAPSHOOTERS +CRAPSHOOTS +CRAPULENT +CRAPULOUS +CRASES +CRASH +CRASHED +CRASHER +CRASHERS +CRASHES +CRASHING +CRASHINGLY +CRASHWORTHINESS +CRASHWORTHY +CRASIS +CRASS +CRASSER +CRASSEST +CRASSITUDE +CRASSITUDES +CRASSLY +CRASSNESS +CRASSNESSES +CRATCH +CRATCHES +CRATE +CRATED +CRATER +CRATERED +CRATERING +CRATERINGS +CRATERLET +CRATERLETS +CRATERLIKE +CRATERS +CRATES +CRATING +CRATON +CRATONIC +CRATONS +CRAUNCH +CRAUNCHED +CRAUNCHES +CRAUNCHING +CRAVAT +CRAVATS +CRAVE +CRAVED +CRAVEN +CRAVENED +CRAVENING +CRAVENLY +CRAVENNESS +CRAVENNESSES +CRAVENS +CRAVER +CRAVERS +CRAVES +CRAVING +CRAVINGS +CRAW +CRAWDAD +CRAWDADDIES +CRAWDADDY +CRAWDADS +CRAWFISH +CRAWFISHED +CRAWFISHES +CRAWFISHING +CRAWL +CRAWLED +CRAWLER +CRAWLERS +CRAWLIER +CRAWLIEST +CRAWLING +CRAWLS +CRAWLWAY +CRAWLWAYS +CRAWLY +CRAWS +CRAYFISH +CRAYFISHES +CRAYON +CRAYONED +CRAYONER +CRAYONERS +CRAYONING +CRAYONIST +CRAYONISTS +CRAYONS +CRAZE +CRAZED +CRAZES +CRAZIER +CRAZIES +CRAZIEST +CRAZILY +CRAZINESS +CRAZINESSES +CRAZING +CRAZY +CRAZYWEED +CRAZYWEEDS +CREAK +CREAKED +CREAKIER +CREAKIEST +CREAKILY +CREAKINESS +CREAKINESSES +CREAKING +CREAKS +CREAKY +CREAM +CREAMCUPS +CREAMED +CREAMER +CREAMERIES +CREAMERS +CREAMERY +CREAMIER +CREAMIEST +CREAMILY +CREAMINESS +CREAMINESSES +CREAMING +CREAMPUFF +CREAMPUFFS +CREAMS +CREAMWARE +CREAMWARES +CREAMY +CREASE +CREASED +CREASELESS +CREASER +CREASERS +CREASES +CREASIER +CREASIEST +CREASING +CREASY +CREATABLE +CREATE +CREATED +CREATES +CREATIN +CREATINE +CREATINES +CREATING +CREATININE +CREATININES +CREATINS +CREATION +CREATIONISM +CREATIONISMS +CREATIONIST +CREATIONISTS +CREATIONS +CREATIVE +CREATIVELY +CREATIVENESS +CREATIVENESSES +CREATIVES +CREATIVITIES +CREATIVITY +CREATOR +CREATORS +CREATURAL +CREATURE +CREATUREHOOD +CREATUREHOODS +CREATURELINESS +CREATURELY +CREATURES +CRECHE +CRECHES +CRED +CREDAL +CREDENCE +CREDENCES +CREDENDA +CREDENDUM +CREDENT +CREDENTIAL +CREDENTIALED +CREDENTIALING +CREDENTIALISM +CREDENTIALISMS +CREDENTIALLED +CREDENTIALLING +CREDENTIALS +CREDENZA +CREDENZAS +CREDIBILITIES +CREDIBILITY +CREDIBLE +CREDIBLY +CREDIT +CREDITABILITIES +CREDITABILITY +CREDITABLE +CREDITABLENESS +CREDITABLY +CREDITED +CREDITING +CREDITOR +CREDITORS +CREDITS +CREDITWORTHY +CREDO +CREDOS +CREDS +CREDULITIES +CREDULITY +CREDULOUS +CREDULOUSLY +CREDULOUSNESS +CREDULOUSNESSES +CREED +CREEDAL +CREEDS +CREEK +CREEKS +CREEL +CREELED +CREELING +CREELS +CREEP +CREEPAGE +CREEPAGES +CREEPED +CREEPER +CREEPERS +CREEPIE +CREEPIER +CREEPIES +CREEPIEST +CREEPILY +CREEPINESS +CREEPINESSES +CREEPING +CREEPS +CREEPY +CREESE +CREESES +CREESH +CREESHED +CREESHES +CREESHING +CREMAINS +CREMATE +CREMATED +CREMATES +CREMATING +CREMATION +CREMATIONS +CREMATOR +CREMATORIA +CREMATORIES +CREMATORIUM +CREMATORIUMS +CREMATORS +CREMATORY +CREME +CREMES +CREMINI +CREMINIS +CRENATE +CRENATED +CRENATELY +CRENATION +CRENATIONS +CRENATURE +CRENATURES +CRENEL +CRENELATE +CRENELATED +CRENELATES +CRENELATING +CRENELATION +CRENELATIONS +CRENELED +CRENELING +CRENELLATED +CRENELLATION +CRENELLATIONS +CRENELLE +CRENELLED +CRENELLES +CRENELLING +CRENELS +CRENSHAW +CRENSHAWS +CRENULATE +CRENULATED +CRENULATION +CRENULATIONS +CREODONT +CREODONTS +CREOLE +CREOLES +CREOLISE +CREOLISED +CREOLISES +CREOLISING +CREOLIZATION +CREOLIZATIONS +CREOLIZE +CREOLIZED +CREOLIZES +CREOLIZING +CREOSOL +CREOSOLS +CREOSOTE +CREOSOTED +CREOSOTES +CREOSOTIC +CREOSOTING +CREPE +CREPED +CREPES +CREPEY +CREPIER +CREPIEST +CREPING +CREPITANT +CREPITATE +CREPITATED +CREPITATES +CREPITATING +CREPITATION +CREPITATIONS +CREPON +CREPONS +CREPT +CREPUSCLE +CREPUSCLES +CREPUSCULAR +CREPUSCULE +CREPUSCULES +CREPY +CRESCENDI +CRESCENDO +CRESCENDOED +CRESCENDOES +CRESCENDOING +CRESCENDOS +CRESCENT +CRESCENTIC +CRESCENTS +CRESCIVE +CRESCIVELY +CRESOL +CRESOLS +CRESS +CRESSES +CRESSET +CRESSETS +CRESSY +CREST +CRESTAL +CRESTED +CRESTFALLEN +CRESTFALLENLY +CRESTFALLENNESS +CRESTING +CRESTINGS +CRESTLESS +CRESTS +CRESYL +CRESYLIC +CRESYLS +CRETIC +CRETICS +CRETIN +CRETINISM +CRETINISMS +CRETINOID +CRETINOUS +CRETINS +CRETONNE +CRETONNES +CREVALLE +CREVALLES +CREVASSE +CREVASSED +CREVASSES +CREVASSING +CREVICE +CREVICED +CREVICES +CREW +CREWCUT +CREWCUTS +CREWED +CREWEL +CREWELS +CREWELWORK +CREWELWORKS +CREWING +CREWLESS +CREWMAN +CREWMATE +CREWMATES +CREWMEN +CREWNECK +CREWNECKS +CREWS +CRIB +CRIBBAGE +CRIBBAGES +CRIBBED +CRIBBER +CRIBBERS +CRIBBING +CRIBBINGS +CRIBBLED +CRIBRIFORM +CRIBROUS +CRIBS +CRIBWORK +CRIBWORKS +CRICETID +CRICETIDS +CRICK +CRICKED +CRICKET +CRICKETED +CRICKETER +CRICKETERS +CRICKETING +CRICKETS +CRICKEY +CRICKING +CRICKS +CRICOID +CRICOIDS +CRIED +CRIER +CRIERS +CRIES +CRIKEY +CRIME +CRIMELESS +CRIMES +CRIMINAL +CRIMINALISTICS +CRIMINALITIES +CRIMINALITY +CRIMINALIZATION +CRIMINALIZE +CRIMINALIZED +CRIMINALIZES +CRIMINALIZING +CRIMINALLY +CRIMINALS +CRIMINATE +CRIMINATED +CRIMINATES +CRIMINATING +CRIMINATION +CRIMINATIONS +CRIMINE +CRIMINI +CRIMINIS +CRIMINOLOGICAL +CRIMINOLOGIES +CRIMINOLOGIST +CRIMINOLOGISTS +CRIMINOLOGY +CRIMINOUS +CRIMINY +CRIMMER +CRIMMERS +CRIMP +CRIMPED +CRIMPER +CRIMPERS +CRIMPIER +CRIMPIEST +CRIMPING +CRIMPLE +CRIMPLED +CRIMPLES +CRIMPLING +CRIMPS +CRIMPY +CRIMSON +CRIMSONED +CRIMSONING +CRIMSONS +CRINGE +CRINGED +CRINGER +CRINGERS +CRINGES +CRINGING +CRINGLE +CRINGLES +CRINITE +CRINITES +CRINKLE +CRINKLED +CRINKLES +CRINKLIER +CRINKLIEST +CRINKLING +CRINKLY +CRINOID +CRINOIDAL +CRINOIDS +CRINOLINE +CRINOLINED +CRINOLINES +CRINUM +CRINUMS +CRIOLLO +CRIOLLOS +CRIPE +CRIPES +CRIPPLE +CRIPPLED +CRIPPLER +CRIPPLERS +CRIPPLES +CRIPPLING +CRIPPLINGLY +CRIS +CRISES +CRISIC +CRISIS +CRISP +CRISPATE +CRISPATED +CRISPBREAD +CRISPBREADS +CRISPED +CRISPEN +CRISPENED +CRISPENING +CRISPENS +CRISPER +CRISPERS +CRISPEST +CRISPHEAD +CRISPHEADS +CRISPIER +CRISPIEST +CRISPILY +CRISPINESS +CRISPINESSES +CRISPING +CRISPLY +CRISPNESS +CRISPNESSES +CRISPS +CRISPY +CRISSA +CRISSAL +CRISSCROSS +CRISSCROSSED +CRISSCROSSES +CRISSCROSSING +CRISSUM +CRISTA +CRISTAE +CRISTATE +CRISTATED +CRIT +CRITERIA +CRITERIAL +CRITERION +CRITERIONS +CRITERIUM +CRITERIUMS +CRITIC +CRITICAL +CRITICALITIES +CRITICALITY +CRITICALLY +CRITICALNESS +CRITICALNESSES +CRITICASTER +CRITICASTERS +CRITICISE +CRITICISED +CRITICISES +CRITICISING +CRITICISM +CRITICISMS +CRITICIZABLE +CRITICIZE +CRITICIZED +CRITICIZER +CRITICIZERS +CRITICIZES +CRITICIZING +CRITICS +CRITIQUE +CRITIQUED +CRITIQUES +CRITIQUING +CRITS +CRITTER +CRITTERS +CRITTUR +CRITTURS +CROAK +CROAKED +CROAKER +CROAKERS +CROAKIER +CROAKIEST +CROAKILY +CROAKING +CROAKS +CROAKY +CROC +CROCEIN +CROCEINE +CROCEINES +CROCEINS +CROCHET +CROCHETED +CROCHETER +CROCHETERS +CROCHETING +CROCHETS +CROCI +CROCIDOLITE +CROCIDOLITES +CROCINE +CROCK +CROCKED +CROCKERIES +CROCKERY +CROCKET +CROCKETED +CROCKETS +CROCKING +CROCKPOT +CROCKPOTS +CROCKS +CROCODILE +CROCODILES +CROCODILIAN +CROCODILIANS +CROCOITE +CROCOITES +CROCS +CROCUS +CROCUSES +CROFT +CROFTER +CROFTERS +CROFTS +CROISSANT +CROISSANTS +CROJIK +CROJIKS +CROMLECH +CROMLECHS +CRONE +CRONES +CRONIES +CRONISH +CRONY +CRONYISM +CRONYISMS +CROOK +CROOKBACK +CROOKBACKED +CROOKBACKS +CROOKED +CROOKEDER +CROOKEDEST +CROOKEDLY +CROOKEDNESS +CROOKEDNESSES +CROOKER +CROOKERIES +CROOKERY +CROOKEST +CROOKING +CROOKNECK +CROOKNECKS +CROOKS +CROON +CROONED +CROONER +CROONERS +CROONING +CROONS +CROP +CROPLAND +CROPLANDS +CROPLESS +CROPPED +CROPPER +CROPPERS +CROPPIE +CROPPIES +CROPPING +CROPS +CROQUET +CROQUETED +CROQUETING +CROQUETS +CROQUETTE +CROQUETTES +CROQUIGNOLE +CROQUIGNOLES +CROQUIS +CRORE +CRORES +CROSIER +CROSIERS +CROSS +CROSSABILITIES +CROSSABILITY +CROSSABLE +CROSSARM +CROSSARMS +CROSSBANDED +CROSSBANDING +CROSSBANDINGS +CROSSBAR +CROSSBARRED +CROSSBARRING +CROSSBARS +CROSSBEAM +CROSSBEAMS +CROSSBEARER +CROSSBEARERS +CROSSBILL +CROSSBILLS +CROSSBONES +CROSSBOW +CROSSBOWMAN +CROSSBOWMEN +CROSSBOWS +CROSSBRED +CROSSBREDS +CROSSBREED +CROSSBREEDING +CROSSBREEDS +CROSSBUCK +CROSSBUCKS +CROSSCOURT +CROSSCURRENT +CROSSCURRENTS +CROSSCUT +CROSSCUTS +CROSSCUTTING +CROSSCUTTINGS +CROSSE +CROSSED +CROSSER +CROSSERS +CROSSES +CROSSEST +CROSSFIRE +CROSSFIRES +CROSSHAIR +CROSSHAIRS +CROSSHATCH +CROSSHATCHED +CROSSHATCHES +CROSSHATCHING +CROSSHEAD +CROSSHEADS +CROSSING +CROSSINGS +CROSSJACK +CROSSJACKS +CROSSLET +CROSSLETS +CROSSLINGUISTIC +CROSSLY +CROSSNESS +CROSSNESSES +CROSSOPTERYGIAN +CROSSOVER +CROSSOVERS +CROSSPATCH +CROSSPATCHES +CROSSPIECE +CROSSPIECES +CROSSROAD +CROSSROADS +CROSSRUFF +CROSSRUFFED +CROSSRUFFING +CROSSRUFFS +CROSSTALK +CROSSTALKS +CROSSTIE +CROSSTIED +CROSSTIES +CROSSTOWN +CROSSTREE +CROSSTREES +CROSSWALK +CROSSWALKS +CROSSWAY +CROSSWAYS +CROSSWIND +CROSSWINDS +CROSSWISE +CROSSWORD +CROSSWORDS +CROSTINI +CROSTINO +CROTCH +CROTCHED +CROTCHES +CROTCHET +CROTCHETINESS +CROTCHETINESSES +CROTCHETS +CROTCHETY +CROTON +CROTONBUG +CROTONBUGS +CROTONS +CROUCH +CROUCHED +CROUCHES +CROUCHING +CROUP +CROUPE +CROUPES +CROUPIER +CROUPIERS +CROUPIEST +CROUPILY +CROUPOUS +CROUPS +CROUPY +CROUSE +CROUSELY +CROUSTADE +CROUSTADES +CROUTE +CROUTES +CROUTON +CROUTONS +CROW +CROWBAR +CROWBARRED +CROWBARRING +CROWBARS +CROWBERRIES +CROWBERRY +CROWD +CROWDED +CROWDEDLY +CROWDEDNESS +CROWDEDNESSES +CROWDER +CROWDERS +CROWDIE +CROWDIES +CROWDING +CROWDS +CROWDY +CROWED +CROWER +CROWERS +CROWFEET +CROWFOOT +CROWFOOTS +CROWING +CROWKEEPER +CROWKEEPERS +CROWN +CROWNED +CROWNER +CROWNERS +CROWNET +CROWNETS +CROWNING +CROWNLESS +CROWNS +CROWS +CROWSFEET +CROWSFOOT +CROWSTEP +CROWSTEPPED +CROWSTEPS +CROZE +CROZER +CROZERS +CROZES +CROZIER +CROZIERS +CRU +CRUCES +CRUCIAL +CRUCIALLY +CRUCIAN +CRUCIANS +CRUCIATE +CRUCIBLE +CRUCIBLES +CRUCIFER +CRUCIFEROUS +CRUCIFERS +CRUCIFIED +CRUCIFIER +CRUCIFIERS +CRUCIFIES +CRUCIFIX +CRUCIFIXES +CRUCIFIXION +CRUCIFIXIONS +CRUCIFORM +CRUCIFORMS +CRUCIFY +CRUCIFYING +CRUCK +CRUCKS +CRUD +CRUDDED +CRUDDIER +CRUDDIEST +CRUDDING +CRUDDY +CRUDE +CRUDELY +CRUDENESS +CRUDENESSES +CRUDER +CRUDES +CRUDEST +CRUDITES +CRUDITIES +CRUDITY +CRUDS +CRUEL +CRUELER +CRUELEST +CRUELLER +CRUELLEST +CRUELLY +CRUELNESS +CRUELNESSES +CRUELTIES +CRUELTY +CRUET +CRUETS +CRUISE +CRUISED +CRUISER +CRUISERS +CRUISES +CRUISING +CRUISINGS +CRULLER +CRULLERS +CRUMB +CRUMBED +CRUMBER +CRUMBERS +CRUMBIER +CRUMBIEST +CRUMBING +CRUMBLE +CRUMBLED +CRUMBLES +CRUMBLIER +CRUMBLIEST +CRUMBLINESS +CRUMBLINESSES +CRUMBLING +CRUMBLINGS +CRUMBLY +CRUMBS +CRUMBUM +CRUMBUMS +CRUMBY +CRUMHORN +CRUMHORNS +CRUMMIE +CRUMMIER +CRUMMIES +CRUMMIEST +CRUMMINESS +CRUMMINESSES +CRUMMY +CRUMP +CRUMPED +CRUMPET +CRUMPETS +CRUMPING +CRUMPLE +CRUMPLED +CRUMPLES +CRUMPLIER +CRUMPLIEST +CRUMPLING +CRUMPLY +CRUMPS +CRUNCH +CRUNCHABLE +CRUNCHED +CRUNCHER +CRUNCHERS +CRUNCHES +CRUNCHIER +CRUNCHIEST +CRUNCHILY +CRUNCHINESS +CRUNCHINESSES +CRUNCHING +CRUNCHY +CRUNODAL +CRUNODE +CRUNODES +CRUOR +CRUORS +CRUPPER +CRUPPERS +CRURA +CRURAL +CRUS +CRUSADE +CRUSADED +CRUSADER +CRUSADERS +CRUSADES +CRUSADING +CRUSADO +CRUSADOES +CRUSADOS +CRUSE +CRUSES +CRUSET +CRUSETS +CRUSH +CRUSHABLE +CRUSHED +CRUSHER +CRUSHERS +CRUSHES +CRUSHING +CRUSHINGLY +CRUSHPROOF +CRUSILY +CRUST +CRUSTACEA +CRUSTACEAN +CRUSTACEANS +CRUSTACEOUS +CRUSTAL +CRUSTED +CRUSTIER +CRUSTIEST +CRUSTILY +CRUSTINESS +CRUSTINESSES +CRUSTING +CRUSTLESS +CRUSTOSE +CRUSTS +CRUSTY +CRUTCH +CRUTCHED +CRUTCHES +CRUTCHING +CRUX +CRUXES +CRUZADO +CRUZADOES +CRUZADOS +CRUZEIRO +CRUZEIROS +CRWTH +CRWTHS +CRY +CRYBABIES +CRYBABY +CRYING +CRYINGLY +CRYOBANK +CRYOBANKS +CRYOBIOLOGICAL +CRYOBIOLOGIES +CRYOBIOLOGIST +CRYOBIOLOGISTS +CRYOBIOLOGY +CRYOGEN +CRYOGENIC +CRYOGENICALLY +CRYOGENICS +CRYOGENIES +CRYOGENS +CRYOGENY +CRYOLITE +CRYOLITES +CRYOMETER +CRYOMETERS +CRYONIC +CRYONICS +CRYOPHILIC +CRYOPHYTE +CRYOPHYTES +CRYOPRESERVE +CRYOPRESERVED +CRYOPRESERVES +CRYOPRESERVING +CRYOPROBE +CRYOPROBES +CRYOPROTECTANT +CRYOPROTECTANTS +CRYOPROTECTIVE +CRYOSCOPE +CRYOSCOPES +CRYOSCOPIC +CRYOSCOPIES +CRYOSCOPY +CRYOSTAT +CRYOSTATIC +CRYOSTATS +CRYOSURGEON +CRYOSURGEONS +CRYOSURGERIES +CRYOSURGERY +CRYOSURGICAL +CRYOTHERAPIES +CRYOTHERAPY +CRYOTRON +CRYOTRONS +CRYPT +CRYPTAL +CRYPTANALYSES +CRYPTANALYSIS +CRYPTANALYST +CRYPTANALYSTS +CRYPTANALYTIC +CRYPTANALYTICAL +CRYPTARITHM +CRYPTARITHMS +CRYPTIC +CRYPTICAL +CRYPTICALLY +CRYPTO +CRYPTOCOCCAL +CRYPTOCOCCI +CRYPTOCOCCOSES +CRYPTOCOCCOSIS +CRYPTOCOCCUS +CRYPTOGAM +CRYPTOGAMIC +CRYPTOGAMOUS +CRYPTOGAMS +CRYPTOGENIC +CRYPTOGRAM +CRYPTOGRAMS +CRYPTOGRAPH +CRYPTOGRAPHER +CRYPTOGRAPHERS +CRYPTOGRAPHIC +CRYPTOGRAPHIES +CRYPTOGRAPHS +CRYPTOGRAPHY +CRYPTOLOGIC +CRYPTOLOGICAL +CRYPTOLOGIES +CRYPTOLOGIST +CRYPTOLOGISTS +CRYPTOLOGY +CRYPTOMERIA +CRYPTOMERIAS +CRYPTONYM +CRYPTONYMS +CRYPTORCHID +CRYPTORCHIDISM +CRYPTORCHIDISMS +CRYPTORCHIDS +CRYPTORCHISM +CRYPTORCHISMS +CRYPTOS +CRYPTOSPORIDIA +CRYPTOSPORIDIUM +CRYPTOZOOLOGIES +CRYPTOZOOLOGIST +CRYPTOZOOLOGY +CRYPTS +CRYSTAL +CRYSTALIZE +CRYSTALIZED +CRYSTALIZES +CRYSTALIZING +CRYSTALLINE +CRYSTALLINITIES +CRYSTALLINITY +CRYSTALLISE +CRYSTALLISED +CRYSTALLISES +CRYSTALLISING +CRYSTALLITE +CRYSTALLITES +CRYSTALLIZABLE +CRYSTALLIZATION +CRYSTALLIZE +CRYSTALLIZED +CRYSTALLIZER +CRYSTALLIZERS +CRYSTALLIZES +CRYSTALLIZING +CRYSTALLOGRAPHY +CRYSTALLOID +CRYSTALLOIDAL +CRYSTALLOIDS +CRYSTALS +CTENIDIA +CTENIDIUM +CTENOID +CTENOPHORAN +CTENOPHORANS +CTENOPHORE +CTENOPHORES +CUADRILLA +CUADRILLAS +CUATRO +CUATROS +CUB +CUBAGE +CUBAGES +CUBANELLE +CUBANELLES +CUBATURE +CUBATURES +CUBBIES +CUBBISH +CUBBY +CUBBYHOLE +CUBBYHOLES +CUBE +CUBEB +CUBEBS +CUBED +CUBER +CUBERS +CUBES +CUBIC +CUBICAL +CUBICALLY +CUBICITIES +CUBICITY +CUBICLE +CUBICLES +CUBICLY +CUBICS +CUBICULA +CUBICULUM +CUBIFORM +CUBING +CUBISM +CUBISMS +CUBIST +CUBISTIC +CUBISTS +CUBIT +CUBITAL +CUBITI +CUBITS +CUBITUS +CUBOID +CUBOIDAL +CUBOIDS +CUBS +CUCKOLD +CUCKOLDED +CUCKOLDING +CUCKOLDRIES +CUCKOLDRY +CUCKOLDS +CUCKOO +CUCKOOED +CUCKOOFLOWER +CUCKOOFLOWERS +CUCKOOING +CUCKOOPINT +CUCKOOPINTS +CUCKOOS +CUCULLATE +CUCUMBER +CUCUMBERS +CUCURBIT +CUCURBITS +CUD +CUDBEAR +CUDBEARS +CUDDIE +CUDDIES +CUDDLE +CUDDLED +CUDDLER +CUDDLERS +CUDDLES +CUDDLESOME +CUDDLIER +CUDDLIEST +CUDDLING +CUDDLY +CUDDY +CUDGEL +CUDGELED +CUDGELER +CUDGELERS +CUDGELING +CUDGELLED +CUDGELLING +CUDGELS +CUDS +CUDWEED +CUDWEEDS +CUE +CUED +CUEING +CUES +CUESTA +CUESTAS +CUFF +CUFFED +CUFFING +CUFFLESS +CUFFLINK +CUFFLINKS +CUFFS +CUIF +CUIFS +CUING +CUIRASS +CUIRASSED +CUIRASSES +CUIRASSIER +CUIRASSIERS +CUIRASSING +CUISH +CUISHES +CUISINART +CUISINARTS +CUISINE +CUISINES +CUISSE +CUISSES +CUITTLE +CUITTLED +CUITTLES +CUITTLING +CUKE +CUKES +CULCH +CULCHES +CULET +CULETS +CULEX +CULEXES +CULICES +CULICID +CULICIDS +CULICINE +CULICINES +CULINARIAN +CULINARIANS +CULINARILY +CULINARY +CULL +CULLAY +CULLAYS +CULLED +CULLENDER +CULLENDERS +CULLER +CULLERS +CULLET +CULLETS +CULLIED +CULLIES +CULLING +CULLION +CULLIONS +CULLIS +CULLISES +CULLS +CULLY +CULLYING +CULM +CULMED +CULMINANT +CULMINATE +CULMINATED +CULMINATES +CULMINATING +CULMINATION +CULMINATIONS +CULMING +CULMS +CULOTTE +CULOTTES +CULPA +CULPABILITIES +CULPABILITY +CULPABLE +CULPABLENESS +CULPABLENESSES +CULPABLY +CULPAE +CULPRIT +CULPRITS +CULT +CULTCH +CULTCHES +CULTI +CULTIC +CULTIGEN +CULTIGENS +CULTISH +CULTISHLY +CULTISHNESS +CULTISHNESSES +CULTISM +CULTISMS +CULTIST +CULTISTS +CULTIVABILITIES +CULTIVABILITY +CULTIVABLE +CULTIVAR +CULTIVARS +CULTIVATABLE +CULTIVATE +CULTIVATED +CULTIVATES +CULTIVATING +CULTIVATION +CULTIVATIONS +CULTIVATOR +CULTIVATORS +CULTLIKE +CULTRATE +CULTRATED +CULTS +CULTURAL +CULTURALLY +CULTURATI +CULTURE +CULTURED +CULTURES +CULTURING +CULTURIST +CULTURISTS +CULTUS +CULTUSES +CULVER +CULVERIN +CULVERINS +CULVERS +CULVERT +CULVERTS +CUM +CUMARIN +CUMARINS +CUMBER +CUMBERBUND +CUMBERBUNDS +CUMBERED +CUMBERER +CUMBERERS +CUMBERING +CUMBERS +CUMBERSOME +CUMBERSOMELY +CUMBERSOMENESS +CUMBIA +CUMBIAS +CUMBRANCE +CUMBRANCES +CUMBROUS +CUMBROUSLY +CUMBROUSNESS +CUMBROUSNESSES +CUMIN +CUMINS +CUMMER +CUMMERBUND +CUMMERBUNDS +CUMMERS +CUMMIN +CUMMINS +CUMQUAT +CUMQUATS +CUMSHAW +CUMSHAWS +CUMULATE +CUMULATED +CUMULATES +CUMULATING +CUMULATION +CUMULATIONS +CUMULATIVE +CUMULATIVELY +CUMULATIVENESS +CUMULI +CUMULIFORM +CUMULONIMBI +CUMULONIMBUS +CUMULONIMBUSES +CUMULOUS +CUMULUS +CUNCTATION +CUNCTATIONS +CUNCTATIVE +CUNCTATOR +CUNCTATORS +CUNDUM +CUNDUMS +CUNEAL +CUNEATE +CUNEATED +CUNEATELY +CUNEATIC +CUNEIFORM +CUNEIFORMS +CUNIFORM +CUNIFORMS +CUNNER +CUNNERS +CUNNILINCTUS +CUNNILINCTUSES +CUNNILINGUS +CUNNILINGUSES +CUNNING +CUNNINGER +CUNNINGEST +CUNNINGLY +CUNNINGNESS +CUNNINGNESSES +CUNNINGS +CUNT +CUNTS +CUP +CUPBEARER +CUPBEARERS +CUPBOARD +CUPBOARDS +CUPCAKE +CUPCAKES +CUPEL +CUPELED +CUPELER +CUPELERS +CUPELING +CUPELLATION +CUPELLATIONS +CUPELLED +CUPELLER +CUPELLERS +CUPELLING +CUPELS +CUPFERRON +CUPFERRONS +CUPFUL +CUPFULS +CUPID +CUPIDITIES +CUPIDITY +CUPIDS +CUPLIKE +CUPOLA +CUPOLAED +CUPOLAING +CUPOLAS +CUPPA +CUPPAS +CUPPED +CUPPER +CUPPERS +CUPPIER +CUPPIEST +CUPPING +CUPPINGS +CUPPY +CUPREOUS +CUPRIC +CUPRIFEROUS +CUPRITE +CUPRITES +CUPRONICKEL +CUPRONICKELS +CUPROUS +CUPRUM +CUPRUMS +CUPS +CUPSFUL +CUPULA +CUPULAE +CUPULAR +CUPULATE +CUPULE +CUPULES +CUR +CURABILITIES +CURABILITY +CURABLE +CURABLENESS +CURABLENESSES +CURABLY +CURACAO +CURACAOS +CURACIES +CURACOA +CURACOAS +CURACY +CURAGH +CURAGHS +CURANDERA +CURANDERAS +CURANDERO +CURANDEROS +CURARA +CURARAS +CURARE +CURARES +CURARI +CURARINE +CURARINES +CURARIS +CURARIZATION +CURARIZATIONS +CURARIZE +CURARIZED +CURARIZES +CURARIZING +CURASSOW +CURASSOWS +CURATE +CURATED +CURATES +CURATING +CURATIVE +CURATIVELY +CURATIVES +CURATOR +CURATORIAL +CURATORS +CURATORSHIP +CURATORSHIPS +CURB +CURBABLE +CURBED +CURBER +CURBERS +CURBING +CURBINGS +CURBS +CURBSIDE +CURBSIDES +CURBSTONE +CURBSTONES +CURCH +CURCHES +CURCULIO +CURCULIOS +CURCUMA +CURCUMAS +CURD +CURDED +CURDIER +CURDIEST +CURDING +CURDLE +CURDLED +CURDLER +CURDLERS +CURDLES +CURDLING +CURDS +CURDY +CURE +CURED +CURELESS +CURER +CURERS +CURES +CURET +CURETS +CURETTAGE +CURETTAGES +CURETTE +CURETTED +CURETTEMENT +CURETTEMENTS +CURETTES +CURETTING +CURF +CURFEW +CURFEWS +CURFS +CURIA +CURIAE +CURIAL +CURIE +CURIES +CURING +CURIO +CURIOS +CURIOSA +CURIOSITIES +CURIOSITY +CURIOUS +CURIOUSER +CURIOUSEST +CURIOUSLY +CURIOUSNESS +CURIOUSNESSES +CURITE +CURITES +CURIUM +CURIUMS +CURL +CURLED +CURLER +CURLERS +CURLEW +CURLEWS +CURLICUE +CURLICUED +CURLICUES +CURLICUING +CURLIER +CURLIEST +CURLILY +CURLINESS +CURLINESSES +CURLING +CURLINGS +CURLPAPER +CURLPAPERS +CURLS +CURLY +CURLYCUE +CURLYCUES +CURMUDGEON +CURMUDGEONLY +CURMUDGEONS +CURN +CURNS +CURR +CURRACH +CURRACHS +CURRAGH +CURRAGHS +CURRAJONG +CURRAJONGS +CURRAN +CURRANS +CURRANT +CURRANTS +CURRED +CURREJONG +CURREJONGS +CURRENCIES +CURRENCY +CURRENT +CURRENTLY +CURRENTNESS +CURRENTNESSES +CURRENTS +CURRICLE +CURRICLES +CURRICULA +CURRICULAR +CURRICULUM +CURRICULUMS +CURRIE +CURRIED +CURRIER +CURRIERIES +CURRIERS +CURRIERY +CURRIES +CURRIJONG +CURRIJONGS +CURRING +CURRISH +CURRISHLY +CURRS +CURRY +CURRYCOMB +CURRYCOMBED +CURRYCOMBING +CURRYCOMBS +CURRYING +CURS +CURSE +CURSED +CURSEDER +CURSEDEST +CURSEDLY +CURSEDNESS +CURSEDNESSES +CURSER +CURSERS +CURSES +CURSING +CURSIVE +CURSIVELY +CURSIVENESS +CURSIVENESSES +CURSIVES +CURSOR +CURSORIAL +CURSORILY +CURSORINESS +CURSORINESSES +CURSORS +CURSORY +CURST +CURT +CURTAIL +CURTAILED +CURTAILER +CURTAILERS +CURTAILING +CURTAILMENT +CURTAILMENTS +CURTAILS +CURTAIN +CURTAINED +CURTAINING +CURTAINLESS +CURTAINS +CURTAL +CURTALAX +CURTALAXES +CURTALS +CURTATE +CURTER +CURTESIES +CURTEST +CURTESY +CURTILAGE +CURTILAGES +CURTLY +CURTNESS +CURTNESSES +CURTSEY +CURTSEYED +CURTSEYING +CURTSEYS +CURTSIED +CURTSIES +CURTSY +CURTSYING +CURULE +CURVACEOUS +CURVACIOUS +CURVATURE +CURVATURES +CURVE +CURVEBALL +CURVEBALLED +CURVEBALLING +CURVEBALLS +CURVED +CURVEDLY +CURVES +CURVET +CURVETED +CURVETING +CURVETS +CURVETTED +CURVETTING +CURVEY +CURVIER +CURVIEST +CURVILINEAR +CURVILINEARITY +CURVING +CURVY +CUSCUS +CUSCUSES +CUSEC +CUSECS +CUSHAT +CUSHATS +CUSHAW +CUSHAWS +CUSHIER +CUSHIEST +CUSHILY +CUSHINESS +CUSHINESSES +CUSHION +CUSHIONED +CUSHIONING +CUSHIONLESS +CUSHIONS +CUSHIONY +CUSHY +CUSK +CUSKS +CUSP +CUSPAL +CUSPATE +CUSPATED +CUSPED +CUSPID +CUSPIDAL +CUSPIDATE +CUSPIDATION +CUSPIDATIONS +CUSPIDES +CUSPIDOR +CUSPIDORS +CUSPIDS +CUSPIS +CUSPS +CUSS +CUSSED +CUSSEDLY +CUSSEDNESS +CUSSEDNESSES +CUSSER +CUSSERS +CUSSES +CUSSING +CUSSO +CUSSOS +CUSSWORD +CUSSWORDS +CUSTARD +CUSTARDS +CUSTARDY +CUSTODES +CUSTODIAL +CUSTODIAN +CUSTODIANS +CUSTODIANSHIP +CUSTODIANSHIPS +CUSTODIES +CUSTODY +CUSTOM +CUSTOMARIES +CUSTOMARILY +CUSTOMARINESS +CUSTOMARINESSES +CUSTOMARY +CUSTOMER +CUSTOMERS +CUSTOMHOUSE +CUSTOMHOUSES +CUSTOMISE +CUSTOMISED +CUSTOMISES +CUSTOMISING +CUSTOMIZE +CUSTOMIZED +CUSTOMIZER +CUSTOMIZERS +CUSTOMIZES +CUSTOMIZING +CUSTOMS +CUSTOMSHOUSE +CUSTOMSHOUSES +CUSTOS +CUSTUMAL +CUSTUMALS +CUT +CUTABILITIES +CUTABILITY +CUTANEOUS +CUTANEOUSLY +CUTAWAY +CUTAWAYS +CUTBACK +CUTBACKS +CUTBANK +CUTBANKS +CUTCH +CUTCHERIES +CUTCHERY +CUTCHES +CUTDOWN +CUTDOWNS +CUTE +CUTELY +CUTENESS +CUTENESSES +CUTER +CUTES +CUTESIE +CUTESIER +CUTESIEST +CUTEST +CUTESY +CUTEY +CUTEYS +CUTGRASS +CUTGRASSES +CUTICLE +CUTICLES +CUTICULA +CUTICULAE +CUTICULAR +CUTIE +CUTIES +CUTIN +CUTINISE +CUTINISED +CUTINISES +CUTINISING +CUTINIZE +CUTINIZED +CUTINIZES +CUTINIZING +CUTINS +CUTIS +CUTISES +CUTLAS +CUTLASES +CUTLASS +CUTLASSES +CUTLER +CUTLERIES +CUTLERS +CUTLERY +CUTLET +CUTLETS +CUTLINE +CUTLINES +CUTOFF +CUTOFFS +CUTOUT +CUTOUTS +CUTOVER +CUTOVERS +CUTPURSE +CUTPURSES +CUTS +CUTTABLE +CUTTAGE +CUTTAGES +CUTTER +CUTTERS +CUTTHROAT +CUTTHROATS +CUTTIES +CUTTING +CUTTINGLY +CUTTINGS +CUTTLE +CUTTLEBONE +CUTTLEBONES +CUTTLED +CUTTLEFISH +CUTTLEFISHES +CUTTLES +CUTTLING +CUTTY +CUTUP +CUTUPS +CUTWATER +CUTWATERS +CUTWORK +CUTWORKS +CUTWORM +CUTWORMS +CUVEE +CUVEES +CUVETTE +CUVETTES +CWM +CWMS +CYAN +CYANAMID +CYANAMIDE +CYANAMIDES +CYANAMIDS +CYANATE +CYANATES +CYANIC +CYANID +CYANIDE +CYANIDED +CYANIDES +CYANIDING +CYANIDS +CYANIN +CYANINE +CYANINES +CYANINS +CYANITE +CYANITES +CYANITIC +CYANO +CYANOACRYLATE +CYANOACRYLATES +CYANOBACTERIA +CYANOBACTERIUM +CYANOCOBALAMIN +CYANOCOBALAMINE +CYANOCOBALAMINS +CYANOETHYLATE +CYANOETHYLATED +CYANOETHYLATES +CYANOETHYLATING +CYANOETHYLATION +CYANOGEN +CYANOGENESES +CYANOGENESIS +CYANOGENETIC +CYANOGENIC +CYANOGENS +CYANOHYDRIN +CYANOHYDRINS +CYANOSED +CYANOSES +CYANOSIS +CYANOTIC +CYANOTYPE +CYANOTYPES +CYANS +CYANURATE +CYANURATES +CYBER +CYBERCAFE +CYBERCAFES +CYBERCAST +CYBERCASTS +CYBERNATE +CYBERNATED +CYBERNATES +CYBERNATING +CYBERNATION +CYBERNATIONS +CYBERNAUT +CYBERNAUTS +CYBERNETIC +CYBERNETICAL +CYBERNETICALLY +CYBERNETICIAN +CYBERNETICIANS +CYBERNETICIST +CYBERNETICISTS +CYBERNETICS +CYBERPORN +CYBERPORNS +CYBERPUNK +CYBERPUNKS +CYBERSEX +CYBERSEXES +CYBERSPACE +CYBERSPACES +CYBORG +CYBORGS +CYBRARIAN +CYBRARIANS +CYCAD +CYCADEOID +CYCADEOIDS +CYCADOPHYTE +CYCADOPHYTES +CYCADS +CYCAS +CYCASES +CYCASIN +CYCASINS +CYCLAMATE +CYCLAMATES +CYCLAMEN +CYCLAMENS +CYCLASE +CYCLASES +CYCLAZOCINE +CYCLAZOCINES +CYCLE +CYCLECAR +CYCLECARS +CYCLED +CYCLER +CYCLERIES +CYCLERS +CYCLERY +CYCLES +CYCLEWAY +CYCLEWAYS +CYCLIC +CYCLICAL +CYCLICALITIES +CYCLICALITY +CYCLICALLY +CYCLICALS +CYCLICITIES +CYCLICITY +CYCLICLY +CYCLIN +CYCLING +CYCLINGS +CYCLINS +CYCLIST +CYCLISTS +CYCLITOL +CYCLITOLS +CYCLIZATION +CYCLIZATIONS +CYCLIZE +CYCLIZED +CYCLIZES +CYCLIZINE +CYCLIZINES +CYCLIZING +CYCLO +CYCLOADDITION +CYCLOADDITIONS +CYCLOALIPHATIC +CYCLODEXTRIN +CYCLODEXTRINS +CYCLODIENE +CYCLODIENES +CYCLOGENESES +CYCLOGENESIS +CYCLOHEXANE +CYCLOHEXANES +CYCLOHEXANONE +CYCLOHEXANONES +CYCLOHEXIMIDE +CYCLOHEXIMIDES +CYCLOHEXYLAMINE +CYCLOID +CYCLOIDAL +CYCLOIDS +CYCLOMETER +CYCLOMETERS +CYCLONAL +CYCLONE +CYCLONES +CYCLONIC +CYCLONICALLY +CYCLONITE +CYCLONITES +CYCLOOLEFIN +CYCLOOLEFINIC +CYCLOOLEFINS +CYCLOPAEDIA +CYCLOPAEDIAS +CYCLOPARAFFIN +CYCLOPARAFFINS +CYCLOPEAN +CYCLOPEDIA +CYCLOPEDIAS +CYCLOPEDIC +CYCLOPES +CYCLOPROPANE +CYCLOPROPANES +CYCLOPS +CYCLORAMA +CYCLORAMAS +CYCLORAMIC +CYCLOS +CYCLOSERINE +CYCLOSERINES +CYCLOSES +CYCLOSIS +CYCLOSPORINE +CYCLOSPORINES +CYCLOSTOME +CYCLOSTOMES +CYCLOSTYLE +CYCLOSTYLED +CYCLOSTYLES +CYCLOSTYLING +CYCLOTHYMIA +CYCLOTHYMIAS +CYCLOTHYMIC +CYCLOTOMIC +CYCLOTRON +CYCLOTRONS +CYDER +CYDERS +CYESES +CYESIS +CYGNET +CYGNETS +CYLICES +CYLINDER +CYLINDERED +CYLINDERING +CYLINDERS +CYLINDRIC +CYLINDRICAL +CYLINDRICALLY +CYLIX +CYMA +CYMAE +CYMAR +CYMARS +CYMAS +CYMATIA +CYMATIUM +CYMBAL +CYMBALEER +CYMBALEERS +CYMBALER +CYMBALERS +CYMBALIST +CYMBALISTS +CYMBALOM +CYMBALOMS +CYMBALS +CYMBIDIA +CYMBIDIUM +CYMBIDIUMS +CYMBLING +CYMBLINGS +CYME +CYMENE +CYMENES +CYMES +CYMLIN +CYMLING +CYMLINGS +CYMLINS +CYMOGENE +CYMOGENES +CYMOGRAPH +CYMOGRAPHS +CYMOID +CYMOL +CYMOLS +CYMOPHANE +CYMOPHANES +CYMOSE +CYMOSELY +CYMOUS +CYNIC +CYNICAL +CYNICALLY +CYNICISM +CYNICISMS +CYNICS +CYNOSURAL +CYNOSURE +CYNOSURES +CYPHER +CYPHERED +CYPHERING +CYPHERS +CYPRES +CYPRESES +CYPRESS +CYPRESSES +CYPRIAN +CYPRIANS +CYPRINID +CYPRINIDS +CYPRINOID +CYPRINOIDS +CYPRIPEDIUM +CYPRIPEDIUMS +CYPROHEPTADINE +CYPROHEPTADINES +CYPROTERONE +CYPROTERONES +CYPRUS +CYPRUSES +CYPSELA +CYPSELAE +CYST +CYSTEAMINE +CYSTEAMINES +CYSTEIN +CYSTEINE +CYSTEINES +CYSTEINIC +CYSTEINS +CYSTIC +CYSTICERCI +CYSTICERCOID +CYSTICERCOIDS +CYSTICERCOSES +CYSTICERCOSIS +CYSTICERCUS +CYSTINE +CYSTINES +CYSTINURIA +CYSTINURIAS +CYSTITIDES +CYSTITIS +CYSTOCARP +CYSTOCARPS +CYSTOCELE +CYSTOCELES +CYSTOID +CYSTOIDS +CYSTOLITH +CYSTOLITHS +CYSTOSCOPE +CYSTOSCOPES +CYSTOSCOPIC +CYSTOSCOPIES +CYSTOSCOPY +CYSTOTOMIES +CYSTOTOMY +CYSTS +CYTASTER +CYTASTERS +CYTIDINE +CYTIDINES +CYTOCHALASIN +CYTOCHALASINS +CYTOCHEMICAL +CYTOCHEMISTRIES +CYTOCHEMISTRY +CYTOCHROME +CYTOCHROMES +CYTOGENETIC +CYTOGENETICAL +CYTOGENETICALLY +CYTOGENETICIST +CYTOGENETICISTS +CYTOGENETICS +CYTOGENIES +CYTOGENY +CYTOKINE +CYTOKINES +CYTOKINESES +CYTOKINESIS +CYTOKINETIC +CYTOKININ +CYTOKININS +CYTOLOGIC +CYTOLOGICAL +CYTOLOGICALLY +CYTOLOGIES +CYTOLOGIST +CYTOLOGISTS +CYTOLOGY +CYTOLYSES +CYTOLYSIN +CYTOLYSINS +CYTOLYSIS +CYTOLYTIC +CYTOMEGALIC +CYTOMEGALOVIRUS +CYTOMEMBRANE +CYTOMEMBRANES +CYTON +CYTONS +CYTOPATHIC +CYTOPATHOGENIC +CYTOPHILIC +CYTOPHOTOMETRIC +CYTOPHOTOMETRY +CYTOPLASM +CYTOPLASMIC +CYTOPLASMICALLY +CYTOPLASMS +CYTOPLAST +CYTOPLASTS +CYTOSINE +CYTOSINES +CYTOSKELETAL +CYTOSKELETON +CYTOSKELETONS +CYTOSOL +CYTOSOLIC +CYTOSOLS +CYTOSTATIC +CYTOSTATICALLY +CYTOSTATICS +CYTOTAXONOMIC +CYTOTAXONOMIES +CYTOTAXONOMY +CYTOTECHNOLOGY +CYTOTOXIC +CYTOTOXICITIES +CYTOTOXICITY +CYTOTOXIN +CYTOTOXINS +CZAR +CZARDAS +CZARDASES +CZARDOM +CZARDOMS +CZAREVITCH +CZAREVITCHES +CZAREVNA +CZAREVNAS +CZARINA +CZARINAS +CZARISM +CZARISMS +CZARIST +CZARISTS +CZARITZA +CZARITZAS +CZARS +DAB +DABBED +DABBER +DABBERS +DABBING +DABBLE +DABBLED +DABBLER +DABBLERS +DABBLES +DABBLING +DABBLINGS +DABCHICK +DABCHICKS +DABS +DABSTER +DABSTERS +DACE +DACES +DACHA +DACHAS +DACHSHUND +DACHSHUNDS +DACITE +DACITES +DACKER +DACKERED +DACKERING +DACKERS +DACOIT +DACOITIES +DACOITS +DACOITY +DACQUOISE +DACQUOISES +DACRON +DACRONS +DACTYL +DACTYLI +DACTYLIC +DACTYLICS +DACTYLOLOGIES +DACTYLOLOGY +DACTYLS +DACTYLUS +DAD +DADA +DADAISM +DADAISMS +DADAIST +DADAISTIC +DADAISTS +DADAS +DADDIES +DADDLE +DADDLED +DADDLES +DADDLING +DADDY +DADGUM +DADO +DADOED +DADOES +DADOING +DADOS +DADS +DAEDAL +DAEDALEAN +DAEDALIAN +DAEMON +DAEMONES +DAEMONIC +DAEMONS +DAFF +DAFFED +DAFFIER +DAFFIEST +DAFFILY +DAFFINESS +DAFFINESSES +DAFFING +DAFFODIL +DAFFODILS +DAFFS +DAFFY +DAFT +DAFTER +DAFTEST +DAFTLY +DAFTNESS +DAFTNESSES +DAG +DAGGA +DAGGAS +DAGGER +DAGGERED +DAGGERING +DAGGERLIKE +DAGGERS +DAGGLE +DAGGLED +DAGGLES +DAGGLING +DAGLOCK +DAGLOCKS +DAGO +DAGOBA +DAGOBAS +DAGOES +DAGOS +DAGS +DAGUERREOTYPE +DAGUERREOTYPED +DAGUERREOTYPES +DAGUERREOTYPIES +DAGUERREOTYPING +DAGUERREOTYPIST +DAGUERREOTYPY +DAGWOOD +DAGWOODS +DAH +DAHABEAH +DAHABEAHS +DAHABIAH +DAHABIAHS +DAHABIEH +DAHABIEHS +DAHABIYA +DAHABIYAS +DAHL +DAHLIA +DAHLIAS +DAHLS +DAHOON +DAHOONS +DAHS +DAIDZEIN +DAIDZEINS +DAIKER +DAIKERED +DAIKERING +DAIKERS +DAIKON +DAIKONS +DAILIES +DAILINESS +DAILINESSES +DAILY +DAILYNESS +DAILYNESSES +DAIMEN +DAIMIO +DAIMIOS +DAIMON +DAIMONES +DAIMONIC +DAIMONS +DAIMYO +DAIMYOS +DAINTIER +DAINTIES +DAINTIEST +DAINTILY +DAINTINESS +DAINTINESSES +DAINTY +DAIQUIRI +DAIQUIRIS +DAIRIES +DAIRY +DAIRYING +DAIRYINGS +DAIRYMAID +DAIRYMAIDS +DAIRYMAN +DAIRYMEN +DAIS +DAISES +DAISHIKI +DAISHIKIS +DAISIED +DAISIES +DAISY +DAK +DAKERHEN +DAKERHENS +DAKOIT +DAKOITIES +DAKOITS +DAKOITY +DAKS +DAL +DALAPON +DALAPONS +DALASI +DALASIS +DALE +DALEDH +DALEDHS +DALES +DALESMAN +DALESMEN +DALETH +DALETHS +DALLES +DALLIANCE +DALLIANCES +DALLIED +DALLIER +DALLIERS +DALLIES +DALLY +DALLYING +DALMATIAN +DALMATIANS +DALMATIC +DALMATICS +DALS +DALTON +DALTONIAN +DALTONIC +DALTONISM +DALTONISMS +DALTONS +DAM +DAMAGE +DAMAGEABILITIES +DAMAGEABILITY +DAMAGED +DAMAGER +DAMAGERS +DAMAGES +DAMAGING +DAMAGINGLY +DAMAN +DAMANS +DAMAR +DAMARS +DAMASCENE +DAMASCENED +DAMASCENES +DAMASCENING +DAMASK +DAMASKED +DAMASKEEN +DAMASKEENED +DAMASKEENING +DAMASKEENS +DAMASKING +DAMASKS +DAME +DAMES +DAMEWORT +DAMEWORTS +DAMIANA +DAMIANAS +DAMMAR +DAMMARS +DAMMED +DAMMER +DAMMERS +DAMMING +DAMMIT +DAMN +DAMNABLE +DAMNABLENESS +DAMNABLENESSES +DAMNABLY +DAMNATION +DAMNATIONS +DAMNATORY +DAMNDEST +DAMNDESTS +DAMNED +DAMNEDER +DAMNEDEST +DAMNEDESTS +DAMNER +DAMNERS +DAMNIFIED +DAMNIFIES +DAMNIFY +DAMNIFYING +DAMNING +DAMNINGLY +DAMNS +DAMOSEL +DAMOSELS +DAMOZEL +DAMOZELS +DAMP +DAMPED +DAMPEN +DAMPENED +DAMPENER +DAMPENERS +DAMPENING +DAMPENS +DAMPER +DAMPERS +DAMPEST +DAMPING +DAMPINGS +DAMPISH +DAMPLY +DAMPNESS +DAMPNESSES +DAMPS +DAMS +DAMSEL +DAMSELFISH +DAMSELFISHES +DAMSELFLIES +DAMSELFLY +DAMSELS +DAMSON +DAMSONS +DAN +DANAZOL +DANAZOLS +DANCE +DANCEABLE +DANCED +DANCER +DANCERS +DANCES +DANCING +DANDELION +DANDELIONS +DANDER +DANDERED +DANDERING +DANDERS +DANDIACAL +DANDIER +DANDIES +DANDIEST +DANDIFICATION +DANDIFICATIONS +DANDIFIED +DANDIFIES +DANDIFY +DANDIFYING +DANDILY +DANDLE +DANDLED +DANDLER +DANDLERS +DANDLES +DANDLING +DANDRIFF +DANDRIFFS +DANDRUFF +DANDRUFFS +DANDRUFFY +DANDY +DANDYISH +DANDYISHLY +DANDYISM +DANDYISMS +DANEGELD +DANEGELDS +DANEGELT +DANEGELTS +DANEWEED +DANEWEEDS +DANEWORT +DANEWORTS +DANG +DANGED +DANGER +DANGERED +DANGERING +DANGEROUS +DANGEROUSLY +DANGEROUSNESS +DANGEROUSNESSES +DANGERS +DANGING +DANGLE +DANGLED +DANGLER +DANGLERS +DANGLES +DANGLIER +DANGLIEST +DANGLING +DANGLY +DANGS +DANIO +DANIOS +DANISH +DANISHES +DANK +DANKER +DANKEST +DANKLY +DANKNESS +DANKNESSES +DANS +DANSEUR +DANSEURS +DANSEUSE +DANSEUSES +DAP +DAPHNE +DAPHNES +DAPHNIA +DAPHNIAS +DAPPED +DAPPER +DAPPERER +DAPPEREST +DAPPERLY +DAPPERNESS +DAPPERNESSES +DAPPING +DAPPLE +DAPPLED +DAPPLES +DAPPLING +DAPS +DAPSONE +DAPSONES +DARB +DARBAR +DARBARS +DARBIES +DARBS +DARE +DARED +DAREDEVIL +DAREDEVILRIES +DAREDEVILRY +DAREDEVILS +DAREDEVILTRIES +DAREDEVILTRY +DAREFUL +DARER +DARERS +DARES +DARESAY +DARIC +DARICS +DARING +DARINGLY +DARINGNESS +DARINGNESSES +DARINGS +DARIOLE +DARIOLES +DARK +DARKED +DARKEN +DARKENED +DARKENER +DARKENERS +DARKENING +DARKENS +DARKER +DARKEST +DARKEY +DARKEYS +DARKIE +DARKIES +DARKING +DARKISH +DARKLE +DARKLED +DARKLES +DARKLIER +DARKLIEST +DARKLING +DARKLINGS +DARKLY +DARKNESS +DARKNESSES +DARKROOM +DARKROOMS +DARKS +DARKSOME +DARKY +DARLING +DARLINGLY +DARLINGNESS +DARLINGNESSES +DARLINGS +DARN +DARNATION +DARNATIONS +DARNDEST +DARNDESTS +DARNED +DARNEDER +DARNEDEST +DARNEDESTS +DARNEL +DARNELS +DARNER +DARNERS +DARNING +DARNINGS +DARNS +DARSHAN +DARSHANS +DART +DARTBOARD +DARTBOARDS +DARTED +DARTER +DARTERS +DARTING +DARTINGLY +DARTLE +DARTLED +DARTLES +DARTLING +DARTS +DASH +DASHBOARD +DASHBOARDS +DASHED +DASHEEN +DASHEENS +DASHER +DASHERS +DASHES +DASHI +DASHIER +DASHIEST +DASHIKI +DASHIKIS +DASHING +DASHINGLY +DASHIS +DASHPOT +DASHPOTS +DASHY +DASSIE +DASSIES +DASTARD +DASTARDLINESS +DASTARDLINESSES +DASTARDLY +DASTARDS +DASYMETER +DASYMETERS +DASYURE +DASYURES +DATA +DATABANK +DATABANKS +DATABASE +DATABASED +DATABASES +DATABASING +DATABLE +DATARIES +DATARY +DATCHA +DATCHAS +DATE +DATEABLE +DATEBOOK +DATEBOOKS +DATED +DATEDLY +DATEDNESS +DATEDNESSES +DATELESS +DATELINE +DATELINED +DATELINES +DATELINING +DATER +DATERS +DATES +DATING +DATIVAL +DATIVE +DATIVELY +DATIVES +DATO +DATOS +DATTO +DATTOS +DATUM +DATUMS +DATURA +DATURAS +DATURIC +DAUB +DAUBE +DAUBED +DAUBER +DAUBERIES +DAUBERS +DAUBERY +DAUBES +DAUBIER +DAUBIEST +DAUBING +DAUBINGLY +DAUBRIES +DAUBRY +DAUBS +DAUBY +DAUGHTER +DAUGHTERLESS +DAUGHTERS +DAUNDER +DAUNDERED +DAUNDERING +DAUNDERS +DAUNOMYCIN +DAUNOMYCINS +DAUNORUBICIN +DAUNORUBICINS +DAUNT +DAUNTED +DAUNTER +DAUNTERS +DAUNTING +DAUNTINGLY +DAUNTLESS +DAUNTLESSLY +DAUNTLESSNESS +DAUNTLESSNESSES +DAUNTS +DAUPHIN +DAUPHINE +DAUPHINES +DAUPHINS +DAUT +DAUTED +DAUTIE +DAUTIES +DAUTING +DAUTS +DAVEN +DAVENED +DAVENING +DAVENPORT +DAVENPORTS +DAVENS +DAVIES +DAVIT +DAVITS +DAVY +DAW +DAWDLE +DAWDLED +DAWDLER +DAWDLERS +DAWDLES +DAWDLING +DAWED +DAWEN +DAWING +DAWK +DAWKS +DAWN +DAWNED +DAWNING +DAWNLIKE +DAWNS +DAWS +DAWSONITE +DAWSONITES +DAWT +DAWTED +DAWTIE +DAWTIES +DAWTING +DAWTS +DAY +DAYBED +DAYBEDS +DAYBOOK +DAYBOOKS +DAYBREAK +DAYBREAKS +DAYCARE +DAYCARES +DAYDREAM +DAYDREAMED +DAYDREAMER +DAYDREAMERS +DAYDREAMING +DAYDREAMLIKE +DAYDREAMS +DAYDREAMT +DAYDREAMY +DAYFLIES +DAYFLOWER +DAYFLOWERS +DAYFLY +DAYGLOW +DAYGLOWS +DAYLIGHT +DAYLIGHTED +DAYLIGHTING +DAYLIGHTINGS +DAYLIGHTS +DAYLILIES +DAYLILY +DAYLIT +DAYLONG +DAYMARE +DAYMARES +DAYROOM +DAYROOMS +DAYS +DAYSIDE +DAYSIDES +DAYSMAN +DAYSMEN +DAYSPRING +DAYSPRINGS +DAYSTAR +DAYSTARS +DAYTIME +DAYTIMES +DAYWORK +DAYWORKER +DAYWORKERS +DAYWORKS +DAZE +DAZED +DAZEDLY +DAZEDNESS +DAZEDNESSES +DAZES +DAZING +DAZZLE +DAZZLED +DAZZLER +DAZZLERS +DAZZLES +DAZZLING +DAZZLINGLY +DE +DEACIDIFICATION +DEACIDIFIED +DEACIDIFIES +DEACIDIFY +DEACIDIFYING +DEACON +DEACONED +DEACONESS +DEACONESSES +DEACONING +DEACONRIES +DEACONRY +DEACONS +DEACTIVATE +DEACTIVATED +DEACTIVATES +DEACTIVATING +DEACTIVATION +DEACTIVATIONS +DEACTIVATOR +DEACTIVATORS +DEAD +DEADBEAT +DEADBEATS +DEADBOLT +DEADBOLTS +DEADEN +DEADENED +DEADENER +DEADENERS +DEADENING +DEADENINGLY +DEADENINGS +DEADENS +DEADER +DEADEST +DEADEYE +DEADEYES +DEADFALL +DEADFALLS +DEADHEAD +DEADHEADED +DEADHEADING +DEADHEADS +DEADLIER +DEADLIEST +DEADLIFT +DEADLIFTED +DEADLIFTING +DEADLIFTS +DEADLIGHT +DEADLIGHTS +DEADLINE +DEADLINED +DEADLINES +DEADLINESS +DEADLINESSES +DEADLINING +DEADLOCK +DEADLOCKED +DEADLOCKING +DEADLOCKS +DEADLY +DEADMAN +DEADMEN +DEADNESS +DEADNESSES +DEADPAN +DEADPANNED +DEADPANNER +DEADPANNERS +DEADPANNING +DEADPANS +DEADS +DEADWEIGHT +DEADWEIGHTS +DEADWOOD +DEADWOODS +DEAERATE +DEAERATED +DEAERATES +DEAERATING +DEAERATION +DEAERATIONS +DEAERATOR +DEAERATORS +DEAF +DEAFEN +DEAFENED +DEAFENING +DEAFENINGLY +DEAFENINGS +DEAFENS +DEAFER +DEAFEST +DEAFISH +DEAFLY +DEAFNESS +DEAFNESSES +DEAIR +DEAIRED +DEAIRING +DEAIRS +DEAL +DEALATE +DEALATED +DEALATES +DEALATION +DEALATIONS +DEALER +DEALERS +DEALERSHIP +DEALERSHIPS +DEALFISH +DEALFISHES +DEALING +DEALINGS +DEALS +DEALT +DEAMINASE +DEAMINASES +DEAMINATE +DEAMINATED +DEAMINATES +DEAMINATING +DEAMINATION +DEAMINATIONS +DEAMINIZE +DEAMINIZED +DEAMINIZES +DEAMINIZING +DEAN +DEANED +DEANERIES +DEANERY +DEANING +DEANS +DEANSHIP +DEANSHIPS +DEAR +DEARER +DEAREST +DEARIE +DEARIES +DEARLY +DEARNESS +DEARNESSES +DEARS +DEARTH +DEARTHS +DEARY +DEASH +DEASHED +DEASHES +DEASHING +DEASIL +DEATH +DEATHBED +DEATHBEDS +DEATHBLOW +DEATHBLOWS +DEATHCUP +DEATHCUPS +DEATHFUL +DEATHLESS +DEATHLESSLY +DEATHLESSNESS +DEATHLESSNESSES +DEATHLIKE +DEATHLY +DEATHS +DEATHSMAN +DEATHSMEN +DEATHTRAP +DEATHTRAPS +DEATHWATCH +DEATHWATCHES +DEATHY +DEAVE +DEAVED +DEAVES +DEAVING +DEB +DEBACLE +DEBACLES +DEBAG +DEBAGGED +DEBAGGING +DEBAGS +DEBAR +DEBARK +DEBARKATION +DEBARKATIONS +DEBARKED +DEBARKER +DEBARKERS +DEBARKING +DEBARKS +DEBARMENT +DEBARMENTS +DEBARRED +DEBARRING +DEBARS +DEBASE +DEBASED +DEBASEMENT +DEBASEMENTS +DEBASER +DEBASERS +DEBASES +DEBASING +DEBATABLE +DEBATABLY +DEBATE +DEBATED +DEBATEMENT +DEBATEMENTS +DEBATER +DEBATERS +DEBATES +DEBATING +DEBAUCH +DEBAUCHED +DEBAUCHEE +DEBAUCHEES +DEBAUCHER +DEBAUCHERIES +DEBAUCHERS +DEBAUCHERY +DEBAUCHES +DEBAUCHING +DEBEAK +DEBEAKED +DEBEAKING +DEBEAKS +DEBEARD +DEBEARDED +DEBEARDING +DEBEARDS +DEBENTURE +DEBENTURES +DEBILITATE +DEBILITATED +DEBILITATES +DEBILITATING +DEBILITATION +DEBILITATIONS +DEBILITIES +DEBILITY +DEBIT +DEBITED +DEBITING +DEBITS +DEBONAIR +DEBONAIRE +DEBONAIRLY +DEBONAIRNESS +DEBONAIRNESSES +DEBONE +DEBONED +DEBONER +DEBONERS +DEBONES +DEBONING +DEBOUCH +DEBOUCHE +DEBOUCHED +DEBOUCHES +DEBOUCHING +DEBOUCHMENT +DEBOUCHMENTS +DEBRIDE +DEBRIDED +DEBRIDEMENT +DEBRIDEMENTS +DEBRIDES +DEBRIDING +DEBRIEF +DEBRIEFED +DEBRIEFER +DEBRIEFERS +DEBRIEFING +DEBRIEFS +DEBRIS +DEBRUISE +DEBRUISED +DEBRUISES +DEBRUISING +DEBS +DEBT +DEBTLESS +DEBTOR +DEBTORS +DEBTS +DEBUG +DEBUGGED +DEBUGGER +DEBUGGERS +DEBUGGING +DEBUGS +DEBUNK +DEBUNKED +DEBUNKER +DEBUNKERS +DEBUNKING +DEBUNKS +DEBUT +DEBUTANT +DEBUTANTE +DEBUTANTES +DEBUTANTS +DEBUTED +DEBUTING +DEBUTS +DEBYE +DEBYES +DECADAL +DECADE +DECADENCE +DECADENCES +DECADENCIES +DECADENCY +DECADENT +DECADENTLY +DECADENTS +DECADES +DECAF +DECAFFEINATED +DECAFS +DECAGON +DECAGONAL +DECAGONS +DECAGRAM +DECAGRAMS +DECAHEDRA +DECAHEDRON +DECAHEDRONS +DECAL +DECALCIFICATION +DECALCIFIED +DECALCIFIES +DECALCIFY +DECALCIFYING +DECALCOMANIA +DECALCOMANIAS +DECALITER +DECALITERS +DECALOG +DECALOGS +DECALOGUE +DECALOGUES +DECALS +DECAMETER +DECAMETERS +DECAMETHONIUM +DECAMETHONIUMS +DECAMETRIC +DECAMP +DECAMPED +DECAMPING +DECAMPMENT +DECAMPMENTS +DECAMPS +DECANAL +DECANE +DECANES +DECANT +DECANTATION +DECANTATIONS +DECANTED +DECANTER +DECANTERS +DECANTING +DECANTS +DECAPITATE +DECAPITATED +DECAPITATES +DECAPITATING +DECAPITATION +DECAPITATIONS +DECAPITATOR +DECAPITATORS +DECAPOD +DECAPODAL +DECAPODAN +DECAPODANS +DECAPODOUS +DECAPODS +DECARBONATE +DECARBONATED +DECARBONATES +DECARBONATING +DECARBONATION +DECARBONATIONS +DECARBONIZE +DECARBONIZED +DECARBONIZER +DECARBONIZERS +DECARBONIZES +DECARBONIZING +DECARBOXYLASE +DECARBOXYLASES +DECARBOXYLATE +DECARBOXYLATED +DECARBOXYLATES +DECARBOXYLATING +DECARBOXYLATION +DECARBURIZATION +DECARBURIZE +DECARBURIZED +DECARBURIZES +DECARBURIZING +DECARE +DECARES +DECASUALIZATION +DECASYLLABIC +DECASYLLABICS +DECASYLLABLE +DECASYLLABLES +DECATHLETE +DECATHLETES +DECATHLON +DECATHLONS +DECAY +DECAYABLE +DECAYED +DECAYER +DECAYERS +DECAYING +DECAYLESS +DECAYS +DECEASE +DECEASED +DECEASES +DECEASING +DECEDENT +DECEDENTS +DECEIT +DECEITFUL +DECEITFULLY +DECEITFULNESS +DECEITFULNESSES +DECEITS +DECEIVABLE +DECEIVE +DECEIVED +DECEIVER +DECEIVERS +DECEIVES +DECEIVING +DECEIVINGLY +DECELERATE +DECELERATED +DECELERATES +DECELERATING +DECELERATION +DECELERATIONS +DECELERATOR +DECELERATORS +DECELERON +DECELERONS +DECEMVIR +DECEMVIRAL +DECEMVIRATE +DECEMVIRATES +DECEMVIRI +DECEMVIRS +DECENARIES +DECENARY +DECENCIES +DECENCY +DECENNARIES +DECENNARY +DECENNIA +DECENNIAL +DECENNIALLY +DECENNIALS +DECENNIUM +DECENNIUMS +DECENT +DECENTER +DECENTERED +DECENTERING +DECENTERS +DECENTEST +DECENTLY +DECENTRALIZE +DECENTRALIZED +DECENTRALIZES +DECENTRALIZING +DECENTRE +DECENTRED +DECENTRES +DECENTRING +DECEPTION +DECEPTIONAL +DECEPTIONS +DECEPTIVE +DECEPTIVELY +DECEPTIVENESS +DECEPTIVENESSES +DECEREBRATE +DECEREBRATED +DECEREBRATES +DECEREBRATING +DECEREBRATION +DECEREBRATIONS +DECERN +DECERNED +DECERNING +DECERNS +DECERTIFICATION +DECERTIFIED +DECERTIFIES +DECERTIFY +DECERTIFYING +DECHLORINATE +DECHLORINATED +DECHLORINATES +DECHLORINATING +DECHLORINATION +DECHLORINATIONS +DECIARE +DECIARES +DECIBEL +DECIBELS +DECIDABILITIES +DECIDABILITY +DECIDABLE +DECIDE +DECIDED +DECIDEDLY +DECIDEDNESS +DECIDEDNESSES +DECIDER +DECIDERS +DECIDES +DECIDING +DECIDUA +DECIDUAE +DECIDUAL +DECIDUAS +DECIDUATE +DECIDUOUS +DECIDUOUSNESS +DECIDUOUSNESSES +DECIGRAM +DECIGRAMS +DECILE +DECILES +DECILITER +DECILITERS +DECILITRE +DECILITRES +DECILLION +DECILLIONS +DECIMAL +DECIMALIZATION +DECIMALIZATIONS +DECIMALIZE +DECIMALIZED +DECIMALIZES +DECIMALIZING +DECIMALLY +DECIMALS +DECIMATE +DECIMATED +DECIMATES +DECIMATING +DECIMATION +DECIMATIONS +DECIMATOR +DECIMATORS +DECIMETER +DECIMETERS +DECIMETRE +DECIMETRES +DECIPHER +DECIPHERABLE +DECIPHERED +DECIPHERER +DECIPHERERS +DECIPHERING +DECIPHERMENT +DECIPHERMENTS +DECIPHERS +DECISION +DECISIONAL +DECISIONED +DECISIONING +DECISIONS +DECISIVE +DECISIVELY +DECISIVENESS +DECISIVENESSES +DECK +DECKED +DECKEL +DECKELS +DECKER +DECKERS +DECKHAND +DECKHANDS +DECKHOUSE +DECKHOUSES +DECKING +DECKINGS +DECKLE +DECKLES +DECKS +DECLAIM +DECLAIMED +DECLAIMER +DECLAIMERS +DECLAIMING +DECLAIMS +DECLAMATION +DECLAMATIONS +DECLAMATORY +DECLARABLE +DECLARANT +DECLARANTS +DECLARATION +DECLARATIONS +DECLARATIVE +DECLARATIVELY +DECLARATORY +DECLARE +DECLARED +DECLARER +DECLARERS +DECLARES +DECLARING +DECLASS +DECLASSE +DECLASSED +DECLASSES +DECLASSIFIED +DECLASSIFIES +DECLASSIFY +DECLASSIFYING +DECLASSING +DECLAW +DECLAWED +DECLAWING +DECLAWS +DECLENSION +DECLENSIONAL +DECLENSIONS +DECLINABLE +DECLINATION +DECLINATIONAL +DECLINATIONS +DECLINE +DECLINED +DECLINER +DECLINERS +DECLINES +DECLINING +DECLINIST +DECLINISTS +DECLIVITIES +DECLIVITOUS +DECLIVITY +DECO +DECOCT +DECOCTED +DECOCTING +DECOCTION +DECOCTIONS +DECOCTIVE +DECOCTS +DECODE +DECODED +DECODER +DECODERS +DECODES +DECODING +DECOLLATE +DECOLLATED +DECOLLATES +DECOLLATING +DECOLLATION +DECOLLATIONS +DECOLLETAGE +DECOLLETAGES +DECOLLETE +DECOLLETES +DECOLONIZATION +DECOLONIZATIONS +DECOLONIZE +DECOLONIZED +DECOLONIZES +DECOLONIZING +DECOLOR +DECOLORED +DECOLORING +DECOLORIZATION +DECOLORIZATIONS +DECOLORIZE +DECOLORIZED +DECOLORIZER +DECOLORIZERS +DECOLORIZES +DECOLORIZING +DECOLORS +DECOLOUR +DECOLOURED +DECOLOURING +DECOLOURS +DECOMMISSION +DECOMMISSIONED +DECOMMISSIONING +DECOMMISSIONS +DECOMPENSATE +DECOMPENSATED +DECOMPENSATES +DECOMPENSATING +DECOMPENSATION +DECOMPENSATIONS +DECOMPOSABILITY +DECOMPOSABLE +DECOMPOSE +DECOMPOSED +DECOMPOSER +DECOMPOSERS +DECOMPOSES +DECOMPOSING +DECOMPOSITION +DECOMPOSITIONS +DECOMPOUND +DECOMPRESS +DECOMPRESSED +DECOMPRESSES +DECOMPRESSING +DECOMPRESSION +DECOMPRESSIONS +DECONCENTRATE +DECONCENTRATED +DECONCENTRATES +DECONCENTRATING +DECONCENTRATION +DECONDITION +DECONDITIONED +DECONDITIONING +DECONDITIONS +DECONGEST +DECONGESTANT +DECONGESTANTS +DECONGESTED +DECONGESTING +DECONGESTION +DECONGESTIONS +DECONGESTIVE +DECONGESTS +DECONSECRATE +DECONSECRATED +DECONSECRATES +DECONSECRATING +DECONSECRATION +DECONSECRATIONS +DECONSTRUCT +DECONSTRUCTED +DECONSTRUCTING +DECONSTRUCTION +DECONSTRUCTIONS +DECONSTRUCTIVE +DECONSTRUCTOR +DECONSTRUCTORS +DECONSTRUCTS +DECONTAMINATE +DECONTAMINATED +DECONTAMINATES +DECONTAMINATING +DECONTAMINATION +DECONTAMINATOR +DECONTAMINATORS +DECONTROL +DECONTROLLED +DECONTROLLING +DECONTROLS +DECOR +DECORATE +DECORATED +DECORATES +DECORATING +DECORATION +DECORATIONS +DECORATIVE +DECORATIVELY +DECORATIVENESS +DECORATOR +DECORATORS +DECOROUS +DECOROUSLY +DECOROUSNESS +DECOROUSNESSES +DECORS +DECORTICATE +DECORTICATED +DECORTICATES +DECORTICATING +DECORTICATION +DECORTICATIONS +DECORTICATOR +DECORTICATORS +DECORUM +DECORUMS +DECOS +DECOUPAGE +DECOUPAGED +DECOUPAGES +DECOUPAGING +DECOUPLE +DECOUPLED +DECOUPLER +DECOUPLERS +DECOUPLES +DECOUPLING +DECOY +DECOYED +DECOYER +DECOYERS +DECOYING +DECOYS +DECREASE +DECREASED +DECREASES +DECREASING +DECREASINGLY +DECREE +DECREED +DECREEING +DECREER +DECREERS +DECREES +DECREMENT +DECREMENTAL +DECREMENTS +DECREPIT +DECREPITATE +DECREPITATED +DECREPITATES +DECREPITATING +DECREPITATION +DECREPITATIONS +DECREPITLY +DECREPITUDE +DECREPITUDES +DECRESCENDO +DECRESCENDOS +DECRESCENT +DECRETAL +DECRETALS +DECRETIVE +DECRETORY +DECRIAL +DECRIALS +DECRIED +DECRIER +DECRIERS +DECRIES +DECRIMINALIZE +DECRIMINALIZED +DECRIMINALIZES +DECRIMINALIZING +DECROWN +DECROWNED +DECROWNING +DECROWNS +DECRY +DECRYING +DECRYPT +DECRYPTED +DECRYPTING +DECRYPTION +DECRYPTIONS +DECRYPTS +DECUMAN +DECUMBENT +DECUPLE +DECUPLED +DECUPLES +DECUPLING +DECURIES +DECURION +DECURIONS +DECURRENT +DECURVE +DECURVED +DECURVES +DECURVING +DECURY +DECUSSATE +DECUSSATED +DECUSSATES +DECUSSATING +DECUSSATION +DECUSSATIONS +DEDAL +DEDANS +DEDICATE +DEDICATED +DEDICATEDLY +DEDICATEE +DEDICATEES +DEDICATES +DEDICATING +DEDICATION +DEDICATIONS +DEDICATOR +DEDICATORS +DEDICATORY +DEDIFFERENTIATE +DEDUCE +DEDUCED +DEDUCES +DEDUCIBLE +DEDUCIBLY +DEDUCING +DEDUCT +DEDUCTED +DEDUCTIBILITIES +DEDUCTIBILITY +DEDUCTIBLE +DEDUCTIBLES +DEDUCTING +DEDUCTION +DEDUCTIONS +DEDUCTIVE +DEDUCTIVELY +DEDUCTS +DEE +DEED +DEEDED +DEEDIER +DEEDIEST +DEEDING +DEEDLESS +DEEDS +DEEDY +DEEJAY +DEEJAYED +DEEJAYING +DEEJAYS +DEEM +DEEMED +DEEMING +DEEMS +DEEMSTER +DEEMSTERS +DEEP +DEEPEN +DEEPENED +DEEPENER +DEEPENERS +DEEPENING +DEEPENS +DEEPER +DEEPEST +DEEPFREEZE +DEEPFREEZES +DEEPFREEZING +DEEPFROZE +DEEPFROZEN +DEEPLY +DEEPNESS +DEEPNESSES +DEEPS +DEEPWATER +DEER +DEERBERRIES +DEERBERRY +DEERFLIES +DEERFLY +DEERHOUND +DEERHOUNDS +DEERLIKE +DEERS +DEERSKIN +DEERSKINS +DEERSTALKER +DEERSTALKERS +DEERWEED +DEERWEEDS +DEERYARD +DEERYARDS +DEES +DEET +DEETS +DEEWAN +DEEWANS +DEF +DEFACE +DEFACED +DEFACEMENT +DEFACEMENTS +DEFACER +DEFACERS +DEFACES +DEFACING +DEFALCATE +DEFALCATED +DEFALCATES +DEFALCATING +DEFALCATION +DEFALCATIONS +DEFALCATOR +DEFALCATORS +DEFAMATION +DEFAMATIONS +DEFAMATORY +DEFAME +DEFAMED +DEFAMER +DEFAMERS +DEFAMES +DEFAMING +DEFANG +DEFANGED +DEFANGING +DEFANGS +DEFAT +DEFATS +DEFATTED +DEFATTING +DEFAULT +DEFAULTED +DEFAULTER +DEFAULTERS +DEFAULTING +DEFAULTS +DEFEASANCE +DEFEASANCES +DEFEASIBILITIES +DEFEASIBILITY +DEFEASIBLE +DEFEAT +DEFEATED +DEFEATER +DEFEATERS +DEFEATING +DEFEATISM +DEFEATISMS +DEFEATIST +DEFEATISTS +DEFEATS +DEFEATURE +DEFEATURES +DEFECATE +DEFECATED +DEFECATES +DEFECATING +DEFECATION +DEFECATIONS +DEFECATOR +DEFECATORS +DEFECT +DEFECTED +DEFECTING +DEFECTION +DEFECTIONS +DEFECTIVE +DEFECTIVELY +DEFECTIVENESS +DEFECTIVENESSES +DEFECTIVES +DEFECTOR +DEFECTORS +DEFECTS +DEFEMINIZATION +DEFEMINIZATIONS +DEFEMINIZE +DEFEMINIZED +DEFEMINIZES +DEFEMINIZING +DEFENCE +DEFENCED +DEFENCEMAN +DEFENCEMEN +DEFENCES +DEFENCING +DEFEND +DEFENDABLE +DEFENDANT +DEFENDANTS +DEFENDED +DEFENDER +DEFENDERS +DEFENDING +DEFENDS +DEFENESTRATE +DEFENESTRATED +DEFENESTRATES +DEFENESTRATING +DEFENESTRATION +DEFENESTRATIONS +DEFENSE +DEFENSED +DEFENSELESS +DEFENSELESSLY +DEFENSELESSNESS +DEFENSEMAN +DEFENSEMEN +DEFENSES +DEFENSIBILITIES +DEFENSIBILITY +DEFENSIBLE +DEFENSIBLY +DEFENSING +DEFENSIVE +DEFENSIVELY +DEFENSIVENESS +DEFENSIVENESSES +DEFENSIVES +DEFER +DEFERENCE +DEFERENCES +DEFERENT +DEFERENTIAL +DEFERENTIALLY +DEFERENTS +DEFERMENT +DEFERMENTS +DEFERRABLE +DEFERRABLES +DEFERRAL +DEFERRALS +DEFERRED +DEFERRER +DEFERRERS +DEFERRING +DEFERS +DEFERVESCENCE +DEFERVESCENCES +DEFFER +DEFFEST +DEFI +DEFIANCE +DEFIANCES +DEFIANT +DEFIANTLY +DEFIBRILLATE +DEFIBRILLATED +DEFIBRILLATES +DEFIBRILLATING +DEFIBRILLATION +DEFIBRILLATIONS +DEFIBRILLATOR +DEFIBRILLATORS +DEFIBRINATE +DEFIBRINATED +DEFIBRINATES +DEFIBRINATING +DEFIBRINATION +DEFIBRINATIONS +DEFICIENCIES +DEFICIENCY +DEFICIENT +DEFICIENTLY +DEFICIENTS +DEFICIT +DEFICITS +DEFIED +DEFIER +DEFIERS +DEFIES +DEFILADE +DEFILADED +DEFILADES +DEFILADING +DEFILE +DEFILED +DEFILEMENT +DEFILEMENTS +DEFILER +DEFILERS +DEFILES +DEFILING +DEFINABLE +DEFINABLY +DEFINE +DEFINED +DEFINEMENT +DEFINEMENTS +DEFINER +DEFINERS +DEFINES +DEFINIENDA +DEFINIENDUM +DEFINIENS +DEFINIENTIA +DEFINING +DEFINITE +DEFINITELY +DEFINITENESS +DEFINITENESSES +DEFINITION +DEFINITIONAL +DEFINITIONS +DEFINITIVE +DEFINITIVELY +DEFINITIVENESS +DEFINITIVES +DEFINITIZE +DEFINITIZED +DEFINITIZES +DEFINITIZING +DEFINITUDE +DEFINITUDES +DEFIS +DEFLAGRATE +DEFLAGRATED +DEFLAGRATES +DEFLAGRATING +DEFLAGRATION +DEFLAGRATIONS +DEFLATE +DEFLATED +DEFLATER +DEFLATERS +DEFLATES +DEFLATING +DEFLATION +DEFLATIONARY +DEFLATIONS +DEFLATOR +DEFLATORS +DEFLEA +DEFLEAED +DEFLEAING +DEFLEAS +DEFLECT +DEFLECTABLE +DEFLECTED +DEFLECTING +DEFLECTION +DEFLECTIONS +DEFLECTIVE +DEFLECTOR +DEFLECTORS +DEFLECTS +DEFLEXED +DEFLEXION +DEFLEXIONS +DEFLORATION +DEFLORATIONS +DEFLOWER +DEFLOWERED +DEFLOWERER +DEFLOWERERS +DEFLOWERING +DEFLOWERS +DEFOAM +DEFOAMED +DEFOAMER +DEFOAMERS +DEFOAMING +DEFOAMS +DEFOCUS +DEFOCUSED +DEFOCUSES +DEFOCUSING +DEFOCUSSED +DEFOCUSSES +DEFOCUSSING +DEFOG +DEFOGGED +DEFOGGER +DEFOGGERS +DEFOGGING +DEFOGS +DEFOLIANT +DEFOLIANTS +DEFOLIATE +DEFOLIATED +DEFOLIATES +DEFOLIATING +DEFOLIATION +DEFOLIATIONS +DEFOLIATOR +DEFOLIATORS +DEFORCE +DEFORCED +DEFORCEMENT +DEFORCEMENTS +DEFORCER +DEFORCERS +DEFORCES +DEFORCING +DEFOREST +DEFORESTATION +DEFORESTATIONS +DEFORESTED +DEFORESTING +DEFORESTS +DEFORM +DEFORMABLE +DEFORMALIZE +DEFORMALIZED +DEFORMALIZES +DEFORMALIZING +DEFORMATION +DEFORMATIONAL +DEFORMATIONS +DEFORMATIVE +DEFORMED +DEFORMER +DEFORMERS +DEFORMING +DEFORMITIES +DEFORMITY +DEFORMS +DEFRAG +DEFRAGGED +DEFRAGGER +DEFRAGGERS +DEFRAGGING +DEFRAGS +DEFRAUD +DEFRAUDED +DEFRAUDER +DEFRAUDERS +DEFRAUDING +DEFRAUDS +DEFRAY +DEFRAYABLE +DEFRAYAL +DEFRAYALS +DEFRAYED +DEFRAYER +DEFRAYERS +DEFRAYING +DEFRAYS +DEFROCK +DEFROCKED +DEFROCKING +DEFROCKS +DEFROST +DEFROSTED +DEFROSTER +DEFROSTERS +DEFROSTING +DEFROSTS +DEFT +DEFTER +DEFTEST +DEFTLY +DEFTNESS +DEFTNESSES +DEFUEL +DEFUELED +DEFUELING +DEFUELLED +DEFUELLING +DEFUELS +DEFUNCT +DEFUND +DEFUNDED +DEFUNDING +DEFUNDS +DEFUSE +DEFUSED +DEFUSER +DEFUSERS +DEFUSES +DEFUSING +DEFUZE +DEFUZED +DEFUZES +DEFUZING +DEFY +DEFYING +DEGAGE +DEGAME +DEGAMES +DEGAMI +DEGAMIS +DEGAS +DEGASES +DEGASSED +DEGASSER +DEGASSERS +DEGASSES +DEGASSING +DEGAUSS +DEGAUSSED +DEGAUSSER +DEGAUSSERS +DEGAUSSES +DEGAUSSING +DEGENDER +DEGENDERED +DEGENDERING +DEGENDERS +DEGENERACIES +DEGENERACY +DEGENERATE +DEGENERATED +DEGENERATELY +DEGENERATENESS +DEGENERATES +DEGENERATING +DEGENERATION +DEGENERATIONS +DEGENERATIVE +DEGERM +DEGERMED +DEGERMING +DEGERMS +DEGLACIATED +DEGLACIATION +DEGLACIATIONS +DEGLAMORIZATION +DEGLAMORIZE +DEGLAMORIZED +DEGLAMORIZES +DEGLAMORIZING +DEGLAZE +DEGLAZED +DEGLAZES +DEGLAZING +DEGLUTITION +DEGLUTITIONS +DEGRADABLE +DEGRADATION +DEGRADATIONS +DEGRADATIVE +DEGRADE +DEGRADED +DEGRADEDLY +DEGRADER +DEGRADERS +DEGRADES +DEGRADING +DEGRADINGLY +DEGRANULATION +DEGRANULATIONS +DEGREASE +DEGREASED +DEGREASER +DEGREASERS +DEGREASES +DEGREASING +DEGREE +DEGREED +DEGREES +DEGRESSIVE +DEGRESSIVELY +DEGRINGOLADE +DEGRINGOLADES +DEGUM +DEGUMMED +DEGUMMING +DEGUMS +DEGUST +DEGUSTATION +DEGUSTATIONS +DEGUSTED +DEGUSTING +DEGUSTS +DEHISCE +DEHISCED +DEHISCENCE +DEHISCENCES +DEHISCENT +DEHISCES +DEHISCING +DEHORN +DEHORNED +DEHORNER +DEHORNERS +DEHORNING +DEHORNS +DEHORT +DEHORTED +DEHORTING +DEHORTS +DEHUMANIZATION +DEHUMANIZATIONS +DEHUMANIZE +DEHUMANIZED +DEHUMANIZES +DEHUMANIZING +DEHUMIDIFIED +DEHUMIDIFIER +DEHUMIDIFIERS +DEHUMIDIFIES +DEHUMIDIFY +DEHUMIDIFYING +DEHYDRATE +DEHYDRATED +DEHYDRATES +DEHYDRATING +DEHYDRATION +DEHYDRATIONS +DEHYDRATOR +DEHYDRATORS +DEHYDROGENASE +DEHYDROGENASES +DEHYDROGENATE +DEHYDROGENATED +DEHYDROGENATES +DEHYDROGENATING +DEHYDROGENATION +DEICE +DEICED +DEICER +DEICERS +DEICES +DEICIDAL +DEICIDE +DEICIDES +DEICING +DEICTIC +DEICTICS +DEIFIC +DEIFICAL +DEIFICATION +DEIFICATIONS +DEIFIED +DEIFIER +DEIFIERS +DEIFIES +DEIFORM +DEIFY +DEIFYING +DEIGN +DEIGNED +DEIGNING +DEIGNS +DEIL +DEILS +DEINDUSTRIALIZE +DEINONYCHUS +DEINONYCHUSES +DEIONIZATION +DEIONIZATIONS +DEIONIZE +DEIONIZED +DEIONIZER +DEIONIZERS +DEIONIZES +DEIONIZING +DEISM +DEISMS +DEIST +DEISTIC +DEISTICAL +DEISTICALLY +DEISTS +DEITIES +DEITY +DEIXIS +DEIXISES +DEJECT +DEJECTA +DEJECTED +DEJECTEDLY +DEJECTEDNESS +DEJECTEDNESSES +DEJECTING +DEJECTION +DEJECTIONS +DEJECTS +DEJEUNER +DEJEUNERS +DEKAGRAM +DEKAGRAMS +DEKALITER +DEKALITERS +DEKALITRE +DEKALITRES +DEKAMETER +DEKAMETERS +DEKAMETRE +DEKAMETRES +DEKAMETRIC +DEKARE +DEKARES +DEKE +DEKED +DEKEING +DEKES +DEKING +DEKKO +DEKKOS +DEL +DELAINE +DELAINES +DELAMINATE +DELAMINATED +DELAMINATES +DELAMINATING +DELAMINATION +DELAMINATIONS +DELATE +DELATED +DELATES +DELATING +DELATION +DELATIONS +DELATOR +DELATORS +DELAY +DELAYABLE +DELAYED +DELAYER +DELAYERS +DELAYING +DELAYS +DELE +DELEAD +DELEADED +DELEADING +DELEADS +DELEAVE +DELEAVED +DELEAVES +DELEAVING +DELECTABILITIES +DELECTABILITY +DELECTABLE +DELECTABLES +DELECTABLY +DELECTATE +DELECTATED +DELECTATES +DELECTATING +DELECTATION +DELECTATIONS +DELED +DELEGABLE +DELEGACIES +DELEGACY +DELEGATE +DELEGATED +DELEGATEE +DELEGATEES +DELEGATES +DELEGATING +DELEGATION +DELEGATIONS +DELEGATOR +DELEGATORS +DELEGITIMATION +DELEGITIMATIONS +DELEING +DELES +DELETABLE +DELETE +DELETED +DELETERIOUS +DELETERIOUSLY +DELETERIOUSNESS +DELETES +DELETING +DELETION +DELETIONS +DELF +DELFS +DELFT +DELFTS +DELFTWARE +DELFTWARES +DELI +DELIBERATE +DELIBERATED +DELIBERATELY +DELIBERATENESS +DELIBERATES +DELIBERATING +DELIBERATION +DELIBERATIONS +DELIBERATIVE +DELIBERATIVELY +DELICACIES +DELICACY +DELICATE +DELICATELY +DELICATES +DELICATESSEN +DELICATESSENS +DELICIOUS +DELICIOUSLY +DELICIOUSNESS +DELICIOUSNESSES +DELICT +DELICTS +DELIGHT +DELIGHTED +DELIGHTEDLY +DELIGHTEDNESS +DELIGHTEDNESSES +DELIGHTER +DELIGHTERS +DELIGHTFUL +DELIGHTFULLY +DELIGHTFULNESS +DELIGHTING +DELIGHTS +DELIGHTSOME +DELIME +DELIMED +DELIMES +DELIMING +DELIMIT +DELIMITATION +DELIMITATIONS +DELIMITED +DELIMITER +DELIMITERS +DELIMITING +DELIMITS +DELINEATE +DELINEATED +DELINEATES +DELINEATING +DELINEATION +DELINEATIONS +DELINEATIVE +DELINEATOR +DELINEATORS +DELINQUENCIES +DELINQUENCY +DELINQUENT +DELINQUENTLY +DELINQUENTS +DELIQUESCE +DELIQUESCED +DELIQUESCENCE +DELIQUESCENCES +DELIQUESCENT +DELIQUESCES +DELIQUESCING +DELIRIA +DELIRIOUS +DELIRIOUSLY +DELIRIOUSNESS +DELIRIOUSNESSES +DELIRIUM +DELIRIUMS +DELIS +DELISH +DELIST +DELISTED +DELISTING +DELISTS +DELIVER +DELIVERABILITY +DELIVERABLE +DELIVERANCE +DELIVERANCES +DELIVERED +DELIVERER +DELIVERERS +DELIVERIES +DELIVERING +DELIVERS +DELIVERY +DELIVERYMAN +DELIVERYMEN +DELL +DELLIES +DELLS +DELLY +DELOCALIZATION +DELOCALIZATIONS +DELOCALIZE +DELOCALIZED +DELOCALIZES +DELOCALIZING +DELOUSE +DELOUSED +DELOUSER +DELOUSERS +DELOUSES +DELOUSING +DELPHIC +DELPHICALLY +DELPHINIA +DELPHINIUM +DELPHINIUMS +DELS +DELT +DELTA +DELTAIC +DELTAS +DELTIC +DELTOID +DELTOIDEI +DELTOIDEUS +DELTOIDS +DELTS +DELUDE +DELUDED +DELUDER +DELUDERS +DELUDES +DELUDING +DELUGE +DELUGED +DELUGES +DELUGING +DELUSION +DELUSIONAL +DELUSIONARY +DELUSIONS +DELUSIVE +DELUSIVELY +DELUSIVENESS +DELUSIVENESSES +DELUSORY +DELUSTER +DELUSTERED +DELUSTERING +DELUSTERS +DELUXE +DELVE +DELVED +DELVER +DELVERS +DELVES +DELVING +DEMAGNETIZATION +DEMAGNETIZE +DEMAGNETIZED +DEMAGNETIZER +DEMAGNETIZERS +DEMAGNETIZES +DEMAGNETIZING +DEMAGOG +DEMAGOGED +DEMAGOGIC +DEMAGOGICALLY +DEMAGOGIES +DEMAGOGING +DEMAGOGS +DEMAGOGUE +DEMAGOGUED +DEMAGOGUERIES +DEMAGOGUERY +DEMAGOGUES +DEMAGOGUING +DEMAGOGY +DEMAND +DEMANDABLE +DEMANDANT +DEMANDANTS +DEMANDED +DEMANDER +DEMANDERS +DEMANDING +DEMANDINGLY +DEMANDINGNESS +DEMANDINGNESSES +DEMANDS +DEMANTOID +DEMANTOIDS +DEMARCATE +DEMARCATED +DEMARCATES +DEMARCATING +DEMARCATION +DEMARCATIONS +DEMARCHE +DEMARCHES +DEMARK +DEMARKED +DEMARKING +DEMARKS +DEMAST +DEMASTED +DEMASTING +DEMASTS +DEMATERIALIZE +DEMATERIALIZED +DEMATERIALIZES +DEMATERIALIZING +DEME +DEMEAN +DEMEANED +DEMEANING +DEMEANOR +DEMEANORS +DEMEANOUR +DEMEANOURS +DEMEANS +DEMENT +DEMENTED +DEMENTEDLY +DEMENTEDNESS +DEMENTEDNESSES +DEMENTIA +DEMENTIAL +DEMENTIAS +DEMENTING +DEMENTS +DEMERARA +DEMERARAN +DEMERARAS +DEMERGE +DEMERGED +DEMERGER +DEMERGERED +DEMERGERING +DEMERGERS +DEMERGES +DEMERGING +DEMERIT +DEMERITED +DEMERITING +DEMERITS +DEMERSAL +DEMES +DEMESNE +DEMESNES +DEMETON +DEMETONS +DEMIC +DEMIES +DEMIGOD +DEMIGODDESS +DEMIGODDESSES +DEMIGODS +DEMIJOHN +DEMIJOHNS +DEMILITARIZE +DEMILITARIZED +DEMILITARIZES +DEMILITARIZING +DEMILUNE +DEMILUNES +DEMIMONDAINE +DEMIMONDAINES +DEMIMONDE +DEMIMONDES +DEMINERALIZE +DEMINERALIZED +DEMINERALIZER +DEMINERALIZERS +DEMINERALIZES +DEMINERALIZING +DEMIREP +DEMIREPS +DEMISABLE +DEMISE +DEMISED +DEMISEMIQUAVER +DEMISEMIQUAVERS +DEMISES +DEMISING +DEMISSION +DEMISSIONS +DEMISTER +DEMISTERS +DEMIT +DEMITASSE +DEMITASSES +DEMITS +DEMITTED +DEMITTING +DEMIURGE +DEMIURGES +DEMIURGIC +DEMIURGICAL +DEMIVOLT +DEMIVOLTE +DEMIVOLTES +DEMIVOLTS +DEMIWORLD +DEMIWORLDS +DEMO +DEMOB +DEMOBBED +DEMOBBING +DEMOBILIZATION +DEMOBILIZATIONS +DEMOBILIZE +DEMOBILIZED +DEMOBILIZES +DEMOBILIZING +DEMOBS +DEMOCRACIES +DEMOCRACY +DEMOCRAT +DEMOCRATIC +DEMOCRATICALLY +DEMOCRATIZATION +DEMOCRATIZE +DEMOCRATIZED +DEMOCRATIZER +DEMOCRATIZERS +DEMOCRATIZES +DEMOCRATIZING +DEMOCRATS +DEMODE +DEMODED +DEMODULATE +DEMODULATED +DEMODULATES +DEMODULATING +DEMODULATION +DEMODULATIONS +DEMODULATOR +DEMODULATORS +DEMOED +DEMOGRAPHER +DEMOGRAPHERS +DEMOGRAPHIC +DEMOGRAPHICAL +DEMOGRAPHICALLY +DEMOGRAPHICS +DEMOGRAPHIES +DEMOGRAPHY +DEMOING +DEMOISELLE +DEMOISELLES +DEMOLISH +DEMOLISHED +DEMOLISHER +DEMOLISHERS +DEMOLISHES +DEMOLISHING +DEMOLISHMENT +DEMOLISHMENTS +DEMOLITION +DEMOLITIONIST +DEMOLITIONISTS +DEMOLITIONS +DEMON +DEMONESS +DEMONESSES +DEMONETIZATION +DEMONETIZATIONS +DEMONETIZE +DEMONETIZED +DEMONETIZES +DEMONETIZING +DEMONIAC +DEMONIACAL +DEMONIACALLY +DEMONIACS +DEMONIAN +DEMONIC +DEMONICAL +DEMONICALLY +DEMONISE +DEMONISED +DEMONISES +DEMONISING +DEMONISM +DEMONISMS +DEMONIST +DEMONISTS +DEMONIZATION +DEMONIZATIONS +DEMONIZE +DEMONIZED +DEMONIZES +DEMONIZING +DEMONOLOGICAL +DEMONOLOGIES +DEMONOLOGIST +DEMONOLOGISTS +DEMONOLOGY +DEMONS +DEMONSTRABILITY +DEMONSTRABLE +DEMONSTRABLY +DEMONSTRATE +DEMONSTRATED +DEMONSTRATES +DEMONSTRATING +DEMONSTRATION +DEMONSTRATIONAL +DEMONSTRATIONS +DEMONSTRATIVE +DEMONSTRATIVELY +DEMONSTRATIVES +DEMONSTRATOR +DEMONSTRATORS +DEMORALIZATION +DEMORALIZATIONS +DEMORALIZE +DEMORALIZED +DEMORALIZER +DEMORALIZERS +DEMORALIZES +DEMORALIZING +DEMORALIZINGLY +DEMOS +DEMOSES +DEMOTE +DEMOTED +DEMOTES +DEMOTIC +DEMOTICS +DEMOTING +DEMOTION +DEMOTIONS +DEMOTIST +DEMOTISTS +DEMOUNT +DEMOUNTABLE +DEMOUNTED +DEMOUNTING +DEMOUNTS +DEMPSTER +DEMPSTERS +DEMULCENT +DEMULCENTS +DEMULSIFIED +DEMULSIFIES +DEMULSIFY +DEMULSIFYING +DEMULTIPLEXER +DEMULTIPLEXERS +DEMUR +DEMURE +DEMURELY +DEMURENESS +DEMURENESSES +DEMURER +DEMUREST +DEMURRAGE +DEMURRAGES +DEMURRAL +DEMURRALS +DEMURRED +DEMURRER +DEMURRERS +DEMURRING +DEMURS +DEMY +DEMYELINATING +DEMYELINATION +DEMYELINATIONS +DEMYSTIFICATION +DEMYSTIFIED +DEMYSTIFIES +DEMYSTIFY +DEMYSTIFYING +DEMYTHOLOGIZE +DEMYTHOLOGIZED +DEMYTHOLOGIZER +DEMYTHOLOGIZERS +DEMYTHOLOGIZES +DEMYTHOLOGIZING +DEN +DENAR +DENARI +DENARII +DENARIUS +DENARS +DENARY +DENATIONALIZE +DENATIONALIZED +DENATIONALIZES +DENATIONALIZING +DENATURALIZE +DENATURALIZED +DENATURALIZES +DENATURALIZING +DENATURANT +DENATURANTS +DENATURATION +DENATURATIONS +DENATURE +DENATURED +DENATURES +DENATURING +DENAZIFICATION +DENAZIFICATIONS +DENAZIFIED +DENAZIFIES +DENAZIFY +DENAZIFYING +DENDRIFORM +DENDRIMER +DENDRIMERS +DENDRITE +DENDRITES +DENDRITIC +DENDROGRAM +DENDROGRAMS +DENDROID +DENDROLOGIC +DENDROLOGICAL +DENDROLOGIES +DENDROLOGIST +DENDROLOGISTS +DENDROLOGY +DENDRON +DENDRONS +DENE +DENEGATION +DENEGATIONS +DENERVATE +DENERVATED +DENERVATES +DENERVATING +DENERVATION +DENERVATIONS +DENES +DENGUE +DENGUES +DENI +DENIABILITIES +DENIABILITY +DENIABLE +DENIABLY +DENIAL +DENIALS +DENIED +DENIER +DENIERS +DENIES +DENIGRATE +DENIGRATED +DENIGRATES +DENIGRATING +DENIGRATION +DENIGRATIONS +DENIGRATIVE +DENIGRATOR +DENIGRATORS +DENIGRATORY +DENIM +DENIMED +DENIMS +DENITRATE +DENITRATED +DENITRATES +DENITRATING +DENITRIFICATION +DENITRIFIED +DENITRIFIER +DENITRIFIERS +DENITRIFIES +DENITRIFY +DENITRIFYING +DENIZEN +DENIZENED +DENIZENING +DENIZENS +DENNED +DENNING +DENOMINAL +DENOMINATE +DENOMINATED +DENOMINATES +DENOMINATING +DENOMINATION +DENOMINATIONAL +DENOMINATIONS +DENOMINATIVE +DENOMINATIVES +DENOMINATOR +DENOMINATORS +DENOTABLE +DENOTATION +DENOTATIONS +DENOTATIVE +DENOTE +DENOTED +DENOTEMENT +DENOTEMENTS +DENOTES +DENOTING +DENOTIVE +DENOUEMENT +DENOUEMENTS +DENOUNCE +DENOUNCED +DENOUNCEMENT +DENOUNCEMENTS +DENOUNCER +DENOUNCERS +DENOUNCES +DENOUNCING +DENS +DENSE +DENSELY +DENSENESS +DENSENESSES +DENSER +DENSEST +DENSIFICATION +DENSIFICATIONS +DENSIFIED +DENSIFIES +DENSIFY +DENSIFYING +DENSITIES +DENSITOMETER +DENSITOMETERS +DENSITOMETRIC +DENSITOMETRIES +DENSITOMETRY +DENSITY +DENT +DENTAL +DENTALIA +DENTALITIES +DENTALITY +DENTALIUM +DENTALIUMS +DENTALLY +DENTALS +DENTATE +DENTATED +DENTATELY +DENTATION +DENTATIONS +DENTED +DENTICLE +DENTICLES +DENTICULATE +DENTICULATED +DENTICULATION +DENTICULATIONS +DENTIFORM +DENTIFRICE +DENTIFRICES +DENTIL +DENTILED +DENTILS +DENTIN +DENTINAL +DENTINE +DENTINES +DENTING +DENTINS +DENTIST +DENTISTRIES +DENTISTRY +DENTISTS +DENTITION +DENTITIONS +DENTOID +DENTS +DENTULOUS +DENTURAL +DENTURE +DENTURES +DENTURIST +DENTURISTS +DENUCLEARIZE +DENUCLEARIZED +DENUCLEARIZES +DENUCLEARIZING +DENUDATE +DENUDATED +DENUDATES +DENUDATING +DENUDATION +DENUDATIONS +DENUDE +DENUDED +DENUDEMENT +DENUDEMENTS +DENUDER +DENUDERS +DENUDES +DENUDING +DENUMERABILITY +DENUMERABLE +DENUMERABLY +DENUNCIATION +DENUNCIATIONS +DENUNCIATIVE +DENUNCIATORY +DENY +DENYING +DENYINGLY +DEODAND +DEODANDS +DEODAR +DEODARA +DEODARAS +DEODARS +DEODORANT +DEODORANTS +DEODORIZATION +DEODORIZATIONS +DEODORIZE +DEODORIZED +DEODORIZER +DEODORIZERS +DEODORIZES +DEODORIZING +DEONTIC +DEONTOLOGICAL +DEONTOLOGIES +DEONTOLOGIST +DEONTOLOGISTS +DEONTOLOGY +DEORBIT +DEORBITED +DEORBITING +DEORBITS +DEOXIDATION +DEOXIDATIONS +DEOXIDIZE +DEOXIDIZED +DEOXIDIZER +DEOXIDIZERS +DEOXIDIZES +DEOXIDIZING +DEOXY +DEOXYGENATE +DEOXYGENATED +DEOXYGENATES +DEOXYGENATING +DEOXYGENATION +DEOXYGENATIONS +DEOXYRIBOSE +DEOXYRIBOSES +DEPAINT +DEPAINTED +DEPAINTING +DEPAINTS +DEPART +DEPARTED +DEPARTEE +DEPARTEES +DEPARTING +DEPARTMENT +DEPARTMENTAL +DEPARTMENTALIZE +DEPARTMENTALLY +DEPARTMENTS +DEPARTS +DEPARTURE +DEPARTURES +DEPAUPERATE +DEPEND +DEPENDABILITIES +DEPENDABILITY +DEPENDABLE +DEPENDABLENESS +DEPENDABLY +DEPENDANCE +DEPENDANCES +DEPENDANT +DEPENDANTS +DEPENDED +DEPENDENCE +DEPENDENCES +DEPENDENCIES +DEPENDENCY +DEPENDENT +DEPENDENTLY +DEPENDENTS +DEPENDING +DEPENDS +DEPEOPLE +DEPEOPLED +DEPEOPLES +DEPEOPLING +DEPERM +DEPERMED +DEPERMING +DEPERMS +DEPERSONALIZE +DEPERSONALIZED +DEPERSONALIZES +DEPERSONALIZING +DEPHOSPHORYLATE +DEPICT +DEPICTED +DEPICTER +DEPICTERS +DEPICTING +DEPICTION +DEPICTIONS +DEPICTOR +DEPICTORS +DEPICTS +DEPIGMENTATION +DEPIGMENTATIONS +DEPILATE +DEPILATED +DEPILATES +DEPILATING +DEPILATION +DEPILATIONS +DEPILATOR +DEPILATORIES +DEPILATORS +DEPILATORY +DEPLANE +DEPLANED +DEPLANES +DEPLANING +DEPLETABLE +DEPLETE +DEPLETED +DEPLETER +DEPLETERS +DEPLETES +DEPLETING +DEPLETION +DEPLETIONS +DEPLETIVE +DEPLORABLE +DEPLORABLENESS +DEPLORABLY +DEPLORE +DEPLORED +DEPLORER +DEPLORERS +DEPLORES +DEPLORING +DEPLORINGLY +DEPLOY +DEPLOYABLE +DEPLOYED +DEPLOYER +DEPLOYERS +DEPLOYING +DEPLOYMENT +DEPLOYMENTS +DEPLOYS +DEPLUME +DEPLUMED +DEPLUMES +DEPLUMING +DEPOLARIZATION +DEPOLARIZATIONS +DEPOLARIZE +DEPOLARIZED +DEPOLARIZER +DEPOLARIZERS +DEPOLARIZES +DEPOLARIZING +DEPOLISH +DEPOLISHED +DEPOLISHES +DEPOLISHING +DEPOLITICIZE +DEPOLITICIZED +DEPOLITICIZES +DEPOLITICIZING +DEPOLYMERIZE +DEPOLYMERIZED +DEPOLYMERIZES +DEPOLYMERIZING +DEPONE +DEPONED +DEPONENT +DEPONENTS +DEPONES +DEPONING +DEPOPULATE +DEPOPULATED +DEPOPULATES +DEPOPULATING +DEPOPULATION +DEPOPULATIONS +DEPORT +DEPORTABLE +DEPORTATION +DEPORTATIONS +DEPORTED +DEPORTEE +DEPORTEES +DEPORTER +DEPORTERS +DEPORTING +DEPORTMENT +DEPORTMENTS +DEPORTS +DEPOSABLE +DEPOSAL +DEPOSALS +DEPOSE +DEPOSED +DEPOSER +DEPOSERS +DEPOSES +DEPOSING +DEPOSIT +DEPOSITARIES +DEPOSITARY +DEPOSITED +DEPOSITING +DEPOSITION +DEPOSITIONAL +DEPOSITIONS +DEPOSITOR +DEPOSITORIES +DEPOSITORS +DEPOSITORY +DEPOSITS +DEPOT +DEPOTS +DEPRAVATION +DEPRAVATIONS +DEPRAVE +DEPRAVED +DEPRAVEDLY +DEPRAVEDNESS +DEPRAVEDNESSES +DEPRAVEMENT +DEPRAVEMENTS +DEPRAVER +DEPRAVERS +DEPRAVES +DEPRAVING +DEPRAVITIES +DEPRAVITY +DEPRECATE +DEPRECATED +DEPRECATES +DEPRECATING +DEPRECATINGLY +DEPRECATION +DEPRECATIONS +DEPRECATORILY +DEPRECATORY +DEPRECIABLE +DEPRECIATE +DEPRECIATED +DEPRECIATES +DEPRECIATING +DEPRECIATINGLY +DEPRECIATION +DEPRECIATIONS +DEPRECIATIVE +DEPRECIATOR +DEPRECIATORS +DEPRECIATORY +DEPREDATE +DEPREDATED +DEPREDATES +DEPREDATING +DEPREDATION +DEPREDATIONS +DEPREDATOR +DEPREDATORS +DEPREDATORY +DEPRENYL +DEPRENYLS +DEPRESS +DEPRESSANT +DEPRESSANTS +DEPRESSED +DEPRESSES +DEPRESSIBLE +DEPRESSING +DEPRESSINGLY +DEPRESSION +DEPRESSIONS +DEPRESSIVE +DEPRESSIVELY +DEPRESSIVES +DEPRESSOR +DEPRESSORS +DEPRESSURIZE +DEPRESSURIZED +DEPRESSURIZES +DEPRESSURIZING +DEPRIVAL +DEPRIVALS +DEPRIVATION +DEPRIVATIONS +DEPRIVE +DEPRIVED +DEPRIVER +DEPRIVERS +DEPRIVES +DEPRIVING +DEPROGRAM +DEPROGRAMED +DEPROGRAMING +DEPROGRAMMED +DEPROGRAMMER +DEPROGRAMMERS +DEPROGRAMMING +DEPROGRAMS +DEPSIDE +DEPSIDES +DEPTH +DEPTHLESS +DEPTHS +DEPURATE +DEPURATED +DEPURATES +DEPURATING +DEPURATOR +DEPURATORS +DEPUTABLE +DEPUTATION +DEPUTATIONS +DEPUTE +DEPUTED +DEPUTES +DEPUTIES +DEPUTING +DEPUTIZATION +DEPUTIZATIONS +DEPUTIZE +DEPUTIZED +DEPUTIZES +DEPUTIZING +DEPUTY +DERACINATE +DERACINATED +DERACINATES +DERACINATING +DERACINATION +DERACINATIONS +DERAIGN +DERAIGNED +DERAIGNING +DERAIGNS +DERAIL +DERAILED +DERAILING +DERAILLEUR +DERAILLEURS +DERAILMENT +DERAILMENTS +DERAILS +DERANGE +DERANGED +DERANGEMENT +DERANGEMENTS +DERANGER +DERANGERS +DERANGES +DERANGING +DERAT +DERATE +DERATED +DERATES +DERATING +DERATS +DERATTED +DERATTING +DERAY +DERAYS +DERBIES +DERBY +DERE +DEREALIZATION +DEREALIZATIONS +DEREGULATE +DEREGULATED +DEREGULATES +DEREGULATING +DEREGULATION +DEREGULATIONS +DERELICT +DERELICTION +DERELICTIONS +DERELICTS +DEREPRESS +DEREPRESSED +DEREPRESSES +DEREPRESSING +DEREPRESSION +DEREPRESSIONS +DERIDE +DERIDED +DERIDER +DERIDERS +DERIDES +DERIDING +DERIDINGLY +DERINGER +DERINGERS +DERISIBLE +DERISION +DERISIONS +DERISIVE +DERISIVELY +DERISIVENESS +DERISIVENESSES +DERISORY +DERIVABLE +DERIVATE +DERIVATES +DERIVATION +DERIVATIONAL +DERIVATIONS +DERIVATIVE +DERIVATIVELY +DERIVATIVENESS +DERIVATIVES +DERIVATIZATION +DERIVATIZATIONS +DERIVATIZE +DERIVATIZED +DERIVATIZES +DERIVATIZING +DERIVE +DERIVED +DERIVER +DERIVERS +DERIVES +DERIVING +DERM +DERMA +DERMABRASION +DERMABRASIONS +DERMAL +DERMAS +DERMATITIS +DERMATITISES +DERMATOGEN +DERMATOGENS +DERMATOGLYPHIC +DERMATOGLYPHICS +DERMATOID +DERMATOLOGIC +DERMATOLOGICAL +DERMATOLOGIES +DERMATOLOGIST +DERMATOLOGISTS +DERMATOLOGY +DERMATOMAL +DERMATOME +DERMATOMES +DERMATOPHYTE +DERMATOPHYTES +DERMATOSES +DERMATOSIS +DERMESTID +DERMESTIDS +DERMIC +DERMIS +DERMISES +DERMOID +DERMOIDS +DERMS +DERNIER +DEROGATE +DEROGATED +DEROGATES +DEROGATING +DEROGATION +DEROGATIONS +DEROGATIVE +DEROGATORILY +DEROGATORY +DERRICK +DERRICKS +DERRIERE +DERRIERES +DERRIES +DERRINGER +DERRINGERS +DERRIS +DERRISES +DERRY +DERVISH +DERVISHES +DESACRALIZATION +DESACRALIZE +DESACRALIZED +DESACRALIZES +DESACRALIZING +DESALINATE +DESALINATED +DESALINATES +DESALINATING +DESALINATION +DESALINATIONS +DESALINATOR +DESALINATORS +DESALINIZATION +DESALINIZATIONS +DESALINIZE +DESALINIZED +DESALINIZES +DESALINIZING +DESALT +DESALTED +DESALTER +DESALTERS +DESALTING +DESALTS +DESAND +DESANDED +DESANDING +DESANDS +DESCANT +DESCANTED +DESCANTER +DESCANTERS +DESCANTING +DESCANTS +DESCEND +DESCENDANT +DESCENDANTS +DESCENDED +DESCENDENT +DESCENDENTS +DESCENDER +DESCENDERS +DESCENDIBLE +DESCENDING +DESCENDS +DESCENSION +DESCENSIONS +DESCENT +DESCENTS +DESCRIBABLE +DESCRIBE +DESCRIBED +DESCRIBER +DESCRIBERS +DESCRIBES +DESCRIBING +DESCRIED +DESCRIER +DESCRIERS +DESCRIES +DESCRIPTION +DESCRIPTIONS +DESCRIPTIVE +DESCRIPTIVELY +DESCRIPTIVENESS +DESCRIPTOR +DESCRIPTORS +DESCRY +DESCRYING +DESECRATE +DESECRATED +DESECRATER +DESECRATERS +DESECRATES +DESECRATING +DESECRATION +DESECRATIONS +DESECRATOR +DESECRATORS +DESEGREGATE +DESEGREGATED +DESEGREGATES +DESEGREGATING +DESEGREGATION +DESEGREGATIONS +DESELECT +DESELECTED +DESELECTING +DESELECTS +DESENSITIZATION +DESENSITIZE +DESENSITIZED +DESENSITIZER +DESENSITIZERS +DESENSITIZES +DESENSITIZING +DESERT +DESERTED +DESERTER +DESERTERS +DESERTIC +DESERTIFICATION +DESERTIFIED +DESERTIFIES +DESERTIFY +DESERTIFYING +DESERTING +DESERTION +DESERTIONS +DESERTS +DESERVE +DESERVED +DESERVEDLY +DESERVEDNESS +DESERVEDNESSES +DESERVER +DESERVERS +DESERVES +DESERVING +DESERVINGS +DESEX +DESEXED +DESEXES +DESEXING +DESEXUALIZATION +DESEXUALIZE +DESEXUALIZED +DESEXUALIZES +DESEXUALIZING +DESHABILLE +DESHABILLES +DESICCANT +DESICCANTS +DESICCATE +DESICCATED +DESICCATES +DESICCATING +DESICCATION +DESICCATIONS +DESICCATIVE +DESICCATOR +DESICCATORS +DESIDERATA +DESIDERATE +DESIDERATED +DESIDERATES +DESIDERATING +DESIDERATION +DESIDERATIONS +DESIDERATIVE +DESIDERATUM +DESIGN +DESIGNATE +DESIGNATED +DESIGNATES +DESIGNATING +DESIGNATION +DESIGNATIONS +DESIGNATIVE +DESIGNATOR +DESIGNATORS +DESIGNATORY +DESIGNED +DESIGNEDLY +DESIGNEE +DESIGNEES +DESIGNER +DESIGNERS +DESIGNING +DESIGNINGS +DESIGNMENT +DESIGNMENTS +DESIGNS +DESILVER +DESILVERED +DESILVERING +DESILVERS +DESINENCE +DESINENCES +DESINENT +DESIPRAMINE +DESIPRAMINES +DESIRABILITIES +DESIRABILITY +DESIRABLE +DESIRABLENESS +DESIRABLENESSES +DESIRABLES +DESIRABLY +DESIRE +DESIRED +DESIRER +DESIRERS +DESIRES +DESIRING +DESIROUS +DESIROUSLY +DESIROUSNESS +DESIROUSNESSES +DESIST +DESISTANCE +DESISTANCES +DESISTED +DESISTING +DESISTS +DESK +DESKBOUND +DESKMAN +DESKMEN +DESKS +DESKTOP +DESKTOPS +DESMAN +DESMANS +DESMID +DESMIDIAN +DESMIDS +DESMOID +DESMOIDS +DESMOSOMAL +DESMOSOME +DESMOSOMES +DESOLATE +DESOLATED +DESOLATELY +DESOLATENESS +DESOLATENESSES +DESOLATER +DESOLATERS +DESOLATES +DESOLATING +DESOLATINGLY +DESOLATION +DESOLATIONS +DESOLATOR +DESOLATORS +DESORB +DESORBED +DESORBING +DESORBS +DESORPTION +DESORPTIONS +DESOXY +DESPAIR +DESPAIRED +DESPAIRER +DESPAIRERS +DESPAIRING +DESPAIRINGLY +DESPAIRS +DESPATCH +DESPATCHED +DESPATCHES +DESPATCHING +DESPERADO +DESPERADOES +DESPERADOS +DESPERATE +DESPERATELY +DESPERATENESS +DESPERATENESSES +DESPERATION +DESPERATIONS +DESPICABLE +DESPICABLENESS +DESPICABLY +DESPIRITUALIZE +DESPIRITUALIZED +DESPIRITUALIZES +DESPISAL +DESPISALS +DESPISE +DESPISED +DESPISEMENT +DESPISEMENTS +DESPISER +DESPISERS +DESPISES +DESPISING +DESPITE +DESPITED +DESPITEFUL +DESPITEFULLY +DESPITEFULNESS +DESPITEOUS +DESPITEOUSLY +DESPITES +DESPITING +DESPOIL +DESPOILED +DESPOILER +DESPOILERS +DESPOILING +DESPOILMENT +DESPOILMENTS +DESPOILS +DESPOLIATION +DESPOLIATIONS +DESPOND +DESPONDED +DESPONDENCE +DESPONDENCES +DESPONDENCIES +DESPONDENCY +DESPONDENT +DESPONDENTLY +DESPONDING +DESPONDS +DESPOT +DESPOTIC +DESPOTICALLY +DESPOTISM +DESPOTISMS +DESPOTS +DESPUMATE +DESPUMATED +DESPUMATES +DESPUMATING +DESQUAMATE +DESQUAMATED +DESQUAMATES +DESQUAMATING +DESQUAMATION +DESQUAMATIONS +DESSERT +DESSERTS +DESSERTSPOON +DESSERTSPOONFUL +DESSERTSPOONS +DESTABILIZATION +DESTABILIZE +DESTABILIZED +DESTABILIZES +DESTABILIZING +DESTAIN +DESTAINED +DESTAINING +DESTAINS +DESTINATION +DESTINATIONS +DESTINE +DESTINED +DESTINES +DESTINIES +DESTINING +DESTINY +DESTITUTE +DESTITUTED +DESTITUTENESS +DESTITUTENESSES +DESTITUTES +DESTITUTING +DESTITUTION +DESTITUTIONS +DESTRIER +DESTRIERS +DESTROY +DESTROYED +DESTROYER +DESTROYERS +DESTROYING +DESTROYS +DESTRUCT +DESTRUCTED +DESTRUCTIBILITY +DESTRUCTIBLE +DESTRUCTING +DESTRUCTION +DESTRUCTIONIST +DESTRUCTIONISTS +DESTRUCTIONS +DESTRUCTIVE +DESTRUCTIVELY +DESTRUCTIVENESS +DESTRUCTIVITIES +DESTRUCTIVITY +DESTRUCTS +DESUETUDE +DESUETUDES +DESUGAR +DESUGARED +DESUGARING +DESUGARS +DESULFUR +DESULFURED +DESULFURING +DESULFURIZATION +DESULFURIZE +DESULFURIZED +DESULFURIZES +DESULFURIZING +DESULFURS +DESULTORILY +DESULTORINESS +DESULTORINESSES +DESULTORY +DETACH +DETACHABILITIES +DETACHABILITY +DETACHABLE +DETACHABLY +DETACHED +DETACHEDLY +DETACHEDNESS +DETACHEDNESSES +DETACHER +DETACHERS +DETACHES +DETACHING +DETACHMENT +DETACHMENTS +DETAIL +DETAILED +DETAILEDLY +DETAILEDNESS +DETAILEDNESSES +DETAILER +DETAILERS +DETAILING +DETAILINGS +DETAILS +DETAIN +DETAINED +DETAINEE +DETAINEES +DETAINER +DETAINERS +DETAINING +DETAINMENT +DETAINMENTS +DETAINS +DETASSEL +DETASSELED +DETASSELING +DETASSELLED +DETASSELLING +DETASSELS +DETECT +DETECTABILITIES +DETECTABILITY +DETECTABLE +DETECTED +DETECTER +DETECTERS +DETECTING +DETECTION +DETECTIONS +DETECTIVE +DETECTIVELIKE +DETECTIVES +DETECTOR +DETECTORS +DETECTS +DETENT +DETENTE +DETENTES +DETENTION +DETENTIONS +DETENTIST +DETENTISTS +DETENTS +DETER +DETERGE +DETERGED +DETERGENCIES +DETERGENCY +DETERGENT +DETERGENTS +DETERGER +DETERGERS +DETERGES +DETERGING +DETERIORATE +DETERIORATED +DETERIORATES +DETERIORATING +DETERIORATION +DETERIORATIONS +DETERIORATIVE +DETERMENT +DETERMENTS +DETERMINABLE +DETERMINABLY +DETERMINACIES +DETERMINACY +DETERMINANT +DETERMINANTAL +DETERMINANTS +DETERMINATE +DETERMINATELY +DETERMINATENESS +DETERMINATION +DETERMINATIONS +DETERMINATIVE +DETERMINATIVES +DETERMINATOR +DETERMINATORS +DETERMINE +DETERMINED +DETERMINEDLY +DETERMINEDNESS +DETERMINER +DETERMINERS +DETERMINES +DETERMINING +DETERMINISM +DETERMINISMS +DETERMINIST +DETERMINISTIC +DETERMINISTS +DETERRABILITIES +DETERRABILITY +DETERRABLE +DETERRED +DETERRENCE +DETERRENCES +DETERRENT +DETERRENTLY +DETERRENTS +DETERRER +DETERRERS +DETERRING +DETERS +DETERSIVE +DETERSIVES +DETEST +DETESTABLE +DETESTABLENESS +DETESTABLY +DETESTATION +DETESTATIONS +DETESTED +DETESTER +DETESTERS +DETESTING +DETESTS +DETHATCH +DETHATCHED +DETHATCHES +DETHATCHING +DETHRONE +DETHRONED +DETHRONEMENT +DETHRONEMENTS +DETHRONER +DETHRONERS +DETHRONES +DETHRONING +DETICK +DETICKED +DETICKER +DETICKERS +DETICKING +DETICKS +DETINUE +DETINUES +DETONABILITIES +DETONABILITY +DETONABLE +DETONATABLE +DETONATE +DETONATED +DETONATES +DETONATING +DETONATION +DETONATIONS +DETONATIVE +DETONATOR +DETONATORS +DETOUR +DETOURED +DETOURING +DETOURS +DETOX +DETOXED +DETOXES +DETOXICANT +DETOXICANTS +DETOXICATE +DETOXICATED +DETOXICATES +DETOXICATING +DETOXICATION +DETOXICATIONS +DETOXIFICATION +DETOXIFICATIONS +DETOXIFIED +DETOXIFIES +DETOXIFY +DETOXIFYING +DETOXING +DETRACT +DETRACTED +DETRACTING +DETRACTION +DETRACTIONS +DETRACTIVE +DETRACTIVELY +DETRACTOR +DETRACTORS +DETRACTS +DETRAIN +DETRAINED +DETRAINING +DETRAINMENT +DETRAINMENTS +DETRAINS +DETRIBALIZATION +DETRIBALIZE +DETRIBALIZED +DETRIBALIZES +DETRIBALIZING +DETRIMENT +DETRIMENTAL +DETRIMENTALLY +DETRIMENTALS +DETRIMENTS +DETRITAL +DETRITION +DETRITIONS +DETRITUS +DETRUDE +DETRUDED +DETRUDES +DETRUDING +DETRUSION +DETRUSIONS +DETUMESCENCE +DETUMESCENCES +DETUMESCENT +DEUCE +DEUCED +DEUCEDLY +DEUCES +DEUCING +DEUTERAGONIST +DEUTERAGONISTS +DEUTERANOMALIES +DEUTERANOMALOUS +DEUTERANOMALY +DEUTERANOPE +DEUTERANOPES +DEUTERANOPIA +DEUTERANOPIAS +DEUTERANOPIC +DEUTERATE +DEUTERATED +DEUTERATES +DEUTERATING +DEUTERATION +DEUTERATIONS +DEUTERIC +DEUTERIDE +DEUTERIDES +DEUTERIUM +DEUTERIUMS +DEUTERON +DEUTERONS +DEUTEROSTOME +DEUTEROSTOMES +DEUTOPLASM +DEUTOPLASMS +DEUTZIA +DEUTZIAS +DEV +DEVA +DEVALUATE +DEVALUATED +DEVALUATES +DEVALUATING +DEVALUATION +DEVALUATIONS +DEVALUE +DEVALUED +DEVALUES +DEVALUING +DEVAS +DEVASTATE +DEVASTATED +DEVASTATES +DEVASTATING +DEVASTATINGLY +DEVASTATION +DEVASTATIONS +DEVASTATIVE +DEVASTATOR +DEVASTATORS +DEVEIN +DEVEINED +DEVEINING +DEVEINS +DEVEL +DEVELED +DEVELING +DEVELOP +DEVELOPABLE +DEVELOPE +DEVELOPED +DEVELOPER +DEVELOPERS +DEVELOPES +DEVELOPING +DEVELOPMENT +DEVELOPMENTAL +DEVELOPMENTALLY +DEVELOPMENTS +DEVELOPPE +DEVELOPPES +DEVELOPS +DEVELS +DEVERBAL +DEVERBALS +DEVERBATIVE +DEVERBATIVES +DEVEST +DEVESTED +DEVESTING +DEVESTS +DEVIANCE +DEVIANCES +DEVIANCIES +DEVIANCY +DEVIANT +DEVIANTS +DEVIATE +DEVIATED +DEVIATES +DEVIATING +DEVIATION +DEVIATIONISM +DEVIATIONISMS +DEVIATIONIST +DEVIATIONISTS +DEVIATIONS +DEVIATIVE +DEVIATOR +DEVIATORS +DEVIATORY +DEVICE +DEVICES +DEVIL +DEVILED +DEVILFISH +DEVILFISHES +DEVILING +DEVILISH +DEVILISHLY +DEVILISHNESS +DEVILISHNESSES +DEVILKIN +DEVILKINS +DEVILLED +DEVILLING +DEVILMENT +DEVILMENTS +DEVILRIES +DEVILRY +DEVILS +DEVILTRIES +DEVILTRY +DEVILWOOD +DEVILWOODS +DEVIOUS +DEVIOUSLY +DEVIOUSNESS +DEVIOUSNESSES +DEVISABLE +DEVISAL +DEVISALS +DEVISE +DEVISED +DEVISEE +DEVISEES +DEVISER +DEVISERS +DEVISES +DEVISING +DEVISOR +DEVISORS +DEVITALIZE +DEVITALIZED +DEVITALIZES +DEVITALIZING +DEVITRIFICATION +DEVITRIFIED +DEVITRIFIES +DEVITRIFY +DEVITRIFYING +DEVOCALIZE +DEVOCALIZED +DEVOCALIZES +DEVOCALIZING +DEVOICE +DEVOICED +DEVOICES +DEVOICING +DEVOID +DEVOIR +DEVOIRS +DEVOLUTION +DEVOLUTIONARY +DEVOLUTIONIST +DEVOLUTIONISTS +DEVOLUTIONS +DEVOLVE +DEVOLVED +DEVOLVES +DEVOLVING +DEVON +DEVONIAN +DEVONS +DEVOTE +DEVOTED +DEVOTEDLY +DEVOTEDNESS +DEVOTEDNESSES +DEVOTEE +DEVOTEES +DEVOTEMENT +DEVOTEMENTS +DEVOTES +DEVOTING +DEVOTION +DEVOTIONAL +DEVOTIONALLY +DEVOTIONALS +DEVOTIONS +DEVOUR +DEVOURED +DEVOURER +DEVOURERS +DEVOURING +DEVOURS +DEVOUT +DEVOUTER +DEVOUTEST +DEVOUTLY +DEVOUTNESS +DEVOUTNESSES +DEVS +DEW +DEWAN +DEWANS +DEWAR +DEWARS +DEWATER +DEWATERED +DEWATERER +DEWATERERS +DEWATERING +DEWATERS +DEWAX +DEWAXED +DEWAXES +DEWAXING +DEWBERRIES +DEWBERRY +DEWCLAW +DEWCLAWED +DEWCLAWS +DEWDROP +DEWDROPS +DEWED +DEWFALL +DEWFALLS +DEWIER +DEWIEST +DEWILY +DEWINESS +DEWINESSES +DEWING +DEWLAP +DEWLAPPED +DEWLAPS +DEWLESS +DEWOOL +DEWOOLED +DEWOOLING +DEWOOLS +DEWORM +DEWORMED +DEWORMER +DEWORMERS +DEWORMING +DEWORMS +DEWS +DEWY +DEX +DEXAMETHASONE +DEXAMETHASONES +DEXES +DEXIE +DEXIES +DEXTER +DEXTERITIES +DEXTERITY +DEXTEROUS +DEXTEROUSLY +DEXTEROUSNESS +DEXTEROUSNESSES +DEXTRAL +DEXTRALLY +DEXTRAN +DEXTRANASE +DEXTRANASES +DEXTRANS +DEXTRIN +DEXTRINE +DEXTRINES +DEXTRINS +DEXTRO +DEXTROROTARY +DEXTROROTATORY +DEXTRORSE +DEXTROSE +DEXTROSES +DEXTROUS +DEXY +DEY +DEYS +DEZINC +DEZINCED +DEZINCING +DEZINCKED +DEZINCKING +DEZINCS +DHAK +DHAKS +DHAL +DHALS +DHARMA +DHARMAS +DHARMIC +DHARNA +DHARNAS +DHOBI +DHOBIS +DHOLE +DHOLES +DHOOLIES +DHOOLY +DHOORA +DHOORAS +DHOOTI +DHOOTIE +DHOOTIES +DHOOTIS +DHOTI +DHOTIS +DHOURRA +DHOURRAS +DHOW +DHOWS +DHURNA +DHURNAS +DHURRIE +DHURRIES +DHUTI +DHUTIS +DIABASE +DIABASES +DIABASIC +DIABETES +DIABETIC +DIABETICS +DIABETOGENIC +DIABETOLOGIST +DIABETOLOGISTS +DIABLERIE +DIABLERIES +DIABLERY +DIABOLIC +DIABOLICAL +DIABOLICALLY +DIABOLICALNESS +DIABOLISM +DIABOLISMS +DIABOLIST +DIABOLISTS +DIABOLIZE +DIABOLIZED +DIABOLIZES +DIABOLIZING +DIABOLO +DIABOLOS +DIACETYL +DIACETYLS +DIACHRONIC +DIACHRONICALLY +DIACHRONIES +DIACHRONY +DIACID +DIACIDIC +DIACIDS +DIACONAL +DIACONATE +DIACONATES +DIACRITIC +DIACRITICAL +DIACRITICS +DIACTINIC +DIADELPHOUS +DIADEM +DIADEMED +DIADEMING +DIADEMS +DIADROMOUS +DIAERESES +DIAERESIS +DIAERETIC +DIAGENESES +DIAGENESIS +DIAGENETIC +DIAGENETICALLY +DIAGEOTROPIC +DIAGNOSABLE +DIAGNOSE +DIAGNOSEABLE +DIAGNOSED +DIAGNOSES +DIAGNOSING +DIAGNOSIS +DIAGNOSTIC +DIAGNOSTICAL +DIAGNOSTICALLY +DIAGNOSTICIAN +DIAGNOSTICIANS +DIAGNOSTICS +DIAGONAL +DIAGONALIZABLE +DIAGONALIZATION +DIAGONALIZE +DIAGONALIZED +DIAGONALIZES +DIAGONALIZING +DIAGONALLY +DIAGONALS +DIAGRAM +DIAGRAMED +DIAGRAMING +DIAGRAMMABLE +DIAGRAMMATIC +DIAGRAMMATICAL +DIAGRAMMED +DIAGRAMMING +DIAGRAMS +DIAGRAPH +DIAGRAPHS +DIAKINESES +DIAKINESIS +DIAL +DIALECT +DIALECTAL +DIALECTALLY +DIALECTIC +DIALECTICAL +DIALECTICALLY +DIALECTICIAN +DIALECTICIANS +DIALECTICS +DIALECTOLOGICAL +DIALECTOLOGIES +DIALECTOLOGIST +DIALECTOLOGISTS +DIALECTOLOGY +DIALECTS +DIALED +DIALER +DIALERS +DIALING +DIALINGS +DIALIST +DIALISTS +DIALLAGE +DIALLAGES +DIALLED +DIALLEL +DIALLER +DIALLERS +DIALLING +DIALLINGS +DIALLIST +DIALLISTS +DIALOG +DIALOGED +DIALOGER +DIALOGERS +DIALOGIC +DIALOGICAL +DIALOGICALLY +DIALOGING +DIALOGIST +DIALOGISTIC +DIALOGISTS +DIALOGS +DIALOGUE +DIALOGUED +DIALOGUER +DIALOGUERS +DIALOGUES +DIALOGUING +DIALS +DIALYSATE +DIALYSATES +DIALYSE +DIALYSED +DIALYSER +DIALYSERS +DIALYSES +DIALYSING +DIALYSIS +DIALYTIC +DIALYZABLE +DIALYZATE +DIALYZATES +DIALYZE +DIALYZED +DIALYZER +DIALYZERS +DIALYZES +DIALYZING +DIAMAGNET +DIAMAGNETIC +DIAMAGNETISM +DIAMAGNETISMS +DIAMAGNETS +DIAMANTE +DIAMANTES +DIAMETER +DIAMETERS +DIAMETRAL +DIAMETRIC +DIAMETRICAL +DIAMETRICALLY +DIAMIDE +DIAMIDES +DIAMIN +DIAMINE +DIAMINES +DIAMINS +DIAMOND +DIAMONDBACK +DIAMONDBACKS +DIAMONDED +DIAMONDIFEROUS +DIAMONDING +DIAMONDS +DIANDROUS +DIANTHUS +DIANTHUSES +DIAPASON +DIAPASONS +DIAPAUSE +DIAPAUSED +DIAPAUSES +DIAPAUSING +DIAPEDESES +DIAPEDESIS +DIAPER +DIAPERED +DIAPERING +DIAPERS +DIAPHANEITIES +DIAPHANEITY +DIAPHANOUS +DIAPHANOUSLY +DIAPHANOUSNESS +DIAPHONE +DIAPHONES +DIAPHONIES +DIAPHONY +DIAPHORASE +DIAPHORASES +DIAPHORESES +DIAPHORESIS +DIAPHORETIC +DIAPHORETICS +DIAPHRAGM +DIAPHRAGMATIC +DIAPHRAGMED +DIAPHRAGMING +DIAPHRAGMS +DIAPHYSEAL +DIAPHYSES +DIAPHYSIAL +DIAPHYSIS +DIAPIR +DIAPIRIC +DIAPIRS +DIAPOSITIVE +DIAPOSITIVES +DIAPSID +DIAPSIDS +DIARCHIC +DIARCHIES +DIARCHY +DIARIES +DIARIST +DIARISTIC +DIARISTS +DIARRHEA +DIARRHEAL +DIARRHEAS +DIARRHEIC +DIARRHETIC +DIARRHOEA +DIARRHOEAS +DIARTHROSES +DIARTHROSIS +DIARY +DIASPORA +DIASPORAS +DIASPORE +DIASPORES +DIASPORIC +DIASTASE +DIASTASES +DIASTASIC +DIASTATIC +DIASTEM +DIASTEMA +DIASTEMAS +DIASTEMATA +DIASTEMS +DIASTER +DIASTEREOISOMER +DIASTEREOMER +DIASTEREOMERIC +DIASTEREOMERS +DIASTERS +DIASTOLE +DIASTOLES +DIASTOLIC +DIASTRAL +DIASTROPHIC +DIASTROPHICALLY +DIASTROPHISM +DIASTROPHISMS +DIATESSARON +DIATESSARONS +DIATHERMANOUS +DIATHERMIC +DIATHERMIES +DIATHERMY +DIATHESES +DIATHESIS +DIATHETIC +DIATOM +DIATOMACEOUS +DIATOMIC +DIATOMITE +DIATOMITES +DIATOMS +DIATONIC +DIATONICALLY +DIATRIBE +DIATRIBES +DIATRON +DIATRONS +DIATROPIC +DIAZEPAM +DIAZEPAMS +DIAZIN +DIAZINE +DIAZINES +DIAZINON +DIAZINONS +DIAZINS +DIAZO +DIAZOLE +DIAZOLES +DIAZONIUM +DIAZONIUMS +DIAZOTIZATION +DIAZOTIZATIONS +DIAZOTIZE +DIAZOTIZED +DIAZOTIZES +DIAZOTIZING +DIB +DIBASIC +DIBBED +DIBBER +DIBBERS +DIBBING +DIBBLE +DIBBLED +DIBBLER +DIBBLERS +DIBBLES +DIBBLING +DIBBUK +DIBBUKIM +DIBBUKS +DIBENZOFURAN +DIBENZOFURANS +DIBROMIDE +DIBROMIDES +DIBS +DICAMBA +DICAMBAS +DICARBOXYLIC +DICAST +DICASTIC +DICASTS +DICE +DICED +DICENTRA +DICENTRAS +DICENTRIC +DICENTRICS +DICER +DICERS +DICES +DICEY +DICHASIA +DICHASIAL +DICHASIUM +DICHLOROBENZENE +DICHLOROETHANE +DICHLOROETHANES +DICHLORVOS +DICHLORVOSES +DICHOGAMIES +DICHOGAMOUS +DICHOGAMY +DICHONDRA +DICHONDRAS +DICHOTIC +DICHOTICALLY +DICHOTOMIES +DICHOTOMIST +DICHOTOMISTS +DICHOTOMIZATION +DICHOTOMIZE +DICHOTOMIZED +DICHOTOMIZES +DICHOTOMIZING +DICHOTOMOUS +DICHOTOMOUSLY +DICHOTOMOUSNESS +DICHOTOMY +DICHROIC +DICHROISM +DICHROISMS +DICHROITE +DICHROITES +DICHROMAT +DICHROMATE +DICHROMATES +DICHROMATIC +DICHROMATISM +DICHROMATISMS +DICHROMATS +DICHROMIC +DICHROSCOPE +DICHROSCOPES +DICIER +DICIEST +DICING +DICK +DICKCISSEL +DICKCISSELS +DICKED +DICKENS +DICKENSES +DICKER +DICKERED +DICKERING +DICKERS +DICKEY +DICKEYS +DICKHEAD +DICKHEADS +DICKIE +DICKIER +DICKIES +DICKIEST +DICKING +DICKS +DICKY +DICLINIES +DICLINISM +DICLINISMS +DICLINOUS +DICLINY +DICOT +DICOTS +DICOTYL +DICOTYLEDON +DICOTYLEDONOUS +DICOTYLEDONS +DICOTYLS +DICOUMARIN +DICOUMARINS +DICOUMAROL +DICOUMAROLS +DICROTAL +DICROTIC +DICROTISM +DICROTISMS +DICTA +DICTATE +DICTATED +DICTATES +DICTATING +DICTATION +DICTATIONS +DICTATOR +DICTATORIAL +DICTATORIALLY +DICTATORIALNESS +DICTATORS +DICTATORSHIP +DICTATORSHIPS +DICTIER +DICTIEST +DICTION +DICTIONAL +DICTIONALLY +DICTIONARIES +DICTIONARY +DICTIONS +DICTUM +DICTUMS +DICTY +DICTYOSOME +DICTYOSOMES +DICTYOSTELE +DICTYOSTELES +DICUMAROL +DICUMAROLS +DICYCLIC +DICYCLIES +DICYCLY +DICYNODONT +DICYNODONTS +DID +DIDACT +DIDACTIC +DIDACTICAL +DIDACTICALLY +DIDACTICISM +DIDACTICISMS +DIDACTICS +DIDACTS +DIDACTYL +DIDAPPER +DIDAPPERS +DIDDLE +DIDDLED +DIDDLER +DIDDLERS +DIDDLES +DIDDLEY +DIDDLEYS +DIDDLIES +DIDDLING +DIDDLY +DIDGERIDOO +DIDGERIDOOS +DIDIE +DIDIES +DIDJERIDOO +DIDJERIDOOS +DIDJERIDU +DIDJERIDUS +DIDO +DIDOES +DIDOS +DIDST +DIDY +DIDYMIUM +DIDYMIUMS +DIDYMOUS +DIDYNAMIES +DIDYNAMY +DIE +DIEBACK +DIEBACKS +DIECIOUS +DIED +DIEFFENBACHIA +DIEFFENBACHIAS +DIEHARD +DIEHARDS +DIEING +DIEL +DIELDRIN +DIELDRINS +DIELECTRIC +DIELECTRICS +DIEMAKER +DIEMAKERS +DIENCEPHALA +DIENCEPHALIC +DIENCEPHALON +DIENE +DIENES +DIEOFF +DIEOFFS +DIERESES +DIERESIS +DIERETIC +DIES +DIESEL +DIESELED +DIESELING +DIESELINGS +DIESELIZATION +DIESELIZATIONS +DIESELIZE +DIESELIZED +DIESELIZES +DIESELIZING +DIESELS +DIESES +DIESINKER +DIESINKERS +DIESIS +DIESTER +DIESTERS +DIESTOCK +DIESTOCKS +DIESTROUS +DIESTRUM +DIESTRUMS +DIESTRUS +DIESTRUSES +DIET +DIETARIES +DIETARILY +DIETARY +DIETED +DIETER +DIETERS +DIETETIC +DIETETICALLY +DIETETICS +DIETHER +DIETHERS +DIETICIAN +DIETICIANS +DIETING +DIETITIAN +DIETITIANS +DIETS +DIF +DIFF +DIFFER +DIFFERED +DIFFERENCE +DIFFERENCED +DIFFERENCES +DIFFERENCING +DIFFERENT +DIFFERENTIA +DIFFERENTIABLE +DIFFERENTIAE +DIFFERENTIAL +DIFFERENTIALLY +DIFFERENTIALS +DIFFERENTIATE +DIFFERENTIATED +DIFFERENTIATES +DIFFERENTIATING +DIFFERENTIATION +DIFFERENTLY +DIFFERENTNESS +DIFFERENTNESSES +DIFFERING +DIFFERS +DIFFICILE +DIFFICULT +DIFFICULTIES +DIFFICULTLY +DIFFICULTY +DIFFIDENCE +DIFFIDENCES +DIFFIDENT +DIFFIDENTLY +DIFFRACT +DIFFRACTED +DIFFRACTING +DIFFRACTION +DIFFRACTIONS +DIFFRACTOMETER +DIFFRACTOMETERS +DIFFRACTOMETRIC +DIFFRACTOMETRY +DIFFRACTS +DIFFS +DIFFUSE +DIFFUSED +DIFFUSELY +DIFFUSENESS +DIFFUSENESSES +DIFFUSER +DIFFUSERS +DIFFUSES +DIFFUSIBLE +DIFFUSING +DIFFUSION +DIFFUSIONAL +DIFFUSIONISM +DIFFUSIONISMS +DIFFUSIONIST +DIFFUSIONISTS +DIFFUSIONS +DIFFUSIVE +DIFFUSIVELY +DIFFUSIVENESS +DIFFUSIVENESSES +DIFFUSIVITIES +DIFFUSIVITY +DIFFUSOR +DIFFUSORS +DIFS +DIFUNCTIONAL +DIG +DIGAMIES +DIGAMIST +DIGAMISTS +DIGAMMA +DIGAMMAS +DIGAMOUS +DIGAMY +DIGASTRIC +DIGASTRICS +DIGENESES +DIGENESIS +DIGENETIC +DIGERATI +DIGEST +DIGESTED +DIGESTER +DIGESTERS +DIGESTIBILITIES +DIGESTIBILITY +DIGESTIBLE +DIGESTIF +DIGESTIFS +DIGESTING +DIGESTION +DIGESTIONS +DIGESTIVE +DIGESTIVELY +DIGESTIVES +DIGESTOR +DIGESTORS +DIGESTS +DIGGED +DIGGER +DIGGERS +DIGGING +DIGGINGS +DIGHT +DIGHTED +DIGHTING +DIGHTS +DIGIT +DIGITAL +DIGITALIN +DIGITALINS +DIGITALIS +DIGITALISES +DIGITALIZATION +DIGITALIZATIONS +DIGITALIZE +DIGITALIZED +DIGITALIZES +DIGITALIZING +DIGITALLY +DIGITALS +DIGITATE +DIGITATED +DIGITATELY +DIGITIGRADE +DIGITIZATION +DIGITIZATIONS +DIGITIZE +DIGITIZED +DIGITIZER +DIGITIZERS +DIGITIZES +DIGITIZING +DIGITONIN +DIGITONINS +DIGITOXIGENIN +DIGITOXIGENINS +DIGITOXIN +DIGITOXINS +DIGITS +DIGLOSSIA +DIGLOSSIAS +DIGLOSSIC +DIGLOT +DIGLOTS +DIGLYCERIDE +DIGLYCERIDES +DIGNIFIED +DIGNIFIES +DIGNIFY +DIGNIFYING +DIGNITARIES +DIGNITARY +DIGNITIES +DIGNITY +DIGOXIN +DIGOXINS +DIGRAPH +DIGRAPHIC +DIGRAPHICALLY +DIGRAPHS +DIGRESS +DIGRESSED +DIGRESSES +DIGRESSING +DIGRESSION +DIGRESSIONAL +DIGRESSIONARY +DIGRESSIONS +DIGRESSIVE +DIGRESSIVELY +DIGRESSIVENESS +DIGS +DIHEDRAL +DIHEDRALS +DIHEDRON +DIHEDRONS +DIHYBRID +DIHYBRIDS +DIHYDRIC +DIKDIK +DIKDIKS +DIKE +DIKED +DIKER +DIKERS +DIKES +DIKEY +DIKING +DIKTAT +DIKTATS +DILAPIDATE +DILAPIDATED +DILAPIDATES +DILAPIDATING +DILAPIDATION +DILAPIDATIONS +DILATABILITIES +DILATABILITY +DILATABLE +DILATABLY +DILATANCIES +DILATANCY +DILATANT +DILATANTS +DILATATE +DILATATION +DILATATIONAL +DILATATIONS +DILATATOR +DILATATORS +DILATE +DILATED +DILATER +DILATERS +DILATES +DILATING +DILATION +DILATIONS +DILATIVE +DILATOMETER +DILATOMETERS +DILATOMETRIC +DILATOMETRIES +DILATOMETRY +DILATOR +DILATORILY +DILATORINESS +DILATORINESSES +DILATORS +DILATORY +DILDO +DILDOE +DILDOES +DILDOS +DILEMMA +DILEMMAS +DILEMMATIC +DILEMMIC +DILETTANTE +DILETTANTES +DILETTANTI +DILETTANTISH +DILETTANTISM +DILETTANTISMS +DILIGENCE +DILIGENCES +DILIGENT +DILIGENTLY +DILL +DILLED +DILLIES +DILLS +DILLY +DILLYDALLIED +DILLYDALLIES +DILLYDALLY +DILLYDALLYING +DILTIAZEM +DILTIAZEMS +DILUENT +DILUENTS +DILUTE +DILUTED +DILUTENESS +DILUTENESSES +DILUTER +DILUTERS +DILUTES +DILUTING +DILUTION +DILUTIONS +DILUTIVE +DILUTOR +DILUTORS +DILUVIA +DILUVIAL +DILUVIAN +DILUVION +DILUVIONS +DILUVIUM +DILUVIUMS +DIM +DIME +DIMENHYDRINATE +DIMENHYDRINATES +DIMENSION +DIMENSIONAL +DIMENSIONALITY +DIMENSIONALLY +DIMENSIONED +DIMENSIONING +DIMENSIONLESS +DIMENSIONS +DIMER +DIMERCAPROL +DIMERCAPROLS +DIMERIC +DIMERISM +DIMERISMS +DIMERIZATION +DIMERIZATIONS +DIMERIZE +DIMERIZED +DIMERIZES +DIMERIZING +DIMEROUS +DIMERS +DIMES +DIMETER +DIMETERS +DIMETHOATE +DIMETHOATES +DIMETHYL +DIMETHYLS +DIMETRIC +DIMIDIATE +DIMIDIATED +DIMIDIATES +DIMIDIATING +DIMINISH +DIMINISHABLE +DIMINISHED +DIMINISHES +DIMINISHING +DIMINISHMENT +DIMINISHMENTS +DIMINUENDO +DIMINUENDOS +DIMINUTION +DIMINUTIONS +DIMINUTIVE +DIMINUTIVELY +DIMINUTIVENESS +DIMINUTIVES +DIMITIES +DIMITY +DIMLY +DIMMABLE +DIMMED +DIMMER +DIMMERS +DIMMEST +DIMMING +DIMNESS +DIMNESSES +DIMORPH +DIMORPHIC +DIMORPHISM +DIMORPHISMS +DIMORPHOUS +DIMORPHS +DIMOUT +DIMOUTS +DIMPLE +DIMPLED +DIMPLES +DIMPLIER +DIMPLIEST +DIMPLING +DIMPLY +DIMS +DIMWIT +DIMWITS +DIMWITTED +DIN +DINAR +DINARS +DINDLE +DINDLED +DINDLES +DINDLING +DINE +DINED +DINER +DINERIC +DINERO +DINEROS +DINERS +DINES +DINETTE +DINETTES +DING +DINGBAT +DINGBATS +DINGDONG +DINGDONGED +DINGDONGING +DINGDONGS +DINGE +DINGED +DINGER +DINGERS +DINGES +DINGEY +DINGEYS +DINGHIES +DINGHY +DINGIER +DINGIES +DINGIEST +DINGILY +DINGINESS +DINGINESSES +DINGING +DINGLE +DINGLEBERRIES +DINGLEBERRY +DINGLES +DINGO +DINGOES +DINGS +DINGUS +DINGUSES +DINGY +DINING +DINITRO +DINITROBENZENE +DINITROBENZENES +DINITROPHENOL +DINITROPHENOLS +DINK +DINKED +DINKEY +DINKEYS +DINKIER +DINKIES +DINKIEST +DINKING +DINKLY +DINKS +DINKUM +DINKUMS +DINKY +DINNED +DINNER +DINNERLESS +DINNERS +DINNERTIME +DINNERTIMES +DINNERWARE +DINNERWARES +DINNING +DINO +DINOFLAGELLATE +DINOFLAGELLATES +DINOS +DINOSAUR +DINOSAURIAN +DINOSAURS +DINOTHERE +DINOTHERES +DINS +DINT +DINTED +DINTING +DINTS +DINUCLEOTIDE +DINUCLEOTIDES +DIOBOL +DIOBOLON +DIOBOLONS +DIOBOLS +DIOCESAN +DIOCESANS +DIOCESE +DIOCESES +DIODE +DIODES +DIOECIES +DIOECIOUS +DIOECISM +DIOECISMS +DIOECY +DIOESTRUS +DIOESTRUSES +DIOICOUS +DIOL +DIOLEFIN +DIOLEFINS +DIOLS +DIONYSIAC +DIONYSIAN +DIOPSIDE +DIOPSIDES +DIOPSIDIC +DIOPTASE +DIOPTASES +DIOPTER +DIOPTERS +DIOPTRAL +DIOPTRE +DIOPTRES +DIOPTRIC +DIOPTRICS +DIORAMA +DIORAMAS +DIORAMIC +DIORITE +DIORITES +DIORITIC +DIOSGENIN +DIOSGENINS +DIOXAN +DIOXANE +DIOXANES +DIOXANS +DIOXID +DIOXIDE +DIOXIDES +DIOXIDS +DIOXIN +DIOXINS +DIP +DIPEPTIDASE +DIPEPTIDASES +DIPEPTIDE +DIPEPTIDES +DIPHASE +DIPHASIC +DIPHENHYDRAMINE +DIPHENYL +DIPHENYLAMINE +DIPHENYLAMINES +DIPHENYLS +DIPHOSGENE +DIPHOSGENES +DIPHOSPHATE +DIPHOSPHATES +DIPHTHERIA +DIPHTHERIAL +DIPHTHERIAS +DIPHTHERITIC +DIPHTHEROID +DIPHTHEROIDS +DIPHTHONG +DIPHTHONGAL +DIPHTHONGED +DIPHTHONGING +DIPHTHONGIZE +DIPHTHONGIZED +DIPHTHONGIZES +DIPHTHONGIZING +DIPHTHONGS +DIPHYLETIC +DIPHYODONT +DIPLEGIA +DIPLEGIAS +DIPLEGIC +DIPLEX +DIPLEXER +DIPLEXERS +DIPLOBLASTIC +DIPLOCOCCI +DIPLOCOCCUS +DIPLODOCUS +DIPLODOCUSES +DIPLOE +DIPLOES +DIPLOIC +DIPLOID +DIPLOIDIC +DIPLOIDIES +DIPLOIDS +DIPLOIDY +DIPLOMA +DIPLOMACIES +DIPLOMACY +DIPLOMAED +DIPLOMAING +DIPLOMAS +DIPLOMAT +DIPLOMATA +DIPLOMATE +DIPLOMATES +DIPLOMATIC +DIPLOMATICALLY +DIPLOMATIST +DIPLOMATISTS +DIPLOMATS +DIPLONT +DIPLONTIC +DIPLONTS +DIPLOPHASE +DIPLOPHASES +DIPLOPIA +DIPLOPIAS +DIPLOPIC +DIPLOPOD +DIPLOPODS +DIPLOSES +DIPLOSIS +DIPLOTENE +DIPLOTENES +DIPNET +DIPNETS +DIPNETTED +DIPNETTING +DIPNOAN +DIPNOANS +DIPODIC +DIPODIES +DIPODY +DIPOLAR +DIPOLE +DIPOLES +DIPPABLE +DIPPED +DIPPER +DIPPERFUL +DIPPERFULS +DIPPERS +DIPPIER +DIPPIEST +DIPPINESS +DIPPINESSES +DIPPING +DIPPY +DIPROTIC +DIPS +DIPSADES +DIPSAS +DIPSHIT +DIPSHITS +DIPSO +DIPSOMANIA +DIPSOMANIAC +DIPSOMANIACAL +DIPSOMANIACS +DIPSOMANIAS +DIPSOS +DIPSTICK +DIPSTICKS +DIPT +DIPTERA +DIPTERAL +DIPTERAN +DIPTERANS +DIPTEROCARP +DIPTEROCARPS +DIPTERON +DIPTEROUS +DIPTYCA +DIPTYCAS +DIPTYCH +DIPTYCHS +DIQUAT +DIQUATS +DIRAM +DIRAMS +DIRDUM +DIRDUMS +DIRE +DIRECT +DIRECTED +DIRECTEDNESS +DIRECTEDNESSES +DIRECTER +DIRECTEST +DIRECTING +DIRECTION +DIRECTIONAL +DIRECTIONALITY +DIRECTIONLESS +DIRECTIONS +DIRECTIVE +DIRECTIVES +DIRECTIVITIES +DIRECTIVITY +DIRECTLY +DIRECTNESS +DIRECTNESSES +DIRECTOR +DIRECTORATE +DIRECTORATES +DIRECTORIAL +DIRECTORIES +DIRECTORS +DIRECTORSHIP +DIRECTORSHIPS +DIRECTORY +DIRECTRESS +DIRECTRESSES +DIRECTRICE +DIRECTRICES +DIRECTRIX +DIRECTRIXES +DIRECTS +DIREFUL +DIREFULLY +DIRELY +DIRENESS +DIRENESSES +DIRER +DIREST +DIRGE +DIRGEFUL +DIRGELIKE +DIRGES +DIRHAM +DIRHAMS +DIRIGIBLE +DIRIGIBLES +DIRIGISME +DIRIGISMES +DIRIGISTE +DIRIMENT +DIRK +DIRKED +DIRKING +DIRKS +DIRL +DIRLED +DIRLING +DIRLS +DIRNDL +DIRNDLS +DIRT +DIRTBAG +DIRTBAGS +DIRTIED +DIRTIER +DIRTIES +DIRTIEST +DIRTILY +DIRTINESS +DIRTINESSES +DIRTS +DIRTY +DIRTYING +DIS +DISABILITIES +DISABILITY +DISABLE +DISABLED +DISABLEMENT +DISABLEMENTS +DISABLER +DISABLERS +DISABLES +DISABLING +DISABUSAL +DISABUSALS +DISABUSE +DISABUSED +DISABUSES +DISABUSING +DISACCHARIDASE +DISACCHARIDASES +DISACCHARIDE +DISACCHARIDES +DISACCORD +DISACCORDED +DISACCORDING +DISACCORDS +DISACCUSTOM +DISACCUSTOMED +DISACCUSTOMING +DISACCUSTOMS +DISADVANTAGE +DISADVANTAGED +DISADVANTAGEOUS +DISADVANTAGES +DISADVANTAGING +DISAFFECT +DISAFFECTED +DISAFFECTING +DISAFFECTION +DISAFFECTIONS +DISAFFECTS +DISAFFILIATE +DISAFFILIATED +DISAFFILIATES +DISAFFILIATING +DISAFFILIATION +DISAFFILIATIONS +DISAFFIRM +DISAFFIRMANCE +DISAFFIRMANCES +DISAFFIRMED +DISAFFIRMING +DISAFFIRMS +DISAGGREGATE +DISAGGREGATED +DISAGGREGATES +DISAGGREGATING +DISAGGREGATION +DISAGGREGATIONS +DISAGGREGATIVE +DISAGREE +DISAGREEABLE +DISAGREEABLY +DISAGREED +DISAGREEING +DISAGREEMENT +DISAGREEMENTS +DISAGREES +DISALLOW +DISALLOWANCE +DISALLOWANCES +DISALLOWED +DISALLOWING +DISALLOWS +DISAMBIGUATE +DISAMBIGUATED +DISAMBIGUATES +DISAMBIGUATING +DISAMBIGUATION +DISAMBIGUATIONS +DISANNUL +DISANNULLED +DISANNULLING +DISANNULS +DISAPPEAR +DISAPPEARANCE +DISAPPEARANCES +DISAPPEARED +DISAPPEARING +DISAPPEARS +DISAPPOINT +DISAPPOINTED +DISAPPOINTEDLY +DISAPPOINTING +DISAPPOINTINGLY +DISAPPOINTMENT +DISAPPOINTMENTS +DISAPPOINTS +DISAPPROBATION +DISAPPROBATIONS +DISAPPROVAL +DISAPPROVALS +DISAPPROVE +DISAPPROVED +DISAPPROVER +DISAPPROVERS +DISAPPROVES +DISAPPROVING +DISAPPROVINGLY +DISARM +DISARMAMENT +DISARMAMENTS +DISARMED +DISARMER +DISARMERS +DISARMING +DISARMINGLY +DISARMS +DISARRANGE +DISARRANGED +DISARRANGEMENT +DISARRANGEMENTS +DISARRANGES +DISARRANGING +DISARRAY +DISARRAYED +DISARRAYING +DISARRAYS +DISARTICULATE +DISARTICULATED +DISARTICULATES +DISARTICULATING +DISARTICULATION +DISASSEMBLE +DISASSEMBLED +DISASSEMBLES +DISASSEMBLIES +DISASSEMBLING +DISASSEMBLY +DISASSOCIATE +DISASSOCIATED +DISASSOCIATES +DISASSOCIATING +DISASSOCIATION +DISASSOCIATIONS +DISASTER +DISASTERS +DISASTROUS +DISASTROUSLY +DISAVOW +DISAVOWABLE +DISAVOWAL +DISAVOWALS +DISAVOWED +DISAVOWER +DISAVOWERS +DISAVOWING +DISAVOWS +DISBAND +DISBANDED +DISBANDING +DISBANDMENT +DISBANDMENTS +DISBANDS +DISBAR +DISBARMENT +DISBARMENTS +DISBARRED +DISBARRING +DISBARS +DISBELIEF +DISBELIEFS +DISBELIEVE +DISBELIEVED +DISBELIEVER +DISBELIEVERS +DISBELIEVES +DISBELIEVING +DISBENEFIT +DISBENEFITS +DISBOSOM +DISBOSOMED +DISBOSOMING +DISBOSOMS +DISBOUND +DISBOWEL +DISBOWELED +DISBOWELING +DISBOWELLED +DISBOWELLING +DISBOWELS +DISBRANCH +DISBRANCHED +DISBRANCHES +DISBRANCHING +DISBUD +DISBUDDED +DISBUDDING +DISBUDS +DISBURDEN +DISBURDENED +DISBURDENING +DISBURDENMENT +DISBURDENMENTS +DISBURDENS +DISBURSAL +DISBURSALS +DISBURSE +DISBURSED +DISBURSEMENT +DISBURSEMENTS +DISBURSER +DISBURSERS +DISBURSES +DISBURSING +DISC +DISCALCED +DISCANT +DISCANTED +DISCANTING +DISCANTS +DISCARD +DISCARDABLE +DISCARDED +DISCARDER +DISCARDERS +DISCARDING +DISCARDS +DISCARNATE +DISCASE +DISCASED +DISCASES +DISCASING +DISCED +DISCEPT +DISCEPTED +DISCEPTING +DISCEPTS +DISCERN +DISCERNABLE +DISCERNED +DISCERNER +DISCERNERS +DISCERNIBLE +DISCERNIBLY +DISCERNING +DISCERNINGLY +DISCERNMENT +DISCERNMENTS +DISCERNS +DISCHARGE +DISCHARGEABLE +DISCHARGED +DISCHARGEE +DISCHARGEES +DISCHARGER +DISCHARGERS +DISCHARGES +DISCHARGING +DISCI +DISCIFORM +DISCING +DISCIPLE +DISCIPLED +DISCIPLES +DISCIPLESHIP +DISCIPLESHIPS +DISCIPLINABLE +DISCIPLINAL +DISCIPLINARIAN +DISCIPLINARIANS +DISCIPLINARILY +DISCIPLINARITY +DISCIPLINARY +DISCIPLINE +DISCIPLINED +DISCIPLINER +DISCIPLINERS +DISCIPLINES +DISCIPLING +DISCIPLINING +DISCLAIM +DISCLAIMED +DISCLAIMER +DISCLAIMERS +DISCLAIMING +DISCLAIMS +DISCLAMATION +DISCLAMATIONS +DISCLIKE +DISCLIMAX +DISCLIMAXES +DISCLOSE +DISCLOSED +DISCLOSER +DISCLOSERS +DISCLOSES +DISCLOSING +DISCLOSURE +DISCLOSURES +DISCO +DISCOED +DISCOGRAPHER +DISCOGRAPHERS +DISCOGRAPHIC +DISCOGRAPHICAL +DISCOGRAPHIES +DISCOGRAPHY +DISCOID +DISCOIDAL +DISCOIDS +DISCOING +DISCOLOR +DISCOLORATION +DISCOLORATIONS +DISCOLORED +DISCOLORING +DISCOLORS +DISCOLOUR +DISCOLOURED +DISCOLOURING +DISCOLOURS +DISCOMBOBULATE +DISCOMBOBULATED +DISCOMBOBULATES +DISCOMFIT +DISCOMFITED +DISCOMFITING +DISCOMFITS +DISCOMFITURE +DISCOMFITURES +DISCOMFORT +DISCOMFORTABLE +DISCOMFORTED +DISCOMFORTING +DISCOMFORTS +DISCOMMEND +DISCOMMENDED +DISCOMMENDING +DISCOMMENDS +DISCOMMODE +DISCOMMODED +DISCOMMODES +DISCOMMODING +DISCOMPOSE +DISCOMPOSED +DISCOMPOSES +DISCOMPOSING +DISCOMPOSURE +DISCOMPOSURES +DISCONCERT +DISCONCERTED +DISCONCERTING +DISCONCERTINGLY +DISCONCERTMENT +DISCONCERTMENTS +DISCONCERTS +DISCONFIRM +DISCONFIRMED +DISCONFIRMING +DISCONFIRMS +DISCONFORMITIES +DISCONFORMITY +DISCONNECT +DISCONNECTED +DISCONNECTEDLY +DISCONNECTING +DISCONNECTION +DISCONNECTIONS +DISCONNECTS +DISCONSOLATE +DISCONSOLATELY +DISCONSOLATION +DISCONSOLATIONS +DISCONTENT +DISCONTENTED +DISCONTENTEDLY +DISCONTENTING +DISCONTENTMENT +DISCONTENTMENTS +DISCONTENTS +DISCONTINUANCE +DISCONTINUANCES +DISCONTINUATION +DISCONTINUE +DISCONTINUED +DISCONTINUES +DISCONTINUING +DISCONTINUITIES +DISCONTINUITY +DISCONTINUOUS +DISCONTINUOUSLY +DISCOPHILE +DISCOPHILES +DISCORD +DISCORDANCE +DISCORDANCES +DISCORDANCIES +DISCORDANCY +DISCORDANT +DISCORDANTLY +DISCORDED +DISCORDING +DISCORDS +DISCOS +DISCOTHEQUE +DISCOTHEQUES +DISCOUNT +DISCOUNTABLE +DISCOUNTED +DISCOUNTENANCE +DISCOUNTENANCED +DISCOUNTENANCES +DISCOUNTER +DISCOUNTERS +DISCOUNTING +DISCOUNTS +DISCOURAGE +DISCOURAGEABLE +DISCOURAGED +DISCOURAGEMENT +DISCOURAGEMENTS +DISCOURAGER +DISCOURAGERS +DISCOURAGES +DISCOURAGING +DISCOURAGINGLY +DISCOURSE +DISCOURSED +DISCOURSER +DISCOURSERS +DISCOURSES +DISCOURSING +DISCOURTEOUS +DISCOURTEOUSLY +DISCOURTESIES +DISCOURTESY +DISCOVER +DISCOVERABLE +DISCOVERED +DISCOVERER +DISCOVERERS +DISCOVERIES +DISCOVERING +DISCOVERS +DISCOVERT +DISCOVERY +DISCREDIT +DISCREDITABLE +DISCREDITABLY +DISCREDITED +DISCREDITING +DISCREDITS +DISCREET +DISCREETER +DISCREETEST +DISCREETLY +DISCREETNESS +DISCREETNESSES +DISCREPANCIES +DISCREPANCY +DISCREPANT +DISCREPANTLY +DISCRETE +DISCRETELY +DISCRETENESS +DISCRETENESSES +DISCRETION +DISCRETIONARY +DISCRETIONS +DISCRIMINABLE +DISCRIMINABLY +DISCRIMINANT +DISCRIMINANTS +DISCRIMINATE +DISCRIMINATED +DISCRIMINATES +DISCRIMINATING +DISCRIMINATION +DISCRIMINATIONS +DISCRIMINATIVE +DISCRIMINATOR +DISCRIMINATORS +DISCRIMINATORY +DISCROWN +DISCROWNED +DISCROWNING +DISCROWNS +DISCS +DISCURSIVE +DISCURSIVELY +DISCURSIVENESS +DISCUS +DISCUSES +DISCUSS +DISCUSSABLE +DISCUSSANT +DISCUSSANTS +DISCUSSED +DISCUSSER +DISCUSSERS +DISCUSSES +DISCUSSIBLE +DISCUSSING +DISCUSSION +DISCUSSIONS +DISDAIN +DISDAINED +DISDAINFUL +DISDAINFULLY +DISDAINFULNESS +DISDAINING +DISDAINS +DISEASE +DISEASED +DISEASES +DISEASING +DISECONOMIES +DISECONOMY +DISEMBARK +DISEMBARKATION +DISEMBARKATIONS +DISEMBARKED +DISEMBARKING +DISEMBARKS +DISEMBARRASS +DISEMBARRASSED +DISEMBARRASSES +DISEMBARRASSING +DISEMBODIED +DISEMBODIES +DISEMBODY +DISEMBODYING +DISEMBOGUE +DISEMBOGUED +DISEMBOGUES +DISEMBOGUING +DISEMBOWEL +DISEMBOWELED +DISEMBOWELING +DISEMBOWELLED +DISEMBOWELLING +DISEMBOWELMENT +DISEMBOWELMENTS +DISEMBOWELS +DISEMPLOY +DISEMPLOYED +DISEMPLOYING +DISEMPLOYS +DISENABLE +DISENABLED +DISENABLES +DISENABLING +DISENCHANT +DISENCHANTED +DISENCHANTER +DISENCHANTERS +DISENCHANTING +DISENCHANTINGLY +DISENCHANTMENT +DISENCHANTMENTS +DISENCHANTS +DISENCUMBER +DISENCUMBERED +DISENCUMBERING +DISENCUMBERS +DISENDOW +DISENDOWED +DISENDOWER +DISENDOWERS +DISENDOWING +DISENDOWMENT +DISENDOWMENTS +DISENDOWS +DISENFRANCHISE +DISENFRANCHISED +DISENFRANCHISES +DISENGAGE +DISENGAGED +DISENGAGEMENT +DISENGAGEMENTS +DISENGAGES +DISENGAGING +DISENTAIL +DISENTAILED +DISENTAILING +DISENTAILS +DISENTANGLE +DISENTANGLED +DISENTANGLEMENT +DISENTANGLES +DISENTANGLING +DISENTHRAL +DISENTHRALL +DISENTHRALLED +DISENTHRALLING +DISENTHRALLS +DISENTHRALS +DISENTITLE +DISENTITLED +DISENTITLES +DISENTITLING +DISEQUILIBRATE +DISEQUILIBRATED +DISEQUILIBRATES +DISEQUILIBRIA +DISEQUILIBRIUM +DISEQUILIBRIUMS +DISESTABLISH +DISESTABLISHED +DISESTABLISHES +DISESTABLISHING +DISESTEEM +DISESTEEMED +DISESTEEMING +DISESTEEMS +DISEUR +DISEURS +DISEUSE +DISEUSES +DISFAVOR +DISFAVORED +DISFAVORING +DISFAVORS +DISFAVOUR +DISFAVOURED +DISFAVOURING +DISFAVOURS +DISFIGURE +DISFIGURED +DISFIGUREMENT +DISFIGUREMENTS +DISFIGURES +DISFIGURING +DISFRANCHISE +DISFRANCHISED +DISFRANCHISES +DISFRANCHISING +DISFROCK +DISFROCKED +DISFROCKING +DISFROCKS +DISFUNCTION +DISFUNCTIONS +DISFURNISH +DISFURNISHED +DISFURNISHES +DISFURNISHING +DISFURNISHMENT +DISFURNISHMENTS +DISGORGE +DISGORGED +DISGORGES +DISGORGING +DISGRACE +DISGRACED +DISGRACEFUL +DISGRACEFULLY +DISGRACEFULNESS +DISGRACER +DISGRACERS +DISGRACES +DISGRACING +DISGRUNTLE +DISGRUNTLED +DISGRUNTLEMENT +DISGRUNTLEMENTS +DISGRUNTLES +DISGRUNTLING +DISGUISE +DISGUISED +DISGUISEDLY +DISGUISEMENT +DISGUISEMENTS +DISGUISER +DISGUISERS +DISGUISES +DISGUISING +DISGUST +DISGUSTED +DISGUSTEDLY +DISGUSTFUL +DISGUSTFULLY +DISGUSTING +DISGUSTINGLY +DISGUSTS +DISH +DISHABILLE +DISHABILLES +DISHARMONIES +DISHARMONIOUS +DISHARMONIZE +DISHARMONIZED +DISHARMONIZES +DISHARMONIZING +DISHARMONY +DISHCLOTH +DISHCLOTHS +DISHCLOUT +DISHCLOUTS +DISHDASHA +DISHDASHAS +DISHEARTEN +DISHEARTENED +DISHEARTENING +DISHEARTENINGLY +DISHEARTENMENT +DISHEARTENMENTS +DISHEARTENS +DISHED +DISHELM +DISHELMED +DISHELMING +DISHELMS +DISHERIT +DISHERITED +DISHERITING +DISHERITS +DISHES +DISHEVEL +DISHEVELED +DISHEVELING +DISHEVELLED +DISHEVELLING +DISHEVELS +DISHFUL +DISHFULS +DISHIER +DISHIEST +DISHING +DISHLIKE +DISHONEST +DISHONESTIES +DISHONESTLY +DISHONESTY +DISHONOR +DISHONORABLE +DISHONORABLY +DISHONORED +DISHONORER +DISHONORERS +DISHONORING +DISHONORS +DISHPAN +DISHPANS +DISHRAG +DISHRAGS +DISHTOWEL +DISHTOWELS +DISHWARE +DISHWARES +DISHWASHER +DISHWASHERS +DISHWATER +DISHWATERS +DISHY +DISILLUSION +DISILLUSIONED +DISILLUSIONING +DISILLUSIONMENT +DISILLUSIONS +DISINCENTIVE +DISINCENTIVES +DISINCLINATION +DISINCLINATIONS +DISINCLINE +DISINCLINED +DISINCLINES +DISINCLINING +DISINFECT +DISINFECTANT +DISINFECTANTS +DISINFECTED +DISINFECTING +DISINFECTION +DISINFECTIONS +DISINFECTS +DISINFEST +DISINFESTANT +DISINFESTANTS +DISINFESTATION +DISINFESTATIONS +DISINFESTED +DISINFESTING +DISINFESTS +DISINFLATION +DISINFLATIONARY +DISINFLATIONS +DISINFORM +DISINFORMATION +DISINFORMATIONS +DISINFORMED +DISINFORMING +DISINFORMS +DISINGENUOUS +DISINGENUOUSLY +DISINHERIT +DISINHERITANCE +DISINHERITANCES +DISINHERITED +DISINHERITING +DISINHERITS +DISINHIBIT +DISINHIBITED +DISINHIBITING +DISINHIBITION +DISINHIBITIONS +DISINHIBITS +DISINTEGRATE +DISINTEGRATED +DISINTEGRATES +DISINTEGRATING +DISINTEGRATION +DISINTEGRATIONS +DISINTEGRATIVE +DISINTEGRATOR +DISINTEGRATORS +DISINTER +DISINTEREST +DISINTERESTED +DISINTERESTEDLY +DISINTERESTING +DISINTERESTS +DISINTERMENT +DISINTERMENTS +DISINTERRED +DISINTERRING +DISINTERS +DISINTOXICATE +DISINTOXICATED +DISINTOXICATES +DISINTOXICATING +DISINTOXICATION +DISINVEST +DISINVESTED +DISINVESTING +DISINVESTMENT +DISINVESTMENTS +DISINVESTS +DISINVITE +DISINVITED +DISINVITES +DISINVITING +DISJECT +DISJECTED +DISJECTING +DISJECTS +DISJOIN +DISJOINED +DISJOINING +DISJOINS +DISJOINT +DISJOINTED +DISJOINTEDLY +DISJOINTEDNESS +DISJOINTING +DISJOINTS +DISJUNCT +DISJUNCTION +DISJUNCTIONS +DISJUNCTIVE +DISJUNCTIVELY +DISJUNCTIVES +DISJUNCTS +DISJUNCTURE +DISJUNCTURES +DISK +DISKED +DISKETTE +DISKETTES +DISKING +DISKLIKE +DISKS +DISLIKABLE +DISLIKE +DISLIKEABLE +DISLIKED +DISLIKER +DISLIKERS +DISLIKES +DISLIKING +DISLIMN +DISLIMNED +DISLIMNING +DISLIMNS +DISLOCATE +DISLOCATED +DISLOCATES +DISLOCATING +DISLOCATION +DISLOCATIONS +DISLODGE +DISLODGED +DISLODGEMENT +DISLODGEMENTS +DISLODGES +DISLODGING +DISLODGMENT +DISLODGMENTS +DISLOYAL +DISLOYALLY +DISLOYALTIES +DISLOYALTY +DISMAL +DISMALER +DISMALEST +DISMALLY +DISMALNESS +DISMALNESSES +DISMALS +DISMANTLE +DISMANTLED +DISMANTLEMENT +DISMANTLEMENTS +DISMANTLES +DISMANTLING +DISMAST +DISMASTED +DISMASTING +DISMASTS +DISMAY +DISMAYED +DISMAYING +DISMAYINGLY +DISMAYS +DISME +DISMEMBER +DISMEMBERED +DISMEMBERING +DISMEMBERMENT +DISMEMBERMENTS +DISMEMBERS +DISMES +DISMISS +DISMISSAL +DISMISSALS +DISMISSED +DISMISSES +DISMISSING +DISMISSION +DISMISSIONS +DISMISSIVE +DISMISSIVELY +DISMOUNT +DISMOUNTED +DISMOUNTING +DISMOUNTS +DISOBEDIENCE +DISOBEDIENCES +DISOBEDIENT +DISOBEDIENTLY +DISOBEY +DISOBEYED +DISOBEYER +DISOBEYERS +DISOBEYING +DISOBEYS +DISOBLIGE +DISOBLIGED +DISOBLIGES +DISOBLIGING +DISOMIC +DISORDER +DISORDERED +DISORDEREDLY +DISORDEREDNESS +DISORDERING +DISORDERLINESS +DISORDERLY +DISORDERS +DISORGANIZATION +DISORGANIZE +DISORGANIZED +DISORGANIZES +DISORGANIZING +DISORIENT +DISORIENTATE +DISORIENTATED +DISORIENTATES +DISORIENTATING +DISORIENTATION +DISORIENTATIONS +DISORIENTED +DISORIENTING +DISORIENTS +DISOWN +DISOWNED +DISOWNING +DISOWNMENT +DISOWNMENTS +DISOWNS +DISPARAGE +DISPARAGED +DISPARAGEMENT +DISPARAGEMENTS +DISPARAGER +DISPARAGERS +DISPARAGES +DISPARAGING +DISPARAGINGLY +DISPARATE +DISPARATELY +DISPARATENESS +DISPARATENESSES +DISPARITIES +DISPARITY +DISPART +DISPARTED +DISPARTING +DISPARTS +DISPASSION +DISPASSIONATE +DISPASSIONATELY +DISPASSIONS +DISPATCH +DISPATCHED +DISPATCHER +DISPATCHERS +DISPATCHES +DISPATCHING +DISPEL +DISPELLED +DISPELLER +DISPELLERS +DISPELLING +DISPELS +DISPEND +DISPENDED +DISPENDING +DISPENDS +DISPENSABILITY +DISPENSABLE +DISPENSARIES +DISPENSARY +DISPENSATION +DISPENSATIONAL +DISPENSATIONS +DISPENSATORIES +DISPENSATORY +DISPENSE +DISPENSED +DISPENSER +DISPENSERS +DISPENSES +DISPENSING +DISPEOPLE +DISPEOPLED +DISPEOPLES +DISPEOPLING +DISPERSAL +DISPERSALS +DISPERSANT +DISPERSANTS +DISPERSE +DISPERSED +DISPERSEDLY +DISPERSER +DISPERSERS +DISPERSES +DISPERSIBLE +DISPERSING +DISPERSION +DISPERSIONS +DISPERSIVE +DISPERSIVELY +DISPERSIVENESS +DISPERSOID +DISPERSOIDS +DISPIRIT +DISPIRITED +DISPIRITEDLY +DISPIRITEDNESS +DISPIRITING +DISPIRITS +DISPITEOUS +DISPLACE +DISPLACEABLE +DISPLACED +DISPLACEMENT +DISPLACEMENTS +DISPLACER +DISPLACERS +DISPLACES +DISPLACING +DISPLANT +DISPLANTED +DISPLANTING +DISPLANTS +DISPLAY +DISPLAYABLE +DISPLAYED +DISPLAYER +DISPLAYERS +DISPLAYING +DISPLAYS +DISPLEASE +DISPLEASED +DISPLEASES +DISPLEASING +DISPLEASURE +DISPLEASURES +DISPLODE +DISPLODED +DISPLODES +DISPLODING +DISPLOSION +DISPLOSIONS +DISPLUME +DISPLUMED +DISPLUMES +DISPLUMING +DISPORT +DISPORTED +DISPORTING +DISPORTMENT +DISPORTMENTS +DISPORTS +DISPOSABILITIES +DISPOSABILITY +DISPOSABLE +DISPOSABLES +DISPOSAL +DISPOSALS +DISPOSE +DISPOSED +DISPOSER +DISPOSERS +DISPOSES +DISPOSING +DISPOSITION +DISPOSITIONAL +DISPOSITIONS +DISPOSITIVE +DISPOSSESS +DISPOSSESSED +DISPOSSESSES +DISPOSSESSING +DISPOSSESSION +DISPOSSESSIONS +DISPOSSESSOR +DISPOSSESSORS +DISPOSURE +DISPOSURES +DISPRAISE +DISPRAISED +DISPRAISER +DISPRAISERS +DISPRAISES +DISPRAISING +DISPRAISINGLY +DISPREAD +DISPREADING +DISPREADS +DISPRIZE +DISPRIZED +DISPRIZES +DISPRIZING +DISPROOF +DISPROOFS +DISPROPORTION +DISPROPORTIONAL +DISPROPORTIONED +DISPROPORTIONS +DISPROVABLE +DISPROVAL +DISPROVALS +DISPROVE +DISPROVED +DISPROVEN +DISPROVER +DISPROVERS +DISPROVES +DISPROVING +DISPUTABLE +DISPUTABLY +DISPUTANT +DISPUTANTS +DISPUTATION +DISPUTATIONS +DISPUTATIOUS +DISPUTATIOUSLY +DISPUTE +DISPUTED +DISPUTER +DISPUTERS +DISPUTES +DISPUTING +DISQUALIFIED +DISQUALIFIES +DISQUALIFY +DISQUALIFYING +DISQUANTITIED +DISQUANTITIES +DISQUANTITY +DISQUANTITYING +DISQUIET +DISQUIETED +DISQUIETING +DISQUIETINGLY +DISQUIETLY +DISQUIETS +DISQUIETUDE +DISQUIETUDES +DISQUISITION +DISQUISITIONS +DISRATE +DISRATED +DISRATES +DISRATING +DISREGARD +DISREGARDED +DISREGARDFUL +DISREGARDING +DISREGARDS +DISRELATED +DISRELATION +DISRELATIONS +DISRELISH +DISRELISHED +DISRELISHES +DISRELISHING +DISREMEMBER +DISREMEMBERED +DISREMEMBERING +DISREMEMBERS +DISREPAIR +DISREPAIRS +DISREPUTABILITY +DISREPUTABLE +DISREPUTABLY +DISREPUTE +DISREPUTES +DISRESPECT +DISRESPECTABLE +DISRESPECTED +DISRESPECTFUL +DISRESPECTFULLY +DISRESPECTING +DISRESPECTS +DISROBE +DISROBED +DISROBER +DISROBERS +DISROBES +DISROBING +DISROOT +DISROOTED +DISROOTING +DISROOTS +DISRUPT +DISRUPTED +DISRUPTER +DISRUPTERS +DISRUPTING +DISRUPTION +DISRUPTIONS +DISRUPTIVE +DISRUPTIVELY +DISRUPTIVENESS +DISRUPTOR +DISRUPTORS +DISRUPTS +DISS +DISSATISFACTION +DISSATISFACTORY +DISSATISFIED +DISSATISFIES +DISSATISFY +DISSATISFYING +DISSAVE +DISSAVED +DISSAVES +DISSAVING +DISSEAT +DISSEATED +DISSEATING +DISSEATS +DISSECT +DISSECTED +DISSECTING +DISSECTION +DISSECTIONS +DISSECTOR +DISSECTORS +DISSECTS +DISSED +DISSEISE +DISSEISED +DISSEISEE +DISSEISEES +DISSEISES +DISSEISIN +DISSEISING +DISSEISINS +DISSEISOR +DISSEISORS +DISSEIZE +DISSEIZED +DISSEIZEE +DISSEIZEES +DISSEIZES +DISSEIZIN +DISSEIZING +DISSEIZINS +DISSEIZOR +DISSEIZORS +DISSEMBLE +DISSEMBLED +DISSEMBLER +DISSEMBLERS +DISSEMBLES +DISSEMBLING +DISSEMINATE +DISSEMINATED +DISSEMINATES +DISSEMINATING +DISSEMINATION +DISSEMINATIONS +DISSEMINATOR +DISSEMINATORS +DISSEMINULE +DISSEMINULES +DISSENSION +DISSENSIONS +DISSENSUS +DISSENSUSES +DISSENT +DISSENTED +DISSENTER +DISSENTERS +DISSENTIENT +DISSENTIENTS +DISSENTING +DISSENTION +DISSENTIONS +DISSENTIOUS +DISSENTS +DISSEPIMENT +DISSEPIMENTS +DISSERT +DISSERTATE +DISSERTATED +DISSERTATES +DISSERTATING +DISSERTATION +DISSERTATIONAL +DISSERTATIONS +DISSERTATOR +DISSERTATORS +DISSERTED +DISSERTING +DISSERTS +DISSERVE +DISSERVED +DISSERVES +DISSERVICE +DISSERVICEABLE +DISSERVICES +DISSERVING +DISSES +DISSEVER +DISSEVERANCE +DISSEVERANCES +DISSEVERED +DISSEVERING +DISSEVERMENT +DISSEVERMENTS +DISSEVERS +DISSIDENCE +DISSIDENCES +DISSIDENT +DISSIDENTS +DISSIMILAR +DISSIMILARITIES +DISSIMILARITY +DISSIMILARLY +DISSIMILARS +DISSIMILATE +DISSIMILATED +DISSIMILATES +DISSIMILATING +DISSIMILATION +DISSIMILATIONS +DISSIMILATORY +DISSIMILITUDE +DISSIMILITUDES +DISSIMULATE +DISSIMULATED +DISSIMULATES +DISSIMULATING +DISSIMULATION +DISSIMULATIONS +DISSIMULATOR +DISSIMULATORS +DISSING +DISSIPATE +DISSIPATED +DISSIPATEDLY +DISSIPATEDNESS +DISSIPATER +DISSIPATERS +DISSIPATES +DISSIPATING +DISSIPATION +DISSIPATIONS +DISSIPATIVE +DISSOCIABILITY +DISSOCIABLE +DISSOCIAL +DISSOCIATE +DISSOCIATED +DISSOCIATES +DISSOCIATING +DISSOCIATION +DISSOCIATIONS +DISSOCIATIVE +DISSOLUBLE +DISSOLUTE +DISSOLUTELY +DISSOLUTENESS +DISSOLUTENESSES +DISSOLUTION +DISSOLUTIONS +DISSOLVABLE +DISSOLVE +DISSOLVED +DISSOLVENT +DISSOLVENTS +DISSOLVER +DISSOLVERS +DISSOLVES +DISSOLVING +DISSONANCE +DISSONANCES +DISSONANT +DISSONANTLY +DISSUADE +DISSUADED +DISSUADER +DISSUADERS +DISSUADES +DISSUADING +DISSUASION +DISSUASIONS +DISSUASIVE +DISSUASIVELY +DISSUASIVENESS +DISSYLLABLE +DISSYLLABLES +DISSYMMETRIC +DISSYMMETRIES +DISSYMMETRY +DISTAFF +DISTAFFS +DISTAIN +DISTAINED +DISTAINING +DISTAINS +DISTAL +DISTALLY +DISTANCE +DISTANCED +DISTANCES +DISTANCING +DISTANT +DISTANTLY +DISTANTNESS +DISTANTNESSES +DISTASTE +DISTASTED +DISTASTEFUL +DISTASTEFULLY +DISTASTEFULNESS +DISTASTES +DISTASTING +DISTAVES +DISTELFINK +DISTELFINKS +DISTEMPER +DISTEMPERATE +DISTEMPERATURE +DISTEMPERATURES +DISTEMPERED +DISTEMPERING +DISTEMPERS +DISTEND +DISTENDED +DISTENDER +DISTENDERS +DISTENDING +DISTENDS +DISTENSIBILITY +DISTENSIBLE +DISTENSION +DISTENSIONS +DISTENT +DISTENTION +DISTENTIONS +DISTICH +DISTICHAL +DISTICHOUS +DISTICHS +DISTIL +DISTILL +DISTILLATE +DISTILLATES +DISTILLATION +DISTILLATIONS +DISTILLED +DISTILLER +DISTILLERIES +DISTILLERS +DISTILLERY +DISTILLING +DISTILLS +DISTILS +DISTINCT +DISTINCTER +DISTINCTEST +DISTINCTION +DISTINCTIONS +DISTINCTIVE +DISTINCTIVELY +DISTINCTIVENESS +DISTINCTLY +DISTINCTNESS +DISTINCTNESSES +DISTINGUE +DISTINGUISH +DISTINGUISHABLE +DISTINGUISHABLY +DISTINGUISHED +DISTINGUISHES +DISTINGUISHING +DISTOME +DISTOMES +DISTORT +DISTORTED +DISTORTER +DISTORTERS +DISTORTING +DISTORTION +DISTORTIONAL +DISTORTIONS +DISTORTS +DISTRACT +DISTRACTABLE +DISTRACTED +DISTRACTEDLY +DISTRACTIBILITY +DISTRACTIBLE +DISTRACTING +DISTRACTINGLY +DISTRACTION +DISTRACTIONS +DISTRACTIVE +DISTRACTS +DISTRAIN +DISTRAINABLE +DISTRAINED +DISTRAINER +DISTRAINERS +DISTRAINING +DISTRAINOR +DISTRAINORS +DISTRAINS +DISTRAINT +DISTRAINTS +DISTRAIT +DISTRAITE +DISTRAUGHT +DISTRAUGHTLY +DISTRESS +DISTRESSED +DISTRESSES +DISTRESSFUL +DISTRESSFULLY +DISTRESSFULNESS +DISTRESSING +DISTRESSINGLY +DISTRIBUTARIES +DISTRIBUTARY +DISTRIBUTE +DISTRIBUTED +DISTRIBUTEE +DISTRIBUTEES +DISTRIBUTES +DISTRIBUTING +DISTRIBUTION +DISTRIBUTIONAL +DISTRIBUTIONS +DISTRIBUTIVE +DISTRIBUTIVELY +DISTRIBUTIVITY +DISTRIBUTOR +DISTRIBUTORS +DISTRICT +DISTRICTED +DISTRICTING +DISTRICTS +DISTRUST +DISTRUSTED +DISTRUSTFUL +DISTRUSTFULLY +DISTRUSTFULNESS +DISTRUSTING +DISTRUSTS +DISTURB +DISTURBANCE +DISTURBANCES +DISTURBED +DISTURBER +DISTURBERS +DISTURBING +DISTURBINGLY +DISTURBS +DISUBSTITUTED +DISULFATE +DISULFATES +DISULFID +DISULFIDE +DISULFIDES +DISULFIDS +DISULFIRAM +DISULFIRAMS +DISULFOTON +DISULFOTONS +DISUNION +DISUNIONIST +DISUNIONISTS +DISUNIONS +DISUNITE +DISUNITED +DISUNITER +DISUNITERS +DISUNITES +DISUNITIES +DISUNITING +DISUNITY +DISUSE +DISUSED +DISUSES +DISUSING +DISUTILITIES +DISUTILITY +DISVALUE +DISVALUED +DISVALUES +DISVALUING +DISYLLABIC +DISYLLABLE +DISYLLABLES +DISYOKE +DISYOKED +DISYOKES +DISYOKING +DIT +DITA +DITAS +DITCH +DITCHDIGGER +DITCHDIGGERS +DITCHED +DITCHER +DITCHERS +DITCHES +DITCHING +DITE +DITES +DITHEISM +DITHEISMS +DITHEIST +DITHEISTS +DITHER +DITHERED +DITHERER +DITHERERS +DITHERING +DITHERS +DITHERY +DITHIOCARBAMATE +DITHIOL +DITHYRAMB +DITHYRAMBIC +DITHYRAMBICALLY +DITHYRAMBS +DITRANSITIVE +DITRANSITIVES +DITS +DITSIER +DITSIEST +DITSINESS +DITSINESSES +DITSY +DITTANIES +DITTANY +DITTIES +DITTO +DITTOED +DITTOING +DITTOS +DITTY +DITZ +DITZES +DITZIER +DITZIEST +DITZINESS +DITZINESSES +DITZY +DIURESES +DIURESIS +DIURETIC +DIURETICALLY +DIURETICS +DIURNAL +DIURNALLY +DIURNALS +DIURON +DIURONS +DIVA +DIVAGATE +DIVAGATED +DIVAGATES +DIVAGATING +DIVAGATION +DIVAGATIONS +DIVALENCE +DIVALENCES +DIVALENT +DIVAN +DIVANS +DIVARICATE +DIVARICATED +DIVARICATES +DIVARICATING +DIVARICATION +DIVARICATIONS +DIVAS +DIVE +DIVEBOMB +DIVEBOMBED +DIVEBOMBING +DIVEBOMBS +DIVED +DIVER +DIVERGE +DIVERGED +DIVERGENCE +DIVERGENCES +DIVERGENCIES +DIVERGENCY +DIVERGENT +DIVERGENTLY +DIVERGES +DIVERGING +DIVERS +DIVERSE +DIVERSELY +DIVERSENESS +DIVERSENESSES +DIVERSIFICATION +DIVERSIFIED +DIVERSIFIER +DIVERSIFIERS +DIVERSIFIES +DIVERSIFY +DIVERSIFYING +DIVERSION +DIVERSIONARY +DIVERSIONIST +DIVERSIONISTS +DIVERSIONS +DIVERSITIES +DIVERSITY +DIVERT +DIVERTED +DIVERTER +DIVERTERS +DIVERTICULA +DIVERTICULAR +DIVERTICULITIS +DIVERTICULOSES +DIVERTICULOSIS +DIVERTICULUM +DIVERTIMENTI +DIVERTIMENTO +DIVERTIMENTOS +DIVERTING +DIVERTISSEMENT +DIVERTISSEMENTS +DIVERTS +DIVES +DIVEST +DIVESTED +DIVESTING +DIVESTITURE +DIVESTITURES +DIVESTMENT +DIVESTMENTS +DIVESTS +DIVESTURE +DIVESTURES +DIVIDABLE +DIVIDE +DIVIDED +DIVIDEDLY +DIVIDEDNESS +DIVIDEDNESSES +DIVIDEND +DIVIDENDLESS +DIVIDENDS +DIVIDER +DIVIDERS +DIVIDES +DIVIDING +DIVIDUAL +DIVINATION +DIVINATIONS +DIVINATORY +DIVINE +DIVINED +DIVINELY +DIVINER +DIVINERS +DIVINES +DIVINEST +DIVING +DIVINING +DIVINISE +DIVINISED +DIVINISES +DIVINISING +DIVINITIES +DIVINITY +DIVINIZE +DIVINIZED +DIVINIZES +DIVINIZING +DIVISIBILITIES +DIVISIBILITY +DIVISIBLE +DIVISIBLY +DIVISION +DIVISIONAL +DIVISIONISM +DIVISIONISMS +DIVISIONIST +DIVISIONISTS +DIVISIONS +DIVISIVE +DIVISIVELY +DIVISIVENESS +DIVISIVENESSES +DIVISOR +DIVISORS +DIVORCE +DIVORCED +DIVORCEE +DIVORCEES +DIVORCEMENT +DIVORCEMENTS +DIVORCER +DIVORCERS +DIVORCES +DIVORCING +DIVORCIVE +DIVOT +DIVOTS +DIVULGATE +DIVULGATED +DIVULGATES +DIVULGATING +DIVULGE +DIVULGED +DIVULGENCE +DIVULGENCES +DIVULGER +DIVULGERS +DIVULGES +DIVULGING +DIVULSE +DIVULSED +DIVULSES +DIVULSING +DIVULSION +DIVULSIONS +DIVULSIVE +DIVVIED +DIVVIES +DIVVY +DIVVYING +DIWAN +DIWANS +DIXIT +DIXITS +DIZEN +DIZENED +DIZENING +DIZENMENT +DIZENMENTS +DIZENS +DIZYGOTIC +DIZYGOUS +DIZZIED +DIZZIER +DIZZIES +DIZZIEST +DIZZILY +DIZZINESS +DIZZINESSES +DIZZY +DIZZYING +DIZZYINGLY +DJEBEL +DJEBELS +DJELLABA +DJELLABAH +DJELLABAHS +DJELLABAS +DJIN +DJINN +DJINNI +DJINNS +DJINNY +DJINS +DO +DOABLE +DOAT +DOATED +DOATING +DOATS +DOBBER +DOBBERS +DOBBIES +DOBBIN +DOBBINS +DOBBY +DOBIE +DOBIES +DOBLA +DOBLAS +DOBLON +DOBLONES +DOBLONS +DOBRA +DOBRAS +DOBRO +DOBROS +DOBSON +DOBSONFLIES +DOBSONFLY +DOBSONS +DOBY +DOC +DOCENT +DOCENTS +DOCETIC +DOCILE +DOCILELY +DOCILITIES +DOCILITY +DOCK +DOCKAGE +DOCKAGES +DOCKED +DOCKER +DOCKERS +DOCKET +DOCKETED +DOCKETING +DOCKETS +DOCKHAND +DOCKHANDS +DOCKING +DOCKLAND +DOCKLANDS +DOCKMASTER +DOCKMASTERS +DOCKS +DOCKSIDE +DOCKSIDES +DOCKWORKER +DOCKWORKERS +DOCKYARD +DOCKYARDS +DOCS +DOCTOR +DOCTORAL +DOCTORATE +DOCTORATES +DOCTORED +DOCTORIAL +DOCTORING +DOCTORLESS +DOCTORLY +DOCTORS +DOCTORSHIP +DOCTORSHIPS +DOCTRINAIRE +DOCTRINAIRES +DOCTRINAIRISM +DOCTRINAIRISMS +DOCTRINAL +DOCTRINALLY +DOCTRINE +DOCTRINES +DOCUDRAMA +DOCUDRAMAS +DOCUMENT +DOCUMENTABLE +DOCUMENTAL +DOCUMENTALIST +DOCUMENTALISTS +DOCUMENTARIAN +DOCUMENTARIANS +DOCUMENTARIES +DOCUMENTARILY +DOCUMENTARIST +DOCUMENTARISTS +DOCUMENTARY +DOCUMENTATION +DOCUMENTATIONAL +DOCUMENTATIONS +DOCUMENTED +DOCUMENTER +DOCUMENTERS +DOCUMENTING +DOCUMENTS +DODDER +DODDERED +DODDERER +DODDERERS +DODDERING +DODDERS +DODDERY +DODECAGON +DODECAGONS +DODECAHEDRA +DODECAHEDRAL +DODECAHEDRON +DODECAHEDRONS +DODECAPHONIC +DODECAPHONIES +DODECAPHONIST +DODECAPHONISTS +DODECAPHONY +DODGE +DODGEBALL +DODGEBALLS +DODGED +DODGEM +DODGEMS +DODGER +DODGERIES +DODGERS +DODGERY +DODGES +DODGIER +DODGIEST +DODGINESS +DODGINESSES +DODGING +DODGY +DODO +DODOES +DODOISM +DODOISMS +DODOS +DOE +DOER +DOERS +DOES +DOESKIN +DOESKINS +DOEST +DOETH +DOFF +DOFFED +DOFFER +DOFFERS +DOFFING +DOFFS +DOG +DOGBANE +DOGBANES +DOGBERRIES +DOGBERRY +DOGCART +DOGCARTS +DOGCATCHER +DOGCATCHERS +DOGDOM +DOGDOMS +DOGE +DOGEAR +DOGEARED +DOGEARING +DOGEARS +DOGEDOM +DOGEDOMS +DOGES +DOGESHIP +DOGESHIPS +DOGEY +DOGEYS +DOGFACE +DOGFACES +DOGFIGHT +DOGFIGHTING +DOGFIGHTS +DOGFISH +DOGFISHES +DOGFOUGHT +DOGGED +DOGGEDLY +DOGGEDNESS +DOGGEDNESSES +DOGGER +DOGGEREL +DOGGERELS +DOGGERIES +DOGGERS +DOGGERY +DOGGIE +DOGGIER +DOGGIES +DOGGIEST +DOGGING +DOGGISH +DOGGISHLY +DOGGISHNESS +DOGGISHNESSES +DOGGO +DOGGONE +DOGGONED +DOGGONEDER +DOGGONEDEST +DOGGONER +DOGGONES +DOGGONEST +DOGGONING +DOGGREL +DOGGRELS +DOGGY +DOGHANGED +DOGHOUSE +DOGHOUSES +DOGIE +DOGIES +DOGLEG +DOGLEGGED +DOGLEGGING +DOGLEGS +DOGLIKE +DOGMA +DOGMAS +DOGMATA +DOGMATIC +DOGMATICAL +DOGMATICALLY +DOGMATICALNESS +DOGMATICS +DOGMATISM +DOGMATISMS +DOGMATIST +DOGMATISTS +DOGMATIZATION +DOGMATIZATIONS +DOGMATIZE +DOGMATIZED +DOGMATIZER +DOGMATIZERS +DOGMATIZES +DOGMATIZING +DOGNAP +DOGNAPED +DOGNAPER +DOGNAPERS +DOGNAPING +DOGNAPPED +DOGNAPPER +DOGNAPPERS +DOGNAPPING +DOGNAPS +DOGROBBER +DOGROBBERS +DOGS +DOGSBODIES +DOGSBODY +DOGSLED +DOGSLEDDED +DOGSLEDDER +DOGSLEDDERS +DOGSLEDDING +DOGSLEDS +DOGTEETH +DOGTOOTH +DOGTROT +DOGTROTS +DOGTROTTED +DOGTROTTING +DOGVANE +DOGVANES +DOGWATCH +DOGWATCHES +DOGWOOD +DOGWOODS +DOGY +DOILED +DOILIES +DOILY +DOING +DOINGS +DOIT +DOITED +DOITS +DOJO +DOJOS +DOL +DOLABRATE +DOLCE +DOLCETTO +DOLCETTOS +DOLCI +DOLDRUMS +DOLE +DOLED +DOLEFUL +DOLEFULLER +DOLEFULLEST +DOLEFULLY +DOLEFULNESS +DOLEFULNESSES +DOLERITE +DOLERITES +DOLERITIC +DOLES +DOLESOME +DOLICHOCEPHALIC +DOLICHOCEPHALY +DOLING +DOLL +DOLLAR +DOLLARIZE +DOLLARIZED +DOLLARIZES +DOLLARIZING +DOLLARS +DOLLED +DOLLHOUSE +DOLLHOUSES +DOLLIED +DOLLIES +DOLLING +DOLLISH +DOLLISHLY +DOLLISHNESS +DOLLISHNESSES +DOLLOP +DOLLOPED +DOLLOPING +DOLLOPS +DOLLS +DOLLY +DOLLYBIRD +DOLLYBIRDS +DOLLYING +DOLMA +DOLMADES +DOLMAN +DOLMANS +DOLMAS +DOLMEN +DOLMENIC +DOLMENS +DOLOMITE +DOLOMITES +DOLOMITIC +DOLOMITIZATION +DOLOMITIZATIONS +DOLOMITIZE +DOLOMITIZED +DOLOMITIZES +DOLOMITIZING +DOLOR +DOLOROSO +DOLOROUS +DOLOROUSLY +DOLOROUSNESS +DOLOROUSNESSES +DOLORS +DOLOUR +DOLOURS +DOLPHIN +DOLPHINFISH +DOLPHINFISHES +DOLPHINS +DOLS +DOLT +DOLTISH +DOLTISHLY +DOLTISHNESS +DOLTISHNESSES +DOLTS +DOM +DOMAIN +DOMAINE +DOMAINES +DOMAINS +DOMAL +DOME +DOMED +DOMELIKE +DOMES +DOMESDAY +DOMESDAYS +DOMESTIC +DOMESTICALLY +DOMESTICATE +DOMESTICATED +DOMESTICATES +DOMESTICATING +DOMESTICATION +DOMESTICATIONS +DOMESTICITIES +DOMESTICITY +DOMESTICS +DOMIC +DOMICAL +DOMICALLY +DOMICIL +DOMICILE +DOMICILED +DOMICILES +DOMICILIARY +DOMICILIATE +DOMICILIATED +DOMICILIATES +DOMICILIATING +DOMICILIATION +DOMICILIATIONS +DOMICILING +DOMICILS +DOMINANCE +DOMINANCES +DOMINANCIES +DOMINANCY +DOMINANT +DOMINANTLY +DOMINANTS +DOMINATE +DOMINATED +DOMINATES +DOMINATING +DOMINATION +DOMINATIONS +DOMINATIVE +DOMINATOR +DOMINATORS +DOMINATRICES +DOMINATRIX +DOMINE +DOMINEER +DOMINEERED +DOMINEERING +DOMINEERINGLY +DOMINEERINGNESS +DOMINEERS +DOMINES +DOMING +DOMINICAL +DOMINICK +DOMINICKER +DOMINICKERS +DOMINICKS +DOMINIE +DOMINIES +DOMINION +DOMINIONS +DOMINIQUE +DOMINIQUES +DOMINIUM +DOMINIUMS +DOMINO +DOMINOES +DOMINOS +DOMS +DON +DONA +DONAS +DONATE +DONATED +DONATES +DONATING +DONATION +DONATIONS +DONATIVE +DONATIVES +DONATOR +DONATORS +DONE +DONEE +DONEES +DONENESS +DONENESSES +DONG +DONGA +DONGAS +DONGLE +DONGLES +DONGOLA +DONGOLAS +DONGS +DONJON +DONJONS +DONKEY +DONKEYS +DONKEYWORK +DONKEYWORKS +DONNA +DONNAS +DONNE +DONNED +DONNEE +DONNEES +DONNERD +DONNERED +DONNERT +DONNICKER +DONNICKERS +DONNIKER +DONNIKERS +DONNING +DONNISH +DONNISHLY +DONNISHNESS +DONNISHNESSES +DONNYBROOK +DONNYBROOKS +DONOR +DONORS +DONORSHIP +DONORSHIPS +DONS +DONSIE +DONSY +DONUT +DONUTS +DONZEL +DONZELS +DOOBIE +DOOBIES +DOODAD +DOODADS +DOODIES +DOODLE +DOODLEBUG +DOODLEBUGS +DOODLED +DOODLER +DOODLERS +DOODLES +DOODLING +DOODOO +DOODOOS +DOODY +DOOFUS +DOOFUSES +DOOHICKEY +DOOHICKEYS +DOOHICKIES +DOOLEE +DOOLEES +DOOLIE +DOOLIES +DOOLY +DOOM +DOOMED +DOOMFUL +DOOMFULLY +DOOMIER +DOOMIEST +DOOMILY +DOOMING +DOOMS +DOOMSAYER +DOOMSAYERS +DOOMSAYING +DOOMSAYINGS +DOOMSDAY +DOOMSDAYER +DOOMSDAYERS +DOOMSDAYS +DOOMSTER +DOOMSTERS +DOOMY +DOOR +DOORBELL +DOORBELLS +DOORJAMB +DOORJAMBS +DOORKEEPER +DOORKEEPERS +DOORKNOB +DOORKNOBS +DOORLESS +DOORMAN +DOORMAT +DOORMATS +DOORMEN +DOORNAIL +DOORNAILS +DOORPLATE +DOORPLATES +DOORPOST +DOORPOSTS +DOORS +DOORSILL +DOORSILLS +DOORSTEP +DOORSTEPS +DOORSTOP +DOORSTOPS +DOORWAY +DOORWAYS +DOORWOMAN +DOORWOMEN +DOORYARD +DOORYARDS +DOOWOP +DOOWOPS +DOOZER +DOOZERS +DOOZIE +DOOZIES +DOOZY +DOPA +DOPAMINE +DOPAMINERGIC +DOPAMINES +DOPANT +DOPANTS +DOPAS +DOPE +DOPED +DOPEHEAD +DOPEHEADS +DOPER +DOPERS +DOPES +DOPESHEET +DOPESHEETS +DOPESTER +DOPESTERS +DOPEY +DOPEYNESS +DOPEYNESSES +DOPIER +DOPIEST +DOPILY +DOPINESS +DOPINESSES +DOPING +DOPINGS +DOPPELGANGER +DOPPELGANGERS +DOPY +DOR +DORADO +DORADOS +DORBEETLE +DORBEETLES +DORBUG +DORBUGS +DORE +DORHAWK +DORHAWKS +DORIES +DORK +DORKIER +DORKIEST +DORKINESS +DORKINESSES +DORKS +DORKY +DORM +DORMANCIES +DORMANCY +DORMANT +DORMER +DORMERED +DORMERS +DORMICE +DORMIE +DORMIENT +DORMIN +DORMINS +DORMITORIES +DORMITORY +DORMOUSE +DORMS +DORMY +DORNECK +DORNECKS +DORNICK +DORNICKS +DORNOCK +DORNOCKS +DORONICUM +DORONICUMS +DORP +DORPER +DORPERS +DORPS +DORR +DORRS +DORS +DORSA +DORSAD +DORSAL +DORSALLY +DORSALS +DORSEL +DORSELS +DORSER +DORSERS +DORSIVENTRAL +DORSIVENTRALITY +DORSIVENTRALLY +DORSOLATERAL +DORSOVENTRAL +DORSOVENTRALITY +DORSOVENTRALLY +DORSUM +DORTY +DORY +DOS +DOSAGE +DOSAGES +DOSE +DOSED +DOSER +DOSERS +DOSES +DOSIMETER +DOSIMETERS +DOSIMETRIC +DOSIMETRIES +DOSIMETRY +DOSING +DOSS +DOSSAL +DOSSALS +DOSSED +DOSSEL +DOSSELS +DOSSER +DOSSERET +DOSSERETS +DOSSERS +DOSSES +DOSSHOUSE +DOSSHOUSES +DOSSIER +DOSSIERS +DOSSIL +DOSSILS +DOSSING +DOST +DOT +DOTAGE +DOTAGES +DOTAL +DOTARD +DOTARDLY +DOTARDS +DOTATION +DOTATIONS +DOTE +DOTED +DOTER +DOTERS +DOTES +DOTH +DOTIER +DOTIEST +DOTING +DOTINGLY +DOTS +DOTTED +DOTTEL +DOTTELS +DOTTER +DOTTEREL +DOTTERELS +DOTTERS +DOTTIER +DOTTIEST +DOTTILY +DOTTINESS +DOTTINESSES +DOTTING +DOTTLE +DOTTLES +DOTTREL +DOTTRELS +DOTTY +DOTY +DOUBLE +DOUBLED +DOUBLEHEADER +DOUBLEHEADERS +DOUBLENESS +DOUBLENESSES +DOUBLER +DOUBLERS +DOUBLES +DOUBLESPEAK +DOUBLESPEAKER +DOUBLESPEAKERS +DOUBLESPEAKS +DOUBLET +DOUBLETHINK +DOUBLETHINKS +DOUBLETON +DOUBLETONS +DOUBLETS +DOUBLING +DOUBLOON +DOUBLOONS +DOUBLURE +DOUBLURES +DOUBLY +DOUBT +DOUBTABLE +DOUBTED +DOUBTER +DOUBTERS +DOUBTFUL +DOUBTFULLY +DOUBTFULNESS +DOUBTFULNESSES +DOUBTING +DOUBTINGLY +DOUBTLESS +DOUBTLESSLY +DOUBTLESSNESS +DOUBTLESSNESSES +DOUBTS +DOUCE +DOUCELY +DOUCEUR +DOUCEURS +DOUCHE +DOUCHEBAG +DOUCHEBAGS +DOUCHED +DOUCHES +DOUCHING +DOUGH +DOUGHBOY +DOUGHBOYS +DOUGHFACE +DOUGHFACES +DOUGHIER +DOUGHIEST +DOUGHLIKE +DOUGHNUT +DOUGHNUTLIKE +DOUGHNUTS +DOUGHS +DOUGHT +DOUGHTIER +DOUGHTIEST +DOUGHTILY +DOUGHTINESS +DOUGHTINESSES +DOUGHTY +DOUGHY +DOULA +DOULAS +DOUM +DOUMA +DOUMAS +DOUMS +DOUPIONI +DOUPIONIS +DOUPPIONI +DOUPPIONIS +DOUR +DOURA +DOURAH +DOURAHS +DOURAS +DOURER +DOUREST +DOURINE +DOURINES +DOURLY +DOURNESS +DOURNESSES +DOUROUCOULI +DOUROUCOULIS +DOUSE +DOUSED +DOUSER +DOUSERS +DOUSES +DOUSING +DOUX +DOUZEPER +DOUZEPERS +DOVE +DOVECOT +DOVECOTE +DOVECOTES +DOVECOTS +DOVEKEY +DOVEKEYS +DOVEKIE +DOVEKIES +DOVELIKE +DOVEN +DOVENED +DOVENING +DOVENS +DOVES +DOVETAIL +DOVETAILED +DOVETAILING +DOVETAILS +DOVISH +DOVISHNESS +DOVISHNESSES +DOW +DOWABLE +DOWAGER +DOWAGERS +DOWDIER +DOWDIES +DOWDIEST +DOWDILY +DOWDINESS +DOWDINESSES +DOWDY +DOWDYISH +DOWED +DOWEL +DOWELED +DOWELING +DOWELLED +DOWELLING +DOWELS +DOWER +DOWERED +DOWERIES +DOWERING +DOWERLESS +DOWERS +DOWERY +DOWIE +DOWING +DOWITCHER +DOWITCHERS +DOWN +DOWNBEAT +DOWNBEATS +DOWNBOW +DOWNBOWS +DOWNBURST +DOWNBURSTS +DOWNCAST +DOWNCASTS +DOWNCOME +DOWNCOMES +DOWNCOURT +DOWNDRAFT +DOWNDRAFTS +DOWNED +DOWNER +DOWNERS +DOWNFALL +DOWNFALLEN +DOWNFALLS +DOWNFIELD +DOWNFORCE +DOWNFORCES +DOWNGRADE +DOWNGRADED +DOWNGRADES +DOWNGRADING +DOWNHAUL +DOWNHAULS +DOWNHEARTED +DOWNHEARTEDLY +DOWNHEARTEDNESS +DOWNHILL +DOWNHILLER +DOWNHILLERS +DOWNHILLS +DOWNIER +DOWNIEST +DOWNINESS +DOWNINESSES +DOWNING +DOWNLAND +DOWNLANDS +DOWNLESS +DOWNLIGHT +DOWNLIGHTS +DOWNLIKE +DOWNLINK +DOWNLINKED +DOWNLINKING +DOWNLINKS +DOWNLOAD +DOWNLOADABLE +DOWNLOADED +DOWNLOADING +DOWNLOADS +DOWNPIPE +DOWNPIPES +DOWNPLAY +DOWNPLAYED +DOWNPLAYING +DOWNPLAYS +DOWNPOUR +DOWNPOURS +DOWNRANGE +DOWNRIGHT +DOWNRIGHTLY +DOWNRIGHTNESS +DOWNRIGHTNESSES +DOWNRIVER +DOWNS +DOWNSCALE +DOWNSCALED +DOWNSCALES +DOWNSCALING +DOWNSHIFT +DOWNSHIFTED +DOWNSHIFTING +DOWNSHIFTS +DOWNSIDE +DOWNSIDES +DOWNSIZE +DOWNSIZED +DOWNSIZES +DOWNSIZING +DOWNSLIDE +DOWNSLIDES +DOWNSLOPE +DOWNSPIN +DOWNSPINS +DOWNSPOUT +DOWNSPOUTS +DOWNSTAGE +DOWNSTAGES +DOWNSTAIR +DOWNSTAIRS +DOWNSTATE +DOWNSTATER +DOWNSTATERS +DOWNSTATES +DOWNSTREAM +DOWNSTROKE +DOWNSTROKES +DOWNSWING +DOWNSWINGS +DOWNTHROW +DOWNTHROWS +DOWNTICK +DOWNTICKS +DOWNTIME +DOWNTIMES +DOWNTOWN +DOWNTOWNER +DOWNTOWNERS +DOWNTOWNS +DOWNTREND +DOWNTRENDED +DOWNTRENDING +DOWNTRENDS +DOWNTROD +DOWNTRODDEN +DOWNTURN +DOWNTURNS +DOWNWARD +DOWNWARDLY +DOWNWARDNESS +DOWNWARDNESSES +DOWNWARDS +DOWNWASH +DOWNWASHES +DOWNWIND +DOWNY +DOWNZONE +DOWNZONED +DOWNZONES +DOWNZONING +DOWRIES +DOWRY +DOWS +DOWSABEL +DOWSABELS +DOWSE +DOWSED +DOWSER +DOWSERS +DOWSES +DOWSING +DOXIE +DOXIES +DOXOLOGIES +DOXOLOGY +DOXORUBICIN +DOXORUBICINS +DOXY +DOXYCYCLINE +DOXYCYCLINES +DOYEN +DOYENNE +DOYENNES +DOYENS +DOYLEY +DOYLEYS +DOYLIES +DOYLY +DOZE +DOZED +DOZEN +DOZENED +DOZENING +DOZENS +DOZENTH +DOZENTHS +DOZER +DOZERS +DOZES +DOZIER +DOZIEST +DOZILY +DOZINESS +DOZINESSES +DOZING +DOZY +DRAB +DRABBED +DRABBER +DRABBEST +DRABBET +DRABBETS +DRABBING +DRABBLE +DRABBLED +DRABBLES +DRABBLING +DRABLY +DRABNESS +DRABNESSES +DRABS +DRACAENA +DRACAENAS +DRACENA +DRACENAS +DRACHM +DRACHMA +DRACHMAE +DRACHMAI +DRACHMAS +DRACHMS +DRACONIAN +DRACONIC +DRAFF +DRAFFIER +DRAFFIEST +DRAFFISH +DRAFFS +DRAFFY +DRAFT +DRAFTABLE +DRAFTED +DRAFTEE +DRAFTEES +DRAFTER +DRAFTERS +DRAFTIER +DRAFTIEST +DRAFTILY +DRAFTINESS +DRAFTINESSES +DRAFTING +DRAFTINGS +DRAFTS +DRAFTSMAN +DRAFTSMANSHIP +DRAFTSMANSHIPS +DRAFTSMEN +DRAFTSPERSON +DRAFTSPERSONS +DRAFTY +DRAG +DRAGEE +DRAGEES +DRAGGED +DRAGGER +DRAGGERS +DRAGGIER +DRAGGIEST +DRAGGING +DRAGGINGLY +DRAGGLE +DRAGGLED +DRAGGLES +DRAGGLING +DRAGGY +DRAGLINE +DRAGLINES +DRAGNET +DRAGNETS +DRAGOMAN +DRAGOMANS +DRAGOMEN +DRAGON +DRAGONET +DRAGONETS +DRAGONFLIES +DRAGONFLY +DRAGONHEAD +DRAGONHEADS +DRAGONISH +DRAGONS +DRAGOON +DRAGOONED +DRAGOONING +DRAGOONS +DRAGROPE +DRAGROPES +DRAGS +DRAGSTER +DRAGSTERS +DRAGSTRIP +DRAGSTRIPS +DRAIL +DRAILS +DRAIN +DRAINABLE +DRAINAGE +DRAINAGES +DRAINED +DRAINER +DRAINERS +DRAINING +DRAINPIPE +DRAINPIPES +DRAINS +DRAKE +DRAKES +DRAM +DRAMA +DRAMADIES +DRAMADY +DRAMAS +DRAMATIC +DRAMATICALLY +DRAMATICS +DRAMATISATION +DRAMATISATIONS +DRAMATISE +DRAMATISED +DRAMATISES +DRAMATISING +DRAMATIST +DRAMATISTS +DRAMATIZABLE +DRAMATIZATION +DRAMATIZATIONS +DRAMATIZE +DRAMATIZED +DRAMATIZES +DRAMATIZING +DRAMATURG +DRAMATURGE +DRAMATURGES +DRAMATURGIC +DRAMATURGICAL +DRAMATURGICALLY +DRAMATURGIES +DRAMATURGY +DRAMEDIES +DRAMEDY +DRAMMED +DRAMMING +DRAMMOCK +DRAMMOCKS +DRAMS +DRAMSHOP +DRAMSHOPS +DRANK +DRAPABILITIES +DRAPABILITY +DRAPABLE +DRAPE +DRAPEABILITIES +DRAPEABILITY +DRAPEABLE +DRAPED +DRAPER +DRAPERIED +DRAPERIES +DRAPERS +DRAPERY +DRAPES +DRAPEY +DRAPING +DRASTIC +DRASTICALLY +DRAT +DRATS +DRATTED +DRATTING +DRAUGHT +DRAUGHTED +DRAUGHTIER +DRAUGHTIEST +DRAUGHTING +DRAUGHTS +DRAUGHTSMAN +DRAUGHTSMEN +DRAUGHTY +DRAVE +DRAW +DRAWABLE +DRAWBACK +DRAWBACKS +DRAWBAR +DRAWBARS +DRAWBORE +DRAWBORES +DRAWBRIDGE +DRAWBRIDGES +DRAWDOWN +DRAWDOWNS +DRAWEE +DRAWEES +DRAWER +DRAWERFUL +DRAWERFULS +DRAWERS +DRAWING +DRAWINGS +DRAWKNIFE +DRAWKNIVES +DRAWL +DRAWLED +DRAWLER +DRAWLERS +DRAWLIER +DRAWLIEST +DRAWLING +DRAWLINGLY +DRAWLS +DRAWLY +DRAWN +DRAWNWORK +DRAWNWORKS +DRAWPLATE +DRAWPLATES +DRAWS +DRAWSHAVE +DRAWSHAVES +DRAWSTRING +DRAWSTRINGS +DRAWTUBE +DRAWTUBES +DRAY +DRAYAGE +DRAYAGES +DRAYED +DRAYING +DRAYMAN +DRAYMEN +DRAYS +DREAD +DREADED +DREADFUL +DREADFULLY +DREADFULNESS +DREADFULNESSES +DREADFULS +DREADING +DREADLOCK +DREADLOCKS +DREADNOUGHT +DREADNOUGHTS +DREADS +DREAM +DREAMBOAT +DREAMBOATS +DREAMED +DREAMER +DREAMERS +DREAMFUL +DREAMFULLY +DREAMFULNESS +DREAMFULNESSES +DREAMIER +DREAMIEST +DREAMILY +DREAMINESS +DREAMINESSES +DREAMING +DREAMLAND +DREAMLANDS +DREAMLESS +DREAMLESSLY +DREAMLESSNESS +DREAMLESSNESSES +DREAMLIKE +DREAMS +DREAMT +DREAMTIME +DREAMTIMES +DREAMWORLD +DREAMWORLDS +DREAMY +DREAR +DREARIER +DREARIES +DREARIEST +DREARILY +DREARINESS +DREARINESSES +DREARS +DREARY +DRECK +DRECKS +DRECKY +DREDGE +DREDGED +DREDGER +DREDGERS +DREDGES +DREDGING +DREDGINGS +DREE +DREED +DREEING +DREES +DREG +DREGGIER +DREGGIEST +DREGGISH +DREGGY +DREGS +DREICH +DREIDEL +DREIDELS +DREIDL +DREIDLS +DREIGH +DREK +DREKS +DRENCH +DRENCHED +DRENCHER +DRENCHERS +DRENCHES +DRENCHING +DRESS +DRESSAGE +DRESSAGES +DRESSED +DRESSER +DRESSERS +DRESSES +DRESSIER +DRESSIEST +DRESSILY +DRESSINESS +DRESSINESSES +DRESSING +DRESSINGS +DRESSMAKER +DRESSMAKERS +DRESSMAKING +DRESSMAKINGS +DRESSY +DREST +DREW +DRIB +DRIBBED +DRIBBING +DRIBBLE +DRIBBLED +DRIBBLER +DRIBBLERS +DRIBBLES +DRIBBLET +DRIBBLETS +DRIBBLING +DRIBBLY +DRIBLET +DRIBLETS +DRIBS +DRIED +DRIEGH +DRIER +DRIERS +DRIES +DRIEST +DRIFT +DRIFTAGE +DRIFTAGES +DRIFTED +DRIFTER +DRIFTERS +DRIFTIER +DRIFTIEST +DRIFTING +DRIFTINGLY +DRIFTPIN +DRIFTPINS +DRIFTS +DRIFTWOOD +DRIFTWOODS +DRIFTY +DRILL +DRILLABILITIES +DRILLABILITY +DRILLABLE +DRILLED +DRILLER +DRILLERS +DRILLING +DRILLINGS +DRILLMASTER +DRILLMASTERS +DRILLS +DRILY +DRINK +DRINKABILITIES +DRINKABILITY +DRINKABLE +DRINKABLES +DRINKABLY +DRINKER +DRINKERS +DRINKING +DRINKINGS +DRINKS +DRIP +DRIPLESS +DRIPPED +DRIPPER +DRIPPERS +DRIPPIER +DRIPPIEST +DRIPPILY +DRIPPING +DRIPPINGS +DRIPPY +DRIPS +DRIPSTONE +DRIPSTONES +DRIPT +DRIVABILITIES +DRIVABILITY +DRIVABLE +DRIVE +DRIVEABILITIES +DRIVEABILITY +DRIVEABLE +DRIVEL +DRIVELED +DRIVELER +DRIVELERS +DRIVELINE +DRIVELINES +DRIVELING +DRIVELLED +DRIVELLER +DRIVELLERS +DRIVELLING +DRIVELS +DRIVEN +DRIVENNESS +DRIVENNESSES +DRIVER +DRIVERLESS +DRIVERS +DRIVES +DRIVESHAFT +DRIVESHAFTS +DRIVETRAIN +DRIVETRAINS +DRIVEWAY +DRIVEWAYS +DRIVING +DRIVINGLY +DRIVINGS +DRIZZLE +DRIZZLED +DRIZZLES +DRIZZLIER +DRIZZLIEST +DRIZZLING +DRIZZLINGLY +DRIZZLY +DROGUE +DROGUES +DROID +DROIDS +DROIT +DROITS +DROLL +DROLLED +DROLLER +DROLLERIES +DROLLERY +DROLLEST +DROLLING +DROLLNESS +DROLLNESSES +DROLLS +DROLLY +DROMEDARIES +DROMEDARY +DROMON +DROMOND +DROMONDS +DROMONS +DRONE +DRONED +DRONER +DRONERS +DRONES +DRONGO +DRONGOS +DRONING +DRONINGLY +DRONISH +DROOL +DROOLED +DROOLIER +DROOLIEST +DROOLING +DROOLS +DROOLY +DROOP +DROOPED +DROOPIER +DROOPIEST +DROOPILY +DROOPING +DROOPINGLY +DROOPS +DROOPY +DROP +DROPCLOTH +DROPCLOTHS +DROPFORGE +DROPFORGED +DROPFORGES +DROPFORGING +DROPHEAD +DROPHEADS +DROPKICK +DROPKICKER +DROPKICKERS +DROPKICKS +DROPLET +DROPLETS +DROPLIGHT +DROPLIGHTS +DROPOUT +DROPOUTS +DROPPABLE +DROPPED +DROPPER +DROPPERFUL +DROPPERFULS +DROPPERS +DROPPERSFUL +DROPPING +DROPPINGS +DROPS +DROPSHOT +DROPSHOTS +DROPSICAL +DROPSIED +DROPSIES +DROPSONDE +DROPSONDES +DROPSY +DROPT +DROPWORT +DROPWORTS +DROSERA +DROSERAS +DROSHKIES +DROSHKY +DROSKIES +DROSKY +DROSOPHILA +DROSOPHILAS +DROSS +DROSSES +DROSSIER +DROSSIEST +DROSSY +DROUGHT +DROUGHTIER +DROUGHTIEST +DROUGHTINESS +DROUGHTINESSES +DROUGHTS +DROUGHTY +DROUK +DROUKED +DROUKING +DROUKS +DROUTH +DROUTHIER +DROUTHIEST +DROUTHS +DROUTHY +DROVE +DROVED +DROVER +DROVERS +DROVES +DROVING +DROWN +DROWND +DROWNDED +DROWNDING +DROWNDS +DROWNED +DROWNER +DROWNERS +DROWNING +DROWNS +DROWSE +DROWSED +DROWSES +DROWSIER +DROWSIEST +DROWSILY +DROWSINESS +DROWSINESSES +DROWSING +DROWSY +DRUB +DRUBBED +DRUBBER +DRUBBERS +DRUBBING +DRUBBINGS +DRUBS +DRUDGE +DRUDGED +DRUDGER +DRUDGERIES +DRUDGERS +DRUDGERY +DRUDGES +DRUDGING +DRUDGINGLY +DRUG +DRUGGED +DRUGGET +DRUGGETS +DRUGGIE +DRUGGIER +DRUGGIES +DRUGGIEST +DRUGGING +DRUGGIST +DRUGGISTS +DRUGGY +DRUGMAKER +DRUGMAKERS +DRUGS +DRUGSTORE +DRUGSTORES +DRUID +DRUIDESS +DRUIDESSES +DRUIDIC +DRUIDICAL +DRUIDISM +DRUIDISMS +DRUIDS +DRUM +DRUMBEAT +DRUMBEATER +DRUMBEATERS +DRUMBEATING +DRUMBEATINGS +DRUMBEATS +DRUMBLE +DRUMBLED +DRUMBLES +DRUMBLING +DRUMFIRE +DRUMFIRES +DRUMFISH +DRUMFISHES +DRUMHEAD +DRUMHEADS +DRUMLIER +DRUMLIEST +DRUMLIKE +DRUMLIN +DRUMLINS +DRUMLY +DRUMMED +DRUMMER +DRUMMERS +DRUMMING +DRUMROLL +DRUMROLLS +DRUMS +DRUMSTICK +DRUMSTICKS +DRUNK +DRUNKARD +DRUNKARDS +DRUNKEN +DRUNKENLY +DRUNKENNESS +DRUNKENNESSES +DRUNKER +DRUNKEST +DRUNKS +DRUPACEOUS +DRUPE +DRUPELET +DRUPELETS +DRUPES +DRUSE +DRUSES +DRUTHERS +DRY +DRYABLE +DRYAD +DRYADES +DRYADIC +DRYADS +DRYASDUST +DRYASDUSTS +DRYER +DRYERS +DRYEST +DRYING +DRYISH +DRYLAND +DRYLOT +DRYLOTS +DRYLY +DRYNESS +DRYNESSES +DRYOPITHECINE +DRYOPITHECINES +DRYPOINT +DRYPOINTS +DRYS +DRYSALTER +DRYSALTERIES +DRYSALTERS +DRYSALTERY +DRYSTONE +DRYWALL +DRYWALLED +DRYWALLING +DRYWALLS +DRYWELL +DRYWELLS +DUAD +DUADS +DUAL +DUALISM +DUALISMS +DUALIST +DUALISTIC +DUALISTICALLY +DUALISTS +DUALITIES +DUALITY +DUALIZE +DUALIZED +DUALIZES +DUALIZING +DUALLY +DUALS +DUB +DUBBED +DUBBER +DUBBERS +DUBBIN +DUBBING +DUBBINGS +DUBBINS +DUBIETIES +DUBIETY +DUBIOSITIES +DUBIOSITY +DUBIOUS +DUBIOUSLY +DUBIOUSNESS +DUBIOUSNESSES +DUBITABLE +DUBITABLY +DUBITATION +DUBITATIONS +DUBNIUM +DUBNIUMS +DUBONNET +DUBONNETS +DUBS +DUCAL +DUCALLY +DUCAT +DUCATS +DUCE +DUCES +DUCHESS +DUCHESSES +DUCHIES +DUCHY +DUCI +DUCK +DUCKBILL +DUCKBILLS +DUCKBOARD +DUCKBOARDS +DUCKED +DUCKER +DUCKERS +DUCKIE +DUCKIER +DUCKIES +DUCKIEST +DUCKING +DUCKLING +DUCKLINGS +DUCKPIN +DUCKPINS +DUCKS +DUCKTAIL +DUCKTAILS +DUCKWALK +DUCKWALKED +DUCKWALKING +DUCKWALKS +DUCKWEED +DUCKWEEDS +DUCKY +DUCT +DUCTAL +DUCTED +DUCTILE +DUCTILELY +DUCTILITIES +DUCTILITY +DUCTING +DUCTINGS +DUCTLESS +DUCTS +DUCTULE +DUCTULES +DUCTWORK +DUCTWORKS +DUD +DUDDIE +DUDDY +DUDE +DUDED +DUDEEN +DUDEENS +DUDES +DUDGEON +DUDGEONS +DUDING +DUDISH +DUDISHLY +DUDS +DUE +DUECENTO +DUECENTOS +DUEL +DUELED +DUELER +DUELERS +DUELING +DUELIST +DUELISTS +DUELLED +DUELLER +DUELLERS +DUELLI +DUELLING +DUELLIST +DUELLISTS +DUELLO +DUELLOS +DUELS +DUENDE +DUENDES +DUENESS +DUENESSES +DUENNA +DUENNAS +DUENNASHIP +DUENNASHIPS +DUES +DUET +DUETED +DUETING +DUETS +DUETTED +DUETTING +DUETTIST +DUETTISTS +DUFF +DUFFEL +DUFFELS +DUFFER +DUFFERS +DUFFLE +DUFFLES +DUFFS +DUFUS +DUFUSES +DUG +DUGONG +DUGONGS +DUGOUT +DUGOUTS +DUGS +DUH +DUI +DUIKER +DUIKERS +DUIT +DUITS +DUKE +DUKED +DUKEDOM +DUKEDOMS +DUKES +DUKING +DULCET +DULCETLY +DULCETS +DULCIANA +DULCIANAS +DULCIFIED +DULCIFIES +DULCIFY +DULCIFYING +DULCIMER +DULCIMERS +DULCIMORE +DULCIMORES +DULCINEA +DULCINEAS +DULIA +DULIAS +DULL +DULLARD +DULLARDS +DULLED +DULLER +DULLEST +DULLING +DULLISH +DULLISHLY +DULLNESS +DULLNESSES +DULLS +DULLSVILLE +DULLSVILLES +DULLY +DULNESS +DULNESSES +DULSE +DULSES +DULY +DUMA +DUMAS +DUMB +DUMBBELL +DUMBBELLS +DUMBCANE +DUMBCANES +DUMBED +DUMBER +DUMBEST +DUMBFOUND +DUMBFOUNDED +DUMBFOUNDER +DUMBFOUNDERED +DUMBFOUNDERING +DUMBFOUNDERS +DUMBFOUNDING +DUMBFOUNDS +DUMBHEAD +DUMBHEADS +DUMBING +DUMBLY +DUMBNESS +DUMBNESSES +DUMBO +DUMBOS +DUMBS +DUMBSTRUCK +DUMBWAITER +DUMBWAITERS +DUMDUM +DUMDUMS +DUMFOUND +DUMFOUNDED +DUMFOUNDING +DUMFOUNDS +DUMKA +DUMKY +DUMMIED +DUMMIES +DUMMKOPF +DUMMKOPFS +DUMMY +DUMMYING +DUMORTIERITE +DUMORTIERITES +DUMP +DUMPCART +DUMPCARTS +DUMPED +DUMPER +DUMPERS +DUMPIER +DUMPIEST +DUMPILY +DUMPINESS +DUMPINESSES +DUMPING +DUMPINGS +DUMPISH +DUMPLING +DUMPLINGS +DUMPS +DUMPSITE +DUMPSITES +DUMPSTER +DUMPSTERS +DUMPTRUCK +DUMPTRUCKS +DUMPY +DUN +DUNAM +DUNAMS +DUNCE +DUNCES +DUNCH +DUNCHES +DUNCICAL +DUNCISH +DUNCISHLY +DUNDERHEAD +DUNDERHEADED +DUNDERHEADS +DUNDREARIES +DUNE +DUNELAND +DUNELANDS +DUNELIKE +DUNES +DUNG +DUNGAREE +DUNGAREED +DUNGAREES +DUNGED +DUNGEON +DUNGEONED +DUNGEONING +DUNGEONS +DUNGHILL +DUNGHILLS +DUNGIER +DUNGIEST +DUNGING +DUNGS +DUNGY +DUNITE +DUNITES +DUNITIC +DUNK +DUNKED +DUNKER +DUNKERS +DUNKING +DUNKS +DUNLIN +DUNLINS +DUNNAGE +DUNNAGES +DUNNED +DUNNER +DUNNESS +DUNNESSES +DUNNEST +DUNNING +DUNNITE +DUNNITES +DUNS +DUNT +DUNTED +DUNTING +DUNTS +DUO +DUODECILLION +DUODECILLIONS +DUODECIMAL +DUODECIMALS +DUODECIMO +DUODECIMOS +DUODENA +DUODENAL +DUODENUM +DUODENUMS +DUOLOG +DUOLOGS +DUOLOGUE +DUOLOGUES +DUOMI +DUOMO +DUOMOS +DUOPOLIES +DUOPOLISTIC +DUOPOLY +DUOPSONIES +DUOPSONY +DUOS +DUOTONE +DUOTONES +DUP +DUPABLE +DUPE +DUPED +DUPER +DUPERIES +DUPERS +DUPERY +DUPES +DUPING +DUPLE +DUPLEX +DUPLEXED +DUPLEXER +DUPLEXERS +DUPLEXES +DUPLEXING +DUPLEXITIES +DUPLEXITY +DUPLICATE +DUPLICATED +DUPLICATES +DUPLICATING +DUPLICATION +DUPLICATIONS +DUPLICATIVE +DUPLICATOR +DUPLICATORS +DUPLICITIES +DUPLICITOUS +DUPLICITOUSLY +DUPLICITY +DUPPED +DUPPING +DUPS +DURA +DURABILITIES +DURABILITY +DURABLE +DURABLENESS +DURABLENESSES +DURABLES +DURABLY +DURAL +DURALUMIN +DURALUMINS +DURAMEN +DURAMENS +DURANCE +DURANCES +DURAS +DURATION +DURATIONS +DURATIVE +DURATIVES +DURBAR +DURBARS +DURE +DURED +DURES +DURESS +DURESSES +DURIAN +DURIANS +DURING +DURION +DURIONS +DURMAST +DURMASTS +DURN +DURNDEST +DURNED +DURNEDER +DURNEDEST +DURNING +DURNS +DURO +DUROC +DUROCS +DUROMETER +DUROMETERS +DUROS +DURR +DURRA +DURRAS +DURRIE +DURRIES +DURRS +DURST +DURUM +DURUMS +DUSK +DUSKED +DUSKIER +DUSKIEST +DUSKILY +DUSKINESS +DUSKINESSES +DUSKING +DUSKISH +DUSKS +DUSKY +DUST +DUSTBIN +DUSTBINS +DUSTCOVER +DUSTCOVERS +DUSTED +DUSTER +DUSTERS +DUSTHEAP +DUSTHEAPS +DUSTIER +DUSTIEST +DUSTILY +DUSTINESS +DUSTINESSES +DUSTING +DUSTINGS +DUSTLESS +DUSTLIKE +DUSTMAN +DUSTMEN +DUSTOFF +DUSTOFFS +DUSTPAN +DUSTPANS +DUSTPROOF +DUSTRAG +DUSTRAGS +DUSTS +DUSTSTORM +DUSTSTORMS +DUSTUP +DUSTUPS +DUSTY +DUTCH +DUTCHMAN +DUTCHMEN +DUTEOUS +DUTEOUSLY +DUTIABLE +DUTIES +DUTIFUL +DUTIFULLY +DUTIFULNESS +DUTIFULNESSES +DUTY +DUUMVIR +DUUMVIRATE +DUUMVIRATES +DUUMVIRI +DUUMVIRS +DUVET +DUVETINE +DUVETINES +DUVETS +DUVETYN +DUVETYNE +DUVETYNES +DUVETYNS +DUXELLES +DWARF +DWARFED +DWARFER +DWARFEST +DWARFING +DWARFISH +DWARFISHLY +DWARFISHNESS +DWARFISHNESSES +DWARFISM +DWARFISMS +DWARFLIKE +DWARFNESS +DWARFNESSES +DWARFS +DWARVES +DWEEB +DWEEBIER +DWEEBIEST +DWEEBISH +DWEEBS +DWEEBY +DWELL +DWELLED +DWELLER +DWELLERS +DWELLING +DWELLINGS +DWELLS +DWELT +DWINDLE +DWINDLED +DWINDLES +DWINDLING +DWINE +DWINED +DWINES +DWINING +DYABLE +DYAD +DYADIC +DYADICALLY +DYADICS +DYADS +DYARCHIC +DYARCHIES +DYARCHY +DYBBUK +DYBBUKIM +DYBBUKS +DYE +DYEABILITIES +DYEABILITY +DYEABLE +DYED +DYEING +DYEINGS +DYER +DYERS +DYES +DYESTUFF +DYESTUFFS +DYEWEED +DYEWEEDS +DYEWOOD +DYEWOODS +DYING +DYINGS +DYKE +DYKED +DYKES +DYKEY +DYKING +DYNAMETER +DYNAMETERS +DYNAMIC +DYNAMICAL +DYNAMICALLY +DYNAMICS +DYNAMISM +DYNAMISMS +DYNAMIST +DYNAMISTIC +DYNAMISTS +DYNAMITE +DYNAMITED +DYNAMITER +DYNAMITERS +DYNAMITES +DYNAMITIC +DYNAMITING +DYNAMO +DYNAMOMETER +DYNAMOMETERS +DYNAMOMETRIC +DYNAMOMETRIES +DYNAMOMETRY +DYNAMOS +DYNAMOTOR +DYNAMOTORS +DYNAST +DYNASTIC +DYNASTICALLY +DYNASTIES +DYNASTS +DYNASTY +DYNATRON +DYNATRONS +DYNE +DYNEIN +DYNEINS +DYNEL +DYNELS +DYNES +DYNODE +DYNODES +DYNORPHIN +DYNORPHINS +DYSARTHRIA +DYSARTHRIAS +DYSCRASIA +DYSCRASIAS +DYSCRASIC +DYSCRATIC +DYSENTERIC +DYSENTERIES +DYSENTERY +DYSFUNCTION +DYSFUNCTIONAL +DYSFUNCTIONS +DYSGENESES +DYSGENESIS +DYSGENIC +DYSGENICS +DYSKINESIA +DYSKINESIAS +DYSKINETIC +DYSLECTIC +DYSLECTICS +DYSLEXIA +DYSLEXIAS +DYSLEXIC +DYSLEXICS +DYSLOGISTIC +DYSLOGISTICALLY +DYSMENORRHEA +DYSMENORRHEAS +DYSMENORRHEIC +DYSPEPSIA +DYSPEPSIAS +DYSPEPSIES +DYSPEPSY +DYSPEPTIC +DYSPEPTICALLY +DYSPEPTICS +DYSPHAGIA +DYSPHAGIAS +DYSPHAGIC +DYSPHASIA +DYSPHASIAS +DYSPHASIC +DYSPHASICS +DYSPHEMISM +DYSPHEMISMS +DYSPHEMISTIC +DYSPHONIA +DYSPHONIAS +DYSPHONIC +DYSPHORIA +DYSPHORIAS +DYSPHORIC +DYSPLASIA +DYSPLASIAS +DYSPLASTIC +DYSPNEA +DYSPNEAL +DYSPNEAS +DYSPNEIC +DYSPNOEA +DYSPNOEAS +DYSPNOIC +DYSPROSIUM +DYSPROSIUMS +DYSRHYTHMIA +DYSRHYTHMIAS +DYSRHYTHMIC +DYSTAXIA +DYSTAXIAS +DYSTHYMIA +DYSTHYMIAS +DYSTHYMIC +DYSTHYMICS +DYSTOCIA +DYSTOCIAS +DYSTONIA +DYSTONIAS +DYSTONIC +DYSTOPIA +DYSTOPIAN +DYSTOPIAS +DYSTROPHIC +DYSTROPHIES +DYSTROPHY +DYSURIA +DYSURIAS +DYSURIC +DYVOUR +DYVOURS +EACH +EAGER +EAGERER +EAGEREST +EAGERLY +EAGERNESS +EAGERNESSES +EAGERS +EAGLE +EAGLED +EAGLES +EAGLET +EAGLETS +EAGLEWOOD +EAGLEWOODS +EAGLING +EAGRE +EAGRES +EALDORMAN +EALDORMEN +EANLING +EANLINGS +EAR +EARACHE +EARACHES +EARBUD +EARBUDS +EARDROP +EARDROPS +EARDRUM +EARDRUMS +EARED +EARFLAP +EARFLAPS +EARFUL +EARFULS +EARING +EARINGS +EARL +EARLAP +EARLAPS +EARLDOM +EARLDOMS +EARLESS +EARLIER +EARLIEST +EARLINESS +EARLINESSES +EARLOBE +EARLOBES +EARLOCK +EARLOCKS +EARLS +EARLSHIP +EARLSHIPS +EARLY +EARLYWOOD +EARLYWOODS +EARMARK +EARMARKED +EARMARKING +EARMARKS +EARMUFF +EARMUFFS +EARN +EARNED +EARNER +EARNERS +EARNEST +EARNESTLY +EARNESTNESS +EARNESTNESSES +EARNESTS +EARNING +EARNINGS +EARNS +EARPHONE +EARPHONES +EARPIECE +EARPIECES +EARPLUG +EARPLUGS +EARRING +EARRINGED +EARRINGS +EARS +EARSHOT +EARSHOTS +EARSPLITTING +EARSTONE +EARSTONES +EARTH +EARTHBORN +EARTHBOUND +EARTHED +EARTHEN +EARTHENWARE +EARTHENWARES +EARTHIER +EARTHIEST +EARTHILY +EARTHINESS +EARTHINESSES +EARTHING +EARTHLIER +EARTHLIEST +EARTHLIGHT +EARTHLIGHTS +EARTHLIKE +EARTHLINESS +EARTHLINESSES +EARTHLING +EARTHLINGS +EARTHLY +EARTHMAN +EARTHMEN +EARTHMOVER +EARTHMOVERS +EARTHMOVING +EARTHMOVINGS +EARTHNUT +EARTHNUTS +EARTHPEA +EARTHPEAS +EARTHQUAKE +EARTHQUAKES +EARTHRISE +EARTHRISES +EARTHS +EARTHSET +EARTHSETS +EARTHSHAKER +EARTHSHAKERS +EARTHSHAKING +EARTHSHAKINGLY +EARTHSHINE +EARTHSHINES +EARTHSTAR +EARTHSTARS +EARTHWARD +EARTHWARDS +EARTHWORK +EARTHWORKS +EARTHWORM +EARTHWORMS +EARTHY +EARWAX +EARWAXES +EARWIG +EARWIGGED +EARWIGGING +EARWIGS +EARWITNESS +EARWITNESSES +EARWORM +EARWORMS +EASE +EASED +EASEFUL +EASEFULLY +EASEL +EASELED +EASELS +EASEMENT +EASEMENTS +EASES +EASIER +EASIES +EASIEST +EASILY +EASINESS +EASINESSES +EASING +EAST +EASTBOUND +EASTER +EASTERLIES +EASTERLY +EASTERN +EASTERNER +EASTERNERS +EASTERNMOST +EASTERS +EASTING +EASTINGS +EASTS +EASTWARD +EASTWARDS +EASY +EASYGOING +EASYGOINGNESS +EASYGOINGNESSES +EAT +EATABLE +EATABLES +EATEN +EATER +EATERIES +EATERS +EATERY +EATH +EATING +EATINGS +EATS +EAU +EAUX +EAVE +EAVED +EAVES +EAVESDROP +EAVESDROPPED +EAVESDROPPER +EAVESDROPPERS +EAVESDROPPING +EAVESDROPS +EBB +EBBED +EBBET +EBBETS +EBBING +EBBS +EBON +EBONICS +EBONIES +EBONISE +EBONISED +EBONISES +EBONISING +EBONITE +EBONITES +EBONIZE +EBONIZED +EBONIZES +EBONIZING +EBONS +EBONY +EBOOK +EBOOKS +EBULLIENCE +EBULLIENCES +EBULLIENCIES +EBULLIENCY +EBULLIENT +EBULLIENTLY +EBULLITION +EBULLITIONS +ECARTE +ECARTES +ECAUDATE +ECBOLIC +ECBOLICS +ECCENTRIC +ECCENTRICALLY +ECCENTRICITIES +ECCENTRICITY +ECCENTRICS +ECCHYMOSES +ECCHYMOSIS +ECCHYMOTIC +ECCLESIA +ECCLESIAE +ECCLESIAL +ECCLESIASTIC +ECCLESIASTICAL +ECCLESIASTICISM +ECCLESIASTICS +ECCLESIOLOGICAL +ECCLESIOLOGIES +ECCLESIOLOGIST +ECCLESIOLOGISTS +ECCLESIOLOGY +ECCRINE +ECDYSES +ECDYSIAL +ECDYSIAST +ECDYSIASTS +ECDYSIS +ECDYSON +ECDYSONE +ECDYSONES +ECDYSONS +ECESIC +ECESIS +ECESISES +ECHARD +ECHARDS +ECHE +ECHED +ECHELLE +ECHELLES +ECHELON +ECHELONED +ECHELONING +ECHELONS +ECHES +ECHEVERIA +ECHEVERIAS +ECHIDNA +ECHIDNAE +ECHIDNAS +ECHINACEA +ECHINACEAS +ECHINATE +ECHINATED +ECHING +ECHINI +ECHINOCOCCI +ECHINOCOCCOSES +ECHINOCOCCOSIS +ECHINOCOCCUS +ECHINODERM +ECHINODERMATOUS +ECHINODERMS +ECHINOID +ECHINOIDS +ECHINUS +ECHIUROID +ECHIUROIDS +ECHO +ECHOCARDIOGRAM +ECHOCARDIOGRAMS +ECHOED +ECHOER +ECHOERS +ECHOES +ECHOEY +ECHOGRAM +ECHOGRAMS +ECHOIC +ECHOING +ECHOISM +ECHOISMS +ECHOLALIA +ECHOLALIAS +ECHOLALIC +ECHOLESS +ECHOLOCATION +ECHOLOCATIONS +ECHOS +ECHOVIRUS +ECHOVIRUSES +ECHT +ECLAIR +ECLAIRCISSEMENT +ECLAIRS +ECLAMPSIA +ECLAMPSIAS +ECLAMPTIC +ECLAT +ECLATS +ECLECTIC +ECLECTICALLY +ECLECTICISM +ECLECTICISMS +ECLECTICS +ECLIPSE +ECLIPSED +ECLIPSER +ECLIPSERS +ECLIPSES +ECLIPSING +ECLIPSIS +ECLIPSISES +ECLIPTIC +ECLIPTICS +ECLOGITE +ECLOGITES +ECLOGUE +ECLOGUES +ECLOSION +ECLOSIONS +ECOCATASTROPHE +ECOCATASTROPHES +ECOCIDAL +ECOCIDE +ECOCIDES +ECOFEMINISM +ECOFEMINISMS +ECOFEMINIST +ECOFEMINISTS +ECOFREAK +ECOFREAKS +ECOLOGIC +ECOLOGICAL +ECOLOGICALLY +ECOLOGIES +ECOLOGIST +ECOLOGISTS +ECOLOGY +ECONOBOX +ECONOBOXES +ECONOMETRIC +ECONOMETRICALLY +ECONOMETRICIAN +ECONOMETRICIANS +ECONOMETRICS +ECONOMETRIST +ECONOMETRISTS +ECONOMIC +ECONOMICAL +ECONOMICALLY +ECONOMICS +ECONOMIES +ECONOMISE +ECONOMISED +ECONOMISES +ECONOMISING +ECONOMIST +ECONOMISTS +ECONOMIZE +ECONOMIZED +ECONOMIZER +ECONOMIZERS +ECONOMIZES +ECONOMIZING +ECONOMY +ECOPHYSIOLOGIES +ECOPHYSIOLOGY +ECOSPECIES +ECOSPHERE +ECOSPHERES +ECOSYSTEM +ECOSYSTEMS +ECOTAGE +ECOTAGES +ECOTERRORISM +ECOTERRORISMS +ECOTERRORIST +ECOTERRORISTS +ECOTONAL +ECOTONE +ECOTONES +ECOTOUR +ECOTOURISM +ECOTOURISMS +ECOTOURIST +ECOTOURISTS +ECOTOURS +ECOTYPE +ECOTYPES +ECOTYPIC +ECRASEUR +ECRASEURS +ECRU +ECRUS +ECSTASIES +ECSTASY +ECSTATIC +ECSTATICALLY +ECSTATICS +ECTASES +ECTASIS +ECTATIC +ECTHYMA +ECTHYMATA +ECTOBLAST +ECTOBLASTS +ECTODERM +ECTODERMAL +ECTODERMS +ECTOGENIC +ECTOMERE +ECTOMERES +ECTOMERIC +ECTOMORPH +ECTOMORPHIC +ECTOMORPHS +ECTOPARASITE +ECTOPARASITES +ECTOPARASITIC +ECTOPIA +ECTOPIAS +ECTOPIC +ECTOPICALLY +ECTOPLASM +ECTOPLASMIC +ECTOPLASMS +ECTOPROCT +ECTOPROCTS +ECTOSARC +ECTOSARCS +ECTOTHERM +ECTOTHERMIC +ECTOTHERMS +ECTOTROPHIC +ECTOZOA +ECTOZOAN +ECTOZOANS +ECTOZOON +ECTYPAL +ECTYPE +ECTYPES +ECU +ECUMENIC +ECUMENICAL +ECUMENICALISM +ECUMENICALISMS +ECUMENICALLY +ECUMENICISM +ECUMENICISMS +ECUMENICIST +ECUMENICISTS +ECUMENICITIES +ECUMENICITY +ECUMENICS +ECUMENISM +ECUMENISMS +ECUMENIST +ECUMENISTS +ECUS +ECZEMA +ECZEMAS +ECZEMATOUS +ED +EDACIOUS +EDACITIES +EDACITY +EDAPHIC +EDAPHICALLY +EDDIED +EDDIES +EDDO +EDDOES +EDDY +EDDYING +EDELWEISS +EDELWEISSES +EDEMA +EDEMAS +EDEMATA +EDEMATOSE +EDEMATOUS +EDENIC +EDENTATE +EDENTATES +EDENTULOUS +EDGE +EDGED +EDGELESS +EDGER +EDGERS +EDGES +EDGEWAYS +EDGEWISE +EDGIER +EDGIEST +EDGILY +EDGINESS +EDGINESSES +EDGING +EDGINGS +EDGY +EDH +EDHS +EDIBILITIES +EDIBILITY +EDIBLE +EDIBLENESS +EDIBLENESSES +EDIBLES +EDICT +EDICTAL +EDICTALLY +EDICTS +EDIFICATION +EDIFICATIONS +EDIFICE +EDIFICES +EDIFICIAL +EDIFIED +EDIFIER +EDIFIERS +EDIFIES +EDIFY +EDIFYING +EDILE +EDILES +EDIT +EDITABLE +EDITED +EDITING +EDITION +EDITIONS +EDITOR +EDITORIAL +EDITORIALIST +EDITORIALISTS +EDITORIALIZE +EDITORIALIZED +EDITORIALIZER +EDITORIALIZERS +EDITORIALIZES +EDITORIALIZING +EDITORIALLY +EDITORIALS +EDITORS +EDITORSHIP +EDITORSHIPS +EDITRESS +EDITRESSES +EDITRICES +EDITRIX +EDITRIXES +EDITS +EDS +EDUCABILITIES +EDUCABILITY +EDUCABLE +EDUCABLES +EDUCATE +EDUCATED +EDUCATEDNESS +EDUCATEDNESSES +EDUCATES +EDUCATING +EDUCATION +EDUCATIONAL +EDUCATIONALIST +EDUCATIONALISTS +EDUCATIONALLY +EDUCATIONESE +EDUCATIONESES +EDUCATIONIST +EDUCATIONISTS +EDUCATIONS +EDUCATIVE +EDUCATOR +EDUCATORS +EDUCATORY +EDUCE +EDUCED +EDUCES +EDUCIBLE +EDUCING +EDUCT +EDUCTION +EDUCTIONS +EDUCTIVE +EDUCTOR +EDUCTORS +EDUCTS +EDULCORATE +EDULCORATED +EDULCORATES +EDULCORATING +EDUTAINMENT +EDUTAINMENTS +EEK +EEL +EELGRASS +EELGRASSES +EELIER +EELIEST +EELLIKE +EELPOUT +EELPOUTS +EELS +EELWORM +EELWORMS +EELY +EERIE +EERIER +EERIEST +EERILY +EERINESS +EERINESSES +EERY +EF +EFF +EFFABLE +EFFACE +EFFACEABLE +EFFACED +EFFACEMENT +EFFACEMENTS +EFFACER +EFFACERS +EFFACES +EFFACING +EFFECT +EFFECTED +EFFECTER +EFFECTERS +EFFECTING +EFFECTIVE +EFFECTIVELY +EFFECTIVENESS +EFFECTIVENESSES +EFFECTIVES +EFFECTIVITIES +EFFECTIVITY +EFFECTOR +EFFECTORS +EFFECTS +EFFECTUAL +EFFECTUALITIES +EFFECTUALITY +EFFECTUALLY +EFFECTUALNESS +EFFECTUALNESSES +EFFECTUATE +EFFECTUATED +EFFECTUATES +EFFECTUATING +EFFECTUATION +EFFECTUATIONS +EFFEMINACIES +EFFEMINACY +EFFEMINATE +EFFEMINATES +EFFENDI +EFFENDIS +EFFERENT +EFFERENTLY +EFFERENTS +EFFERVESCE +EFFERVESCED +EFFERVESCENCE +EFFERVESCENCES +EFFERVESCENT +EFFERVESCENTLY +EFFERVESCES +EFFERVESCING +EFFETE +EFFETELY +EFFETENESS +EFFETENESSES +EFFICACIES +EFFICACIOUS +EFFICACIOUSLY +EFFICACIOUSNESS +EFFICACITIES +EFFICACITY +EFFICACY +EFFICIENCIES +EFFICIENCY +EFFICIENT +EFFICIENTLY +EFFIGIAL +EFFIGIES +EFFIGY +EFFLORESCE +EFFLORESCED +EFFLORESCENCE +EFFLORESCENCES +EFFLORESCENT +EFFLORESCES +EFFLORESCING +EFFLUENCE +EFFLUENCES +EFFLUENT +EFFLUENTS +EFFLUVIA +EFFLUVIAL +EFFLUVIUM +EFFLUVIUMS +EFFLUX +EFFLUXES +EFFLUXION +EFFLUXIONS +EFFORT +EFFORTFUL +EFFORTFULLY +EFFORTFULNESS +EFFORTFULNESSES +EFFORTLESS +EFFORTLESSLY +EFFORTLESSNESS +EFFORTS +EFFRONTERIES +EFFRONTERY +EFFS +EFFULGE +EFFULGED +EFFULGENCE +EFFULGENCES +EFFULGENT +EFFULGES +EFFULGING +EFFUSE +EFFUSED +EFFUSES +EFFUSING +EFFUSION +EFFUSIONS +EFFUSIVE +EFFUSIVELY +EFFUSIVENESS +EFFUSIVENESSES +EFS +EFT +EFTS +EFTSOON +EFTSOONS +EGAD +EGADS +EGAL +EGALITARIAN +EGALITARIANISM +EGALITARIANISMS +EGALITARIANS +EGALITE +EGALITES +EGER +EGERS +EGEST +EGESTA +EGESTED +EGESTING +EGESTION +EGESTIONS +EGESTIVE +EGESTS +EGG +EGGAR +EGGARS +EGGBEATER +EGGBEATERS +EGGCUP +EGGCUPS +EGGED +EGGER +EGGERS +EGGFRUIT +EGGFRUITS +EGGHEAD +EGGHEADED +EGGHEADEDNESS +EGGHEADEDNESSES +EGGHEADS +EGGING +EGGLESS +EGGNOG +EGGNOGS +EGGPLANT +EGGPLANTS +EGGS +EGGSHELL +EGGSHELLS +EGGY +EGIS +EGISES +EGLANTINE +EGLANTINES +EGLATERE +EGLATERES +EGLOMISE +EGO +EGOCENTRIC +EGOCENTRICALLY +EGOCENTRICITIES +EGOCENTRICITY +EGOCENTRICS +EGOCENTRISM +EGOCENTRISMS +EGOISM +EGOISMS +EGOIST +EGOISTIC +EGOISTICAL +EGOISTICALLY +EGOISTS +EGOLESS +EGOMANIA +EGOMANIAC +EGOMANIACAL +EGOMANIACALLY +EGOMANIACS +EGOMANIAS +EGOS +EGOTISM +EGOTISMS +EGOTIST +EGOTISTIC +EGOTISTICAL +EGOTISTICALLY +EGOTISTS +EGREGIOUS +EGREGIOUSLY +EGREGIOUSNESS +EGREGIOUSNESSES +EGRESS +EGRESSED +EGRESSES +EGRESSING +EGRESSION +EGRESSIONS +EGRET +EGRETS +EGYPTIAN +EGYPTIANS +EH +EICOSANOID +EICOSANOIDS +EIDE +EIDER +EIDERDOWN +EIDERDOWNS +EIDERS +EIDETIC +EIDETICALLY +EIDOLA +EIDOLIC +EIDOLON +EIDOLONS +EIDOS +EIGENMODE +EIGENMODES +EIGENVALUE +EIGENVALUES +EIGENVECTOR +EIGENVECTORS +EIGHT +EIGHTBALL +EIGHTBALLS +EIGHTEEN +EIGHTEENS +EIGHTEENTH +EIGHTEENTHS +EIGHTFOLD +EIGHTH +EIGHTHLY +EIGHTHS +EIGHTIES +EIGHTIETH +EIGHTIETHS +EIGHTS +EIGHTVO +EIGHTVOS +EIGHTY +EIKON +EIKONES +EIKONS +EINKORN +EINKORNS +EINSTEIN +EINSTEINIUM +EINSTEINIUMS +EINSTEINS +EIRENIC +EIRENICAL +EISEGESES +EISEGESIS +EISTEDDFOD +EISTEDDFODAU +EISTEDDFODIC +EISTEDDFODS +EISWEIN +EISWEINS +EITHER +EJACULATE +EJACULATED +EJACULATES +EJACULATING +EJACULATION +EJACULATIONS +EJACULATOR +EJACULATORS +EJACULATORY +EJECT +EJECTA +EJECTABLE +EJECTED +EJECTING +EJECTION +EJECTIONS +EJECTIVE +EJECTIVES +EJECTMENT +EJECTMENTS +EJECTOR +EJECTORS +EJECTS +EKE +EKED +EKES +EKING +EKISTIC +EKISTICAL +EKISTICS +EKPWELE +EKPWELES +EKTEXINE +EKTEXINES +EKUELE +EL +ELABORATE +ELABORATED +ELABORATELY +ELABORATENESS +ELABORATENESSES +ELABORATES +ELABORATING +ELABORATION +ELABORATIONS +ELABORATIVE +ELAIN +ELAINS +ELAN +ELAND +ELANDS +ELANS +ELAPHINE +ELAPID +ELAPIDS +ELAPINE +ELAPSE +ELAPSED +ELAPSES +ELAPSING +ELASMOBRANCH +ELASMOBRANCHS +ELASTASE +ELASTASES +ELASTIC +ELASTICALLY +ELASTICITIES +ELASTICITY +ELASTICIZED +ELASTICS +ELASTIN +ELASTINS +ELASTOMER +ELASTOMERIC +ELASTOMERS +ELATE +ELATED +ELATEDLY +ELATEDNESS +ELATEDNESSES +ELATER +ELATERID +ELATERIDS +ELATERIN +ELATERINS +ELATERITE +ELATERITES +ELATERIUM +ELATERIUMS +ELATERS +ELATES +ELATING +ELATION +ELATIONS +ELATIVE +ELATIVES +ELBOW +ELBOWED +ELBOWING +ELBOWROOM +ELBOWROOMS +ELBOWS +ELD +ELDER +ELDERBERRIES +ELDERBERRY +ELDERCARE +ELDERCARES +ELDERLIES +ELDERLINESS +ELDERLINESSES +ELDERLY +ELDERS +ELDERSHIP +ELDERSHIPS +ELDEST +ELDRESS +ELDRESSES +ELDRICH +ELDRITCH +ELDS +ELECAMPANE +ELECAMPANES +ELECT +ELECTABILITIES +ELECTABILITY +ELECTABLE +ELECTED +ELECTEE +ELECTEES +ELECTING +ELECTION +ELECTIONEER +ELECTIONEERED +ELECTIONEERER +ELECTIONEERERS +ELECTIONEERING +ELECTIONEERS +ELECTIONS +ELECTIVE +ELECTIVELY +ELECTIVENESS +ELECTIVENESSES +ELECTIVES +ELECTOR +ELECTORAL +ELECTORALLY +ELECTORATE +ELECTORATES +ELECTORS +ELECTRESS +ELECTRESSES +ELECTRET +ELECTRETS +ELECTRIC +ELECTRICAL +ELECTRICALLY +ELECTRICIAN +ELECTRICIANS +ELECTRICITIES +ELECTRICITY +ELECTRICS +ELECTRIFICATION +ELECTRIFIED +ELECTRIFIES +ELECTRIFY +ELECTRIFYING +ELECTRO +ELECTROACOUSTIC +ELECTROANALYSES +ELECTROANALYSIS +ELECTROCHEMICAL +ELECTROCUTE +ELECTROCUTED +ELECTROCUTES +ELECTROCUTING +ELECTROCUTION +ELECTROCUTIONS +ELECTRODE +ELECTRODEPOSIT +ELECTRODEPOSITS +ELECTRODERMAL +ELECTRODES +ELECTRODIALYSES +ELECTRODIALYSIS +ELECTRODIALYTIC +ELECTRODYNAMIC +ELECTRODYNAMICS +ELECTROED +ELECTROFISHING +ELECTROFISHINGS +ELECTROFORM +ELECTROFORMED +ELECTROFORMING +ELECTROFORMS +ELECTROGENESES +ELECTROGENESIS +ELECTROGENIC +ELECTROGRAM +ELECTROGRAMS +ELECTROING +ELECTROJET +ELECTROJETS +ELECTROKINETIC +ELECTROKINETICS +ELECTROLESS +ELECTROLOGIES +ELECTROLOGIST +ELECTROLOGISTS +ELECTROLOGY +ELECTROLYSES +ELECTROLYSIS +ELECTROLYTE +ELECTROLYTES +ELECTROLYTIC +ELECTROLYZE +ELECTROLYZED +ELECTROLYZES +ELECTROLYZING +ELECTROMAGNET +ELECTROMAGNETIC +ELECTROMAGNETS +ELECTROMETER +ELECTROMETERS +ELECTROMYOGRAM +ELECTROMYOGRAMS +ELECTROMYOGRAPH +ELECTRON +ELECTRONEGATIVE +ELECTRONIC +ELECTRONICA +ELECTRONICALLY +ELECTRONICAS +ELECTRONICS +ELECTRONS +ELECTROOSMOSES +ELECTROOSMOSIS +ELECTROOSMOTIC +ELECTROPHILE +ELECTROPHILES +ELECTROPHILIC +ELECTROPHORESE +ELECTROPHORESED +ELECTROPHORESES +ELECTROPHORESIS +ELECTROPHORETIC +ELECTROPHORI +ELECTROPHORUS +ELECTROPLATE +ELECTROPLATED +ELECTROPLATES +ELECTROPLATING +ELECTROPOSITIVE +ELECTROS +ELECTROSCOPE +ELECTROSCOPES +ELECTROSHOCK +ELECTROSHOCKS +ELECTROSTATIC +ELECTROSTATICS +ELECTROSURGERY +ELECTROSURGICAL +ELECTROTHERAPY +ELECTROTHERMAL +ELECTROTONIC +ELECTROTONUS +ELECTROTONUSES +ELECTROTYPE +ELECTROTYPED +ELECTROTYPER +ELECTROTYPERS +ELECTROTYPES +ELECTROTYPING +ELECTROWEAK +ELECTROWINNING +ELECTROWINNINGS +ELECTRUM +ELECTRUMS +ELECTS +ELECTUARIES +ELECTUARY +ELEDOISIN +ELEDOISINS +ELEEMOSYNARY +ELEGANCE +ELEGANCES +ELEGANCIES +ELEGANCY +ELEGANT +ELEGANTLY +ELEGIAC +ELEGIACAL +ELEGIACALLY +ELEGIACS +ELEGIES +ELEGISE +ELEGISED +ELEGISES +ELEGISING +ELEGIST +ELEGISTS +ELEGIT +ELEGITS +ELEGIZE +ELEGIZED +ELEGIZES +ELEGIZING +ELEGY +ELEMENT +ELEMENTAL +ELEMENTALLY +ELEMENTALS +ELEMENTARILY +ELEMENTARINESS +ELEMENTARY +ELEMENTS +ELEMI +ELEMIS +ELENCHI +ELENCHIC +ELENCHTIC +ELENCHUS +ELENCTIC +ELEOPTENE +ELEOPTENES +ELEPHANT +ELEPHANTIASES +ELEPHANTIASIS +ELEPHANTINE +ELEPHANTS +ELEVATE +ELEVATED +ELEVATEDS +ELEVATES +ELEVATING +ELEVATION +ELEVATIONS +ELEVATOR +ELEVATORS +ELEVEN +ELEVENS +ELEVENSES +ELEVENTH +ELEVENTHS +ELEVON +ELEVONS +ELF +ELFIN +ELFINS +ELFISH +ELFISHLY +ELFLIKE +ELFLOCK +ELFLOCKS +ELHI +ELICIT +ELICITATION +ELICITATIONS +ELICITED +ELICITING +ELICITOR +ELICITORS +ELICITS +ELIDE +ELIDED +ELIDES +ELIDIBLE +ELIDING +ELIGIBILITIES +ELIGIBILITY +ELIGIBLE +ELIGIBLES +ELIGIBLY +ELIMINATE +ELIMINATED +ELIMINATES +ELIMINATING +ELIMINATION +ELIMINATIONS +ELIMINATIVE +ELIMINATOR +ELIMINATORS +ELINT +ELINTS +ELISION +ELISIONS +ELITE +ELITES +ELITISM +ELITISMS +ELITIST +ELITISTS +ELIXIR +ELIXIRS +ELK +ELKHOUND +ELKHOUNDS +ELKS +ELL +ELLIPSE +ELLIPSES +ELLIPSIS +ELLIPSOID +ELLIPSOIDAL +ELLIPSOIDS +ELLIPTIC +ELLIPTICAL +ELLIPTICALLY +ELLIPTICALS +ELLIPTICITIES +ELLIPTICITY +ELLS +ELM +ELMIER +ELMIEST +ELMS +ELMY +ELOCUTION +ELOCUTIONARY +ELOCUTIONIST +ELOCUTIONISTS +ELOCUTIONS +ELODEA +ELODEAS +ELOIGN +ELOIGNED +ELOIGNER +ELOIGNERS +ELOIGNING +ELOIGNS +ELOIN +ELOINED +ELOINER +ELOINERS +ELOINING +ELOINMENT +ELOINMENTS +ELOINS +ELONGATE +ELONGATED +ELONGATES +ELONGATING +ELONGATION +ELONGATIONS +ELOPE +ELOPED +ELOPEMENT +ELOPEMENTS +ELOPER +ELOPERS +ELOPES +ELOPING +ELOQUENCE +ELOQUENCES +ELOQUENT +ELOQUENTLY +ELS +ELSE +ELSEWHERE +ELUANT +ELUANTS +ELUATE +ELUATES +ELUCIDATE +ELUCIDATED +ELUCIDATES +ELUCIDATING +ELUCIDATION +ELUCIDATIONS +ELUCIDATIVE +ELUCIDATOR +ELUCIDATORS +ELUCUBRATE +ELUCUBRATED +ELUCUBRATES +ELUCUBRATING +ELUCUBRATION +ELUCUBRATIONS +ELUDE +ELUDED +ELUDER +ELUDERS +ELUDES +ELUDING +ELUENT +ELUENTS +ELUSION +ELUSIONS +ELUSIVE +ELUSIVELY +ELUSIVENESS +ELUSIVENESSES +ELUSORY +ELUTE +ELUTED +ELUTES +ELUTING +ELUTION +ELUTIONS +ELUTRIATE +ELUTRIATED +ELUTRIATES +ELUTRIATING +ELUTRIATION +ELUTRIATIONS +ELUTRIATOR +ELUTRIATORS +ELUVIA +ELUVIAL +ELUVIATE +ELUVIATED +ELUVIATES +ELUVIATING +ELUVIATION +ELUVIATIONS +ELUVIUM +ELUVIUMS +ELVER +ELVERS +ELVES +ELVISH +ELVISHLY +ELYSIAN +ELYTRA +ELYTROID +ELYTRON +ELYTROUS +ELYTRUM +EM +EMACIATE +EMACIATED +EMACIATES +EMACIATING +EMACIATION +EMACIATIONS +EMAIL +EMAILED +EMAILING +EMAILS +EMALANGENI +EMANANT +EMANATE +EMANATED +EMANATES +EMANATING +EMANATION +EMANATIONS +EMANATIVE +EMANATOR +EMANATORS +EMANCIPATE +EMANCIPATED +EMANCIPATES +EMANCIPATING +EMANCIPATION +EMANCIPATIONIST +EMANCIPATIONS +EMANCIPATOR +EMANCIPATORS +EMARGINATE +EMARGINATION +EMARGINATIONS +EMASCULATE +EMASCULATED +EMASCULATES +EMASCULATING +EMASCULATION +EMASCULATIONS +EMASCULATOR +EMASCULATORS +EMBALM +EMBALMED +EMBALMER +EMBALMERS +EMBALMING +EMBALMMENT +EMBALMMENTS +EMBALMS +EMBANK +EMBANKED +EMBANKING +EMBANKMENT +EMBANKMENTS +EMBANKS +EMBAR +EMBARCADERO +EMBARCADEROS +EMBARGO +EMBARGOED +EMBARGOES +EMBARGOING +EMBARK +EMBARKATION +EMBARKATIONS +EMBARKED +EMBARKING +EMBARKMENT +EMBARKMENTS +EMBARKS +EMBARRASS +EMBARRASSABLE +EMBARRASSED +EMBARRASSEDLY +EMBARRASSES +EMBARRASSING +EMBARRASSINGLY +EMBARRASSMENT +EMBARRASSMENTS +EMBARRED +EMBARRING +EMBARS +EMBASSAGE +EMBASSAGES +EMBASSIES +EMBASSY +EMBATTLE +EMBATTLED +EMBATTLEMENT +EMBATTLEMENTS +EMBATTLES +EMBATTLING +EMBAY +EMBAYED +EMBAYING +EMBAYMENT +EMBAYMENTS +EMBAYS +EMBED +EMBEDDED +EMBEDDING +EMBEDDINGS +EMBEDMENT +EMBEDMENTS +EMBEDS +EMBELLISH +EMBELLISHED +EMBELLISHER +EMBELLISHERS +EMBELLISHES +EMBELLISHING +EMBELLISHMENT +EMBELLISHMENTS +EMBER +EMBERS +EMBEZZLE +EMBEZZLED +EMBEZZLEMENT +EMBEZZLEMENTS +EMBEZZLER +EMBEZZLERS +EMBEZZLES +EMBEZZLING +EMBITTER +EMBITTERED +EMBITTERING +EMBITTERMENT +EMBITTERMENTS +EMBITTERS +EMBLAZE +EMBLAZED +EMBLAZER +EMBLAZERS +EMBLAZES +EMBLAZING +EMBLAZON +EMBLAZONED +EMBLAZONER +EMBLAZONERS +EMBLAZONING +EMBLAZONMENT +EMBLAZONMENTS +EMBLAZONRIES +EMBLAZONRY +EMBLAZONS +EMBLEM +EMBLEMATIC +EMBLEMATICAL +EMBLEMATICALLY +EMBLEMATIZE +EMBLEMATIZED +EMBLEMATIZES +EMBLEMATIZING +EMBLEMED +EMBLEMENTS +EMBLEMING +EMBLEMIZE +EMBLEMIZED +EMBLEMIZES +EMBLEMIZING +EMBLEMS +EMBODIED +EMBODIER +EMBODIERS +EMBODIES +EMBODIMENT +EMBODIMENTS +EMBODY +EMBODYING +EMBOLDEN +EMBOLDENED +EMBOLDENING +EMBOLDENS +EMBOLECTOMIES +EMBOLECTOMY +EMBOLI +EMBOLIC +EMBOLIES +EMBOLISM +EMBOLISMIC +EMBOLISMS +EMBOLIZATION +EMBOLIZATIONS +EMBOLUS +EMBOLY +EMBONPOINT +EMBONPOINTS +EMBORDER +EMBORDERED +EMBORDERING +EMBORDERS +EMBOSK +EMBOSKED +EMBOSKING +EMBOSKS +EMBOSOM +EMBOSOMED +EMBOSOMING +EMBOSOMS +EMBOSS +EMBOSSABLE +EMBOSSED +EMBOSSER +EMBOSSERS +EMBOSSES +EMBOSSING +EMBOSSMENT +EMBOSSMENTS +EMBOUCHURE +EMBOUCHURES +EMBOW +EMBOWED +EMBOWEL +EMBOWELED +EMBOWELING +EMBOWELLED +EMBOWELLING +EMBOWELS +EMBOWER +EMBOWERED +EMBOWERING +EMBOWERS +EMBOWING +EMBOWS +EMBRACE +EMBRACEABLE +EMBRACED +EMBRACEMENT +EMBRACEMENTS +EMBRACEOR +EMBRACEORS +EMBRACER +EMBRACERIES +EMBRACERS +EMBRACERY +EMBRACES +EMBRACING +EMBRACINGLY +EMBRACIVE +EMBRANGLE +EMBRANGLED +EMBRANGLEMENT +EMBRANGLEMENTS +EMBRANGLES +EMBRANGLING +EMBRASURE +EMBRASURES +EMBRITTLE +EMBRITTLED +EMBRITTLEMENT +EMBRITTLEMENTS +EMBRITTLES +EMBRITTLING +EMBROCATE +EMBROCATED +EMBROCATES +EMBROCATING +EMBROCATION +EMBROCATIONS +EMBROGLIO +EMBROGLIOS +EMBROIDER +EMBROIDERED +EMBROIDERER +EMBROIDERERS +EMBROIDERIES +EMBROIDERING +EMBROIDERS +EMBROIDERY +EMBROIL +EMBROILED +EMBROILER +EMBROILERS +EMBROILING +EMBROILMENT +EMBROILMENTS +EMBROILS +EMBROWN +EMBROWNED +EMBROWNING +EMBROWNS +EMBRUE +EMBRUED +EMBRUES +EMBRUING +EMBRUTE +EMBRUTED +EMBRUTES +EMBRUTING +EMBRYO +EMBRYOGENESES +EMBRYOGENESIS +EMBRYOGENETIC +EMBRYOGENIC +EMBRYOGENIES +EMBRYOGENY +EMBRYOID +EMBRYOIDS +EMBRYOLOGICAL +EMBRYOLOGICALLY +EMBRYOLOGIES +EMBRYOLOGIST +EMBRYOLOGISTS +EMBRYOLOGY +EMBRYON +EMBRYONAL +EMBRYONATED +EMBRYONIC +EMBRYONICALLY +EMBRYONS +EMBRYOPHYTE +EMBRYOPHYTES +EMBRYOS +EMBRYOTIC +EMCEE +EMCEED +EMCEEING +EMCEES +EMDASH +EMDASHES +EME +EMEER +EMEERATE +EMEERATES +EMEERS +EMEND +EMENDABLE +EMENDATE +EMENDATED +EMENDATES +EMENDATING +EMENDATION +EMENDATIONS +EMENDATOR +EMENDATORS +EMENDED +EMENDER +EMENDERS +EMENDING +EMENDS +EMERALD +EMERALDS +EMERGE +EMERGED +EMERGENCE +EMERGENCES +EMERGENCIES +EMERGENCY +EMERGENT +EMERGENTS +EMERGES +EMERGING +EMERIES +EMERITA +EMERITAE +EMERITAS +EMERITI +EMERITUS +EMEROD +EMERODS +EMEROID +EMEROIDS +EMERSED +EMERSION +EMERSIONS +EMERY +EMES +EMESES +EMESIS +EMETIC +EMETICALLY +EMETICS +EMETIN +EMETINE +EMETINES +EMETINS +EMEU +EMEUS +EMEUTE +EMEUTES +EMIC +EMIGRANT +EMIGRANTS +EMIGRATE +EMIGRATED +EMIGRATES +EMIGRATING +EMIGRATION +EMIGRATIONS +EMIGRE +EMIGRES +EMINENCE +EMINENCES +EMINENCIES +EMINENCY +EMINENT +EMINENTLY +EMIR +EMIRATE +EMIRATES +EMIRS +EMISSARIES +EMISSARY +EMISSION +EMISSIONS +EMISSIVE +EMISSIVITIES +EMISSIVITY +EMIT +EMITS +EMITTANCE +EMITTANCES +EMITTED +EMITTER +EMITTERS +EMITTING +EMMENAGOGUE +EMMENAGOGUES +EMMER +EMMERS +EMMET +EMMETROPE +EMMETROPES +EMMETS +EMMY +EMMYS +EMODIN +EMODINS +EMOLLIENT +EMOLLIENTS +EMOLUMENT +EMOLUMENTS +EMOTE +EMOTED +EMOTER +EMOTERS +EMOTES +EMOTICON +EMOTICONS +EMOTING +EMOTION +EMOTIONAL +EMOTIONALISM +EMOTIONALISMS +EMOTIONALIST +EMOTIONALISTIC +EMOTIONALISTS +EMOTIONALITIES +EMOTIONALITY +EMOTIONALIZE +EMOTIONALIZED +EMOTIONALIZES +EMOTIONALIZING +EMOTIONALLY +EMOTIONLESS +EMOTIONLESSLY +EMOTIONLESSNESS +EMOTIONS +EMOTIVE +EMOTIVELY +EMOTIVITIES +EMOTIVITY +EMPALE +EMPALED +EMPALER +EMPALERS +EMPALES +EMPALING +EMPANADA +EMPANADAS +EMPANEL +EMPANELED +EMPANELING +EMPANELLED +EMPANELLING +EMPANELS +EMPATHETIC +EMPATHETICALLY +EMPATHIC +EMPATHICALLY +EMPATHIES +EMPATHISE +EMPATHISED +EMPATHISES +EMPATHISING +EMPATHIZE +EMPATHIZED +EMPATHIZES +EMPATHIZING +EMPATHY +EMPENNAGE +EMPENNAGES +EMPERIES +EMPEROR +EMPERORS +EMPERORSHIP +EMPERORSHIPS +EMPERY +EMPHASES +EMPHASIS +EMPHASISE +EMPHASISED +EMPHASISES +EMPHASISING +EMPHASIZE +EMPHASIZED +EMPHASIZES +EMPHASIZING +EMPHATIC +EMPHATICALLY +EMPHYSEMA +EMPHYSEMAS +EMPHYSEMATOUS +EMPHYSEMIC +EMPIRE +EMPIRES +EMPIRIC +EMPIRICAL +EMPIRICALLY +EMPIRICISM +EMPIRICISMS +EMPIRICIST +EMPIRICISTS +EMPIRICS +EMPLACE +EMPLACED +EMPLACEMENT +EMPLACEMENTS +EMPLACES +EMPLACING +EMPLANE +EMPLANED +EMPLANES +EMPLANING +EMPLOY +EMPLOYABILITIES +EMPLOYABILITY +EMPLOYABLE +EMPLOYABLES +EMPLOYE +EMPLOYED +EMPLOYEE +EMPLOYEES +EMPLOYER +EMPLOYERS +EMPLOYES +EMPLOYING +EMPLOYMENT +EMPLOYMENTS +EMPLOYS +EMPOISON +EMPOISONED +EMPOISONING +EMPOISONMENT +EMPOISONMENTS +EMPOISONS +EMPORIA +EMPORIUM +EMPORIUMS +EMPOWER +EMPOWERED +EMPOWERING +EMPOWERMENT +EMPOWERMENTS +EMPOWERS +EMPRESS +EMPRESSEMENT +EMPRESSEMENTS +EMPRESSES +EMPRISE +EMPRISES +EMPRIZE +EMPRIZES +EMPTIABLE +EMPTIED +EMPTIER +EMPTIERS +EMPTIES +EMPTIEST +EMPTILY +EMPTINESS +EMPTINESSES +EMPTINGS +EMPTINS +EMPTY +EMPTYING +EMPURPLE +EMPURPLED +EMPURPLES +EMPURPLING +EMPYEMA +EMPYEMAS +EMPYEMATA +EMPYEMIC +EMPYREAL +EMPYREAN +EMPYREANS +EMS +EMU +EMULATE +EMULATED +EMULATES +EMULATING +EMULATION +EMULATIONS +EMULATIVE +EMULATIVELY +EMULATOR +EMULATORS +EMULOUS +EMULOUSLY +EMULOUSNESS +EMULOUSNESSES +EMULSIBLE +EMULSIFIABLE +EMULSIFICATION +EMULSIFICATIONS +EMULSIFIED +EMULSIFIER +EMULSIFIERS +EMULSIFIES +EMULSIFY +EMULSIFYING +EMULSION +EMULSIONS +EMULSIVE +EMULSOID +EMULSOIDAL +EMULSOIDS +EMUNCTORIES +EMUNCTORY +EMUS +EMYD +EMYDE +EMYDES +EMYDS +EN +ENABLE +ENABLED +ENABLER +ENABLERS +ENABLES +ENABLING +ENACT +ENACTABLE +ENACTED +ENACTING +ENACTIVE +ENACTMENT +ENACTMENTS +ENACTOR +ENACTORS +ENACTORY +ENACTS +ENALAPRIL +ENALAPRILS +ENAMEL +ENAMELED +ENAMELER +ENAMELERS +ENAMELING +ENAMELIST +ENAMELISTS +ENAMELLED +ENAMELLER +ENAMELLERS +ENAMELLING +ENAMELS +ENAMELWARE +ENAMELWARES +ENAMINE +ENAMINES +ENAMOR +ENAMORED +ENAMORING +ENAMORS +ENAMOUR +ENAMOURED +ENAMOURING +ENAMOURS +ENANTIOMER +ENANTIOMERIC +ENANTIOMERS +ENANTIOMORPH +ENANTIOMORPHIC +ENANTIOMORPHISM +ENANTIOMORPHOUS +ENANTIOMORPHS +ENATE +ENATES +ENATIC +ENATION +ENATIONS +ENCAENIA +ENCAGE +ENCAGED +ENCAGES +ENCAGING +ENCAMP +ENCAMPED +ENCAMPING +ENCAMPMENT +ENCAMPMENTS +ENCAMPS +ENCAPSULATE +ENCAPSULATED +ENCAPSULATES +ENCAPSULATING +ENCAPSULATION +ENCAPSULATIONS +ENCAPSULE +ENCAPSULED +ENCAPSULES +ENCAPSULING +ENCASE +ENCASED +ENCASEMENT +ENCASEMENTS +ENCASES +ENCASH +ENCASHABLE +ENCASHED +ENCASHES +ENCASHING +ENCASHMENT +ENCASHMENTS +ENCASING +ENCAUSTIC +ENCAUSTICS +ENCEINTE +ENCEINTES +ENCEPHALA +ENCEPHALITIC +ENCEPHALITIDES +ENCEPHALITIS +ENCEPHALITOGEN +ENCEPHALITOGENS +ENCEPHALOGRAM +ENCEPHALOGRAMS +ENCEPHALOGRAPH +ENCEPHALOGRAPHS +ENCEPHALOGRAPHY +ENCEPHALON +ENCEPHALOPATHIC +ENCEPHALOPATHY +ENCHAIN +ENCHAINED +ENCHAINING +ENCHAINMENT +ENCHAINMENTS +ENCHAINS +ENCHANT +ENCHANTED +ENCHANTER +ENCHANTERS +ENCHANTING +ENCHANTINGLY +ENCHANTMENT +ENCHANTMENTS +ENCHANTRESS +ENCHANTRESSES +ENCHANTS +ENCHASE +ENCHASED +ENCHASER +ENCHASERS +ENCHASES +ENCHASING +ENCHILADA +ENCHILADAS +ENCHIRIDIA +ENCHIRIDION +ENCHORIAL +ENCHORIC +ENCINA +ENCINAL +ENCINAS +ENCIPHER +ENCIPHERED +ENCIPHERER +ENCIPHERERS +ENCIPHERING +ENCIPHERMENT +ENCIPHERMENTS +ENCIPHERS +ENCIRCLE +ENCIRCLED +ENCIRCLEMENT +ENCIRCLEMENTS +ENCIRCLES +ENCIRCLING +ENCLASP +ENCLASPED +ENCLASPING +ENCLASPS +ENCLAVE +ENCLAVED +ENCLAVES +ENCLAVING +ENCLITIC +ENCLITICS +ENCLOSE +ENCLOSED +ENCLOSER +ENCLOSERS +ENCLOSES +ENCLOSING +ENCLOSURE +ENCLOSURES +ENCODABLE +ENCODE +ENCODED +ENCODER +ENCODERS +ENCODES +ENCODING +ENCOMIA +ENCOMIAST +ENCOMIASTIC +ENCOMIASTS +ENCOMIUM +ENCOMIUMS +ENCOMPASS +ENCOMPASSED +ENCOMPASSES +ENCOMPASSING +ENCOMPASSMENT +ENCOMPASSMENTS +ENCORE +ENCORED +ENCORES +ENCORING +ENCOUNTER +ENCOUNTERED +ENCOUNTERING +ENCOUNTERS +ENCOURAGE +ENCOURAGED +ENCOURAGEMENT +ENCOURAGEMENTS +ENCOURAGER +ENCOURAGERS +ENCOURAGES +ENCOURAGING +ENCOURAGINGLY +ENCRIMSON +ENCRIMSONED +ENCRIMSONING +ENCRIMSONS +ENCRINITE +ENCRINITES +ENCROACH +ENCROACHED +ENCROACHER +ENCROACHERS +ENCROACHES +ENCROACHING +ENCROACHMENT +ENCROACHMENTS +ENCRUST +ENCRUSTATION +ENCRUSTATIONS +ENCRUSTED +ENCRUSTING +ENCRUSTS +ENCRYPT +ENCRYPTED +ENCRYPTING +ENCRYPTION +ENCRYPTIONS +ENCRYPTS +ENCULTURATE +ENCULTURATED +ENCULTURATES +ENCULTURATING +ENCULTURATION +ENCULTURATIONS +ENCUMBER +ENCUMBERED +ENCUMBERING +ENCUMBERS +ENCUMBRANCE +ENCUMBRANCER +ENCUMBRANCERS +ENCUMBRANCES +ENCYCLIC +ENCYCLICAL +ENCYCLICALS +ENCYCLICS +ENCYCLOPAEDIA +ENCYCLOPAEDIAS +ENCYCLOPAEDIC +ENCYCLOPEDIA +ENCYCLOPEDIAS +ENCYCLOPEDIC +ENCYCLOPEDISM +ENCYCLOPEDISMS +ENCYCLOPEDIST +ENCYCLOPEDISTS +ENCYST +ENCYSTED +ENCYSTING +ENCYSTMENT +ENCYSTMENTS +ENCYSTS +END +ENDAMAGE +ENDAMAGED +ENDAMAGES +ENDAMAGING +ENDAMEBA +ENDAMEBAE +ENDAMEBAS +ENDAMEBIC +ENDAMOEBA +ENDAMOEBAE +ENDAMOEBAS +ENDANGER +ENDANGERED +ENDANGERING +ENDANGERMENT +ENDANGERMENTS +ENDANGERS +ENDARCH +ENDARCHIES +ENDARCHY +ENDARTERECTOMY +ENDASH +ENDASHES +ENDBRAIN +ENDBRAINS +ENDEAR +ENDEARED +ENDEARING +ENDEARINGLY +ENDEARMENT +ENDEARMENTS +ENDEARS +ENDEAVOR +ENDEAVORED +ENDEAVORING +ENDEAVORS +ENDEAVOUR +ENDEAVOURED +ENDEAVOURING +ENDEAVOURS +ENDED +ENDEMIAL +ENDEMIC +ENDEMICAL +ENDEMICALLY +ENDEMICITIES +ENDEMICITY +ENDEMICS +ENDEMISM +ENDEMISMS +ENDER +ENDERGONIC +ENDERMIC +ENDERS +ENDEXINE +ENDEXINES +ENDGAME +ENDGAMES +ENDING +ENDINGS +ENDITE +ENDITED +ENDITES +ENDITING +ENDIVE +ENDIVES +ENDLEAF +ENDLEAFS +ENDLEAVES +ENDLESS +ENDLESSLY +ENDLESSNESS +ENDLESSNESSES +ENDLONG +ENDMOST +ENDNOTE +ENDNOTES +ENDOBIOTIC +ENDOBLAST +ENDOBLASTS +ENDOCARDIA +ENDOCARDIAL +ENDOCARDITIS +ENDOCARDITISES +ENDOCARDIUM +ENDOCARP +ENDOCARPS +ENDOCAST +ENDOCASTS +ENDOCHONDRAL +ENDOCRINE +ENDOCRINES +ENDOCRINOLOGIC +ENDOCRINOLOGIES +ENDOCRINOLOGIST +ENDOCRINOLOGY +ENDOCYTIC +ENDOCYTOSES +ENDOCYTOSIS +ENDOCYTOTIC +ENDODERM +ENDODERMAL +ENDODERMIS +ENDODERMISES +ENDODERMS +ENDODONTIC +ENDODONTICALLY +ENDODONTICS +ENDODONTIST +ENDODONTISTS +ENDOENZYME +ENDOENZYMES +ENDOERGIC +ENDOGAMIC +ENDOGAMIES +ENDOGAMOUS +ENDOGAMY +ENDOGEN +ENDOGENIC +ENDOGENIES +ENDOGENOUS +ENDOGENOUSLY +ENDOGENS +ENDOGENY +ENDOLITHIC +ENDOLYMPH +ENDOLYMPHATIC +ENDOLYMPHS +ENDOMETRIA +ENDOMETRIAL +ENDOMETRIOSES +ENDOMETRIOSIS +ENDOMETRITIS +ENDOMETRITISES +ENDOMETRIUM +ENDOMITOSES +ENDOMITOSIS +ENDOMITOTIC +ENDOMIXIS +ENDOMIXISES +ENDOMORPH +ENDOMORPHIC +ENDOMORPHIES +ENDOMORPHISM +ENDOMORPHISMS +ENDOMORPHS +ENDOMORPHY +ENDONUCLEASE +ENDONUCLEASES +ENDONUCLEOLYTIC +ENDOPARASITE +ENDOPARASITES +ENDOPARASITIC +ENDOPARASITISM +ENDOPARASITISMS +ENDOPEPTIDASE +ENDOPEPTIDASES +ENDOPEROXIDE +ENDOPEROXIDES +ENDOPHYTE +ENDOPHYTES +ENDOPHYTIC +ENDOPLASM +ENDOPLASMIC +ENDOPLASMS +ENDOPOD +ENDOPODITE +ENDOPODITES +ENDOPODS +ENDOPOLYPLOID +ENDOPOLYPLOIDY +ENDOPROCT +ENDOPROCTS +ENDORPHIN +ENDORPHINS +ENDORSABLE +ENDORSE +ENDORSED +ENDORSEE +ENDORSEES +ENDORSEMENT +ENDORSEMENTS +ENDORSER +ENDORSERS +ENDORSES +ENDORSING +ENDORSIVE +ENDORSOR +ENDORSORS +ENDOSARC +ENDOSARCS +ENDOSCOPE +ENDOSCOPES +ENDOSCOPIC +ENDOSCOPICALLY +ENDOSCOPIES +ENDOSCOPY +ENDOSKELETAL +ENDOSKELETON +ENDOSKELETONS +ENDOSMOS +ENDOSMOSES +ENDOSOME +ENDOSOMES +ENDOSPERM +ENDOSPERMS +ENDOSPORE +ENDOSPORES +ENDOSTEA +ENDOSTEAL +ENDOSTEALLY +ENDOSTEUM +ENDOSTYLE +ENDOSTYLES +ENDOSULFAN +ENDOSULFANS +ENDOSYMBIONT +ENDOSYMBIONTS +ENDOSYMBIOSES +ENDOSYMBIOSIS +ENDOSYMBIOTIC +ENDOTHECIA +ENDOTHECIUM +ENDOTHELIA +ENDOTHELIAL +ENDOTHELIOMA +ENDOTHELIOMAS +ENDOTHELIOMATA +ENDOTHELIUM +ENDOTHERM +ENDOTHERMIC +ENDOTHERMIES +ENDOTHERMS +ENDOTHERMY +ENDOTOXIC +ENDOTOXIN +ENDOTOXINS +ENDOTRACHEAL +ENDOTROPHIC +ENDOW +ENDOWED +ENDOWER +ENDOWERS +ENDOWING +ENDOWMENT +ENDOWMENTS +ENDOWS +ENDOZOIC +ENDPAPER +ENDPAPERS +ENDPLATE +ENDPLATES +ENDPLAY +ENDPLAYED +ENDPLAYING +ENDPLAYS +ENDPOINT +ENDPOINTS +ENDRIN +ENDRINS +ENDS +ENDUE +ENDUED +ENDUES +ENDUING +ENDURABLE +ENDURABLY +ENDURANCE +ENDURANCES +ENDURE +ENDURED +ENDURER +ENDURERS +ENDURES +ENDURING +ENDURINGLY +ENDURINGNESS +ENDURINGNESSES +ENDURO +ENDUROS +ENDWAYS +ENDWISE +ENEMA +ENEMAS +ENEMATA +ENEMIES +ENEMY +ENERGETIC +ENERGETICALLY +ENERGETICS +ENERGID +ENERGIDS +ENERGIES +ENERGISE +ENERGISED +ENERGISES +ENERGISING +ENERGIZATION +ENERGIZATIONS +ENERGIZE +ENERGIZED +ENERGIZER +ENERGIZERS +ENERGIZES +ENERGIZING +ENERGUMEN +ENERGUMENS +ENERGY +ENERVATE +ENERVATED +ENERVATES +ENERVATING +ENERVATION +ENERVATIONS +ENERVATOR +ENERVATORS +ENFACE +ENFACED +ENFACES +ENFACING +ENFEEBLE +ENFEEBLED +ENFEEBLEMENT +ENFEEBLEMENTS +ENFEEBLER +ENFEEBLERS +ENFEEBLES +ENFEEBLING +ENFEOFF +ENFEOFFED +ENFEOFFING +ENFEOFFMENT +ENFEOFFMENTS +ENFEOFFS +ENFETTER +ENFETTERED +ENFETTERING +ENFETTERS +ENFEVER +ENFEVERED +ENFEVERING +ENFEVERS +ENFILADE +ENFILADED +ENFILADES +ENFILADING +ENFLAME +ENFLAMED +ENFLAMES +ENFLAMING +ENFLEURAGE +ENFLEURAGES +ENFOLD +ENFOLDED +ENFOLDER +ENFOLDERS +ENFOLDING +ENFOLDS +ENFORCE +ENFORCEABILITY +ENFORCEABLE +ENFORCED +ENFORCEMENT +ENFORCEMENTS +ENFORCER +ENFORCERS +ENFORCES +ENFORCING +ENFRAME +ENFRAMED +ENFRAMEMENT +ENFRAMEMENTS +ENFRAMES +ENFRAMING +ENFRANCHISE +ENFRANCHISED +ENFRANCHISEMENT +ENFRANCHISES +ENFRANCHISING +ENG +ENGAGE +ENGAGED +ENGAGEDLY +ENGAGEMENT +ENGAGEMENTS +ENGAGER +ENGAGERS +ENGAGES +ENGAGING +ENGAGINGLY +ENGARLAND +ENGARLANDED +ENGARLANDING +ENGARLANDS +ENGENDER +ENGENDERED +ENGENDERING +ENGENDERS +ENGILD +ENGILDED +ENGILDING +ENGILDS +ENGINE +ENGINED +ENGINEER +ENGINEERED +ENGINEERING +ENGINEERINGS +ENGINEERS +ENGINERIES +ENGINERY +ENGINES +ENGINING +ENGINOUS +ENGIRD +ENGIRDED +ENGIRDING +ENGIRDLE +ENGIRDLED +ENGIRDLES +ENGIRDLING +ENGIRDS +ENGIRT +ENGLACIAL +ENGLISH +ENGLISHED +ENGLISHES +ENGLISHING +ENGLUT +ENGLUTS +ENGLUTTED +ENGLUTTING +ENGORGE +ENGORGED +ENGORGEMENT +ENGORGEMENTS +ENGORGES +ENGORGING +ENGRAFT +ENGRAFTED +ENGRAFTING +ENGRAFTMENT +ENGRAFTMENTS +ENGRAFTS +ENGRAIL +ENGRAILED +ENGRAILING +ENGRAILS +ENGRAIN +ENGRAINED +ENGRAINING +ENGRAINS +ENGRAM +ENGRAMME +ENGRAMMES +ENGRAMMIC +ENGRAMS +ENGRAVE +ENGRAVED +ENGRAVER +ENGRAVERS +ENGRAVES +ENGRAVING +ENGRAVINGS +ENGROSS +ENGROSSED +ENGROSSER +ENGROSSERS +ENGROSSES +ENGROSSING +ENGROSSINGLY +ENGROSSMENT +ENGROSSMENTS +ENGS +ENGULF +ENGULFED +ENGULFING +ENGULFMENT +ENGULFMENTS +ENGULFS +ENHALO +ENHALOED +ENHALOES +ENHALOING +ENHALOS +ENHANCE +ENHANCED +ENHANCEMENT +ENHANCEMENTS +ENHANCER +ENHANCERS +ENHANCES +ENHANCING +ENHANCIVE +ENHARMONIC +ENHARMONICALLY +ENIGMA +ENIGMAS +ENIGMATA +ENIGMATIC +ENIGMATICAL +ENIGMATICALLY +ENISLE +ENISLED +ENISLES +ENISLING +ENJAMBED +ENJAMBEMENT +ENJAMBEMENTS +ENJAMBMENT +ENJAMBMENTS +ENJOIN +ENJOINDER +ENJOINDERS +ENJOINED +ENJOINER +ENJOINERS +ENJOINING +ENJOINS +ENJOY +ENJOYABLE +ENJOYABLENESS +ENJOYABLENESSES +ENJOYABLY +ENJOYED +ENJOYER +ENJOYERS +ENJOYING +ENJOYMENT +ENJOYMENTS +ENJOYS +ENKEPHALIN +ENKEPHALINS +ENKINDLE +ENKINDLED +ENKINDLER +ENKINDLERS +ENKINDLES +ENKINDLING +ENLACE +ENLACED +ENLACEMENT +ENLACEMENTS +ENLACES +ENLACING +ENLARGE +ENLARGEABLE +ENLARGED +ENLARGEMENT +ENLARGEMENTS +ENLARGER +ENLARGERS +ENLARGES +ENLARGING +ENLIGHTEN +ENLIGHTENED +ENLIGHTENING +ENLIGHTENMENT +ENLIGHTENMENTS +ENLIGHTENS +ENLIST +ENLISTED +ENLISTEE +ENLISTEES +ENLISTER +ENLISTERS +ENLISTING +ENLISTMENT +ENLISTMENTS +ENLISTS +ENLIVEN +ENLIVENED +ENLIVENER +ENLIVENERS +ENLIVENING +ENLIVENS +ENMESH +ENMESHED +ENMESHES +ENMESHING +ENMESHMENT +ENMESHMENTS +ENMITIES +ENMITY +ENNEAD +ENNEADIC +ENNEADS +ENNEAGON +ENNEAGONS +ENNOBLE +ENNOBLED +ENNOBLEMENT +ENNOBLEMENTS +ENNOBLER +ENNOBLERS +ENNOBLES +ENNOBLING +ENNUI +ENNUIS +ENNUYE +ENNUYEE +ENOKI +ENOKIDAKE +ENOKIDAKES +ENOKIS +ENOKITAKE +ENOKITAKES +ENOL +ENOLASE +ENOLASES +ENOLIC +ENOLOGICAL +ENOLOGIES +ENOLOGIST +ENOLOGISTS +ENOLOGY +ENOLS +ENOPHILE +ENOPHILES +ENORM +ENORMITIES +ENORMITY +ENORMOUS +ENORMOUSLY +ENORMOUSNESS +ENORMOUSNESSES +ENOSIS +ENOSISES +ENOUGH +ENOUGHS +ENOUNCE +ENOUNCED +ENOUNCES +ENOUNCING +ENOW +ENOWS +ENPLANE +ENPLANED +ENPLANES +ENPLANING +ENQUIRE +ENQUIRED +ENQUIRES +ENQUIRIES +ENQUIRING +ENQUIRY +ENRAGE +ENRAGED +ENRAGEDLY +ENRAGES +ENRAGING +ENRAPT +ENRAPTURE +ENRAPTURED +ENRAPTURES +ENRAPTURING +ENRAVISH +ENRAVISHED +ENRAVISHES +ENRAVISHING +ENREGISTER +ENREGISTERED +ENREGISTERING +ENREGISTERS +ENRICH +ENRICHED +ENRICHER +ENRICHERS +ENRICHES +ENRICHING +ENRICHMENT +ENRICHMENTS +ENROBE +ENROBED +ENROBER +ENROBERS +ENROBES +ENROBING +ENROL +ENROLL +ENROLLED +ENROLLEE +ENROLLEES +ENROLLER +ENROLLERS +ENROLLING +ENROLLMENT +ENROLLMENTS +ENROLLS +ENROLMENT +ENROLMENTS +ENROLS +ENROOT +ENROOTED +ENROOTING +ENROOTS +ENS +ENSAMPLE +ENSAMPLES +ENSANGUINE +ENSANGUINED +ENSANGUINES +ENSANGUINING +ENSCONCE +ENSCONCED +ENSCONCES +ENSCONCING +ENSCROLL +ENSCROLLED +ENSCROLLING +ENSCROLLS +ENSEMBLE +ENSEMBLES +ENSERF +ENSERFED +ENSERFING +ENSERFMENT +ENSERFMENTS +ENSERFS +ENSHEATH +ENSHEATHE +ENSHEATHED +ENSHEATHES +ENSHEATHING +ENSHEATHS +ENSHRINE +ENSHRINED +ENSHRINEE +ENSHRINEES +ENSHRINEMENT +ENSHRINEMENTS +ENSHRINES +ENSHRINING +ENSHROUD +ENSHROUDED +ENSHROUDING +ENSHROUDS +ENSIFORM +ENSIGN +ENSIGNCIES +ENSIGNCY +ENSIGNS +ENSILAGE +ENSILAGED +ENSILAGES +ENSILAGING +ENSILE +ENSILED +ENSILES +ENSILING +ENSKIED +ENSKIES +ENSKY +ENSKYED +ENSKYING +ENSLAVE +ENSLAVED +ENSLAVEMENT +ENSLAVEMENTS +ENSLAVER +ENSLAVERS +ENSLAVES +ENSLAVING +ENSNARE +ENSNARED +ENSNARER +ENSNARERS +ENSNARES +ENSNARING +ENSNARL +ENSNARLED +ENSNARLING +ENSNARLS +ENSORCEL +ENSORCELED +ENSORCELING +ENSORCELL +ENSORCELLED +ENSORCELLING +ENSORCELLMENT +ENSORCELLMENTS +ENSORCELLS +ENSORCELS +ENSOUL +ENSOULED +ENSOULING +ENSOULS +ENSPHERE +ENSPHERED +ENSPHERES +ENSPHERING +ENSTATITE +ENSTATITES +ENSUE +ENSUED +ENSUES +ENSUING +ENSURE +ENSURED +ENSURER +ENSURERS +ENSURES +ENSURING +ENSWATHE +ENSWATHED +ENSWATHES +ENSWATHING +ENTABLATURE +ENTABLATURES +ENTAIL +ENTAILED +ENTAILER +ENTAILERS +ENTAILING +ENTAILMENT +ENTAILMENTS +ENTAILS +ENTAMEBA +ENTAMEBAE +ENTAMEBAS +ENTAMOEBA +ENTAMOEBAE +ENTAMOEBAS +ENTANGLE +ENTANGLED +ENTANGLEMENT +ENTANGLEMENTS +ENTANGLER +ENTANGLERS +ENTANGLES +ENTANGLING +ENTASES +ENTASIA +ENTASIAS +ENTASIS +ENTASTIC +ENTELECHIES +ENTELECHY +ENTELLUS +ENTELLUSES +ENTENTE +ENTENTES +ENTER +ENTERA +ENTERABLE +ENTERAL +ENTERALLY +ENTERED +ENTERER +ENTERERS +ENTERIC +ENTERICS +ENTERING +ENTERITIDES +ENTERITIS +ENTERITISES +ENTEROBACTERIA +ENTEROBACTERIAL +ENTEROBACTERIUM +ENTEROBIASES +ENTEROBIASIS +ENTEROCOCCAL +ENTEROCOCCI +ENTEROCOCCUS +ENTEROCOEL +ENTEROCOELE +ENTEROCOELES +ENTEROCOELIC +ENTEROCOELOUS +ENTEROCOELS +ENTEROCOLITIS +ENTEROCOLITISES +ENTEROGASTRONE +ENTEROGASTRONES +ENTEROKINASE +ENTEROKINASES +ENTERON +ENTERONS +ENTEROPATHIES +ENTEROPATHY +ENTEROSTOMAL +ENTEROSTOMIES +ENTEROSTOMY +ENTEROTOXIN +ENTEROTOXINS +ENTEROVIRAL +ENTEROVIRUS +ENTEROVIRUSES +ENTERPRISE +ENTERPRISER +ENTERPRISERS +ENTERPRISES +ENTERPRISING +ENTERS +ENTERTAIN +ENTERTAINED +ENTERTAINER +ENTERTAINERS +ENTERTAINING +ENTERTAININGLY +ENTERTAINMENT +ENTERTAINMENTS +ENTERTAINS +ENTHALPIES +ENTHALPY +ENTHETIC +ENTHRAL +ENTHRALL +ENTHRALLED +ENTHRALLING +ENTHRALLMENT +ENTHRALLMENTS +ENTHRALLS +ENTHRALS +ENTHRONE +ENTHRONED +ENTHRONEMENT +ENTHRONEMENTS +ENTHRONES +ENTHRONING +ENTHUSE +ENTHUSED +ENTHUSES +ENTHUSIASM +ENTHUSIASMS +ENTHUSIAST +ENTHUSIASTIC +ENTHUSIASTS +ENTHUSING +ENTHYMEME +ENTHYMEMES +ENTIA +ENTICE +ENTICED +ENTICEMENT +ENTICEMENTS +ENTICER +ENTICERS +ENTICES +ENTICING +ENTICINGLY +ENTIRE +ENTIRELY +ENTIRENESS +ENTIRENESSES +ENTIRES +ENTIRETIES +ENTIRETY +ENTITIES +ENTITLE +ENTITLED +ENTITLEMENT +ENTITLEMENTS +ENTITLES +ENTITLING +ENTITY +ENTOBLAST +ENTOBLASTS +ENTODERM +ENTODERMAL +ENTODERMIC +ENTODERMS +ENTOIL +ENTOILED +ENTOILING +ENTOILS +ENTOMB +ENTOMBED +ENTOMBING +ENTOMBMENT +ENTOMBMENTS +ENTOMBS +ENTOMOFAUNA +ENTOMOFAUNAE +ENTOMOFAUNAS +ENTOMOLOGICAL +ENTOMOLOGICALLY +ENTOMOLOGIES +ENTOMOLOGIST +ENTOMOLOGISTS +ENTOMOLOGY +ENTOMOPHAGOUS +ENTOMOPHILIES +ENTOMOPHILOUS +ENTOMOPHILY +ENTOPHYTE +ENTOPHYTES +ENTOPIC +ENTOPROCT +ENTOPROCTS +ENTOURAGE +ENTOURAGES +ENTOZOA +ENTOZOAL +ENTOZOAN +ENTOZOANS +ENTOZOIC +ENTOZOON +ENTRAILS +ENTRAIN +ENTRAINED +ENTRAINER +ENTRAINERS +ENTRAINING +ENTRAINMENT +ENTRAINMENTS +ENTRAINS +ENTRANCE +ENTRANCED +ENTRANCEMENT +ENTRANCEMENTS +ENTRANCES +ENTRANCEWAY +ENTRANCEWAYS +ENTRANCING +ENTRANT +ENTRANTS +ENTRAP +ENTRAPMENT +ENTRAPMENTS +ENTRAPPED +ENTRAPPER +ENTRAPPERS +ENTRAPPING +ENTRAPS +ENTREAT +ENTREATED +ENTREATIES +ENTREATING +ENTREATINGLY +ENTREATMENT +ENTREATMENTS +ENTREATS +ENTREATY +ENTRECHAT +ENTRECHATS +ENTRECOTE +ENTRECOTES +ENTREE +ENTREES +ENTREMETS +ENTRENCH +ENTRENCHED +ENTRENCHES +ENTRENCHING +ENTRENCHMENT +ENTRENCHMENTS +ENTREPOT +ENTREPOTS +ENTREPRENEUR +ENTREPRENEURIAL +ENTREPRENEURS +ENTRESOL +ENTRESOLS +ENTRIES +ENTROPIC +ENTROPICALLY +ENTROPIES +ENTROPION +ENTROPIONS +ENTROPY +ENTRUST +ENTRUSTED +ENTRUSTING +ENTRUSTMENT +ENTRUSTMENTS +ENTRUSTS +ENTRY +ENTRYWAY +ENTRYWAYS +ENTWINE +ENTWINED +ENTWINES +ENTWINING +ENTWIST +ENTWISTED +ENTWISTING +ENTWISTS +ENUCLEATE +ENUCLEATED +ENUCLEATES +ENUCLEATING +ENUCLEATION +ENUCLEATIONS +ENUF +ENUMERABILITIES +ENUMERABILITY +ENUMERABLE +ENUMERATE +ENUMERATED +ENUMERATES +ENUMERATING +ENUMERATION +ENUMERATIONS +ENUMERATIVE +ENUMERATOR +ENUMERATORS +ENUNCIABLE +ENUNCIATE +ENUNCIATED +ENUNCIATES +ENUNCIATING +ENUNCIATION +ENUNCIATIONS +ENUNCIATOR +ENUNCIATORS +ENURE +ENURED +ENURES +ENURESES +ENURESIS +ENURESISES +ENURETIC +ENURETICS +ENURING +ENVELOP +ENVELOPE +ENVELOPED +ENVELOPER +ENVELOPERS +ENVELOPES +ENVELOPING +ENVELOPMENT +ENVELOPMENTS +ENVELOPS +ENVENOM +ENVENOMED +ENVENOMING +ENVENOMIZATION +ENVENOMIZATIONS +ENVENOMS +ENVIABLE +ENVIABLENESS +ENVIABLENESSES +ENVIABLY +ENVIED +ENVIER +ENVIERS +ENVIES +ENVIOUS +ENVIOUSLY +ENVIOUSNESS +ENVIOUSNESSES +ENVIRO +ENVIRON +ENVIRONED +ENVIRONING +ENVIRONMENT +ENVIRONMENTAL +ENVIRONMENTALLY +ENVIRONMENTS +ENVIRONS +ENVIROS +ENVISAGE +ENVISAGED +ENVISAGES +ENVISAGING +ENVISION +ENVISIONED +ENVISIONING +ENVISIONS +ENVOI +ENVOIS +ENVOY +ENVOYS +ENVY +ENVYING +ENVYINGLY +ENWHEEL +ENWHEELED +ENWHEELING +ENWHEELS +ENWIND +ENWINDING +ENWINDS +ENWOMB +ENWOMBED +ENWOMBING +ENWOMBS +ENWOUND +ENWRAP +ENWRAPPED +ENWRAPPING +ENWRAPS +ENWREATHE +ENWREATHED +ENWREATHES +ENWREATHING +ENZOOTIC +ENZOOTICS +ENZYM +ENZYMATIC +ENZYMATICALLY +ENZYME +ENZYMES +ENZYMIC +ENZYMICALLY +ENZYMOLOGIES +ENZYMOLOGIST +ENZYMOLOGISTS +ENZYMOLOGY +ENZYMS +EOBIONT +EOBIONTS +EOCENE +EOHIPPUS +EOHIPPUSES +EOLIAN +EOLIPILE +EOLIPILES +EOLITH +EOLITHIC +EOLITHS +EOLOPILE +EOLOPILES +EON +EONIAN +EONISM +EONISMS +EONS +EOSIN +EOSINE +EOSINES +EOSINIC +EOSINOPHIL +EOSINOPHILIA +EOSINOPHILIAS +EOSINOPHILIC +EOSINOPHILS +EOSINS +EPACT +EPACTS +EPARCH +EPARCHIAL +EPARCHIES +EPARCHS +EPARCHY +EPAULET +EPAULETS +EPAULETTE +EPAULETTED +EPAULETTES +EPAZOTE +EPAZOTES +EPEE +EPEEIST +EPEEISTS +EPEES +EPEIRIC +EPEIROGENIC +EPEIROGENICALLY +EPEIROGENIES +EPEIROGENY +EPENDYMA +EPENDYMAS +EPENTHESES +EPENTHESIS +EPENTHETIC +EPERGNE +EPERGNES +EPEXEGESES +EPEXEGESIS +EPEXEGETIC +EPEXEGETICAL +EPEXEGETICALLY +EPHA +EPHAH +EPHAHS +EPHAS +EPHEBE +EPHEBES +EPHEBI +EPHEBIC +EPHEBOI +EPHEBOS +EPHEBUS +EPHEDRA +EPHEDRAS +EPHEDRIN +EPHEDRINE +EPHEDRINES +EPHEDRINS +EPHEMERA +EPHEMERAE +EPHEMERAL +EPHEMERALITIES +EPHEMERALITY +EPHEMERALLY +EPHEMERALS +EPHEMERAS +EPHEMERID +EPHEMERIDES +EPHEMERIDS +EPHEMERIS +EPHEMERON +EPHEMERONS +EPHOD +EPHODS +EPHOR +EPHORAL +EPHORATE +EPHORATES +EPHORI +EPHORS +EPIBLAST +EPIBLASTIC +EPIBLASTS +EPIBOLIC +EPIBOLIES +EPIBOLY +EPIC +EPICAL +EPICALLY +EPICALYCES +EPICALYX +EPICALYXES +EPICANTHI +EPICANTHUS +EPICARDIA +EPICARDIAL +EPICARDIUM +EPICARP +EPICARPS +EPICEDIA +EPICEDIUM +EPICENE +EPICENES +EPICENISM +EPICENISMS +EPICENTER +EPICENTERS +EPICENTRA +EPICENTRAL +EPICENTRUM +EPICHLOROHYDRIN +EPICLIKE +EPICONTINENTAL +EPICOTYL +EPICOTYLS +EPICRANIA +EPICRANIUM +EPICRITIC +EPICS +EPICURE +EPICUREAN +EPICUREANISM +EPICUREANISMS +EPICUREANS +EPICURES +EPICURISM +EPICURISMS +EPICUTICLE +EPICUTICLES +EPICUTICULAR +EPICYCLE +EPICYCLES +EPICYCLIC +EPICYCLOID +EPICYCLOIDAL +EPICYCLOIDS +EPIDEMIC +EPIDEMICAL +EPIDEMICALLY +EPIDEMICITIES +EPIDEMICITY +EPIDEMICS +EPIDEMIOLOGIC +EPIDEMIOLOGICAL +EPIDEMIOLOGIES +EPIDEMIOLOGIST +EPIDEMIOLOGISTS +EPIDEMIOLOGY +EPIDENDRUM +EPIDENDRUMS +EPIDERM +EPIDERMAL +EPIDERMIC +EPIDERMIS +EPIDERMISES +EPIDERMOID +EPIDERMS +EPIDIASCOPE +EPIDIASCOPES +EPIDIDYMAL +EPIDIDYMIDES +EPIDIDYMIS +EPIDIDYMITIS +EPIDIDYMITISES +EPIDOTE +EPIDOTES +EPIDOTIC +EPIDURAL +EPIDURALS +EPIFAUNA +EPIFAUNAE +EPIFAUNAL +EPIFAUNAS +EPIFOCAL +EPIGASTRIC +EPIGEAL +EPIGEAN +EPIGEIC +EPIGENE +EPIGENESES +EPIGENESIS +EPIGENETIC +EPIGENETICALLY +EPIGENIC +EPIGENIST +EPIGENISTS +EPIGENOUS +EPIGEOUS +EPIGLOTTAL +EPIGLOTTIC +EPIGLOTTIS +EPIGLOTTISES +EPIGON +EPIGONE +EPIGONES +EPIGONI +EPIGONIC +EPIGONISM +EPIGONISMS +EPIGONOUS +EPIGONS +EPIGONUS +EPIGRAM +EPIGRAMMATIC +EPIGRAMMATISM +EPIGRAMMATISMS +EPIGRAMMATIST +EPIGRAMMATISTS +EPIGRAMMATIZE +EPIGRAMMATIZED +EPIGRAMMATIZER +EPIGRAMMATIZERS +EPIGRAMMATIZES +EPIGRAMMATIZING +EPIGRAMS +EPIGRAPH +EPIGRAPHER +EPIGRAPHERS +EPIGRAPHIC +EPIGRAPHICAL +EPIGRAPHICALLY +EPIGRAPHIES +EPIGRAPHIST +EPIGRAPHISTS +EPIGRAPHS +EPIGRAPHY +EPIGYNIES +EPIGYNOUS +EPIGYNY +EPILATE +EPILATED +EPILATES +EPILATING +EPILATION +EPILATIONS +EPILATOR +EPILATORS +EPILEPSIES +EPILEPSY +EPILEPTIC +EPILEPTICALLY +EPILEPTICS +EPILEPTIFORM +EPILEPTOGENIC +EPILEPTOID +EPILIMNIA +EPILIMNION +EPILIMNIONS +EPILOG +EPILOGS +EPILOGUE +EPILOGUED +EPILOGUES +EPILOGUING +EPIMER +EPIMERASE +EPIMERASES +EPIMERE +EPIMERES +EPIMERIC +EPIMERS +EPIMYSIA +EPIMYSIUM +EPINAOI +EPINAOS +EPINASTIC +EPINASTIES +EPINASTY +EPINEPHRIN +EPINEPHRINE +EPINEPHRINES +EPINEPHRINS +EPINEURIA +EPINEURIUM +EPINEURIUMS +EPIPELAGIC +EPIPHANIC +EPIPHANIES +EPIPHANOUS +EPIPHANY +EPIPHENOMENA +EPIPHENOMENAL +EPIPHENOMENALLY +EPIPHENOMENON +EPIPHRAGM +EPIPHRAGMS +EPIPHYSEAL +EPIPHYSES +EPIPHYSIAL +EPIPHYSIS +EPIPHYTE +EPIPHYTES +EPIPHYTIC +EPIPHYTICALLY +EPIPHYTISM +EPIPHYTISMS +EPIPHYTOLOGIES +EPIPHYTOLOGY +EPIPHYTOTIC +EPIPHYTOTICS +EPIROGENIES +EPIROGENY +EPISCIA +EPISCIAS +EPISCOPACIES +EPISCOPACY +EPISCOPAL +EPISCOPALLY +EPISCOPATE +EPISCOPATES +EPISCOPE +EPISCOPES +EPISIOTOMIES +EPISIOTOMY +EPISODE +EPISODES +EPISODIC +EPISODICAL +EPISODICALLY +EPISOMAL +EPISOMALLY +EPISOME +EPISOMES +EPISTASES +EPISTASIES +EPISTASIS +EPISTASY +EPISTATIC +EPISTAXES +EPISTAXIS +EPISTEMIC +EPISTEMICALLY +EPISTEMOLOGICAL +EPISTEMOLOGIES +EPISTEMOLOGIST +EPISTEMOLOGISTS +EPISTEMOLOGY +EPISTERNA +EPISTERNUM +EPISTLE +EPISTLER +EPISTLERS +EPISTLES +EPISTOLARIES +EPISTOLARY +EPISTOLER +EPISTOLERS +EPISTOME +EPISTOMES +EPISTROPHE +EPISTROPHES +EPISTYLE +EPISTYLES +EPITAPH +EPITAPHIAL +EPITAPHIC +EPITAPHS +EPITASES +EPITASIS +EPITAXIAL +EPITAXIALLY +EPITAXIC +EPITAXIES +EPITAXY +EPITHALAMIA +EPITHALAMIC +EPITHALAMION +EPITHALAMIUM +EPITHALAMIUMS +EPITHELIA +EPITHELIAL +EPITHELIALIZE +EPITHELIALIZED +EPITHELIALIZES +EPITHELIALIZING +EPITHELIOID +EPITHELIOMA +EPITHELIOMAS +EPITHELIOMATA +EPITHELIOMATOUS +EPITHELIUM +EPITHELIUMS +EPITHELIZATION +EPITHELIZATIONS +EPITHELIZE +EPITHELIZED +EPITHELIZES +EPITHELIZING +EPITHET +EPITHETIC +EPITHETICAL +EPITHETS +EPITOME +EPITOMES +EPITOMIC +EPITOMICAL +EPITOMISE +EPITOMISED +EPITOMISES +EPITOMISING +EPITOMIZE +EPITOMIZED +EPITOMIZES +EPITOMIZING +EPITOPE +EPITOPES +EPIZOA +EPIZOIC +EPIZOISM +EPIZOISMS +EPIZOITE +EPIZOITES +EPIZOON +EPIZOOTIC +EPIZOOTICS +EPIZOOTIES +EPIZOOTIOLOGIC +EPIZOOTIOLOGIES +EPIZOOTIOLOGY +EPIZOOTY +EPOCH +EPOCHAL +EPOCHALLY +EPOCHS +EPODE +EPODES +EPONYM +EPONYMIC +EPONYMIES +EPONYMOUS +EPONYMS +EPONYMY +EPOPEE +EPOPEES +EPOPOEIA +EPOPOEIAS +EPOS +EPOSES +EPOXIDATION +EPOXIDATIONS +EPOXIDE +EPOXIDES +EPOXIDIZE +EPOXIDIZED +EPOXIDIZES +EPOXIDIZING +EPOXIED +EPOXIES +EPOXY +EPOXYED +EPOXYING +EPSILON +EPSILONIC +EPSILONS +EQUABILITIES +EQUABILITY +EQUABLE +EQUABLENESS +EQUABLENESSES +EQUABLY +EQUAL +EQUALED +EQUALING +EQUALISE +EQUALISED +EQUALISER +EQUALISERS +EQUALISES +EQUALISING +EQUALITARIAN +EQUALITARIANISM +EQUALITARIANS +EQUALITIES +EQUALITY +EQUALIZATION +EQUALIZATIONS +EQUALIZE +EQUALIZED +EQUALIZER +EQUALIZERS +EQUALIZES +EQUALIZING +EQUALLED +EQUALLING +EQUALLY +EQUALS +EQUANIMITIES +EQUANIMITY +EQUATABLE +EQUATE +EQUATED +EQUATES +EQUATING +EQUATION +EQUATIONAL +EQUATIONALLY +EQUATIONS +EQUATOR +EQUATORIAL +EQUATORS +EQUATORWARD +EQUERRIES +EQUERRY +EQUESTRIAN +EQUESTRIANS +EQUESTRIENNE +EQUESTRIENNES +EQUIANGULAR +EQUICALORIC +EQUID +EQUIDISTANT +EQUIDISTANTLY +EQUIDS +EQUILATERAL +EQUILIBRANT +EQUILIBRANTS +EQUILIBRATE +EQUILIBRATED +EQUILIBRATES +EQUILIBRATING +EQUILIBRATION +EQUILIBRATIONS +EQUILIBRATOR +EQUILIBRATORS +EQUILIBRATORY +EQUILIBRIA +EQUILIBRIST +EQUILIBRISTIC +EQUILIBRISTS +EQUILIBRIUM +EQUILIBRIUMS +EQUIMOLAL +EQUIMOLAR +EQUINE +EQUINELY +EQUINES +EQUINITIES +EQUINITY +EQUINOCTIAL +EQUINOCTIALS +EQUINOX +EQUINOXES +EQUIP +EQUIPAGE +EQUIPAGES +EQUIPMENT +EQUIPMENTS +EQUIPOISE +EQUIPOISED +EQUIPOISES +EQUIPOISING +EQUIPOLLENCE +EQUIPOLLENCES +EQUIPOLLENT +EQUIPOLLENTLY +EQUIPOLLENTS +EQUIPONDERANT +EQUIPOTENTIAL +EQUIPPED +EQUIPPER +EQUIPPERS +EQUIPPING +EQUIPROBABLE +EQUIPS +EQUISETA +EQUISETIC +EQUISETUM +EQUISETUMS +EQUITABILITIES +EQUITABILITY +EQUITABLE +EQUITABLENESS +EQUITABLENESSES +EQUITABLY +EQUITANT +EQUITATION +EQUITATIONS +EQUITES +EQUITIES +EQUITY +EQUIVALENCE +EQUIVALENCES +EQUIVALENCIES +EQUIVALENCY +EQUIVALENT +EQUIVALENTLY +EQUIVALENTS +EQUIVOCAL +EQUIVOCALITIES +EQUIVOCALITY +EQUIVOCALLY +EQUIVOCALNESS +EQUIVOCALNESSES +EQUIVOCATE +EQUIVOCATED +EQUIVOCATES +EQUIVOCATING +EQUIVOCATION +EQUIVOCATIONS +EQUIVOCATOR +EQUIVOCATORS +EQUIVOKE +EQUIVOKES +EQUIVOQUE +EQUIVOQUES +ER +ERA +ERADIATE +ERADIATED +ERADIATES +ERADIATING +ERADICABLE +ERADICANT +ERADICANTS +ERADICATE +ERADICATED +ERADICATES +ERADICATING +ERADICATION +ERADICATIONS +ERADICATOR +ERADICATORS +ERAS +ERASABILITIES +ERASABILITY +ERASABLE +ERASE +ERASED +ERASER +ERASERS +ERASES +ERASING +ERASION +ERASIONS +ERASURE +ERASURES +ERBIUM +ERBIUMS +ERE +ERECT +ERECTABLE +ERECTED +ERECTER +ERECTERS +ERECTILE +ERECTILITIES +ERECTILITY +ERECTING +ERECTION +ERECTIONS +ERECTIVE +ERECTLY +ERECTNESS +ERECTNESSES +ERECTOR +ERECTORS +ERECTS +ERELONG +EREMITE +EREMITES +EREMITIC +EREMITICAL +EREMITISH +EREMITISM +EREMITISMS +EREMURI +EREMURUS +EREMURUSES +ERENOW +EREPSIN +EREPSINS +ERETHIC +ERETHISM +ERETHISMS +ERETHITIC +EREWHILE +EREWHILES +ERG +ERGASTIC +ERGASTOPLASM +ERGASTOPLASMIC +ERGASTOPLASMS +ERGATE +ERGATES +ERGATIVE +ERGATIVES +ERGO +ERGODIC +ERGODICITIES +ERGODICITY +ERGOGENIC +ERGOGRAPH +ERGOGRAPHS +ERGOMETER +ERGOMETERS +ERGOMETRIC +ERGOMETRIES +ERGOMETRY +ERGONOMIC +ERGONOMICALLY +ERGONOMICS +ERGONOMIST +ERGONOMISTS +ERGONOVINE +ERGONOVINES +ERGOSTEROL +ERGOSTEROLS +ERGOT +ERGOTAMINE +ERGOTAMINES +ERGOTIC +ERGOTISM +ERGOTISMS +ERGOTIZED +ERGOTS +ERGS +ERICA +ERICACEOUS +ERICAS +ERICOID +ERIGERON +ERIGERONS +ERINGO +ERINGOES +ERINGOS +ERIOPHYID +ERIOPHYIDS +ERISTIC +ERISTICAL +ERISTICALLY +ERISTICS +ERLKING +ERLKINGS +ERMINE +ERMINED +ERMINES +ERN +ERNE +ERNES +ERNS +ERODABLE +ERODE +ERODED +ERODENT +ERODES +ERODIBILITIES +ERODIBILITY +ERODIBLE +ERODING +EROGENIC +EROGENOUS +EROS +EROSE +EROSELY +EROSES +EROSIBLE +EROSION +EROSIONAL +EROSIONALLY +EROSIONS +EROSIVE +EROSIVENESS +EROSIVENESSES +EROSIVITIES +EROSIVITY +EROTIC +EROTICA +EROTICAL +EROTICALLY +EROTICISM +EROTICISMS +EROTICIST +EROTICISTS +EROTICIZATION +EROTICIZATIONS +EROTICIZE +EROTICIZED +EROTICIZES +EROTICIZING +EROTICS +EROTISM +EROTISMS +EROTIZATION +EROTIZATIONS +EROTIZE +EROTIZED +EROTIZES +EROTIZING +EROTOGENIC +ERR +ERRABLE +ERRANCIES +ERRANCY +ERRAND +ERRANDS +ERRANT +ERRANTLY +ERRANTRIES +ERRANTRY +ERRANTS +ERRATA +ERRATAS +ERRATIC +ERRATICAL +ERRATICALLY +ERRATICISM +ERRATICISMS +ERRATICS +ERRATUM +ERRED +ERRHINE +ERRHINES +ERRING +ERRINGLY +ERRONEOUS +ERRONEOUSLY +ERRONEOUSNESS +ERRONEOUSNESSES +ERROR +ERRORLESS +ERRORS +ERRS +ERS +ERSATZ +ERSATZES +ERSES +ERST +ERSTWHILE +ERUCT +ERUCTATE +ERUCTATED +ERUCTATES +ERUCTATING +ERUCTATION +ERUCTATIONS +ERUCTED +ERUCTING +ERUCTS +ERUDITE +ERUDITELY +ERUDITION +ERUDITIONS +ERUGO +ERUGOS +ERUMPENT +ERUPT +ERUPTED +ERUPTIBLE +ERUPTING +ERUPTION +ERUPTIONS +ERUPTIVE +ERUPTIVELY +ERUPTIVES +ERUPTS +ERVIL +ERVILS +ERYNGO +ERYNGOES +ERYNGOS +ERYSIPELAS +ERYSIPELASES +ERYTHEMA +ERYTHEMAS +ERYTHEMATOUS +ERYTHEMIC +ERYTHORBATE +ERYTHORBATES +ERYTHREMIA +ERYTHREMIAS +ERYTHRISM +ERYTHRISMAL +ERYTHRISMS +ERYTHRISTIC +ERYTHRITE +ERYTHRITES +ERYTHROBLAST +ERYTHROBLASTIC +ERYTHROBLASTS +ERYTHROCYTE +ERYTHROCYTES +ERYTHROCYTIC +ERYTHROID +ERYTHROMYCIN +ERYTHROMYCINS +ERYTHRON +ERYTHRONS +ERYTHROPOIESES +ERYTHROPOIESIS +ERYTHROPOIETIC +ERYTHROPOIETIN +ERYTHROPOIETINS +ERYTHROSIN +ERYTHROSINE +ERYTHROSINES +ERYTHROSINS +ES +ESCADRILLE +ESCADRILLES +ESCALADE +ESCALADED +ESCALADER +ESCALADERS +ESCALADES +ESCALADING +ESCALATE +ESCALATED +ESCALATES +ESCALATING +ESCALATION +ESCALATIONS +ESCALATOR +ESCALATORS +ESCALATORY +ESCALLOP +ESCALLOPED +ESCALLOPING +ESCALLOPS +ESCALOP +ESCALOPE +ESCALOPED +ESCALOPES +ESCALOPING +ESCALOPS +ESCAPABLE +ESCAPADE +ESCAPADES +ESCAPE +ESCAPED +ESCAPEE +ESCAPEES +ESCAPEMENT +ESCAPEMENTS +ESCAPER +ESCAPERS +ESCAPES +ESCAPING +ESCAPISM +ESCAPISMS +ESCAPIST +ESCAPISTS +ESCAPOLOGIES +ESCAPOLOGIST +ESCAPOLOGISTS +ESCAPOLOGY +ESCAR +ESCARGOT +ESCARGOTS +ESCAROLE +ESCAROLES +ESCARP +ESCARPED +ESCARPING +ESCARPMENT +ESCARPMENTS +ESCARPS +ESCARS +ESCHALOT +ESCHALOTS +ESCHAR +ESCHAROTIC +ESCHAROTICS +ESCHARS +ESCHATOLOGICAL +ESCHATOLOGIES +ESCHATOLOGY +ESCHEAT +ESCHEATABLE +ESCHEATED +ESCHEATING +ESCHEATOR +ESCHEATORS +ESCHEATS +ESCHEW +ESCHEWAL +ESCHEWALS +ESCHEWED +ESCHEWER +ESCHEWERS +ESCHEWING +ESCHEWS +ESCOLAR +ESCOLARS +ESCORT +ESCORTED +ESCORTING +ESCORTS +ESCOT +ESCOTED +ESCOTING +ESCOTS +ESCRITOIRE +ESCRITOIRES +ESCROW +ESCROWED +ESCROWING +ESCROWS +ESCUAGE +ESCUAGES +ESCUDO +ESCUDOS +ESCULENT +ESCULENTS +ESCUTCHEON +ESCUTCHEONS +ESEMPLASTIC +ESERINE +ESERINES +ESES +ESKAR +ESKARS +ESKER +ESKERS +ESNE +ESNES +ESOPHAGEAL +ESOPHAGI +ESOPHAGUS +ESOTERIC +ESOTERICA +ESOTERICALLY +ESOTERICISM +ESOTERICISMS +ESOTROPIA +ESOTROPIAS +ESOTROPIC +ESPADRILLE +ESPADRILLES +ESPALIER +ESPALIERED +ESPALIERING +ESPALIERS +ESPANOL +ESPANOLES +ESPARTO +ESPARTOS +ESPECIAL +ESPECIALLY +ESPERANCE +ESPERANCES +ESPIAL +ESPIALS +ESPIED +ESPIEGLE +ESPIEGLERIE +ESPIEGLERIES +ESPIES +ESPIONAGE +ESPIONAGES +ESPLANADE +ESPLANADES +ESPOUSAL +ESPOUSALS +ESPOUSE +ESPOUSED +ESPOUSER +ESPOUSERS +ESPOUSES +ESPOUSING +ESPRESSO +ESPRESSOS +ESPRIT +ESPRITS +ESPY +ESPYING +ESQUIRE +ESQUIRED +ESQUIRES +ESQUIRING +ESS +ESSAY +ESSAYED +ESSAYER +ESSAYERS +ESSAYING +ESSAYIST +ESSAYISTIC +ESSAYISTS +ESSAYS +ESSENCE +ESSENCES +ESSENTIAL +ESSENTIALISM +ESSENTIALISMS +ESSENTIALIST +ESSENTIALISTS +ESSENTIALITIES +ESSENTIALITY +ESSENTIALIZE +ESSENTIALIZED +ESSENTIALIZES +ESSENTIALIZING +ESSENTIALLY +ESSENTIALNESS +ESSENTIALNESSES +ESSENTIALS +ESSES +ESSOIN +ESSOINS +ESSONITE +ESSONITES +ESTABLISH +ESTABLISHABLE +ESTABLISHED +ESTABLISHER +ESTABLISHERS +ESTABLISHES +ESTABLISHING +ESTABLISHMENT +ESTABLISHMENTS +ESTAMINET +ESTAMINETS +ESTANCIA +ESTANCIAS +ESTATE +ESTATED +ESTATES +ESTATING +ESTEEM +ESTEEMED +ESTEEMING +ESTEEMS +ESTER +ESTERASE +ESTERASES +ESTERIFICATION +ESTERIFICATIONS +ESTERIFIED +ESTERIFIES +ESTERIFY +ESTERIFYING +ESTERS +ESTHESES +ESTHESIA +ESTHESIAS +ESTHESIS +ESTHESISES +ESTHETE +ESTHETES +ESTHETIC +ESTHETICIAN +ESTHETICIANS +ESTHETICISM +ESTHETICISMS +ESTHETICS +ESTIMABLE +ESTIMABLENESS +ESTIMABLENESSES +ESTIMABLY +ESTIMATE +ESTIMATED +ESTIMATES +ESTIMATING +ESTIMATION +ESTIMATIONS +ESTIMATIVE +ESTIMATOR +ESTIMATORS +ESTIVAL +ESTIVATE +ESTIVATED +ESTIVATES +ESTIVATING +ESTIVATION +ESTIVATIONS +ESTIVATOR +ESTIVATORS +ESTOP +ESTOPPAGE +ESTOPPAGES +ESTOPPED +ESTOPPEL +ESTOPPELS +ESTOPPING +ESTOPS +ESTOVERS +ESTRADIOL +ESTRADIOLS +ESTRAGON +ESTRAGONS +ESTRAL +ESTRANGE +ESTRANGED +ESTRANGEMENT +ESTRANGEMENTS +ESTRANGER +ESTRANGERS +ESTRANGES +ESTRANGING +ESTRAY +ESTRAYED +ESTRAYING +ESTRAYS +ESTREAT +ESTREATED +ESTREATING +ESTREATS +ESTRIN +ESTRINS +ESTRIOL +ESTRIOLS +ESTROGEN +ESTROGENIC +ESTROGENICALLY +ESTROGENS +ESTRONE +ESTRONES +ESTROUS +ESTRUAL +ESTRUM +ESTRUMS +ESTRUS +ESTRUSES +ESTUARIAL +ESTUARIES +ESTUARINE +ESTUARY +ESURIENCE +ESURIENCES +ESURIENCIES +ESURIENCY +ESURIENT +ESURIENTLY +ET +ETA +ETAGERE +ETAGERES +ETALON +ETALONS +ETAMIN +ETAMINE +ETAMINES +ETAMINS +ETAPE +ETAPES +ETAS +ETATISM +ETATISMS +ETATIST +ETCETERA +ETCETERAS +ETCH +ETCHANT +ETCHANTS +ETCHED +ETCHER +ETCHERS +ETCHES +ETCHING +ETCHINGS +ETERNAL +ETERNALIZE +ETERNALIZED +ETERNALIZES +ETERNALIZING +ETERNALLY +ETERNALNESS +ETERNALNESSES +ETERNALS +ETERNE +ETERNISE +ETERNISED +ETERNISES +ETERNISING +ETERNITIES +ETERNITY +ETERNIZATION +ETERNIZATIONS +ETERNIZE +ETERNIZED +ETERNIZES +ETERNIZING +ETESIAN +ETESIANS +ETH +ETHAMBUTOL +ETHAMBUTOLS +ETHANE +ETHANES +ETHANOL +ETHANOLAMINE +ETHANOLAMINES +ETHANOLS +ETHENE +ETHENES +ETHEPHON +ETHEPHONS +ETHER +ETHEREAL +ETHEREALITIES +ETHEREALITY +ETHEREALIZATION +ETHEREALIZE +ETHEREALIZED +ETHEREALIZES +ETHEREALIZING +ETHEREALLY +ETHEREALNESS +ETHEREALNESSES +ETHERIC +ETHERIFIED +ETHERIFIES +ETHERIFY +ETHERIFYING +ETHERISH +ETHERIZATION +ETHERIZATIONS +ETHERIZE +ETHERIZED +ETHERIZER +ETHERIZERS +ETHERIZES +ETHERIZING +ETHERS +ETHIC +ETHICAL +ETHICALITIES +ETHICALITY +ETHICALLY +ETHICALNESS +ETHICALNESSES +ETHICALS +ETHICIAN +ETHICIANS +ETHICIST +ETHICISTS +ETHICIZE +ETHICIZED +ETHICIZES +ETHICIZING +ETHICS +ETHINYL +ETHINYLS +ETHION +ETHIONAMIDE +ETHIONAMIDES +ETHIONINE +ETHIONINES +ETHIONS +ETHMOID +ETHMOIDAL +ETHMOIDS +ETHNARCH +ETHNARCHIES +ETHNARCHS +ETHNARCHY +ETHNIC +ETHNICAL +ETHNICALLY +ETHNICITIES +ETHNICITY +ETHNICS +ETHNOBOTANICAL +ETHNOBOTANIES +ETHNOBOTANIST +ETHNOBOTANISTS +ETHNOBOTANY +ETHNOCENTRIC +ETHNOCENTRICITY +ETHNOCENTRISM +ETHNOCENTRISMS +ETHNOGRAPHER +ETHNOGRAPHERS +ETHNOGRAPHIC +ETHNOGRAPHICAL +ETHNOGRAPHIES +ETHNOGRAPHY +ETHNOHISTORIAN +ETHNOHISTORIANS +ETHNOHISTORIC +ETHNOHISTORICAL +ETHNOHISTORIES +ETHNOHISTORY +ETHNOLOGIC +ETHNOLOGICAL +ETHNOLOGIES +ETHNOLOGIST +ETHNOLOGISTS +ETHNOLOGY +ETHNOMUSICOLOGY +ETHNONYM +ETHNONYMS +ETHNOS +ETHNOSCIENCE +ETHNOSCIENCES +ETHNOSES +ETHOGRAM +ETHOGRAMS +ETHOLOGICAL +ETHOLOGIES +ETHOLOGIST +ETHOLOGISTS +ETHOLOGY +ETHOS +ETHOSES +ETHOXIES +ETHOXY +ETHOXYL +ETHOXYLS +ETHS +ETHYL +ETHYLATE +ETHYLATED +ETHYLATES +ETHYLATING +ETHYLBENZENE +ETHYLBENZENES +ETHYLENE +ETHYLENES +ETHYLENIC +ETHYLIC +ETHYLS +ETHYNE +ETHYNES +ETHYNYL +ETHYNYLS +ETIC +ETIOLATE +ETIOLATED +ETIOLATES +ETIOLATING +ETIOLATION +ETIOLATIONS +ETIOLOGIC +ETIOLOGICAL +ETIOLOGICALLY +ETIOLOGIES +ETIOLOGY +ETIQUETTE +ETIQUETTES +ETNA +ETNAS +ETOILE +ETOILES +ETOUFFEE +ETOUFFEES +ETUDE +ETUDES +ETUI +ETUIS +ETWEE +ETWEES +ETYMA +ETYMOLOGICAL +ETYMOLOGICALLY +ETYMOLOGIES +ETYMOLOGISE +ETYMOLOGISED +ETYMOLOGISES +ETYMOLOGISING +ETYMOLOGIST +ETYMOLOGISTS +ETYMOLOGIZE +ETYMOLOGIZED +ETYMOLOGIZES +ETYMOLOGIZING +ETYMOLOGY +ETYMON +ETYMONS +EUCAINE +EUCAINES +EUCALYPT +EUCALYPTI +EUCALYPTOL +EUCALYPTOLE +EUCALYPTOLES +EUCALYPTOLS +EUCALYPTS +EUCALYPTUS +EUCALYPTUSES +EUCARYOTE +EUCARYOTES +EUCHARIS +EUCHARISES +EUCHARISTIC +EUCHRE +EUCHRED +EUCHRES +EUCHRING +EUCHROMATIC +EUCHROMATIN +EUCHROMATINS +EUCLASE +EUCLASES +EUCLIDEAN +EUCLIDIAN +EUCRITE +EUCRITES +EUCRITIC +EUDAEMON +EUDAEMONISM +EUDAEMONISMS +EUDAEMONIST +EUDAEMONISTIC +EUDAEMONISTS +EUDAEMONS +EUDAIMON +EUDAIMONISM +EUDAIMONISMS +EUDAIMONS +EUDEMON +EUDEMONIA +EUDEMONIAS +EUDEMONS +EUDIOMETER +EUDIOMETERS +EUDIOMETRIC +EUDIOMETRICALLY +EUGENIA +EUGENIAS +EUGENIC +EUGENICAL +EUGENICALLY +EUGENICIST +EUGENICISTS +EUGENICS +EUGENIST +EUGENISTS +EUGENOL +EUGENOLS +EUGEOSYNCLINAL +EUGEOSYNCLINE +EUGEOSYNCLINES +EUGLENA +EUGLENAS +EUGLENID +EUGLENIDS +EUGLENOID +EUGLENOIDS +EUGLOBULIN +EUGLOBULINS +EUHEMERISM +EUHEMERISMS +EUHEMERIST +EUHEMERISTIC +EUHEMERISTS +EUKARYOTE +EUKARYOTES +EUKARYOTIC +EULACHAN +EULACHANS +EULACHON +EULACHONS +EULOGIA +EULOGIAE +EULOGIAS +EULOGIES +EULOGISE +EULOGISED +EULOGISES +EULOGISING +EULOGIST +EULOGISTIC +EULOGISTICALLY +EULOGISTS +EULOGIUM +EULOGIUMS +EULOGIZE +EULOGIZED +EULOGIZER +EULOGIZERS +EULOGIZES +EULOGIZING +EULOGY +EUNUCH +EUNUCHISM +EUNUCHISMS +EUNUCHOID +EUNUCHOIDS +EUNUCHS +EUONYMUS +EUONYMUSES +EUPATRID +EUPATRIDAE +EUPATRIDS +EUPEPSIA +EUPEPSIAS +EUPEPSIES +EUPEPSY +EUPEPTIC +EUPHAUSID +EUPHAUSIDS +EUPHAUSIID +EUPHAUSIIDS +EUPHEMISE +EUPHEMISED +EUPHEMISES +EUPHEMISING +EUPHEMISM +EUPHEMISMS +EUPHEMIST +EUPHEMISTIC +EUPHEMISTICALLY +EUPHEMISTS +EUPHEMIZE +EUPHEMIZED +EUPHEMIZER +EUPHEMIZERS +EUPHEMIZES +EUPHEMIZING +EUPHENIC +EUPHENICS +EUPHONIC +EUPHONICALLY +EUPHONIES +EUPHONIOUS +EUPHONIOUSLY +EUPHONIOUSNESS +EUPHONIUM +EUPHONIUMS +EUPHONIZE +EUPHONIZED +EUPHONIZES +EUPHONIZING +EUPHONY +EUPHORBIA +EUPHORBIAS +EUPHORIA +EUPHORIANT +EUPHORIANTS +EUPHORIAS +EUPHORIC +EUPHORICALLY +EUPHOTIC +EUPHRASIES +EUPHRASY +EUPHROE +EUPHROES +EUPHUISM +EUPHUISMS +EUPHUIST +EUPHUISTIC +EUPHUISTICALLY +EUPHUISTS +EUPLASTIC +EUPLASTICS +EUPLOID +EUPLOIDIES +EUPLOIDS +EUPLOIDY +EUPNEA +EUPNEAS +EUPNEIC +EUPNOEA +EUPNOEAS +EUPNOEIC +EUREKA +EURHYTHMIC +EURHYTHMICS +EURHYTHMIES +EURHYTHMY +EURIPI +EURIPUS +EURO +EUROKIES +EUROKOUS +EUROKY +EUROPIUM +EUROPIUMS +EUROS +EURYBATH +EURYBATHIC +EURYBATHS +EURYHALINE +EURYOKIES +EURYOKOUS +EURYOKY +EURYPTERID +EURYPTERIDS +EURYTHERM +EURYTHERMAL +EURYTHERMIC +EURYTHERMOUS +EURYTHERMS +EURYTHMIC +EURYTHMICS +EURYTHMIES +EURYTHMY +EURYTOPIC +EUSOCIAL +EUSTACIES +EUSTACY +EUSTASIES +EUSTASY +EUSTATIC +EUSTELE +EUSTELES +EUTAXIES +EUTAXY +EUTECTIC +EUTECTICS +EUTECTOID +EUTECTOIDS +EUTHANASIA +EUTHANASIAS +EUTHANASIC +EUTHANATIZE +EUTHANATIZED +EUTHANATIZES +EUTHANATIZING +EUTHANIZE +EUTHANIZED +EUTHANIZES +EUTHANIZING +EUTHENICS +EUTHENIST +EUTHENISTS +EUTHERIAN +EUTHERIANS +EUTHYROID +EUTHYROIDS +EUTROPHIC +EUTROPHICATION +EUTROPHICATIONS +EUTROPHIES +EUTROPHY +EUXENITE +EUXENITES +EVACUANT +EVACUANTS +EVACUATE +EVACUATED +EVACUATES +EVACUATING +EVACUATION +EVACUATIONS +EVACUATIVE +EVACUATOR +EVACUATORS +EVACUEE +EVACUEES +EVADABLE +EVADE +EVADED +EVADER +EVADERS +EVADES +EVADIBLE +EVADING +EVADINGLY +EVAGINATE +EVAGINATED +EVAGINATES +EVAGINATING +EVAGINATION +EVAGINATIONS +EVALUABLE +EVALUATE +EVALUATED +EVALUATES +EVALUATING +EVALUATION +EVALUATIONS +EVALUATIVE +EVALUATOR +EVALUATORS +EVANESCE +EVANESCED +EVANESCENCE +EVANESCENCES +EVANESCENT +EVANESCES +EVANESCING +EVANGEL +EVANGELIC +EVANGELICAL +EVANGELICALLY +EVANGELISM +EVANGELISMS +EVANGELIST +EVANGELISTIC +EVANGELISTS +EVANGELIZATION +EVANGELIZATIONS +EVANGELIZE +EVANGELIZED +EVANGELIZES +EVANGELIZING +EVANGELS +EVANISH +EVANISHED +EVANISHES +EVANISHING +EVAPORATE +EVAPORATED +EVAPORATES +EVAPORATING +EVAPORATION +EVAPORATIONS +EVAPORATIVE +EVAPORATOR +EVAPORATORS +EVAPORITE +EVAPORITES +EVAPORITIC +EVASION +EVASIONAL +EVASIONS +EVASIVE +EVASIVELY +EVASIVENESS +EVASIVENESSES +EVE +EVECTION +EVECTIONS +EVEN +EVENED +EVENER +EVENERS +EVENEST +EVENFALL +EVENFALLS +EVENHANDED +EVENHANDEDLY +EVENHANDEDNESS +EVENING +EVENINGS +EVENLY +EVENNESS +EVENNESSES +EVENS +EVENSONG +EVENSONGS +EVENT +EVENTFUL +EVENTFULLY +EVENTFULNESS +EVENTFULNESSES +EVENTIDE +EVENTIDES +EVENTLESS +EVENTS +EVENTUAL +EVENTUALITIES +EVENTUALITY +EVENTUALLY +EVENTUATE +EVENTUATED +EVENTUATES +EVENTUATING +EVER +EVERBLOOMING +EVERDURING +EVERGLADE +EVERGLADES +EVERGREEN +EVERGREENS +EVERLASTING +EVERLASTINGLY +EVERLASTINGNESS +EVERLASTINGS +EVERMORE +EVERSIBLE +EVERSION +EVERSIONS +EVERT +EVERTED +EVERTING +EVERTOR +EVERTORS +EVERTS +EVERWHERE +EVERWHICH +EVERY +EVERYBODY +EVERYDAY +EVERYDAYNESS +EVERYDAYNESSES +EVERYDAYS +EVERYMAN +EVERYMEN +EVERYONE +EVERYPLACE +EVERYTHING +EVERYWAY +EVERYWHERE +EVERYWOMAN +EVERYWOMEN +EVES +EVICT +EVICTED +EVICTEE +EVICTEES +EVICTING +EVICTION +EVICTIONS +EVICTOR +EVICTORS +EVICTS +EVIDENCE +EVIDENCED +EVIDENCES +EVIDENCING +EVIDENT +EVIDENTIAL +EVIDENTIALLY +EVIDENTIARY +EVIDENTLY +EVIL +EVILDOER +EVILDOERS +EVILDOING +EVILDOINGS +EVILER +EVILEST +EVILLER +EVILLEST +EVILLY +EVILNESS +EVILNESSES +EVILS +EVINCE +EVINCED +EVINCES +EVINCIBLE +EVINCING +EVINCIVE +EVISCERATE +EVISCERATED +EVISCERATES +EVISCERATING +EVISCERATION +EVISCERATIONS +EVITABLE +EVITE +EVITED +EVITES +EVITING +EVOCABLE +EVOCATION +EVOCATIONS +EVOCATIVE +EVOCATIVELY +EVOCATIVENESS +EVOCATIVENESSES +EVOCATOR +EVOCATORS +EVOKE +EVOKED +EVOKER +EVOKERS +EVOKES +EVOKING +EVOLUTE +EVOLUTES +EVOLUTION +EVOLUTIONARILY +EVOLUTIONARY +EVOLUTIONISM +EVOLUTIONISMS +EVOLUTIONIST +EVOLUTIONISTS +EVOLUTIONS +EVOLVABLE +EVOLVE +EVOLVED +EVOLVEMENT +EVOLVEMENTS +EVOLVER +EVOLVERS +EVOLVES +EVOLVING +EVONYMUS +EVONYMUSES +EVULSE +EVULSED +EVULSES +EVULSING +EVULSION +EVULSIONS +EVZONE +EVZONES +EWE +EWER +EWERS +EWES +EX +EXABYTE +EXABYTES +EXACERBATE +EXACERBATED +EXACERBATES +EXACERBATING +EXACERBATION +EXACERBATIONS +EXACT +EXACTA +EXACTABLE +EXACTAS +EXACTED +EXACTER +EXACTERS +EXACTEST +EXACTING +EXACTINGLY +EXACTINGNESS +EXACTINGNESSES +EXACTION +EXACTIONS +EXACTITUDE +EXACTITUDES +EXACTLY +EXACTNESS +EXACTNESSES +EXACTOR +EXACTORS +EXACTS +EXAGGERATE +EXAGGERATED +EXAGGERATEDLY +EXAGGERATEDNESS +EXAGGERATES +EXAGGERATING +EXAGGERATION +EXAGGERATIONS +EXAGGERATIVE +EXAGGERATOR +EXAGGERATORS +EXAGGERATORY +EXAHERTZ +EXAHERTZES +EXALT +EXALTATION +EXALTATIONS +EXALTED +EXALTEDLY +EXALTER +EXALTERS +EXALTING +EXALTS +EXAM +EXAMEN +EXAMENS +EXAMINABLE +EXAMINANT +EXAMINANTS +EXAMINATION +EXAMINATIONAL +EXAMINATIONS +EXAMINE +EXAMINED +EXAMINEE +EXAMINEES +EXAMINER +EXAMINERS +EXAMINES +EXAMINING +EXAMPLE +EXAMPLED +EXAMPLES +EXAMPLING +EXAMS +EXANIMATE +EXANTHEM +EXANTHEMA +EXANTHEMAS +EXANTHEMATA +EXANTHEMATIC +EXANTHEMATOUS +EXANTHEMS +EXAPTED +EXAPTIVE +EXARCH +EXARCHAL +EXARCHATE +EXARCHATES +EXARCHIES +EXARCHS +EXARCHY +EXASPERATE +EXASPERATED +EXASPERATEDLY +EXASPERATES +EXASPERATING +EXASPERATINGLY +EXASPERATION +EXASPERATIONS +EXCAUDATE +EXCAVATE +EXCAVATED +EXCAVATES +EXCAVATING +EXCAVATION +EXCAVATIONAL +EXCAVATIONS +EXCAVATOR +EXCAVATORS +EXCEED +EXCEEDED +EXCEEDER +EXCEEDERS +EXCEEDING +EXCEEDINGLY +EXCEEDS +EXCEL +EXCELLED +EXCELLENCE +EXCELLENCES +EXCELLENCIES +EXCELLENCY +EXCELLENT +EXCELLENTLY +EXCELLING +EXCELS +EXCELSIOR +EXCELSIORS +EXCEPT +EXCEPTED +EXCEPTING +EXCEPTION +EXCEPTIONABLE +EXCEPTIONABLY +EXCEPTIONAL +EXCEPTIONALISM +EXCEPTIONALISMS +EXCEPTIONALITY +EXCEPTIONALLY +EXCEPTIONALNESS +EXCEPTIONS +EXCEPTIVE +EXCEPTS +EXCERPT +EXCERPTED +EXCERPTER +EXCERPTERS +EXCERPTING +EXCERPTION +EXCERPTIONS +EXCERPTOR +EXCERPTORS +EXCERPTS +EXCESS +EXCESSED +EXCESSES +EXCESSING +EXCESSIVE +EXCESSIVELY +EXCESSIVENESS +EXCESSIVENESSES +EXCHANGE +EXCHANGEABILITY +EXCHANGEABLE +EXCHANGED +EXCHANGER +EXCHANGERS +EXCHANGES +EXCHANGING +EXCHEQUER +EXCHEQUERS +EXCIDE +EXCIDED +EXCIDES +EXCIDING +EXCIMER +EXCIMERS +EXCIPIENT +EXCIPIENTS +EXCIPLE +EXCIPLES +EXCISABLE +EXCISE +EXCISED +EXCISEMAN +EXCISEMEN +EXCISES +EXCISING +EXCISION +EXCISIONAL +EXCISIONS +EXCITABILITIES +EXCITABILITY +EXCITABLE +EXCITABLENESS +EXCITABLENESSES +EXCITABLY +EXCITANT +EXCITANTS +EXCITATION +EXCITATIONS +EXCITATIVE +EXCITATORY +EXCITE +EXCITED +EXCITEDLY +EXCITEMENT +EXCITEMENTS +EXCITER +EXCITERS +EXCITES +EXCITING +EXCITINGLY +EXCITON +EXCITONIC +EXCITONS +EXCITOR +EXCITORS +EXCLAIM +EXCLAIMED +EXCLAIMER +EXCLAIMERS +EXCLAIMING +EXCLAIMS +EXCLAMATION +EXCLAMATIONS +EXCLAMATORY +EXCLAVE +EXCLAVES +EXCLOSURE +EXCLOSURES +EXCLUDABILITIES +EXCLUDABILITY +EXCLUDABLE +EXCLUDE +EXCLUDED +EXCLUDER +EXCLUDERS +EXCLUDES +EXCLUDIBLE +EXCLUDING +EXCLUSION +EXCLUSIONARY +EXCLUSIONIST +EXCLUSIONISTS +EXCLUSIONS +EXCLUSIVE +EXCLUSIVELY +EXCLUSIVENESS +EXCLUSIVENESSES +EXCLUSIVES +EXCLUSIVISM +EXCLUSIVISMS +EXCLUSIVIST +EXCLUSIVISTS +EXCLUSIVITIES +EXCLUSIVITY +EXCLUSORY +EXCOGITATE +EXCOGITATED +EXCOGITATES +EXCOGITATING +EXCOGITATION +EXCOGITATIONS +EXCOGITATIVE +EXCOMMUNICATE +EXCOMMUNICATED +EXCOMMUNICATES +EXCOMMUNICATING +EXCOMMUNICATION +EXCOMMUNICATIVE +EXCOMMUNICATOR +EXCOMMUNICATORS +EXCORIATE +EXCORIATED +EXCORIATES +EXCORIATING +EXCORIATION +EXCORIATIONS +EXCREMENT +EXCREMENTAL +EXCREMENTITIOUS +EXCREMENTS +EXCRESCENCE +EXCRESCENCES +EXCRESCENCIES +EXCRESCENCY +EXCRESCENT +EXCRESCENTLY +EXCRETA +EXCRETAL +EXCRETE +EXCRETED +EXCRETER +EXCRETERS +EXCRETES +EXCRETING +EXCRETION +EXCRETIONS +EXCRETIVE +EXCRETORIES +EXCRETORY +EXCRUCIATE +EXCRUCIATED +EXCRUCIATES +EXCRUCIATING +EXCRUCIATINGLY +EXCRUCIATION +EXCRUCIATIONS +EXCULPATE +EXCULPATED +EXCULPATES +EXCULPATING +EXCULPATION +EXCULPATIONS +EXCULPATORY +EXCURRENT +EXCURSION +EXCURSIONIST +EXCURSIONISTS +EXCURSIONS +EXCURSIVE +EXCURSIVELY +EXCURSIVENESS +EXCURSIVENESSES +EXCURSUS +EXCURSUSES +EXCUSABLE +EXCUSABLENESS +EXCUSABLENESSES +EXCUSABLY +EXCUSATORY +EXCUSE +EXCUSED +EXCUSER +EXCUSERS +EXCUSES +EXCUSING +EXEC +EXECRABLE +EXECRABLENESS +EXECRABLENESSES +EXECRABLY +EXECRATE +EXECRATED +EXECRATES +EXECRATING +EXECRATION +EXECRATIONS +EXECRATIVE +EXECRATOR +EXECRATORS +EXECS +EXECUTABLE +EXECUTANT +EXECUTANTS +EXECUTE +EXECUTED +EXECUTER +EXECUTERS +EXECUTES +EXECUTING +EXECUTION +EXECUTIONER +EXECUTIONERS +EXECUTIONS +EXECUTIVE +EXECUTIVES +EXECUTOR +EXECUTORIAL +EXECUTORS +EXECUTORY +EXECUTRICES +EXECUTRIX +EXECUTRIXES +EXED +EXEDRA +EXEDRAE +EXEGESES +EXEGESIS +EXEGETE +EXEGETES +EXEGETIC +EXEGETICAL +EXEGETICS +EXEGETIST +EXEGETISTS +EXEMPLA +EXEMPLAR +EXEMPLARILY +EXEMPLARINESS +EXEMPLARINESSES +EXEMPLARITIES +EXEMPLARITY +EXEMPLARS +EXEMPLARY +EXEMPLIFICATION +EXEMPLIFIED +EXEMPLIFIES +EXEMPLIFY +EXEMPLIFYING +EXEMPLUM +EXEMPT +EXEMPTED +EXEMPTING +EXEMPTION +EXEMPTIONS +EXEMPTIVE +EXEMPTS +EXENTERATE +EXENTERATED +EXENTERATES +EXENTERATING +EXENTERATION +EXENTERATIONS +EXEQUATUR +EXEQUATURS +EXEQUIAL +EXEQUIES +EXEQUY +EXERCISABLE +EXERCISE +EXERCISED +EXERCISER +EXERCISERS +EXERCISES +EXERCISING +EXERCITATION +EXERCITATIONS +EXERCYCLE +EXERCYCLES +EXERGONIC +EXERGUAL +EXERGUE +EXERGUES +EXERT +EXERTED +EXERTING +EXERTION +EXERTIONS +EXERTIVE +EXERTS +EXES +EXEUNT +EXFOLIANT +EXFOLIANTS +EXFOLIATE +EXFOLIATED +EXFOLIATES +EXFOLIATING +EXFOLIATION +EXFOLIATIONS +EXFOLIATIVE +EXHALANT +EXHALANTS +EXHALATION +EXHALATIONS +EXHALE +EXHALED +EXHALENT +EXHALENTS +EXHALES +EXHALING +EXHAUST +EXHAUSTED +EXHAUSTER +EXHAUSTERS +EXHAUSTIBILITY +EXHAUSTIBLE +EXHAUSTING +EXHAUSTION +EXHAUSTIONS +EXHAUSTIVE +EXHAUSTIVELY +EXHAUSTIVENESS +EXHAUSTIVITIES +EXHAUSTIVITY +EXHAUSTLESS +EXHAUSTLESSLY +EXHAUSTLESSNESS +EXHAUSTS +EXHEDRA +EXHEDRAE +EXHIBIT +EXHIBITED +EXHIBITER +EXHIBITERS +EXHIBITING +EXHIBITION +EXHIBITIONER +EXHIBITIONERS +EXHIBITIONISM +EXHIBITIONISMS +EXHIBITIONIST +EXHIBITIONISTIC +EXHIBITIONISTS +EXHIBITIONS +EXHIBITIVE +EXHIBITOR +EXHIBITORS +EXHIBITORY +EXHIBITS +EXHILARATE +EXHILARATED +EXHILARATES +EXHILARATING +EXHILARATINGLY +EXHILARATION +EXHILARATIONS +EXHILARATIVE +EXHORT +EXHORTATION +EXHORTATIONS +EXHORTATIVE +EXHORTATORY +EXHORTED +EXHORTER +EXHORTERS +EXHORTING +EXHORTS +EXHUMATION +EXHUMATIONS +EXHUME +EXHUMED +EXHUMER +EXHUMERS +EXHUMES +EXHUMING +EXIGENCE +EXIGENCES +EXIGENCIES +EXIGENCY +EXIGENT +EXIGENTLY +EXIGIBLE +EXIGUITIES +EXIGUITY +EXIGUOUS +EXIGUOUSLY +EXIGUOUSNESS +EXIGUOUSNESSES +EXILABLE +EXILE +EXILED +EXILER +EXILERS +EXILES +EXILIAN +EXILIC +EXILING +EXIMIOUS +EXINE +EXINES +EXING +EXIST +EXISTED +EXISTENCE +EXISTENCES +EXISTENT +EXISTENTIAL +EXISTENTIALISM +EXISTENTIALISMS +EXISTENTIALIST +EXISTENTIALISTS +EXISTENTIALLY +EXISTENTS +EXISTING +EXISTS +EXIT +EXITED +EXITING +EXITLESS +EXITS +EXOBIOLOGICAL +EXOBIOLOGIES +EXOBIOLOGIST +EXOBIOLOGISTS +EXOBIOLOGY +EXOCARP +EXOCARPS +EXOCRINE +EXOCRINES +EXOCYCLIC +EXOCYTIC +EXOCYTOSE +EXOCYTOSED +EXOCYTOSES +EXOCYTOSING +EXOCYTOSIS +EXOCYTOTIC +EXODERM +EXODERMIS +EXODERMISES +EXODERMS +EXODOI +EXODONTIA +EXODONTIAS +EXODONTIST +EXODONTISTS +EXODOS +EXODUS +EXODUSES +EXOENZYME +EXOENZYMES +EXOERGIC +EXOERYTHROCYTIC +EXOGAMIC +EXOGAMIES +EXOGAMOUS +EXOGAMY +EXOGEN +EXOGENISM +EXOGENISMS +EXOGENOUS +EXOGENOUSLY +EXOGENS +EXON +EXONERATE +EXONERATED +EXONERATES +EXONERATING +EXONERATION +EXONERATIONS +EXONERATIVE +EXONIC +EXONS +EXONUCLEASE +EXONUCLEASES +EXONUMIA +EXONUMIST +EXONUMISTS +EXONYM +EXONYMS +EXOPEPTIDASE +EXOPEPTIDASES +EXOPHTHALMIC +EXOPHTHALMOS +EXOPHTHALMOSES +EXOPHTHALMUS +EXOPHTHALMUSES +EXORABLE +EXORBITANCE +EXORBITANCES +EXORBITANT +EXORBITANTLY +EXORCISE +EXORCISED +EXORCISER +EXORCISERS +EXORCISES +EXORCISING +EXORCISM +EXORCISMS +EXORCIST +EXORCISTIC +EXORCISTICAL +EXORCISTS +EXORCIZE +EXORCIZED +EXORCIZES +EXORCIZING +EXORDIA +EXORDIAL +EXORDIUM +EXORDIUMS +EXOSKELETAL +EXOSKELETON +EXOSKELETONS +EXOSMIC +EXOSMOSE +EXOSMOSES +EXOSMOSIS +EXOSMOTIC +EXOSPHERE +EXOSPHERES +EXOSPHERIC +EXOSPORE +EXOSPORES +EXOSPORIA +EXOSPORIUM +EXOSTOSES +EXOSTOSIS +EXOTERIC +EXOTERICALLY +EXOTHERMAL +EXOTHERMALLY +EXOTHERMIC +EXOTHERMICALLY +EXOTHERMICITIES +EXOTHERMICITY +EXOTIC +EXOTICA +EXOTICALLY +EXOTICISM +EXOTICISMS +EXOTICIST +EXOTICISTS +EXOTICNESS +EXOTICNESSES +EXOTICS +EXOTISM +EXOTISMS +EXOTOXIC +EXOTOXIN +EXOTOXINS +EXOTROPIA +EXOTROPIAS +EXOTROPIC +EXPAND +EXPANDABILITIES +EXPANDABILITY +EXPANDABLE +EXPANDED +EXPANDER +EXPANDERS +EXPANDING +EXPANDOR +EXPANDORS +EXPANDS +EXPANSE +EXPANSES +EXPANSIBILITIES +EXPANSIBILITY +EXPANSIBLE +EXPANSILE +EXPANSION +EXPANSIONAL +EXPANSIONARY +EXPANSIONISM +EXPANSIONISMS +EXPANSIONIST +EXPANSIONISTIC +EXPANSIONISTS +EXPANSIONS +EXPANSIVE +EXPANSIVELY +EXPANSIVENESS +EXPANSIVENESSES +EXPANSIVITIES +EXPANSIVITY +EXPAT +EXPATIATE +EXPATIATED +EXPATIATES +EXPATIATING +EXPATIATION +EXPATIATIONS +EXPATRIATE +EXPATRIATED +EXPATRIATES +EXPATRIATING +EXPATRIATION +EXPATRIATIONS +EXPATRIATISM +EXPATRIATISMS +EXPATS +EXPECT +EXPECTABLE +EXPECTABLY +EXPECTANCE +EXPECTANCES +EXPECTANCIES +EXPECTANCY +EXPECTANT +EXPECTANTLY +EXPECTANTS +EXPECTATION +EXPECTATIONAL +EXPECTATIONS +EXPECTATIVE +EXPECTED +EXPECTEDLY +EXPECTEDNESS +EXPECTEDNESSES +EXPECTER +EXPECTERS +EXPECTING +EXPECTORANT +EXPECTORANTS +EXPECTORATE +EXPECTORATED +EXPECTORATES +EXPECTORATING +EXPECTORATION +EXPECTORATIONS +EXPECTS +EXPEDIENCE +EXPEDIENCES +EXPEDIENCIES +EXPEDIENCY +EXPEDIENT +EXPEDIENTIAL +EXPEDIENTLY +EXPEDIENTS +EXPEDITE +EXPEDITED +EXPEDITER +EXPEDITERS +EXPEDITES +EXPEDITING +EXPEDITION +EXPEDITIONARY +EXPEDITIONS +EXPEDITIOUS +EXPEDITIOUSLY +EXPEDITIOUSNESS +EXPEDITOR +EXPEDITORS +EXPEL +EXPELLABLE +EXPELLANT +EXPELLANTS +EXPELLED +EXPELLEE +EXPELLEES +EXPELLENT +EXPELLENTS +EXPELLER +EXPELLERS +EXPELLING +EXPELS +EXPEND +EXPENDABILITIES +EXPENDABILITY +EXPENDABLE +EXPENDABLES +EXPENDED +EXPENDER +EXPENDERS +EXPENDING +EXPENDITURE +EXPENDITURES +EXPENDS +EXPENSE +EXPENSED +EXPENSES +EXPENSING +EXPENSIVE +EXPENSIVELY +EXPENSIVENESS +EXPENSIVENESSES +EXPERIENCE +EXPERIENCED +EXPERIENCES +EXPERIENCING +EXPERIENTIAL +EXPERIENTIALLY +EXPERIMENT +EXPERIMENTAL +EXPERIMENTALISM +EXPERIMENTALIST +EXPERIMENTALLY +EXPERIMENTATION +EXPERIMENTED +EXPERIMENTER +EXPERIMENTERS +EXPERIMENTING +EXPERIMENTS +EXPERT +EXPERTED +EXPERTING +EXPERTISE +EXPERTISES +EXPERTISM +EXPERTISMS +EXPERTIZE +EXPERTIZED +EXPERTIZES +EXPERTIZING +EXPERTLY +EXPERTNESS +EXPERTNESSES +EXPERTS +EXPIABLE +EXPIATE +EXPIATED +EXPIATES +EXPIATING +EXPIATION +EXPIATIONS +EXPIATOR +EXPIATORS +EXPIATORY +EXPIRATION +EXPIRATIONS +EXPIRATORY +EXPIRE +EXPIRED +EXPIRER +EXPIRERS +EXPIRES +EXPIRIES +EXPIRING +EXPIRY +EXPLAIN +EXPLAINABLE +EXPLAINED +EXPLAINER +EXPLAINERS +EXPLAINING +EXPLAINS +EXPLANATION +EXPLANATIONS +EXPLANATIVE +EXPLANATIVELY +EXPLANATORILY +EXPLANATORY +EXPLANT +EXPLANTATION +EXPLANTATIONS +EXPLANTED +EXPLANTING +EXPLANTS +EXPLETIVE +EXPLETIVES +EXPLETORY +EXPLICABLE +EXPLICABLY +EXPLICATE +EXPLICATED +EXPLICATES +EXPLICATING +EXPLICATION +EXPLICATIONS +EXPLICATIVE +EXPLICATIVELY +EXPLICATOR +EXPLICATORS +EXPLICATORY +EXPLICIT +EXPLICITLY +EXPLICITNESS +EXPLICITNESSES +EXPLICITS +EXPLODE +EXPLODED +EXPLODER +EXPLODERS +EXPLODES +EXPLODING +EXPLOIT +EXPLOITABLE +EXPLOITATION +EXPLOITATIONS +EXPLOITATIVE +EXPLOITATIVELY +EXPLOITED +EXPLOITER +EXPLOITERS +EXPLOITING +EXPLOITIVE +EXPLOITS +EXPLORATION +EXPLORATIONAL +EXPLORATIONS +EXPLORATIVE +EXPLORATIVELY +EXPLORATORY +EXPLORE +EXPLORED +EXPLORER +EXPLORERS +EXPLORES +EXPLORING +EXPLOSION +EXPLOSIONS +EXPLOSIVE +EXPLOSIVELY +EXPLOSIVENESS +EXPLOSIVENESSES +EXPLOSIVES +EXPO +EXPONENT +EXPONENTIAL +EXPONENTIALLY +EXPONENTIALS +EXPONENTIATION +EXPONENTIATIONS +EXPONENTS +EXPORT +EXPORTABILITIES +EXPORTABILITY +EXPORTABLE +EXPORTATION +EXPORTATIONS +EXPORTED +EXPORTER +EXPORTERS +EXPORTING +EXPORTS +EXPOS +EXPOSABLE +EXPOSAL +EXPOSALS +EXPOSE +EXPOSED +EXPOSER +EXPOSERS +EXPOSES +EXPOSING +EXPOSIT +EXPOSITED +EXPOSITING +EXPOSITION +EXPOSITIONAL +EXPOSITIONS +EXPOSITIVE +EXPOSITOR +EXPOSITORS +EXPOSITORY +EXPOSITS +EXPOSTULATE +EXPOSTULATED +EXPOSTULATES +EXPOSTULATING +EXPOSTULATION +EXPOSTULATIONS +EXPOSTULATORY +EXPOSURE +EXPOSURES +EXPOUND +EXPOUNDED +EXPOUNDER +EXPOUNDERS +EXPOUNDING +EXPOUNDS +EXPRESS +EXPRESSAGE +EXPRESSAGES +EXPRESSED +EXPRESSER +EXPRESSERS +EXPRESSES +EXPRESSIBLE +EXPRESSING +EXPRESSION +EXPRESSIONAL +EXPRESSIONISM +EXPRESSIONISMS +EXPRESSIONIST +EXPRESSIONISTIC +EXPRESSIONISTS +EXPRESSIONLESS +EXPRESSIONS +EXPRESSIVE +EXPRESSIVELY +EXPRESSIVENESS +EXPRESSIVITIES +EXPRESSIVITY +EXPRESSLY +EXPRESSMAN +EXPRESSMEN +EXPRESSO +EXPRESSOS +EXPRESSWAY +EXPRESSWAYS +EXPROPRIATE +EXPROPRIATED +EXPROPRIATES +EXPROPRIATING +EXPROPRIATION +EXPROPRIATIONS +EXPROPRIATOR +EXPROPRIATORS +EXPULSE +EXPULSED +EXPULSES +EXPULSING +EXPULSION +EXPULSIONS +EXPULSIVE +EXPUNCTION +EXPUNCTIONS +EXPUNGE +EXPUNGED +EXPUNGER +EXPUNGERS +EXPUNGES +EXPUNGING +EXPURGATE +EXPURGATED +EXPURGATES +EXPURGATING +EXPURGATION +EXPURGATIONS +EXPURGATOR +EXPURGATORIAL +EXPURGATORS +EXPURGATORY +EXQUISITE +EXQUISITELY +EXQUISITENESS +EXQUISITENESSES +EXQUISITES +EXSANGUINATE +EXSANGUINATED +EXSANGUINATES +EXSANGUINATING +EXSANGUINATION +EXSANGUINATIONS +EXSCIND +EXSCINDED +EXSCINDING +EXSCINDS +EXSECANT +EXSECANTS +EXSECT +EXSECTED +EXSECTING +EXSECTION +EXSECTIONS +EXSECTS +EXSERT +EXSERTED +EXSERTILE +EXSERTING +EXSERTION +EXSERTIONS +EXSERTS +EXSICCATE +EXSICCATED +EXSICCATES +EXSICCATING +EXSICCATION +EXSICCATIONS +EXSOLUTION +EXSOLUTIONS +EXSTROPHIES +EXSTROPHY +EXTANT +EXTEMPORAL +EXTEMPORALLY +EXTEMPORANEITY +EXTEMPORANEOUS +EXTEMPORARILY +EXTEMPORARY +EXTEMPORE +EXTEMPORISATION +EXTEMPORISE +EXTEMPORISED +EXTEMPORISES +EXTEMPORISING +EXTEMPORIZATION +EXTEMPORIZE +EXTEMPORIZED +EXTEMPORIZER +EXTEMPORIZERS +EXTEMPORIZES +EXTEMPORIZING +EXTEND +EXTENDABILITIES +EXTENDABILITY +EXTENDABLE +EXTENDED +EXTENDEDLY +EXTENDEDNESS +EXTENDEDNESSES +EXTENDER +EXTENDERS +EXTENDIBLE +EXTENDING +EXTENDS +EXTENSIBILITIES +EXTENSIBILITY +EXTENSIBLE +EXTENSILE +EXTENSION +EXTENSIONAL +EXTENSIONALITY +EXTENSIONALLY +EXTENSIONS +EXTENSITIES +EXTENSITY +EXTENSIVE +EXTENSIVELY +EXTENSIVENESS +EXTENSIVENESSES +EXTENSOMETER +EXTENSOMETERS +EXTENSOR +EXTENSORS +EXTENT +EXTENTS +EXTENUATE +EXTENUATED +EXTENUATES +EXTENUATING +EXTENUATION +EXTENUATIONS +EXTENUATOR +EXTENUATORS +EXTENUATORY +EXTERIOR +EXTERIORISE +EXTERIORISED +EXTERIORISES +EXTERIORISING +EXTERIORITIES +EXTERIORITY +EXTERIORIZATION +EXTERIORIZE +EXTERIORIZED +EXTERIORIZES +EXTERIORIZING +EXTERIORLY +EXTERIORS +EXTERMINATE +EXTERMINATED +EXTERMINATES +EXTERMINATING +EXTERMINATION +EXTERMINATIONS +EXTERMINATOR +EXTERMINATORS +EXTERMINATORY +EXTERMINE +EXTERMINED +EXTERMINES +EXTERMINING +EXTERN +EXTERNAL +EXTERNALISATION +EXTERNALISE +EXTERNALISED +EXTERNALISES +EXTERNALISING +EXTERNALISM +EXTERNALISMS +EXTERNALITIES +EXTERNALITY +EXTERNALIZATION +EXTERNALIZE +EXTERNALIZED +EXTERNALIZES +EXTERNALIZING +EXTERNALLY +EXTERNALS +EXTERNE +EXTERNES +EXTERNS +EXTERNSHIP +EXTERNSHIPS +EXTEROCEPTIVE +EXTEROCEPTOR +EXTEROCEPTORS +EXTERRITORIAL +EXTINCT +EXTINCTED +EXTINCTING +EXTINCTION +EXTINCTIONS +EXTINCTIVE +EXTINCTS +EXTINGUISH +EXTINGUISHABLE +EXTINGUISHED +EXTINGUISHER +EXTINGUISHERS +EXTINGUISHES +EXTINGUISHING +EXTINGUISHMENT +EXTINGUISHMENTS +EXTIRPATE +EXTIRPATED +EXTIRPATES +EXTIRPATING +EXTIRPATION +EXTIRPATIONS +EXTIRPATOR +EXTIRPATORS +EXTOL +EXTOLL +EXTOLLED +EXTOLLER +EXTOLLERS +EXTOLLING +EXTOLLS +EXTOLMENT +EXTOLMENTS +EXTOLS +EXTORT +EXTORTED +EXTORTER +EXTORTERS +EXTORTING +EXTORTION +EXTORTIONARY +EXTORTIONATE +EXTORTIONATELY +EXTORTIONER +EXTORTIONERS +EXTORTIONIST +EXTORTIONISTS +EXTORTIONS +EXTORTIVE +EXTORTS +EXTRA +EXTRABOLD +EXTRABOLDS +EXTRACELLULAR +EXTRACELLULARLY +EXTRACORPOREAL +EXTRACRANIAL +EXTRACT +EXTRACTABILITY +EXTRACTABLE +EXTRACTED +EXTRACTING +EXTRACTION +EXTRACTIONS +EXTRACTIVE +EXTRACTIVELY +EXTRACTIVES +EXTRACTOR +EXTRACTORS +EXTRACTS +EXTRACURRICULAR +EXTRADITABLE +EXTRADITE +EXTRADITED +EXTRADITES +EXTRADITING +EXTRADITION +EXTRADITIONS +EXTRADOS +EXTRADOSES +EXTRAEMBRYONIC +EXTRAGALACTIC +EXTRAHEPATIC +EXTRAJUDICIAL +EXTRAJUDICIALLY +EXTRALEGAL +EXTRALEGALLY +EXTRALIMITAL +EXTRALINGUISTIC +EXTRALITERARY +EXTRALITIES +EXTRALITY +EXTRALOGICAL +EXTRAMARITAL +EXTRAMUNDANE +EXTRAMURAL +EXTRAMURALLY +EXTRAMUSICAL +EXTRANEOUS +EXTRANEOUSLY +EXTRANEOUSNESS +EXTRANET +EXTRANETS +EXTRANUCLEAR +EXTRAORDINAIRE +EXTRAORDINARILY +EXTRAORDINARY +EXTRAPOLATE +EXTRAPOLATED +EXTRAPOLATES +EXTRAPOLATING +EXTRAPOLATION +EXTRAPOLATIONS +EXTRAPOLATIVE +EXTRAPOLATOR +EXTRAPOLATORS +EXTRAPYRAMIDAL +EXTRAS +EXTRASENSORY +EXTRASYSTOLE +EXTRASYSTOLES +EXTRATEXTUAL +EXTRAUTERINE +EXTRAVAGANCE +EXTRAVAGANCES +EXTRAVAGANCIES +EXTRAVAGANCY +EXTRAVAGANT +EXTRAVAGANTLY +EXTRAVAGANZA +EXTRAVAGANZAS +EXTRAVAGATE +EXTRAVAGATED +EXTRAVAGATES +EXTRAVAGATING +EXTRAVASATE +EXTRAVASATED +EXTRAVASATES +EXTRAVASATING +EXTRAVASATION +EXTRAVASATIONS +EXTRAVASCULAR +EXTRAVEHICULAR +EXTRAVERSION +EXTRAVERSIONS +EXTRAVERT +EXTRAVERTED +EXTRAVERTS +EXTREMA +EXTREME +EXTREMELY +EXTREMENESS +EXTREMENESSES +EXTREMER +EXTREMES +EXTREMEST +EXTREMISM +EXTREMISMS +EXTREMIST +EXTREMISTS +EXTREMITIES +EXTREMITY +EXTREMUM +EXTRICABLE +EXTRICATE +EXTRICATED +EXTRICATES +EXTRICATING +EXTRICATION +EXTRICATIONS +EXTRINSIC +EXTRINSICALLY +EXTRORSE +EXTROVERSION +EXTROVERSIONS +EXTROVERT +EXTROVERTED +EXTROVERTS +EXTRUDABILITIES +EXTRUDABILITY +EXTRUDABLE +EXTRUDE +EXTRUDED +EXTRUDER +EXTRUDERS +EXTRUDES +EXTRUDING +EXTRUSION +EXTRUSIONS +EXTRUSIVE +EXTUBATE +EXTUBATED +EXTUBATES +EXTUBATING +EXUBERANCE +EXUBERANCES +EXUBERANT +EXUBERANTLY +EXUBERATE +EXUBERATED +EXUBERATES +EXUBERATING +EXUDATE +EXUDATES +EXUDATION +EXUDATIONS +EXUDATIVE +EXUDE +EXUDED +EXUDES +EXUDING +EXULT +EXULTANCE +EXULTANCES +EXULTANCIES +EXULTANCY +EXULTANT +EXULTANTLY +EXULTATION +EXULTATIONS +EXULTED +EXULTING +EXULTINGLY +EXULTS +EXURB +EXURBAN +EXURBANITE +EXURBANITES +EXURBIA +EXURBIAS +EXURBS +EXUVIA +EXUVIAE +EXUVIAL +EXUVIATE +EXUVIATED +EXUVIATES +EXUVIATING +EXUVIATION +EXUVIATIONS +EXUVIUM +EYAS +EYASES +EYASS +EYASSES +EYE +EYEABLE +EYEBALL +EYEBALLED +EYEBALLING +EYEBALLS +EYEBAR +EYEBARS +EYEBEAM +EYEBEAMS +EYEBLACK +EYEBLACKS +EYEBLINK +EYEBLINKS +EYEBOLT +EYEBOLTS +EYEBRIGHT +EYEBRIGHTS +EYEBROW +EYEBROWS +EYECUP +EYECUPS +EYED +EYEDNESS +EYEDNESSES +EYEDROPPER +EYEDROPPERS +EYEDROPS +EYEFOLD +EYEFOLDS +EYEFUL +EYEFULS +EYEGLASS +EYEGLASSES +EYEHOLE +EYEHOLES +EYEHOOK +EYEHOOKS +EYEING +EYELASH +EYELASHES +EYELESS +EYELET +EYELETS +EYELETTED +EYELETTING +EYELID +EYELIDS +EYELIFT +EYELIFTS +EYELIKE +EYELINER +EYELINERS +EYEN +EYEOPENER +EYEOPENERS +EYEPIECE +EYEPIECES +EYEPOINT +EYEPOINTS +EYEPOPPER +EYEPOPPERS +EYER +EYERS +EYES +EYESHADE +EYESHADES +EYESHINE +EYESHINES +EYESHOT +EYESHOTS +EYESIGHT +EYESIGHTS +EYESOME +EYESORE +EYESORES +EYESPOT +EYESPOTS +EYESTALK +EYESTALKS +EYESTONE +EYESTONES +EYESTRAIN +EYESTRAINS +EYESTRINGS +EYETEETH +EYETOOTH +EYEWASH +EYEWASHES +EYEWATER +EYEWATERS +EYEWEAR +EYEWINK +EYEWINKS +EYEWITNESS +EYEWITNESSES +EYING +EYNE +EYRA +EYRAS +EYRE +EYRES +EYRIE +EYRIES +EYRIR +EYRY +FA +FAB +FABACEOUS +FABBER +FABBEST +FABLE +FABLED +FABLER +FABLERS +FABLES +FABLIAU +FABLIAUX +FABLING +FABRIC +FABRICANT +FABRICANTS +FABRICATE +FABRICATED +FABRICATES +FABRICATING +FABRICATION +FABRICATIONS +FABRICATOR +FABRICATORS +FABRICS +FABS +FABULAR +FABULATE +FABULATED +FABULATES +FABULATING +FABULATOR +FABULATORS +FABULIST +FABULISTIC +FABULISTS +FABULOUS +FABULOUSLY +FABULOUSNESS +FABULOUSNESSES +FACADE +FACADES +FACE +FACEABLE +FACECLOTH +FACECLOTHS +FACED +FACEDOWN +FACEDOWNS +FACELESS +FACELESSNESS +FACELESSNESSES +FACELIFT +FACELIFTED +FACELIFTING +FACELIFTS +FACEMASK +FACEMASKS +FACEPLATE +FACEPLATES +FACER +FACERS +FACES +FACET +FACETE +FACETED +FACETELY +FACETIAE +FACETING +FACETIOUS +FACETIOUSLY +FACETIOUSNESS +FACETIOUSNESSES +FACETS +FACETTED +FACETTING +FACEUP +FACIA +FACIAE +FACIAL +FACIALLY +FACIALS +FACIAS +FACIEND +FACIENDS +FACIES +FACILE +FACILELY +FACILENESS +FACILENESSES +FACILITATE +FACILITATED +FACILITATES +FACILITATING +FACILITATION +FACILITATIONS +FACILITATIVE +FACILITATOR +FACILITATORS +FACILITATORY +FACILITIES +FACILITY +FACING +FACINGS +FACSIMILE +FACSIMILED +FACSIMILEING +FACSIMILES +FACT +FACTFUL +FACTICITIES +FACTICITY +FACTION +FACTIONAL +FACTIONALISM +FACTIONALISMS +FACTIONALLY +FACTIONS +FACTIOUS +FACTIOUSLY +FACTIOUSNESS +FACTIOUSNESSES +FACTITIOUS +FACTITIOUSLY +FACTITIOUSNESS +FACTITIVE +FACTITIVELY +FACTOID +FACTOIDAL +FACTOIDS +FACTOR +FACTORABLE +FACTORAGE +FACTORAGES +FACTORED +FACTORIAL +FACTORIALS +FACTORIES +FACTORING +FACTORIZATION +FACTORIZATIONS +FACTORIZE +FACTORIZED +FACTORIZES +FACTORIZING +FACTORS +FACTORSHIP +FACTORSHIPS +FACTORY +FACTORYLIKE +FACTOTUM +FACTOTUMS +FACTS +FACTUAL +FACTUALISM +FACTUALISMS +FACTUALIST +FACTUALISTS +FACTUALITIES +FACTUALITY +FACTUALLY +FACTUALNESS +FACTUALNESSES +FACTURE +FACTURES +FACULA +FACULAE +FACULAR +FACULTATIVE +FACULTATIVELY +FACULTIES +FACULTY +FAD +FADABLE +FADDIER +FADDIEST +FADDISH +FADDISHLY +FADDISHNESS +FADDISHNESSES +FADDISM +FADDISMS +FADDIST +FADDISTS +FADDY +FADE +FADEAWAY +FADEAWAYS +FADED +FADEDLY +FADEDNESS +FADEDNESSES +FADEIN +FADEINS +FADELESS +FADEOUT +FADEOUTS +FADER +FADERS +FADES +FADGE +FADGED +FADGES +FADGING +FADING +FADINGS +FADLIKE +FADO +FADOS +FADS +FAECAL +FAECES +FAENA +FAENAS +FAERIE +FAERIES +FAERY +FAG +FAGGED +FAGGIER +FAGGIEST +FAGGING +FAGGOT +FAGGOTED +FAGGOTING +FAGGOTINGS +FAGGOTRIES +FAGGOTRY +FAGGOTS +FAGGOTY +FAGGY +FAGIN +FAGINS +FAGOT +FAGOTED +FAGOTER +FAGOTERS +FAGOTING +FAGOTINGS +FAGOTS +FAGS +FAHLBAND +FAHLBANDS +FAIENCE +FAIENCES +FAIL +FAILED +FAILING +FAILINGLY +FAILINGS +FAILLE +FAILLES +FAILS +FAILURE +FAILURES +FAIN +FAINEANCE +FAINEANCES +FAINEANT +FAINEANTS +FAINER +FAINEST +FAINT +FAINTED +FAINTER +FAINTERS +FAINTEST +FAINTHEARTED +FAINTHEARTEDLY +FAINTING +FAINTISH +FAINTISHNESS +FAINTISHNESSES +FAINTLY +FAINTNESS +FAINTNESSES +FAINTS +FAIR +FAIRED +FAIRER +FAIREST +FAIRGOER +FAIRGOERS +FAIRGROUND +FAIRGROUNDS +FAIRIES +FAIRING +FAIRINGS +FAIRISH +FAIRISHLY +FAIRLEAD +FAIRLEADER +FAIRLEADERS +FAIRLEADS +FAIRLY +FAIRNESS +FAIRNESSES +FAIRS +FAIRWAY +FAIRWAYS +FAIRY +FAIRYHOOD +FAIRYHOODS +FAIRYISM +FAIRYISMS +FAIRYLAND +FAIRYLANDS +FAIRYLIKE +FAITH +FAITHED +FAITHFUL +FAITHFULLY +FAITHFULNESS +FAITHFULNESSES +FAITHFULS +FAITHING +FAITHLESS +FAITHLESSLY +FAITHLESSNESS +FAITHLESSNESSES +FAITHS +FAITOUR +FAITOURS +FAJITA +FAJITAS +FAKE +FAKED +FAKEER +FAKEERS +FAKER +FAKERIES +FAKERS +FAKERY +FAKES +FAKEY +FAKING +FAKIR +FAKIRS +FALAFEL +FALAFELS +FALBALA +FALBALAS +FALCATE +FALCATED +FALCES +FALCHION +FALCHIONS +FALCIFORM +FALCON +FALCONER +FALCONERS +FALCONET +FALCONETS +FALCONINE +FALCONOID +FALCONRIES +FALCONRY +FALCONS +FALDERAL +FALDERALS +FALDEROL +FALDEROLS +FALDSTOOL +FALDSTOOLS +FALL +FALLACIES +FALLACIOUS +FALLACIOUSLY +FALLACIOUSNESS +FALLACY +FALLAL +FALLALERIES +FALLALERY +FALLALS +FALLAWAY +FALLAWAYS +FALLBACK +FALLBACKS +FALLBOARD +FALLBOARDS +FALLEN +FALLER +FALLERS +FALLFISH +FALLFISHES +FALLIBILITIES +FALLIBILITY +FALLIBLE +FALLIBLY +FALLING +FALLOFF +FALLOFFS +FALLOUT +FALLOUTS +FALLOW +FALLOWED +FALLOWING +FALLOWNESS +FALLOWNESSES +FALLOWS +FALLS +FALSE +FALSEFACE +FALSEFACES +FALSEHOOD +FALSEHOODS +FALSELY +FALSENESS +FALSENESSES +FALSER +FALSEST +FALSETTO +FALSETTOS +FALSEWORK +FALSEWORKS +FALSIE +FALSIES +FALSIFIABILITY +FALSIFIABLE +FALSIFICATION +FALSIFICATIONS +FALSIFIED +FALSIFIER +FALSIFIERS +FALSIFIES +FALSIFY +FALSIFYING +FALSITIES +FALSITY +FALTBOAT +FALTBOATS +FALTER +FALTERED +FALTERER +FALTERERS +FALTERING +FALTERINGLY +FALTERS +FALX +FAME +FAMED +FAMELESS +FAMES +FAMILIAL +FAMILIAR +FAMILIARISE +FAMILIARISED +FAMILIARISES +FAMILIARISING +FAMILIARITIES +FAMILIARITY +FAMILIARIZATION +FAMILIARIZE +FAMILIARIZED +FAMILIARIZES +FAMILIARIZING +FAMILIARLY +FAMILIARNESS +FAMILIARNESSES +FAMILIARS +FAMILIES +FAMILISM +FAMILISMS +FAMILISTIC +FAMILY +FAMINE +FAMINES +FAMING +FAMISH +FAMISHED +FAMISHES +FAMISHING +FAMISHMENT +FAMISHMENTS +FAMOUS +FAMOUSLY +FAMOUSNESS +FAMOUSNESSES +FAMULI +FAMULUS +FAN +FANATIC +FANATICAL +FANATICALLY +FANATICALNESS +FANATICALNESSES +FANATICISM +FANATICISMS +FANATICIZE +FANATICIZED +FANATICIZES +FANATICIZING +FANATICS +FANCIED +FANCIER +FANCIERS +FANCIES +FANCIEST +FANCIFIED +FANCIFIES +FANCIFUL +FANCIFULLY +FANCIFULNESS +FANCIFULNESSES +FANCIFY +FANCIFYING +FANCILESS +FANCILY +FANCINESS +FANCINESSES +FANCY +FANCYING +FANCYWORK +FANCYWORKS +FANDANGO +FANDANGOS +FANDOM +FANDOMS +FANE +FANEGA +FANEGADA +FANEGADAS +FANEGAS +FANES +FANFARE +FANFARES +FANFARON +FANFARONADE +FANFARONADES +FANFARONS +FANFIC +FANFICS +FANFOLD +FANFOLDED +FANFOLDING +FANFOLDS +FANG +FANGA +FANGAS +FANGED +FANGLESS +FANGLIKE +FANGS +FANION +FANIONS +FANJET +FANJETS +FANLIGHT +FANLIGHTS +FANLIKE +FANNED +FANNER +FANNERS +FANNIES +FANNING +FANNY +FANO +FANON +FANONS +FANOS +FANS +FANTABULOUS +FANTAIL +FANTAILED +FANTAILS +FANTASIA +FANTASIAS +FANTASIE +FANTASIED +FANTASIES +FANTASISE +FANTASISED +FANTASISES +FANTASISING +FANTASIST +FANTASISTS +FANTASIZE +FANTASIZED +FANTASIZER +FANTASIZERS +FANTASIZES +FANTASIZING +FANTASM +FANTASMS +FANTAST +FANTASTIC +FANTASTICAL +FANTASTICALITY +FANTASTICALLY +FANTASTICALNESS +FANTASTICATE +FANTASTICATED +FANTASTICATES +FANTASTICATING +FANTASTICATION +FANTASTICATIONS +FANTASTICO +FANTASTICOES +FANTASTICS +FANTASTS +FANTASY +FANTASYING +FANTASYLAND +FANTASYLANDS +FANTOCCINI +FANTOD +FANTODS +FANTOM +FANTOMS +FANUM +FANUMS +FANWISE +FANWORT +FANWORTS +FANZINE +FANZINES +FAQIR +FAQIRS +FAQUIR +FAQUIRS +FAR +FARAD +FARADAIC +FARADAY +FARADAYS +FARADIC +FARADISE +FARADISED +FARADISES +FARADISING +FARADISM +FARADISMS +FARADIZE +FARADIZED +FARADIZER +FARADIZERS +FARADIZES +FARADIZING +FARADS +FARANDOLE +FARANDOLES +FARAWAY +FARCE +FARCED +FARCER +FARCERS +FARCES +FARCEUR +FARCEURS +FARCI +FARCICAL +FARCICALITIES +FARCICALITY +FARCICALLY +FARCIE +FARCIES +FARCING +FARCY +FARD +FARDED +FARDEL +FARDELS +FARDING +FARDS +FARE +FAREBOX +FAREBOXES +FARED +FARER +FARERS +FARES +FAREWELL +FAREWELLED +FAREWELLING +FAREWELLS +FARFAL +FARFALLE +FARFALS +FARFEL +FARFELS +FARFETCHEDNESS +FARINA +FARINACEOUS +FARINAS +FARING +FARINHA +FARINHAS +FARINOSE +FARKLEBERRIES +FARKLEBERRY +FARL +FARLE +FARLES +FARLS +FARM +FARMABLE +FARMED +FARMER +FARMERETTE +FARMERETTES +FARMERS +FARMHAND +FARMHANDS +FARMHOUSE +FARMHOUSES +FARMING +FARMINGS +FARMLAND +FARMLANDS +FARMS +FARMSTEAD +FARMSTEADS +FARMWIFE +FARMWIVES +FARMWORK +FARMWORKER +FARMWORKERS +FARMWORKS +FARMYARD +FARMYARDS +FARNESOL +FARNESOLS +FARNESS +FARNESSES +FARO +FAROLITO +FAROLITOS +FAROS +FAROUCHE +FARRAGINOUS +FARRAGO +FARRAGOES +FARRIER +FARRIERIES +FARRIERS +FARRIERY +FARROW +FARROWED +FARROWING +FARROWS +FARSEEING +FARSIDE +FARSIDES +FARSIGHTED +FARSIGHTEDLY +FARSIGHTEDNESS +FART +FARTED +FARTHER +FARTHERMOST +FARTHEST +FARTHING +FARTHINGALE +FARTHINGALES +FARTHINGS +FARTING +FARTLEK +FARTLEKS +FARTS +FAS +FASCES +FASCIA +FASCIAE +FASCIAL +FASCIAS +FASCIATE +FASCIATED +FASCIATION +FASCIATIONS +FASCICLE +FASCICLED +FASCICLES +FASCICULAR +FASCICULARLY +FASCICULATE +FASCICULATED +FASCICULATION +FASCICULATIONS +FASCICULE +FASCICULES +FASCICULI +FASCICULUS +FASCIITIS +FASCIITISES +FASCINATE +FASCINATED +FASCINATES +FASCINATING +FASCINATINGLY +FASCINATION +FASCINATIONS +FASCINATOR +FASCINATORS +FASCINE +FASCINES +FASCIOLIASES +FASCIOLIASIS +FASCISM +FASCISMS +FASCIST +FASCISTIC +FASCISTICALLY +FASCISTS +FASCITIS +FASCITISES +FASH +FASHED +FASHES +FASHING +FASHION +FASHIONABILITY +FASHIONABLE +FASHIONABLENESS +FASHIONABLES +FASHIONABLY +FASHIONED +FASHIONER +FASHIONERS +FASHIONING +FASHIONISTA +FASHIONISTAS +FASHIONMONGER +FASHIONMONGERS +FASHIONS +FASHIOUS +FAST +FASTBACK +FASTBACKS +FASTBALL +FASTBALLER +FASTBALLERS +FASTBALLS +FASTED +FASTEN +FASTENED +FASTENER +FASTENERS +FASTENING +FASTENINGS +FASTENS +FASTER +FASTEST +FASTIDIOUS +FASTIDIOUSLY +FASTIDIOUSNESS +FASTIGIATE +FASTIGIUM +FASTIGIUMS +FASTING +FASTINGS +FASTNESS +FASTNESSES +FASTS +FASTUOUS +FAT +FATAL +FATALISM +FATALISMS +FATALIST +FATALISTIC +FATALISTICALLY +FATALISTS +FATALITIES +FATALITY +FATALLY +FATALNESS +FATALNESSES +FATBACK +FATBACKS +FATBIRD +FATBIRDS +FATE +FATED +FATEFUL +FATEFULLY +FATEFULNESS +FATEFULNESSES +FATES +FATHEAD +FATHEADED +FATHEADEDLY +FATHEADEDNESS +FATHEADEDNESSES +FATHEADS +FATHER +FATHERED +FATHERHOOD +FATHERHOODS +FATHERING +FATHERLAND +FATHERLANDS +FATHERLESS +FATHERLIKE +FATHERLINESS +FATHERLINESSES +FATHERLY +FATHERS +FATHOM +FATHOMABLE +FATHOMED +FATHOMER +FATHOMERS +FATHOMING +FATHOMLESS +FATHOMLESSLY +FATHOMLESSNESS +FATHOMS +FATIDIC +FATIDICAL +FATIGABILITIES +FATIGABILITY +FATIGABLE +FATIGUE +FATIGUED +FATIGUES +FATIGUING +FATIGUINGLY +FATING +FATLESS +FATLIKE +FATLING +FATLINGS +FATLY +FATNESS +FATNESSES +FATS +FATSHEDERA +FATSHEDERAS +FATSO +FATSOES +FATSOS +FATSTOCK +FATSTOCKS +FATTED +FATTEN +FATTENED +FATTENER +FATTENERS +FATTENING +FATTENS +FATTER +FATTEST +FATTIER +FATTIES +FATTIEST +FATTILY +FATTINESS +FATTINESSES +FATTING +FATTISH +FATTY +FATUITIES +FATUITY +FATUOUS +FATUOUSLY +FATUOUSNESS +FATUOUSNESSES +FATWA +FATWAS +FATWOOD +FATWOODS +FAUBOURG +FAUBOURGS +FAUCAL +FAUCALS +FAUCES +FAUCET +FAUCETS +FAUCIAL +FAUGH +FAULD +FAULDS +FAULT +FAULTED +FAULTFINDER +FAULTFINDERS +FAULTFINDING +FAULTFINDINGS +FAULTIER +FAULTIEST +FAULTILY +FAULTINESS +FAULTINESSES +FAULTING +FAULTLESS +FAULTLESSLY +FAULTLESSNESS +FAULTLESSNESSES +FAULTS +FAULTY +FAUN +FAUNA +FAUNAE +FAUNAL +FAUNALLY +FAUNAS +FAUNISTIC +FAUNISTICALLY +FAUNLIKE +FAUNS +FAUTEUIL +FAUTEUILS +FAUVE +FAUVES +FAUVISM +FAUVISMS +FAUVIST +FAUVISTS +FAUX +FAVA +FAVAS +FAVE +FAVELA +FAVELAS +FAVELLA +FAVELLAS +FAVEOLATE +FAVES +FAVISM +FAVISMS +FAVONIAN +FAVOR +FAVORABLE +FAVORABLENESS +FAVORABLENESSES +FAVORABLY +FAVORED +FAVORER +FAVORERS +FAVORING +FAVORITE +FAVORITES +FAVORITISM +FAVORITISMS +FAVORS +FAVOUR +FAVOURED +FAVOURER +FAVOURERS +FAVOURING +FAVOURS +FAVUS +FAVUSES +FAWN +FAWNED +FAWNER +FAWNERS +FAWNIER +FAWNIEST +FAWNING +FAWNINGLY +FAWNLIKE +FAWNS +FAWNY +FAX +FAXED +FAXES +FAXING +FAY +FAYALITE +FAYALITES +FAYED +FAYING +FAYS +FAZE +FAZED +FAZENDA +FAZENDAS +FAZES +FAZING +FE +FEAL +FEALTIES +FEALTY +FEAR +FEARED +FEARER +FEARERS +FEARFUL +FEARFULLER +FEARFULLEST +FEARFULLY +FEARFULNESS +FEARFULNESSES +FEARING +FEARLESS +FEARLESSLY +FEARLESSNESS +FEARLESSNESSES +FEARS +FEARSOME +FEARSOMELY +FEARSOMENESS +FEARSOMENESSES +FEASANCE +FEASANCES +FEASE +FEASED +FEASES +FEASIBILITIES +FEASIBILITY +FEASIBLE +FEASIBLY +FEASING +FEAST +FEASTED +FEASTER +FEASTERS +FEASTFUL +FEASTING +FEASTLESS +FEASTS +FEAT +FEATER +FEATEST +FEATHER +FEATHERBED +FEATHERBEDDED +FEATHERBEDDING +FEATHERBEDDINGS +FEATHERBEDS +FEATHERBRAIN +FEATHERBRAINED +FEATHERBRAINS +FEATHERED +FEATHEREDGE +FEATHEREDGED +FEATHEREDGES +FEATHEREDGING +FEATHERHEAD +FEATHERHEADED +FEATHERHEADS +FEATHERIER +FEATHERIEST +FEATHERING +FEATHERINGS +FEATHERLESS +FEATHERLIGHT +FEATHERS +FEATHERSTITCH +FEATHERSTITCHED +FEATHERSTITCHES +FEATHERWEIGHT +FEATHERWEIGHTS +FEATHERY +FEATLIER +FEATLIEST +FEATLY +FEATS +FEATURE +FEATURED +FEATURELESS +FEATURES +FEATURETTE +FEATURETTES +FEATURING +FEAZE +FEAZED +FEAZES +FEAZING +FEBRICITIES +FEBRICITY +FEBRIFIC +FEBRIFUGE +FEBRIFUGES +FEBRILE +FEBRILITIES +FEBRILITY +FECAL +FECES +FECIAL +FECIALS +FECK +FECKLESS +FECKLESSLY +FECKLESSNESS +FECKLESSNESSES +FECKLY +FECKS +FECULA +FECULAE +FECULENCE +FECULENCES +FECULENT +FECUND +FECUNDATE +FECUNDATED +FECUNDATES +FECUNDATING +FECUNDATION +FECUNDATIONS +FECUNDITIES +FECUNDITY +FED +FEDAYEE +FEDAYEEN +FEDERACIES +FEDERACY +FEDERAL +FEDERALESE +FEDERALESES +FEDERALISM +FEDERALISMS +FEDERALIST +FEDERALISTS +FEDERALIZATION +FEDERALIZATIONS +FEDERALIZE +FEDERALIZED +FEDERALIZES +FEDERALIZING +FEDERALLY +FEDERALS +FEDERATE +FEDERATED +FEDERATES +FEDERATING +FEDERATION +FEDERATIONS +FEDERATIVE +FEDERATIVELY +FEDERATOR +FEDERATORS +FEDEX +FEDEXED +FEDEXES +FEDEXING +FEDORA +FEDORAS +FEDS +FEE +FEEB +FEEBLE +FEEBLEMINDED +FEEBLEMINDEDLY +FEEBLENESS +FEEBLENESSES +FEEBLER +FEEBLEST +FEEBLISH +FEEBLY +FEEBS +FEED +FEEDABLE +FEEDBACK +FEEDBACKS +FEEDBAG +FEEDBAGS +FEEDBOX +FEEDBOXES +FEEDER +FEEDERS +FEEDGRAIN +FEEDGRAINS +FEEDHOLE +FEEDHOLES +FEEDING +FEEDLOT +FEEDLOTS +FEEDS +FEEDSTOCK +FEEDSTOCKS +FEEDSTUFF +FEEDSTUFFS +FEEDYARD +FEEDYARDS +FEEING +FEEL +FEELER +FEELERS +FEELESS +FEELING +FEELINGLY +FEELINGNESS +FEELINGNESSES +FEELINGS +FEELS +FEES +FEET +FEETFIRST +FEETLESS +FEEZE +FEEZED +FEEZES +FEEZING +FEH +FEHS +FEIGN +FEIGNED +FEIGNEDLY +FEIGNER +FEIGNERS +FEIGNING +FEIGNS +FEIJOA +FEIJOAS +FEINT +FEINTED +FEINTING +FEINTS +FEIRIE +FEIST +FEISTIER +FEISTIEST +FEISTILY +FEISTINESS +FEISTINESSES +FEISTS +FEISTY +FELAFEL +FELAFELS +FELDSCHER +FELDSCHERS +FELDSHER +FELDSHERS +FELDSPAR +FELDSPARS +FELDSPATHIC +FELICIFIC +FELICITATE +FELICITATED +FELICITATES +FELICITATING +FELICITATION +FELICITATIONS +FELICITATOR +FELICITATORS +FELICITIES +FELICITOUS +FELICITOUSLY +FELICITOUSNESS +FELICITY +FELID +FELIDS +FELINE +FELINELY +FELINES +FELINITIES +FELINITY +FELL +FELLA +FELLABLE +FELLAH +FELLAHEEN +FELLAHIN +FELLAHS +FELLAS +FELLATE +FELLATED +FELLATES +FELLATING +FELLATIO +FELLATION +FELLATIONS +FELLATIOS +FELLATOR +FELLATORS +FELLATRICES +FELLATRIX +FELLATRIXES +FELLED +FELLER +FELLERS +FELLEST +FELLIES +FELLING +FELLMONGER +FELLMONGERED +FELLMONGERIES +FELLMONGERING +FELLMONGERINGS +FELLMONGERS +FELLMONGERY +FELLNESS +FELLNESSES +FELLOE +FELLOES +FELLOW +FELLOWED +FELLOWING +FELLOWLY +FELLOWMAN +FELLOWMEN +FELLOWS +FELLOWSHIP +FELLOWSHIPED +FELLOWSHIPING +FELLOWSHIPPED +FELLOWSHIPPING +FELLOWSHIPS +FELLS +FELLY +FELON +FELONIES +FELONIOUS +FELONIOUSLY +FELONIOUSNESS +FELONIOUSNESSES +FELONRIES +FELONRY +FELONS +FELONY +FELSIC +FELSITE +FELSITES +FELSITIC +FELSPAR +FELSPARS +FELSTONE +FELSTONES +FELT +FELTED +FELTING +FELTINGS +FELTLIKE +FELTS +FELUCCA +FELUCCAS +FELWORT +FELWORTS +FEM +FEMALE +FEMALENESS +FEMALENESSES +FEMALES +FEME +FEMES +FEMINACIES +FEMINACY +FEMINAZI +FEMINAZIS +FEMINIE +FEMININE +FEMININELY +FEMININENESS +FEMININENESSES +FEMININES +FEMININITIES +FEMININITY +FEMINISE +FEMINISED +FEMINISES +FEMINISING +FEMINISM +FEMINISMS +FEMINIST +FEMINISTIC +FEMINISTS +FEMINITIES +FEMINITY +FEMINIZATION +FEMINIZATIONS +FEMINIZE +FEMINIZED +FEMINIZES +FEMINIZING +FEMME +FEMMES +FEMORA +FEMORAL +FEMS +FEMTOSECOND +FEMTOSECONDS +FEMUR +FEMURS +FEN +FENAGLE +FENAGLED +FENAGLES +FENAGLING +FENCE +FENCED +FENCELESS +FENCELESSNESS +FENCELESSNESSES +FENCER +FENCEROW +FENCEROWS +FENCERS +FENCES +FENCIBLE +FENCIBLES +FENCING +FENCINGS +FEND +FENDED +FENDER +FENDERED +FENDERLESS +FENDERS +FENDING +FENDS +FENESTRA +FENESTRAE +FENESTRAL +FENESTRATE +FENESTRATED +FENESTRATION +FENESTRATIONS +FENLAND +FENLANDS +FENNEC +FENNECS +FENNEL +FENNELS +FENNIER +FENNIEST +FENNY +FENS +FENTANYL +FENTANYLS +FENTHION +FENTHIONS +FENUGREEK +FENUGREEKS +FENURON +FENURONS +FEOD +FEODARIES +FEODARY +FEODS +FEOFF +FEOFFED +FEOFFEE +FEOFFEES +FEOFFER +FEOFFERS +FEOFFING +FEOFFMENT +FEOFFMENTS +FEOFFOR +FEOFFORS +FEOFFS +FER +FERACITIES +FERACITY +FERAL +FERALS +FERBAM +FERBAMS +FERE +FERES +FERETORIES +FERETORY +FERIA +FERIAE +FERIAL +FERIAS +FERINE +FERITIES +FERITY +FERLIE +FERLIES +FERLY +FERMATA +FERMATAS +FERMATE +FERMENT +FERMENTABLE +FERMENTATION +FERMENTATIONS +FERMENTATIVE +FERMENTED +FERMENTER +FERMENTERS +FERMENTING +FERMENTOR +FERMENTORS +FERMENTS +FERMI +FERMION +FERMIONIC +FERMIONS +FERMIS +FERMIUM +FERMIUMS +FERN +FERNERIES +FERNERY +FERNIER +FERNIEST +FERNINST +FERNLESS +FERNLIKE +FERNS +FERNY +FEROCIOUS +FEROCIOUSLY +FEROCIOUSNESS +FEROCIOUSNESSES +FEROCITIES +FEROCITY +FERRATE +FERRATES +FERREDOXIN +FERREDOXINS +FERREL +FERRELED +FERRELING +FERRELLED +FERRELLING +FERRELS +FERREOUS +FERRET +FERRETED +FERRETER +FERRETERS +FERRETING +FERRETINGS +FERRETS +FERRETY +FERRIAGE +FERRIAGES +FERRIC +FERRICYANIDE +FERRICYANIDES +FERRIED +FERRIES +FERRIFEROUS +FERRIMAGNET +FERRIMAGNETIC +FERRIMAGNETISM +FERRIMAGNETISMS +FERRIMAGNETS +FERRITE +FERRITES +FERRITIC +FERRITIN +FERRITINS +FERROCENE +FERROCENES +FERROCONCRETE +FERROCONCRETES +FERROCYANIDE +FERROCYANIDES +FERROELECTRIC +FERROELECTRICS +FERROMAGNESIAN +FERROMAGNET +FERROMAGNETIC +FERROMAGNETISM +FERROMAGNETISMS +FERROMAGNETS +FERROMANGANESE +FERROMANGANESES +FERROSILICON +FERROSILICONS +FERROTYPE +FERROTYPED +FERROTYPES +FERROTYPING +FERROUS +FERRUGINOUS +FERRULE +FERRULED +FERRULES +FERRULING +FERRUM +FERRUMS +FERRY +FERRYBOAT +FERRYBOATS +FERRYING +FERRYMAN +FERRYMEN +FERTILE +FERTILELY +FERTILENESS +FERTILENESSES +FERTILITIES +FERTILITY +FERTILIZABLE +FERTILIZATION +FERTILIZATIONS +FERTILIZE +FERTILIZED +FERTILIZER +FERTILIZERS +FERTILIZES +FERTILIZING +FERULA +FERULAE +FERULAS +FERULE +FERULED +FERULES +FERULING +FERVENCIES +FERVENCY +FERVENT +FERVENTLY +FERVID +FERVIDITIES +FERVIDITY +FERVIDLY +FERVIDNESS +FERVIDNESSES +FERVOR +FERVORS +FERVOUR +FERVOURS +FES +FESCENNINE +FESCUE +FESCUES +FESS +FESSE +FESSED +FESSES +FESSING +FESSWISE +FEST +FESTAL +FESTALLY +FESTER +FESTERED +FESTERING +FESTERS +FESTINATE +FESTINATED +FESTINATELY +FESTINATES +FESTINATING +FESTIVAL +FESTIVALGOER +FESTIVALGOERS +FESTIVALS +FESTIVE +FESTIVELY +FESTIVENESS +FESTIVENESSES +FESTIVITIES +FESTIVITY +FESTOON +FESTOONED +FESTOONERIES +FESTOONERY +FESTOONING +FESTOONS +FESTS +FET +FETA +FETAL +FETAS +FETATION +FETATIONS +FETCH +FETCHED +FETCHER +FETCHERS +FETCHES +FETCHING +FETCHINGLY +FETE +FETED +FETERITA +FETERITAS +FETES +FETIAL +FETIALES +FETIALIS +FETIALS +FETICH +FETICHES +FETICHISM +FETICHISMS +FETICIDAL +FETICIDE +FETICIDES +FETID +FETIDITIES +FETIDITY +FETIDLY +FETIDNESS +FETIDNESSES +FETING +FETISH +FETISHES +FETISHISM +FETISHISMS +FETISHIST +FETISHISTIC +FETISHISTICALLY +FETISHISTS +FETISHIZE +FETISHIZED +FETISHIZES +FETISHIZING +FETLOCK +FETLOCKS +FETOLOGIES +FETOLOGIST +FETOLOGISTS +FETOLOGY +FETOPROTEIN +FETOPROTEINS +FETOR +FETORS +FETOSCOPE +FETOSCOPES +FETOSCOPIES +FETOSCOPY +FETS +FETTED +FETTER +FETTERED +FETTERER +FETTERERS +FETTERING +FETTERS +FETTING +FETTLE +FETTLED +FETTLES +FETTLING +FETTLINGS +FETTUCCINE +FETTUCCINI +FETTUCINE +FETTUCINI +FETUS +FETUSES +FEU +FEUAR +FEUARS +FEUD +FEUDAL +FEUDALISM +FEUDALISMS +FEUDALIST +FEUDALISTIC +FEUDALISTS +FEUDALITIES +FEUDALITY +FEUDALIZATION +FEUDALIZATIONS +FEUDALIZE +FEUDALIZED +FEUDALIZES +FEUDALIZING +FEUDALLY +FEUDARIES +FEUDARY +FEUDATORIES +FEUDATORY +FEUDED +FEUDING +FEUDIST +FEUDISTS +FEUDS +FEUED +FEUILLETON +FEUILLETONISM +FEUILLETONISMS +FEUILLETONIST +FEUILLETONISTS +FEUILLETONS +FEUING +FEUS +FEVER +FEVERED +FEVERFEW +FEVERFEWS +FEVERING +FEVERISH +FEVERISHLY +FEVERISHNESS +FEVERISHNESSES +FEVEROUS +FEVERROOT +FEVERROOTS +FEVERS +FEVERWEED +FEVERWEEDS +FEVERWORT +FEVERWORTS +FEW +FEWER +FEWEST +FEWNESS +FEWNESSES +FEWTRILS +FEY +FEYER +FEYEST +FEYLY +FEYNESS +FEYNESSES +FEZ +FEZES +FEZZED +FEZZES +FEZZY +FIACRE +FIACRES +FIANCE +FIANCEE +FIANCEES +FIANCES +FIANCHETTO +FIANCHETTOED +FIANCHETTOING +FIANCHETTOS +FIAR +FIARS +FIASCHI +FIASCO +FIASCOES +FIASCOS +FIAT +FIATS +FIB +FIBBED +FIBBER +FIBBERS +FIBBING +FIBER +FIBERBOARD +FIBERBOARDS +FIBERED +FIBERFILL +FIBERFILLS +FIBERGLASS +FIBERGLASSED +FIBERGLASSES +FIBERGLASSING +FIBERIZATION +FIBERIZATIONS +FIBERIZE +FIBERIZED +FIBERIZES +FIBERIZING +FIBERLESS +FIBERLIKE +FIBERS +FIBERSCOPE +FIBERSCOPES +FIBRANNE +FIBRANNES +FIBRE +FIBREBOARD +FIBREBOARDS +FIBREFILL +FIBREFILLS +FIBREGLASS +FIBREGLASSES +FIBRES +FIBRIL +FIBRILLA +FIBRILLAE +FIBRILLAR +FIBRILLATE +FIBRILLATED +FIBRILLATES +FIBRILLATING +FIBRILLATION +FIBRILLATIONS +FIBRILS +FIBRIN +FIBRINOGEN +FIBRINOGENS +FIBRINOID +FIBRINOIDS +FIBRINOLYSES +FIBRINOLYSIN +FIBRINOLYSINS +FIBRINOLYSIS +FIBRINOLYTIC +FIBRINOPEPTIDE +FIBRINOPEPTIDES +FIBRINOUS +FIBRINS +FIBROBLAST +FIBROBLASTIC +FIBROBLASTS +FIBROCYSTIC +FIBROID +FIBROIDS +FIBROIN +FIBROINS +FIBROMA +FIBROMAS +FIBROMATA +FIBROMATOUS +FIBROMYALGIA +FIBROMYALGIAS +FIBRONECTIN +FIBRONECTINS +FIBROSARCOMA +FIBROSARCOMAS +FIBROSARCOMATA +FIBROSES +FIBROSIS +FIBROSITIS +FIBROSITISES +FIBROTIC +FIBROUS +FIBROUSLY +FIBROVASCULAR +FIBS +FIBSTER +FIBSTERS +FIBULA +FIBULAE +FIBULAR +FIBULAS +FICE +FICES +FICHE +FICHES +FICHU +FICHUS +FICIN +FICINS +FICKLE +FICKLENESS +FICKLENESSES +FICKLER +FICKLEST +FICKLY +FICO +FICOES +FICTILE +FICTION +FICTIONAL +FICTIONALISE +FICTIONALISED +FICTIONALISES +FICTIONALISING +FICTIONALITIES +FICTIONALITY +FICTIONALIZE +FICTIONALIZED +FICTIONALIZES +FICTIONALIZING +FICTIONALLY +FICTIONEER +FICTIONEERING +FICTIONEERINGS +FICTIONEERS +FICTIONIST +FICTIONISTS +FICTIONIZATION +FICTIONIZATIONS +FICTIONIZE +FICTIONIZED +FICTIONIZES +FICTIONIZING +FICTIONS +FICTITIOUS +FICTITIOUSLY +FICTITIOUSNESS +FICTIVE +FICTIVELY +FICTIVENESS +FICTIVENESSES +FICUS +FICUSES +FID +FIDDLE +FIDDLEBACK +FIDDLEBACKS +FIDDLED +FIDDLEHEAD +FIDDLEHEADS +FIDDLER +FIDDLERS +FIDDLES +FIDDLESTICK +FIDDLESTICKS +FIDDLING +FIDDLY +FIDEISM +FIDEISMS +FIDEIST +FIDEISTIC +FIDEISTS +FIDELISMO +FIDELISMOS +FIDELISTA +FIDELISTAS +FIDELITIES +FIDELITY +FIDGE +FIDGED +FIDGES +FIDGET +FIDGETED +FIDGETER +FIDGETERS +FIDGETINESS +FIDGETINESSES +FIDGETING +FIDGETS +FIDGETY +FIDGING +FIDO +FIDOS +FIDS +FIDUCIAL +FIDUCIALLY +FIDUCIARIES +FIDUCIARY +FIE +FIEF +FIEFDOM +FIEFDOMS +FIEFS +FIELD +FIELDED +FIELDER +FIELDERS +FIELDFARE +FIELDFARES +FIELDING +FIELDPIECE +FIELDPIECES +FIELDS +FIELDSMAN +FIELDSMEN +FIELDSTONE +FIELDSTONES +FIELDSTRIP +FIELDSTRIPPED +FIELDSTRIPPING +FIELDSTRIPS +FIELDWORK +FIELDWORKS +FIEND +FIENDISH +FIENDISHLY +FIENDISHNESS +FIENDISHNESSES +FIENDS +FIERCE +FIERCELY +FIERCENESS +FIERCENESSES +FIERCER +FIERCEST +FIERIER +FIERIEST +FIERILY +FIERINESS +FIERINESSES +FIERY +FIESTA +FIESTAS +FIFE +FIFED +FIFER +FIFERS +FIFES +FIFING +FIFTEEN +FIFTEENS +FIFTEENTH +FIFTEENTHS +FIFTH +FIFTHLY +FIFTHS +FIFTIES +FIFTIETH +FIFTIETHS +FIFTY +FIFTYISH +FIG +FIGEATER +FIGEATERS +FIGGED +FIGGING +FIGHT +FIGHTABLE +FIGHTER +FIGHTERS +FIGHTING +FIGHTINGS +FIGHTS +FIGMENT +FIGMENTS +FIGS +FIGULINE +FIGULINES +FIGURABLE +FIGURAL +FIGURALLY +FIGURANT +FIGURANTS +FIGURATE +FIGURATION +FIGURATIONS +FIGURATIVE +FIGURATIVELY +FIGURATIVENESS +FIGURE +FIGURED +FIGUREDLY +FIGUREHEAD +FIGUREHEADS +FIGURER +FIGURERS +FIGURES +FIGURINE +FIGURINES +FIGURING +FIGWORT +FIGWORTS +FIL +FILA +FILAGREE +FILAGREED +FILAGREEING +FILAGREES +FILAMENT +FILAMENTARY +FILAMENTOUS +FILAMENTS +FILAR +FILAREE +FILAREES +FILARIA +FILARIAE +FILARIAL +FILARIAN +FILARIASES +FILARIASIS +FILARIID +FILARIIDS +FILATURE +FILATURES +FILBERT +FILBERTS +FILCH +FILCHED +FILCHER +FILCHERS +FILCHES +FILCHING +FILE +FILEABLE +FILED +FILEFISH +FILEFISHES +FILEMOT +FILENAME +FILENAMES +FILER +FILERS +FILES +FILET +FILETED +FILETING +FILETS +FILIAL +FILIALLY +FILIATE +FILIATED +FILIATES +FILIATING +FILIATION +FILIATIONS +FILIBEG +FILIBEGS +FILIBUSTER +FILIBUSTERED +FILIBUSTERER +FILIBUSTERERS +FILIBUSTERING +FILIBUSTERS +FILICIDE +FILICIDES +FILIFORM +FILIGREE +FILIGREED +FILIGREEING +FILIGREES +FILING +FILINGS +FILIOPIETISTIC +FILISTER +FILISTERS +FILL +FILLABLE +FILLAGREE +FILLAGREED +FILLAGREEING +FILLAGREES +FILLE +FILLED +FILLER +FILLERS +FILLES +FILLET +FILLETED +FILLETING +FILLETS +FILLIES +FILLING +FILLINGS +FILLIP +FILLIPED +FILLIPING +FILLIPS +FILLISTER +FILLISTERS +FILLO +FILLOS +FILLS +FILLY +FILM +FILMABLE +FILMCARD +FILMCARDS +FILMDOM +FILMDOMS +FILMED +FILMER +FILMERS +FILMGOER +FILMGOERS +FILMGOING +FILMI +FILMIC +FILMICALLY +FILMIER +FILMIEST +FILMILY +FILMINESS +FILMINESSES +FILMING +FILMIS +FILMLAND +FILMLANDS +FILMLESS +FILMLIKE +FILMMAKER +FILMMAKERS +FILMMAKING +FILMMAKINGS +FILMOGRAPHIES +FILMOGRAPHY +FILMS +FILMSET +FILMSETS +FILMSETTER +FILMSETTERS +FILMSETTING +FILMSETTINGS +FILMSTRIP +FILMSTRIPS +FILMY +FILO +FILOPLUME +FILOPLUMES +FILOPODIA +FILOPODIUM +FILOS +FILOSE +FILOVIRUS +FILOVIRUSES +FILS +FILTER +FILTERABILITIES +FILTERABILITY +FILTERABLE +FILTERED +FILTERER +FILTERERS +FILTERING +FILTERS +FILTH +FILTHIER +FILTHIEST +FILTHILY +FILTHINESS +FILTHINESSES +FILTHS +FILTHY +FILTRABLE +FILTRATE +FILTRATED +FILTRATES +FILTRATING +FILTRATION +FILTRATIONS +FILUM +FIMBLE +FIMBLES +FIMBRIA +FIMBRIAE +FIMBRIAL +FIMBRIATE +FIMBRIATED +FIMBRIATION +FIMBRIATIONS +FIN +FINABLE +FINAGLE +FINAGLED +FINAGLER +FINAGLERS +FINAGLES +FINAGLING +FINAL +FINALE +FINALES +FINALIS +FINALISE +FINALISED +FINALISES +FINALISING +FINALISM +FINALISMS +FINALIST +FINALISTS +FINALITIES +FINALITY +FINALIZATION +FINALIZATIONS +FINALIZE +FINALIZED +FINALIZER +FINALIZERS +FINALIZES +FINALIZING +FINALLY +FINALS +FINANCE +FINANCED +FINANCES +FINANCIAL +FINANCIALLY +FINANCIER +FINANCIERED +FINANCIERING +FINANCIERS +FINANCING +FINANCINGS +FINBACK +FINBACKS +FINCA +FINCAS +FINCH +FINCHES +FIND +FINDABLE +FINDER +FINDERS +FINDING +FINDINGS +FINDS +FINE +FINEABLE +FINED +FINELY +FINENESS +FINENESSES +FINER +FINERIES +FINERY +FINES +FINESPUN +FINESSE +FINESSED +FINESSES +FINESSING +FINEST +FINFISH +FINFISHES +FINFOOT +FINFOOTS +FINGER +FINGERBOARD +FINGERBOARDS +FINGERED +FINGERER +FINGERERS +FINGERHOLD +FINGERHOLDS +FINGERING +FINGERINGS +FINGERLIKE +FINGERLING +FINGERLINGS +FINGERNAIL +FINGERNAILS +FINGERPICK +FINGERPICKED +FINGERPICKING +FINGERPICKINGS +FINGERPICKS +FINGERPOST +FINGERPOSTS +FINGERPRINT +FINGERPRINTED +FINGERPRINTING +FINGERPRINTINGS +FINGERPRINTS +FINGERS +FINGERTIP +FINGERTIPS +FINIAL +FINIALED +FINIALS +FINICAL +FINICALLY +FINICALNESS +FINICALNESSES +FINICKIER +FINICKIEST +FINICKIN +FINICKINESS +FINICKINESSES +FINICKING +FINICKY +FINIKIN +FINIKING +FINING +FININGS +FINIS +FINISES +FINISH +FINISHED +FINISHER +FINISHERS +FINISHES +FINISHING +FINITE +FINITELY +FINITENESS +FINITENESSES +FINITES +FINITO +FINITUDE +FINITUDES +FINK +FINKED +FINKING +FINKS +FINLESS +FINLIKE +FINMARK +FINMARKS +FINNED +FINNICKIER +FINNICKIEST +FINNICKY +FINNIER +FINNIEST +FINNING +FINNMARK +FINNMARKS +FINNY +FINO +FINOCCHIO +FINOCCHIOS +FINOCHIO +FINOCHIOS +FINOS +FINS +FIORATURA +FIORATURAE +FIORD +FIORDS +FIORITURA +FIORITURE +FIPPLE +FIPPLES +FIQUE +FIQUES +FIR +FIRE +FIREABLE +FIREARM +FIREARMED +FIREARMS +FIREBACK +FIREBACKS +FIREBALL +FIREBALLER +FIREBALLERS +FIREBALLING +FIREBALLS +FIREBASE +FIREBASES +FIREBIRD +FIREBIRDS +FIREBOARD +FIREBOARDS +FIREBOAT +FIREBOATS +FIREBOMB +FIREBOMBED +FIREBOMBING +FIREBOMBS +FIREBOX +FIREBOXES +FIREBRAND +FIREBRANDS +FIREBRAT +FIREBRATS +FIREBREAK +FIREBREAKS +FIREBRICK +FIREBRICKS +FIREBUG +FIREBUGS +FIRECLAY +FIRECLAYS +FIRECRACKER +FIRECRACKERS +FIRED +FIREDAMP +FIREDAMPS +FIREDOG +FIREDOGS +FIREDRAKE +FIREDRAKES +FIREFANG +FIREFANGED +FIREFANGING +FIREFANGS +FIREFIGHT +FIREFIGHTER +FIREFIGHTERS +FIREFIGHTS +FIREFLIES +FIREFLOOD +FIREFLOODS +FIREFLY +FIREGUARD +FIREGUARDS +FIREHALL +FIREHALLS +FIREHOUSE +FIREHOUSES +FIRELESS +FIRELIGHT +FIRELIGHTS +FIRELIT +FIRELOCK +FIRELOCKS +FIREMAN +FIREMANIC +FIREMEN +FIREPAN +FIREPANS +FIREPINK +FIREPINKS +FIREPLACE +FIREPLACED +FIREPLACES +FIREPLUG +FIREPLUGS +FIREPOT +FIREPOTS +FIREPOWER +FIREPOWERS +FIREPROOF +FIREPROOFED +FIREPROOFING +FIREPROOFS +FIRER +FIREROOM +FIREROOMS +FIRERS +FIRES +FIRESHIP +FIRESHIPS +FIRESIDE +FIRESIDES +FIRESTONE +FIRESTONES +FIRESTORM +FIRESTORMS +FIRETHORN +FIRETHORNS +FIRETRAP +FIRETRAPS +FIRETRUCK +FIRETRUCKS +FIREWALL +FIREWALLS +FIREWATER +FIREWATERS +FIREWEED +FIREWEEDS +FIREWOOD +FIREWOODS +FIREWORK +FIREWORKS +FIREWORM +FIREWORMS +FIRING +FIRINGS +FIRKIN +FIRKINS +FIRM +FIRMAMENT +FIRMAMENTAL +FIRMAMENTS +FIRMAN +FIRMANS +FIRMED +FIRMER +FIRMERS +FIRMEST +FIRMING +FIRMLY +FIRMNESS +FIRMNESSES +FIRMS +FIRMWARE +FIRMWARES +FIRN +FIRNS +FIRRIER +FIRRIEST +FIRRY +FIRS +FIRST +FIRSTBORN +FIRSTBORNS +FIRSTFRUITS +FIRSTHAND +FIRSTLING +FIRSTLINGS +FIRSTLY +FIRSTNESS +FIRSTNESSES +FIRSTS +FIRTH +FIRTHS +FISC +FISCAL +FISCALIST +FISCALISTS +FISCALLY +FISCALS +FISCS +FISH +FISHABILITIES +FISHABILITY +FISHABLE +FISHBOLT +FISHBOLTS +FISHBONE +FISHBONES +FISHBOWL +FISHBOWLS +FISHED +FISHER +FISHERFOLK +FISHERIES +FISHERMAN +FISHERMEN +FISHERS +FISHERWOMAN +FISHERWOMEN +FISHERY +FISHES +FISHEYE +FISHEYES +FISHGIG +FISHGIGS +FISHHOOK +FISHHOOKS +FISHIER +FISHIEST +FISHILY +FISHINESS +FISHINESSES +FISHING +FISHINGS +FISHKILL +FISHKILLS +FISHLESS +FISHLIKE +FISHLINE +FISHLINES +FISHMEAL +FISHMEALS +FISHMONGER +FISHMONGERS +FISHNET +FISHNETS +FISHPLATE +FISHPLATES +FISHPOLE +FISHPOLES +FISHPOND +FISHPONDS +FISHTAIL +FISHTAILED +FISHTAILING +FISHTAILS +FISHWAY +FISHWAYS +FISHWIFE +FISHWIVES +FISHWORM +FISHWORMS +FISHY +FISSATE +FISSILE +FISSILITIES +FISSILITY +FISSION +FISSIONABILITY +FISSIONABLE +FISSIONABLES +FISSIONAL +FISSIONED +FISSIONING +FISSIONS +FISSIPAROUS +FISSIPAROUSNESS +FISSIPED +FISSIPEDS +FISSURAL +FISSURE +FISSURED +FISSURES +FISSURING +FIST +FISTED +FISTFIGHT +FISTFIGHTS +FISTFUL +FISTFULS +FISTIC +FISTICUFF +FISTICUFFS +FISTING +FISTNOTE +FISTNOTES +FISTS +FISTULA +FISTULAE +FISTULAR +FISTULAS +FISTULATE +FISTULOUS +FIT +FITCH +FITCHEE +FITCHES +FITCHET +FITCHETS +FITCHEW +FITCHEWS +FITCHY +FITFUL +FITFULLY +FITFULNESS +FITFULNESSES +FITLY +FITMENT +FITMENTS +FITNESS +FITNESSES +FITS +FITTABLE +FITTED +FITTER +FITTERS +FITTEST +FITTING +FITTINGLY +FITTINGNESS +FITTINGNESSES +FITTINGS +FIVE +FIVEFOLD +FIVEPINS +FIVER +FIVERS +FIVES +FIX +FIXABLE +FIXATE +FIXATED +FIXATES +FIXATIF +FIXATIFS +FIXATING +FIXATION +FIXATIONS +FIXATIVE +FIXATIVES +FIXED +FIXEDLY +FIXEDNESS +FIXEDNESSES +FIXER +FIXERS +FIXES +FIXING +FIXINGS +FIXIT +FIXITIES +FIXITY +FIXT +FIXTURE +FIXTURES +FIXURE +FIXURES +FIZ +FIZGIG +FIZGIGS +FIZZ +FIZZED +FIZZER +FIZZERS +FIZZES +FIZZIER +FIZZIEST +FIZZING +FIZZLE +FIZZLED +FIZZLES +FIZZLING +FIZZY +FJELD +FJELDS +FJORD +FJORDIC +FJORDS +FLAB +FLABBERGAST +FLABBERGASTED +FLABBERGASTING +FLABBERGASTS +FLABBIER +FLABBIEST +FLABBILY +FLABBINESS +FLABBINESSES +FLABBY +FLABELLA +FLABELLATE +FLABELLIFORM +FLABELLUM +FLABS +FLACCID +FLACCIDITIES +FLACCIDITY +FLACCIDLY +FLACK +FLACKED +FLACKERIES +FLACKERY +FLACKING +FLACKS +FLACON +FLACONS +FLAG +FLAGELLA +FLAGELLANT +FLAGELLANTISM +FLAGELLANTISMS +FLAGELLANTS +FLAGELLAR +FLAGELLATE +FLAGELLATED +FLAGELLATES +FLAGELLATING +FLAGELLATION +FLAGELLATIONS +FLAGELLIN +FLAGELLINS +FLAGELLUM +FLAGELLUMS +FLAGEOLET +FLAGEOLETS +FLAGGED +FLAGGER +FLAGGERS +FLAGGIER +FLAGGIEST +FLAGGING +FLAGGINGLY +FLAGGINGS +FLAGGY +FLAGITIOUS +FLAGITIOUSLY +FLAGITIOUSNESS +FLAGLESS +FLAGMAN +FLAGMEN +FLAGON +FLAGONS +FLAGPOLE +FLAGPOLES +FLAGRANCE +FLAGRANCES +FLAGRANCIES +FLAGRANCY +FLAGRANT +FLAGRANTLY +FLAGS +FLAGSHIP +FLAGSHIPS +FLAGSTAFF +FLAGSTAFFS +FLAGSTAVES +FLAGSTICK +FLAGSTICKS +FLAGSTONE +FLAGSTONES +FLAIL +FLAILED +FLAILING +FLAILS +FLAIR +FLAIRS +FLAK +FLAKE +FLAKED +FLAKER +FLAKERS +FLAKES +FLAKEY +FLAKIER +FLAKIEST +FLAKILY +FLAKINESS +FLAKINESSES +FLAKING +FLAKY +FLAM +FLAMBE +FLAMBEAU +FLAMBEAUS +FLAMBEAUX +FLAMBEE +FLAMBEED +FLAMBEING +FLAMBES +FLAMBOYANCE +FLAMBOYANCES +FLAMBOYANCIES +FLAMBOYANCY +FLAMBOYANT +FLAMBOYANTLY +FLAMBOYANTS +FLAME +FLAMED +FLAMELESS +FLAMELIKE +FLAMEN +FLAMENCO +FLAMENCOS +FLAMENS +FLAMEOUT +FLAMEOUTS +FLAMEPROOF +FLAMEPROOFED +FLAMEPROOFER +FLAMEPROOFERS +FLAMEPROOFING +FLAMEPROOFS +FLAMER +FLAMERS +FLAMES +FLAMETHROWER +FLAMETHROWERS +FLAMIER +FLAMIEST +FLAMINES +FLAMING +FLAMINGLY +FLAMINGO +FLAMINGOES +FLAMINGOS +FLAMMABILITIES +FLAMMABILITY +FLAMMABLE +FLAMMABLES +FLAMMED +FLAMMING +FLAMS +FLAMY +FLAN +FLANCARD +FLANCARDS +FLANERIE +FLANERIES +FLANES +FLANEUR +FLANEURS +FLANGE +FLANGED +FLANGER +FLANGERS +FLANGES +FLANGING +FLANK +FLANKED +FLANKEN +FLANKER +FLANKERS +FLANKING +FLANKS +FLANNEL +FLANNELED +FLANNELET +FLANNELETS +FLANNELETTE +FLANNELETTES +FLANNELING +FLANNELLED +FLANNELLING +FLANNELLY +FLANNELMOUTHED +FLANNELS +FLANS +FLAP +FLAPDOODLE +FLAPDOODLES +FLAPERON +FLAPERONS +FLAPJACK +FLAPJACKS +FLAPLESS +FLAPPABLE +FLAPPED +FLAPPER +FLAPPERS +FLAPPIER +FLAPPIEST +FLAPPING +FLAPPY +FLAPS +FLARE +FLAREBACK +FLAREBACKS +FLARED +FLARES +FLAREUP +FLAREUPS +FLARING +FLARINGLY +FLASH +FLASHBACK +FLASHBACKS +FLASHBOARD +FLASHBOARDS +FLASHBULB +FLASHBULBS +FLASHCARD +FLASHCARDS +FLASHCUBE +FLASHCUBES +FLASHED +FLASHER +FLASHERS +FLASHES +FLASHGUN +FLASHGUNS +FLASHIER +FLASHIEST +FLASHILY +FLASHINESS +FLASHINESSES +FLASHING +FLASHINGS +FLASHLAMP +FLASHLAMPS +FLASHLIGHT +FLASHLIGHTS +FLASHOVER +FLASHOVERS +FLASHTUBE +FLASHTUBES +FLASHY +FLASK +FLASKET +FLASKETS +FLASKS +FLAT +FLATBED +FLATBEDS +FLATBOAT +FLATBOATS +FLATBREAD +FLATBREADS +FLATCAP +FLATCAPS +FLATCAR +FLATCARS +FLATFEET +FLATFISH +FLATFISHES +FLATFOOT +FLATFOOTED +FLATFOOTING +FLATFOOTS +FLATHEAD +FLATHEADS +FLATIRON +FLATIRONS +FLATLAND +FLATLANDER +FLATLANDERS +FLATLANDS +FLATLET +FLATLETS +FLATLINE +FLATLINED +FLATLINER +FLATLINERS +FLATLINES +FLATLING +FLATLINGS +FLATLINING +FLATLONG +FLATLY +FLATMATE +FLATMATES +FLATNESS +FLATNESSES +FLATS +FLATTED +FLATTEN +FLATTENED +FLATTENER +FLATTENERS +FLATTENING +FLATTENS +FLATTER +FLATTERED +FLATTERER +FLATTERERS +FLATTERIES +FLATTERING +FLATTERINGLY +FLATTERS +FLATTERY +FLATTEST +FLATTING +FLATTISH +FLATTOP +FLATTOPS +FLATULENCE +FLATULENCES +FLATULENCIES +FLATULENCY +FLATULENT +FLATULENTLY +FLATUS +FLATUSES +FLATWARE +FLATWARES +FLATWASH +FLATWASHES +FLATWAYS +FLATWISE +FLATWORK +FLATWORKS +FLATWORM +FLATWORMS +FLAUNT +FLAUNTED +FLAUNTER +FLAUNTERS +FLAUNTIER +FLAUNTIEST +FLAUNTILY +FLAUNTING +FLAUNTINGLY +FLAUNTS +FLAUNTY +FLAUTA +FLAUTAS +FLAUTIST +FLAUTISTS +FLAVANOL +FLAVANOLS +FLAVANONE +FLAVANONES +FLAVIN +FLAVINE +FLAVINES +FLAVINS +FLAVONE +FLAVONES +FLAVONOID +FLAVONOIDS +FLAVONOL +FLAVONOLS +FLAVOPROTEIN +FLAVOPROTEINS +FLAVOR +FLAVORED +FLAVORER +FLAVORERS +FLAVORFUL +FLAVORFULLY +FLAVORING +FLAVORINGS +FLAVORIST +FLAVORISTS +FLAVORLESS +FLAVOROUS +FLAVORS +FLAVORSOME +FLAVORY +FLAVOUR +FLAVOURED +FLAVOURING +FLAVOURS +FLAVOURY +FLAW +FLAWED +FLAWIER +FLAWIEST +FLAWING +FLAWLESS +FLAWLESSLY +FLAWLESSNESS +FLAWLESSNESSES +FLAWS +FLAWY +FLAX +FLAXEN +FLAXES +FLAXIER +FLAXIEST +FLAXSEED +FLAXSEEDS +FLAXY +FLAY +FLAYED +FLAYER +FLAYERS +FLAYING +FLAYS +FLEA +FLEABAG +FLEABAGS +FLEABANE +FLEABANES +FLEABITE +FLEABITES +FLEAHOPPER +FLEAHOPPERS +FLEAM +FLEAMS +FLEAPIT +FLEAPITS +FLEAS +FLEAWORT +FLEAWORTS +FLECHE +FLECHES +FLECHETTE +FLECHETTES +FLECK +FLECKED +FLECKING +FLECKLESS +FLECKS +FLECKY +FLECTION +FLECTIONS +FLED +FLEDGE +FLEDGED +FLEDGES +FLEDGIER +FLEDGIEST +FLEDGING +FLEDGLING +FLEDGLINGS +FLEDGY +FLEE +FLEECE +FLEECED +FLEECER +FLEECERS +FLEECES +FLEECH +FLEECHED +FLEECHES +FLEECHING +FLEECIER +FLEECIEST +FLEECILY +FLEECING +FLEECY +FLEEING +FLEER +FLEERED +FLEERING +FLEERINGLY +FLEERS +FLEES +FLEET +FLEETED +FLEETER +FLEETEST +FLEETING +FLEETINGLY +FLEETINGNESS +FLEETINGNESSES +FLEETLY +FLEETNESS +FLEETNESSES +FLEETS +FLEHMEN +FLEHMENED +FLEHMENING +FLEHMENS +FLEISHIG +FLEMISH +FLEMISHED +FLEMISHES +FLEMISHING +FLENCH +FLENCHED +FLENCHES +FLENCHING +FLENSE +FLENSED +FLENSER +FLENSERS +FLENSES +FLENSING +FLESH +FLESHED +FLESHER +FLESHERS +FLESHES +FLESHIER +FLESHIEST +FLESHILY +FLESHINESS +FLESHINESSES +FLESHING +FLESHINGS +FLESHLESS +FLESHLIER +FLESHLIEST +FLESHLY +FLESHMENT +FLESHMENTS +FLESHPOT +FLESHPOTS +FLESHY +FLETCH +FLETCHED +FLETCHER +FLETCHERS +FLETCHES +FLETCHING +FLETCHINGS +FLEURON +FLEURONS +FLEURY +FLEW +FLEWS +FLEX +FLEXAGON +FLEXAGONS +FLEXED +FLEXES +FLEXIBILITIES +FLEXIBILITY +FLEXIBLE +FLEXIBLY +FLEXILE +FLEXING +FLEXION +FLEXIONAL +FLEXIONS +FLEXITIME +FLEXITIMES +FLEXOGRAPHIC +FLEXOGRAPHIES +FLEXOGRAPHY +FLEXOR +FLEXORS +FLEXTIME +FLEXTIMER +FLEXTIMERS +FLEXTIMES +FLEXUOSE +FLEXUOUS +FLEXURAL +FLEXURE +FLEXURES +FLEY +FLEYED +FLEYING +FLEYS +FLIBBERTIGIBBET +FLIC +FLICHTER +FLICHTERED +FLICHTERING +FLICHTERS +FLICK +FLICKABLE +FLICKED +FLICKER +FLICKERED +FLICKERING +FLICKERINGLY +FLICKERS +FLICKERY +FLICKING +FLICKS +FLICS +FLIED +FLIER +FLIERS +FLIES +FLIEST +FLIGHT +FLIGHTED +FLIGHTIER +FLIGHTIEST +FLIGHTILY +FLIGHTINESS +FLIGHTINESSES +FLIGHTING +FLIGHTLESS +FLIGHTS +FLIGHTY +FLIMFLAM +FLIMFLAMMED +FLIMFLAMMER +FLIMFLAMMERIES +FLIMFLAMMERS +FLIMFLAMMERY +FLIMFLAMMING +FLIMFLAMS +FLIMSIER +FLIMSIES +FLIMSIEST +FLIMSILY +FLIMSINESS +FLIMSINESSES +FLIMSY +FLINCH +FLINCHED +FLINCHER +FLINCHERS +FLINCHES +FLINCHING +FLINDER +FLINDERS +FLING +FLINGER +FLINGERS +FLINGING +FLINGS +FLINKITE +FLINKITES +FLINT +FLINTED +FLINTHEAD +FLINTHEADS +FLINTIER +FLINTIEST +FLINTILY +FLINTINESS +FLINTINESSES +FLINTING +FLINTLIKE +FLINTLOCK +FLINTLOCKS +FLINTS +FLINTY +FLIP +FLIPBOOK +FLIPBOOKS +FLIPFLOP +FLIPFLOPPED +FLIPFLOPPING +FLIPFLOPS +FLIPPANCIES +FLIPPANCY +FLIPPANT +FLIPPANTLY +FLIPPED +FLIPPER +FLIPPERS +FLIPPEST +FLIPPING +FLIPPY +FLIPS +FLIR +FLIRS +FLIRT +FLIRTATION +FLIRTATIONS +FLIRTATIOUS +FLIRTATIOUSLY +FLIRTATIOUSNESS +FLIRTED +FLIRTER +FLIRTERS +FLIRTIER +FLIRTIEST +FLIRTING +FLIRTS +FLIRTY +FLIT +FLITCH +FLITCHED +FLITCHES +FLITCHING +FLITE +FLITED +FLITES +FLITING +FLITS +FLITTED +FLITTER +FLITTERED +FLITTERING +FLITTERS +FLITTING +FLIVVER +FLIVVERS +FLOAT +FLOATABLE +FLOATAGE +FLOATAGES +FLOATATION +FLOATATIONS +FLOATED +FLOATEL +FLOATELS +FLOATER +FLOATERS +FLOATIER +FLOATIEST +FLOATING +FLOATPLANE +FLOATPLANES +FLOATS +FLOATY +FLOC +FLOCCED +FLOCCI +FLOCCING +FLOCCOSE +FLOCCULANT +FLOCCULANTS +FLOCCULATE +FLOCCULATED +FLOCCULATES +FLOCCULATING +FLOCCULATION +FLOCCULATIONS +FLOCCULATOR +FLOCCULATORS +FLOCCULE +FLOCCULENT +FLOCCULES +FLOCCULI +FLOCCULUS +FLOCCUS +FLOCK +FLOCKED +FLOCKIER +FLOCKIEST +FLOCKING +FLOCKINGS +FLOCKLESS +FLOCKS +FLOCKY +FLOCS +FLOE +FLOES +FLOG +FLOGGABLE +FLOGGED +FLOGGER +FLOGGERS +FLOGGING +FLOGGINGS +FLOGS +FLOKATI +FLOKATIS +FLONG +FLONGS +FLOOD +FLOODABLE +FLOODED +FLOODER +FLOODERS +FLOODGATE +FLOODGATES +FLOODING +FLOODLIGHT +FLOODLIGHTED +FLOODLIGHTING +FLOODLIGHTS +FLOODLIT +FLOODPLAIN +FLOODPLAINS +FLOODS +FLOODTIDE +FLOODTIDES +FLOODWALL +FLOODWALLS +FLOODWATER +FLOODWATERS +FLOODWAY +FLOODWAYS +FLOOEY +FLOOIE +FLOOR +FLOORAGE +FLOORAGES +FLOORBOARD +FLOORBOARDS +FLOORCLOTH +FLOORCLOTHS +FLOORED +FLOORER +FLOORERS +FLOORING +FLOORINGS +FLOORLESS +FLOORS +FLOORSHOW +FLOORSHOWS +FLOORWALKER +FLOORWALKERS +FLOOSIE +FLOOSIES +FLOOSY +FLOOZIE +FLOOZIES +FLOOZY +FLOP +FLOPHOUSE +FLOPHOUSES +FLOPOVER +FLOPOVERS +FLOPPED +FLOPPER +FLOPPERS +FLOPPIER +FLOPPIES +FLOPPIEST +FLOPPILY +FLOPPINESS +FLOPPINESSES +FLOPPING +FLOPPY +FLOPS +FLORA +FLORAE +FLORAL +FLORALLY +FLORALS +FLORAS +FLOREATED +FLORENCE +FLORENCES +FLORESCENCE +FLORESCENCES +FLORESCENT +FLORET +FLORETS +FLORIATED +FLORIATION +FLORIATIONS +FLORIBUNDA +FLORIBUNDAS +FLORICANE +FLORICANES +FLORICULTURAL +FLORICULTURE +FLORICULTURES +FLORICULTURIST +FLORICULTURISTS +FLORID +FLORIDITIES +FLORIDITY +FLORIDLY +FLORIDNESS +FLORIDNESSES +FLORIFEROUS +FLORIFEROUSNESS +FLORIGEN +FLORIGENIC +FLORIGENS +FLORILEGIA +FLORILEGIUM +FLORIN +FLORINS +FLORIST +FLORISTIC +FLORISTICALLY +FLORISTRIES +FLORISTRY +FLORISTS +FLORUIT +FLORUITS +FLOSS +FLOSSED +FLOSSER +FLOSSERS +FLOSSES +FLOSSIE +FLOSSIER +FLOSSIES +FLOSSIEST +FLOSSILY +FLOSSING +FLOSSY +FLOTA +FLOTAGE +FLOTAGES +FLOTAS +FLOTATION +FLOTATIONS +FLOTILLA +FLOTILLAS +FLOTSAM +FLOTSAMS +FLOUNCE +FLOUNCED +FLOUNCES +FLOUNCIER +FLOUNCIEST +FLOUNCING +FLOUNCINGS +FLOUNCY +FLOUNDER +FLOUNDERED +FLOUNDERING +FLOUNDERS +FLOUR +FLOURED +FLOURING +FLOURISH +FLOURISHED +FLOURISHER +FLOURISHERS +FLOURISHES +FLOURISHING +FLOURISHINGLY +FLOURLESS +FLOURS +FLOURY +FLOUT +FLOUTED +FLOUTER +FLOUTERS +FLOUTING +FLOUTS +FLOW +FLOWAGE +FLOWAGES +FLOWCHART +FLOWCHARTING +FLOWCHARTINGS +FLOWCHARTS +FLOWED +FLOWER +FLOWERAGE +FLOWERAGES +FLOWERED +FLOWERER +FLOWERERS +FLOWERET +FLOWERETS +FLOWERETTE +FLOWERETTES +FLOWERFUL +FLOWERIER +FLOWERIEST +FLOWERILY +FLOWERINESS +FLOWERINESSES +FLOWERING +FLOWERLESS +FLOWERLIKE +FLOWERPOT +FLOWERPOTS +FLOWERS +FLOWERY +FLOWING +FLOWINGLY +FLOWMETER +FLOWMETERS +FLOWN +FLOWS +FLOWSTONE +FLOWSTONES +FLU +FLUB +FLUBBED +FLUBBER +FLUBBERS +FLUBBING +FLUBDUB +FLUBDUBS +FLUBS +FLUCTUANT +FLUCTUATE +FLUCTUATED +FLUCTUATES +FLUCTUATING +FLUCTUATION +FLUCTUATIONAL +FLUCTUATIONS +FLUE +FLUED +FLUEGELHORN +FLUEGELHORNS +FLUENCIES +FLUENCY +FLUENT +FLUENTLY +FLUERIC +FLUERICS +FLUES +FLUFF +FLUFFED +FLUFFER +FLUFFERS +FLUFFIER +FLUFFIEST +FLUFFILY +FLUFFINESS +FLUFFINESSES +FLUFFING +FLUFFS +FLUFFY +FLUGELHORN +FLUGELHORNIST +FLUGELHORNISTS +FLUGELHORNS +FLUID +FLUIDAL +FLUIDALLY +FLUIDEXTRACT +FLUIDEXTRACTS +FLUIDIC +FLUIDICS +FLUIDISE +FLUIDISED +FLUIDISES +FLUIDISING +FLUIDITIES +FLUIDITY +FLUIDIZATION +FLUIDIZATIONS +FLUIDIZE +FLUIDIZED +FLUIDIZER +FLUIDIZERS +FLUIDIZES +FLUIDIZING +FLUIDLIKE +FLUIDLY +FLUIDNESS +FLUIDNESSES +FLUIDRAM +FLUIDRAMS +FLUIDS +FLUISH +FLUKE +FLUKED +FLUKES +FLUKEY +FLUKIER +FLUKIEST +FLUKILY +FLUKINESS +FLUKINESSES +FLUKING +FLUKY +FLUME +FLUMED +FLUMES +FLUMING +FLUMMERIES +FLUMMERY +FLUMMOX +FLUMMOXED +FLUMMOXES +FLUMMOXING +FLUMP +FLUMPED +FLUMPING +FLUMPS +FLUNG +FLUNK +FLUNKED +FLUNKER +FLUNKERS +FLUNKEY +FLUNKEYS +FLUNKIE +FLUNKIES +FLUNKING +FLUNKS +FLUNKY +FLUNKYISM +FLUNKYISMS +FLUOR +FLUORENE +FLUORENES +FLUORESCE +FLUORESCED +FLUORESCEIN +FLUORESCEINS +FLUORESCENCE +FLUORESCENCES +FLUORESCENT +FLUORESCENTS +FLUORESCER +FLUORESCERS +FLUORESCES +FLUORESCING +FLUORIC +FLUORID +FLUORIDATE +FLUORIDATED +FLUORIDATES +FLUORIDATING +FLUORIDATION +FLUORIDATIONS +FLUORIDE +FLUORIDES +FLUORIDS +FLUORIMETER +FLUORIMETERS +FLUORIMETRIC +FLUORIMETRIES +FLUORIMETRY +FLUORIN +FLUORINATE +FLUORINATED +FLUORINATES +FLUORINATING +FLUORINATION +FLUORINATIONS +FLUORINE +FLUORINES +FLUORINS +FLUORITE +FLUORITES +FLUOROCARBON +FLUOROCARBONS +FLUOROCHROME +FLUOROCHROMES +FLUOROGRAPHIC +FLUOROGRAPHIES +FLUOROGRAPHY +FLUOROMETER +FLUOROMETERS +FLUOROMETRIC +FLUOROMETRIES +FLUOROMETRY +FLUOROSCOPE +FLUOROSCOPED +FLUOROSCOPES +FLUOROSCOPIC +FLUOROSCOPIES +FLUOROSCOPING +FLUOROSCOPIST +FLUOROSCOPISTS +FLUOROSCOPY +FLUOROSES +FLUOROSIS +FLUOROTIC +FLUOROURACIL +FLUOROURACILS +FLUORS +FLUORSPAR +FLUORSPARS +FLUOXETINE +FLUOXETINES +FLUPHENAZINE +FLUPHENAZINES +FLURRIED +FLURRIES +FLURRY +FLURRYING +FLUS +FLUSH +FLUSHABLE +FLUSHED +FLUSHER +FLUSHERS +FLUSHES +FLUSHEST +FLUSHING +FLUSHNESS +FLUSHNESSES +FLUSTER +FLUSTERED +FLUSTEREDLY +FLUSTERING +FLUSTERS +FLUTE +FLUTED +FLUTELIKE +FLUTER +FLUTERS +FLUTES +FLUTEY +FLUTIER +FLUTIEST +FLUTING +FLUTINGS +FLUTIST +FLUTISTS +FLUTTER +FLUTTERBOARD +FLUTTERBOARDS +FLUTTERED +FLUTTERER +FLUTTERERS +FLUTTERING +FLUTTERS +FLUTTERY +FLUTY +FLUVIAL +FLUVIATILE +FLUX +FLUXED +FLUXES +FLUXGATE +FLUXGATES +FLUXING +FLUXION +FLUXIONAL +FLUXIONS +FLUYT +FLUYTS +FLY +FLYABLE +FLYAWAY +FLYAWAYS +FLYBELT +FLYBELTS +FLYBLEW +FLYBLOW +FLYBLOWING +FLYBLOWN +FLYBLOWS +FLYBOAT +FLYBOATS +FLYBOY +FLYBOYS +FLYBRIDGE +FLYBRIDGES +FLYBY +FLYBYS +FLYCATCHER +FLYCATCHERS +FLYER +FLYERS +FLYING +FLYINGS +FLYLEAF +FLYLEAVES +FLYLESS +FLYMAN +FLYMEN +FLYOFF +FLYOFFS +FLYOVER +FLYOVERS +FLYPAPER +FLYPAPERS +FLYPAST +FLYPASTS +FLYRODDER +FLYRODDERS +FLYSCH +FLYSCHES +FLYSHEET +FLYSHEETS +FLYSPECK +FLYSPECKED +FLYSPECKING +FLYSPECKS +FLYSWATTER +FLYSWATTERS +FLYTE +FLYTED +FLYTES +FLYTIER +FLYTIERS +FLYTING +FLYTINGS +FLYTRAP +FLYTRAPS +FLYWAY +FLYWAYS +FLYWEIGHT +FLYWEIGHTS +FLYWHEEL +FLYWHEELS +FOAL +FOALED +FOALING +FOALS +FOAM +FOAMABLE +FOAMED +FOAMER +FOAMERS +FOAMFLOWER +FOAMFLOWERS +FOAMIER +FOAMIEST +FOAMILY +FOAMINESS +FOAMINESSES +FOAMING +FOAMLESS +FOAMLIKE +FOAMS +FOAMY +FOB +FOBBED +FOBBING +FOBS +FOCACCIA +FOCACCIAS +FOCAL +FOCALISE +FOCALISED +FOCALISES +FOCALISING +FOCALIZATION +FOCALIZATIONS +FOCALIZE +FOCALIZED +FOCALIZES +FOCALIZING +FOCALLY +FOCI +FOCUS +FOCUSABLE +FOCUSED +FOCUSER +FOCUSERS +FOCUSES +FOCUSING +FOCUSLESS +FOCUSSED +FOCUSSES +FOCUSSING +FODDER +FODDERED +FODDERING +FODDERS +FODGEL +FOE +FOEHN +FOEHNS +FOEMAN +FOEMEN +FOES +FOETAL +FOETID +FOETOR +FOETORS +FOETUS +FOETUSES +FOG +FOGBOUND +FOGBOW +FOGBOWS +FOGDOG +FOGDOGS +FOGEY +FOGEYISH +FOGEYISM +FOGEYISMS +FOGEYS +FOGFRUIT +FOGFRUITS +FOGGAGE +FOGGAGES +FOGGED +FOGGER +FOGGERS +FOGGIER +FOGGIEST +FOGGILY +FOGGINESS +FOGGINESSES +FOGGING +FOGGY +FOGHORN +FOGHORNS +FOGIE +FOGIES +FOGLESS +FOGS +FOGY +FOGYISH +FOGYISM +FOGYISMS +FOH +FOHN +FOHNS +FOIBLE +FOIBLES +FOIL +FOILABLE +FOILED +FOILING +FOILS +FOILSMAN +FOILSMEN +FOIN +FOINED +FOINING +FOINS +FOISON +FOISONS +FOIST +FOISTED +FOISTING +FOISTS +FOLACIN +FOLACINS +FOLATE +FOLATES +FOLD +FOLDABLE +FOLDAWAY +FOLDAWAYS +FOLDBOAT +FOLDBOATS +FOLDED +FOLDER +FOLDEROL +FOLDEROLS +FOLDERS +FOLDING +FOLDOUT +FOLDOUTS +FOLDS +FOLDUP +FOLDUPS +FOLEY +FOLEYS +FOLIA +FOLIACEOUS +FOLIAGE +FOLIAGED +FOLIAGES +FOLIAR +FOLIATE +FOLIATED +FOLIATES +FOLIATING +FOLIATION +FOLIATIONS +FOLIC +FOLIO +FOLIOED +FOLIOING +FOLIOLATE +FOLIOS +FOLIOSE +FOLIOUS +FOLIUM +FOLIUMS +FOLK +FOLKIE +FOLKIER +FOLKIES +FOLKIEST +FOLKISH +FOLKISHNESS +FOLKISHNESSES +FOLKLIFE +FOLKLIKE +FOLKLIVES +FOLKLORE +FOLKLORES +FOLKLORIC +FOLKLORISH +FOLKLORIST +FOLKLORISTIC +FOLKLORISTS +FOLKMOOT +FOLKMOOTS +FOLKMOT +FOLKMOTE +FOLKMOTES +FOLKMOTS +FOLKS +FOLKSIER +FOLKSIEST +FOLKSILY +FOLKSINESS +FOLKSINESSES +FOLKSINGER +FOLKSINGERS +FOLKSINGING +FOLKSINGINGS +FOLKSONG +FOLKSONGS +FOLKSY +FOLKTALE +FOLKTALES +FOLKWAY +FOLKWAYS +FOLKY +FOLLES +FOLLICLE +FOLLICLES +FOLLICULAR +FOLLICULITIS +FOLLICULITISES +FOLLIES +FOLLIS +FOLLOW +FOLLOWED +FOLLOWER +FOLLOWERS +FOLLOWERSHIP +FOLLOWERSHIPS +FOLLOWING +FOLLOWINGS +FOLLOWS +FOLLOWUP +FOLLOWUPS +FOLLY +FOMENT +FOMENTATION +FOMENTATIONS +FOMENTED +FOMENTER +FOMENTERS +FOMENTING +FOMENTS +FOMITE +FOMITES +FON +FOND +FONDANT +FONDANTS +FONDED +FONDER +FONDEST +FONDING +FONDLE +FONDLED +FONDLER +FONDLERS +FONDLES +FONDLING +FONDLINGS +FONDLY +FONDNESS +FONDNESSES +FONDS +FONDU +FONDUE +FONDUED +FONDUEING +FONDUES +FONDUING +FONDUS +FONS +FONT +FONTAL +FONTANEL +FONTANELLE +FONTANELLES +FONTANELS +FONTINA +FONTINAS +FONTS +FOOD +FOODIE +FOODIES +FOODLESS +FOODLESSNESS +FOODLESSNESSES +FOODS +FOODSTUFF +FOODSTUFFS +FOODWAYS +FOOFARAW +FOOFARAWS +FOOL +FOOLED +FOOLERIES +FOOLERY +FOOLFISH +FOOLFISHES +FOOLHARDIER +FOOLHARDIEST +FOOLHARDILY +FOOLHARDINESS +FOOLHARDINESSES +FOOLHARDY +FOOLING +FOOLISH +FOOLISHER +FOOLISHEST +FOOLISHLY +FOOLISHNESS +FOOLISHNESSES +FOOLPROOF +FOOLS +FOOLSCAP +FOOLSCAPS +FOOSBALL +FOOSBALLS +FOOT +FOOTAGE +FOOTAGES +FOOTBAG +FOOTBAGS +FOOTBALL +FOOTBALLER +FOOTBALLERS +FOOTBALLS +FOOTBATH +FOOTBATHS +FOOTBOARD +FOOTBOARDS +FOOTBOY +FOOTBOYS +FOOTBRIDGE +FOOTBRIDGES +FOOTCLOTH +FOOTCLOTHS +FOOTDRAGGER +FOOTDRAGGERS +FOOTED +FOOTER +FOOTERS +FOOTFALL +FOOTFALLS +FOOTFAULT +FOOTFAULTED +FOOTFAULTING +FOOTFAULTS +FOOTGEAR +FOOTGEARS +FOOTHILL +FOOTHILLS +FOOTHOLD +FOOTHOLDS +FOOTIE +FOOTIER +FOOTIES +FOOTIEST +FOOTING +FOOTINGS +FOOTLAMBERT +FOOTLAMBERTS +FOOTLE +FOOTLED +FOOTLER +FOOTLERS +FOOTLES +FOOTLESS +FOOTLESSLY +FOOTLESSNESS +FOOTLESSNESSES +FOOTLIGHT +FOOTLIGHTS +FOOTLIKE +FOOTLING +FOOTLOCKER +FOOTLOCKERS +FOOTLOOSE +FOOTMAN +FOOTMARK +FOOTMARKS +FOOTMEN +FOOTNOTE +FOOTNOTED +FOOTNOTES +FOOTNOTING +FOOTPACE +FOOTPACES +FOOTPAD +FOOTPADS +FOOTPATH +FOOTPATHS +FOOTPRINT +FOOTPRINTS +FOOTRACE +FOOTRACES +FOOTREST +FOOTRESTS +FOOTROPE +FOOTROPES +FOOTS +FOOTSIE +FOOTSIES +FOOTSLOG +FOOTSLOGGED +FOOTSLOGGER +FOOTSLOGGERS +FOOTSLOGGING +FOOTSLOGS +FOOTSORE +FOOTSORENESS +FOOTSORENESSES +FOOTSTALK +FOOTSTALKS +FOOTSTALL +FOOTSTALLS +FOOTSTEP +FOOTSTEPS +FOOTSTOCK +FOOTSTOCKS +FOOTSTONE +FOOTSTONES +FOOTSTOOL +FOOTSTOOLS +FOOTSY +FOOTWALL +FOOTWALLS +FOOTWAY +FOOTWAYS +FOOTWEAR +FOOTWORK +FOOTWORKS +FOOTWORN +FOOTY +FOOZLE +FOOZLED +FOOZLER +FOOZLERS +FOOZLES +FOOZLING +FOP +FOPPED +FOPPERIES +FOPPERY +FOPPING +FOPPISH +FOPPISHLY +FOPPISHNESS +FOPPISHNESSES +FOPS +FOR +FORA +FORAGE +FORAGED +FORAGER +FORAGERS +FORAGES +FORAGING +FORAM +FORAMEN +FORAMENS +FORAMINA +FORAMINAL +FORAMINIFER +FORAMINIFERA +FORAMINIFERAL +FORAMINIFERAN +FORAMINIFERANS +FORAMINIFERS +FORAMINOUS +FORAMS +FORASMUCH +FORAY +FORAYED +FORAYER +FORAYERS +FORAYING +FORAYS +FORB +FORBAD +FORBADE +FORBARE +FORBEAR +FORBEARANCE +FORBEARANCES +FORBEARER +FORBEARERS +FORBEARING +FORBEARS +FORBID +FORBIDAL +FORBIDALS +FORBIDDANCE +FORBIDDANCES +FORBIDDEN +FORBIDDER +FORBIDDERS +FORBIDDING +FORBIDDINGLY +FORBIDS +FORBODE +FORBODED +FORBODES +FORBODING +FORBORE +FORBORNE +FORBS +FORBY +FORBYE +FORCE +FORCEABLE +FORCED +FORCEDLY +FORCEFUL +FORCEFULLY +FORCEFULNESS +FORCEFULNESSES +FORCELESS +FORCEMEAT +FORCEMEATS +FORCEPS +FORCEPSLIKE +FORCER +FORCERS +FORCES +FORCIBLE +FORCIBLENESS +FORCIBLENESSES +FORCIBLY +FORCING +FORCIPES +FORD +FORDABLE +FORDED +FORDID +FORDING +FORDLESS +FORDO +FORDOES +FORDOING +FORDONE +FORDS +FORE +FOREARM +FOREARMED +FOREARMING +FOREARMS +FOREBAY +FOREBAYS +FOREBEAR +FOREBEARS +FOREBODE +FOREBODED +FOREBODER +FOREBODERS +FOREBODES +FOREBODIES +FOREBODING +FOREBODINGLY +FOREBODINGNESS +FOREBODINGS +FOREBODY +FOREBOOM +FOREBOOMS +FOREBRAIN +FOREBRAINS +FOREBY +FOREBYE +FORECADDIE +FORECADDIES +FORECAST +FORECASTABLE +FORECASTED +FORECASTER +FORECASTERS +FORECASTING +FORECASTLE +FORECASTLES +FORECASTS +FORECHECK +FORECHECKED +FORECHECKER +FORECHECKERS +FORECHECKING +FORECHECKS +FORECLOSE +FORECLOSED +FORECLOSES +FORECLOSING +FORECLOSURE +FORECLOSURES +FORECOURT +FORECOURTS +FOREDATE +FOREDATED +FOREDATES +FOREDATING +FOREDECK +FOREDECKS +FOREDID +FOREDO +FOREDOES +FOREDOING +FOREDONE +FOREDOOM +FOREDOOMED +FOREDOOMING +FOREDOOMS +FOREFACE +FOREFACES +FOREFATHER +FOREFATHERS +FOREFEEL +FOREFEELING +FOREFEELS +FOREFEET +FOREFELT +FOREFEND +FOREFENDED +FOREFENDING +FOREFENDS +FOREFINGER +FOREFINGERS +FOREFOOT +FOREFRONT +FOREFRONTS +FOREGATHER +FOREGATHERED +FOREGATHERING +FOREGATHERS +FOREGO +FOREGOER +FOREGOERS +FOREGOES +FOREGOING +FOREGONE +FOREGROUND +FOREGROUNDED +FOREGROUNDING +FOREGROUNDS +FOREGUT +FOREGUTS +FOREHAND +FOREHANDED +FOREHANDEDLY +FOREHANDEDNESS +FOREHANDS +FOREHEAD +FOREHEADS +FOREHOOF +FOREHOOFS +FOREHOOVES +FOREIGN +FOREIGNER +FOREIGNERS +FOREIGNISM +FOREIGNISMS +FOREIGNNESS +FOREIGNNESSES +FOREJUDGE +FOREJUDGED +FOREJUDGES +FOREJUDGING +FOREKNEW +FOREKNOW +FOREKNOWING +FOREKNOWLEDGE +FOREKNOWLEDGES +FOREKNOWN +FOREKNOWS +FORELADIES +FORELADY +FORELAND +FORELANDS +FORELEG +FORELEGS +FORELIMB +FORELIMBS +FORELOCK +FORELOCKED +FORELOCKING +FORELOCKS +FOREMAN +FOREMANSHIP +FOREMANSHIPS +FOREMAST +FOREMASTS +FOREMEN +FOREMILK +FOREMILKS +FOREMOST +FOREMOTHER +FOREMOTHERS +FORENAME +FORENAMED +FORENAMES +FORENOON +FORENOONS +FORENSIC +FORENSICALLY +FORENSICS +FOREORDAIN +FOREORDAINED +FOREORDAINING +FOREORDAINS +FOREORDINATION +FOREORDINATIONS +FOREPART +FOREPARTS +FOREPASSED +FOREPAST +FOREPAW +FOREPAWS +FOREPEAK +FOREPEAKS +FOREPLAY +FOREPLAYS +FOREQUARTER +FOREQUARTERS +FORERAN +FORERANK +FORERANKS +FOREREACH +FOREREACHED +FOREREACHES +FOREREACHING +FORERUN +FORERUNNER +FORERUNNERS +FORERUNNING +FORERUNS +FORES +FORESAID +FORESAIL +FORESAILS +FORESAW +FORESEE +FORESEEABILITY +FORESEEABLE +FORESEEING +FORESEEN +FORESEER +FORESEERS +FORESEES +FORESHADOW +FORESHADOWED +FORESHADOWER +FORESHADOWERS +FORESHADOWING +FORESHADOWS +FORESHANK +FORESHANKS +FORESHEET +FORESHEETS +FORESHOCK +FORESHOCKS +FORESHORE +FORESHORES +FORESHORTEN +FORESHORTENED +FORESHORTENING +FORESHORTENS +FORESHOW +FORESHOWED +FORESHOWING +FORESHOWN +FORESHOWS +FORESIDE +FORESIDES +FORESIGHT +FORESIGHTED +FORESIGHTEDLY +FORESIGHTEDNESS +FORESIGHTFUL +FORESIGHTS +FORESKIN +FORESKINS +FORESPAKE +FORESPEAK +FORESPEAKING +FORESPEAKS +FORESPOKE +FORESPOKEN +FOREST +FORESTAGE +FORESTAGES +FORESTAL +FORESTALL +FORESTALLED +FORESTALLER +FORESTALLERS +FORESTALLING +FORESTALLMENT +FORESTALLMENTS +FORESTALLS +FORESTATION +FORESTATIONS +FORESTAY +FORESTAYS +FORESTAYSAIL +FORESTAYSAILS +FORESTED +FORESTER +FORESTERS +FORESTIAL +FORESTING +FORESTLAND +FORESTLANDS +FORESTRIES +FORESTRY +FORESTS +FORESWEAR +FORESWEARING +FORESWEARS +FORESWORE +FORESWORN +FORETASTE +FORETASTED +FORETASTES +FORETASTING +FORETEETH +FORETELL +FORETELLER +FORETELLERS +FORETELLING +FORETELLS +FORETHOUGHT +FORETHOUGHTFUL +FORETHOUGHTS +FORETIME +FORETIMES +FORETOKEN +FORETOKENED +FORETOKENING +FORETOKENS +FORETOLD +FORETOOTH +FORETOP +FORETOPMAN +FORETOPMEN +FORETOPS +FOREVER +FOREVERMORE +FOREVERNESS +FOREVERNESSES +FOREVERS +FOREWARN +FOREWARNED +FOREWARNING +FOREWARNS +FOREWENT +FOREWING +FOREWINGS +FOREWOMAN +FOREWOMEN +FOREWORD +FOREWORDS +FOREWORN +FOREYARD +FOREYARDS +FORFEIT +FORFEITABLE +FORFEITED +FORFEITER +FORFEITERS +FORFEITING +FORFEITS +FORFEITURE +FORFEITURES +FORFEND +FORFENDED +FORFENDING +FORFENDS +FORFICATE +FORGAT +FORGATHER +FORGATHERED +FORGATHERING +FORGATHERS +FORGAVE +FORGE +FORGEABILITIES +FORGEABILITY +FORGEABLE +FORGED +FORGER +FORGERIES +FORGERS +FORGERY +FORGES +FORGET +FORGETFUL +FORGETFULLY +FORGETFULNESS +FORGETFULNESSES +FORGETIVE +FORGETS +FORGETTABLE +FORGETTER +FORGETTERS +FORGETTING +FORGING +FORGINGS +FORGIVABLE +FORGIVABLY +FORGIVE +FORGIVEN +FORGIVENESS +FORGIVENESSES +FORGIVER +FORGIVERS +FORGIVES +FORGIVING +FORGIVINGLY +FORGIVINGNESS +FORGIVINGNESSES +FORGO +FORGOER +FORGOERS +FORGOES +FORGOING +FORGONE +FORGOT +FORGOTTEN +FORINT +FORINTS +FORJUDGE +FORJUDGED +FORJUDGES +FORJUDGING +FORK +FORKBALL +FORKBALLS +FORKED +FORKEDLY +FORKER +FORKERS +FORKFUL +FORKFULS +FORKIER +FORKIEST +FORKINESS +FORKINESSES +FORKING +FORKLESS +FORKLIFT +FORKLIFTED +FORKLIFTING +FORKLIFTS +FORKLIKE +FORKS +FORKSFUL +FORKY +FORLORN +FORLORNER +FORLORNEST +FORLORNLY +FORLORNNESS +FORLORNNESSES +FORM +FORMABILITIES +FORMABILITY +FORMABLE +FORMABLY +FORMAL +FORMALDEHYDE +FORMALDEHYDES +FORMALIN +FORMALINS +FORMALISE +FORMALISED +FORMALISES +FORMALISING +FORMALISM +FORMALISMS +FORMALIST +FORMALISTIC +FORMALISTS +FORMALITIES +FORMALITY +FORMALIZABLE +FORMALIZATION +FORMALIZATIONS +FORMALIZE +FORMALIZED +FORMALIZER +FORMALIZERS +FORMALIZES +FORMALIZING +FORMALLY +FORMALNESS +FORMALNESSES +FORMALS +FORMAMIDE +FORMAMIDES +FORMANT +FORMANTS +FORMAT +FORMATE +FORMATES +FORMATION +FORMATIONS +FORMATIVE +FORMATIVELY +FORMATIVES +FORMATS +FORMATTED +FORMATTER +FORMATTERS +FORMATTING +FORME +FORMED +FORMEE +FORMER +FORMERLY +FORMERS +FORMES +FORMFITTING +FORMFUL +FORMIC +FORMICA +FORMICARIES +FORMICARY +FORMICAS +FORMIDABILITIES +FORMIDABILITY +FORMIDABLE +FORMIDABLENESS +FORMIDABLY +FORMING +FORMLESS +FORMLESSLY +FORMLESSNESS +FORMLESSNESSES +FORMOL +FORMOLS +FORMS +FORMULA +FORMULAE +FORMULAIC +FORMULAICALLY +FORMULARIES +FORMULARIZATION +FORMULARIZE +FORMULARIZED +FORMULARIZER +FORMULARIZERS +FORMULARIZES +FORMULARIZING +FORMULARY +FORMULAS +FORMULATE +FORMULATED +FORMULATES +FORMULATING +FORMULATION +FORMULATIONS +FORMULATOR +FORMULATORS +FORMULISM +FORMULISMS +FORMULIST +FORMULISTS +FORMULIZE +FORMULIZED +FORMULIZES +FORMULIZING +FORMWORK +FORMWORKS +FORMYL +FORMYLS +FORNENT +FORNICAL +FORNICATE +FORNICATED +FORNICATES +FORNICATING +FORNICATION +FORNICATIONS +FORNICATOR +FORNICATORS +FORNICES +FORNIX +FORRADER +FORRARDER +FORRIT +FORSAKE +FORSAKEN +FORSAKER +FORSAKERS +FORSAKES +FORSAKING +FORSOOK +FORSOOTH +FORSPENT +FORSWEAR +FORSWEARING +FORSWEARS +FORSWORE +FORSWORN +FORSYTHIA +FORSYTHIAS +FORT +FORTALICE +FORTALICES +FORTE +FORTEPIANO +FORTEPIANOS +FORTES +FORTH +FORTHCOMING +FORTHRIGHT +FORTHRIGHTLY +FORTHRIGHTNESS +FORTHRIGHTS +FORTHWITH +FORTIES +FORTIETH +FORTIETHS +FORTIFICATION +FORTIFICATIONS +FORTIFIED +FORTIFIER +FORTIFIERS +FORTIFIES +FORTIFY +FORTIFYING +FORTIS +FORTISSIMI +FORTISSIMO +FORTISSIMOS +FORTITUDE +FORTITUDES +FORTNIGHT +FORTNIGHTLIES +FORTNIGHTLY +FORTNIGHTS +FORTRESS +FORTRESSED +FORTRESSES +FORTRESSING +FORTRESSLIKE +FORTS +FORTUITIES +FORTUITOUS +FORTUITOUSLY +FORTUITOUSNESS +FORTUITY +FORTUNATE +FORTUNATELY +FORTUNATENESS +FORTUNATENESSES +FORTUNATES +FORTUNE +FORTUNED +FORTUNES +FORTUNING +FORTY +FORTYISH +FORUM +FORUMS +FORWARD +FORWARDED +FORWARDER +FORWARDERS +FORWARDEST +FORWARDING +FORWARDLY +FORWARDNESS +FORWARDNESSES +FORWARDS +FORWENT +FORWHY +FORWORN +FORZANDI +FORZANDO +FORZANDOS +FOSCARNET +FOSCARNETS +FOSS +FOSSA +FOSSAE +FOSSAS +FOSSATE +FOSSE +FOSSES +FOSSETTE +FOSSETTES +FOSSICK +FOSSICKED +FOSSICKER +FOSSICKERS +FOSSICKING +FOSSICKS +FOSSIL +FOSSILIFEROUS +FOSSILISE +FOSSILISED +FOSSILISES +FOSSILISING +FOSSILIZATION +FOSSILIZATIONS +FOSSILIZE +FOSSILIZED +FOSSILIZES +FOSSILIZING +FOSSILS +FOSSORIAL +FOSTER +FOSTERAGE +FOSTERAGES +FOSTERED +FOSTERER +FOSTERERS +FOSTERING +FOSTERLING +FOSTERLINGS +FOSTERS +FOU +FOUETTE +FOUETTES +FOUGHT +FOUGHTEN +FOUL +FOULARD +FOULARDS +FOULBROOD +FOULBROODS +FOULED +FOULER +FOULEST +FOULING +FOULINGS +FOULLY +FOULMOUTHED +FOULNESS +FOULNESSES +FOULS +FOUND +FOUNDATION +FOUNDATIONAL +FOUNDATIONALLY +FOUNDATIONLESS +FOUNDATIONS +FOUNDED +FOUNDER +FOUNDERED +FOUNDERING +FOUNDERS +FOUNDING +FOUNDLING +FOUNDLINGS +FOUNDRIES +FOUNDRY +FOUNDS +FOUNT +FOUNTAIN +FOUNTAINED +FOUNTAINHEAD +FOUNTAINHEADS +FOUNTAINING +FOUNTAINS +FOUNTS +FOUR +FOURCHEE +FOURDRINIER +FOURDRINIERS +FOUREYED +FOURFOLD +FOURGON +FOURGONS +FOURPENCE +FOURPENCES +FOURPENNIES +FOURPENNY +FOURPLEX +FOURPLEXES +FOURRAGERE +FOURRAGERES +FOURS +FOURSCORE +FOURSOME +FOURSOMES +FOURSQUARE +FOURTEEN +FOURTEENER +FOURTEENERS +FOURTEENS +FOURTEENTH +FOURTEENTHS +FOURTH +FOURTHLY +FOURTHS +FOVEA +FOVEAE +FOVEAL +FOVEAS +FOVEATE +FOVEATED +FOVEIFORM +FOVEOLA +FOVEOLAE +FOVEOLAR +FOVEOLAS +FOVEOLATE +FOVEOLE +FOVEOLES +FOVEOLET +FOVEOLETS +FOWL +FOWLED +FOWLER +FOWLERS +FOWLING +FOWLINGS +FOWLPOX +FOWLPOXES +FOWLS +FOX +FOXED +FOXES +FOXFIRE +FOXFIRES +FOXFISH +FOXFISHES +FOXGLOVE +FOXGLOVES +FOXHOLE +FOXHOLES +FOXHOUND +FOXHOUNDS +FOXHUNT +FOXHUNTED +FOXHUNTER +FOXHUNTERS +FOXHUNTING +FOXHUNTINGS +FOXHUNTS +FOXIER +FOXIEST +FOXILY +FOXINESS +FOXINESSES +FOXING +FOXINGS +FOXLIKE +FOXSKIN +FOXSKINS +FOXTAIL +FOXTAILS +FOXTROT +FOXTROTS +FOXTROTTED +FOXTROTTING +FOXY +FOY +FOYER +FOYERS +FOYS +FOZIER +FOZIEST +FOZINESS +FOZINESSES +FOZY +FRABJOUS +FRACAS +FRACASES +FRACTAL +FRACTALS +FRACTED +FRACTI +FRACTION +FRACTIONAL +FRACTIONALIZE +FRACTIONALIZED +FRACTIONALIZES +FRACTIONALIZING +FRACTIONALLY +FRACTIONATE +FRACTIONATED +FRACTIONATES +FRACTIONATING +FRACTIONATION +FRACTIONATIONS +FRACTIONATOR +FRACTIONATORS +FRACTIONED +FRACTIONING +FRACTIONS +FRACTIOUS +FRACTIOUSLY +FRACTIOUSNESS +FRACTIOUSNESSES +FRACTUR +FRACTURAL +FRACTURE +FRACTURED +FRACTURER +FRACTURERS +FRACTURES +FRACTURING +FRACTURS +FRACTUS +FRAE +FRAENA +FRAENUM +FRAENUMS +FRAG +FRAGGED +FRAGGING +FRAGGINGS +FRAGILE +FRAGILELY +FRAGILITIES +FRAGILITY +FRAGMENT +FRAGMENTAL +FRAGMENTALLY +FRAGMENTARILY +FRAGMENTARINESS +FRAGMENTARY +FRAGMENTATE +FRAGMENTATED +FRAGMENTATES +FRAGMENTATING +FRAGMENTATION +FRAGMENTATIONS +FRAGMENTED +FRAGMENTING +FRAGMENTIZE +FRAGMENTIZED +FRAGMENTIZES +FRAGMENTIZING +FRAGMENTS +FRAGRANCE +FRAGRANCES +FRAGRANCIES +FRAGRANCY +FRAGRANT +FRAGRANTLY +FRAGS +FRAIL +FRAILER +FRAILEST +FRAILLY +FRAILNESS +FRAILNESSES +FRAILS +FRAILTIES +FRAILTY +FRAISE +FRAISES +FRAKTUR +FRAKTURS +FRAMABLE +FRAMBESIA +FRAMBESIAS +FRAMBOISE +FRAMBOISES +FRAME +FRAMEABLE +FRAMED +FRAMELESS +FRAMER +FRAMERS +FRAMES +FRAMESHIFT +FRAMESHIFTS +FRAMEWORK +FRAMEWORKS +FRAMING +FRAMINGS +FRANC +FRANCHISE +FRANCHISED +FRANCHISEE +FRANCHISEES +FRANCHISER +FRANCHISERS +FRANCHISES +FRANCHISING +FRANCHISOR +FRANCHISORS +FRANCIUM +FRANCIUMS +FRANCIZE +FRANCIZED +FRANCIZES +FRANCIZING +FRANCOLIN +FRANCOLINS +FRANCOPHONE +FRANCS +FRANGIBILITIES +FRANGIBILITY +FRANGIBLE +FRANGIPANE +FRANGIPANES +FRANGIPANI +FRANGIPANNI +FRANGLAIS +FRANK +FRANKABLE +FRANKED +FRANKER +FRANKERS +FRANKEST +FRANKFORT +FRANKFORTS +FRANKFURT +FRANKFURTER +FRANKFURTERS +FRANKFURTS +FRANKINCENSE +FRANKINCENSES +FRANKING +FRANKLIN +FRANKLINITE +FRANKLINITES +FRANKLINS +FRANKLY +FRANKNESS +FRANKNESSES +FRANKPLEDGE +FRANKPLEDGES +FRANKS +FRANSERIA +FRANSERIAS +FRANTIC +FRANTICALLY +FRANTICLY +FRANTICNESS +FRANTICNESSES +FRAP +FRAPPE +FRAPPED +FRAPPES +FRAPPING +FRAPS +FRASS +FRASSES +FRAT +FRATER +FRATERNAL +FRATERNALISM +FRATERNALISMS +FRATERNALLY +FRATERNITIES +FRATERNITY +FRATERNIZATION +FRATERNIZATIONS +FRATERNIZE +FRATERNIZED +FRATERNIZER +FRATERNIZERS +FRATERNIZES +FRATERNIZING +FRATERS +FRATRICIDAL +FRATRICIDE +FRATRICIDES +FRATS +FRAUD +FRAUDS +FRAUDSTER +FRAUDSTERS +FRAUDULENCE +FRAUDULENCES +FRAUDULENT +FRAUDULENTLY +FRAUDULENTNESS +FRAUGHT +FRAUGHTED +FRAUGHTING +FRAUGHTS +FRAULEIN +FRAULEINS +FRAXINELLA +FRAXINELLAS +FRAY +FRAYED +FRAYING +FRAYINGS +FRAYS +FRAZIL +FRAZILS +FRAZZLE +FRAZZLED +FRAZZLES +FRAZZLING +FREAK +FREAKED +FREAKIER +FREAKIEST +FREAKILY +FREAKINESS +FREAKINESSES +FREAKING +FREAKISH +FREAKISHLY +FREAKISHNESS +FREAKISHNESSES +FREAKOUT +FREAKOUTS +FREAKS +FREAKY +FRECKLE +FRECKLED +FRECKLES +FRECKLIER +FRECKLIEST +FRECKLING +FRECKLY +FREE +FREEBASE +FREEBASED +FREEBASER +FREEBASERS +FREEBASES +FREEBASING +FREEBEE +FREEBEES +FREEBIE +FREEBIES +FREEBOARD +FREEBOARDS +FREEBOOT +FREEBOOTED +FREEBOOTER +FREEBOOTERS +FREEBOOTING +FREEBOOTS +FREEBORN +FREED +FREEDMAN +FREEDMEN +FREEDOM +FREEDOMS +FREEDWOMAN +FREEDWOMEN +FREEFORM +FREEHAND +FREEHANDED +FREEHANDEDLY +FREEHANDEDNESS +FREEHEARTED +FREEHEARTEDLY +FREEHOLD +FREEHOLDER +FREEHOLDERS +FREEHOLDS +FREEING +FREELANCE +FREELANCED +FREELANCER +FREELANCERS +FREELANCES +FREELANCING +FREELOAD +FREELOADED +FREELOADER +FREELOADERS +FREELOADING +FREELOADS +FREELY +FREEMAN +FREEMARTIN +FREEMARTINS +FREEMASON +FREEMASONRIES +FREEMASONRY +FREEMASONS +FREEMEN +FREENESS +FREENESSES +FREER +FREERS +FREES +FREESIA +FREESIAS +FREEST +FREESTANDING +FREESTONE +FREESTONES +FREESTYLE +FREESTYLER +FREESTYLERS +FREESTYLES +FREETHINKER +FREETHINKERS +FREETHINKING +FREETHINKINGS +FREEWARE +FREEWARES +FREEWAY +FREEWAYS +FREEWHEEL +FREEWHEELED +FREEWHEELER +FREEWHEELERS +FREEWHEELING +FREEWHEELINGLY +FREEWHEELS +FREEWILL +FREEWRITE +FREEWRITES +FREEWRITING +FREEWRITINGS +FREEWRITTEN +FREEWROTE +FREEZABLE +FREEZE +FREEZER +FREEZERS +FREEZES +FREEZING +FREEZINGLY +FREIGHT +FREIGHTAGE +FREIGHTAGES +FREIGHTED +FREIGHTER +FREIGHTERS +FREIGHTING +FREIGHTS +FREMD +FREMITUS +FREMITUSES +FRENA +FRENCH +FRENCHED +FRENCHES +FRENCHIFICATION +FRENCHIFIED +FRENCHIFIES +FRENCHIFY +FRENCHIFYING +FRENCHING +FRENETIC +FRENETICALLY +FRENETICISM +FRENETICISMS +FRENETICS +FRENULA +FRENULAR +FRENULUM +FRENULUMS +FRENUM +FRENUMS +FRENZIED +FRENZIEDLY +FRENZIES +FRENZILY +FRENZY +FRENZYING +FREQUENCE +FREQUENCES +FREQUENCIES +FREQUENCY +FREQUENT +FREQUENTATION +FREQUENTATIONS +FREQUENTATIVE +FREQUENTATIVES +FREQUENTED +FREQUENTER +FREQUENTERS +FREQUENTEST +FREQUENTING +FREQUENTLY +FREQUENTNESS +FREQUENTNESSES +FREQUENTS +FRERE +FRERES +FRESCO +FRESCOED +FRESCOER +FRESCOERS +FRESCOES +FRESCOING +FRESCOIST +FRESCOISTS +FRESCOS +FRESH +FRESHED +FRESHEN +FRESHENED +FRESHENER +FRESHENERS +FRESHENING +FRESHENS +FRESHER +FRESHES +FRESHEST +FRESHET +FRESHETS +FRESHING +FRESHLY +FRESHMAN +FRESHMEN +FRESHNESS +FRESHNESSES +FRESHWATER +FRESHWATERS +FRESNEL +FRESNELS +FRET +FRETBOARD +FRETBOARDS +FRETFUL +FRETFULLY +FRETFULNESS +FRETFULNESSES +FRETLESS +FRETS +FRETSAW +FRETSAWS +FRETSOME +FRETTED +FRETTER +FRETTERS +FRETTIER +FRETTIEST +FRETTING +FRETTY +FRETWORK +FRETWORKS +FRIABILITIES +FRIABILITY +FRIABLE +FRIAR +FRIARBIRD +FRIARBIRDS +FRIARIES +FRIARLY +FRIARS +FRIARY +FRIBBLE +FRIBBLED +FRIBBLER +FRIBBLERS +FRIBBLES +FRIBBLING +FRICANDEAU +FRICANDEAUS +FRICANDO +FRICANDOES +FRICASSEE +FRICASSEED +FRICASSEEING +FRICASSEES +FRICATIVE +FRICATIVES +FRICTION +FRICTIONAL +FRICTIONALLY +FRICTIONLESS +FRICTIONLESSLY +FRICTIONS +FRIDGE +FRIDGES +FRIED +FRIEDCAKE +FRIEDCAKES +FRIEND +FRIENDED +FRIENDING +FRIENDLESS +FRIENDLESSNESS +FRIENDLIER +FRIENDLIES +FRIENDLIEST +FRIENDLILY +FRIENDLINESS +FRIENDLINESSES +FRIENDLY +FRIENDS +FRIENDSHIP +FRIENDSHIPS +FRIER +FRIERS +FRIES +FRIEZE +FRIEZELIKE +FRIEZES +FRIG +FRIGATE +FRIGATES +FRIGES +FRIGGED +FRIGGING +FRIGHT +FRIGHTED +FRIGHTEN +FRIGHTENED +FRIGHTENING +FRIGHTENINGLY +FRIGHTENS +FRIGHTFUL +FRIGHTFULLY +FRIGHTFULNESS +FRIGHTFULNESSES +FRIGHTING +FRIGHTS +FRIGID +FRIGIDITIES +FRIGIDITY +FRIGIDLY +FRIGIDNESS +FRIGIDNESSES +FRIGORIFIC +FRIGS +FRIJOL +FRIJOLE +FRIJOLES +FRILL +FRILLED +FRILLER +FRILLERS +FRILLIER +FRILLIEST +FRILLING +FRILLINGS +FRILLS +FRILLY +FRINGE +FRINGED +FRINGES +FRINGIER +FRINGIEST +FRINGING +FRINGY +FRIPPERIES +FRIPPERY +FRISBEE +FRISBEES +FRISE +FRISEE +FRISEES +FRISES +FRISETTE +FRISETTES +FRISEUR +FRISEURS +FRISK +FRISKED +FRISKER +FRISKERS +FRISKET +FRISKETS +FRISKIER +FRISKIEST +FRISKILY +FRISKINESS +FRISKINESSES +FRISKING +FRISKS +FRISKY +FRISSON +FRISSONS +FRIT +FRITES +FRITH +FRITHS +FRITILLARIA +FRITILLARIAS +FRITILLARIES +FRITILLARY +FRITS +FRITT +FRITTATA +FRITTATAS +FRITTED +FRITTER +FRITTERED +FRITTERER +FRITTERERS +FRITTERING +FRITTERS +FRITTING +FRITTS +FRITZ +FRITZES +FRIVOL +FRIVOLED +FRIVOLER +FRIVOLERS +FRIVOLING +FRIVOLITIES +FRIVOLITY +FRIVOLLED +FRIVOLLER +FRIVOLLERS +FRIVOLLING +FRIVOLOUS +FRIVOLOUSLY +FRIVOLOUSNESS +FRIVOLOUSNESSES +FRIVOLS +FRIZ +FRIZED +FRIZER +FRIZERS +FRIZES +FRIZETTE +FRIZETTES +FRIZING +FRIZZ +FRIZZED +FRIZZER +FRIZZERS +FRIZZES +FRIZZIER +FRIZZIES +FRIZZIEST +FRIZZILY +FRIZZINESS +FRIZZINESSES +FRIZZING +FRIZZLE +FRIZZLED +FRIZZLER +FRIZZLERS +FRIZZLES +FRIZZLIER +FRIZZLIEST +FRIZZLING +FRIZZLY +FRIZZY +FRO +FROCK +FROCKED +FROCKING +FROCKLESS +FROCKS +FROE +FROES +FROG +FROGEYE +FROGEYED +FROGEYES +FROGFISH +FROGFISHES +FROGGED +FROGGIER +FROGGIEST +FROGGING +FROGGY +FROGHOPPER +FROGHOPPERS +FROGLET +FROGLETS +FROGLIKE +FROGMAN +FROGMARCH +FROGMARCHED +FROGMARCHES +FROGMARCHING +FROGMEN +FROGS +FROLIC +FROLICKED +FROLICKER +FROLICKERS +FROLICKING +FROLICKY +FROLICS +FROLICSOME +FROM +FROMAGE +FROMAGES +FROMENTIES +FROMENTY +FROND +FRONDED +FRONDEUR +FRONDEURS +FRONDOSE +FRONDS +FRONS +FRONT +FRONTAGE +FRONTAGES +FRONTAL +FRONTALITIES +FRONTALITY +FRONTALLY +FRONTALS +FRONTCOURT +FRONTCOURTS +FRONTED +FRONTENIS +FRONTENISES +FRONTER +FRONTES +FRONTIER +FRONTIERS +FRONTIERSMAN +FRONTIERSMEN +FRONTING +FRONTISPIECE +FRONTISPIECES +FRONTLESS +FRONTLET +FRONTLETS +FRONTLINE +FRONTLINES +FRONTLIST +FRONTLISTS +FRONTMAN +FRONTMEN +FRONTOGENESES +FRONTOGENESIS +FRONTOLYSES +FRONTOLYSIS +FRONTON +FRONTONS +FRONTPAGE +FRONTPAGED +FRONTPAGES +FRONTPAGING +FRONTS +FRONTWARD +FRONTWARDS +FRORE +FROSH +FROST +FROSTBIT +FROSTBITE +FROSTBITES +FROSTBITING +FROSTBITINGS +FROSTBITTEN +FROSTED +FROSTEDS +FROSTFISH +FROSTFISHES +FROSTIER +FROSTIEST +FROSTILY +FROSTINESS +FROSTINESSES +FROSTING +FROSTINGS +FROSTLESS +FROSTLINE +FROSTLINES +FROSTNIP +FROSTNIPS +FROSTS +FROSTWORK +FROSTWORKS +FROSTY +FROTH +FROTHED +FROTHER +FROTHERS +FROTHIER +FROTHIEST +FROTHILY +FROTHINESS +FROTHINESSES +FROTHING +FROTHS +FROTHY +FROTTAGE +FROTTAGES +FROTTEUR +FROTTEURS +FROUFROU +FROUFROUS +FROUNCE +FROUNCED +FROUNCES +FROUNCING +FROUZIER +FROUZIEST +FROUZY +FROW +FROWARD +FROWARDLY +FROWARDNESS +FROWARDNESSES +FROWN +FROWNED +FROWNER +FROWNERS +FROWNING +FROWNINGLY +FROWNS +FROWS +FROWSIER +FROWSIEST +FROWST +FROWSTED +FROWSTIER +FROWSTIEST +FROWSTING +FROWSTS +FROWSTY +FROWSY +FROWZIER +FROWZIEST +FROWZILY +FROWZY +FROZE +FROZEN +FROZENLY +FROZENNESS +FROZENNESSES +FRUCTIFICATION +FRUCTIFICATIONS +FRUCTIFIED +FRUCTIFIES +FRUCTIFY +FRUCTIFYING +FRUCTOSE +FRUCTOSES +FRUCTUOUS +FRUG +FRUGAL +FRUGALITIES +FRUGALITY +FRUGALLY +FRUGGED +FRUGGING +FRUGIVORE +FRUGIVORES +FRUGIVOROUS +FRUGS +FRUIT +FRUITAGE +FRUITAGES +FRUITARIAN +FRUITARIANS +FRUITCAKE +FRUITCAKES +FRUITED +FRUITER +FRUITERER +FRUITERERS +FRUITERS +FRUITFUL +FRUITFULLER +FRUITFULLEST +FRUITFULLY +FRUITFULNESS +FRUITFULNESSES +FRUITIER +FRUITIEST +FRUITILY +FRUITINESS +FRUITINESSES +FRUITING +FRUITION +FRUITIONS +FRUITLESS +FRUITLESSLY +FRUITLESSNESS +FRUITLESSNESSES +FRUITLET +FRUITLETS +FRUITLIKE +FRUITS +FRUITWOOD +FRUITWOODS +FRUITY +FRUMENTIES +FRUMENTY +FRUMP +FRUMPIER +FRUMPIEST +FRUMPILY +FRUMPISH +FRUMPS +FRUMPY +FRUSTA +FRUSTRATE +FRUSTRATED +FRUSTRATES +FRUSTRATING +FRUSTRATINGLY +FRUSTRATION +FRUSTRATIONS +FRUSTULE +FRUSTULES +FRUSTUM +FRUSTUMS +FRUTESCENT +FRUTICOSE +FRY +FRYABLE +FRYBREAD +FRYBREADS +FRYER +FRYERS +FRYING +FRYPAN +FRYPANS +FUB +FUBAR +FUBBED +FUBBING +FUBS +FUBSIER +FUBSIEST +FUBSY +FUCHSIA +FUCHSIAS +FUCHSIN +FUCHSINE +FUCHSINES +FUCHSINS +FUCI +FUCK +FUCKED +FUCKER +FUCKERS +FUCKING +FUCKOFF +FUCKOFFS +FUCKS +FUCKUP +FUCKUPS +FUCOID +FUCOIDAL +FUCOIDS +FUCOSE +FUCOSES +FUCOUS +FUCOXANTHIN +FUCOXANTHINS +FUCUS +FUCUSES +FUD +FUDDIES +FUDDLE +FUDDLED +FUDDLES +FUDDLING +FUDDY +FUDGE +FUDGED +FUDGES +FUDGING +FUDS +FUEHRER +FUEHRERS +FUEL +FUELED +FUELER +FUELERS +FUELING +FUELLED +FUELLER +FUELLERS +FUELLING +FUELS +FUELWOOD +FUELWOODS +FUG +FUGACIOUS +FUGACITIES +FUGACITY +FUGAL +FUGALLY +FUGATO +FUGATOS +FUGGED +FUGGIER +FUGGIEST +FUGGILY +FUGGING +FUGGY +FUGIO +FUGIOS +FUGITIVE +FUGITIVELY +FUGITIVENESS +FUGITIVENESSES +FUGITIVES +FUGLE +FUGLED +FUGLEMAN +FUGLEMEN +FUGLES +FUGLING +FUGS +FUGU +FUGUE +FUGUED +FUGUELIKE +FUGUES +FUGUING +FUGUIST +FUGUISTS +FUGUS +FUHRER +FUHRERS +FUJI +FUJIS +FULCRA +FULCRUM +FULCRUMS +FULFIL +FULFILL +FULFILLED +FULFILLER +FULFILLERS +FULFILLING +FULFILLMENT +FULFILLMENTS +FULFILLS +FULFILMENT +FULFILMENTS +FULFILS +FULGENT +FULGENTLY +FULGID +FULGURANT +FULGURATE +FULGURATED +FULGURATES +FULGURATING +FULGURATION +FULGURATIONS +FULGURITE +FULGURITES +FULGUROUS +FULHAM +FULHAMS +FULIGINOUS +FULIGINOUSLY +FULL +FULLAM +FULLAMS +FULLBACK +FULLBACKS +FULLBLOOD +FULLBLOODS +FULLED +FULLER +FULLERED +FULLERENE +FULLERENES +FULLERIES +FULLERING +FULLERS +FULLERY +FULLEST +FULLFACE +FULLFACES +FULLING +FULLMOUTHED +FULLNESS +FULLNESSES +FULLS +FULLY +FULMAR +FULMARS +FULMINANT +FULMINATE +FULMINATED +FULMINATES +FULMINATING +FULMINATION +FULMINATIONS +FULMINE +FULMINED +FULMINES +FULMINIC +FULMINING +FULNESS +FULNESSES +FULSOME +FULSOMELY +FULSOMENESS +FULSOMENESSES +FULVOUS +FUMARASE +FUMARASES +FUMARATE +FUMARATES +FUMARIC +FUMAROLE +FUMAROLES +FUMAROLIC +FUMATORIES +FUMATORY +FUMBLE +FUMBLED +FUMBLER +FUMBLERS +FUMBLES +FUMBLING +FUMBLINGLY +FUME +FUMED +FUMELESS +FUMELIKE +FUMER +FUMERS +FUMES +FUMET +FUMETS +FUMETTE +FUMETTES +FUMIER +FUMIEST +FUMIGANT +FUMIGANTS +FUMIGATE +FUMIGATED +FUMIGATES +FUMIGATING +FUMIGATION +FUMIGATIONS +FUMIGATOR +FUMIGATORS +FUMING +FUMINGLY +FUMITORIES +FUMITORY +FUMULI +FUMULUS +FUMY +FUN +FUNAMBULISM +FUNAMBULISMS +FUNAMBULIST +FUNAMBULISTS +FUNCTION +FUNCTIONAL +FUNCTIONALISM +FUNCTIONALISMS +FUNCTIONALIST +FUNCTIONALISTIC +FUNCTIONALISTS +FUNCTIONALITIES +FUNCTIONALITY +FUNCTIONALLY +FUNCTIONARIES +FUNCTIONARY +FUNCTIONED +FUNCTIONING +FUNCTIONLESS +FUNCTIONS +FUNCTOR +FUNCTORS +FUND +FUNDAMENT +FUNDAMENTAL +FUNDAMENTALISM +FUNDAMENTALISMS +FUNDAMENTALIST +FUNDAMENTALISTS +FUNDAMENTALLY +FUNDAMENTALS +FUNDAMENTS +FUNDED +FUNDER +FUNDERS +FUNDI +FUNDIC +FUNDING +FUNDRAISE +FUNDRAISED +FUNDRAISES +FUNDRAISING +FUNDS +FUNDUS +FUNERAL +FUNERALS +FUNERARY +FUNEREAL +FUNEREALLY +FUNEST +FUNFAIR +FUNFAIRS +FUNFEST +FUNFESTS +FUNGAL +FUNGALS +FUNGI +FUNGIBILITIES +FUNGIBILITY +FUNGIBLE +FUNGIBLES +FUNGIC +FUNGICIDAL +FUNGICIDALLY +FUNGICIDE +FUNGICIDES +FUNGIFORM +FUNGISTAT +FUNGISTATIC +FUNGISTATS +FUNGO +FUNGOES +FUNGOID +FUNGOIDS +FUNGOUS +FUNGUS +FUNGUSES +FUNHOUSE +FUNHOUSES +FUNICLE +FUNICLES +FUNICULAR +FUNICULARS +FUNICULI +FUNICULUS +FUNK +FUNKED +FUNKER +FUNKERS +FUNKIA +FUNKIAS +FUNKIER +FUNKIEST +FUNKILY +FUNKINESS +FUNKINESSES +FUNKING +FUNKS +FUNKY +FUNNED +FUNNEL +FUNNELED +FUNNELFORM +FUNNELING +FUNNELLED +FUNNELLING +FUNNELS +FUNNER +FUNNEST +FUNNIER +FUNNIES +FUNNIEST +FUNNILY +FUNNINESS +FUNNINESSES +FUNNING +FUNNY +FUNNYMAN +FUNNYMEN +FUNPLEX +FUNPLEXES +FUNS +FUR +FURAN +FURANE +FURANES +FURANOSE +FURANOSES +FURANOSIDE +FURANOSIDES +FURANS +FURAZOLIDONE +FURAZOLIDONES +FURBEARER +FURBEARERS +FURBELOW +FURBELOWED +FURBELOWING +FURBELOWS +FURBISH +FURBISHED +FURBISHER +FURBISHERS +FURBISHES +FURBISHING +FURCATE +FURCATED +FURCATELY +FURCATES +FURCATING +FURCATION +FURCATIONS +FURCRAEA +FURCRAEAS +FURCULA +FURCULAE +FURCULAR +FURCULUM +FURFUR +FURFURAL +FURFURALS +FURFURAN +FURFURANS +FURFURES +FURIBUND +FURIES +FURIOSO +FURIOUS +FURIOUSLY +FURL +FURLABLE +FURLED +FURLER +FURLERS +FURLESS +FURLING +FURLONG +FURLONGS +FURLOUGH +FURLOUGHED +FURLOUGHING +FURLOUGHS +FURLS +FURMENTIES +FURMENTY +FURMETIES +FURMETY +FURMITIES +FURMITY +FURNACE +FURNACED +FURNACES +FURNACING +FURNISH +FURNISHED +FURNISHER +FURNISHERS +FURNISHES +FURNISHING +FURNISHINGS +FURNITURE +FURNITURES +FUROR +FURORE +FURORES +FURORS +FUROSEMIDE +FUROSEMIDES +FURRED +FURRIER +FURRIERIES +FURRIERS +FURRIERY +FURRIEST +FURRILY +FURRINER +FURRINERS +FURRINESS +FURRINESSES +FURRING +FURRINGS +FURROW +FURROWED +FURROWER +FURROWERS +FURROWING +FURROWS +FURROWY +FURRY +FURS +FURTHER +FURTHERANCE +FURTHERANCES +FURTHERED +FURTHERER +FURTHERERS +FURTHERING +FURTHERMORE +FURTHERMOST +FURTHERS +FURTHEST +FURTIVE +FURTIVELY +FURTIVENESS +FURTIVENESSES +FURUNCLE +FURUNCLES +FURUNCULOSES +FURUNCULOSIS +FURY +FURZE +FURZES +FURZIER +FURZIEST +FURZY +FUSAIN +FUSAINS +FUSARIA +FUSARIUM +FUSCOUS +FUSE +FUSED +FUSEE +FUSEES +FUSEL +FUSELAGE +FUSELAGES +FUSELESS +FUSELIKE +FUSELS +FUSES +FUSIBILITIES +FUSIBILITY +FUSIBLE +FUSIBLY +FUSIFORM +FUSIL +FUSILE +FUSILEER +FUSILEERS +FUSILIER +FUSILIERS +FUSILLADE +FUSILLADED +FUSILLADES +FUSILLADING +FUSILLI +FUSILLIS +FUSILS +FUSING +FUSION +FUSIONAL +FUSIONISM +FUSIONISMS +FUSIONIST +FUSIONISTS +FUSIONS +FUSS +FUSSBUDGET +FUSSBUDGETS +FUSSBUDGETY +FUSSED +FUSSER +FUSSERS +FUSSES +FUSSIER +FUSSIEST +FUSSILY +FUSSINESS +FUSSINESSES +FUSSING +FUSSPOT +FUSSPOTS +FUSSY +FUSTIAN +FUSTIANS +FUSTIC +FUSTICS +FUSTIER +FUSTIEST +FUSTIGATE +FUSTIGATED +FUSTIGATES +FUSTIGATING +FUSTIGATION +FUSTIGATIONS +FUSTILY +FUSTINESS +FUSTINESSES +FUSTY +FUSULINID +FUSULINIDS +FUSUMA +FUTHARC +FUTHARCS +FUTHARK +FUTHARKS +FUTHORC +FUTHORCS +FUTHORK +FUTHORKS +FUTILE +FUTILELY +FUTILENESS +FUTILENESSES +FUTILITARIAN +FUTILITARIANISM +FUTILITARIANS +FUTILITIES +FUTILITY +FUTON +FUTONS +FUTTOCK +FUTTOCKS +FUTURAL +FUTURE +FUTURELESS +FUTURELESSNESS +FUTURES +FUTURISM +FUTURISMS +FUTURIST +FUTURISTIC +FUTURISTICALLY +FUTURISTICS +FUTURISTS +FUTURITIES +FUTURITY +FUTUROLOGICAL +FUTUROLOGIES +FUTUROLOGIST +FUTUROLOGISTS +FUTUROLOGY +FUTZ +FUTZED +FUTZES +FUTZING +FUZE +FUZED +FUZEE +FUZEES +FUZES +FUZIL +FUZILS +FUZING +FUZZ +FUZZED +FUZZES +FUZZIER +FUZZIEST +FUZZILY +FUZZINESS +FUZZINESSES +FUZZING +FUZZTONE +FUZZTONES +FUZZY +FYCE +FYCES +FYKE +FYKES +FYLFOT +FYLFOTS +FYNBOS +FYTTE +FYTTES +GAB +GABARDINE +GABARDINES +GABBARD +GABBARDS +GABBART +GABBARTS +GABBED +GABBER +GABBERS +GABBIER +GABBIEST +GABBINESS +GABBINESSES +GABBING +GABBLE +GABBLED +GABBLER +GABBLERS +GABBLES +GABBLING +GABBRO +GABBROIC +GABBROID +GABBROS +GABBY +GABELLE +GABELLED +GABELLES +GABERDINE +GABERDINES +GABFEST +GABFESTS +GABIES +GABION +GABIONS +GABLE +GABLED +GABLELIKE +GABLES +GABLING +GABOON +GABOONS +GABS +GABY +GAD +GADABOUT +GADABOUTS +GADARENE +GADDED +GADDER +GADDERS +GADDI +GADDING +GADDIS +GADFLIES +GADFLY +GADGET +GADGETEER +GADGETEERS +GADGETRIES +GADGETRY +GADGETS +GADGETY +GADI +GADID +GADIDS +GADIS +GADJE +GADJO +GADOID +GADOIDS +GADOLINITE +GADOLINITES +GADOLINIUM +GADOLINIUMS +GADROON +GADROONED +GADROONING +GADROONINGS +GADROONS +GADS +GADWALL +GADWALLS +GADZOOKERIES +GADZOOKERY +GADZOOKS +GAE +GAED +GAEING +GAEN +GAES +GAFF +GAFFE +GAFFED +GAFFER +GAFFERS +GAFFES +GAFFING +GAFFS +GAG +GAGA +GAGAKU +GAGAKUS +GAGE +GAGED +GAGER +GAGERS +GAGES +GAGGED +GAGGER +GAGGERS +GAGGING +GAGGLE +GAGGLED +GAGGLES +GAGGLING +GAGING +GAGMAN +GAGMEN +GAGS +GAGSTER +GAGSTERS +GAHNITE +GAHNITES +GAIETIES +GAIETY +GAIJIN +GAILLARDIA +GAILLARDIAS +GAILY +GAIN +GAINABLE +GAINED +GAINER +GAINERS +GAINFUL +GAINFULLY +GAINFULNESS +GAINFULNESSES +GAINGIVING +GAINGIVINGS +GAINING +GAINLESS +GAINLIER +GAINLIEST +GAINLY +GAINS +GAINSAID +GAINSAY +GAINSAYER +GAINSAYERS +GAINSAYING +GAINSAYS +GAINST +GAIT +GAITED +GAITER +GAITERS +GAITING +GAITS +GAL +GALA +GALABIA +GALABIAS +GALABIEH +GALABIEHS +GALABIYA +GALABIYAH +GALABIYAHS +GALABIYAS +GALACTIC +GALACTORRHEA +GALACTORRHEAS +GALACTOSAMINE +GALACTOSAMINES +GALACTOSE +GALACTOSEMIA +GALACTOSEMIAS +GALACTOSEMIC +GALACTOSES +GALACTOSIDASE +GALACTOSIDASES +GALACTOSIDE +GALACTOSIDES +GALACTOSYL +GALACTOSYLS +GALAGO +GALAGOS +GALAH +GALAHS +GALANGA +GALANGAL +GALANGALS +GALANGAS +GALANTINE +GALANTINES +GALAS +GALATEA +GALATEAS +GALAVANT +GALAVANTED +GALAVANTING +GALAVANTS +GALAX +GALAXES +GALAXIES +GALAXY +GALBANUM +GALBANUMS +GALE +GALEA +GALEAE +GALEAS +GALEATE +GALEATED +GALENA +GALENAS +GALENIC +GALENICAL +GALENICALS +GALENITE +GALENITES +GALERE +GALERES +GALES +GALETTE +GALETTES +GALILEE +GALILEES +GALINGALE +GALINGALES +GALIOT +GALIOTS +GALIPOT +GALIPOTS +GALIVANT +GALIVANTED +GALIVANTING +GALIVANTS +GALL +GALLAMINE +GALLAMINES +GALLANT +GALLANTED +GALLANTING +GALLANTLY +GALLANTRIES +GALLANTRY +GALLANTS +GALLATE +GALLATES +GALLBLADDER +GALLBLADDERS +GALLEASS +GALLEASSES +GALLED +GALLEIN +GALLEINS +GALLEON +GALLEONS +GALLERIA +GALLERIAS +GALLERIED +GALLERIES +GALLERY +GALLERYGOER +GALLERYGOERS +GALLERYING +GALLERYITE +GALLERYITES +GALLET +GALLETA +GALLETAS +GALLETED +GALLETING +GALLETS +GALLEY +GALLEYS +GALLFLIES +GALLFLY +GALLIARD +GALLIARDS +GALLIASS +GALLIASSES +GALLIC +GALLICA +GALLICAN +GALLICAS +GALLICISM +GALLICISMS +GALLICIZATION +GALLICIZATIONS +GALLICIZE +GALLICIZED +GALLICIZES +GALLICIZING +GALLIED +GALLIES +GALLIGASKINS +GALLIMAUFRIES +GALLIMAUFRY +GALLINACEOUS +GALLING +GALLINGLY +GALLINIPPER +GALLINIPPERS +GALLINULE +GALLINULES +GALLIOT +GALLIOTS +GALLIPOT +GALLIPOTS +GALLIUM +GALLIUMS +GALLIVANT +GALLIVANTED +GALLIVANTING +GALLIVANTS +GALLIWASP +GALLIWASPS +GALLNUT +GALLNUTS +GALLON +GALLONAGE +GALLONAGES +GALLONS +GALLOON +GALLOONED +GALLOONS +GALLOOT +GALLOOTS +GALLOP +GALLOPADE +GALLOPADES +GALLOPED +GALLOPER +GALLOPERS +GALLOPING +GALLOPS +GALLOUS +GALLOWGLASS +GALLOWGLASSES +GALLOWS +GALLOWSES +GALLS +GALLSTONE +GALLSTONES +GALLUS +GALLUSED +GALLUSES +GALLY +GALLYING +GALOOT +GALOOTS +GALOP +GALOPADE +GALOPADES +GALOPED +GALOPING +GALOPS +GALORE +GALORES +GALOSH +GALOSHE +GALOSHED +GALOSHES +GALS +GALUMPH +GALUMPHED +GALUMPHING +GALUMPHS +GALVANIC +GALVANICALLY +GALVANISE +GALVANISED +GALVANISES +GALVANISING +GALVANISM +GALVANISMS +GALVANIZATION +GALVANIZATIONS +GALVANIZE +GALVANIZED +GALVANIZER +GALVANIZERS +GALVANIZES +GALVANIZING +GALVANOMETER +GALVANOMETERS +GALVANOMETRIC +GALVANOSCOPE +GALVANOSCOPES +GALYAC +GALYACS +GALYAK +GALYAKS +GAM +GAMA +GAMAS +GAMASHES +GAMAY +GAMAYS +GAMB +GAMBA +GAMBADE +GAMBADES +GAMBADO +GAMBADOES +GAMBADOS +GAMBAS +GAMBE +GAMBES +GAMBESON +GAMBESONS +GAMBIA +GAMBIAS +GAMBIER +GAMBIERS +GAMBIR +GAMBIRS +GAMBIT +GAMBITS +GAMBLE +GAMBLED +GAMBLER +GAMBLERS +GAMBLES +GAMBLING +GAMBOGE +GAMBOGES +GAMBOGIAN +GAMBOL +GAMBOLED +GAMBOLING +GAMBOLLED +GAMBOLLING +GAMBOLS +GAMBREL +GAMBRELS +GAMBS +GAMBUSIA +GAMBUSIAS +GAME +GAMECOCK +GAMECOCKS +GAMED +GAMEKEEPER +GAMEKEEPERS +GAMELAN +GAMELANS +GAMELIKE +GAMELY +GAMENESS +GAMENESSES +GAMER +GAMERS +GAMES +GAMESMAN +GAMESMANSHIP +GAMESMANSHIPS +GAMESMEN +GAMESOME +GAMESOMELY +GAMESOMENESS +GAMESOMENESSES +GAMEST +GAMESTER +GAMESTERS +GAMETAL +GAMETANGIA +GAMETANGIUM +GAMETE +GAMETES +GAMETIC +GAMETICALLY +GAMETOCYTE +GAMETOCYTES +GAMETOGENESES +GAMETOGENESIS +GAMETOGENIC +GAMETOGENOUS +GAMETOPHORE +GAMETOPHORES +GAMETOPHYTE +GAMETOPHYTES +GAMETOPHYTIC +GAMEY +GAMIC +GAMIER +GAMIEST +GAMILY +GAMIN +GAMINE +GAMINES +GAMINESS +GAMINESSES +GAMING +GAMINGS +GAMINS +GAMMA +GAMMADIA +GAMMADION +GAMMAS +GAMMED +GAMMER +GAMMERS +GAMMIER +GAMMIEST +GAMMING +GAMMON +GAMMONED +GAMMONER +GAMMONERS +GAMMONING +GAMMONS +GAMMY +GAMODEME +GAMODEMES +GAMOPETALOUS +GAMP +GAMPS +GAMS +GAMUT +GAMUTS +GAMY +GAN +GANACHE +GANACHES +GANDER +GANDERED +GANDERING +GANDERS +GANE +GANEF +GANEFS +GANEV +GANEVS +GANG +GANGBANG +GANGBANGED +GANGBANGER +GANGBANGERS +GANGBANGING +GANGBANGS +GANGBUSTER +GANGBUSTERS +GANGED +GANGER +GANGERS +GANGING +GANGLAND +GANGLANDS +GANGLIA +GANGLIAL +GANGLIAR +GANGLIATE +GANGLIER +GANGLIEST +GANGLING +GANGLION +GANGLIONATED +GANGLIONIC +GANGLIONS +GANGLIOSIDE +GANGLIOSIDES +GANGLY +GANGPLANK +GANGPLANKS +GANGPLOW +GANGPLOWS +GANGREL +GANGRELS +GANGRENE +GANGRENED +GANGRENES +GANGRENING +GANGRENOUS +GANGS +GANGSTA +GANGSTAS +GANGSTER +GANGSTERDOM +GANGSTERDOMS +GANGSTERISH +GANGSTERISM +GANGSTERISMS +GANGSTERS +GANGUE +GANGUES +GANGWAY +GANGWAYS +GANISTER +GANISTERS +GANJA +GANJAH +GANJAHS +GANJAS +GANNET +GANNETS +GANNISTER +GANNISTERS +GANOF +GANOFS +GANOID +GANOIDS +GANTELOPE +GANTELOPES +GANTLET +GANTLETED +GANTLETING +GANTLETS +GANTLINE +GANTLINES +GANTLOPE +GANTLOPES +GANTRIES +GANTRY +GANYMEDE +GANYMEDES +GAOL +GAOLED +GAOLER +GAOLERS +GAOLING +GAOLS +GAP +GAPE +GAPED +GAPER +GAPERS +GAPES +GAPESEED +GAPESEEDS +GAPEWORM +GAPEWORMS +GAPING +GAPINGLY +GAPLESS +GAPOSIS +GAPOSISES +GAPPED +GAPPIER +GAPPIEST +GAPPING +GAPPY +GAPS +GAPY +GAR +GARAGE +GARAGED +GARAGEMAN +GARAGEMEN +GARAGES +GARAGING +GARB +GARBAGE +GARBAGEMAN +GARBAGEMEN +GARBAGES +GARBAGEY +GARBAGY +GARBANZO +GARBANZOS +GARBED +GARBING +GARBLE +GARBLED +GARBLER +GARBLERS +GARBLES +GARBLESS +GARBLING +GARBOARD +GARBOARDS +GARBOIL +GARBOILS +GARBOLOGIES +GARBOLOGY +GARBS +GARCON +GARCONS +GARDA +GARDAI +GARDANT +GARDEN +GARDENED +GARDENER +GARDENERS +GARDENFUL +GARDENFULS +GARDENIA +GARDENIAS +GARDENING +GARDENS +GARDEROBE +GARDEROBES +GARDYLOO +GARFISH +GARFISHES +GARGANEY +GARGANEYS +GARGANTUA +GARGANTUAN +GARGANTUAS +GARGET +GARGETS +GARGETY +GARGLE +GARGLED +GARGLER +GARGLERS +GARGLES +GARGLING +GARGOYLE +GARGOYLED +GARGOYLES +GARIBALDI +GARIBALDIS +GARIGUE +GARIGUES +GARISH +GARISHLY +GARISHNESS +GARISHNESSES +GARLAND +GARLANDED +GARLANDING +GARLANDS +GARLIC +GARLICKED +GARLICKIER +GARLICKIEST +GARLICKING +GARLICKY +GARLICS +GARMENT +GARMENTED +GARMENTING +GARMENTS +GARNER +GARNERED +GARNERING +GARNERS +GARNET +GARNETIFEROUS +GARNETS +GARNI +GARNIERITE +GARNIERITES +GARNISH +GARNISHED +GARNISHEE +GARNISHEED +GARNISHEEING +GARNISHEES +GARNISHER +GARNISHERS +GARNISHES +GARNISHING +GARNISHMENT +GARNISHMENTS +GARNITURE +GARNITURES +GAROTE +GAROTED +GAROTES +GAROTING +GAROTTE +GAROTTED +GAROTTER +GAROTTERS +GAROTTES +GAROTTING +GARPIKE +GARPIKES +GARRED +GARRET +GARRETED +GARRETS +GARRING +GARRISON +GARRISONED +GARRISONING +GARRISONS +GARRON +GARRONS +GARROTE +GARROTED +GARROTER +GARROTERS +GARROTES +GARROTING +GARROTTE +GARROTTED +GARROTTES +GARROTTING +GARRULITIES +GARRULITY +GARRULOUS +GARRULOUSLY +GARRULOUSNESS +GARRULOUSNESSES +GARS +GARTER +GARTERED +GARTERING +GARTERS +GARTH +GARTHS +GARVEY +GARVEYS +GAS +GASALIER +GASALIERS +GASBAG +GASBAGS +GASCON +GASCONADE +GASCONADED +GASCONADER +GASCONADERS +GASCONADES +GASCONADING +GASCONS +GASEITIES +GASEITY +GASELIER +GASELIERS +GASEOUS +GASEOUSNESS +GASEOUSNESSES +GASES +GASH +GASHED +GASHER +GASHES +GASHEST +GASHING +GASHOLDER +GASHOLDERS +GASHOUSE +GASHOUSES +GASIFICATION +GASIFICATIONS +GASIFIED +GASIFIER +GASIFIERS +GASIFIES +GASIFORM +GASIFY +GASIFYING +GASKET +GASKETS +GASKIN +GASKING +GASKINGS +GASKINS +GASLESS +GASLIGHT +GASLIGHTS +GASLIT +GASMAN +GASMEN +GASOGENE +GASOGENES +GASOHOL +GASOHOLS +GASOLENE +GASOLENES +GASOLIER +GASOLIERS +GASOLINE +GASOLINES +GASOLINIC +GASOMETER +GASOMETERS +GASP +GASPED +GASPER +GASPEREAU +GASPEREAUX +GASPERS +GASPING +GASPINGLY +GASPS +GASSED +GASSER +GASSERS +GASSES +GASSIER +GASSIEST +GASSILY +GASSINESS +GASSINESSES +GASSING +GASSINGS +GASSY +GAST +GASTED +GASTER +GASTERS +GASTIGHT +GASTIGHTNESS +GASTIGHTNESSES +GASTING +GASTNESS +GASTNESSES +GASTRAEA +GASTRAEAS +GASTRAL +GASTREA +GASTREAS +GASTRECTOMIES +GASTRECTOMY +GASTRIC +GASTRIN +GASTRINS +GASTRITIC +GASTRITIDES +GASTRITIS +GASTRITISES +GASTROCNEMII +GASTROCNEMIUS +GASTRODUODENAL +GASTROENTERITIS +GASTROLITH +GASTROLITHS +GASTRONOME +GASTRONOMES +GASTRONOMIC +GASTRONOMICAL +GASTRONOMICALLY +GASTRONOMIES +GASTRONOMIST +GASTRONOMISTS +GASTRONOMY +GASTROPOD +GASTROPODS +GASTROSCOPE +GASTROSCOPES +GASTROSCOPIC +GASTROSCOPIES +GASTROSCOPIST +GASTROSCOPISTS +GASTROSCOPY +GASTROTRICH +GASTROTRICHS +GASTROVASCULAR +GASTRULA +GASTRULAE +GASTRULAR +GASTRULAS +GASTRULATE +GASTRULATED +GASTRULATES +GASTRULATING +GASTRULATION +GASTRULATIONS +GASTS +GASWORKS +GAT +GATE +GATEAU +GATEAUS +GATEAUX +GATECRASH +GATECRASHED +GATECRASHES +GATECRASHING +GATED +GATEFOLD +GATEFOLDS +GATEHOUSE +GATEHOUSES +GATEKEEPER +GATEKEEPERS +GATEKEEPING +GATELESS +GATELIKE +GATEMAN +GATEMEN +GATEPOST +GATEPOSTS +GATER +GATERS +GATES +GATEWAY +GATEWAYS +GATHER +GATHERED +GATHERER +GATHERERS +GATHERING +GATHERINGS +GATHERS +GATING +GATINGS +GATOR +GATORS +GATS +GAUCHE +GAUCHELY +GAUCHENESS +GAUCHENESSES +GAUCHER +GAUCHERIE +GAUCHERIES +GAUCHEST +GAUCHO +GAUCHOS +GAUD +GAUDERIES +GAUDERY +GAUDIER +GAUDIES +GAUDIEST +GAUDILY +GAUDINESS +GAUDINESSES +GAUDS +GAUDY +GAUFFER +GAUFFERED +GAUFFERING +GAUFFERS +GAUGE +GAUGEABLE +GAUGED +GAUGER +GAUGERS +GAUGES +GAUGING +GAULEITER +GAULEITERS +GAULT +GAULTS +GAUM +GAUMED +GAUMING +GAUMS +GAUN +GAUNT +GAUNTER +GAUNTEST +GAUNTLET +GAUNTLETED +GAUNTLETING +GAUNTLETS +GAUNTLY +GAUNTNESS +GAUNTNESSES +GAUNTRIES +GAUNTRY +GAUR +GAURS +GAUSS +GAUSSES +GAUZE +GAUZELIKE +GAUZES +GAUZIER +GAUZIEST +GAUZILY +GAUZINESS +GAUZINESSES +GAUZY +GAVAGE +GAVAGES +GAVE +GAVEL +GAVELED +GAVELING +GAVELKIND +GAVELKINDS +GAVELLED +GAVELLING +GAVELOCK +GAVELOCKS +GAVELS +GAVIAL +GAVIALOID +GAVIALS +GAVOT +GAVOTS +GAVOTTE +GAVOTTED +GAVOTTES +GAVOTTING +GAWK +GAWKED +GAWKER +GAWKERS +GAWKIER +GAWKIES +GAWKIEST +GAWKILY +GAWKINESS +GAWKINESSES +GAWKING +GAWKISH +GAWKISHLY +GAWKISHNESS +GAWKISHNESSES +GAWKS +GAWKY +GAWP +GAWPED +GAWPER +GAWPERS +GAWPING +GAWPS +GAWSIE +GAWSY +GAY +GAYAL +GAYALS +GAYDAR +GAYDARS +GAYER +GAYEST +GAYETIES +GAYETY +GAYLY +GAYNESS +GAYNESSES +GAYS +GAYWINGS +GAZABO +GAZABOES +GAZABOS +GAZANIA +GAZANIAS +GAZAR +GAZARS +GAZE +GAZEBO +GAZEBOES +GAZEBOS +GAZED +GAZEHOUND +GAZEHOUNDS +GAZELLE +GAZELLES +GAZER +GAZERS +GAZES +GAZETTE +GAZETTED +GAZETTEER +GAZETTEERS +GAZETTES +GAZETTING +GAZILLION +GAZILLIONS +GAZING +GAZOGENE +GAZOGENES +GAZOO +GAZOOS +GAZPACHO +GAZPACHOS +GAZUMP +GAZUMPED +GAZUMPER +GAZUMPERS +GAZUMPING +GAZUMPS +GEANTICLINE +GEANTICLINES +GEAR +GEARBOX +GEARBOXES +GEARCASE +GEARCASES +GEARCHANGE +GEARCHANGES +GEARED +GEARHEAD +GEARHEADS +GEARING +GEARINGS +GEARLESS +GEARS +GEARSHIFT +GEARSHIFTS +GEARWHEEL +GEARWHEELS +GECK +GECKED +GECKING +GECKO +GECKOES +GECKOS +GECKS +GED +GEDS +GEE +GEED +GEEGAW +GEEGAWS +GEEING +GEEK +GEEKDOM +GEEKDOMS +GEEKED +GEEKIER +GEEKIEST +GEEKINESS +GEEKINESSES +GEEKS +GEEKY +GEEPOUND +GEEPOUNDS +GEES +GEESE +GEEST +GEESTS +GEEZ +GEEZER +GEEZERS +GEGENSCHEIN +GEGENSCHEINS +GEISHA +GEISHAS +GEL +GELABLE +GELADA +GELADAS +GELANDESPRUNG +GELANDESPRUNGS +GELANT +GELANTS +GELATE +GELATED +GELATES +GELATI +GELATIN +GELATINE +GELATINES +GELATING +GELATINIZATION +GELATINIZATIONS +GELATINIZE +GELATINIZED +GELATINIZES +GELATINIZING +GELATINOUS +GELATINOUSLY +GELATINOUSNESS +GELATINS +GELATION +GELATIONS +GELATIS +GELATO +GELATOS +GELCAP +GELCAPS +GELD +GELDED +GELDER +GELDERS +GELDING +GELDINGS +GELDS +GELEE +GELEES +GELID +GELIDITIES +GELIDITY +GELIDLY +GELIDNESS +GELIDNESSES +GELIGNITE +GELIGNITES +GELLANT +GELLANTS +GELLED +GELLING +GELS +GELSEMIA +GELSEMIUM +GELSEMIUMS +GELT +GELTS +GEM +GEMATRIA +GEMATRIAS +GEMEINSCHAFT +GEMEINSCHAFTS +GEMINAL +GEMINALLY +GEMINATE +GEMINATED +GEMINATES +GEMINATING +GEMINATION +GEMINATIONS +GEMLIKE +GEMMA +GEMMAE +GEMMATE +GEMMATED +GEMMATES +GEMMATING +GEMMATION +GEMMATIONS +GEMMED +GEMMIER +GEMMIEST +GEMMILY +GEMMINESS +GEMMINESSES +GEMMING +GEMMOLOGIES +GEMMOLOGIST +GEMMOLOGISTS +GEMMOLOGY +GEMMULE +GEMMULES +GEMMY +GEMOLOGICAL +GEMOLOGIES +GEMOLOGIST +GEMOLOGISTS +GEMOLOGY +GEMOT +GEMOTE +GEMOTES +GEMOTS +GEMS +GEMSBOK +GEMSBOKS +GEMSBUCK +GEMSBUCKS +GEMSTONE +GEMSTONES +GEMUTLICH +GEMUTLICHKEIT +GEMUTLICHKEITS +GEN +GENDARME +GENDARMERIE +GENDARMERIES +GENDARMERY +GENDARMES +GENDER +GENDERED +GENDERING +GENDERIZE +GENDERIZED +GENDERIZES +GENDERIZING +GENDERS +GENE +GENEALOGICAL +GENEALOGICALLY +GENEALOGIES +GENEALOGIST +GENEALOGISTS +GENEALOGY +GENERA +GENERABLE +GENERAL +GENERALCIES +GENERALCY +GENERALISATION +GENERALISATIONS +GENERALISE +GENERALISED +GENERALISES +GENERALISING +GENERALISSIMO +GENERALISSIMOS +GENERALIST +GENERALISTS +GENERALITIES +GENERALITY +GENERALIZABLE +GENERALIZATION +GENERALIZATIONS +GENERALIZE +GENERALIZED +GENERALIZER +GENERALIZERS +GENERALIZES +GENERALIZING +GENERALLY +GENERALS +GENERALSHIP +GENERALSHIPS +GENERATE +GENERATED +GENERATES +GENERATING +GENERATION +GENERATIONAL +GENERATIONALLY +GENERATIONS +GENERATIVE +GENERATOR +GENERATORS +GENERATRICES +GENERATRIX +GENERIC +GENERICAL +GENERICALLY +GENERICNESS +GENERICNESSES +GENERICS +GENEROSITIES +GENEROSITY +GENEROUS +GENEROUSLY +GENEROUSNESS +GENEROUSNESSES +GENES +GENESES +GENESIS +GENET +GENETIC +GENETICAL +GENETICALLY +GENETICIST +GENETICISTS +GENETICS +GENETS +GENETTE +GENETTES +GENEVA +GENEVAS +GENIAL +GENIALITIES +GENIALITY +GENIALLY +GENIC +GENICALLY +GENICULATE +GENICULATED +GENIE +GENIES +GENII +GENIP +GENIPAP +GENIPAPS +GENIPS +GENISTEIN +GENISTEINS +GENITAL +GENITALIA +GENITALIC +GENITALLY +GENITALS +GENITIVAL +GENITIVALLY +GENITIVE +GENITIVES +GENITOR +GENITORS +GENITOURINARY +GENITURE +GENITURES +GENIUS +GENIUSES +GENNAKER +GENNAKERS +GENOA +GENOAS +GENOCIDAL +GENOCIDE +GENOCIDES +GENOGRAM +GENOGRAMS +GENOISE +GENOISES +GENOM +GENOME +GENOMES +GENOMIC +GENOMICS +GENOMS +GENOTYPE +GENOTYPES +GENOTYPIC +GENOTYPICAL +GENOTYPICALLY +GENRE +GENRES +GENRO +GENROS +GENS +GENSENG +GENSENGS +GENT +GENTAMICIN +GENTAMICINS +GENTEEL +GENTEELER +GENTEELEST +GENTEELISM +GENTEELISMS +GENTEELLY +GENTEELNESS +GENTEELNESSES +GENTES +GENTIAN +GENTIANS +GENTIL +GENTILE +GENTILES +GENTILESSE +GENTILESSES +GENTILITIES +GENTILITY +GENTLE +GENTLED +GENTLEFOLK +GENTLEFOLKS +GENTLEMAN +GENTLEMANLIKE +GENTLEMANLINESS +GENTLEMANLY +GENTLEMEN +GENTLENESS +GENTLENESSES +GENTLEPERSON +GENTLEPERSONS +GENTLER +GENTLES +GENTLEST +GENTLEWOMAN +GENTLEWOMEN +GENTLING +GENTLY +GENTOO +GENTOOS +GENTRICE +GENTRICES +GENTRIES +GENTRIFICATION +GENTRIFICATIONS +GENTRIFIED +GENTRIFIER +GENTRIFIERS +GENTRIFIES +GENTRIFY +GENTRIFYING +GENTRY +GENTS +GENU +GENUA +GENUFLECT +GENUFLECTED +GENUFLECTING +GENUFLECTION +GENUFLECTIONS +GENUFLECTS +GENUINE +GENUINELY +GENUINENESS +GENUINENESSES +GENUS +GENUSES +GEOBOTANIC +GEOBOTANICAL +GEOBOTANIES +GEOBOTANIST +GEOBOTANISTS +GEOBOTANY +GEOCENTRIC +GEOCENTRICALLY +GEOCHEMICAL +GEOCHEMICALLY +GEOCHEMIST +GEOCHEMISTRIES +GEOCHEMISTRY +GEOCHEMISTS +GEOCHRONOLOGIC +GEOCHRONOLOGIES +GEOCHRONOLOGIST +GEOCHRONOLOGY +GEOCORONA +GEOCORONAE +GEOCORONAS +GEODE +GEODES +GEODESIC +GEODESICS +GEODESIES +GEODESIST +GEODESISTS +GEODESY +GEODETIC +GEODETICAL +GEODETICS +GEODIC +GEODUCK +GEODUCKS +GEOGNOSIES +GEOGNOSY +GEOGRAPHER +GEOGRAPHERS +GEOGRAPHIC +GEOGRAPHICAL +GEOGRAPHICALLY +GEOGRAPHIES +GEOGRAPHY +GEOHYDROLOGIC +GEOHYDROLOGIES +GEOHYDROLOGIST +GEOHYDROLOGISTS +GEOHYDROLOGY +GEOID +GEOIDAL +GEOIDS +GEOLOGER +GEOLOGERS +GEOLOGIC +GEOLOGICAL +GEOLOGICALLY +GEOLOGIES +GEOLOGIST +GEOLOGISTS +GEOLOGIZE +GEOLOGIZED +GEOLOGIZES +GEOLOGIZING +GEOLOGY +GEOMAGNETIC +GEOMAGNETICALLY +GEOMAGNETISM +GEOMAGNETISMS +GEOMANCER +GEOMANCERS +GEOMANCIES +GEOMANCY +GEOMANTIC +GEOMETER +GEOMETERS +GEOMETRIC +GEOMETRICAL +GEOMETRICALLY +GEOMETRICIAN +GEOMETRICIANS +GEOMETRICS +GEOMETRID +GEOMETRIDS +GEOMETRIES +GEOMETRISE +GEOMETRISED +GEOMETRISES +GEOMETRISING +GEOMETRIZATION +GEOMETRIZATIONS +GEOMETRIZE +GEOMETRIZED +GEOMETRIZES +GEOMETRIZING +GEOMETRY +GEOMORPHIC +GEOMORPHOLOGIES +GEOMORPHOLOGIST +GEOMORPHOLOGY +GEOPHAGIA +GEOPHAGIAS +GEOPHAGIES +GEOPHAGY +GEOPHONE +GEOPHONES +GEOPHYSICAL +GEOPHYSICALLY +GEOPHYSICIST +GEOPHYSICISTS +GEOPHYSICS +GEOPHYTE +GEOPHYTES +GEOPHYTIC +GEOPOLITICAL +GEOPOLITICALLY +GEOPOLITICIAN +GEOPOLITICIANS +GEOPOLITICS +GEOPONIC +GEOPONICS +GEOPRESSURED +GEOPROBE +GEOPROBES +GEORGETTE +GEORGETTES +GEORGIC +GEORGICAL +GEORGICS +GEOSCIENCE +GEOSCIENCES +GEOSCIENTIST +GEOSCIENTISTS +GEOSTATIONARY +GEOSTRATEGIC +GEOSTRATEGIES +GEOSTRATEGIST +GEOSTRATEGISTS +GEOSTRATEGY +GEOSTROPHIC +GEOSTROPHICALLY +GEOSYNCHRONOUS +GEOSYNCLINAL +GEOSYNCLINE +GEOSYNCLINES +GEOTACTIC +GEOTAXES +GEOTAXIS +GEOTECHNICAL +GEOTECTONIC +GEOTECTONICALLY +GEOTHERMAL +GEOTHERMALLY +GEOTROPIC +GEOTROPICALLY +GEOTROPISM +GEOTROPISMS +GERAH +GERAHS +GERANIAL +GERANIALS +GERANIOL +GERANIOLS +GERANIUM +GERANIUMS +GERARDIA +GERARDIAS +GERBERA +GERBERAS +GERBIL +GERBILLE +GERBILLES +GERBILS +GERENT +GERENTS +GERENUK +GERENUKS +GERFALCON +GERFALCONS +GERIATRIC +GERIATRICIAN +GERIATRICIANS +GERIATRICS +GERM +GERMAN +GERMANDER +GERMANDERS +GERMANE +GERMANELY +GERMANIC +GERMANIUM +GERMANIUMS +GERMANIZATION +GERMANIZATIONS +GERMANIZE +GERMANIZED +GERMANIZES +GERMANIZING +GERMANS +GERMEN +GERMENS +GERMFREE +GERMICIDAL +GERMICIDE +GERMICIDES +GERMIER +GERMIEST +GERMINA +GERMINABILITIES +GERMINABILITY +GERMINAL +GERMINALLY +GERMINANT +GERMINATE +GERMINATED +GERMINATES +GERMINATING +GERMINATION +GERMINATIONS +GERMINATIVE +GERMINESS +GERMINESSES +GERMLIKE +GERMPLASM +GERMPLASMS +GERMPROOF +GERMS +GERMY +GERONTIC +GERONTOCRACIES +GERONTOCRACY +GERONTOCRAT +GERONTOCRATIC +GERONTOCRATS +GERONTOLOGIC +GERONTOLOGICAL +GERONTOLOGIES +GERONTOLOGIST +GERONTOLOGISTS +GERONTOLOGY +GERONTOMORPHIC +GERRYMANDER +GERRYMANDERED +GERRYMANDERING +GERRYMANDERS +GERUND +GERUNDIAL +GERUNDIVE +GERUNDIVES +GERUNDS +GESELLSCHAFT +GESELLSCHAFTS +GESNERIA +GESNERIAD +GESNERIADS +GESSO +GESSOED +GESSOES +GEST +GESTALT +GESTALTEN +GESTALTIST +GESTALTISTS +GESTALTS +GESTAPO +GESTAPOS +GESTATE +GESTATED +GESTATES +GESTATING +GESTATION +GESTATIONAL +GESTATIONS +GESTATIVE +GESTATORY +GESTE +GESTES +GESTIC +GESTICAL +GESTICULANT +GESTICULATE +GESTICULATED +GESTICULATES +GESTICULATING +GESTICULATION +GESTICULATIONS +GESTICULATIVE +GESTICULATOR +GESTICULATORS +GESTICULATORY +GESTS +GESTURAL +GESTURALLY +GESTURE +GESTURED +GESTURER +GESTURERS +GESTURES +GESTURING +GESUNDHEIT +GET +GETA +GETABLE +GETAS +GETATABLE +GETAWAY +GETAWAYS +GETS +GETTABLE +GETTER +GETTERED +GETTERING +GETTERS +GETTING +GETUP +GETUPS +GEUM +GEUMS +GEWGAW +GEWGAWED +GEWGAWS +GEWURZTRAMINER +GEWURZTRAMINERS +GEY +GEYSER +GEYSERITE +GEYSERITES +GEYSERS +GHARIAL +GHARIALS +GHARRI +GHARRIES +GHARRIS +GHARRY +GHAST +GHASTFUL +GHASTFULLY +GHASTLIER +GHASTLIEST +GHASTLINESS +GHASTLINESSES +GHASTLY +GHAT +GHATS +GHAUT +GHAUTS +GHAZI +GHAZIES +GHAZIS +GHEE +GHEES +GHERAO +GHERAOED +GHERAOES +GHERAOING +GHERKIN +GHERKINS +GHETTO +GHETTOED +GHETTOES +GHETTOING +GHETTOIZATION +GHETTOIZATIONS +GHETTOIZE +GHETTOIZED +GHETTOIZES +GHETTOIZING +GHETTOS +GHI +GHIBLI +GHIBLIS +GHILLIE +GHILLIES +GHIS +GHOST +GHOSTED +GHOSTIER +GHOSTIEST +GHOSTING +GHOSTINGS +GHOSTLIER +GHOSTLIEST +GHOSTLIKE +GHOSTLINESS +GHOSTLINESSES +GHOSTLY +GHOSTS +GHOSTWRITE +GHOSTWRITER +GHOSTWRITERS +GHOSTWRITES +GHOSTWRITING +GHOSTWRITTEN +GHOSTWROTE +GHOSTY +GHOUL +GHOULIE +GHOULIES +GHOULISH +GHOULISHLY +GHOULISHNESS +GHOULISHNESSES +GHOULS +GHYLL +GHYLLS +GIANT +GIANTESS +GIANTESSES +GIANTISM +GIANTISMS +GIANTLIKE +GIANTS +GIAOUR +GIAOURS +GIARDIA +GIARDIAS +GIARDIASES +GIARDIASIS +GIB +GIBBED +GIBBER +GIBBERED +GIBBERELLIN +GIBBERELLINS +GIBBERING +GIBBERISH +GIBBERISHES +GIBBERS +GIBBET +GIBBETED +GIBBETING +GIBBETS +GIBBETTED +GIBBETTING +GIBBING +GIBBON +GIBBONS +GIBBOSE +GIBBOSITIES +GIBBOSITY +GIBBOUS +GIBBOUSLY +GIBBSITE +GIBBSITES +GIBE +GIBED +GIBER +GIBERS +GIBES +GIBING +GIBINGLY +GIBLET +GIBLETS +GIBS +GIBSON +GIBSONS +GID +GIDDAP +GIDDIED +GIDDIER +GIDDIES +GIDDIEST +GIDDILY +GIDDINESS +GIDDINESSES +GIDDY +GIDDYAP +GIDDYING +GIDDYUP +GIDS +GIE +GIED +GIEING +GIEN +GIES +GIFT +GIFTABLE +GIFTABLES +GIFTED +GIFTEDLY +GIFTEDNESS +GIFTEDNESSES +GIFTEE +GIFTEES +GIFTING +GIFTLESS +GIFTS +GIFTWARE +GIFTWARES +GIFTWRAP +GIFTWRAPPED +GIFTWRAPPING +GIFTWRAPS +GIG +GIGA +GIGABIT +GIGABITS +GIGABYTE +GIGABYTES +GIGACYCLE +GIGACYCLES +GIGAFLOP +GIGAFLOPS +GIGAHERTZ +GIGAHERTZES +GIGANTEAN +GIGANTESQUE +GIGANTIC +GIGANTICALLY +GIGANTISM +GIGANTISMS +GIGAS +GIGATON +GIGATONS +GIGAWATT +GIGAWATTS +GIGGED +GIGGING +GIGGLE +GIGGLED +GIGGLER +GIGGLERS +GIGGLES +GIGGLIER +GIGGLIEST +GIGGLING +GIGGLINGLY +GIGGLY +GIGHE +GIGLET +GIGLETS +GIGLOT +GIGLOTS +GIGOLO +GIGOLOS +GIGOT +GIGOTS +GIGS +GIGUE +GIGUES +GILBERT +GILBERTS +GILD +GILDED +GILDER +GILDERS +GILDHALL +GILDHALLS +GILDING +GILDINGS +GILDS +GILL +GILLED +GILLER +GILLERS +GILLIE +GILLIED +GILLIES +GILLING +GILLNET +GILLNETS +GILLNETTED +GILLNETTER +GILLNETTERS +GILLNETTING +GILLS +GILLY +GILLYFLOWER +GILLYFLOWERS +GILLYING +GILT +GILTHEAD +GILTHEADS +GILTS +GIMBAL +GIMBALED +GIMBALING +GIMBALLED +GIMBALLING +GIMBALS +GIMCRACK +GIMCRACKERIES +GIMCRACKERY +GIMCRACKS +GIMEL +GIMELS +GIMLET +GIMLETED +GIMLETING +GIMLETS +GIMMAL +GIMMALS +GIMME +GIMMES +GIMMICK +GIMMICKED +GIMMICKING +GIMMICKRIES +GIMMICKRY +GIMMICKS +GIMMICKY +GIMMIE +GIMMIES +GIMP +GIMPED +GIMPIER +GIMPIEST +GIMPING +GIMPS +GIMPY +GIN +GINGAL +GINGALL +GINGALLS +GINGALS +GINGELEY +GINGELEYS +GINGELI +GINGELIES +GINGELIS +GINGELLI +GINGELLIES +GINGELLIS +GINGELLY +GINGELY +GINGER +GINGERBREAD +GINGERBREADED +GINGERBREADS +GINGERBREADY +GINGERED +GINGERING +GINGERLINESS +GINGERLINESSES +GINGERLY +GINGERROOT +GINGERROOTS +GINGERS +GINGERSNAP +GINGERSNAPS +GINGERY +GINGHAM +GINGHAMS +GINGILI +GINGILIS +GINGILLI +GINGILLIS +GINGIVA +GINGIVAE +GINGIVAL +GINGIVECTOMIES +GINGIVECTOMY +GINGIVITIS +GINGIVITISES +GINGKO +GINGKOES +GINGKOS +GINK +GINKGO +GINKGOES +GINKGOS +GINKS +GINNED +GINNER +GINNERS +GINNIER +GINNIEST +GINNING +GINNINGS +GINNY +GINS +GINSENG +GINSENGS +GINZO +GINZOES +GIP +GIPON +GIPONS +GIPPED +GIPPER +GIPPERS +GIPPING +GIPS +GIPSIED +GIPSIES +GIPSY +GIPSYING +GIRAFFE +GIRAFFES +GIRAFFISH +GIRANDOLA +GIRANDOLAS +GIRANDOLE +GIRANDOLES +GIRASOL +GIRASOLE +GIRASOLES +GIRASOLS +GIRD +GIRDED +GIRDER +GIRDERS +GIRDING +GIRDINGLY +GIRDLE +GIRDLED +GIRDLER +GIRDLERS +GIRDLES +GIRDLING +GIRDS +GIRL +GIRLFRIEND +GIRLFRIENDS +GIRLHOOD +GIRLHOODS +GIRLIE +GIRLIER +GIRLIES +GIRLIEST +GIRLISH +GIRLISHLY +GIRLISHNESS +GIRLISHNESSES +GIRLS +GIRLY +GIRN +GIRNED +GIRNING +GIRNS +GIRO +GIROLLE +GIROLLES +GIRON +GIRONS +GIROS +GIROSOL +GIROSOLS +GIRSH +GIRSHES +GIRT +GIRTED +GIRTH +GIRTHED +GIRTHING +GIRTHS +GIRTING +GIRTS +GISARME +GISARMES +GISMO +GISMOS +GIST +GISTS +GIT +GITANO +GITANOS +GITE +GITES +GITS +GITTED +GITTERN +GITTERNS +GITTIN +GITTING +GIVE +GIVEABLE +GIVEAWAY +GIVEAWAYS +GIVEBACK +GIVEBACKS +GIVEN +GIVENS +GIVER +GIVERS +GIVES +GIVING +GIZMO +GIZMOS +GIZZARD +GIZZARDS +GJETOST +GJETOSTS +GLABELLA +GLABELLAE +GLABELLAR +GLABRATE +GLABRESCENT +GLABROUS +GLACE +GLACEED +GLACEING +GLACES +GLACIAL +GLACIALLY +GLACIATE +GLACIATED +GLACIATES +GLACIATING +GLACIATION +GLACIATIONS +GLACIER +GLACIERED +GLACIERS +GLACIOLOGICAL +GLACIOLOGIES +GLACIOLOGIST +GLACIOLOGISTS +GLACIOLOGY +GLACIS +GLACISES +GLAD +GLADDED +GLADDEN +GLADDENED +GLADDENER +GLADDENERS +GLADDENING +GLADDENS +GLADDER +GLADDEST +GLADDING +GLADE +GLADELIKE +GLADES +GLADIATE +GLADIATOR +GLADIATORIAL +GLADIATORS +GLADIER +GLADIEST +GLADIOLA +GLADIOLAR +GLADIOLAS +GLADIOLI +GLADIOLUS +GLADIOLUSES +GLADLIER +GLADLIEST +GLADLY +GLADNESS +GLADNESSES +GLADS +GLADSOME +GLADSOMELY +GLADSOMENESS +GLADSOMENESSES +GLADSOMER +GLADSOMEST +GLADSTONE +GLADSTONES +GLADY +GLAIKET +GLAIKIT +GLAIR +GLAIRE +GLAIRED +GLAIRES +GLAIRIER +GLAIRIEST +GLAIRING +GLAIRS +GLAIRY +GLAIVE +GLAIVED +GLAIVES +GLAM +GLAMOR +GLAMORISE +GLAMORISED +GLAMORISES +GLAMORISING +GLAMORIZATION +GLAMORIZATIONS +GLAMORIZE +GLAMORIZED +GLAMORIZER +GLAMORIZERS +GLAMORIZES +GLAMORIZING +GLAMOROUS +GLAMOROUSLY +GLAMOROUSNESS +GLAMOROUSNESSES +GLAMORS +GLAMOUR +GLAMOURED +GLAMOURING +GLAMOURIZE +GLAMOURIZED +GLAMOURIZES +GLAMOURIZING +GLAMOURLESS +GLAMOUROUS +GLAMOURS +GLAMS +GLANCE +GLANCED +GLANCER +GLANCERS +GLANCES +GLANCING +GLANCINGLY +GLAND +GLANDERED +GLANDERS +GLANDES +GLANDLESS +GLANDS +GLANDULAR +GLANDULARLY +GLANDULE +GLANDULES +GLANS +GLARE +GLARED +GLARES +GLARIER +GLARIEST +GLARINESS +GLARINESSES +GLARING +GLARINGLY +GLARINGNESS +GLARINGNESSES +GLARY +GLASNOST +GLASNOSTS +GLASS +GLASSBLOWER +GLASSBLOWERS +GLASSBLOWING +GLASSBLOWINGS +GLASSED +GLASSES +GLASSFUL +GLASSFULS +GLASSHOUSE +GLASSHOUSES +GLASSIE +GLASSIER +GLASSIES +GLASSIEST +GLASSILY +GLASSINE +GLASSINES +GLASSINESS +GLASSINESSES +GLASSING +GLASSLESS +GLASSMAKER +GLASSMAKERS +GLASSMAKING +GLASSMAKINGS +GLASSMAN +GLASSMEN +GLASSPAPER +GLASSPAPERED +GLASSPAPERING +GLASSPAPERS +GLASSWARE +GLASSWARES +GLASSWORK +GLASSWORKER +GLASSWORKERS +GLASSWORKS +GLASSWORM +GLASSWORMS +GLASSWORT +GLASSWORTS +GLASSY +GLAUCOMA +GLAUCOMAS +GLAUCONITE +GLAUCONITES +GLAUCONITIC +GLAUCOUS +GLAUCOUSNESS +GLAUCOUSNESSES +GLAZE +GLAZED +GLAZER +GLAZERS +GLAZES +GLAZIER +GLAZIERIES +GLAZIERS +GLAZIERY +GLAZIEST +GLAZILY +GLAZINESS +GLAZINESSES +GLAZING +GLAZINGS +GLAZY +GLEAM +GLEAMED +GLEAMER +GLEAMERS +GLEAMIER +GLEAMIEST +GLEAMING +GLEAMS +GLEAMY +GLEAN +GLEANABLE +GLEANED +GLEANER +GLEANERS +GLEANING +GLEANINGS +GLEANS +GLEBA +GLEBAE +GLEBE +GLEBELESS +GLEBES +GLED +GLEDE +GLEDES +GLEDS +GLEE +GLEED +GLEEDS +GLEEFUL +GLEEFULLY +GLEEFULNESS +GLEEFULNESSES +GLEEK +GLEEKED +GLEEKING +GLEEKS +GLEEMAN +GLEEMEN +GLEES +GLEESOME +GLEET +GLEETED +GLEETIER +GLEETIEST +GLEETING +GLEETS +GLEETY +GLEG +GLEGLY +GLEGNESS +GLEGNESSES +GLEIZATION +GLEIZATIONS +GLEN +GLENGARRIES +GLENGARRY +GLENLIKE +GLENOID +GLENS +GLEY +GLEYED +GLEYING +GLEYINGS +GLEYS +GLIA +GLIADIN +GLIADINE +GLIADINES +GLIADINS +GLIAL +GLIAS +GLIB +GLIBBER +GLIBBEST +GLIBLY +GLIBNESS +GLIBNESSES +GLIDE +GLIDED +GLIDEPATH +GLIDEPATHS +GLIDER +GLIDERS +GLIDES +GLIDING +GLIFF +GLIFFS +GLIM +GLIME +GLIMED +GLIMES +GLIMING +GLIMMER +GLIMMERED +GLIMMERING +GLIMMERINGS +GLIMMERS +GLIMPSE +GLIMPSED +GLIMPSER +GLIMPSERS +GLIMPSES +GLIMPSING +GLIMS +GLINT +GLINTED +GLINTIER +GLINTIEST +GLINTING +GLINTS +GLINTY +GLIOBLASTOMA +GLIOBLASTOMAS +GLIOBLASTOMATA +GLIOMA +GLIOMAS +GLIOMATA +GLISSADE +GLISSADED +GLISSADER +GLISSADERS +GLISSADES +GLISSADING +GLISSANDI +GLISSANDO +GLISSANDOS +GLISTEN +GLISTENED +GLISTENING +GLISTENS +GLISTER +GLISTERED +GLISTERING +GLISTERS +GLITCH +GLITCHES +GLITCHIER +GLITCHIEST +GLITCHY +GLITTER +GLITTERATI +GLITTERED +GLITTERING +GLITTERINGLY +GLITTERS +GLITTERY +GLITZ +GLITZED +GLITZES +GLITZIER +GLITZIEST +GLITZING +GLITZY +GLOAM +GLOAMING +GLOAMINGS +GLOAMS +GLOAT +GLOATED +GLOATER +GLOATERS +GLOATING +GLOATINGLY +GLOATS +GLOB +GLOBAL +GLOBALISE +GLOBALISED +GLOBALISES +GLOBALISING +GLOBALISM +GLOBALISMS +GLOBALIST +GLOBALISTS +GLOBALIZATION +GLOBALIZATIONS +GLOBALIZE +GLOBALIZED +GLOBALIZES +GLOBALIZING +GLOBALLY +GLOBATE +GLOBATED +GLOBBIER +GLOBBIEST +GLOBBY +GLOBE +GLOBED +GLOBEFISH +GLOBEFISHES +GLOBEFLOWER +GLOBEFLOWERS +GLOBELIKE +GLOBES +GLOBETROT +GLOBETROTS +GLOBETROTTED +GLOBETROTTING +GLOBIN +GLOBING +GLOBINS +GLOBOID +GLOBOIDS +GLOBOSE +GLOBOSELY +GLOBOSITIES +GLOBOSITY +GLOBOUS +GLOBS +GLOBULAR +GLOBULARS +GLOBULE +GLOBULES +GLOBULIN +GLOBULINS +GLOCHID +GLOCHIDIA +GLOCHIDIUM +GLOCHIDS +GLOCKENSPIEL +GLOCKENSPIELS +GLOGG +GLOGGS +GLOM +GLOMERA +GLOMERATE +GLOMERULAR +GLOMERULE +GLOMERULES +GLOMERULI +GLOMERULUS +GLOMMED +GLOMMING +GLOMS +GLOMUS +GLONOIN +GLONOINS +GLOOM +GLOOMED +GLOOMFUL +GLOOMIER +GLOOMIEST +GLOOMILY +GLOOMINESS +GLOOMINESSES +GLOOMING +GLOOMINGS +GLOOMS +GLOOMY +GLOP +GLOPPED +GLOPPIER +GLOPPIEST +GLOPPING +GLOPPY +GLOPS +GLORIA +GLORIAS +GLORIED +GLORIES +GLORIFICATION +GLORIFICATIONS +GLORIFIED +GLORIFIER +GLORIFIERS +GLORIFIES +GLORIFY +GLORIFYING +GLORIOLE +GLORIOLES +GLORIOUS +GLORIOUSLY +GLORIOUSNESS +GLORIOUSNESSES +GLORY +GLORYING +GLOSS +GLOSSA +GLOSSAE +GLOSSAL +GLOSSARIAL +GLOSSARIES +GLOSSARIST +GLOSSARISTS +GLOSSARY +GLOSSAS +GLOSSATOR +GLOSSATORS +GLOSSED +GLOSSEME +GLOSSEMES +GLOSSER +GLOSSERS +GLOSSES +GLOSSIER +GLOSSIES +GLOSSIEST +GLOSSILY +GLOSSINA +GLOSSINAS +GLOSSINESS +GLOSSINESSES +GLOSSING +GLOSSITIC +GLOSSITIS +GLOSSITISES +GLOSSOGRAPHER +GLOSSOGRAPHERS +GLOSSOLALIA +GLOSSOLALIAS +GLOSSOLALIST +GLOSSOLALISTS +GLOSSY +GLOST +GLOSTS +GLOTTAL +GLOTTIC +GLOTTIDES +GLOTTIS +GLOTTISES +GLOUT +GLOUTED +GLOUTING +GLOUTS +GLOVE +GLOVED +GLOVER +GLOVERS +GLOVES +GLOVING +GLOW +GLOWED +GLOWER +GLOWERED +GLOWERING +GLOWERS +GLOWFLIES +GLOWFLY +GLOWING +GLOWINGLY +GLOWS +GLOWWORM +GLOWWORMS +GLOXINIA +GLOXINIAS +GLOZE +GLOZED +GLOZES +GLOZING +GLUCAGON +GLUCAGONS +GLUCAN +GLUCANS +GLUCINIC +GLUCINUM +GLUCINUMS +GLUCOCORTICOID +GLUCOCORTICOIDS +GLUCOKINASE +GLUCOKINASES +GLUCONATE +GLUCONATES +GLUCONEOGENESES +GLUCONEOGENESIS +GLUCOSAMINE +GLUCOSAMINES +GLUCOSE +GLUCOSES +GLUCOSIC +GLUCOSIDASE +GLUCOSIDASES +GLUCOSIDE +GLUCOSIDES +GLUCOSIDIC +GLUCURONIDASE +GLUCURONIDASES +GLUCURONIDE +GLUCURONIDES +GLUE +GLUED +GLUEING +GLUELIKE +GLUEPOT +GLUEPOTS +GLUER +GLUERS +GLUES +GLUEY +GLUEYNESS +GLUEYNESSES +GLUG +GLUGGED +GLUGGING +GLUGS +GLUHWEIN +GLUHWEINS +GLUIER +GLUIEST +GLUILY +GLUINESS +GLUINESSES +GLUING +GLUM +GLUME +GLUMES +GLUMLY +GLUMMER +GLUMMEST +GLUMNESS +GLUMNESSES +GLUMPIER +GLUMPIEST +GLUMPILY +GLUMPY +GLUMS +GLUNCH +GLUNCHED +GLUNCHES +GLUNCHING +GLUON +GLUONS +GLUT +GLUTAMATE +GLUTAMATES +GLUTAMINASE +GLUTAMINASES +GLUTAMINE +GLUTAMINES +GLUTARALDEHYDE +GLUTARALDEHYDES +GLUTATHIONE +GLUTATHIONES +GLUTE +GLUTEAL +GLUTEI +GLUTELIN +GLUTELINS +GLUTEN +GLUTENIN +GLUTENINS +GLUTENOUS +GLUTENS +GLUTES +GLUTETHIMIDE +GLUTETHIMIDES +GLUTEUS +GLUTINOUS +GLUTINOUSLY +GLUTS +GLUTTED +GLUTTING +GLUTTON +GLUTTONIES +GLUTTONOUS +GLUTTONOUSLY +GLUTTONOUSNESS +GLUTTONS +GLUTTONY +GLYCAN +GLYCANS +GLYCERALDEHYDE +GLYCERALDEHYDES +GLYCERIC +GLYCERIDE +GLYCERIDES +GLYCERIDIC +GLYCERIN +GLYCERINATE +GLYCERINATED +GLYCERINATES +GLYCERINATING +GLYCERINE +GLYCERINES +GLYCERINS +GLYCEROL +GLYCEROLS +GLYCERYL +GLYCERYLS +GLYCIN +GLYCINE +GLYCINES +GLYCINS +GLYCOGEN +GLYCOGENESES +GLYCOGENESIS +GLYCOGENOLYSES +GLYCOGENOLYSIS +GLYCOGENOLYTIC +GLYCOGENS +GLYCOL +GLYCOLIC +GLYCOLIPID +GLYCOLIPIDS +GLYCOLS +GLYCOLYSES +GLYCOLYSIS +GLYCOLYTIC +GLYCONIC +GLYCONICS +GLYCOPEPTIDE +GLYCOPEPTIDES +GLYCOPROTEIN +GLYCOPROTEINS +GLYCOSIDASE +GLYCOSIDASES +GLYCOSIDE +GLYCOSIDES +GLYCOSIDIC +GLYCOSIDICALLY +GLYCOSURIA +GLYCOSURIAS +GLYCOSYL +GLYCOSYLATE +GLYCOSYLATED +GLYCOSYLATES +GLYCOSYLATING +GLYCOSYLATION +GLYCOSYLATIONS +GLYCOSYLS +GLYCYL +GLYCYLS +GLYPH +GLYPHIC +GLYPHS +GLYPTIC +GLYPTICS +GNAR +GNARL +GNARLED +GNARLIER +GNARLIEST +GNARLING +GNARLS +GNARLY +GNARR +GNARRED +GNARRING +GNARRS +GNARS +GNASH +GNASHED +GNASHES +GNASHING +GNAT +GNATCATCHER +GNATCATCHERS +GNATHAL +GNATHIC +GNATHION +GNATHIONS +GNATHITE +GNATHITES +GNATHONIC +GNATLIKE +GNATS +GNATTIER +GNATTIEST +GNATTY +GNAW +GNAWABLE +GNAWED +GNAWER +GNAWERS +GNAWING +GNAWINGLY +GNAWINGS +GNAWN +GNAWS +GNEISS +GNEISSES +GNEISSIC +GNEISSOID +GNEISSOSE +GNOCCHI +GNOME +GNOMELIKE +GNOMES +GNOMIC +GNOMICAL +GNOMISH +GNOMIST +GNOMISTS +GNOMON +GNOMONIC +GNOMONS +GNOSES +GNOSIS +GNOSTIC +GNOSTICAL +GNOSTICISM +GNOSTICISMS +GNOSTICS +GNOTOBIOTIC +GNOTOBIOTICALLY +GNU +GNUS +GO +GOA +GOAD +GOADED +GOADING +GOADLIKE +GOADS +GOAL +GOALED +GOALIE +GOALIES +GOALING +GOALKEEPER +GOALKEEPERS +GOALLESS +GOALMOUTH +GOALMOUTHS +GOALPOST +GOALPOSTS +GOALS +GOALTENDER +GOALTENDERS +GOALTENDING +GOALTENDINGS +GOALWARD +GOANNA +GOANNAS +GOAS +GOAT +GOATEE +GOATEED +GOATEES +GOATFISH +GOATFISHES +GOATHERD +GOATHERDS +GOATISH +GOATISHLY +GOATLIKE +GOATS +GOATSKIN +GOATSKINS +GOATSUCKER +GOATSUCKERS +GOB +GOBAN +GOBANG +GOBANGS +GOBANS +GOBBED +GOBBET +GOBBETS +GOBBING +GOBBLE +GOBBLED +GOBBLEDEGOOK +GOBBLEDEGOOKS +GOBBLEDYGOOK +GOBBLEDYGOOKS +GOBBLER +GOBBLERS +GOBBLES +GOBBLING +GOBIES +GOBIOID +GOBIOIDS +GOBLET +GOBLETS +GOBLIN +GOBLINS +GOBO +GOBOES +GOBONEE +GOBONY +GOBOS +GOBS +GOBSHITE +GOBSHITES +GOBY +GOD +GODCHILD +GODCHILDREN +GODDAM +GODDAMMED +GODDAMMING +GODDAMN +GODDAMNDEST +GODDAMNED +GODDAMNEDEST +GODDAMNING +GODDAMNS +GODDAMS +GODDAUGHTER +GODDAUGHTERS +GODDED +GODDESS +GODDESSES +GODDING +GODET +GODETIA +GODETIAS +GODETS +GODFATHER +GODFATHERED +GODFATHERING +GODFATHERS +GODFORSAKEN +GODHEAD +GODHEADS +GODHOOD +GODHOODS +GODLESS +GODLESSLY +GODLESSNESS +GODLESSNESSES +GODLIER +GODLIEST +GODLIKE +GODLIKENESS +GODLIKENESSES +GODLILY +GODLINESS +GODLINESSES +GODLING +GODLINGS +GODLY +GODMOTHER +GODMOTHERED +GODMOTHERING +GODMOTHERS +GODOWN +GODOWNS +GODPARENT +GODPARENTS +GODROON +GODROONS +GODS +GODSEND +GODSENDS +GODSHIP +GODSHIPS +GODSON +GODSONS +GODWIT +GODWITS +GOER +GOERS +GOES +GOETHITE +GOETHITES +GOFER +GOFERS +GOFFER +GOFFERED +GOFFERING +GOFFERINGS +GOFFERS +GOGGLE +GOGGLED +GOGGLER +GOGGLERS +GOGGLES +GOGGLIER +GOGGLIEST +GOGGLING +GOGGLY +GOGLET +GOGLETS +GOGO +GOGOS +GOING +GOINGS +GOITER +GOITERS +GOITRE +GOITRES +GOITROGEN +GOITROGENIC +GOITROGENICITY +GOITROGENS +GOITROUS +GOLCONDA +GOLCONDAS +GOLD +GOLDARN +GOLDARNS +GOLDBRICK +GOLDBRICKED +GOLDBRICKING +GOLDBRICKS +GOLDBUG +GOLDBUGS +GOLDEN +GOLDENER +GOLDENEST +GOLDENEYE +GOLDENEYES +GOLDENLY +GOLDENNESS +GOLDENNESSES +GOLDENROD +GOLDENRODS +GOLDENSEAL +GOLDENSEALS +GOLDER +GOLDEST +GOLDEYE +GOLDEYES +GOLDFIELD +GOLDFIELDS +GOLDFINCH +GOLDFINCHES +GOLDFISH +GOLDFISHES +GOLDS +GOLDSMITH +GOLDSMITHS +GOLDSTONE +GOLDSTONES +GOLDTONE +GOLDURN +GOLDURNS +GOLEM +GOLEMS +GOLF +GOLFED +GOLFER +GOLFERS +GOLFING +GOLFINGS +GOLFS +GOLGOTHA +GOLGOTHAS +GOLIARD +GOLIARDIC +GOLIARDS +GOLIATH +GOLIATHS +GOLLIWOG +GOLLIWOGG +GOLLIWOGGS +GOLLIWOGS +GOLLY +GOLLYWOG +GOLLYWOGS +GOLOSH +GOLOSHE +GOLOSHES +GOMBEEN +GOMBEENS +GOMBO +GOMBOS +GOMBROON +GOMBROONS +GOMER +GOMERAL +GOMERALS +GOMEREL +GOMERELS +GOMERIL +GOMERILS +GOMERS +GOMPHOSES +GOMPHOSIS +GOMUTI +GOMUTIS +GONAD +GONADAL +GONADECTOMIES +GONADECTOMIZED +GONADECTOMY +GONADIAL +GONADIC +GONADOTROPHIC +GONADOTROPHIN +GONADOTROPHINS +GONADOTROPIC +GONADOTROPIN +GONADOTROPINS +GONADS +GONDOLA +GONDOLAS +GONDOLIER +GONDOLIERS +GONE +GONEF +GONEFS +GONENESS +GONENESSES +GONER +GONERS +GONFALON +GONFALONS +GONFANON +GONFANONS +GONG +GONGED +GONGING +GONGLIKE +GONGORISTIC +GONGS +GONIA +GONIDIA +GONIDIAL +GONIDIC +GONIDIUM +GONIF +GONIFF +GONIFFS +GONIFS +GONIOMETER +GONIOMETERS +GONIOMETRIC +GONIOMETRIES +GONIOMETRY +GONION +GONIUM +GONOCOCCAL +GONOCOCCI +GONOCOCCUS +GONOCYTE +GONOCYTES +GONOF +GONOFS +GONOPH +GONOPHORE +GONOPHORES +GONOPHS +GONOPORE +GONOPORES +GONORRHEA +GONORRHEAL +GONORRHEAS +GONZO +GOO +GOOBER +GOOBERS +GOOD +GOODBY +GOODBYE +GOODBYES +GOODBYS +GOODIE +GOODIES +GOODISH +GOODLIER +GOODLIEST +GOODLY +GOODMAN +GOODMEN +GOODNESS +GOODNESSES +GOODS +GOODWIFE +GOODWILL +GOODWILLED +GOODWILLS +GOODWIVES +GOODY +GOOEY +GOOEYNESS +GOOEYNESSES +GOOF +GOOFBALL +GOOFBALLS +GOOFED +GOOFIER +GOOFIEST +GOOFILY +GOOFINESS +GOOFINESSES +GOOFING +GOOFS +GOOFY +GOOGLIES +GOOGLY +GOOGOL +GOOGOLPLEX +GOOGOLPLEXES +GOOGOLS +GOOIER +GOOIEST +GOOK +GOOKS +GOOKY +GOOMBAH +GOOMBAHS +GOOMBAY +GOOMBAYS +GOON +GOONEY +GOONEYS +GOONIE +GOONIER +GOONIES +GOONIEST +GOONS +GOONY +GOOP +GOOPIER +GOOPIEST +GOOPS +GOOPY +GOORAL +GOORALS +GOOS +GOOSANDER +GOOSANDERS +GOOSE +GOOSEBERRIES +GOOSEBERRY +GOOSED +GOOSEFISH +GOOSEFISHES +GOOSEFLESH +GOOSEFLESHES +GOOSEFOOT +GOOSEFOOTS +GOOSEGRASS +GOOSEGRASSES +GOOSEHERD +GOOSEHERDS +GOOSENECK +GOOSENECKED +GOOSENECKS +GOOSES +GOOSEY +GOOSIER +GOOSIEST +GOOSING +GOOSY +GOPHER +GOPHERS +GOPIK +GOR +GORAL +GORALS +GORBELLIES +GORBELLY +GORBLIMY +GORCOCK +GORCOCKS +GORDITA +GORDITAS +GORE +GORED +GORES +GORGE +GORGED +GORGEDLY +GORGEOUS +GORGEOUSLY +GORGEOUSNESS +GORGEOUSNESSES +GORGER +GORGERIN +GORGERINS +GORGERS +GORGES +GORGET +GORGETED +GORGETS +GORGING +GORGON +GORGONIAN +GORGONIANS +GORGONIZE +GORGONIZED +GORGONIZES +GORGONIZING +GORGONS +GORHEN +GORHENS +GORIER +GORIEST +GORILLA +GORILLAS +GORILY +GORINESS +GORINESSES +GORING +GORM +GORMAND +GORMANDISE +GORMANDISED +GORMANDISES +GORMANDISING +GORMANDIZE +GORMANDIZED +GORMANDIZER +GORMANDIZERS +GORMANDIZES +GORMANDIZING +GORMANDS +GORMED +GORMING +GORMLESS +GORMS +GORP +GORPS +GORSE +GORSES +GORSIER +GORSIEST +GORSY +GORY +GOS +GOSH +GOSHAWK +GOSHAWKS +GOSLING +GOSLINGS +GOSPEL +GOSPELER +GOSPELERS +GOSPELLER +GOSPELLERS +GOSPELLY +GOSPELS +GOSPORT +GOSPORTS +GOSSAMER +GOSSAMERS +GOSSAMERY +GOSSAN +GOSSANS +GOSSIP +GOSSIPED +GOSSIPER +GOSSIPERS +GOSSIPING +GOSSIPMONGER +GOSSIPMONGERS +GOSSIPPED +GOSSIPPER +GOSSIPPERS +GOSSIPPING +GOSSIPRIES +GOSSIPRY +GOSSIPS +GOSSIPY +GOSSOON +GOSSOONS +GOSSYPOL +GOSSYPOLS +GOT +GOTCHA +GOTCHAS +GOTH +GOTHIC +GOTHICALLY +GOTHICISM +GOTHICISMS +GOTHICIZE +GOTHICIZED +GOTHICIZES +GOTHICIZING +GOTHICS +GOTHITE +GOTHITES +GOTHS +GOTTEN +GOUACHE +GOUACHES +GOUGE +GOUGED +GOUGER +GOUGERS +GOUGES +GOUGING +GOULASH +GOULASHES +GOURAMI +GOURAMIES +GOURAMIS +GOURD +GOURDE +GOURDES +GOURDS +GOURMAND +GOURMANDISE +GOURMANDISES +GOURMANDISM +GOURMANDISMS +GOURMANDIZE +GOURMANDIZED +GOURMANDIZES +GOURMANDIZING +GOURMANDS +GOURMET +GOURMETS +GOUT +GOUTIER +GOUTIEST +GOUTILY +GOUTINESS +GOUTINESSES +GOUTS +GOUTY +GOVERN +GOVERNABLE +GOVERNANCE +GOVERNANCES +GOVERNED +GOVERNESS +GOVERNESSES +GOVERNESSY +GOVERNING +GOVERNMENT +GOVERNMENTAL +GOVERNMENTALISM +GOVERNMENTALIST +GOVERNMENTALIZE +GOVERNMENTALLY +GOVERNMENTESE +GOVERNMENTESES +GOVERNMENTS +GOVERNOR +GOVERNORATE +GOVERNORATES +GOVERNORS +GOVERNORSHIP +GOVERNORSHIPS +GOVERNS +GOWAN +GOWANED +GOWANS +GOWANY +GOWD +GOWDS +GOWK +GOWKS +GOWN +GOWNED +GOWNING +GOWNS +GOWNSMAN +GOWNSMEN +GOX +GOXES +GOY +GOYIM +GOYISH +GOYS +GRAAL +GRAALS +GRAB +GRABBABLE +GRABBED +GRABBER +GRABBERS +GRABBIER +GRABBIEST +GRABBING +GRABBLE +GRABBLED +GRABBLER +GRABBLERS +GRABBLES +GRABBLING +GRABBY +GRABEN +GRABENS +GRABS +GRACE +GRACED +GRACEFUL +GRACEFULLER +GRACEFULLEST +GRACEFULLY +GRACEFULNESS +GRACEFULNESSES +GRACELESS +GRACELESSLY +GRACELESSNESS +GRACELESSNESSES +GRACES +GRACILE +GRACILENESS +GRACILENESSES +GRACILES +GRACILIS +GRACILITIES +GRACILITY +GRACING +GRACIOSO +GRACIOSOS +GRACIOUS +GRACIOUSLY +GRACIOUSNESS +GRACIOUSNESSES +GRACKLE +GRACKLES +GRAD +GRADABLE +GRADATE +GRADATED +GRADATES +GRADATING +GRADATION +GRADATIONAL +GRADATIONALLY +GRADATIONS +GRADE +GRADED +GRADELESS +GRADER +GRADERS +GRADES +GRADIENT +GRADIENTS +GRADIN +GRADINE +GRADINES +GRADING +GRADINS +GRADIOMETER +GRADIOMETERS +GRADS +GRADUAL +GRADUALISM +GRADUALISMS +GRADUALIST +GRADUALISTS +GRADUALLY +GRADUALNESS +GRADUALNESSES +GRADUALS +GRADUAND +GRADUANDS +GRADUATE +GRADUATED +GRADUATES +GRADUATING +GRADUATION +GRADUATIONS +GRADUATOR +GRADUATORS +GRADUS +GRADUSES +GRAECIZE +GRAECIZED +GRAECIZES +GRAECIZING +GRAFFITI +GRAFFITIED +GRAFFITIING +GRAFFITING +GRAFFITIS +GRAFFITIST +GRAFFITISTS +GRAFFITO +GRAFT +GRAFTAGE +GRAFTAGES +GRAFTED +GRAFTER +GRAFTERS +GRAFTING +GRAFTS +GRAHAM +GRAHAMS +GRAIL +GRAILS +GRAIN +GRAINED +GRAINER +GRAINERS +GRAINFIELD +GRAINFIELDS +GRAINIER +GRAINIEST +GRAININESS +GRAININESSES +GRAINING +GRAINLESS +GRAINS +GRAINY +GRAM +GRAMA +GRAMARIES +GRAMARY +GRAMARYE +GRAMARYES +GRAMAS +GRAMERCIES +GRAMERCY +GRAMICIDIN +GRAMICIDINS +GRAMINEOUS +GRAMINIVOROUS +GRAMMA +GRAMMAR +GRAMMARIAN +GRAMMARIANS +GRAMMARS +GRAMMAS +GRAMMATICAL +GRAMMATICALITY +GRAMMATICALLY +GRAMMATICALNESS +GRAMME +GRAMMES +GRAMOPHONE +GRAMOPHONES +GRAMP +GRAMPA +GRAMPAS +GRAMPS +GRAMPUS +GRAMPUSES +GRAMS +GRAN +GRANA +GRANADILLA +GRANADILLAS +GRANARIES +GRANARY +GRAND +GRANDAD +GRANDADDIES +GRANDADDY +GRANDADS +GRANDAM +GRANDAME +GRANDAMES +GRANDAMS +GRANDAUNT +GRANDAUNTS +GRANDBABIES +GRANDBABY +GRANDCHILD +GRANDCHILDREN +GRANDDAD +GRANDDADDIES +GRANDDADDY +GRANDDADS +GRANDDAM +GRANDDAMS +GRANDDAUGHTER +GRANDDAUGHTERS +GRANDEE +GRANDEES +GRANDER +GRANDEST +GRANDEUR +GRANDEURS +GRANDFATHER +GRANDFATHERED +GRANDFATHERING +GRANDFATHERLY +GRANDFATHERS +GRANDIFLORA +GRANDIFLORAS +GRANDILOQUENCE +GRANDILOQUENCES +GRANDILOQUENT +GRANDILOQUENTLY +GRANDIOSE +GRANDIOSELY +GRANDIOSENESS +GRANDIOSENESSES +GRANDIOSITIES +GRANDIOSITY +GRANDIOSO +GRANDKID +GRANDKIDS +GRANDLY +GRANDMA +GRANDMAMA +GRANDMAMAS +GRANDMAS +GRANDMOTHER +GRANDMOTHERLY +GRANDMOTHERS +GRANDNEPHEW +GRANDNEPHEWS +GRANDNESS +GRANDNESSES +GRANDNIECE +GRANDNIECES +GRANDPA +GRANDPAPA +GRANDPAPAS +GRANDPARENT +GRANDPARENTAL +GRANDPARENTHOOD +GRANDPARENTS +GRANDPAS +GRANDS +GRANDSIR +GRANDSIRE +GRANDSIRES +GRANDSIRS +GRANDSON +GRANDSONS +GRANDSTAND +GRANDSTANDED +GRANDSTANDER +GRANDSTANDERS +GRANDSTANDING +GRANDSTANDS +GRANDUNCLE +GRANDUNCLES +GRANGE +GRANGER +GRANGERISM +GRANGERISMS +GRANGERS +GRANGES +GRANITA +GRANITAS +GRANITE +GRANITELIKE +GRANITES +GRANITEWARE +GRANITEWARES +GRANITIC +GRANITOID +GRANIVOROUS +GRANNIE +GRANNIES +GRANNY +GRANODIORITE +GRANODIORITES +GRANODIORITIC +GRANOLA +GRANOLAS +GRANOLITH +GRANOLITHIC +GRANOLITHS +GRANOPHYRE +GRANOPHYRES +GRANOPHYRIC +GRANS +GRANT +GRANTABLE +GRANTED +GRANTEE +GRANTEES +GRANTER +GRANTERS +GRANTING +GRANTOR +GRANTORS +GRANTS +GRANTSMAN +GRANTSMANSHIP +GRANTSMANSHIPS +GRANTSMEN +GRANULAR +GRANULARITIES +GRANULARITY +GRANULATE +GRANULATED +GRANULATES +GRANULATING +GRANULATION +GRANULATIONS +GRANULATOR +GRANULATORS +GRANULE +GRANULES +GRANULITE +GRANULITES +GRANULITIC +GRANULOCYTE +GRANULOCYTES +GRANULOCYTIC +GRANULOMA +GRANULOMAS +GRANULOMATA +GRANULOMATOUS +GRANULOSE +GRANULOSES +GRANULOSIS +GRANUM +GRAPE +GRAPEFRUIT +GRAPEFRUITS +GRAPELIKE +GRAPERIES +GRAPERY +GRAPES +GRAPESHOT +GRAPEVINE +GRAPEVINES +GRAPEY +GRAPH +GRAPHED +GRAPHEME +GRAPHEMES +GRAPHEMIC +GRAPHEMICALLY +GRAPHEMICS +GRAPHIC +GRAPHICAL +GRAPHICALLY +GRAPHICNESS +GRAPHICNESSES +GRAPHICS +GRAPHING +GRAPHITE +GRAPHITES +GRAPHITIC +GRAPHITIZABLE +GRAPHITIZATION +GRAPHITIZATIONS +GRAPHITIZE +GRAPHITIZED +GRAPHITIZES +GRAPHITIZING +GRAPHOLECT +GRAPHOLECTS +GRAPHOLOGICAL +GRAPHOLOGIES +GRAPHOLOGIST +GRAPHOLOGISTS +GRAPHOLOGY +GRAPHS +GRAPIER +GRAPIEST +GRAPINESS +GRAPINESSES +GRAPLIN +GRAPLINE +GRAPLINES +GRAPLINS +GRAPNEL +GRAPNELS +GRAPPA +GRAPPAS +GRAPPLE +GRAPPLED +GRAPPLER +GRAPPLERS +GRAPPLES +GRAPPLING +GRAPPLINGS +GRAPTOLITE +GRAPTOLITES +GRAPY +GRASP +GRASPABLE +GRASPED +GRASPER +GRASPERS +GRASPING +GRASPINGLY +GRASPINGNESS +GRASPINGNESSES +GRASPS +GRASS +GRASSED +GRASSES +GRASSHOPPER +GRASSHOPPERS +GRASSIER +GRASSIEST +GRASSILY +GRASSING +GRASSLAND +GRASSLANDS +GRASSLESS +GRASSLIKE +GRASSPLOT +GRASSPLOTS +GRASSROOT +GRASSROOTS +GRASSY +GRAT +GRATE +GRATED +GRATEFUL +GRATEFULLER +GRATEFULLEST +GRATEFULLY +GRATEFULNESS +GRATEFULNESSES +GRATELESS +GRATER +GRATERS +GRATES +GRATICULE +GRATICULES +GRATIFICATION +GRATIFICATIONS +GRATIFIED +GRATIFIER +GRATIFIERS +GRATIFIES +GRATIFY +GRATIFYING +GRATIFYINGLY +GRATIN +GRATINE +GRATINEE +GRATINEED +GRATINEEING +GRATINEES +GRATING +GRATINGLY +GRATINGS +GRATINS +GRATIS +GRATITUDE +GRATITUDES +GRATUITIES +GRATUITOUS +GRATUITOUSLY +GRATUITOUSNESS +GRATUITY +GRATULATE +GRATULATED +GRATULATES +GRATULATING +GRATULATION +GRATULATIONS +GRATULATORY +GRAUPEL +GRAUPELS +GRAVAMEN +GRAVAMENS +GRAVAMINA +GRAVE +GRAVED +GRAVEL +GRAVELED +GRAVELESS +GRAVELIKE +GRAVELING +GRAVELLED +GRAVELLING +GRAVELLY +GRAVELS +GRAVELY +GRAVEN +GRAVENESS +GRAVENESSES +GRAVER +GRAVERS +GRAVES +GRAVESIDE +GRAVESIDES +GRAVESITE +GRAVESITES +GRAVEST +GRAVESTONE +GRAVESTONES +GRAVEWARD +GRAVEYARD +GRAVEYARDS +GRAVID +GRAVIDA +GRAVIDAE +GRAVIDAS +GRAVIDITIES +GRAVIDITY +GRAVIDLY +GRAVIES +GRAVIMETER +GRAVIMETERS +GRAVIMETRIC +GRAVIMETRICALLY +GRAVIMETRIES +GRAVIMETRY +GRAVING +GRAVITAS +GRAVITASES +GRAVITATE +GRAVITATED +GRAVITATES +GRAVITATING +GRAVITATION +GRAVITATIONAL +GRAVITATIONALLY +GRAVITATIONS +GRAVITATIVE +GRAVITIES +GRAVITINO +GRAVITINOS +GRAVITON +GRAVITONS +GRAVITY +GRAVLAKS +GRAVLAX +GRAVURE +GRAVURES +GRAVY +GRAY +GRAYBACK +GRAYBACKS +GRAYBEARD +GRAYBEARDS +GRAYED +GRAYER +GRAYEST +GRAYFISH +GRAYFISHES +GRAYHOUND +GRAYHOUNDS +GRAYING +GRAYISH +GRAYLAG +GRAYLAGS +GRAYLING +GRAYLINGS +GRAYLY +GRAYMAIL +GRAYMAILS +GRAYNESS +GRAYNESSES +GRAYOUT +GRAYOUTS +GRAYS +GRAYSCALE +GRAYWACKE +GRAYWACKES +GRAYWATER +GRAYWATERS +GRAZABLE +GRAZE +GRAZEABLE +GRAZED +GRAZER +GRAZERS +GRAZES +GRAZIER +GRAZIERS +GRAZING +GRAZINGLY +GRAZINGS +GRAZIOSO +GREASE +GREASEBALL +GREASEBALLS +GREASED +GREASELESS +GREASEPAINT +GREASEPAINTS +GREASEPROOF +GREASEPROOFS +GREASER +GREASERS +GREASES +GREASEWOOD +GREASEWOODS +GREASIER +GREASIEST +GREASILY +GREASINESS +GREASINESSES +GREASING +GREASY +GREAT +GREATCOAT +GREATCOATS +GREATEN +GREATENED +GREATENING +GREATENS +GREATER +GREATEST +GREATHEARTED +GREATHEARTEDLY +GREATLY +GREATNESS +GREATNESSES +GREATS +GREAVE +GREAVED +GREAVES +GREBE +GREBES +GRECIANIZE +GRECIANIZED +GRECIANIZES +GRECIANIZING +GRECIZE +GRECIZED +GRECIZES +GRECIZING +GREE +GREED +GREEDIER +GREEDIEST +GREEDILY +GREEDINESS +GREEDINESSES +GREEDLESS +GREEDS +GREEDSOME +GREEDY +GREEGREE +GREEGREES +GREEING +GREEK +GREEN +GREENBACK +GREENBACKER +GREENBACKERS +GREENBACKISM +GREENBACKISMS +GREENBACKS +GREENBELT +GREENBELTS +GREENBRIER +GREENBRIERS +GREENBUG +GREENBUGS +GREENED +GREENER +GREENERIES +GREENERY +GREENEST +GREENFIELD +GREENFIELDS +GREENFINCH +GREENFINCHES +GREENFLIES +GREENFLY +GREENGAGE +GREENGAGES +GREENGROCER +GREENGROCERIES +GREENGROCERS +GREENGROCERY +GREENHEAD +GREENHEADS +GREENHEART +GREENHEARTS +GREENHORN +GREENHORNS +GREENHOUSE +GREENHOUSES +GREENIE +GREENIER +GREENIES +GREENIEST +GREENING +GREENINGS +GREENISH +GREENISHNESS +GREENISHNESSES +GREENKEEPER +GREENKEEPERS +GREENLET +GREENLETS +GREENLIGHT +GREENLIGHTED +GREENLIGHTING +GREENLIGHTS +GREENLING +GREENLINGS +GREENLIT +GREENLY +GREENMAIL +GREENMAILED +GREENMAILER +GREENMAILERS +GREENMAILING +GREENMAILS +GREENNESS +GREENNESSES +GREENOCKITE +GREENOCKITES +GREENROOM +GREENROOMS +GREENS +GREENSAND +GREENSANDS +GREENSHANK +GREENSHANKS +GREENSICK +GREENSICKNESS +GREENSICKNESSES +GREENSKEEPER +GREENSKEEPERS +GREENSTONE +GREENSTONES +GREENSTUFF +GREENSTUFFS +GREENSWARD +GREENSWARDS +GREENTH +GREENTHS +GREENWASH +GREENWASHES +GREENWAY +GREENWAYS +GREENWING +GREENWINGS +GREENWOOD +GREENWOODS +GREENY +GREES +GREET +GREETED +GREETER +GREETERS +GREETING +GREETINGS +GREETS +GREGARINE +GREGARINES +GREGARIOUS +GREGARIOUSLY +GREGARIOUSNESS +GREGO +GREGOS +GREIGE +GREIGES +GREISEN +GREISENS +GREMIAL +GREMIALS +GREMLIN +GREMLINS +GREMMIE +GREMMIES +GREMMY +GRENADE +GRENADES +GRENADIER +GRENADIERS +GRENADINE +GRENADINES +GREW +GREWSOME +GREWSOMER +GREWSOMEST +GREY +GREYED +GREYER +GREYEST +GREYHEN +GREYHENS +GREYHOUND +GREYHOUNDS +GREYING +GREYISH +GREYLAG +GREYLAGS +GREYLY +GREYNESS +GREYNESSES +GREYS +GRIBBLE +GRIBBLES +GRID +GRIDDED +GRIDDER +GRIDDERS +GRIDDLE +GRIDDLED +GRIDDLES +GRIDDLING +GRIDE +GRIDED +GRIDES +GRIDING +GRIDIRON +GRIDIRONED +GRIDIRONING +GRIDIRONS +GRIDLOCK +GRIDLOCKED +GRIDLOCKING +GRIDLOCKS +GRIDS +GRIEF +GRIEFS +GRIEVANCE +GRIEVANCES +GRIEVANT +GRIEVANTS +GRIEVE +GRIEVED +GRIEVER +GRIEVERS +GRIEVES +GRIEVING +GRIEVOUS +GRIEVOUSLY +GRIEVOUSNESS +GRIEVOUSNESSES +GRIFF +GRIFFE +GRIFFES +GRIFFIN +GRIFFINS +GRIFFON +GRIFFONS +GRIFFS +GRIFT +GRIFTED +GRIFTER +GRIFTERS +GRIFTING +GRIFTS +GRIG +GRIGRI +GRIGRIS +GRIGS +GRILL +GRILLADE +GRILLADES +GRILLAGE +GRILLAGES +GRILLE +GRILLED +GRILLER +GRILLERIES +GRILLERS +GRILLERY +GRILLES +GRILLING +GRILLROOM +GRILLROOMS +GRILLS +GRILLWORK +GRILLWORKS +GRILSE +GRILSES +GRIM +GRIMACE +GRIMACED +GRIMACER +GRIMACERS +GRIMACES +GRIMACING +GRIMALKIN +GRIMALKINS +GRIME +GRIMED +GRIMES +GRIMIER +GRIMIEST +GRIMILY +GRIMINESS +GRIMINESSES +GRIMING +GRIMLY +GRIMMER +GRIMMEST +GRIMNESS +GRIMNESSES +GRIMY +GRIN +GRINCH +GRINCHES +GRIND +GRINDED +GRINDELIA +GRINDELIAS +GRINDER +GRINDERIES +GRINDERS +GRINDERY +GRINDING +GRINDINGLY +GRINDS +GRINDSTONE +GRINDSTONES +GRINGA +GRINGAS +GRINGO +GRINGOS +GRINNED +GRINNER +GRINNERS +GRINNING +GRINNINGLY +GRINS +GRIOT +GRIOTS +GRIP +GRIPE +GRIPED +GRIPER +GRIPERS +GRIPES +GRIPEY +GRIPIER +GRIPIEST +GRIPING +GRIPMAN +GRIPMEN +GRIPPE +GRIPPED +GRIPPER +GRIPPERS +GRIPPES +GRIPPIER +GRIPPIEST +GRIPPING +GRIPPINGLY +GRIPPLE +GRIPPY +GRIPS +GRIPSACK +GRIPSACKS +GRIPT +GRIPY +GRISAILLE +GRISAILLES +GRISEOFULVIN +GRISEOFULVINS +GRISEOUS +GRISETTE +GRISETTES +GRISKIN +GRISKINS +GRISLIER +GRISLIEST +GRISLINESS +GRISLINESSES +GRISLY +GRISON +GRISONS +GRIST +GRISTER +GRISTERS +GRISTLE +GRISTLES +GRISTLIER +GRISTLIEST +GRISTLINESS +GRISTLINESSES +GRISTLY +GRISTMILL +GRISTMILLS +GRISTS +GRIT +GRITH +GRITHS +GRITS +GRITTED +GRITTER +GRITTERS +GRITTIER +GRITTIEST +GRITTILY +GRITTINESS +GRITTINESSES +GRITTING +GRITTY +GRIVET +GRIVETS +GRIZZLE +GRIZZLED +GRIZZLER +GRIZZLERS +GRIZZLES +GRIZZLIER +GRIZZLIES +GRIZZLIEST +GRIZZLING +GRIZZLY +GROAN +GROANED +GROANER +GROANERS +GROANING +GROANS +GROAT +GROATS +GROCER +GROCERIES +GROCERS +GROCERY +GRODIER +GRODIEST +GRODY +GROG +GROGGERIES +GROGGERY +GROGGIER +GROGGIEST +GROGGILY +GROGGINESS +GROGGINESSES +GROGGY +GROGRAM +GROGRAMS +GROGS +GROGSHOP +GROGSHOPS +GROIN +GROINED +GROINING +GROINS +GROK +GROKKED +GROKKING +GROKS +GROMMET +GROMMETED +GROMMETING +GROMMETS +GROMWELL +GROMWELLS +GROOM +GROOMED +GROOMER +GROOMERS +GROOMING +GROOMS +GROOMSMAN +GROOMSMEN +GROOVE +GROOVED +GROOVER +GROOVERS +GROOVES +GROOVIER +GROOVIEST +GROOVING +GROOVY +GROPE +GROPED +GROPER +GROPERS +GROPES +GROPING +GROPINGLY +GROSBEAK +GROSBEAKS +GROSCHEN +GROSGRAIN +GROSGRAINS +GROSS +GROSSED +GROSSER +GROSSERS +GROSSES +GROSSEST +GROSSING +GROSSLY +GROSSNESS +GROSSNESSES +GROSSULAR +GROSSULARITE +GROSSULARITES +GROSSULARS +GROSZ +GROSZE +GROSZY +GROT +GROTESQUE +GROTESQUELY +GROTESQUENESS +GROTESQUENESSES +GROTESQUERIE +GROTESQUERIES +GROTESQUERY +GROTESQUES +GROTS +GROTTIER +GROTTIEST +GROTTO +GROTTOED +GROTTOES +GROTTOS +GROTTY +GROUCH +GROUCHED +GROUCHES +GROUCHIER +GROUCHIEST +GROUCHILY +GROUCHINESS +GROUCHINESSES +GROUCHING +GROUCHY +GROUND +GROUNDBREAKER +GROUNDBREAKERS +GROUNDBREAKING +GROUNDBURST +GROUNDBURSTS +GROUNDED +GROUNDER +GROUNDERS +GROUNDFISH +GROUNDFISHES +GROUNDHOG +GROUNDHOGS +GROUNDING +GROUNDINGS +GROUNDLESS +GROUNDLESSLY +GROUNDLESSNESS +GROUNDLING +GROUNDLINGS +GROUNDMASS +GROUNDMASSES +GROUNDNUT +GROUNDNUTS +GROUNDOUT +GROUNDOUTS +GROUNDS +GROUNDSEL +GROUNDSELS +GROUNDSHEET +GROUNDSHEETS +GROUNDSKEEPER +GROUNDSKEEPERS +GROUNDSMAN +GROUNDSMEN +GROUNDSWELL +GROUNDSWELLS +GROUNDWATER +GROUNDWATERS +GROUNDWOOD +GROUNDWOODS +GROUNDWORK +GROUNDWORKS +GROUP +GROUPABLE +GROUPED +GROUPER +GROUPERS +GROUPIE +GROUPIES +GROUPING +GROUPINGS +GROUPOID +GROUPOIDS +GROUPS +GROUPTHINK +GROUPTHINKS +GROUPUSCULE +GROUPUSCULES +GROUPWARE +GROUPWARES +GROUSE +GROUSED +GROUSER +GROUSERS +GROUSES +GROUSING +GROUT +GROUTED +GROUTER +GROUTERS +GROUTIER +GROUTIEST +GROUTING +GROUTS +GROUTY +GROVE +GROVED +GROVEL +GROVELED +GROVELER +GROVELERS +GROVELESS +GROVELING +GROVELINGLY +GROVELLED +GROVELLER +GROVELLERS +GROVELLING +GROVELS +GROVES +GROW +GROWABLE +GROWER +GROWERS +GROWING +GROWINGLY +GROWL +GROWLED +GROWLER +GROWLERS +GROWLIER +GROWLIEST +GROWLINESS +GROWLINESSES +GROWLING +GROWLINGLY +GROWLS +GROWLY +GROWN +GROWNUP +GROWNUPS +GROWS +GROWTH +GROWTHIER +GROWTHIEST +GROWTHINESS +GROWTHINESSES +GROWTHS +GROWTHY +GROYNE +GROYNES +GRUB +GRUBBED +GRUBBER +GRUBBERS +GRUBBIER +GRUBBIEST +GRUBBILY +GRUBBINESS +GRUBBINESSES +GRUBBING +GRUBBY +GRUBS +GRUBSTAKE +GRUBSTAKED +GRUBSTAKER +GRUBSTAKERS +GRUBSTAKES +GRUBSTAKING +GRUBWORM +GRUBWORMS +GRUDGE +GRUDGED +GRUDGER +GRUDGERS +GRUDGES +GRUDGING +GRUDGINGLY +GRUE +GRUEL +GRUELED +GRUELER +GRUELERS +GRUELING +GRUELINGLY +GRUELINGS +GRUELLED +GRUELLER +GRUELLERS +GRUELLING +GRUELLINGS +GRUELS +GRUES +GRUESOME +GRUESOMELY +GRUESOMENESS +GRUESOMENESSES +GRUESOMER +GRUESOMEST +GRUFF +GRUFFED +GRUFFER +GRUFFEST +GRUFFIER +GRUFFIEST +GRUFFILY +GRUFFING +GRUFFISH +GRUFFLY +GRUFFNESS +GRUFFNESSES +GRUFFS +GRUFFY +GRUGRU +GRUGRUS +GRUIFORM +GRUM +GRUMBLE +GRUMBLED +GRUMBLER +GRUMBLERS +GRUMBLES +GRUMBLING +GRUMBLINGLY +GRUMBLY +GRUME +GRUMES +GRUMMER +GRUMMEST +GRUMMET +GRUMMETED +GRUMMETING +GRUMMETS +GRUMOSE +GRUMOUS +GRUMP +GRUMPED +GRUMPHIE +GRUMPHIES +GRUMPHY +GRUMPIER +GRUMPIEST +GRUMPILY +GRUMPINESS +GRUMPINESSES +GRUMPING +GRUMPISH +GRUMPS +GRUMPY +GRUNGE +GRUNGER +GRUNGERS +GRUNGES +GRUNGIER +GRUNGIEST +GRUNGY +GRUNION +GRUNIONS +GRUNT +GRUNTED +GRUNTER +GRUNTERS +GRUNTING +GRUNTLE +GRUNTLED +GRUNTLES +GRUNTLING +GRUNTS +GRUSHIE +GRUTCH +GRUTCHED +GRUTCHES +GRUTCHING +GRUTTEN +GRUYERE +GRUYERES +GRYPHON +GRYPHONS +GUACAMOLE +GUACAMOLES +GUACHARO +GUACHAROES +GUACHAROS +GUACO +GUACOS +GUAIAC +GUAIACOL +GUAIACOLS +GUAIACS +GUAIACUM +GUAIACUMS +GUAIOCUM +GUAIOCUMS +GUAN +GUANABANA +GUANABANAS +GUANACO +GUANACOS +GUANASE +GUANASES +GUANAY +GUANAYS +GUANETHIDINE +GUANETHIDINES +GUANIDIN +GUANIDINE +GUANIDINES +GUANIDINS +GUANIN +GUANINE +GUANINES +GUANINS +GUANO +GUANOS +GUANOSINE +GUANOSINES +GUANS +GUAR +GUARANA +GUARANAS +GUARANI +GUARANIES +GUARANIS +GUARANTEE +GUARANTEED +GUARANTEEING +GUARANTEES +GUARANTIED +GUARANTIES +GUARANTOR +GUARANTORS +GUARANTY +GUARANTYING +GUARD +GUARDANT +GUARDANTS +GUARDDOG +GUARDDOGS +GUARDED +GUARDEDLY +GUARDEDNESS +GUARDEDNESSES +GUARDER +GUARDERS +GUARDHOUSE +GUARDHOUSES +GUARDIAN +GUARDIANS +GUARDIANSHIP +GUARDIANSHIPS +GUARDING +GUARDRAIL +GUARDRAILS +GUARDROOM +GUARDROOMS +GUARDS +GUARDSMAN +GUARDSMEN +GUARS +GUAVA +GUAVAS +GUAYABERA +GUAYABERAS +GUAYULE +GUAYULES +GUBERNATORIAL +GUCK +GUCKS +GUDE +GUDES +GUDGEON +GUDGEONED +GUDGEONING +GUDGEONS +GUENON +GUENONS +GUERDON +GUERDONED +GUERDONING +GUERDONS +GUERIDON +GUERIDONS +GUERILLA +GUERILLAS +GUERNSEY +GUERNSEYS +GUERRILLA +GUERRILLAS +GUESS +GUESSABLE +GUESSED +GUESSER +GUESSERS +GUESSES +GUESSING +GUESSTIMATE +GUESSTIMATED +GUESSTIMATES +GUESSTIMATING +GUESSWORK +GUESSWORKS +GUEST +GUESTED +GUESTING +GUESTS +GUFF +GUFFAW +GUFFAWED +GUFFAWING +GUFFAWS +GUFFS +GUGGLE +GUGGLED +GUGGLES +GUGGLING +GUGLET +GUGLETS +GUID +GUIDABLE +GUIDANCE +GUIDANCES +GUIDE +GUIDEBOOK +GUIDEBOOKS +GUIDED +GUIDELESS +GUIDELINE +GUIDELINES +GUIDEPOST +GUIDEPOSTS +GUIDER +GUIDERS +GUIDES +GUIDEWAY +GUIDEWAYS +GUIDEWORD +GUIDEWORDS +GUIDING +GUIDON +GUIDONS +GUIDS +GUIDWILLIE +GUILD +GUILDER +GUILDERS +GUILDHALL +GUILDHALLS +GUILDS +GUILDSHIP +GUILDSHIPS +GUILDSMAN +GUILDSMEN +GUILE +GUILED +GUILEFUL +GUILEFULLY +GUILEFULNESS +GUILEFULNESSES +GUILELESS +GUILELESSLY +GUILELESSNESS +GUILELESSNESSES +GUILES +GUILING +GUILLEMET +GUILLEMETS +GUILLEMOT +GUILLEMOTS +GUILLOCHE +GUILLOCHES +GUILLOTINE +GUILLOTINED +GUILLOTINES +GUILLOTINING +GUILT +GUILTIER +GUILTIEST +GUILTILY +GUILTINESS +GUILTINESSES +GUILTLESS +GUILTLESSLY +GUILTLESSNESS +GUILTLESSNESSES +GUILTS +GUILTY +GUIMPE +GUIMPES +GUINEA +GUINEAS +GUIPURE +GUIPURES +GUIRO +GUIROS +GUISARD +GUISARDS +GUISE +GUISED +GUISES +GUISING +GUITAR +GUITARFISH +GUITARFISHES +GUITARIST +GUITARISTS +GUITARS +GUITGUIT +GUITGUITS +GUL +GULAG +GULAGS +GULAR +GULCH +GULCHES +GULDEN +GULDENS +GULES +GULF +GULFED +GULFIER +GULFIEST +GULFING +GULFLIKE +GULFS +GULFWEED +GULFWEEDS +GULFY +GULL +GULLABLE +GULLABLY +GULLED +GULLET +GULLETS +GULLEY +GULLEYS +GULLIBILITIES +GULLIBILITY +GULLIBLE +GULLIBLY +GULLIED +GULLIES +GULLING +GULLS +GULLWING +GULLY +GULLYING +GULOSITIES +GULOSITY +GULP +GULPED +GULPER +GULPERS +GULPIER +GULPIEST +GULPING +GULPINGLY +GULPS +GULPY +GULS +GUM +GUMBALL +GUMBALLS +GUMBO +GUMBOIL +GUMBOILS +GUMBOOT +GUMBOOTS +GUMBOS +GUMBOTIL +GUMBOTILS +GUMDROP +GUMDROPS +GUMLESS +GUMLIKE +GUMLINE +GUMLINES +GUMMA +GUMMAS +GUMMATA +GUMMATOUS +GUMMED +GUMMER +GUMMERS +GUMMIER +GUMMIEST +GUMMINESS +GUMMINESSES +GUMMING +GUMMITE +GUMMITES +GUMMOSE +GUMMOSES +GUMMOSIS +GUMMOUS +GUMMY +GUMPTION +GUMPTIONS +GUMPTIOUS +GUMS +GUMSHOE +GUMSHOED +GUMSHOEING +GUMSHOES +GUMTREE +GUMTREES +GUMWEED +GUMWEEDS +GUMWOOD +GUMWOODS +GUN +GUNBOAT +GUNBOATS +GUNCOTTON +GUNCOTTONS +GUNDOG +GUNDOGS +GUNFIGHT +GUNFIGHTER +GUNFIGHTERS +GUNFIGHTING +GUNFIGHTS +GUNFIRE +GUNFIRES +GUNFLINT +GUNFLINTS +GUNFOUGHT +GUNITE +GUNITES +GUNK +GUNKHOLE +GUNKHOLED +GUNKHOLES +GUNKHOLING +GUNKIER +GUNKIEST +GUNKS +GUNKY +GUNLESS +GUNLOCK +GUNLOCKS +GUNMAN +GUNMEN +GUNMETAL +GUNMETALS +GUNNED +GUNNEL +GUNNELS +GUNNEN +GUNNER +GUNNERIES +GUNNERS +GUNNERY +GUNNIES +GUNNING +GUNNINGS +GUNNY +GUNNYBAG +GUNNYBAGS +GUNNYSACK +GUNNYSACKS +GUNPAPER +GUNPAPERS +GUNPLAY +GUNPLAYS +GUNPOINT +GUNPOINTS +GUNPOWDER +GUNPOWDERS +GUNROOM +GUNROOMS +GUNRUNNER +GUNRUNNERS +GUNRUNNING +GUNRUNNINGS +GUNS +GUNSEL +GUNSELS +GUNSHIP +GUNSHIPS +GUNSHOT +GUNSHOTS +GUNSLINGER +GUNSLINGERS +GUNSLINGING +GUNSLINGINGS +GUNSMITH +GUNSMITHING +GUNSMITHINGS +GUNSMITHS +GUNSTOCK +GUNSTOCKS +GUNWALE +GUNWALES +GUPPIES +GUPPY +GURGE +GURGED +GURGES +GURGING +GURGLE +GURGLED +GURGLES +GURGLET +GURGLETS +GURGLING +GURNARD +GURNARDS +GURNET +GURNETS +GURNEY +GURNEYS +GURRIES +GURRY +GURSH +GURSHES +GURU +GURUS +GURUSHIP +GURUSHIPS +GUSH +GUSHED +GUSHER +GUSHERS +GUSHES +GUSHIER +GUSHIEST +GUSHILY +GUSHINESS +GUSHINESSES +GUSHING +GUSHINGLY +GUSHY +GUSSET +GUSSETED +GUSSETING +GUSSETS +GUSSIE +GUSSIED +GUSSIES +GUSSY +GUSSYING +GUST +GUSTABLE +GUSTABLES +GUSTATION +GUSTATIONS +GUSTATIVE +GUSTATORILY +GUSTATORY +GUSTED +GUSTIER +GUSTIEST +GUSTILY +GUSTINESS +GUSTINESSES +GUSTING +GUSTLESS +GUSTO +GUSTOES +GUSTS +GUSTY +GUT +GUTBUCKET +GUTBUCKETS +GUTLESS +GUTLESSNESS +GUTLESSNESSES +GUTLIKE +GUTS +GUTSIER +GUTSIEST +GUTSILY +GUTSINESS +GUTSINESSES +GUTSY +GUTTA +GUTTAE +GUTTATE +GUTTATED +GUTTATION +GUTTATIONS +GUTTED +GUTTER +GUTTERED +GUTTERING +GUTTERINGS +GUTTERS +GUTTERSNIPE +GUTTERSNIPES +GUTTERSNIPISH +GUTTERY +GUTTIER +GUTTIEST +GUTTING +GUTTLE +GUTTLED +GUTTLER +GUTTLERS +GUTTLES +GUTTLING +GUTTURAL +GUTTURALISM +GUTTURALISMS +GUTTURALS +GUTTY +GUV +GUVS +GUY +GUYED +GUYING +GUYLINE +GUYLINES +GUYOT +GUYOTS +GUYS +GUZZLE +GUZZLED +GUZZLER +GUZZLERS +GUZZLES +GUZZLING +GWEDUC +GWEDUCK +GWEDUCKS +GWEDUCS +GWINE +GYBE +GYBED +GYBES +GYBING +GYM +GYMKHANA +GYMKHANAS +GYMNASIA +GYMNASIAL +GYMNASIUM +GYMNASIUMS +GYMNAST +GYMNASTIC +GYMNASTICALLY +GYMNASTICS +GYMNASTS +GYMNOSOPHIST +GYMNOSOPHISTS +GYMNOSPERM +GYMNOSPERMIES +GYMNOSPERMOUS +GYMNOSPERMS +GYMNOSPERMY +GYMS +GYNAECEA +GYNAECEUM +GYNAECIA +GYNAECIUM +GYNAECOLOGIES +GYNAECOLOGY +GYNANDRIES +GYNANDROMORPH +GYNANDROMORPHIC +GYNANDROMORPHS +GYNANDROMORPHY +GYNANDROUS +GYNANDRY +GYNARCHIC +GYNARCHIES +GYNARCHY +GYNECIA +GYNECIC +GYNECIUM +GYNECOCRACIES +GYNECOCRACY +GYNECOCRATIC +GYNECOID +GYNECOLOGIC +GYNECOLOGICAL +GYNECOLOGIES +GYNECOLOGIST +GYNECOLOGISTS +GYNECOLOGY +GYNECOMASTIA +GYNECOMASTIAS +GYNIATRIES +GYNIATRY +GYNOECIA +GYNOECIUM +GYNOGENESES +GYNOGENESIS +GYNOGENETIC +GYNOPHOBE +GYNOPHOBES +GYNOPHORE +GYNOPHORES +GYOZA +GYOZAS +GYP +GYPLURE +GYPLURES +GYPPED +GYPPER +GYPPERS +GYPPING +GYPS +GYPSEIAN +GYPSEOUS +GYPSIED +GYPSIES +GYPSIFEROUS +GYPSOPHILA +GYPSOPHILAS +GYPSTER +GYPSTERS +GYPSUM +GYPSUMS +GYPSY +GYPSYDOM +GYPSYDOMS +GYPSYING +GYPSYISH +GYPSYISM +GYPSYISMS +GYRAL +GYRALLY +GYRASE +GYRASES +GYRATE +GYRATED +GYRATES +GYRATING +GYRATION +GYRATIONAL +GYRATIONS +GYRATOR +GYRATORS +GYRATORY +GYRE +GYRED +GYRENE +GYRENES +GYRES +GYRFALCON +GYRFALCONS +GYRI +GYRING +GYRO +GYROCOMPASS +GYROCOMPASSES +GYROFREQUENCIES +GYROFREQUENCY +GYROIDAL +GYROMAGNETIC +GYRON +GYRONS +GYROPILOT +GYROPILOTS +GYROPLANE +GYROPLANES +GYROS +GYROSCOPE +GYROSCOPES +GYROSCOPIC +GYROSCOPICALLY +GYROSE +GYROSTABILIZER +GYROSTABILIZERS +GYROSTAT +GYROSTATS +GYRUS +GYTTJA +GYTTJAS +GYVE +GYVED +GYVES +GYVING +HA +HAAF +HAAFS +HAAR +HAARS +HABANERA +HABANERAS +HABANERO +HABANEROS +HABDALAH +HABDALAHS +HABERDASHER +HABERDASHERIES +HABERDASHERS +HABERDASHERY +HABERGEON +HABERGEONS +HABILE +HABILIMENT +HABILIMENTS +HABILITATE +HABILITATED +HABILITATES +HABILITATING +HABILITATION +HABILITATIONS +HABIT +HABITABILITIES +HABITABILITY +HABITABLE +HABITABLENESS +HABITABLENESSES +HABITABLY +HABITAN +HABITANS +HABITANT +HABITANTS +HABITAT +HABITATION +HABITATIONS +HABITATS +HABITED +HABITING +HABITS +HABITUAL +HABITUALLY +HABITUALNESS +HABITUALNESSES +HABITUATE +HABITUATED +HABITUATES +HABITUATING +HABITUATION +HABITUATIONS +HABITUDE +HABITUDES +HABITUE +HABITUES +HABITUS +HABOOB +HABOOBS +HABU +HABUS +HACEK +HACEKS +HACENDADO +HACENDADOS +HACHURE +HACHURED +HACHURES +HACHURING +HACIENDA +HACIENDADO +HACIENDADOS +HACIENDAS +HACK +HACKABLE +HACKAMORE +HACKAMORES +HACKBERRIES +HACKBERRY +HACKBUT +HACKBUTS +HACKED +HACKEE +HACKEES +HACKER +HACKERS +HACKIE +HACKIES +HACKING +HACKLE +HACKLED +HACKLER +HACKLERS +HACKLES +HACKLIER +HACKLIEST +HACKLING +HACKLY +HACKMAN +HACKMATACK +HACKMATACKS +HACKMEN +HACKNEY +HACKNEYED +HACKNEYING +HACKNEYS +HACKS +HACKSAW +HACKSAWED +HACKSAWING +HACKSAWN +HACKSAWS +HACKWORK +HACKWORKS +HAD +HADAL +HADARIM +HADDEST +HADDOCK +HADDOCKS +HADE +HADED +HADES +HADING +HADITH +HADITHS +HADJ +HADJEE +HADJEES +HADJES +HADJI +HADJIS +HADRON +HADRONIC +HADRONS +HADROSAUR +HADROSAURS +HADST +HAE +HAECCEITIES +HAECCEITY +HAED +HAEING +HAEM +HAEMAL +HAEMATAL +HAEMATIC +HAEMATICS +HAEMATIN +HAEMATINS +HAEMATITE +HAEMATITES +HAEMIC +HAEMIN +HAEMINS +HAEMOID +HAEMS +HAEN +HAEREDES +HAERES +HAES +HAET +HAETS +HAFFET +HAFFETS +HAFFIT +HAFFITS +HAFIZ +HAFIZES +HAFNIUM +HAFNIUMS +HAFT +HAFTARA +HAFTARAH +HAFTARAHS +HAFTARAS +HAFTAROT +HAFTAROTH +HAFTED +HAFTER +HAFTERS +HAFTING +HAFTORAH +HAFTORAHS +HAFTOROS +HAFTOROT +HAFTOROTH +HAFTS +HAG +HAGADIC +HAGADIST +HAGADISTS +HAGBERRIES +HAGBERRY +HAGBORN +HAGBUSH +HAGBUSHES +HAGBUT +HAGBUTS +HAGDON +HAGDONS +HAGFISH +HAGFISHES +HAGGADA +HAGGADAH +HAGGADAHS +HAGGADAS +HAGGADIC +HAGGADIST +HAGGADISTIC +HAGGADISTS +HAGGADOT +HAGGADOTH +HAGGARD +HAGGARDLY +HAGGARDNESS +HAGGARDNESSES +HAGGARDS +HAGGED +HAGGING +HAGGIS +HAGGISES +HAGGISH +HAGGISHLY +HAGGLE +HAGGLED +HAGGLER +HAGGLERS +HAGGLES +HAGGLING +HAGIARCHIES +HAGIARCHY +HAGIOGRAPHER +HAGIOGRAPHERS +HAGIOGRAPHIC +HAGIOGRAPHICAL +HAGIOGRAPHIES +HAGIOGRAPHY +HAGIOLOGIC +HAGIOLOGICAL +HAGIOLOGIES +HAGIOLOGY +HAGIOSCOPE +HAGIOSCOPES +HAGIOSCOPIC +HAGRIDDEN +HAGRIDE +HAGRIDER +HAGRIDERS +HAGRIDES +HAGRIDING +HAGRODE +HAGS +HAH +HAHA +HAHAS +HAHNIUM +HAHNIUMS +HAHS +HAIK +HAIKA +HAIKS +HAIKU +HAIKUS +HAIL +HAILED +HAILER +HAILERS +HAILING +HAILS +HAILSTONE +HAILSTONES +HAILSTORM +HAILSTORMS +HAIMISH +HAINT +HAINTS +HAIR +HAIRBALL +HAIRBALLS +HAIRBAND +HAIRBANDS +HAIRBREADTH +HAIRBREADTHS +HAIRBRUSH +HAIRBRUSHES +HAIRCAP +HAIRCAPS +HAIRCLOTH +HAIRCLOTHS +HAIRCUT +HAIRCUTS +HAIRCUTTER +HAIRCUTTERS +HAIRCUTTING +HAIRCUTTINGS +HAIRDO +HAIRDOS +HAIRDRESSER +HAIRDRESSERS +HAIRDRESSING +HAIRDRESSINGS +HAIRED +HAIRIER +HAIRIEST +HAIRINESS +HAIRINESSES +HAIRLESS +HAIRLESSNESS +HAIRLESSNESSES +HAIRLIKE +HAIRLINE +HAIRLINES +HAIRLOCK +HAIRLOCKS +HAIRNET +HAIRNETS +HAIRPIECE +HAIRPIECES +HAIRPIN +HAIRPINS +HAIRS +HAIRSBREADTH +HAIRSBREADTHS +HAIRSPLITTER +HAIRSPLITTERS +HAIRSPLITTING +HAIRSPLITTINGS +HAIRSPRAY +HAIRSPRAYS +HAIRSPRING +HAIRSPRINGS +HAIRSTREAK +HAIRSTREAKS +HAIRSTYLE +HAIRSTYLES +HAIRSTYLING +HAIRSTYLINGS +HAIRSTYLIST +HAIRSTYLISTS +HAIRWORK +HAIRWORKS +HAIRWORM +HAIRWORMS +HAIRY +HAJ +HAJES +HAJI +HAJIS +HAJJ +HAJJES +HAJJI +HAJJIS +HAKE +HAKEEM +HAKEEMS +HAKES +HAKIM +HAKIMS +HAKU +HAKUS +HALACHA +HALACHAS +HALACHIC +HALACHIST +HALACHISTS +HALACHOT +HALACHOTH +HALAKAH +HALAKAHS +HALAKHA +HALAKHAH +HALAKHAHS +HALAKHAS +HALAKHIC +HALAKHIST +HALAKHISTS +HALAKHOT +HALAKHOTH +HALAKIC +HALAKIST +HALAKISTS +HALAKOTH +HALAL +HALALA +HALALAH +HALALAHS +HALALAS +HALALS +HALATION +HALATIONS +HALAVAH +HALAVAHS +HALAZONE +HALAZONES +HALBERD +HALBERDS +HALBERT +HALBERTS +HALCYON +HALCYONS +HALE +HALED +HALENESS +HALENESSES +HALER +HALERS +HALERU +HALES +HALEST +HALF +HALFBACK +HALFBACKS +HALFBEAK +HALFBEAKS +HALFHEARTED +HALFHEARTEDLY +HALFHEARTEDNESS +HALFLIFE +HALFLIVES +HALFNESS +HALFNESSES +HALFPENCE +HALFPENNIES +HALFPENNY +HALFPIPE +HALFPIPES +HALFTIME +HALFTIMES +HALFTONE +HALFTONES +HALFTRACK +HALFTRACKS +HALFWAY +HALIBUT +HALIBUTS +HALID +HALIDE +HALIDES +HALIDOM +HALIDOME +HALIDOMES +HALIDOMS +HALIDS +HALING +HALITE +HALITES +HALITOSES +HALITOSIS +HALITUS +HALITUSES +HALL +HALLAH +HALLAHS +HALLAL +HALLEL +HALLELS +HALLELUJAH +HALLELUJAHS +HALLIARD +HALLIARDS +HALLMARK +HALLMARKED +HALLMARKING +HALLMARKS +HALLO +HALLOA +HALLOAED +HALLOAING +HALLOAS +HALLOED +HALLOES +HALLOING +HALLOO +HALLOOED +HALLOOING +HALLOOS +HALLOS +HALLOT +HALLOTH +HALLOW +HALLOWED +HALLOWER +HALLOWERS +HALLOWING +HALLOWS +HALLS +HALLUCAL +HALLUCES +HALLUCINATE +HALLUCINATED +HALLUCINATES +HALLUCINATING +HALLUCINATION +HALLUCINATIONS +HALLUCINATOR +HALLUCINATORS +HALLUCINATORY +HALLUCINOGEN +HALLUCINOGENIC +HALLUCINOGENICS +HALLUCINOGENS +HALLUCINOSES +HALLUCINOSIS +HALLUX +HALLWAY +HALLWAYS +HALM +HALMA +HALMAS +HALMS +HALO +HALOBIONT +HALOBIONTS +HALOCARBON +HALOCARBONS +HALOCLINE +HALOCLINES +HALOED +HALOES +HALOGEN +HALOGENATE +HALOGENATED +HALOGENATES +HALOGENATING +HALOGENATION +HALOGENATIONS +HALOGENOUS +HALOGENS +HALOGETON +HALOGETONS +HALOID +HALOIDS +HALOING +HALOLIKE +HALOMORPHIC +HALON +HALONS +HALOPERIDOL +HALOPERIDOLS +HALOPHILE +HALOPHILES +HALOPHILIC +HALOPHYTE +HALOPHYTES +HALOPHYTIC +HALOS +HALOTHANE +HALOTHANES +HALT +HALTED +HALTER +HALTERBREAK +HALTERBREAKING +HALTERBREAKS +HALTERBROKE +HALTERBROKEN +HALTERE +HALTERED +HALTERES +HALTERING +HALTERS +HALTING +HALTINGLY +HALTLESS +HALTS +HALUTZ +HALUTZIM +HALVA +HALVAH +HALVAHS +HALVAS +HALVE +HALVED +HALVERS +HALVES +HALVING +HALYARD +HALYARDS +HAM +HAMADA +HAMADAS +HAMADRYAD +HAMADRYADES +HAMADRYADS +HAMADRYAS +HAMADRYASES +HAMAL +HAMALS +HAMANTASCH +HAMANTASCHEN +HAMARTIA +HAMARTIAS +HAMATE +HAMATES +HAMAUL +HAMAULS +HAMBONE +HAMBONED +HAMBONES +HAMBONING +HAMBURG +HAMBURGER +HAMBURGERS +HAMBURGS +HAME +HAMES +HAMLET +HAMLETS +HAMMADA +HAMMADAS +HAMMAL +HAMMALS +HAMMAM +HAMMAMS +HAMMED +HAMMER +HAMMERED +HAMMERER +HAMMERERS +HAMMERHEAD +HAMMERHEADS +HAMMERING +HAMMERKOP +HAMMERKOPS +HAMMERLESS +HAMMERLOCK +HAMMERLOCKS +HAMMERS +HAMMERTOE +HAMMERTOES +HAMMIER +HAMMIEST +HAMMILY +HAMMINESS +HAMMINESSES +HAMMING +HAMMOCK +HAMMOCKS +HAMMY +HAMPER +HAMPERED +HAMPERER +HAMPERERS +HAMPERING +HAMPERS +HAMS +HAMSTER +HAMSTERS +HAMSTRING +HAMSTRINGING +HAMSTRINGS +HAMSTRUNG +HAMULAR +HAMULATE +HAMULI +HAMULOSE +HAMULOUS +HAMULUS +HAMZA +HAMZAH +HAMZAHS +HAMZAS +HANAPER +HANAPERS +HANCE +HANCES +HAND +HANDAX +HANDAXES +HANDBAG +HANDBAGS +HANDBALL +HANDBALLS +HANDBARROW +HANDBARROWS +HANDBASKET +HANDBASKETS +HANDBELL +HANDBELLS +HANDBILL +HANDBILLS +HANDBLOWN +HANDBOOK +HANDBOOKS +HANDBREADTH +HANDBREADTHS +HANDCAR +HANDCARS +HANDCART +HANDCARTS +HANDCLAP +HANDCLAPS +HANDCLASP +HANDCLASPS +HANDCRAFT +HANDCRAFTED +HANDCRAFTING +HANDCRAFTS +HANDCRAFTSMAN +HANDCRAFTSMEN +HANDCUFF +HANDCUFFED +HANDCUFFING +HANDCUFFS +HANDED +HANDEDNESS +HANDEDNESSES +HANDER +HANDERS +HANDFAST +HANDFASTED +HANDFASTING +HANDFASTS +HANDFUL +HANDFULS +HANDGRIP +HANDGRIPS +HANDGUN +HANDGUNS +HANDHELD +HANDHELDS +HANDHOLD +HANDHOLDS +HANDICAP +HANDICAPPED +HANDICAPPER +HANDICAPPERS +HANDICAPPING +HANDICAPS +HANDICRAFT +HANDICRAFTER +HANDICRAFTERS +HANDICRAFTS +HANDICRAFTSMAN +HANDICRAFTSMEN +HANDIER +HANDIEST +HANDILY +HANDINESS +HANDINESSES +HANDING +HANDIWORK +HANDIWORKS +HANDKERCHIEF +HANDKERCHIEFS +HANDKERCHIEVES +HANDLE +HANDLEABLE +HANDLEBAR +HANDLEBARS +HANDLED +HANDLELESS +HANDLER +HANDLERS +HANDLES +HANDLESS +HANDLIKE +HANDLING +HANDLINGS +HANDLIST +HANDLISTS +HANDLOOM +HANDLOOMS +HANDMADE +HANDMAID +HANDMAIDEN +HANDMAIDENS +HANDMAIDS +HANDOFF +HANDOFFS +HANDOUT +HANDOUTS +HANDOVER +HANDOVERS +HANDPICK +HANDPICKED +HANDPICKING +HANDPICKS +HANDPRESS +HANDPRESSES +HANDPRINT +HANDPRINTS +HANDRAIL +HANDRAILS +HANDS +HANDSAW +HANDSAWS +HANDSBREADTH +HANDSBREADTHS +HANDSEL +HANDSELED +HANDSELING +HANDSELLED +HANDSELLING +HANDSELS +HANDSET +HANDSETS +HANDSEWN +HANDSFUL +HANDSHAKE +HANDSHAKES +HANDSOME +HANDSOMELY +HANDSOMENESS +HANDSOMENESSES +HANDSOMER +HANDSOMEST +HANDSPIKE +HANDSPIKES +HANDSPRING +HANDSPRINGS +HANDSTAMP +HANDSTAMPED +HANDSTAMPING +HANDSTAMPS +HANDSTAND +HANDSTANDS +HANDWHEEL +HANDWHEELS +HANDWORK +HANDWORKER +HANDWORKERS +HANDWORKS +HANDWOVEN +HANDWRINGER +HANDWRINGERS +HANDWRIT +HANDWRITE +HANDWRITES +HANDWRITING +HANDWRITINGS +HANDWRITTEN +HANDWROTE +HANDWROUGHT +HANDY +HANDYMAN +HANDYMEN +HANDYPERSON +HANDYPERSONS +HANG +HANGABLE +HANGAR +HANGARED +HANGARING +HANGARS +HANGBIRD +HANGBIRDS +HANGDOG +HANGDOGS +HANGED +HANGER +HANGERS +HANGFIRE +HANGFIRES +HANGING +HANGINGS +HANGMAN +HANGMEN +HANGNAIL +HANGNAILS +HANGNEST +HANGNESTS +HANGOUT +HANGOUTS +HANGOVER +HANGOVERS +HANGS +HANGTAG +HANGTAGS +HANGUL +HANGUP +HANGUPS +HANIWA +HANK +HANKED +HANKER +HANKERED +HANKERER +HANKERERS +HANKERING +HANKERINGS +HANKERS +HANKIE +HANKIES +HANKING +HANKS +HANKY +HANSA +HANSAS +HANSE +HANSEATIC +HANSEL +HANSELED +HANSELING +HANSELLED +HANSELLING +HANSELS +HANSES +HANSOM +HANSOMS +HANT +HANTAVIRUS +HANTAVIRUSES +HANTED +HANTING +HANTLE +HANTLES +HANTS +HANUMAN +HANUMANS +HAO +HAOLE +HAOLES +HAP +HAPAX +HAPAXES +HAPHAZARD +HAPHAZARDLY +HAPHAZARDNESS +HAPHAZARDNESSES +HAPHAZARDRIES +HAPHAZARDRY +HAPHAZARDS +HAPHTARA +HAPHTARAH +HAPHTARAHS +HAPHTARAS +HAPHTAROT +HAPHTAROTH +HAPKIDO +HAPKIDOS +HAPLESS +HAPLESSLY +HAPLESSNESS +HAPLESSNESSES +HAPLITE +HAPLITES +HAPLOID +HAPLOIDIC +HAPLOIDIES +HAPLOIDS +HAPLOIDY +HAPLOLOGIES +HAPLOLOGY +HAPLONT +HAPLONTIC +HAPLONTS +HAPLOPIA +HAPLOPIAS +HAPLOSES +HAPLOSIS +HAPLOTYPE +HAPLOTYPES +HAPLY +HAPPED +HAPPEN +HAPPENCHANCE +HAPPENCHANCES +HAPPENED +HAPPENING +HAPPENINGS +HAPPENS +HAPPENSTANCE +HAPPENSTANCES +HAPPIER +HAPPIEST +HAPPILY +HAPPINESS +HAPPINESSES +HAPPING +HAPPY +HAPS +HAPTEN +HAPTENE +HAPTENES +HAPTENIC +HAPTENS +HAPTIC +HAPTICAL +HAPTOGLOBIN +HAPTOGLOBINS +HARANGUE +HARANGUED +HARANGUER +HARANGUERS +HARANGUES +HARANGUING +HARASS +HARASSED +HARASSER +HARASSERS +HARASSES +HARASSING +HARASSMENT +HARASSMENTS +HARBINGER +HARBINGERED +HARBINGERING +HARBINGERS +HARBOR +HARBORAGE +HARBORAGES +HARBORED +HARBORER +HARBORERS +HARBORFUL +HARBORFULS +HARBORING +HARBORLESS +HARBORMASTER +HARBORMASTERS +HARBOROUS +HARBORS +HARBORSIDE +HARBOUR +HARBOURED +HARBOURING +HARBOURS +HARD +HARDASS +HARDASSES +HARDBACK +HARDBACKS +HARDBALL +HARDBALLS +HARDBOARD +HARDBOARDS +HARDBOOT +HARDBOOTS +HARDBOUND +HARDBOUNDS +HARDCASE +HARDCORE +HARDCORES +HARDCOURT +HARDCOVER +HARDCOVERS +HARDEDGE +HARDEDGES +HARDEN +HARDENED +HARDENER +HARDENERS +HARDENING +HARDENINGS +HARDENS +HARDER +HARDEST +HARDFISTED +HARDGOODS +HARDHACK +HARDHACKS +HARDHANDED +HARDHANDEDNESS +HARDHAT +HARDHATS +HARDHEAD +HARDHEADED +HARDHEADEDLY +HARDHEADEDNESS +HARDHEADS +HARDIER +HARDIES +HARDIEST +HARDIHOOD +HARDIHOODS +HARDILY +HARDIMENT +HARDIMENTS +HARDINESS +HARDINESSES +HARDINGGRASS +HARDINGGRASSES +HARDLINE +HARDLY +HARDMOUTHED +HARDNESS +HARDNESSES +HARDNOSE +HARDNOSES +HARDPACK +HARDPACKS +HARDPAN +HARDPANS +HARDS +HARDSCRABBLE +HARDSET +HARDSHIP +HARDSHIPS +HARDSTAND +HARDSTANDING +HARDSTANDINGS +HARDSTANDS +HARDTACK +HARDTACKS +HARDTOP +HARDTOPS +HARDWARE +HARDWARES +HARDWIRE +HARDWIRED +HARDWIRES +HARDWIRING +HARDWOOD +HARDWOODS +HARDWORKING +HARDY +HARE +HAREBELL +HAREBELLS +HAREBRAINED +HARED +HAREEM +HAREEMS +HARELIKE +HARELIP +HARELIPS +HAREM +HAREMS +HARES +HARIANA +HARIANAS +HARICOT +HARICOTS +HARIJAN +HARIJANS +HARING +HARISSA +HARISSAS +HARK +HARKED +HARKEN +HARKENED +HARKENER +HARKENERS +HARKENING +HARKENS +HARKING +HARKS +HARL +HARLEQUIN +HARLEQUINADE +HARLEQUINADES +HARLEQUINS +HARLOT +HARLOTRIES +HARLOTRY +HARLOTS +HARLS +HARM +HARMATTAN +HARMATTANS +HARMED +HARMER +HARMERS +HARMFUL +HARMFULLY +HARMFULNESS +HARMFULNESSES +HARMIN +HARMINE +HARMINES +HARMING +HARMINS +HARMLESS +HARMLESSLY +HARMLESSNESS +HARMLESSNESSES +HARMONIC +HARMONICA +HARMONICALLY +HARMONICAS +HARMONICIST +HARMONICISTS +HARMONICS +HARMONIES +HARMONIOUS +HARMONIOUSLY +HARMONIOUSNESS +HARMONISE +HARMONISED +HARMONISES +HARMONISING +HARMONIST +HARMONISTS +HARMONIUM +HARMONIUMS +HARMONIZATION +HARMONIZATIONS +HARMONIZE +HARMONIZED +HARMONIZER +HARMONIZERS +HARMONIZES +HARMONIZING +HARMONY +HARMS +HARNESS +HARNESSED +HARNESSES +HARNESSING +HARP +HARPED +HARPER +HARPERS +HARPIES +HARPIN +HARPING +HARPINGS +HARPINS +HARPIST +HARPISTS +HARPOON +HARPOONED +HARPOONER +HARPOONERS +HARPOONING +HARPOONS +HARPS +HARPSICHORD +HARPSICHORDIST +HARPSICHORDISTS +HARPSICHORDS +HARPY +HARPYLIKE +HARQUEBUS +HARQUEBUSES +HARQUEBUSIER +HARQUEBUSIERS +HARRIDAN +HARRIDANS +HARRIED +HARRIER +HARRIERS +HARRIES +HARROW +HARROWED +HARROWER +HARROWERS +HARROWING +HARROWS +HARRUMPH +HARRUMPHED +HARRUMPHING +HARRUMPHS +HARRY +HARRYING +HARSH +HARSHEN +HARSHENED +HARSHENING +HARSHENS +HARSHER +HARSHEST +HARSHLY +HARSHNESS +HARSHNESSES +HARSLET +HARSLETS +HART +HARTAL +HARTALS +HARTEBEEST +HARTEBEESTS +HARTS +HARTSHORN +HARTSHORNS +HARUMPH +HARUMPHED +HARUMPHING +HARUMPHS +HARUSPEX +HARUSPICATION +HARUSPICATIONS +HARUSPICES +HARVEST +HARVESTABLE +HARVESTED +HARVESTER +HARVESTERS +HARVESTING +HARVESTMAN +HARVESTMEN +HARVESTS +HARVESTTIME +HARVESTTIMES +HAS +HASENPFEFFER +HASENPFEFFERS +HASH +HASHED +HASHEESH +HASHEESHES +HASHES +HASHHEAD +HASHHEADS +HASHING +HASHISH +HASHISHES +HASLET +HASLETS +HASP +HASPED +HASPING +HASPS +HASSEL +HASSELS +HASSIUM +HASSIUMS +HASSLE +HASSLED +HASSLES +HASSLING +HASSOCK +HASSOCKS +HAST +HASTATE +HASTATELY +HASTE +HASTED +HASTEFUL +HASTEN +HASTENED +HASTENER +HASTENERS +HASTENING +HASTENS +HASTES +HASTIER +HASTIEST +HASTILY +HASTINESS +HASTINESSES +HASTING +HASTY +HAT +HATABLE +HATBAND +HATBANDS +HATBOX +HATBOXES +HATCH +HATCHABILITIES +HATCHABILITY +HATCHABLE +HATCHBACK +HATCHBACKS +HATCHECK +HATCHECKS +HATCHED +HATCHEL +HATCHELED +HATCHELING +HATCHELLED +HATCHELLING +HATCHELS +HATCHER +HATCHERIES +HATCHERS +HATCHERY +HATCHES +HATCHET +HATCHETS +HATCHING +HATCHINGS +HATCHLING +HATCHLINGS +HATCHMENT +HATCHMENTS +HATCHWAY +HATCHWAYS +HATE +HATEABLE +HATED +HATEFUL +HATEFULLY +HATEFULNESS +HATEFULNESSES +HATER +HATERS +HATES +HATFUL +HATFULS +HATH +HATING +HATLESS +HATLIKE +HATMAKER +HATMAKERS +HATPIN +HATPINS +HATRACK +HATRACKS +HATRED +HATREDS +HATS +HATSFUL +HATTED +HATTER +HATTERIA +HATTERIAS +HATTERS +HATTING +HAUBERK +HAUBERKS +HAUGH +HAUGHS +HAUGHTIER +HAUGHTIEST +HAUGHTILY +HAUGHTINESS +HAUGHTINESSES +HAUGHTY +HAUL +HAULAGE +HAULAGES +HAULED +HAULER +HAULERS +HAULIER +HAULIERS +HAULING +HAULM +HAULMIER +HAULMIEST +HAULMS +HAULMY +HAULS +HAULYARD +HAULYARDS +HAUNCH +HAUNCHED +HAUNCHES +HAUNT +HAUNTED +HAUNTER +HAUNTERS +HAUNTING +HAUNTINGLY +HAUNTS +HAUSEN +HAUSENS +HAUSFRAU +HAUSFRAUEN +HAUSFRAUS +HAUSTELLA +HAUSTELLUM +HAUSTORIA +HAUSTORIAL +HAUSTORIUM +HAUT +HAUTBOIS +HAUTBOY +HAUTBOYS +HAUTE +HAUTEUR +HAUTEURS +HAVARTI +HAVARTIS +HAVDALAH +HAVDALAHS +HAVE +HAVELOCK +HAVELOCKS +HAVEN +HAVENED +HAVENING +HAVENS +HAVER +HAVERED +HAVEREL +HAVERELS +HAVERING +HAVERS +HAVERSACK +HAVERSACKS +HAVES +HAVING +HAVIOR +HAVIORS +HAVIOUR +HAVIOURS +HAVOC +HAVOCKED +HAVOCKER +HAVOCKERS +HAVOCKING +HAVOCS +HAW +HAWALA +HAWALAS +HAWED +HAWFINCH +HAWFINCHES +HAWING +HAWK +HAWKBILL +HAWKBILLS +HAWKED +HAWKER +HAWKERS +HAWKEY +HAWKEYED +HAWKEYS +HAWKIE +HAWKIES +HAWKING +HAWKINGS +HAWKISH +HAWKISHLY +HAWKISHNESS +HAWKISHNESSES +HAWKLIKE +HAWKMOTH +HAWKMOTHS +HAWKNOSE +HAWKNOSES +HAWKS +HAWKSBILL +HAWKSBILLS +HAWKSHAW +HAWKSHAWS +HAWKWEED +HAWKWEEDS +HAWS +HAWSE +HAWSEHOLE +HAWSEHOLES +HAWSEPIPE +HAWSEPIPES +HAWSER +HAWSERS +HAWSES +HAWTHORN +HAWTHORNS +HAWTHORNY +HAY +HAYCOCK +HAYCOCKS +HAYED +HAYER +HAYERS +HAYEY +HAYFIELD +HAYFIELDS +HAYFORK +HAYFORKS +HAYING +HAYINGS +HAYLAGE +HAYLAGES +HAYLOFT +HAYLOFTS +HAYMAKER +HAYMAKERS +HAYMOW +HAYMOWS +HAYRACK +HAYRACKS +HAYRICK +HAYRICKS +HAYRIDE +HAYRIDES +HAYS +HAYSEED +HAYSEEDS +HAYSTACK +HAYSTACKS +HAYWARD +HAYWARDS +HAYWIRE +HAYWIRES +HAZAN +HAZANIM +HAZANS +HAZARD +HAZARDED +HAZARDER +HAZARDERS +HAZARDING +HAZARDOUS +HAZARDOUSLY +HAZARDOUSNESS +HAZARDOUSNESSES +HAZARDS +HAZE +HAZED +HAZEL +HAZELHEN +HAZELHENS +HAZELLY +HAZELNUT +HAZELNUTS +HAZELS +HAZER +HAZERS +HAZES +HAZIER +HAZIEST +HAZILY +HAZINESS +HAZINESSES +HAZING +HAZINGS +HAZMAT +HAZMATS +HAZY +HAZZAN +HAZZANIM +HAZZANS +HE +HEAD +HEADACHE +HEADACHES +HEADACHEY +HEADACHIER +HEADACHIEST +HEADACHY +HEADBAND +HEADBANDS +HEADBOARD +HEADBOARDS +HEADCHEESE +HEADCHEESES +HEADCOUNT +HEADCOUNTS +HEADDRESS +HEADDRESSES +HEADED +HEADEND +HEADENDS +HEADER +HEADERS +HEADFIRST +HEADFISH +HEADFISHES +HEADFOREMOST +HEADFUL +HEADFULS +HEADGATE +HEADGATES +HEADGEAR +HEADGEARS +HEADHUNT +HEADHUNTED +HEADHUNTER +HEADHUNTERS +HEADHUNTING +HEADHUNTS +HEADIER +HEADIEST +HEADILY +HEADINESS +HEADINESSES +HEADING +HEADINGS +HEADLAMP +HEADLAMPS +HEADLAND +HEADLANDS +HEADLESS +HEADLESSNESS +HEADLESSNESSES +HEADLIGHT +HEADLIGHTS +HEADLINE +HEADLINED +HEADLINER +HEADLINERS +HEADLINES +HEADLINING +HEADLOCK +HEADLOCKS +HEADLONG +HEADMAN +HEADMASTER +HEADMASTERS +HEADMASTERSHIP +HEADMASTERSHIPS +HEADMEN +HEADMISTRESS +HEADMISTRESSES +HEADMOST +HEADNOTE +HEADNOTES +HEADPHONE +HEADPHONES +HEADPIECE +HEADPIECES +HEADPIN +HEADPINS +HEADQUARTER +HEADQUARTERED +HEADQUARTERING +HEADQUARTERS +HEADRACE +HEADRACES +HEADREST +HEADRESTS +HEADROOM +HEADROOMS +HEADS +HEADSAIL +HEADSAILS +HEADSET +HEADSETS +HEADSHIP +HEADSHIPS +HEADSHRINKER +HEADSHRINKERS +HEADSMAN +HEADSMEN +HEADSPACE +HEADSPACES +HEADSPRING +HEADSPRINGS +HEADSTALL +HEADSTALLS +HEADSTAND +HEADSTANDS +HEADSTAY +HEADSTAYS +HEADSTOCK +HEADSTOCKS +HEADSTONE +HEADSTONES +HEADSTREAM +HEADSTREAMS +HEADSTRONG +HEADWAITER +HEADWAITERS +HEADWATER +HEADWATERS +HEADWAY +HEADWAYS +HEADWIND +HEADWINDS +HEADWORD +HEADWORDS +HEADWORK +HEADWORKS +HEADY +HEAL +HEALABLE +HEALED +HEALER +HEALERS +HEALING +HEALS +HEALTH +HEALTHFUL +HEALTHFULNESS +HEALTHFULNESSES +HEALTHIER +HEALTHIEST +HEALTHILY +HEALTHINESS +HEALTHINESSES +HEALTHS +HEALTHY +HEAP +HEAPED +HEAPER +HEAPERS +HEAPING +HEAPS +HEAPY +HEAR +HEARABLE +HEARD +HEARER +HEARERS +HEARING +HEARINGS +HEARKEN +HEARKENED +HEARKENER +HEARKENERS +HEARKENING +HEARKENS +HEARS +HEARSAY +HEARSAYS +HEARSE +HEARSED +HEARSES +HEARSING +HEART +HEARTACHE +HEARTACHES +HEARTBEAT +HEARTBEATS +HEARTBREAK +HEARTBREAKER +HEARTBREAKERS +HEARTBREAKING +HEARTBREAKINGLY +HEARTBREAKS +HEARTBROKEN +HEARTBURN +HEARTBURNING +HEARTBURNINGS +HEARTBURNS +HEARTED +HEARTEN +HEARTENED +HEARTENER +HEARTENERS +HEARTENING +HEARTENINGLY +HEARTENS +HEARTFELT +HEARTFREE +HEARTH +HEARTHRUG +HEARTHRUGS +HEARTHS +HEARTHSTONE +HEARTHSTONES +HEARTIER +HEARTIES +HEARTIEST +HEARTILY +HEARTINESS +HEARTINESSES +HEARTING +HEARTLAND +HEARTLANDS +HEARTLESS +HEARTLESSLY +HEARTLESSNESS +HEARTLESSNESSES +HEARTRENDING +HEARTRENDINGLY +HEARTS +HEARTSEASE +HEARTSEASES +HEARTSICK +HEARTSICKNESS +HEARTSICKNESSES +HEARTSOME +HEARTSOMELY +HEARTSORE +HEARTSTRING +HEARTSTRINGS +HEARTTHROB +HEARTTHROBS +HEARTWARMING +HEARTWOOD +HEARTWOODS +HEARTWORM +HEARTWORMS +HEARTY +HEAT +HEATABLE +HEATED +HEATEDLY +HEATER +HEATERS +HEATH +HEATHBIRD +HEATHBIRDS +HEATHEN +HEATHENDOM +HEATHENDOMS +HEATHENISH +HEATHENISHLY +HEATHENISM +HEATHENISMS +HEATHENIZE +HEATHENIZED +HEATHENIZES +HEATHENIZING +HEATHENRIES +HEATHENRY +HEATHENS +HEATHER +HEATHERED +HEATHERS +HEATHERY +HEATHIER +HEATHIEST +HEATHLAND +HEATHLANDS +HEATHLESS +HEATHLIKE +HEATHS +HEATHY +HEATING +HEATLESS +HEATPROOF +HEATS +HEATSTROKE +HEATSTROKES +HEAUME +HEAUMES +HEAVE +HEAVED +HEAVEN +HEAVENLIER +HEAVENLIEST +HEAVENLINESS +HEAVENLINESSES +HEAVENLY +HEAVENS +HEAVENWARD +HEAVENWARDS +HEAVER +HEAVERS +HEAVES +HEAVIER +HEAVIES +HEAVIEST +HEAVILY +HEAVINESS +HEAVINESSES +HEAVING +HEAVY +HEAVYHEARTED +HEAVYHEARTEDLY +HEAVYSET +HEAVYWEIGHT +HEAVYWEIGHTS +HEBDOMAD +HEBDOMADAL +HEBDOMADALLY +HEBDOMADS +HEBE +HEBEPHRENIA +HEBEPHRENIAS +HEBEPHRENIC +HEBEPHRENICS +HEBES +HEBETATE +HEBETATED +HEBETATES +HEBETATING +HEBETATION +HEBETATIONS +HEBETIC +HEBETUDE +HEBETUDES +HEBETUDINOUS +HEBRAIZATION +HEBRAIZATIONS +HEBRAIZE +HEBRAIZED +HEBRAIZES +HEBRAIZING +HECATOMB +HECATOMBS +HECK +HECKLE +HECKLED +HECKLER +HECKLERS +HECKLES +HECKLING +HECKS +HECTARE +HECTARES +HECTIC +HECTICAL +HECTICALLY +HECTICLY +HECTOGRAM +HECTOGRAMS +HECTOGRAPH +HECTOGRAPHED +HECTOGRAPHING +HECTOGRAPHS +HECTOLITER +HECTOLITERS +HECTOMETER +HECTOMETERS +HECTOR +HECTORED +HECTORING +HECTORINGLY +HECTORS +HEDDLE +HEDDLES +HEDER +HEDERS +HEDGE +HEDGED +HEDGEHOG +HEDGEHOGS +HEDGEHOP +HEDGEHOPPED +HEDGEHOPPER +HEDGEHOPPERS +HEDGEHOPPING +HEDGEHOPS +HEDGEPIG +HEDGEPIGS +HEDGER +HEDGEROW +HEDGEROWS +HEDGERS +HEDGES +HEDGIER +HEDGIEST +HEDGING +HEDGINGLY +HEDGY +HEDONIC +HEDONICALLY +HEDONICS +HEDONISM +HEDONISMS +HEDONIST +HEDONISTIC +HEDONISTICALLY +HEDONISTS +HEED +HEEDED +HEEDER +HEEDERS +HEEDFUL +HEEDFULLY +HEEDFULNESS +HEEDFULNESSES +HEEDING +HEEDLESS +HEEDLESSLY +HEEDLESSNESS +HEEDLESSNESSES +HEEDS +HEEHAW +HEEHAWED +HEEHAWING +HEEHAWS +HEEL +HEELBALL +HEELBALLS +HEELED +HEELER +HEELERS +HEELING +HEELINGS +HEELLESS +HEELPIECE +HEELPIECES +HEELPLATE +HEELPLATES +HEELPOST +HEELPOSTS +HEELS +HEELTAP +HEELTAPS +HEEZE +HEEZED +HEEZES +HEEZING +HEFT +HEFTED +HEFTER +HEFTERS +HEFTIER +HEFTIEST +HEFTILY +HEFTINESS +HEFTINESSES +HEFTING +HEFTS +HEFTY +HEGARI +HEGARIS +HEGEMON +HEGEMONIC +HEGEMONIES +HEGEMONS +HEGEMONY +HEGIRA +HEGIRAS +HEGUMEN +HEGUMENE +HEGUMENES +HEGUMENIES +HEGUMENOS +HEGUMENOSES +HEGUMENS +HEGUMENY +HEH +HEHS +HEIFER +HEIFERS +HEIGH +HEIGHT +HEIGHTEN +HEIGHTENED +HEIGHTENING +HEIGHTENS +HEIGHTH +HEIGHTHS +HEIGHTISM +HEIGHTISMS +HEIGHTS +HEIL +HEILED +HEILING +HEILS +HEIMISH +HEINIE +HEINIES +HEINOUS +HEINOUSLY +HEINOUSNESS +HEINOUSNESSES +HEIR +HEIRDOM +HEIRDOMS +HEIRED +HEIRESS +HEIRESSES +HEIRING +HEIRLESS +HEIRLOOM +HEIRLOOMS +HEIRS +HEIRSHIP +HEIRSHIPS +HEISHI +HEIST +HEISTED +HEISTER +HEISTERS +HEISTING +HEISTS +HEJIRA +HEJIRAS +HEKTARE +HEKTARES +HEKTOGRAM +HEKTOGRAMS +HELD +HELDENTENOR +HELDENTENORS +HELIAC +HELIACAL +HELIACALLY +HELIAST +HELIASTS +HELICAL +HELICALLY +HELICES +HELICITIES +HELICITY +HELICLINE +HELICLINES +HELICOID +HELICOIDAL +HELICOIDS +HELICON +HELICONIA +HELICONIAS +HELICONS +HELICOPT +HELICOPTED +HELICOPTER +HELICOPTERED +HELICOPTERING +HELICOPTERS +HELICOPTING +HELICOPTS +HELICTITE +HELICTITES +HELILIFT +HELILIFTED +HELILIFTING +HELILIFTS +HELIO +HELIOCENTRIC +HELIOGRAM +HELIOGRAMS +HELIOGRAPH +HELIOGRAPHED +HELIOGRAPHIC +HELIOGRAPHING +HELIOGRAPHS +HELIOLATRIES +HELIOLATROUS +HELIOLATRY +HELIOMETER +HELIOMETERS +HELIOMETRIC +HELIOMETRICALLY +HELIOS +HELIOSPHERE +HELIOSPHERES +HELIOSTAT +HELIOSTATS +HELIOTROPE +HELIOTROPES +HELIOTROPIC +HELIOTROPISM +HELIOTROPISMS +HELIOTYPE +HELIOTYPED +HELIOTYPES +HELIOTYPIES +HELIOTYPING +HELIOTYPY +HELIOZOAN +HELIOZOANS +HELIOZOIC +HELIPAD +HELIPADS +HELIPORT +HELIPORTS +HELISTOP +HELISTOPS +HELIUM +HELIUMS +HELIX +HELIXES +HELL +HELLACIOUS +HELLACIOUSLY +HELLBENDER +HELLBENDERS +HELLBENT +HELLBOX +HELLBOXES +HELLBROTH +HELLBROTHS +HELLCAT +HELLCATS +HELLDIVER +HELLDIVERS +HELLEBORE +HELLEBORES +HELLED +HELLENIZATION +HELLENIZATIONS +HELLENIZE +HELLENIZED +HELLENIZES +HELLENIZING +HELLER +HELLERI +HELLERIES +HELLERIS +HELLERS +HELLERY +HELLFIRE +HELLFIRES +HELLGRAMMITE +HELLGRAMMITES +HELLHOLE +HELLHOLES +HELLHOUND +HELLHOUNDS +HELLING +HELLION +HELLIONS +HELLISH +HELLISHLY +HELLISHNESS +HELLISHNESSES +HELLKITE +HELLKITES +HELLO +HELLOED +HELLOES +HELLOING +HELLOS +HELLS +HELLUVA +HELM +HELMED +HELMET +HELMETED +HELMETING +HELMETLIKE +HELMETS +HELMING +HELMINTH +HELMINTHIASES +HELMINTHIASIS +HELMINTHIC +HELMINTHOLOGIES +HELMINTHOLOGY +HELMINTHS +HELMLESS +HELMS +HELMSMAN +HELMSMANSHIP +HELMSMANSHIPS +HELMSMEN +HELO +HELOS +HELOT +HELOTAGE +HELOTAGES +HELOTISM +HELOTISMS +HELOTRIES +HELOTRY +HELOTS +HELP +HELPABLE +HELPED +HELPER +HELPERS +HELPFUL +HELPFULLY +HELPFULNESS +HELPFULNESSES +HELPING +HELPINGS +HELPLESS +HELPLESSLY +HELPLESSNESS +HELPLESSNESSES +HELPMATE +HELPMATES +HELPMEET +HELPMEETS +HELPS +HELVE +HELVED +HELVES +HELVING +HEM +HEMACYTOMETER +HEMACYTOMETERS +HEMAGGLUTINATE +HEMAGGLUTINATED +HEMAGGLUTINATES +HEMAGGLUTININ +HEMAGGLUTININS +HEMAGOG +HEMAGOGS +HEMAL +HEMANGIOMA +HEMANGIOMAS +HEMANGIOMATA +HEMATAL +HEMATEIN +HEMATEINS +HEMATIC +HEMATICS +HEMATIN +HEMATINE +HEMATINES +HEMATINIC +HEMATINICS +HEMATINS +HEMATITE +HEMATITES +HEMATITIC +HEMATOCRIT +HEMATOCRITS +HEMATOGENOUS +HEMATOID +HEMATOLOGIC +HEMATOLOGICAL +HEMATOLOGIES +HEMATOLOGIST +HEMATOLOGISTS +HEMATOLOGY +HEMATOMA +HEMATOMAS +HEMATOMATA +HEMATOPHAGOUS +HEMATOPOIESES +HEMATOPOIESIS +HEMATOPOIETIC +HEMATOPORPHYRIN +HEMATOSES +HEMATOSIS +HEMATOXYLIN +HEMATOXYLINS +HEMATOZOA +HEMATOZOON +HEMATURIA +HEMATURIAS +HEMATURIC +HEME +HEMELYTRA +HEMELYTRON +HEMELYTRUM +HEMEROCALLIS +HEMEROCALLISES +HEMERYTHRIN +HEMERYTHRINS +HEMES +HEMIACETAL +HEMIACETALS +HEMIALGIA +HEMIALGIAS +HEMIC +HEMICELLULOSE +HEMICELLULOSES +HEMICHORDATE +HEMICHORDATES +HEMICYCLE +HEMICYCLES +HEMIHEDRAL +HEMIHYDRATE +HEMIHYDRATED +HEMIHYDRATES +HEMIMETABOLOUS +HEMIMORPHIC +HEMIMORPHISM +HEMIMORPHISMS +HEMIN +HEMINS +HEMIOLA +HEMIOLAS +HEMIOLIA +HEMIOLIAS +HEMIPLEGIA +HEMIPLEGIAS +HEMIPLEGIC +HEMIPLEGICS +HEMIPTER +HEMIPTERAN +HEMIPTERANS +HEMIPTEROUS +HEMIPTERS +HEMISPHERE +HEMISPHERES +HEMISPHERIC +HEMISPHERICAL +HEMISTICH +HEMISTICHS +HEMITROPE +HEMITROPES +HEMIZYGOUS +HEMLINE +HEMLINES +HEMLOCK +HEMLOCKS +HEMMED +HEMMER +HEMMERS +HEMMING +HEMOCHROMATOSES +HEMOCHROMATOSIS +HEMOCOEL +HEMOCOELS +HEMOCYANIN +HEMOCYANINS +HEMOCYTE +HEMOCYTES +HEMOCYTOMETER +HEMOCYTOMETERS +HEMODIALYSES +HEMODIALYSIS +HEMODILUTION +HEMODILUTIONS +HEMODYNAMIC +HEMODYNAMICALLY +HEMODYNAMICS +HEMOFLAGELLATE +HEMOFLAGELLATES +HEMOGLOBIN +HEMOGLOBINS +HEMOGLOBINURIA +HEMOGLOBINURIAS +HEMOGLOBINURIC +HEMOID +HEMOLYMPH +HEMOLYMPHS +HEMOLYSES +HEMOLYSIN +HEMOLYSINS +HEMOLYSIS +HEMOLYTIC +HEMOLYZE +HEMOLYZED +HEMOLYZES +HEMOLYZING +HEMOPHILE +HEMOPHILES +HEMOPHILIA +HEMOPHILIAC +HEMOPHILIACS +HEMOPHILIAS +HEMOPHILIC +HEMOPHILICS +HEMOPOIESES +HEMOPOIESIS +HEMOPOIETIC +HEMOPROTEIN +HEMOPROTEINS +HEMOPTYSES +HEMOPTYSIS +HEMORRHAGE +HEMORRHAGED +HEMORRHAGES +HEMORRHAGIC +HEMORRHAGING +HEMORRHOID +HEMORRHOIDAL +HEMORRHOIDALS +HEMORRHOIDS +HEMOSIDERIN +HEMOSIDERINS +HEMOSTASES +HEMOSTASIS +HEMOSTAT +HEMOSTATIC +HEMOSTATICS +HEMOSTATS +HEMOTOXIC +HEMOTOXIN +HEMOTOXINS +HEMP +HEMPEN +HEMPIE +HEMPIER +HEMPIEST +HEMPLIKE +HEMPS +HEMPSEED +HEMPSEEDS +HEMPWEED +HEMPWEEDS +HEMPY +HEMS +HEMSTITCH +HEMSTITCHED +HEMSTITCHER +HEMSTITCHERS +HEMSTITCHES +HEMSTITCHING +HEN +HENBANE +HENBANES +HENBIT +HENBITS +HENCE +HENCEFORTH +HENCEFORWARD +HENCHMAN +HENCHMEN +HENCOOP +HENCOOPS +HENDECASYLLABIC +HENDECASYLLABLE +HENDIADYS +HENDIADYSES +HENEQUEN +HENEQUENS +HENEQUIN +HENEQUINS +HENGE +HENGES +HENHOUSE +HENHOUSES +HENIQUEN +HENIQUENS +HENLEY +HENLEYS +HENLIKE +HENNA +HENNAED +HENNAING +HENNAS +HENNERIES +HENNERY +HENNISH +HENNISHLY +HENOTHEISM +HENOTHEISMS +HENOTHEIST +HENOTHEISTIC +HENOTHEISTS +HENPECK +HENPECKED +HENPECKING +HENPECKS +HENRIES +HENRY +HENRYS +HENS +HENT +HENTED +HENTING +HENTS +HEP +HEPARIN +HEPARINIZED +HEPARINS +HEPATECTOMIES +HEPATECTOMIZED +HEPATECTOMY +HEPATIC +HEPATICA +HEPATICAE +HEPATICAS +HEPATICS +HEPATITIDES +HEPATITIS +HEPATITISES +HEPATIZE +HEPATIZED +HEPATIZES +HEPATIZING +HEPATOCELLULAR +HEPATOCYTE +HEPATOCYTES +HEPATOMA +HEPATOMAS +HEPATOMATA +HEPATOMEGALIES +HEPATOMEGALY +HEPATOPANCREAS +HEPATOTOXIC +HEPATOTOXICITY +HEPCAT +HEPCATS +HEPPER +HEPPEST +HEPTACHLOR +HEPTACHLORS +HEPTAD +HEPTADS +HEPTAGON +HEPTAGONAL +HEPTAGONS +HEPTAMETER +HEPTAMETERS +HEPTANE +HEPTANES +HEPTARCH +HEPTARCHIES +HEPTARCHS +HEPTARCHY +HEPTOSE +HEPTOSES +HER +HERALD +HERALDED +HERALDIC +HERALDICALLY +HERALDING +HERALDIST +HERALDISTS +HERALDRIES +HERALDRY +HERALDS +HERB +HERBACEOUS +HERBAGE +HERBAGED +HERBAGES +HERBAL +HERBALISM +HERBALISMS +HERBALIST +HERBALISTS +HERBALS +HERBARIA +HERBARIAL +HERBARIUM +HERBARIUMS +HERBED +HERBICIDAL +HERBICIDALLY +HERBICIDE +HERBICIDES +HERBIER +HERBIEST +HERBIVORE +HERBIVORES +HERBIVORIES +HERBIVOROUS +HERBIVORY +HERBLESS +HERBLIKE +HERBOLOGIES +HERBOLOGY +HERBS +HERBY +HERCULEAN +HERCULES +HERCULESES +HERD +HERDED +HERDER +HERDERS +HERDIC +HERDICS +HERDING +HERDLIKE +HERDMAN +HERDMEN +HERDS +HERDSMAN +HERDSMEN +HERE +HEREABOUT +HEREABOUTS +HEREAFTER +HEREAFTERS +HEREAT +HEREAWAY +HEREAWAYS +HEREBY +HEREDES +HEREDITAMENT +HEREDITAMENTS +HEREDITARIAN +HEREDITARIANS +HEREDITARILY +HEREDITARY +HEREDITIES +HEREDITY +HEREIN +HEREINABOVE +HEREINAFTER +HEREINBEFORE +HEREINBELOW +HEREINTO +HEREOF +HEREON +HERES +HERESIARCH +HERESIARCHS +HERESIES +HERESY +HERETIC +HERETICAL +HERETICALLY +HERETICS +HERETO +HERETOFORE +HERETRICES +HERETRIX +HERETRIXES +HEREUNDER +HEREUNTO +HEREUPON +HEREWITH +HERIOT +HERIOTS +HERITABILITIES +HERITABILITY +HERITABLE +HERITABLY +HERITAGE +HERITAGES +HERITOR +HERITORS +HERITRICES +HERITRIX +HERITRIXES +HERL +HERLS +HERM +HERMA +HERMAE +HERMAEAN +HERMAI +HERMAPHRODITE +HERMAPHRODITES +HERMAPHRODITIC +HERMAPHRODITISM +HERMATYPIC +HERMENEUTIC +HERMENEUTICAL +HERMENEUTICALLY +HERMENEUTICS +HERMETIC +HERMETICAL +HERMETICALLY +HERMETICISM +HERMETICISMS +HERMETISM +HERMETISMS +HERMETIST +HERMETISTS +HERMIT +HERMITAGE +HERMITAGES +HERMITIC +HERMITISM +HERMITISMS +HERMITRIES +HERMITRY +HERMITS +HERMS +HERN +HERNIA +HERNIAE +HERNIAL +HERNIAS +HERNIATE +HERNIATED +HERNIATES +HERNIATING +HERNIATION +HERNIATIONS +HERNS +HERO +HEROES +HEROIC +HEROICAL +HEROICALLY +HEROICIZE +HEROICIZED +HEROICIZES +HEROICIZING +HEROICOMIC +HEROICOMICAL +HEROICS +HEROIN +HEROINE +HEROINES +HEROINISM +HEROINISMS +HEROINS +HEROISM +HEROISMS +HEROIZE +HEROIZED +HEROIZES +HEROIZING +HERON +HERONRIES +HERONRY +HERONS +HEROS +HERPES +HERPESVIRUS +HERPESVIRUSES +HERPETIC +HERPETOLOGICAL +HERPETOLOGIES +HERPETOLOGIST +HERPETOLOGISTS +HERPETOLOGY +HERRENVOLK +HERRENVOLKS +HERRIED +HERRIES +HERRING +HERRINGBONE +HERRINGBONED +HERRINGBONES +HERRINGBONING +HERRINGS +HERRY +HERRYING +HERS +HERSELF +HERSTORIES +HERSTORY +HERTZ +HERTZES +HES +HESITANCE +HESITANCES +HESITANCIES +HESITANCY +HESITANT +HESITANTLY +HESITATE +HESITATED +HESITATER +HESITATERS +HESITATES +HESITATING +HESITATINGLY +HESITATION +HESITATIONS +HESITATOR +HESITATORS +HESPERIDIA +HESPERIDIN +HESPERIDINS +HESPERIDIUM +HESSIAN +HESSIANS +HESSITE +HESSITES +HESSONITE +HESSONITES +HEST +HESTS +HET +HETAERA +HETAERAE +HETAERAS +HETAERIC +HETAERISM +HETAERISMS +HETAIRA +HETAIRAI +HETAIRAS +HETAIRISM +HETAIRISMS +HETERO +HETEROATOM +HETEROATOMS +HETEROAUXIN +HETEROAUXINS +HETEROCERCAL +HETEROCHROMATIC +HETEROCHROMATIN +HETEROCLITE +HETEROCLITES +HETEROCYCLE +HETEROCYCLES +HETEROCYCLIC +HETEROCYCLICS +HETEROCYST +HETEROCYSTOUS +HETEROCYSTS +HETERODOX +HETERODOXIES +HETERODOXY +HETERODUPLEX +HETERODUPLEXES +HETERODYNE +HETERODYNED +HETERODYNES +HETERODYNING +HETEROECIOUS +HETEROECISM +HETEROECISMS +HETEROGAMETE +HETEROGAMETES +HETEROGAMETIC +HETEROGAMETIES +HETEROGAMETY +HETEROGAMIES +HETEROGAMOUS +HETEROGAMY +HETEROGENEITIES +HETEROGENEITY +HETEROGENEOUS +HETEROGENEOUSLY +HETEROGENIES +HETEROGENOUS +HETEROGENY +HETEROGONIC +HETEROGONIES +HETEROGONY +HETEROGRAFT +HETEROGRAFTS +HETEROKARYON +HETEROKARYONS +HETEROKARYOSES +HETEROKARYOSIS +HETEROKARYOTIC +HETEROLOGOUS +HETEROLOGOUSLY +HETEROLYSES +HETEROLYSIS +HETEROLYTIC +HETEROMORPHIC +HETEROMORPHISM +HETEROMORPHISMS +HETERONOMIES +HETERONOMOUS +HETERONOMY +HETERONYM +HETERONYMS +HETEROPHIL +HETEROPHILE +HETEROPHONIES +HETEROPHONY +HETEROPHYLLIES +HETEROPHYLLOUS +HETEROPHYLLY +HETEROPLOID +HETEROPLOIDIES +HETEROPLOIDS +HETEROPLOIDY +HETEROPTEROUS +HETEROS +HETEROSES +HETEROSEXUAL +HETEROSEXUALITY +HETEROSEXUALLY +HETEROSEXUALS +HETEROSIS +HETEROSPORIES +HETEROSPOROUS +HETEROSPORY +HETEROTHALLIC +HETEROTHALLISM +HETEROTHALLISMS +HETEROTIC +HETEROTOPIC +HETEROTROPH +HETEROTROPHIC +HETEROTROPHIES +HETEROTROPHS +HETEROTROPHY +HETEROTYPIC +HETEROZYGOSES +HETEROZYGOSIS +HETEROZYGOSITY +HETEROZYGOTE +HETEROZYGOTES +HETEROZYGOUS +HETH +HETHS +HETMAN +HETMANS +HETS +HEUCH +HEUCHS +HEUGH +HEUGHS +HEULANDITE +HEULANDITES +HEURISTIC +HEURISTICALLY +HEURISTICS +HEW +HEWABLE +HEWED +HEWER +HEWERS +HEWING +HEWN +HEWS +HEX +HEXACHLORETHANE +HEXACHLOROPHENE +HEXACHORD +HEXACHORDS +HEXAD +HEXADE +HEXADECIMAL +HEXADECIMALS +HEXADES +HEXADIC +HEXADS +HEXAGON +HEXAGONAL +HEXAGONALLY +HEXAGONS +HEXAGRAM +HEXAGRAMS +HEXAHEDRA +HEXAHEDRON +HEXAHEDRONS +HEXAHYDRATE +HEXAHYDRATES +HEXAMETER +HEXAMETERS +HEXAMETHONIUM +HEXAMETHONIUMS +HEXAMINE +HEXAMINES +HEXANE +HEXANES +HEXAPLA +HEXAPLAR +HEXAPLAS +HEXAPLOID +HEXAPLOIDIES +HEXAPLOIDS +HEXAPLOIDY +HEXAPOD +HEXAPODIES +HEXAPODS +HEXAPODY +HEXARCHIES +HEXARCHY +HEXASTICH +HEXASTICHS +HEXED +HEXER +HEXEREI +HEXEREIS +HEXERS +HEXES +HEXING +HEXOBARBITAL +HEXOBARBITALS +HEXOKINASE +HEXOKINASES +HEXONE +HEXONES +HEXOSAMINIDASE +HEXOSAMINIDASES +HEXOSAN +HEXOSANS +HEXOSE +HEXOSES +HEXYL +HEXYLIC +HEXYLRESORCINOL +HEXYLS +HEY +HEYDAY +HEYDAYS +HEYDEY +HEYDEYS +HI +HIATAL +HIATUS +HIATUSES +HIBACHI +HIBACHIS +HIBAKUSHA +HIBERNACULA +HIBERNACULUM +HIBERNAL +HIBERNATE +HIBERNATED +HIBERNATES +HIBERNATING +HIBERNATION +HIBERNATIONS +HIBERNATOR +HIBERNATORS +HIBISCUS +HIBISCUSES +HIC +HICCOUGH +HICCOUGHED +HICCOUGHING +HICCOUGHS +HICCUP +HICCUPED +HICCUPING +HICCUPPED +HICCUPPING +HICCUPS +HICK +HICKEY +HICKEYS +HICKIE +HICKIES +HICKISH +HICKORIES +HICKORY +HICKS +HID +HIDABLE +HIDALGO +HIDALGOS +HIDDEN +HIDDENITE +HIDDENITES +HIDDENLY +HIDDENNESS +HIDDENNESSES +HIDE +HIDEAWAY +HIDEAWAYS +HIDEBOUND +HIDED +HIDELESS +HIDEOSITIES +HIDEOSITY +HIDEOUS +HIDEOUSLY +HIDEOUSNESS +HIDEOUSNESSES +HIDEOUT +HIDEOUTS +HIDER +HIDERS +HIDES +HIDING +HIDINGS +HIDROSES +HIDROSIS +HIDROTIC +HIDROTICS +HIE +HIED +HIEING +HIEMAL +HIERARCH +HIERARCHAL +HIERARCHIC +HIERARCHICAL +HIERARCHICALLY +HIERARCHIES +HIERARCHIZE +HIERARCHIZED +HIERARCHIZES +HIERARCHIZING +HIERARCHS +HIERARCHY +HIERATIC +HIERATICALLY +HIERODULE +HIERODULES +HIEROGLYPH +HIEROGLYPHIC +HIEROGLYPHICAL +HIEROGLYPHICS +HIEROGLYPHS +HIEROLOGIES +HIEROLOGY +HIEROPHANT +HIEROPHANTIC +HIEROPHANTS +HIERURGIES +HIERURGY +HIES +HIFALUTIN +HIGGLE +HIGGLED +HIGGLER +HIGGLERS +HIGGLES +HIGGLING +HIGH +HIGHBALL +HIGHBALLED +HIGHBALLING +HIGHBALLS +HIGHBINDER +HIGHBINDERS +HIGHBORN +HIGHBOY +HIGHBOYS +HIGHBRED +HIGHBROW +HIGHBROWED +HIGHBROWISM +HIGHBROWISMS +HIGHBROWS +HIGHBUSH +HIGHCHAIR +HIGHCHAIRS +HIGHER +HIGHEST +HIGHFALUTIN +HIGHFLIER +HIGHFLIERS +HIGHFLYER +HIGHFLYERS +HIGHJACK +HIGHJACKED +HIGHJACKING +HIGHJACKS +HIGHLAND +HIGHLANDER +HIGHLANDERS +HIGHLANDS +HIGHLIFE +HIGHLIFES +HIGHLIGHT +HIGHLIGHTED +HIGHLIGHTING +HIGHLIGHTS +HIGHLY +HIGHNESS +HIGHNESSES +HIGHRISE +HIGHRISES +HIGHROAD +HIGHROADS +HIGHS +HIGHSPOT +HIGHSPOTS +HIGHT +HIGHTAIL +HIGHTAILED +HIGHTAILING +HIGHTAILS +HIGHTED +HIGHTH +HIGHTHS +HIGHTING +HIGHTOP +HIGHTOPS +HIGHTS +HIGHWAY +HIGHWAYMAN +HIGHWAYMEN +HIGHWAYS +HIJAB +HIJABS +HIJACK +HIJACKED +HIJACKER +HIJACKERS +HIJACKING +HIJACKS +HIJINKS +HIJRA +HIJRAH +HIJRAHS +HIJRAS +HIKE +HIKED +HIKER +HIKERS +HIKES +HIKING +HILA +HILAR +HILARIOUS +HILARIOUSLY +HILARIOUSNESS +HILARIOUSNESSES +HILARITIES +HILARITY +HILDING +HILDINGS +HILI +HILL +HILLBILLIES +HILLBILLY +HILLCREST +HILLCRESTS +HILLED +HILLER +HILLERS +HILLIER +HILLIEST +HILLINESS +HILLINESSES +HILLING +HILLO +HILLOA +HILLOAED +HILLOAING +HILLOAS +HILLOCK +HILLOCKED +HILLOCKS +HILLOCKY +HILLOED +HILLOES +HILLOING +HILLOS +HILLS +HILLSIDE +HILLSIDES +HILLSLOPE +HILLSLOPES +HILLTOP +HILLTOPS +HILLY +HILT +HILTED +HILTING +HILTLESS +HILTS +HILUM +HILUS +HIM +HIMATIA +HIMATION +HIMATIONS +HIMS +HIMSELF +HIN +HIND +HINDBRAIN +HINDBRAINS +HINDER +HINDERED +HINDERER +HINDERERS +HINDERING +HINDERS +HINDGUT +HINDGUTS +HINDMOST +HINDQUARTER +HINDQUARTERS +HINDRANCE +HINDRANCES +HINDS +HINDSHANK +HINDSHANKS +HINDSIGHT +HINDSIGHTS +HINGE +HINGED +HINGER +HINGERS +HINGES +HINGING +HINKIER +HINKIEST +HINKY +HINNIED +HINNIES +HINNY +HINNYING +HINS +HINT +HINTED +HINTER +HINTERLAND +HINTERLANDS +HINTERS +HINTING +HINTS +HIP +HIPBONE +HIPBONES +HIPHUGGER +HIPLESS +HIPLIKE +HIPLINE +HIPLINES +HIPLY +HIPNESS +HIPNESSES +HIPPARCH +HIPPARCHS +HIPPED +HIPPER +HIPPEST +HIPPIE +HIPPIEDOM +HIPPIEDOMS +HIPPIEISH +HIPPIENESS +HIPPIENESSES +HIPPIER +HIPPIES +HIPPIEST +HIPPINESS +HIPPINESSES +HIPPING +HIPPISH +HIPPO +HIPPOCAMPAL +HIPPOCAMPI +HIPPOCAMPUS +HIPPOCRAS +HIPPOCRASES +HIPPODROME +HIPPODROMES +HIPPOGRIFF +HIPPOGRIFFS +HIPPOPOTAMI +HIPPOPOTAMUS +HIPPOPOTAMUSES +HIPPOS +HIPPY +HIPS +HIPSHOT +HIPSTER +HIPSTERISM +HIPSTERISMS +HIPSTERS +HIRABLE +HIRAGANA +HIRAGANAS +HIRCINE +HIRE +HIREABLE +HIRED +HIREE +HIREES +HIRELING +HIRELINGS +HIRER +HIRERS +HIRES +HIRING +HIRPLE +HIRPLED +HIRPLES +HIRPLING +HIRSEL +HIRSELED +HIRSELING +HIRSELLED +HIRSELLING +HIRSELS +HIRSLE +HIRSLED +HIRSLES +HIRSLING +HIRSUTE +HIRSUTENESS +HIRSUTENESSES +HIRSUTISM +HIRSUTISMS +HIRUDIN +HIRUDINS +HIS +HISN +HISPANIDAD +HISPANIDADS +HISPANISM +HISPANISMS +HISPID +HISPIDITIES +HISPIDITY +HISS +HISSED +HISSELF +HISSER +HISSERS +HISSES +HISSIER +HISSIES +HISSIEST +HISSING +HISSINGS +HISSY +HIST +HISTAMIN +HISTAMINASE +HISTAMINASES +HISTAMINE +HISTAMINERGIC +HISTAMINES +HISTAMINS +HISTED +HISTIDIN +HISTIDINE +HISTIDINES +HISTIDINS +HISTING +HISTIOCYTE +HISTIOCYTES +HISTIOCYTIC +HISTOCHEMICAL +HISTOCHEMICALLY +HISTOCHEMISTRY +HISTOGEN +HISTOGENESES +HISTOGENESIS +HISTOGENETIC +HISTOGENS +HISTOGRAM +HISTOGRAMS +HISTOID +HISTOLOGIC +HISTOLOGICAL +HISTOLOGICALLY +HISTOLOGIES +HISTOLOGIST +HISTOLOGISTS +HISTOLOGY +HISTOLYSES +HISTOLYSIS +HISTONE +HISTONES +HISTOPATHOLOGIC +HISTOPATHOLOGY +HISTOPHYSIOLOGY +HISTOPLASMOSES +HISTOPLASMOSIS +HISTORIAN +HISTORIANS +HISTORIC +HISTORICAL +HISTORICALLY +HISTORICALNESS +HISTORICISM +HISTORICISMS +HISTORICIST +HISTORICISTS +HISTORICITIES +HISTORICITY +HISTORICIZE +HISTORICIZED +HISTORICIZES +HISTORICIZING +HISTORIED +HISTORIES +HISTORIOGRAPHER +HISTORIOGRAPHIC +HISTORIOGRAPHY +HISTORY +HISTRIONIC +HISTRIONICALLY +HISTRIONICS +HISTS +HIT +HITCH +HITCHED +HITCHER +HITCHERS +HITCHES +HITCHHIKE +HITCHHIKED +HITCHHIKER +HITCHHIKERS +HITCHHIKES +HITCHHIKING +HITCHING +HITHER +HITHERMOST +HITHERTO +HITHERWARD +HITLESS +HITMAN +HITMEN +HITS +HITTABLE +HITTER +HITTERS +HITTING +HIVE +HIVED +HIVELESS +HIVES +HIVING +HIZZONER +HIZZONERS +HM +HMM +HO +HOACTZIN +HOACTZINES +HOACTZINS +HOAGIE +HOAGIES +HOAGY +HOAR +HOARD +HOARDED +HOARDER +HOARDERS +HOARDING +HOARDINGS +HOARDS +HOARFROST +HOARFROSTS +HOARIER +HOARIEST +HOARILY +HOARINESS +HOARINESSES +HOARS +HOARSE +HOARSELY +HOARSEN +HOARSENED +HOARSENESS +HOARSENESSES +HOARSENING +HOARSENS +HOARSER +HOARSEST +HOARY +HOATZIN +HOATZINES +HOATZINS +HOAX +HOAXED +HOAXER +HOAXERS +HOAXES +HOAXING +HOB +HOBBED +HOBBER +HOBBERS +HOBBIES +HOBBING +HOBBIT +HOBBITS +HOBBLE +HOBBLEBUSH +HOBBLEBUSHES +HOBBLED +HOBBLEDEHOY +HOBBLEDEHOYS +HOBBLER +HOBBLERS +HOBBLES +HOBBLING +HOBBY +HOBBYHORSE +HOBBYHORSES +HOBBYIST +HOBBYISTS +HOBGOBLIN +HOBGOBLINS +HOBLIKE +HOBNAIL +HOBNAILED +HOBNAILING +HOBNAILS +HOBNOB +HOBNOBBED +HOBNOBBER +HOBNOBBERS +HOBNOBBING +HOBNOBS +HOBO +HOBOED +HOBOES +HOBOING +HOBOISM +HOBOISMS +HOBOS +HOBS +HOCK +HOCKED +HOCKER +HOCKERS +HOCKEY +HOCKEYS +HOCKING +HOCKS +HOCKSHOP +HOCKSHOPS +HOCUS +HOCUSED +HOCUSES +HOCUSING +HOCUSSED +HOCUSSES +HOCUSSING +HOD +HODAD +HODADDIES +HODADDY +HODADS +HODDEN +HODDENS +HODDIN +HODDINS +HODGEPODGE +HODGEPODGES +HODOSCOPE +HODOSCOPES +HODS +HOE +HOECAKE +HOECAKES +HOED +HOEDOWN +HOEDOWNS +HOEING +HOELIKE +HOER +HOERS +HOES +HOG +HOGAN +HOGANS +HOGBACK +HOGBACKS +HOGFISH +HOGFISHES +HOGG +HOGGED +HOGGER +HOGGERS +HOGGET +HOGGETS +HOGGING +HOGGISH +HOGGISHLY +HOGGISHNESS +HOGGISHNESSES +HOGGS +HOGLIKE +HOGMANAY +HOGMANAYS +HOGMANE +HOGMANES +HOGMENAY +HOGMENAYS +HOGNOSE +HOGNOSES +HOGNUT +HOGNUTS +HOGS +HOGSHEAD +HOGSHEADS +HOGTIE +HOGTIED +HOGTIEING +HOGTIES +HOGTYING +HOGWASH +HOGWASHES +HOGWEED +HOGWEEDS +HOICK +HOICKED +HOICKING +HOICKS +HOIDEN +HOIDENED +HOIDENING +HOIDENS +HOISE +HOISED +HOISES +HOISING +HOIST +HOISTED +HOISTER +HOISTERS +HOISTING +HOISTS +HOKE +HOKED +HOKES +HOKEY +HOKEYNESS +HOKEYNESSES +HOKEYPOKEY +HOKEYPOKEYS +HOKIER +HOKIEST +HOKILY +HOKINESS +HOKINESSES +HOKING +HOKKU +HOKUM +HOKUMS +HOKYPOKIES +HOKYPOKY +HOLANDRIC +HOLARD +HOLARDS +HOLD +HOLDABLE +HOLDALL +HOLDALLS +HOLDBACK +HOLDBACKS +HOLDDOWN +HOLDDOWNS +HOLDEN +HOLDER +HOLDERS +HOLDFAST +HOLDFASTS +HOLDING +HOLDINGS +HOLDOUT +HOLDOUTS +HOLDOVER +HOLDOVERS +HOLDS +HOLDUP +HOLDUPS +HOLE +HOLED +HOLELESS +HOLES +HOLEY +HOLIBUT +HOLIBUTS +HOLIDAY +HOLIDAYED +HOLIDAYER +HOLIDAYERS +HOLIDAYING +HOLIDAYMAKER +HOLIDAYMAKERS +HOLIDAYS +HOLIER +HOLIES +HOLIEST +HOLILY +HOLINESS +HOLINESSES +HOLING +HOLISM +HOLISMS +HOLIST +HOLISTIC +HOLISTICALLY +HOLISTS +HOLK +HOLKED +HOLKING +HOLKS +HOLLA +HOLLAED +HOLLAING +HOLLAND +HOLLANDAISE +HOLLANDAISES +HOLLANDS +HOLLAS +HOLLER +HOLLERED +HOLLERING +HOLLERS +HOLLIES +HOLLO +HOLLOA +HOLLOAED +HOLLOAING +HOLLOAS +HOLLOED +HOLLOES +HOLLOING +HOLLOO +HOLLOOED +HOLLOOING +HOLLOOS +HOLLOS +HOLLOW +HOLLOWARE +HOLLOWARES +HOLLOWED +HOLLOWER +HOLLOWEST +HOLLOWING +HOLLOWLY +HOLLOWNESS +HOLLOWNESSES +HOLLOWS +HOLLOWWARE +HOLLOWWARES +HOLLY +HOLLYHOCK +HOLLYHOCKS +HOLM +HOLMIC +HOLMIUM +HOLMIUMS +HOLMS +HOLOBLASTIC +HOLOCAUST +HOLOCAUSTS +HOLOCENE +HOLOCRINE +HOLOENZYME +HOLOENZYMES +HOLOGAMIES +HOLOGAMY +HOLOGRAM +HOLOGRAMS +HOLOGRAPH +HOLOGRAPHED +HOLOGRAPHER +HOLOGRAPHERS +HOLOGRAPHIC +HOLOGRAPHICALLY +HOLOGRAPHIES +HOLOGRAPHING +HOLOGRAPHS +HOLOGRAPHY +HOLOGYNIC +HOLOGYNIES +HOLOGYNY +HOLOHEDRAL +HOLOMETABOLISM +HOLOMETABOLISMS +HOLOMETABOLOUS +HOLOPHRASTIC +HOLOPHYTE +HOLOPHYTES +HOLOPHYTIC +HOLOTHURIAN +HOLOTHURIANS +HOLOTYPE +HOLOTYPES +HOLOTYPIC +HOLOZOIC +HOLP +HOLPEN +HOLS +HOLSTEIN +HOLSTEINS +HOLSTER +HOLSTERED +HOLSTERING +HOLSTERS +HOLT +HOLTS +HOLY +HOLYDAY +HOLYDAYS +HOLYSTONE +HOLYSTONED +HOLYSTONES +HOLYSTONING +HOLYTIDE +HOLYTIDES +HOMAGE +HOMAGED +HOMAGER +HOMAGERS +HOMAGES +HOMAGING +HOMBRE +HOMBRES +HOMBURG +HOMBURGS +HOME +HOMEBODIES +HOMEBODY +HOMEBOUND +HOMEBOY +HOMEBOYS +HOMEBRED +HOMEBREDS +HOMEBREW +HOMEBREWS +HOMEBUILT +HOMECOMER +HOMECOMERS +HOMECOMING +HOMECOMINGS +HOMED +HOMEGIRL +HOMEGIRLS +HOMEGROWN +HOMELAND +HOMELANDS +HOMELESS +HOMELESSNESS +HOMELESSNESSES +HOMELIER +HOMELIEST +HOMELIKE +HOMELINESS +HOMELINESSES +HOMELY +HOMEMADE +HOMEMAKER +HOMEMAKERS +HOMEMAKING +HOMEMAKINGS +HOMEOBOX +HOMEOBOXES +HOMEOMORPHIC +HOMEOMORPHISM +HOMEOMORPHISMS +HOMEOPATH +HOMEOPATHIC +HOMEOPATHICALLY +HOMEOPATHIES +HOMEOPATHS +HOMEOPATHY +HOMEOSTASES +HOMEOSTASIS +HOMEOSTATIC +HOMEOTHERM +HOMEOTHERMIC +HOMEOTHERMIES +HOMEOTHERMS +HOMEOTHERMY +HOMEOTIC +HOMEOWNER +HOMEOWNERS +HOMEPAGE +HOMEPAGES +HOMEPLACE +HOMEPLACES +HOMEPORT +HOMEPORTED +HOMEPORTING +HOMEPORTS +HOMER +HOMERED +HOMERIC +HOMERING +HOMEROOM +HOMEROOMS +HOMERS +HOMES +HOMESCHOOL +HOMESCHOOLED +HOMESCHOOLER +HOMESCHOOLERS +HOMESCHOOLING +HOMESCHOOLS +HOMESICK +HOMESICKNESS +HOMESICKNESSES +HOMESITE +HOMESITES +HOMESPUN +HOMESPUNS +HOMESTAND +HOMESTANDS +HOMESTAY +HOMESTAYS +HOMESTEAD +HOMESTEADED +HOMESTEADER +HOMESTEADERS +HOMESTEADING +HOMESTEADS +HOMESTRETCH +HOMESTRETCHES +HOMETOWN +HOMETOWNS +HOMEWARD +HOMEWARDS +HOMEWORK +HOMEWORKS +HOMEY +HOMEYNESS +HOMEYNESSES +HOMEYS +HOMICIDAL +HOMICIDALLY +HOMICIDE +HOMICIDES +HOMIE +HOMIER +HOMIES +HOMIEST +HOMILETIC +HOMILETICAL +HOMILETICS +HOMILIES +HOMILIST +HOMILISTS +HOMILY +HOMINES +HOMINESS +HOMINESSES +HOMING +HOMINIAN +HOMINIANS +HOMINID +HOMINIDS +HOMINIES +HOMININE +HOMINIZATION +HOMINIZATIONS +HOMINIZE +HOMINIZED +HOMINIZES +HOMINIZING +HOMINOID +HOMINOIDS +HOMINY +HOMMOCK +HOMMOCKS +HOMMOS +HOMMOSES +HOMO +HOMOCERCAL +HOMOCERCIES +HOMOCERCY +HOMOEROTIC +HOMOEROTICISM +HOMOEROTICISMS +HOMOGAMETIC +HOMOGAMIES +HOMOGAMOUS +HOMOGAMY +HOMOGENATE +HOMOGENATES +HOMOGENEITIES +HOMOGENEITY +HOMOGENEOUS +HOMOGENEOUSLY +HOMOGENEOUSNESS +HOMOGENIES +HOMOGENISATION +HOMOGENISATIONS +HOMOGENISE +HOMOGENISED +HOMOGENISES +HOMOGENISING +HOMOGENIZATION +HOMOGENIZATIONS +HOMOGENIZE +HOMOGENIZED +HOMOGENIZER +HOMOGENIZERS +HOMOGENIZES +HOMOGENIZING +HOMOGENOUS +HOMOGENY +HOMOGONIES +HOMOGONY +HOMOGRAFT +HOMOGRAFTS +HOMOGRAPH +HOMOGRAPHIC +HOMOGRAPHS +HOMOIOTHERM +HOMOIOTHERMIC +HOMOIOTHERMS +HOMOIOUSIAN +HOMOIOUSIANS +HOMOLOG +HOMOLOGATE +HOMOLOGATED +HOMOLOGATES +HOMOLOGATING +HOMOLOGATION +HOMOLOGATIONS +HOMOLOGIC +HOMOLOGICAL +HOMOLOGICALLY +HOMOLOGIES +HOMOLOGIZE +HOMOLOGIZED +HOMOLOGIZER +HOMOLOGIZERS +HOMOLOGIZES +HOMOLOGIZING +HOMOLOGOUS +HOMOLOGS +HOMOLOGUE +HOMOLOGUES +HOMOLOGY +HOMOLYSES +HOMOLYSIS +HOMOLYTIC +HOMOMORPHIC +HOMOMORPHISM +HOMOMORPHISMS +HOMONUCLEAR +HOMONYM +HOMONYMIC +HOMONYMIES +HOMONYMOUS +HOMONYMOUSLY +HOMONYMS +HOMONYMY +HOMOOUSIAN +HOMOOUSIANS +HOMOPHILE +HOMOPHILES +HOMOPHOBE +HOMOPHOBES +HOMOPHOBIA +HOMOPHOBIAS +HOMOPHOBIC +HOMOPHONE +HOMOPHONES +HOMOPHONIC +HOMOPHONIES +HOMOPHONOUS +HOMOPHONY +HOMOPHYLIES +HOMOPHYLY +HOMOPLASIES +HOMOPLASTIC +HOMOPLASY +HOMOPOLAR +HOMOPOLYMER +HOMOPOLYMERIC +HOMOPOLYMERS +HOMOPTERAN +HOMOPTERANS +HOMOPTEROUS +HOMOS +HOMOSCEDASTIC +HOMOSEX +HOMOSEXES +HOMOSEXUAL +HOMOSEXUALITIES +HOMOSEXUALITY +HOMOSEXUALLY +HOMOSEXUALS +HOMOSOCIAL +HOMOSOCIALITIES +HOMOSOCIALITY +HOMOSPORIES +HOMOSPOROUS +HOMOSPORY +HOMOSTYLIES +HOMOSTYLY +HOMOTAXES +HOMOTAXIS +HOMOTHALLIC +HOMOTHALLISM +HOMOTHALLISMS +HOMOTRANSPLANT +HOMOTRANSPLANTS +HOMOZYGOSES +HOMOZYGOSIS +HOMOZYGOSITIES +HOMOZYGOSITY +HOMOZYGOTE +HOMOZYGOTES +HOMOZYGOUS +HOMOZYGOUSLY +HOMUNCULI +HOMUNCULUS +HOMY +HON +HONAN +HONANS +HONCHO +HONCHOED +HONCHOING +HONCHOS +HONDA +HONDAS +HONDLE +HONDLED +HONDLES +HONDLING +HONE +HONED +HONER +HONERS +HONES +HONEST +HONESTER +HONESTEST +HONESTIES +HONESTLY +HONESTY +HONEWORT +HONEWORTS +HONEY +HONEYBEE +HONEYBEES +HONEYBUN +HONEYBUNS +HONEYCOMB +HONEYCOMBED +HONEYCOMBING +HONEYCOMBS +HONEYCREEPER +HONEYCREEPERS +HONEYDEW +HONEYDEWS +HONEYEATER +HONEYEATERS +HONEYED +HONEYFUL +HONEYGUIDE +HONEYGUIDES +HONEYING +HONEYMOON +HONEYMOONED +HONEYMOONER +HONEYMOONERS +HONEYMOONING +HONEYMOONS +HONEYPOT +HONEYPOTS +HONEYS +HONEYSUCKLE +HONEYSUCKLES +HONG +HONGI +HONGIED +HONGIES +HONGIING +HONGS +HONIED +HONING +HONK +HONKED +HONKER +HONKERS +HONKEY +HONKEYS +HONKIE +HONKIES +HONKING +HONKS +HONKY +HONOR +HONORABILITIES +HONORABILITY +HONORABLE +HONORABLENESS +HONORABLENESSES +HONORABLY +HONORAND +HONORANDS +HONORARIA +HONORARIES +HONORARILY +HONORARIUM +HONORARIUMS +HONORARY +HONORED +HONOREE +HONOREES +HONORER +HONORERS +HONORIFIC +HONORIFICALLY +HONORIFICS +HONORING +HONORS +HONOUR +HONOURABLE +HONOURED +HONOURER +HONOURERS +HONOURING +HONOURS +HONS +HOOCH +HOOCHES +HOOCHIE +HOOCHIES +HOOD +HOODED +HOODEDNESS +HOODEDNESSES +HOODIE +HOODIER +HOODIES +HOODIEST +HOODING +HOODLESS +HOODLIKE +HOODLUM +HOODLUMISH +HOODLUMISM +HOODLUMISMS +HOODLUMS +HOODMOLD +HOODMOLDS +HOODOO +HOODOOED +HOODOOING +HOODOOISM +HOODOOISMS +HOODOOS +HOODS +HOODWINK +HOODWINKED +HOODWINKER +HOODWINKERS +HOODWINKING +HOODWINKS +HOODY +HOOEY +HOOEYS +HOOF +HOOFBEAT +HOOFBEATS +HOOFBOUND +HOOFED +HOOFER +HOOFERS +HOOFING +HOOFLESS +HOOFLIKE +HOOFPRINT +HOOFPRINTS +HOOFS +HOOK +HOOKA +HOOKAH +HOOKAHS +HOOKAS +HOOKED +HOOKER +HOOKERS +HOOKEY +HOOKEYS +HOOKIER +HOOKIES +HOOKIEST +HOOKING +HOOKLESS +HOOKLET +HOOKLETS +HOOKLIKE +HOOKNOSE +HOOKNOSED +HOOKNOSES +HOOKS +HOOKUP +HOOKUPS +HOOKWORM +HOOKWORMS +HOOKY +HOOLIE +HOOLIGAN +HOOLIGANISM +HOOLIGANISMS +HOOLIGANS +HOOLY +HOOP +HOOPED +HOOPER +HOOPERS +HOOPING +HOOPLA +HOOPLAS +HOOPLESS +HOOPLIKE +HOOPOE +HOOPOES +HOOPOO +HOOPOOS +HOOPS +HOOPSKIRT +HOOPSKIRTS +HOOPSTER +HOOPSTERS +HOORAH +HOORAHED +HOORAHING +HOORAHS +HOORAY +HOORAYED +HOORAYING +HOORAYS +HOOSEGOW +HOOSEGOWS +HOOSGOW +HOOSGOWS +HOOT +HOOTCH +HOOTCHES +HOOTED +HOOTENANNIES +HOOTENANNY +HOOTER +HOOTERS +HOOTIER +HOOTIEST +HOOTING +HOOTS +HOOTY +HOOVED +HOOVER +HOOVERED +HOOVERING +HOOVERS +HOOVES +HOP +HOPE +HOPED +HOPEFUL +HOPEFULLY +HOPEFULNESS +HOPEFULNESSES +HOPEFULS +HOPELESS +HOPELESSLY +HOPELESSNESS +HOPELESSNESSES +HOPER +HOPERS +HOPES +HOPHEAD +HOPHEADS +HOPING +HOPINGLY +HOPLITE +HOPLITES +HOPLITIC +HOPPED +HOPPER +HOPPERS +HOPPIER +HOPPIEST +HOPPING +HOPPINGS +HOPPLE +HOPPLED +HOPPLES +HOPPLING +HOPPY +HOPS +HOPSACK +HOPSACKING +HOPSACKINGS +HOPSACKS +HOPSCOTCH +HOPSCOTCHED +HOPSCOTCHES +HOPSCOTCHING +HOPTOAD +HOPTOADS +HORA +HORAH +HORAHS +HORAL +HORARY +HORAS +HORDE +HORDED +HORDEIN +HORDEINS +HORDEOLA +HORDEOLUM +HORDES +HORDING +HOREHOUND +HOREHOUNDS +HORIZON +HORIZONAL +HORIZONLESS +HORIZONS +HORIZONTAL +HORIZONTALITIES +HORIZONTALITY +HORIZONTALLY +HORIZONTALS +HORMOGONIA +HORMOGONIUM +HORMONAL +HORMONALLY +HORMONE +HORMONELIKE +HORMONES +HORMONIC +HORN +HORNBEAM +HORNBEAMS +HORNBILL +HORNBILLS +HORNBLENDE +HORNBLENDES +HORNBLENDIC +HORNBOOK +HORNBOOKS +HORNED +HORNEDNESS +HORNEDNESSES +HORNET +HORNETS +HORNFELS +HORNIER +HORNIEST +HORNILY +HORNINESS +HORNINESSES +HORNING +HORNINGS +HORNIST +HORNISTS +HORNITO +HORNITOS +HORNLESS +HORNLESSNESS +HORNLESSNESSES +HORNLIKE +HORNPIPE +HORNPIPES +HORNPOUT +HORNPOUTS +HORNS +HORNSTONE +HORNSTONES +HORNSWOGGLE +HORNSWOGGLED +HORNSWOGGLES +HORNSWOGGLING +HORNTAIL +HORNTAILS +HORNWORM +HORNWORMS +HORNWORT +HORNWORTS +HORNY +HOROLOGE +HOROLOGER +HOROLOGERS +HOROLOGES +HOROLOGIC +HOROLOGICAL +HOROLOGIES +HOROLOGIST +HOROLOGISTS +HOROLOGY +HOROSCOPE +HOROSCOPES +HOROSCOPIES +HOROSCOPY +HORRENDOUS +HORRENDOUSLY +HORRENT +HORRIBLE +HORRIBLENESS +HORRIBLENESSES +HORRIBLES +HORRIBLY +HORRID +HORRIDER +HORRIDEST +HORRIDLY +HORRIDNESS +HORRIDNESSES +HORRIFIC +HORRIFICALLY +HORRIFIED +HORRIFIES +HORRIFY +HORRIFYING +HORRIFYINGLY +HORROR +HORRORS +HORSE +HORSEBACK +HORSEBACKS +HORSEBEAN +HORSEBEANS +HORSECAR +HORSECARS +HORSED +HORSEFEATHERS +HORSEFLESH +HORSEFLESHES +HORSEFLIES +HORSEFLY +HORSEHAIR +HORSEHAIRS +HORSEHIDE +HORSEHIDES +HORSELAUGH +HORSELAUGHS +HORSELESS +HORSELIKE +HORSEMAN +HORSEMANSHIP +HORSEMANSHIPS +HORSEMEN +HORSEMINT +HORSEMINTS +HORSEPLAY +HORSEPLAYER +HORSEPLAYERS +HORSEPLAYS +HORSEPOWER +HORSEPOWERS +HORSEPOX +HORSEPOXES +HORSERACE +HORSERACES +HORSERADISH +HORSERADISHES +HORSES +HORSESHIT +HORSESHITS +HORSESHOD +HORSESHOE +HORSESHOED +HORSESHOEING +HORSESHOER +HORSESHOERS +HORSESHOES +HORSETAIL +HORSETAILS +HORSEWEED +HORSEWEEDS +HORSEWHIP +HORSEWHIPPED +HORSEWHIPPER +HORSEWHIPPERS +HORSEWHIPPING +HORSEWHIPS +HORSEWOMAN +HORSEWOMEN +HORSEY +HORSIER +HORSIEST +HORSILY +HORSINESS +HORSINESSES +HORSING +HORST +HORSTE +HORSTES +HORSTS +HORSY +HORTATIVE +HORTATIVELY +HORTATORY +HORTICULTURAL +HORTICULTURALLY +HORTICULTURE +HORTICULTURES +HORTICULTURIST +HORTICULTURISTS +HOS +HOSANNA +HOSANNAED +HOSANNAH +HOSANNAHS +HOSANNAING +HOSANNAS +HOSE +HOSED +HOSEL +HOSELIKE +HOSELS +HOSEN +HOSEPIPE +HOSEPIPES +HOSER +HOSERS +HOSES +HOSEY +HOSEYED +HOSEYING +HOSEYS +HOSIER +HOSIERIES +HOSIERS +HOSIERY +HOSING +HOSPICE +HOSPICES +HOSPITABLE +HOSPITABLY +HOSPITAL +HOSPITALISE +HOSPITALISED +HOSPITALISES +HOSPITALISING +HOSPITALITIES +HOSPITALITY +HOSPITALIZATION +HOSPITALIZE +HOSPITALIZED +HOSPITALIZES +HOSPITALIZING +HOSPITALS +HOSPITIA +HOSPITIUM +HOSPODAR +HOSPODARS +HOST +HOSTA +HOSTAGE +HOSTAGES +HOSTAS +HOSTED +HOSTEL +HOSTELED +HOSTELER +HOSTELERS +HOSTELING +HOSTELLED +HOSTELLER +HOSTELLERS +HOSTELLING +HOSTELRIES +HOSTELRY +HOSTELS +HOSTESS +HOSTESSED +HOSTESSES +HOSTESSING +HOSTILE +HOSTILELY +HOSTILES +HOSTILITIES +HOSTILITY +HOSTING +HOSTLER +HOSTLERS +HOSTLY +HOSTS +HOT +HOTBED +HOTBEDS +HOTBLOOD +HOTBLOODS +HOTBOX +HOTBOXES +HOTCAKE +HOTCAKES +HOTCH +HOTCHED +HOTCHES +HOTCHING +HOTCHPOT +HOTCHPOTCH +HOTCHPOTCHES +HOTCHPOTS +HOTDOG +HOTDOGGED +HOTDOGGER +HOTDOGGERS +HOTDOGGING +HOTDOGS +HOTEL +HOTELDOM +HOTELDOMS +HOTELIER +HOTELIERS +HOTELMAN +HOTELMEN +HOTELS +HOTFOOT +HOTFOOTED +HOTFOOTING +HOTFOOTS +HOTHEAD +HOTHEADED +HOTHEADEDLY +HOTHEADEDNESS +HOTHEADEDNESSES +HOTHEADS +HOTHOUSE +HOTHOUSED +HOTHOUSES +HOTHOUSING +HOTLINE +HOTLINES +HOTLINK +HOTLINKS +HOTLY +HOTNESS +HOTNESSES +HOTPRESS +HOTPRESSED +HOTPRESSES +HOTPRESSING +HOTROD +HOTRODS +HOTS +HOTSHOT +HOTSHOTS +HOTSPOT +HOTSPOTS +HOTSPUR +HOTSPURS +HOTTED +HOTTER +HOTTEST +HOTTIE +HOTTIES +HOTTING +HOTTISH +HOUDAH +HOUDAHS +HOUND +HOUNDED +HOUNDER +HOUNDERS +HOUNDING +HOUNDS +HOUR +HOURGLASS +HOURGLASSES +HOURI +HOURIS +HOURLIES +HOURLONG +HOURLY +HOURS +HOUSE +HOUSEBOAT +HOUSEBOATER +HOUSEBOATERS +HOUSEBOATS +HOUSEBOUND +HOUSEBOY +HOUSEBOYS +HOUSEBREAK +HOUSEBREAKER +HOUSEBREAKERS +HOUSEBREAKING +HOUSEBREAKINGS +HOUSEBREAKS +HOUSEBROKE +HOUSEBROKEN +HOUSECARL +HOUSECARLS +HOUSECLEAN +HOUSECLEANED +HOUSECLEANING +HOUSECLEANINGS +HOUSECLEANS +HOUSECOAT +HOUSECOATS +HOUSED +HOUSEDRESS +HOUSEDRESSES +HOUSEFATHER +HOUSEFATHERS +HOUSEFLIES +HOUSEFLY +HOUSEFRONT +HOUSEFRONTS +HOUSEFUL +HOUSEFULS +HOUSEGUEST +HOUSEGUESTS +HOUSEHOLD +HOUSEHOLDER +HOUSEHOLDERS +HOUSEHOLDS +HOUSEHUSBAND +HOUSEHUSBANDS +HOUSEKEEP +HOUSEKEEPER +HOUSEKEEPERS +HOUSEKEEPING +HOUSEKEEPINGS +HOUSEKEEPS +HOUSEKEPT +HOUSEL +HOUSELED +HOUSELEEK +HOUSELEEKS +HOUSELESS +HOUSELESSNESS +HOUSELESSNESSES +HOUSELIGHTS +HOUSELING +HOUSELLED +HOUSELLING +HOUSELS +HOUSEMAID +HOUSEMAIDS +HOUSEMAN +HOUSEMASTER +HOUSEMASTERS +HOUSEMATE +HOUSEMATES +HOUSEMEN +HOUSEMOTHER +HOUSEMOTHERS +HOUSEPAINTER +HOUSEPAINTERS +HOUSEPARENT +HOUSEPARENTS +HOUSEPERSON +HOUSEPERSONS +HOUSEPLANT +HOUSEPLANTS +HOUSER +HOUSEROOM +HOUSEROOMS +HOUSERS +HOUSES +HOUSESAT +HOUSESIT +HOUSESITS +HOUSESITTING +HOUSETOP +HOUSETOPS +HOUSEWARES +HOUSEWARMING +HOUSEWARMINGS +HOUSEWIFE +HOUSEWIFELINESS +HOUSEWIFELY +HOUSEWIFERIES +HOUSEWIFERY +HOUSEWIFEY +HOUSEWIVES +HOUSEWORK +HOUSEWORKS +HOUSING +HOUSINGS +HOUSTONIA +HOUSTONIAS +HOVE +HOVEL +HOVELED +HOVELING +HOVELLED +HOVELLING +HOVELS +HOVER +HOVERCRAFT +HOVERCRAFTS +HOVERED +HOVERER +HOVERERS +HOVERFLIES +HOVERFLY +HOVERING +HOVERS +HOW +HOWBEIT +HOWDAH +HOWDAHS +HOWDIE +HOWDIED +HOWDIES +HOWDY +HOWDYING +HOWE +HOWES +HOWEVER +HOWF +HOWFF +HOWFFS +HOWFS +HOWITZER +HOWITZERS +HOWK +HOWKED +HOWKING +HOWKS +HOWL +HOWLED +HOWLER +HOWLERS +HOWLET +HOWLETS +HOWLING +HOWLINGLY +HOWLS +HOWS +HOWSOEVER +HOY +HOYA +HOYAS +HOYDEN +HOYDENED +HOYDENING +HOYDENISH +HOYDENS +HOYLE +HOYLES +HOYS +HRYVNA +HRYVNAS +HRYVNIA +HRYVNIAS +HUARACHE +HUARACHES +HUARACHO +HUARACHOS +HUB +HUBBIES +HUBBLY +HUBBUB +HUBBUBS +HUBBY +HUBCAP +HUBCAPS +HUBRIS +HUBRISES +HUBRISTIC +HUBS +HUCK +HUCKABACK +HUCKABACKS +HUCKLE +HUCKLEBERRIES +HUCKLEBERRY +HUCKLES +HUCKS +HUCKSTER +HUCKSTERED +HUCKSTERING +HUCKSTERISM +HUCKSTERISMS +HUCKSTERS +HUDDLE +HUDDLED +HUDDLER +HUDDLERS +HUDDLES +HUDDLING +HUE +HUED +HUELESS +HUES +HUFF +HUFFED +HUFFIER +HUFFIEST +HUFFILY +HUFFINESS +HUFFINESSES +HUFFING +HUFFISH +HUFFISHLY +HUFFS +HUFFY +HUG +HUGE +HUGELY +HUGENESS +HUGENESSES +HUGEOUS +HUGEOUSLY +HUGER +HUGEST +HUGGABLE +HUGGED +HUGGER +HUGGERS +HUGGING +HUGS +HUH +HUIC +HUIPIL +HUIPILES +HUIPILS +HUISACHE +HUISACHES +HULA +HULAS +HULK +HULKED +HULKIER +HULKIEST +HULKING +HULKS +HULKY +HULL +HULLABALOO +HULLABALOOS +HULLED +HULLER +HULLERS +HULLING +HULLO +HULLOA +HULLOAED +HULLOAING +HULLOAS +HULLOED +HULLOES +HULLOING +HULLOO +HULLOOED +HULLOOING +HULLOOS +HULLOS +HULLS +HUM +HUMAN +HUMANE +HUMANELY +HUMANENESS +HUMANENESSES +HUMANER +HUMANEST +HUMANHOOD +HUMANHOODS +HUMANISE +HUMANISED +HUMANISES +HUMANISING +HUMANISM +HUMANISMS +HUMANIST +HUMANISTIC +HUMANISTICALLY +HUMANISTS +HUMANITARIAN +HUMANITARIANISM +HUMANITARIANS +HUMANITIES +HUMANITY +HUMANIZATION +HUMANIZATIONS +HUMANIZE +HUMANIZED +HUMANIZER +HUMANIZERS +HUMANIZES +HUMANIZING +HUMANKIND +HUMANLIKE +HUMANLY +HUMANNESS +HUMANNESSES +HUMANOID +HUMANOIDS +HUMANS +HUMATE +HUMATES +HUMBLE +HUMBLEBEE +HUMBLEBEES +HUMBLED +HUMBLENESS +HUMBLENESSES +HUMBLER +HUMBLERS +HUMBLES +HUMBLEST +HUMBLING +HUMBLINGLY +HUMBLY +HUMBUG +HUMBUGGED +HUMBUGGER +HUMBUGGERIES +HUMBUGGERS +HUMBUGGERY +HUMBUGGING +HUMBUGS +HUMDINGER +HUMDINGERS +HUMDRUM +HUMDRUMS +HUMECTANT +HUMECTANTS +HUMERAL +HUMERALS +HUMERI +HUMERUS +HUMIC +HUMID +HUMIDEX +HUMIDEXES +HUMIDIFICATION +HUMIDIFICATIONS +HUMIDIFIED +HUMIDIFIER +HUMIDIFIERS +HUMIDIFIES +HUMIDIFY +HUMIDIFYING +HUMIDISTAT +HUMIDISTATS +HUMIDITIES +HUMIDITY +HUMIDLY +HUMIDNESS +HUMIDNESSES +HUMIDOR +HUMIDORS +HUMIFICATION +HUMIFICATIONS +HUMIFIED +HUMILIATE +HUMILIATED +HUMILIATES +HUMILIATING +HUMILIATINGLY +HUMILIATION +HUMILIATIONS +HUMILITIES +HUMILITY +HUMITURE +HUMITURES +HUMMABLE +HUMMED +HUMMER +HUMMERS +HUMMING +HUMMINGBIRD +HUMMINGBIRDS +HUMMOCK +HUMMOCKED +HUMMOCKING +HUMMOCKS +HUMMOCKY +HUMMUS +HUMMUSES +HUMONGOUS +HUMOR +HUMORAL +HUMORED +HUMORESQUE +HUMORESQUES +HUMORFUL +HUMORING +HUMORIST +HUMORISTIC +HUMORISTS +HUMORLESS +HUMORLESSLY +HUMORLESSNESS +HUMORLESSNESSES +HUMOROUS +HUMOROUSLY +HUMOROUSNESS +HUMOROUSNESSES +HUMORS +HUMOUR +HUMOURED +HUMOURING +HUMOURS +HUMP +HUMPBACK +HUMPBACKED +HUMPBACKS +HUMPED +HUMPER +HUMPERS +HUMPH +HUMPHED +HUMPHING +HUMPHS +HUMPIER +HUMPIEST +HUMPINESS +HUMPINESSES +HUMPING +HUMPLESS +HUMPS +HUMPY +HUMS +HUMUNGOUS +HUMUS +HUMUSES +HUMVEE +HUMVEES +HUN +HUNCH +HUNCHBACK +HUNCHBACKED +HUNCHBACKS +HUNCHED +HUNCHES +HUNCHING +HUNDRED +HUNDREDFOLD +HUNDREDS +HUNDREDTH +HUNDREDTHS +HUNDREDWEIGHT +HUNDREDWEIGHTS +HUNG +HUNGER +HUNGERED +HUNGERING +HUNGERS +HUNGOVER +HUNGRIER +HUNGRIEST +HUNGRILY +HUNGRINESS +HUNGRINESSES +HUNGRY +HUNH +HUNK +HUNKER +HUNKERED +HUNKERING +HUNKERS +HUNKEY +HUNKEYS +HUNKIE +HUNKIER +HUNKIES +HUNKIEST +HUNKS +HUNKY +HUNNISH +HUNS +HUNT +HUNTABLE +HUNTED +HUNTEDLY +HUNTER +HUNTERS +HUNTING +HUNTINGS +HUNTRESS +HUNTRESSES +HUNTS +HUNTSMAN +HUNTSMEN +HUP +HUPPAH +HUPPAHS +HURDIES +HURDLE +HURDLED +HURDLER +HURDLERS +HURDLES +HURDLING +HURDS +HURL +HURLED +HURLER +HURLERS +HURLEY +HURLEYS +HURLIES +HURLING +HURLINGS +HURLS +HURLY +HURRAH +HURRAHED +HURRAHING +HURRAHS +HURRAY +HURRAYED +HURRAYING +HURRAYS +HURRICANE +HURRICANES +HURRIED +HURRIEDLY +HURRIEDNESS +HURRIEDNESSES +HURRIER +HURRIERS +HURRIES +HURRY +HURRYING +HURST +HURSTS +HURT +HURTER +HURTERS +HURTFUL +HURTFULLY +HURTFULNESS +HURTFULNESSES +HURTING +HURTLE +HURTLED +HURTLES +HURTLESS +HURTLING +HURTS +HUSBAND +HUSBANDED +HUSBANDER +HUSBANDERS +HUSBANDING +HUSBANDLY +HUSBANDMAN +HUSBANDMEN +HUSBANDRIES +HUSBANDRY +HUSBANDS +HUSH +HUSHABY +HUSHED +HUSHEDLY +HUSHES +HUSHFUL +HUSHING +HUSHPUPPIES +HUSHPUPPY +HUSK +HUSKED +HUSKER +HUSKERS +HUSKIER +HUSKIES +HUSKIEST +HUSKILY +HUSKINESS +HUSKINESSES +HUSKING +HUSKINGS +HUSKLIKE +HUSKS +HUSKY +HUSSAR +HUSSARS +HUSSIES +HUSSY +HUSTINGS +HUSTLE +HUSTLED +HUSTLER +HUSTLERS +HUSTLES +HUSTLING +HUSWIFE +HUSWIFES +HUSWIVES +HUT +HUTCH +HUTCHED +HUTCHES +HUTCHING +HUTLIKE +HUTMENT +HUTMENTS +HUTS +HUTTED +HUTTING +HUTZPA +HUTZPAH +HUTZPAHS +HUTZPAS +HUZZA +HUZZAED +HUZZAH +HUZZAHED +HUZZAHING +HUZZAHS +HUZZAING +HUZZAS +HWAN +HYACINTH +HYACINTHINE +HYACINTHS +HYAENA +HYAENAS +HYAENIC +HYALIN +HYALINE +HYALINES +HYALINS +HYALITE +HYALITES +HYALOGEN +HYALOGENS +HYALOID +HYALOIDS +HYALOPLASM +HYALOPLASMS +HYALURONIDASE +HYALURONIDASES +HYBRID +HYBRIDISM +HYBRIDISMS +HYBRIDIST +HYBRIDISTS +HYBRIDITIES +HYBRIDITY +HYBRIDIZATION +HYBRIDIZATIONS +HYBRIDIZE +HYBRIDIZED +HYBRIDIZER +HYBRIDIZERS +HYBRIDIZES +HYBRIDIZING +HYBRIDOMA +HYBRIDOMAS +HYBRIDS +HYBRIS +HYBRISES +HYBRISTIC +HYDATHODE +HYDATHODES +HYDATID +HYDATIDS +HYDRA +HYDRACID +HYDRACIDS +HYDRAE +HYDRAGOG +HYDRAGOGS +HYDRALAZINE +HYDRALAZINES +HYDRANGEA +HYDRANGEAS +HYDRANT +HYDRANTH +HYDRANTHS +HYDRANTS +HYDRAS +HYDRASE +HYDRASES +HYDRASTIS +HYDRASTISES +HYDRATE +HYDRATED +HYDRATES +HYDRATING +HYDRATION +HYDRATIONS +HYDRATOR +HYDRATORS +HYDRAULIC +HYDRAULICALLY +HYDRAULICS +HYDRAZIDE +HYDRAZIDES +HYDRAZINE +HYDRAZINES +HYDRIA +HYDRIAE +HYDRIC +HYDRID +HYDRIDE +HYDRIDES +HYDRIDS +HYDRILLA +HYDRILLAS +HYDRO +HYDROBIOLOGICAL +HYDROBIOLOGIES +HYDROBIOLOGIST +HYDROBIOLOGISTS +HYDROBIOLOGY +HYDROCARBON +HYDROCARBONS +HYDROCAST +HYDROCASTS +HYDROCELE +HYDROCELES +HYDROCEPHALIC +HYDROCEPHALICS +HYDROCEPHALIES +HYDROCEPHALUS +HYDROCEPHALUSES +HYDROCEPHALY +HYDROCHLORIDE +HYDROCHLORIDES +HYDROCOLLOID +HYDROCOLLOIDAL +HYDROCOLLOIDS +HYDROCORTISONE +HYDROCORTISONES +HYDROCRACK +HYDROCRACKED +HYDROCRACKER +HYDROCRACKERS +HYDROCRACKING +HYDROCRACKINGS +HYDROCRACKS +HYDRODYNAMIC +HYDRODYNAMICAL +HYDRODYNAMICIST +HYDRODYNAMICS +HYDROELECTRIC +HYDROFOIL +HYDROFOILS +HYDROGEL +HYDROGELS +HYDROGEN +HYDROGENASE +HYDROGENASES +HYDROGENATE +HYDROGENATED +HYDROGENATES +HYDROGENATING +HYDROGENATION +HYDROGENATIONS +HYDROGENOUS +HYDROGENS +HYDROGRAPHER +HYDROGRAPHERS +HYDROGRAPHIC +HYDROGRAPHIES +HYDROGRAPHY +HYDROID +HYDROIDS +HYDROKINETIC +HYDROLASE +HYDROLASES +HYDROLOGIC +HYDROLOGICAL +HYDROLOGICALLY +HYDROLOGIES +HYDROLOGIST +HYDROLOGISTS +HYDROLOGY +HYDROLYSATE +HYDROLYSATES +HYDROLYSES +HYDROLYSIS +HYDROLYTE +HYDROLYTES +HYDROLYTIC +HYDROLYTICALLY +HYDROLYZABLE +HYDROLYZATE +HYDROLYZATES +HYDROLYZE +HYDROLYZED +HYDROLYZES +HYDROLYZING +HYDROMAGNETIC +HYDROMANCIES +HYDROMANCY +HYDROMECHANICAL +HYDROMECHANICS +HYDROMEDUSA +HYDROMEDUSAE +HYDROMEL +HYDROMELS +HYDROMETALLURGY +HYDROMETEOR +HYDROMETEORS +HYDROMETER +HYDROMETERS +HYDROMETRIC +HYDROMORPHIC +HYDRONIC +HYDRONICALLY +HYDRONIUM +HYDRONIUMS +HYDROPATH +HYDROPATHIC +HYDROPATHIES +HYDROPATHS +HYDROPATHY +HYDROPEROXIDE +HYDROPEROXIDES +HYDROPHANE +HYDROPHANES +HYDROPHILIC +HYDROPHILICITY +HYDROPHOBIA +HYDROPHOBIAS +HYDROPHOBIC +HYDROPHOBICITY +HYDROPHONE +HYDROPHONES +HYDROPHYTE +HYDROPHYTES +HYDROPHYTIC +HYDROPIC +HYDROPLANE +HYDROPLANED +HYDROPLANES +HYDROPLANING +HYDROPONIC +HYDROPONICALLY +HYDROPONICS +HYDROPOWER +HYDROPOWERS +HYDROPS +HYDROPSES +HYDROPSIES +HYDROPSY +HYDROQUINONE +HYDROQUINONES +HYDROS +HYDROSERE +HYDROSERES +HYDROSKI +HYDROSKIS +HYDROSOL +HYDROSOLIC +HYDROSOLS +HYDROSPACE +HYDROSPACES +HYDROSPHERE +HYDROSPHERES +HYDROSPHERIC +HYDROSTAT +HYDROSTATIC +HYDROSTATICALLY +HYDROSTATICS +HYDROSTATS +HYDROTHERAPIES +HYDROTHERAPY +HYDROTHERMAL +HYDROTHERMALLY +HYDROTHORACES +HYDROTHORAX +HYDROTHORAXES +HYDROTROPIC +HYDROTROPISM +HYDROTROPISMS +HYDROUS +HYDROXIDE +HYDROXIDES +HYDROXY +HYDROXYAPATITE +HYDROXYAPATITES +HYDROXYL +HYDROXYLAMINE +HYDROXYLAMINES +HYDROXYLAPATITE +HYDROXYLASE +HYDROXYLASES +HYDROXYLATE +HYDROXYLATED +HYDROXYLATES +HYDROXYLATING +HYDROXYLATION +HYDROXYLATIONS +HYDROXYLIC +HYDROXYLS +HYDROXYPROLINE +HYDROXYPROLINES +HYDROXYUREA +HYDROXYUREAS +HYDROXYZINE +HYDROXYZINES +HYDROZOAN +HYDROZOANS +HYENA +HYENAS +HYENIC +HYENINE +HYENOID +HYETAL +HYGEIST +HYGEISTS +HYGIEIST +HYGIEISTS +HYGIENE +HYGIENES +HYGIENIC +HYGIENICALLY +HYGIENICS +HYGIENIST +HYGIENISTS +HYGROGRAPH +HYGROGRAPHS +HYGROMETER +HYGROMETERS +HYGROMETRIC +HYGROPHILOUS +HYGROPHYTE +HYGROPHYTES +HYGROPHYTIC +HYGROSCOPIC +HYGROSCOPICITY +HYGROSTAT +HYGROSTATS +HYING +HYLA +HYLAS +HYLOZOIC +HYLOZOISM +HYLOZOISMS +HYLOZOIST +HYLOZOISTIC +HYLOZOISTS +HYMEN +HYMENAL +HYMENEAL +HYMENEALLY +HYMENEALS +HYMENIA +HYMENIAL +HYMENIUM +HYMENIUMS +HYMENOPTERA +HYMENOPTERAN +HYMENOPTERANS +HYMENOPTERON +HYMENOPTERONS +HYMENOPTEROUS +HYMENS +HYMN +HYMNAL +HYMNALS +HYMNARIES +HYMNARY +HYMNBOOK +HYMNBOOKS +HYMNED +HYMNING +HYMNIST +HYMNISTS +HYMNLESS +HYMNLIKE +HYMNODIES +HYMNODIST +HYMNODISTS +HYMNODY +HYMNOLOGIES +HYMNOLOGY +HYMNS +HYOID +HYOIDAL +HYOIDEAN +HYOIDS +HYOSCINE +HYOSCINES +HYOSCYAMINE +HYOSCYAMINES +HYP +HYPABYSSAL +HYPABYSSALLY +HYPAETHRAL +HYPALLAGE +HYPALLAGES +HYPANTHIA +HYPANTHIUM +HYPE +HYPED +HYPER +HYPERACID +HYPERACIDITIES +HYPERACIDITY +HYPERACTIVE +HYPERACTIVES +HYPERACTIVITIES +HYPERACTIVITY +HYPERACUITIES +HYPERACUITY +HYPERACUTE +HYPERAESTHESIA +HYPERAESTHESIAS +HYPERAESTHETIC +HYPERAGGRESSIVE +HYPERALERT +HYPERARID +HYPERAROUSAL +HYPERAROUSALS +HYPERAWARE +HYPERAWARENESS +HYPERBARIC +HYPERBARICALLY +HYPERBOLA +HYPERBOLAE +HYPERBOLAS +HYPERBOLE +HYPERBOLES +HYPERBOLIC +HYPERBOLICAL +HYPERBOLICALLY +HYPERBOLIST +HYPERBOLISTS +HYPERBOLIZE +HYPERBOLIZED +HYPERBOLIZES +HYPERBOLIZING +HYPERBOLOID +HYPERBOLOIDAL +HYPERBOLOIDS +HYPERBOREAN +HYPERBOREANS +HYPERCALCEMIA +HYPERCALCEMIAS +HYPERCALCEMIC +HYPERCAPNIA +HYPERCAPNIAS +HYPERCAPNIC +HYPERCATABOLISM +HYPERCATALECTIC +HYPERCATALEXES +HYPERCATALEXIS +HYPERCAUTIOUS +HYPERCHARGE +HYPERCHARGED +HYPERCHARGES +HYPERCIVILIZED +HYPERCOAGULABLE +HYPERCOMPLEX +HYPERCONSCIOUS +HYPERCORRECT +HYPERCORRECTION +HYPERCORRECTLY +HYPERCRITIC +HYPERCRITICAL +HYPERCRITICALLY +HYPERCRITICISM +HYPERCRITICISMS +HYPERCRITICS +HYPERCUBE +HYPERCUBES +HYPEREFFICIENT +HYPEREMIA +HYPEREMIAS +HYPEREMIC +HYPEREMOTIONAL +HYPERENDEMIC +HYPERENERGETIC +HYPERESTHESIA +HYPERESTHESIAS +HYPERESTHETIC +HYPEREUTECTIC +HYPEREUTECTOID +HYPEREXCITABLE +HYPEREXCITED +HYPEREXCITEMENT +HYPEREXCRETION +HYPEREXCRETIONS +HYPEREXTEND +HYPEREXTENDED +HYPEREXTENDING +HYPEREXTENDS +HYPEREXTENSION +HYPEREXTENSIONS +HYPERFASTIDIOUS +HYPERFINE +HYPERFUNCTION +HYPERFUNCTIONAL +HYPERFUNCTIONS +HYPERGAMIES +HYPERGAMY +HYPERGLYCEMIA +HYPERGLYCEMIAS +HYPERGLYCEMIC +HYPERGOL +HYPERGOLIC +HYPERGOLICALLY +HYPERGOLS +HYPERHIDROSES +HYPERHIDROSIS +HYPERIMMUNE +HYPERIMMUNIZE +HYPERIMMUNIZED +HYPERIMMUNIZES +HYPERIMMUNIZING +HYPERINFLATED +HYPERINFLATION +HYPERINFLATIONS +HYPERINSULINISM +HYPERINTENSE +HYPERINVOLUTION +HYPERIRRITABLE +HYPERKERATOSES +HYPERKERATOSIS +HYPERKERATOTIC +HYPERKINESES +HYPERKINESIA +HYPERKINESIAS +HYPERKINESIS +HYPERKINETIC +HYPERLINK +HYPERLINKED +HYPERLINKING +HYPERLINKS +HYPERLIPEMIA +HYPERLIPEMIAS +HYPERLIPEMIC +HYPERLIPIDEMIA +HYPERLIPIDEMIAS +HYPERMANIA +HYPERMANIAS +HYPERMANIC +HYPERMARKET +HYPERMARKETS +HYPERMASCULINE +HYPERMEDIA +HYPERMEDIAS +HYPERMETABOLIC +HYPERMETABOLISM +HYPERMETER +HYPERMETERS +HYPERMETRIC +HYPERMETRICAL +HYPERMETROPIA +HYPERMETROPIAS +HYPERMETROPIC +HYPERMNESIA +HYPERMNESIAS +HYPERMNESIC +HYPERMOBILITIES +HYPERMOBILITY +HYPERMODERN +HYPERMODERNIST +HYPERMODERNISTS +HYPERMUTABILITY +HYPERMUTABLE +HYPERON +HYPERONS +HYPEROPE +HYPEROPES +HYPEROPIA +HYPEROPIAS +HYPEROPIC +HYPEROSTOSES +HYPEROSTOSIS +HYPEROSTOTIC +HYPERPARASITE +HYPERPARASITES +HYPERPARASITIC +HYPERPARASITISM +HYPERPHAGIA +HYPERPHAGIAS +HYPERPHAGIC +HYPERPHYSICAL +HYPERPIGMENTED +HYPERPITUITARY +HYPERPLANE +HYPERPLANES +HYPERPLASIA +HYPERPLASIAS +HYPERPLASTIC +HYPERPLOID +HYPERPLOIDIES +HYPERPLOIDS +HYPERPLOIDY +HYPERPNEA +HYPERPNEAS +HYPERPNEIC +HYPERPOLARIZE +HYPERPOLARIZED +HYPERPOLARIZES +HYPERPOLARIZING +HYPERPRODUCER +HYPERPRODUCERS +HYPERPRODUCTION +HYPERPURE +HYPERPYREXIA +HYPERPYREXIAS +HYPERRATIONAL +HYPERREACTIVE +HYPERREACTIVITY +HYPERREACTOR +HYPERREACTORS +HYPERREALISM +HYPERREALISMS +HYPERREALIST +HYPERREALISTIC +HYPERRESPONSIVE +HYPERROMANTIC +HYPERROMANTICS +HYPERS +HYPERSALINE +HYPERSALINITIES +HYPERSALINITY +HYPERSALIVATION +HYPERSECRETION +HYPERSECRETIONS +HYPERSENSITIVE +HYPERSENSITIZE +HYPERSENSITIZED +HYPERSENSITIZES +HYPERSEXUAL +HYPERSEXUALITY +HYPERSOMNOLENCE +HYPERSONIC +HYPERSONICALLY +HYPERSPACE +HYPERSPACES +HYPERSTATIC +HYPERSTHENE +HYPERSTHENES +HYPERSTHENIC +HYPERSTIMULATE +HYPERSTIMULATED +HYPERSTIMULATES +HYPERSURFACE +HYPERSURFACES +HYPERTENSE +HYPERTENSION +HYPERTENSIONS +HYPERTENSIVE +HYPERTENSIVES +HYPERTEXT +HYPERTEXTS +HYPERTHERMIA +HYPERTHERMIAS +HYPERTHERMIC +HYPERTHYROID +HYPERTHYROIDISM +HYPERTONIA +HYPERTONIAS +HYPERTONIC +HYPERTONICITIES +HYPERTONICITY +HYPERTROPHIC +HYPERTROPHIED +HYPERTROPHIES +HYPERTROPHY +HYPERTROPHYING +HYPERTYPICAL +HYPERURBANISM +HYPERURBANISMS +HYPERURICEMIA +HYPERURICEMIAS +HYPERVELOCITIES +HYPERVELOCITY +HYPERVENTILATE +HYPERVENTILATED +HYPERVENTILATES +HYPERVIGILANCE +HYPERVIGILANCES +HYPERVIGILANT +HYPERVIRULENT +HYPERVISCOSITY +HYPES +HYPETHRAL +HYPHA +HYPHAE +HYPHAL +HYPHEMIA +HYPHEMIAS +HYPHEN +HYPHENATE +HYPHENATED +HYPHENATES +HYPHENATING +HYPHENATION +HYPHENATIONS +HYPHENED +HYPHENIC +HYPHENING +HYPHENLESS +HYPHENS +HYPING +HYPNAGOGIC +HYPNIC +HYPNOGOGIC +HYPNOID +HYPNOIDAL +HYPNOLOGIES +HYPNOLOGY +HYPNOPOMPIC +HYPNOSES +HYPNOSIS +HYPNOTHERAPIES +HYPNOTHERAPIST +HYPNOTHERAPISTS +HYPNOTHERAPY +HYPNOTIC +HYPNOTICALLY +HYPNOTICS +HYPNOTISM +HYPNOTISMS +HYPNOTIST +HYPNOTISTS +HYPNOTIZABILITY +HYPNOTIZABLE +HYPNOTIZE +HYPNOTIZED +HYPNOTIZES +HYPNOTIZING +HYPO +HYPOACID +HYPOALLERGENIC +HYPOBARIC +HYPOBLAST +HYPOBLASTS +HYPOCALCEMIA +HYPOCALCEMIAS +HYPOCALCEMIC +HYPOCAUST +HYPOCAUSTS +HYPOCENTER +HYPOCENTERS +HYPOCENTRAL +HYPOCHLORITE +HYPOCHLORITES +HYPOCHONDRIA +HYPOCHONDRIAC +HYPOCHONDRIACAL +HYPOCHONDRIACS +HYPOCHONDRIAS +HYPOCHONDRIASES +HYPOCHONDRIASIS +HYPOCORISM +HYPOCORISMS +HYPOCORISTIC +HYPOCORISTICAL +HYPOCOTYL +HYPOCOTYLS +HYPOCRISIES +HYPOCRISY +HYPOCRITE +HYPOCRITES +HYPOCRITICAL +HYPOCRITICALLY +HYPOCYCLOID +HYPOCYCLOIDS +HYPODERM +HYPODERMA +HYPODERMAL +HYPODERMAS +HYPODERMIC +HYPODERMICALLY +HYPODERMICS +HYPODERMIS +HYPODERMISES +HYPODERMS +HYPODIPLOID +HYPODIPLOIDIES +HYPODIPLOIDY +HYPOED +HYPOEUTECTOID +HYPOGASTRIC +HYPOGEA +HYPOGEAL +HYPOGEAN +HYPOGENE +HYPOGEOUS +HYPOGEUM +HYPOGLOSSAL +HYPOGLOSSALS +HYPOGLYCEMIA +HYPOGLYCEMIAS +HYPOGLYCEMIC +HYPOGLYCEMICS +HYPOGYNIES +HYPOGYNOUS +HYPOGYNY +HYPOING +HYPOKALEMIA +HYPOKALEMIAS +HYPOKALEMIC +HYPOLIMNIA +HYPOLIMNION +HYPOMAGNESEMIA +HYPOMAGNESEMIAS +HYPOMANIA +HYPOMANIAS +HYPOMANIC +HYPOMANICS +HYPOMORPH +HYPOMORPHIC +HYPOMORPHS +HYPONASTIES +HYPONASTY +HYPONEA +HYPONEAS +HYPONOIA +HYPONOIAS +HYPONYM +HYPONYMIES +HYPONYMS +HYPONYMY +HYPOPHARYNGES +HYPOPHARYNX +HYPOPHARYNXES +HYPOPHYSEAL +HYPOPHYSECTOMY +HYPOPHYSES +HYPOPHYSIAL +HYPOPHYSIS +HYPOPITUITARISM +HYPOPITUITARY +HYPOPLASIA +HYPOPLASIAS +HYPOPLASTIC +HYPOPLOID +HYPOPLOIDS +HYPOPNEA +HYPOPNEAS +HYPOPNEIC +HYPOPYON +HYPOPYONS +HYPOS +HYPOSENSITIZE +HYPOSENSITIZED +HYPOSENSITIZES +HYPOSENSITIZING +HYPOSPADIAS +HYPOSPADIASES +HYPOSTASES +HYPOSTASIS +HYPOSTATIC +HYPOSTATICALLY +HYPOSTATIZATION +HYPOSTATIZE +HYPOSTATIZED +HYPOSTATIZES +HYPOSTATIZING +HYPOSTOME +HYPOSTOMES +HYPOSTYLE +HYPOSTYLES +HYPOTACTIC +HYPOTAXES +HYPOTAXIS +HYPOTENSION +HYPOTENSIONS +HYPOTENSIVE +HYPOTENSIVES +HYPOTENUSE +HYPOTENUSES +HYPOTHALAMI +HYPOTHALAMIC +HYPOTHALAMUS +HYPOTHEC +HYPOTHECATE +HYPOTHECATED +HYPOTHECATES +HYPOTHECATING +HYPOTHECATION +HYPOTHECATIONS +HYPOTHECATOR +HYPOTHECATORS +HYPOTHECS +HYPOTHENUSE +HYPOTHENUSES +HYPOTHERMAL +HYPOTHERMIA +HYPOTHERMIAS +HYPOTHERMIC +HYPOTHESES +HYPOTHESIS +HYPOTHESIZE +HYPOTHESIZED +HYPOTHESIZES +HYPOTHESIZING +HYPOTHETICAL +HYPOTHETICALLY +HYPOTHYROID +HYPOTHYROIDISM +HYPOTHYROIDISMS +HYPOTONIA +HYPOTONIAS +HYPOTONIC +HYPOTONICITIES +HYPOTONICITY +HYPOXANTHINE +HYPOXANTHINES +HYPOXEMIA +HYPOXEMIAS +HYPOXEMIC +HYPOXIA +HYPOXIAS +HYPOXIC +HYPS +HYPSOMETER +HYPSOMETERS +HYPSOMETRIC +HYRACES +HYRACOID +HYRACOIDS +HYRAX +HYRAXES +HYSON +HYSONS +HYSSOP +HYSSOPS +HYSTERECTOMIES +HYSTERECTOMIZED +HYSTERECTOMY +HYSTERESES +HYSTERESIS +HYSTERETIC +HYSTERIA +HYSTERIAS +HYSTERIC +HYSTERICAL +HYSTERICALLY +HYSTERICS +HYSTEROID +HYSTEROTOMIES +HYSTEROTOMY +HYTE +IAMB +IAMBI +IAMBIC +IAMBICS +IAMBS +IAMBUS +IAMBUSES +IATRIC +IATRICAL +IATROGENIC +IATROGENICALLY +IBEX +IBEXES +IBICES +IBIDEM +IBIS +IBISES +IBOGAINE +IBOGAINES +IBUPROFEN +IBUPROFENS +ICE +ICEBERG +ICEBERGS +ICEBLINK +ICEBLINKS +ICEBOAT +ICEBOATER +ICEBOATERS +ICEBOATING +ICEBOATINGS +ICEBOATS +ICEBOUND +ICEBOX +ICEBOXES +ICEBREAKER +ICEBREAKERS +ICECAP +ICECAPPED +ICECAPS +ICED +ICEFALL +ICEFALLS +ICEHOUSE +ICEHOUSES +ICEKHANA +ICEKHANAS +ICELESS +ICELIKE +ICEMAKER +ICEMAKERS +ICEMAN +ICEMEN +ICES +ICH +ICHNEUMON +ICHNEUMONS +ICHNITE +ICHNITES +ICHNOLITE +ICHNOLITES +ICHNOLOGIES +ICHNOLOGY +ICHOR +ICHOROUS +ICHORS +ICHS +ICHTHYIC +ICHTHYOFAUNA +ICHTHYOFAUNAE +ICHTHYOFAUNAL +ICHTHYOFAUNAS +ICHTHYOID +ICHTHYOIDS +ICHTHYOLOGICAL +ICHTHYOLOGIES +ICHTHYOLOGIST +ICHTHYOLOGISTS +ICHTHYOLOGY +ICHTHYOPHAGOUS +ICHTHYOSAUR +ICHTHYOSAURIAN +ICHTHYOSAURIANS +ICHTHYOSAURS +ICICLE +ICICLED +ICICLES +ICIER +ICIEST +ICILY +ICINESS +ICINESSES +ICING +ICINGS +ICK +ICKER +ICKERS +ICKIER +ICKIEST +ICKILY +ICKINESS +ICKINESSES +ICKY +ICON +ICONES +ICONIC +ICONICAL +ICONICALLY +ICONICITIES +ICONICITY +ICONOCLASM +ICONOCLASMS +ICONOCLAST +ICONOCLASTIC +ICONOCLASTS +ICONOGRAPHER +ICONOGRAPHERS +ICONOGRAPHIC +ICONOGRAPHICAL +ICONOGRAPHIES +ICONOGRAPHY +ICONOLATRIES +ICONOLATRY +ICONOLOGICAL +ICONOLOGIES +ICONOLOGY +ICONOSCOPE +ICONOSCOPES +ICONOSTASES +ICONOSTASIS +ICONS +ICOSAHEDRA +ICOSAHEDRAL +ICOSAHEDRON +ICOSAHEDRONS +ICTERIC +ICTERICAL +ICTERICS +ICTERUS +ICTERUSES +ICTIC +ICTUS +ICTUSES +ICY +ID +IDEA +IDEAL +IDEALESS +IDEALISE +IDEALISED +IDEALISES +IDEALISING +IDEALISM +IDEALISMS +IDEALIST +IDEALISTIC +IDEALISTICALLY +IDEALISTS +IDEALITIES +IDEALITY +IDEALIZATION +IDEALIZATIONS +IDEALIZE +IDEALIZED +IDEALIZER +IDEALIZERS +IDEALIZES +IDEALIZING +IDEALLESS +IDEALLY +IDEALOGIES +IDEALOGUE +IDEALOGUES +IDEALOGY +IDEALS +IDEAS +IDEATE +IDEATED +IDEATES +IDEATING +IDEATION +IDEATIONAL +IDEATIONALLY +IDEATIONS +IDEATIVE +IDEM +IDEMPOTENT +IDEMPOTENTS +IDENTIC +IDENTICAL +IDENTICALLY +IDENTICALNESS +IDENTICALNESSES +IDENTIFIABLE +IDENTIFIABLY +IDENTIFICATION +IDENTIFICATIONS +IDENTIFIED +IDENTIFIER +IDENTIFIERS +IDENTIFIES +IDENTIFY +IDENTIFYING +IDENTIKIT +IDENTITIES +IDENTITY +IDEOGRAM +IDEOGRAMIC +IDEOGRAMMATIC +IDEOGRAMMIC +IDEOGRAMS +IDEOGRAPH +IDEOGRAPHIC +IDEOGRAPHICALLY +IDEOGRAPHIES +IDEOGRAPHS +IDEOGRAPHY +IDEOLOGIC +IDEOLOGICAL +IDEOLOGICALLY +IDEOLOGIES +IDEOLOGIST +IDEOLOGISTS +IDEOLOGIZE +IDEOLOGIZED +IDEOLOGIZES +IDEOLOGIZING +IDEOLOGUE +IDEOLOGUES +IDEOLOGY +IDEOMOTOR +IDEOPHONE +IDEOPHONES +IDES +IDIOBLAST +IDIOBLASTIC +IDIOBLASTS +IDIOCIES +IDIOCY +IDIOGRAPHIC +IDIOLECT +IDIOLECTAL +IDIOLECTS +IDIOM +IDIOMATIC +IDIOMATICALLY +IDIOMATICNESS +IDIOMATICNESSES +IDIOMORPHIC +IDIOMS +IDIOPATHIC +IDIOPATHICALLY +IDIOPATHIES +IDIOPATHY +IDIOPLASM +IDIOPLASMS +IDIOSYNCRASIES +IDIOSYNCRASY +IDIOSYNCRATIC +IDIOT +IDIOTIC +IDIOTICAL +IDIOTICALLY +IDIOTISM +IDIOTISMS +IDIOTS +IDIOTYPE +IDIOTYPES +IDIOTYPIC +IDLE +IDLED +IDLENESS +IDLENESSES +IDLER +IDLERS +IDLES +IDLESSE +IDLESSES +IDLEST +IDLING +IDLY +IDOCRASE +IDOCRASES +IDOL +IDOLATER +IDOLATERS +IDOLATOR +IDOLATORS +IDOLATRIES +IDOLATROUS +IDOLATROUSLY +IDOLATROUSNESS +IDOLATRY +IDOLISE +IDOLISED +IDOLISER +IDOLISERS +IDOLISES +IDOLISING +IDOLISM +IDOLISMS +IDOLIZATION +IDOLIZATIONS +IDOLIZE +IDOLIZED +IDOLIZER +IDOLIZERS +IDOLIZES +IDOLIZING +IDOLS +IDONEITIES +IDONEITY +IDONEOUS +IDS +IDYL +IDYLIST +IDYLISTS +IDYLL +IDYLLIC +IDYLLICALLY +IDYLLIST +IDYLLISTS +IDYLLS +IDYLS +IF +IFF +IFFIER +IFFIEST +IFFINESS +IFFINESSES +IFFY +IFS +IGG +IGGED +IGGING +IGGS +IGLOO +IGLOOS +IGLU +IGLUS +IGNATIA +IGNATIAS +IGNEOUS +IGNESCENT +IGNESCENTS +IGNIFIED +IGNIFIES +IGNIFY +IGNIFYING +IGNIMBRITE +IGNIMBRITES +IGNITABILITIES +IGNITABILITY +IGNITABLE +IGNITE +IGNITED +IGNITER +IGNITERS +IGNITES +IGNITIBLE +IGNITING +IGNITION +IGNITIONS +IGNITOR +IGNITORS +IGNITRON +IGNITRONS +IGNOBILITIES +IGNOBILITY +IGNOBLE +IGNOBLENESS +IGNOBLENESSES +IGNOBLY +IGNOMINIES +IGNOMINIOUS +IGNOMINIOUSLY +IGNOMINIOUSNESS +IGNOMINY +IGNORABLE +IGNORAMI +IGNORAMUS +IGNORAMUSES +IGNORANCE +IGNORANCES +IGNORANT +IGNORANTLY +IGNORANTNESS +IGNORANTNESSES +IGNORE +IGNORED +IGNORER +IGNORERS +IGNORES +IGNORING +IGUANA +IGUANAS +IGUANIAN +IGUANIANS +IGUANID +IGUANIDS +IGUANODON +IGUANODONS +IHRAM +IHRAMS +IKAT +IKATS +IKEBANA +IKEBANAS +IKON +IKONS +ILEA +ILEAC +ILEAL +ILEITIDES +ILEITIS +ILEOSTOMIES +ILEOSTOMY +ILEUM +ILEUS +ILEUSES +ILEX +ILEXES +ILIA +ILIAC +ILIAD +ILIADS +ILIAL +ILIUM +ILK +ILKA +ILKS +ILL +ILLATION +ILLATIONS +ILLATIVE +ILLATIVELY +ILLATIVES +ILLAUDABLE +ILLAUDABLY +ILLEGAL +ILLEGALITIES +ILLEGALITY +ILLEGALIZATION +ILLEGALIZATIONS +ILLEGALIZE +ILLEGALIZED +ILLEGALIZES +ILLEGALIZING +ILLEGALLY +ILLEGALS +ILLEGIBILITIES +ILLEGIBILITY +ILLEGIBLE +ILLEGIBLY +ILLEGITIMACIES +ILLEGITIMACY +ILLEGITIMATE +ILLEGITIMATELY +ILLER +ILLEST +ILLIBERAL +ILLIBERALISM +ILLIBERALISMS +ILLIBERALITIES +ILLIBERALITY +ILLIBERALLY +ILLIBERALNESS +ILLIBERALNESSES +ILLICIT +ILLICITLY +ILLIMITABILITY +ILLIMITABLE +ILLIMITABLENESS +ILLIMITABLY +ILLINIUM +ILLINIUMS +ILLIQUID +ILLIQUIDITIES +ILLIQUIDITY +ILLITE +ILLITERACIES +ILLITERACY +ILLITERATE +ILLITERATELY +ILLITERATENESS +ILLITERATES +ILLITES +ILLITIC +ILLNESS +ILLNESSES +ILLOCUTIONARY +ILLOGIC +ILLOGICAL +ILLOGICALITIES +ILLOGICALITY +ILLOGICALLY +ILLOGICALNESS +ILLOGICALNESSES +ILLOGICS +ILLS +ILLUDE +ILLUDED +ILLUDES +ILLUDING +ILLUME +ILLUMED +ILLUMES +ILLUMINABLE +ILLUMINANCE +ILLUMINANCES +ILLUMINANT +ILLUMINANTS +ILLUMINATE +ILLUMINATED +ILLUMINATES +ILLUMINATI +ILLUMINATING +ILLUMINATINGLY +ILLUMINATION +ILLUMINATIONS +ILLUMINATIVE +ILLUMINATOR +ILLUMINATORS +ILLUMINE +ILLUMINED +ILLUMINES +ILLUMING +ILLUMINING +ILLUMINISM +ILLUMINISMS +ILLUMINIST +ILLUMINISTS +ILLUSION +ILLUSIONAL +ILLUSIONARY +ILLUSIONISM +ILLUSIONISMS +ILLUSIONIST +ILLUSIONISTIC +ILLUSIONISTS +ILLUSIONS +ILLUSIVE +ILLUSIVELY +ILLUSIVENESS +ILLUSIVENESSES +ILLUSORILY +ILLUSORINESS +ILLUSORINESSES +ILLUSORY +ILLUSTRATE +ILLUSTRATED +ILLUSTRATES +ILLUSTRATING +ILLUSTRATION +ILLUSTRATIONAL +ILLUSTRATIONS +ILLUSTRATIVE +ILLUSTRATIVELY +ILLUSTRATOR +ILLUSTRATORS +ILLUSTRIOUS +ILLUSTRIOUSLY +ILLUSTRIOUSNESS +ILLUVIA +ILLUVIAL +ILLUVIATE +ILLUVIATED +ILLUVIATES +ILLUVIATING +ILLUVIATION +ILLUVIATIONS +ILLUVIUM +ILLUVIUMS +ILLY +ILMENITE +ILMENITES +IMAGE +IMAGEABLE +IMAGED +IMAGER +IMAGERIES +IMAGERS +IMAGERY +IMAGES +IMAGINABLE +IMAGINABLENESS +IMAGINABLY +IMAGINAL +IMAGINARIES +IMAGINARILY +IMAGINARINESS +IMAGINARINESSES +IMAGINARY +IMAGINATION +IMAGINATIONS +IMAGINATIVE +IMAGINATIVELY +IMAGINATIVENESS +IMAGINE +IMAGINED +IMAGINER +IMAGINERS +IMAGINES +IMAGING +IMAGINGS +IMAGINING +IMAGISM +IMAGISMS +IMAGIST +IMAGISTIC +IMAGISTICALLY +IMAGISTS +IMAGO +IMAGOES +IMAGOS +IMAM +IMAMATE +IMAMATES +IMAMS +IMARET +IMARETS +IMAUM +IMAUMS +IMBALANCE +IMBALANCED +IMBALANCES +IMBALM +IMBALMED +IMBALMER +IMBALMERS +IMBALMING +IMBALMS +IMBARK +IMBARKED +IMBARKING +IMBARKS +IMBECILE +IMBECILES +IMBECILIC +IMBECILITIES +IMBECILITY +IMBED +IMBEDDED +IMBEDDING +IMBEDS +IMBIBE +IMBIBED +IMBIBER +IMBIBERS +IMBIBES +IMBIBING +IMBIBITION +IMBIBITIONAL +IMBIBITIONS +IMBITTER +IMBITTERED +IMBITTERING +IMBITTERS +IMBLAZE +IMBLAZED +IMBLAZES +IMBLAZING +IMBODIED +IMBODIES +IMBODY +IMBODYING +IMBOLDEN +IMBOLDENED +IMBOLDENING +IMBOLDENS +IMBOSOM +IMBOSOMED +IMBOSOMING +IMBOSOMS +IMBOWER +IMBOWERED +IMBOWERING +IMBOWERS +IMBRICATE +IMBRICATED +IMBRICATES +IMBRICATING +IMBRICATION +IMBRICATIONS +IMBROGLIO +IMBROGLIOS +IMBROWN +IMBROWNED +IMBROWNING +IMBROWNS +IMBRUE +IMBRUED +IMBRUES +IMBRUING +IMBRUTE +IMBRUTED +IMBRUTES +IMBRUTING +IMBUE +IMBUED +IMBUEMENT +IMBUEMENTS +IMBUES +IMBUING +IMID +IMIDAZOLE +IMIDAZOLES +IMIDE +IMIDES +IMIDIC +IMIDO +IMIDS +IMINE +IMINES +IMINO +IMIPRAMINE +IMIPRAMINES +IMITABLE +IMITATE +IMITATED +IMITATES +IMITATING +IMITATION +IMITATIONS +IMITATIVE +IMITATIVELY +IMITATIVENESS +IMITATIVENESSES +IMITATOR +IMITATORS +IMMACULACIES +IMMACULACY +IMMACULATE +IMMACULATELY +IMMANE +IMMANENCE +IMMANENCES +IMMANENCIES +IMMANENCY +IMMANENT +IMMANENTISM +IMMANENTISMS +IMMANENTIST +IMMANENTISTIC +IMMANENTISTS +IMMANENTLY +IMMATERIAL +IMMATERIALISM +IMMATERIALISMS +IMMATERIALIST +IMMATERIALISTS +IMMATERIALITIES +IMMATERIALITY +IMMATERIALIZE +IMMATERIALIZED +IMMATERIALIZES +IMMATERIALIZING +IMMATURE +IMMATURELY +IMMATURES +IMMATURITIES +IMMATURITY +IMMEASURABLE +IMMEASURABLY +IMMEDIACIES +IMMEDIACY +IMMEDIATE +IMMEDIATELY +IMMEDIATENESS +IMMEDIATENESSES +IMMEDICABLE +IMMEDICABLY +IMMEMORIAL +IMMEMORIALLY +IMMENSE +IMMENSELY +IMMENSENESS +IMMENSENESSES +IMMENSER +IMMENSEST +IMMENSITIES +IMMENSITY +IMMENSURABLE +IMMERGE +IMMERGED +IMMERGES +IMMERGING +IMMERSE +IMMERSED +IMMERSES +IMMERSIBLE +IMMERSING +IMMERSION +IMMERSIONS +IMMESH +IMMESHED +IMMESHES +IMMESHING +IMMETHODICAL +IMMETHODICALLY +IMMIES +IMMIGRANT +IMMIGRANTS +IMMIGRATE +IMMIGRATED +IMMIGRATES +IMMIGRATING +IMMIGRATION +IMMIGRATIONAL +IMMIGRATIONS +IMMINENCE +IMMINENCES +IMMINENCIES +IMMINENCY +IMMINENT +IMMINENTLY +IMMINGLE +IMMINGLED +IMMINGLES +IMMINGLING +IMMISCIBILITIES +IMMISCIBILITY +IMMISCIBLE +IMMITIGABLE +IMMITIGABLY +IMMITTANCE +IMMITTANCES +IMMIX +IMMIXED +IMMIXES +IMMIXING +IMMIXTURE +IMMIXTURES +IMMOBILE +IMMOBILISM +IMMOBILISMS +IMMOBILITIES +IMMOBILITY +IMMOBILIZATION +IMMOBILIZATIONS +IMMOBILIZE +IMMOBILIZED +IMMOBILIZER +IMMOBILIZERS +IMMOBILIZES +IMMOBILIZING +IMMODERACIES +IMMODERACY +IMMODERATE +IMMODERATELY +IMMODERATENESS +IMMODERATION +IMMODERATIONS +IMMODEST +IMMODESTIES +IMMODESTLY +IMMODESTY +IMMOLATE +IMMOLATED +IMMOLATES +IMMOLATING +IMMOLATION +IMMOLATIONS +IMMOLATOR +IMMOLATORS +IMMORAL +IMMORALISM +IMMORALISMS +IMMORALIST +IMMORALISTS +IMMORALITIES +IMMORALITY +IMMORALLY +IMMORTAL +IMMORTALISE +IMMORTALISED +IMMORTALISES +IMMORTALISING +IMMORTALITIES +IMMORTALITY +IMMORTALIZATION +IMMORTALIZE +IMMORTALIZED +IMMORTALIZER +IMMORTALIZERS +IMMORTALIZES +IMMORTALIZING +IMMORTALLY +IMMORTALS +IMMORTELLE +IMMORTELLES +IMMOTILE +IMMOVABILITIES +IMMOVABILITY +IMMOVABLE +IMMOVABLENESS +IMMOVABLENESSES +IMMOVABLES +IMMOVABLY +IMMUNE +IMMUNES +IMMUNISE +IMMUNISED +IMMUNISES +IMMUNISING +IMMUNITIES +IMMUNITY +IMMUNIZATION +IMMUNIZATIONS +IMMUNIZE +IMMUNIZED +IMMUNIZER +IMMUNIZERS +IMMUNIZES +IMMUNIZING +IMMUNOASSAY +IMMUNOASSAYABLE +IMMUNOASSAYS +IMMUNOBLOT +IMMUNOBLOTS +IMMUNOBLOTTING +IMMUNOBLOTTINGS +IMMUNOCHEMICAL +IMMUNOCHEMIST +IMMUNOCHEMISTRY +IMMUNOCHEMISTS +IMMUNOCOMPETENT +IMMUNODEFICIENT +IMMUNODIAGNOSES +IMMUNODIAGNOSIS +IMMUNODIFFUSION +IMMUNOGEN +IMMUNOGENESES +IMMUNOGENESIS +IMMUNOGENETIC +IMMUNOGENETICS +IMMUNOGENIC +IMMUNOGENICITY +IMMUNOGENS +IMMUNOGLOBULIN +IMMUNOGLOBULINS +IMMUNOLOGIC +IMMUNOLOGICAL +IMMUNOLOGICALLY +IMMUNOLOGIES +IMMUNOLOGIST +IMMUNOLOGISTS +IMMUNOLOGY +IMMUNOMODULATOR +IMMUNOPATHOLOGY +IMMUNOREACTIVE +IMMUNOSORBENT +IMMUNOSORBENTS +IMMUNOSUPPRESS +IMMUNOTHERAPIES +IMMUNOTHERAPY +IMMURE +IMMURED +IMMUREMENT +IMMUREMENTS +IMMURES +IMMURING +IMMUTABILITIES +IMMUTABILITY +IMMUTABLE +IMMUTABLENESS +IMMUTABLENESSES +IMMUTABLY +IMMY +IMP +IMPACT +IMPACTED +IMPACTER +IMPACTERS +IMPACTFUL +IMPACTING +IMPACTION +IMPACTIONS +IMPACTIVE +IMPACTOR +IMPACTORS +IMPACTS +IMPAINT +IMPAINTED +IMPAINTING +IMPAINTS +IMPAIR +IMPAIRED +IMPAIRER +IMPAIRERS +IMPAIRING +IMPAIRMENT +IMPAIRMENTS +IMPAIRS +IMPALA +IMPALAS +IMPALE +IMPALED +IMPALEMENT +IMPALEMENTS +IMPALER +IMPALERS +IMPALES +IMPALING +IMPALPABILITIES +IMPALPABILITY +IMPALPABLE +IMPALPABLY +IMPANEL +IMPANELED +IMPANELING +IMPANELLED +IMPANELLING +IMPANELS +IMPARADISE +IMPARADISED +IMPARADISES +IMPARADISING +IMPARITIES +IMPARITY +IMPARK +IMPARKED +IMPARKING +IMPARKS +IMPART +IMPARTATION +IMPARTATIONS +IMPARTED +IMPARTER +IMPARTERS +IMPARTIAL +IMPARTIALITIES +IMPARTIALITY +IMPARTIALLY +IMPARTIBLE +IMPARTIBLY +IMPARTING +IMPARTMENT +IMPARTMENTS +IMPARTS +IMPASSABILITIES +IMPASSABILITY +IMPASSABLE +IMPASSABLENESS +IMPASSABLY +IMPASSE +IMPASSES +IMPASSIBILITIES +IMPASSIBILITY +IMPASSIBLE +IMPASSIBLY +IMPASSION +IMPASSIONED +IMPASSIONING +IMPASSIONS +IMPASSIVE +IMPASSIVELY +IMPASSIVENESS +IMPASSIVENESSES +IMPASSIVITIES +IMPASSIVITY +IMPASTE +IMPASTED +IMPASTES +IMPASTING +IMPASTO +IMPASTOED +IMPASTOS +IMPATIENCE +IMPATIENCES +IMPATIENS +IMPATIENT +IMPATIENTLY +IMPAVID +IMPAWN +IMPAWNED +IMPAWNING +IMPAWNS +IMPEACH +IMPEACHABLE +IMPEACHED +IMPEACHER +IMPEACHERS +IMPEACHES +IMPEACHING +IMPEACHMENT +IMPEACHMENTS +IMPEARL +IMPEARLED +IMPEARLING +IMPEARLS +IMPECCABILITIES +IMPECCABILITY +IMPECCABLE +IMPECCABLY +IMPECCANT +IMPECUNIOSITIES +IMPECUNIOSITY +IMPECUNIOUS +IMPECUNIOUSLY +IMPECUNIOUSNESS +IMPED +IMPEDANCE +IMPEDANCES +IMPEDE +IMPEDED +IMPEDER +IMPEDERS +IMPEDES +IMPEDIMENT +IMPEDIMENTA +IMPEDIMENTS +IMPEDING +IMPEL +IMPELLED +IMPELLENT +IMPELLENTS +IMPELLER +IMPELLERS +IMPELLING +IMPELLOR +IMPELLORS +IMPELS +IMPEND +IMPENDED +IMPENDENT +IMPENDING +IMPENDS +IMPENETRABILITY +IMPENETRABLE +IMPENETRABLY +IMPENITENCE +IMPENITENCES +IMPENITENT +IMPENITENTLY +IMPERATIVE +IMPERATIVELY +IMPERATIVENESS +IMPERATIVES +IMPERATOR +IMPERATORIAL +IMPERATORS +IMPERCEIVABLE +IMPERCEPTIBLE +IMPERCEPTIBLY +IMPERCEPTIVE +IMPERCIPIENCE +IMPERCIPIENCES +IMPERCIPIENT +IMPERFECT +IMPERFECTION +IMPERFECTIONS +IMPERFECTIVE +IMPERFECTIVES +IMPERFECTLY +IMPERFECTNESS +IMPERFECTNESSES +IMPERFECTS +IMPERFORATE +IMPERIA +IMPERIAL +IMPERIALISM +IMPERIALISMS +IMPERIALIST +IMPERIALISTIC +IMPERIALISTS +IMPERIALLY +IMPERIALS +IMPERIL +IMPERILED +IMPERILING +IMPERILLED +IMPERILLING +IMPERILMENT +IMPERILMENTS +IMPERILS +IMPERIOUS +IMPERIOUSLY +IMPERIOUSNESS +IMPERIOUSNESSES +IMPERISHABILITY +IMPERISHABLE +IMPERISHABLES +IMPERISHABLY +IMPERIUM +IMPERIUMS +IMPERMANENCE +IMPERMANENCES +IMPERMANENCIES +IMPERMANENCY +IMPERMANENT +IMPERMANENTLY +IMPERMEABILITY +IMPERMEABLE +IMPERMISSIBLE +IMPERMISSIBLY +IMPERSONAL +IMPERSONALITIES +IMPERSONALITY +IMPERSONALIZE +IMPERSONALIZED +IMPERSONALIZES +IMPERSONALIZING +IMPERSONALLY +IMPERSONATE +IMPERSONATED +IMPERSONATES +IMPERSONATING +IMPERSONATION +IMPERSONATIONS +IMPERSONATOR +IMPERSONATORS +IMPERTINENCE +IMPERTINENCES +IMPERTINENCIES +IMPERTINENCY +IMPERTINENT +IMPERTINENTLY +IMPERTURBABLE +IMPERTURBABLY +IMPERVIOUS +IMPERVIOUSLY +IMPERVIOUSNESS +IMPETIGINOUS +IMPETIGO +IMPETIGOS +IMPETRATE +IMPETRATED +IMPETRATES +IMPETRATING +IMPETRATION +IMPETRATIONS +IMPETUOSITIES +IMPETUOSITY +IMPETUOUS +IMPETUOUSLY +IMPETUOUSNESS +IMPETUOUSNESSES +IMPETUS +IMPETUSES +IMPHEE +IMPHEES +IMPI +IMPIETIES +IMPIETY +IMPING +IMPINGE +IMPINGED +IMPINGEMENT +IMPINGEMENTS +IMPINGER +IMPINGERS +IMPINGES +IMPINGING +IMPINGS +IMPIOUS +IMPIOUSLY +IMPIS +IMPISH +IMPISHLY +IMPISHNESS +IMPISHNESSES +IMPLACABILITIES +IMPLACABILITY +IMPLACABLE +IMPLACABLY +IMPLANT +IMPLANTABLE +IMPLANTATION +IMPLANTATIONS +IMPLANTED +IMPLANTER +IMPLANTERS +IMPLANTING +IMPLANTS +IMPLAUSIBILITY +IMPLAUSIBLE +IMPLAUSIBLY +IMPLEAD +IMPLEADED +IMPLEADER +IMPLEADERS +IMPLEADING +IMPLEADS +IMPLED +IMPLEDGE +IMPLEDGED +IMPLEDGES +IMPLEDGING +IMPLEMENT +IMPLEMENTATION +IMPLEMENTATIONS +IMPLEMENTED +IMPLEMENTER +IMPLEMENTERS +IMPLEMENTING +IMPLEMENTOR +IMPLEMENTORS +IMPLEMENTS +IMPLETION +IMPLETIONS +IMPLICATE +IMPLICATED +IMPLICATES +IMPLICATING +IMPLICATION +IMPLICATIONS +IMPLICATIVE +IMPLICATIVELY +IMPLICATIVENESS +IMPLICIT +IMPLICITLY +IMPLICITNESS +IMPLICITNESSES +IMPLIED +IMPLIES +IMPLODE +IMPLODED +IMPLODES +IMPLODING +IMPLORE +IMPLORED +IMPLORER +IMPLORERS +IMPLORES +IMPLORING +IMPLORINGLY +IMPLOSION +IMPLOSIONS +IMPLOSIVE +IMPLOSIVES +IMPLY +IMPLYING +IMPOLICIES +IMPOLICY +IMPOLITE +IMPOLITELY +IMPOLITENESS +IMPOLITENESSES +IMPOLITIC +IMPOLITICAL +IMPOLITICALLY +IMPOLITICLY +IMPONDERABILITY +IMPONDERABLE +IMPONDERABLES +IMPONDERABLY +IMPONE +IMPONED +IMPONES +IMPONING +IMPOROUS +IMPORT +IMPORTABLE +IMPORTANCE +IMPORTANCES +IMPORTANCIES +IMPORTANCY +IMPORTANT +IMPORTANTLY +IMPORTATION +IMPORTATIONS +IMPORTED +IMPORTER +IMPORTERS +IMPORTING +IMPORTS +IMPORTUNATE +IMPORTUNATELY +IMPORTUNATENESS +IMPORTUNE +IMPORTUNED +IMPORTUNELY +IMPORTUNER +IMPORTUNERS +IMPORTUNES +IMPORTUNING +IMPORTUNITIES +IMPORTUNITY +IMPOSABLE +IMPOSE +IMPOSED +IMPOSER +IMPOSERS +IMPOSES +IMPOSING +IMPOSINGLY +IMPOSITION +IMPOSITIONS +IMPOSSIBILITIES +IMPOSSIBILITY +IMPOSSIBLE +IMPOSSIBLENESS +IMPOSSIBLY +IMPOST +IMPOSTED +IMPOSTER +IMPOSTERS +IMPOSTHUME +IMPOSTHUMES +IMPOSTING +IMPOSTOR +IMPOSTORS +IMPOSTS +IMPOSTUME +IMPOSTUMES +IMPOSTURE +IMPOSTURES +IMPOTENCE +IMPOTENCES +IMPOTENCIES +IMPOTENCY +IMPOTENT +IMPOTENTLY +IMPOTENTS +IMPOUND +IMPOUNDED +IMPOUNDER +IMPOUNDERS +IMPOUNDING +IMPOUNDMENT +IMPOUNDMENTS +IMPOUNDS +IMPOVERISH +IMPOVERISHED +IMPOVERISHER +IMPOVERISHERS +IMPOVERISHES +IMPOVERISHING +IMPOVERISHMENT +IMPOVERISHMENTS +IMPOWER +IMPOWERED +IMPOWERING +IMPOWERS +IMPRACTICABLE +IMPRACTICABLY +IMPRACTICAL +IMPRACTICALITY +IMPRACTICALLY +IMPRECATE +IMPRECATED +IMPRECATES +IMPRECATING +IMPRECATION +IMPRECATIONS +IMPRECATORY +IMPRECISE +IMPRECISELY +IMPRECISENESS +IMPRECISENESSES +IMPRECISION +IMPRECISIONS +IMPREGN +IMPREGNABILITY +IMPREGNABLE +IMPREGNABLENESS +IMPREGNABLY +IMPREGNANT +IMPREGNANTS +IMPREGNATE +IMPREGNATED +IMPREGNATES +IMPREGNATING +IMPREGNATION +IMPREGNATIONS +IMPREGNATOR +IMPREGNATORS +IMPREGNED +IMPREGNING +IMPREGNS +IMPRESA +IMPRESARIO +IMPRESARIOS +IMPRESAS +IMPRESE +IMPRESES +IMPRESS +IMPRESSED +IMPRESSES +IMPRESSIBILITY +IMPRESSIBLE +IMPRESSING +IMPRESSION +IMPRESSIONABLE +IMPRESSIONISM +IMPRESSIONISMS +IMPRESSIONIST +IMPRESSIONISTIC +IMPRESSIONISTS +IMPRESSIONS +IMPRESSIVE +IMPRESSIVELY +IMPRESSIVENESS +IMPRESSMENT +IMPRESSMENTS +IMPRESSURE +IMPRESSURES +IMPREST +IMPRESTS +IMPRIMATUR +IMPRIMATURS +IMPRIMIS +IMPRINT +IMPRINTED +IMPRINTER +IMPRINTERS +IMPRINTING +IMPRINTINGS +IMPRINTS +IMPRISON +IMPRISONED +IMPRISONING +IMPRISONMENT +IMPRISONMENTS +IMPRISONS +IMPROBABILITIES +IMPROBABILITY +IMPROBABLE +IMPROBABLY +IMPROBITIES +IMPROBITY +IMPROMPTU +IMPROMPTUS +IMPROPER +IMPROPERLY +IMPROPERNESS +IMPROPERNESSES +IMPROPRIETIES +IMPROPRIETY +IMPROV +IMPROVABILITIES +IMPROVABILITY +IMPROVABLE +IMPROVE +IMPROVED +IMPROVEMENT +IMPROVEMENTS +IMPROVER +IMPROVERS +IMPROVES +IMPROVIDENCE +IMPROVIDENCES +IMPROVIDENT +IMPROVIDENTLY +IMPROVING +IMPROVISATION +IMPROVISATIONAL +IMPROVISATIONS +IMPROVISATOR +IMPROVISATORE +IMPROVISATORES +IMPROVISATORI +IMPROVISATORIAL +IMPROVISATORS +IMPROVISATORY +IMPROVISE +IMPROVISED +IMPROVISER +IMPROVISERS +IMPROVISES +IMPROVISING +IMPROVISOR +IMPROVISORS +IMPROVS +IMPRUDENCE +IMPRUDENCES +IMPRUDENT +IMPRUDENTLY +IMPS +IMPUDENCE +IMPUDENCES +IMPUDENCIES +IMPUDENCY +IMPUDENT +IMPUDENTLY +IMPUDICITIES +IMPUDICITY +IMPUGN +IMPUGNABLE +IMPUGNED +IMPUGNER +IMPUGNERS +IMPUGNING +IMPUGNS +IMPUISSANCE +IMPUISSANCES +IMPUISSANT +IMPULSE +IMPULSED +IMPULSES +IMPULSING +IMPULSION +IMPULSIONS +IMPULSIVE +IMPULSIVELY +IMPULSIVENESS +IMPULSIVENESSES +IMPULSIVITIES +IMPULSIVITY +IMPUNITIES +IMPUNITY +IMPURE +IMPURELY +IMPURENESS +IMPURENESSES +IMPURER +IMPUREST +IMPURITIES +IMPURITY +IMPUTABILITIES +IMPUTABILITY +IMPUTABLE +IMPUTABLY +IMPUTATION +IMPUTATIONS +IMPUTATIVE +IMPUTATIVELY +IMPUTE +IMPUTED +IMPUTER +IMPUTERS +IMPUTES +IMPUTING +IN +INABILITIES +INABILITY +INACCESSIBILITY +INACCESSIBLE +INACCESSIBLY +INACCURACIES +INACCURACY +INACCURATE +INACCURATELY +INACTION +INACTIONS +INACTIVATE +INACTIVATED +INACTIVATES +INACTIVATING +INACTIVATION +INACTIVATIONS +INACTIVE +INACTIVELY +INACTIVITIES +INACTIVITY +INADEQUACIES +INADEQUACY +INADEQUATE +INADEQUATELY +INADEQUATENESS +INADMISSIBILITY +INADMISSIBLE +INADMISSIBLY +INADVERTENCE +INADVERTENCES +INADVERTENCIES +INADVERTENCY +INADVERTENT +INADVERTENTLY +INADVISABILITY +INADVISABLE +INALIENABILITY +INALIENABLE +INALIENABLY +INALTERABILITY +INALTERABLE +INALTERABLENESS +INALTERABLY +INAMORATA +INAMORATAS +INAMORATO +INAMORATOS +INANE +INANELY +INANENESS +INANENESSES +INANER +INANES +INANEST +INANIMATE +INANIMATELY +INANIMATENESS +INANIMATENESSES +INANITIES +INANITION +INANITIONS +INANITY +INAPPARENT +INAPPARENTLY +INAPPEASABLE +INAPPETENCE +INAPPETENCES +INAPPLICABILITY +INAPPLICABLE +INAPPLICABLY +INAPPOSITE +INAPPOSITELY +INAPPOSITENESS +INAPPRECIABLE +INAPPRECIABLY +INAPPRECIATIVE +INAPPROACHABLE +INAPPROPRIATE +INAPPROPRIATELY +INAPT +INAPTITUDE +INAPTITUDES +INAPTLY +INAPTNESS +INAPTNESSES +INARABLE +INARCH +INARCHED +INARCHES +INARCHING +INARGUABLE +INARGUABLY +INARM +INARMED +INARMING +INARMS +INARTICULACIES +INARTICULACY +INARTICULATE +INARTICULATELY +INARTICULATES +INARTISTIC +INARTISTICALLY +INATTENTION +INATTENTIONS +INATTENTIVE +INATTENTIVELY +INATTENTIVENESS +INAUDIBILITIES +INAUDIBILITY +INAUDIBLE +INAUDIBLY +INAUGURAL +INAUGURALS +INAUGURATE +INAUGURATED +INAUGURATES +INAUGURATING +INAUGURATION +INAUGURATIONS +INAUGURATOR +INAUGURATORS +INAUSPICIOUS +INAUSPICIOUSLY +INAUTHENTIC +INAUTHENTICITY +INBEING +INBEINGS +INBOARD +INBOARDS +INBORN +INBOUND +INBOUNDED +INBOUNDING +INBOUNDS +INBREATHE +INBREATHED +INBREATHES +INBREATHING +INBRED +INBREDS +INBREED +INBREEDER +INBREEDERS +INBREEDING +INBREEDINGS +INBREEDS +INBUILT +INBURST +INBURSTS +INBY +INBYE +INCAGE +INCAGED +INCAGES +INCAGING +INCALCULABILITY +INCALCULABLE +INCALCULABLY +INCALESCENCE +INCALESCENCES +INCALESCENT +INCANDESCE +INCANDESCED +INCANDESCENCE +INCANDESCENCES +INCANDESCENT +INCANDESCENTLY +INCANDESCENTS +INCANDESCES +INCANDESCING +INCANT +INCANTATION +INCANTATIONAL +INCANTATIONS +INCANTATORY +INCANTED +INCANTING +INCANTS +INCAPABILITIES +INCAPABILITY +INCAPABLE +INCAPABLENESS +INCAPABLENESSES +INCAPABLY +INCAPACITATE +INCAPACITATED +INCAPACITATES +INCAPACITATING +INCAPACITATION +INCAPACITATIONS +INCAPACITIES +INCAPACITY +INCARCERATE +INCARCERATED +INCARCERATES +INCARCERATING +INCARCERATION +INCARCERATIONS +INCARDINATION +INCARDINATIONS +INCARNADINE +INCARNADINED +INCARNADINES +INCARNADINING +INCARNATE +INCARNATED +INCARNATES +INCARNATING +INCARNATION +INCARNATIONS +INCASE +INCASED +INCASES +INCASING +INCAUTION +INCAUTIONS +INCAUTIOUS +INCAUTIOUSLY +INCAUTIOUSNESS +INCENDIARIES +INCENDIARISM +INCENDIARISMS +INCENDIARY +INCENSE +INCENSED +INCENSES +INCENSING +INCENT +INCENTED +INCENTER +INCENTERS +INCENTING +INCENTIVE +INCENTIVES +INCENTIVIZE +INCENTIVIZED +INCENTIVIZES +INCENTIVIZING +INCENTS +INCEPT +INCEPTED +INCEPTING +INCEPTION +INCEPTIONS +INCEPTIVE +INCEPTIVELY +INCEPTIVES +INCEPTOR +INCEPTORS +INCEPTS +INCERTITUDE +INCERTITUDES +INCESSANCIES +INCESSANCY +INCESSANT +INCESSANTLY +INCEST +INCESTS +INCESTUOUS +INCESTUOUSLY +INCESTUOUSNESS +INCH +INCHED +INCHER +INCHERS +INCHES +INCHING +INCHMEAL +INCHOATE +INCHOATELY +INCHOATENESS +INCHOATENESSES +INCHOATIVE +INCHOATIVELY +INCHOATIVES +INCHWORM +INCHWORMS +INCIDENCE +INCIDENCES +INCIDENT +INCIDENTAL +INCIDENTALLY +INCIDENTALS +INCIDENTS +INCINERATE +INCINERATED +INCINERATES +INCINERATING +INCINERATION +INCINERATIONS +INCINERATOR +INCINERATORS +INCIPIENCE +INCIPIENCES +INCIPIENCIES +INCIPIENCY +INCIPIENT +INCIPIENTLY +INCIPIT +INCIPITS +INCISAL +INCISE +INCISED +INCISES +INCISING +INCISION +INCISIONS +INCISIVE +INCISIVELY +INCISIVENESS +INCISIVENESSES +INCISOR +INCISORS +INCISORY +INCISURE +INCISURES +INCITABLE +INCITANT +INCITANTS +INCITATION +INCITATIONS +INCITE +INCITED +INCITEMENT +INCITEMENTS +INCITER +INCITERS +INCITES +INCITING +INCIVIL +INCIVILITIES +INCIVILITY +INCLASP +INCLASPED +INCLASPING +INCLASPS +INCLEMENCIES +INCLEMENCY +INCLEMENT +INCLEMENTLY +INCLINABLE +INCLINATION +INCLINATIONAL +INCLINATIONS +INCLINE +INCLINED +INCLINER +INCLINERS +INCLINES +INCLINING +INCLININGS +INCLINOMETER +INCLINOMETERS +INCLIP +INCLIPPED +INCLIPPING +INCLIPS +INCLOSE +INCLOSED +INCLOSER +INCLOSERS +INCLOSES +INCLOSING +INCLOSURE +INCLOSURES +INCLUDABLE +INCLUDE +INCLUDED +INCLUDES +INCLUDIBLE +INCLUDING +INCLUSION +INCLUSIONS +INCLUSIVE +INCLUSIVELY +INCLUSIVENESS +INCLUSIVENESSES +INCOERCIBLE +INCOG +INCOGITANT +INCOGNITA +INCOGNITAS +INCOGNITO +INCOGNITOS +INCOGNIZANCE +INCOGNIZANCES +INCOGNIZANT +INCOGS +INCOHERENCE +INCOHERENCES +INCOHERENT +INCOHERENTLY +INCOMBUSTIBLE +INCOMBUSTIBLES +INCOME +INCOMER +INCOMERS +INCOMES +INCOMING +INCOMINGS +INCOMMENSURABLE +INCOMMENSURABLY +INCOMMENSURATE +INCOMMODE +INCOMMODED +INCOMMODES +INCOMMODING +INCOMMODIOUS +INCOMMODIOUSLY +INCOMMODITIES +INCOMMODITY +INCOMMUNICABLE +INCOMMUNICABLY +INCOMMUNICADO +INCOMMUNICATIVE +INCOMMUTABLE +INCOMMUTABLY +INCOMPACT +INCOMPARABILITY +INCOMPARABLE +INCOMPARABLY +INCOMPATIBILITY +INCOMPATIBLE +INCOMPATIBLES +INCOMPATIBLY +INCOMPETENCE +INCOMPETENCES +INCOMPETENCIES +INCOMPETENCY +INCOMPETENT +INCOMPETENTLY +INCOMPETENTS +INCOMPLETE +INCOMPLETELY +INCOMPLETENESS +INCOMPLIANT +INCOMPREHENSION +INCOMPRESSIBLE +INCOMPUTABLE +INCOMPUTABLY +INCONCEIVABLE +INCONCEIVABLY +INCONCINNITIES +INCONCINNITY +INCONCLUSIVE +INCONCLUSIVELY +INCONDITE +INCONFORMITIES +INCONFORMITY +INCONGRUENCE +INCONGRUENCES +INCONGRUENT +INCONGRUENTLY +INCONGRUITIES +INCONGRUITY +INCONGRUOUS +INCONGRUOUSLY +INCONGRUOUSNESS +INCONNU +INCONNUS +INCONSCIENT +INCONSECUTIVE +INCONSEQUENCE +INCONSEQUENCES +INCONSEQUENT +INCONSEQUENTIAL +INCONSEQUENTLY +INCONSIDERABLE +INCONSIDERABLY +INCONSIDERATE +INCONSIDERATELY +INCONSIDERATION +INCONSISTENCE +INCONSISTENCES +INCONSISTENCIES +INCONSISTENCY +INCONSISTENT +INCONSISTENTLY +INCONSOLABLE +INCONSOLABLY +INCONSONANCE +INCONSONANCES +INCONSONANT +INCONSPICUOUS +INCONSPICUOUSLY +INCONSTANCIES +INCONSTANCY +INCONSTANT +INCONSTANTLY +INCONSUMABLE +INCONSUMABLY +INCONTESTABLE +INCONTESTABLY +INCONTINENCE +INCONTINENCES +INCONTINENCIES +INCONTINENCY +INCONTINENT +INCONTINENTLY +INCONTROLLABLE +INCONVENIENCE +INCONVENIENCED +INCONVENIENCES +INCONVENIENCIES +INCONVENIENCING +INCONVENIENCY +INCONVENIENT +INCONVENIENTLY +INCONVERTIBLE +INCONVERTIBLY +INCONVINCIBLE +INCONY +INCOORDINATION +INCOORDINATIONS +INCORPORABLE +INCORPORATE +INCORPORATED +INCORPORATES +INCORPORATING +INCORPORATION +INCORPORATIONS +INCORPORATIVE +INCORPORATOR +INCORPORATORS +INCORPOREAL +INCORPOREALLY +INCORPOREITIES +INCORPOREITY +INCORPSE +INCORPSED +INCORPSES +INCORPSING +INCORRECT +INCORRECTLY +INCORRECTNESS +INCORRECTNESSES +INCORRIGIBILITY +INCORRIGIBLE +INCORRIGIBLES +INCORRIGIBLY +INCORRUPT +INCORRUPTED +INCORRUPTIBLE +INCORRUPTIBLES +INCORRUPTIBLY +INCORRUPTION +INCORRUPTIONS +INCORRUPTLY +INCORRUPTNESS +INCORRUPTNESSES +INCREASABLE +INCREASE +INCREASED +INCREASER +INCREASERS +INCREASES +INCREASING +INCREASINGLY +INCREATE +INCREDIBILITIES +INCREDIBILITY +INCREDIBLE +INCREDIBLENESS +INCREDIBLY +INCREDULITIES +INCREDULITY +INCREDULOUS +INCREDULOUSLY +INCREMENT +INCREMENTAL +INCREMENTALISM +INCREMENTALISMS +INCREMENTALIST +INCREMENTALISTS +INCREMENTALLY +INCREMENTS +INCRESCENT +INCRETION +INCRETIONS +INCRIMINATE +INCRIMINATED +INCRIMINATES +INCRIMINATING +INCRIMINATION +INCRIMINATIONS +INCRIMINATORY +INCROSS +INCROSSED +INCROSSES +INCROSSING +INCRUST +INCRUSTATION +INCRUSTATIONS +INCRUSTED +INCRUSTING +INCRUSTS +INCUBATE +INCUBATED +INCUBATES +INCUBATING +INCUBATION +INCUBATIONS +INCUBATIVE +INCUBATOR +INCUBATORS +INCUBATORY +INCUBI +INCUBUS +INCUBUSES +INCUDAL +INCUDATE +INCUDES +INCULCATE +INCULCATED +INCULCATES +INCULCATING +INCULCATION +INCULCATIONS +INCULCATOR +INCULCATORS +INCULPABLE +INCULPATE +INCULPATED +INCULPATES +INCULPATING +INCULPATION +INCULPATIONS +INCULPATORY +INCULT +INCUMBENCIES +INCUMBENCY +INCUMBENT +INCUMBENTS +INCUMBER +INCUMBERED +INCUMBERING +INCUMBERS +INCUNABLE +INCUNABLES +INCUNABULA +INCUNABULUM +INCUR +INCURABLE +INCURABLES +INCURABLY +INCURIOSITIES +INCURIOSITY +INCURIOUS +INCURIOUSLY +INCURIOUSNESS +INCURIOUSNESSES +INCURRED +INCURRENCE +INCURRENCES +INCURRENT +INCURRING +INCURS +INCURSION +INCURSIONS +INCURSIVE +INCURVATE +INCURVATED +INCURVATES +INCURVATING +INCURVATION +INCURVATIONS +INCURVATURE +INCURVATURES +INCURVE +INCURVED +INCURVES +INCURVING +INCUS +INCUSE +INCUSED +INCUSES +INCUSING +INDABA +INDABAS +INDAGATE +INDAGATED +INDAGATES +INDAGATING +INDAGATION +INDAGATIONS +INDAGATOR +INDAGATORS +INDAMIN +INDAMINE +INDAMINES +INDAMINS +INDEBTED +INDEBTEDNESS +INDEBTEDNESSES +INDECENCIES +INDECENCY +INDECENT +INDECENTER +INDECENTEST +INDECENTLY +INDECIPHERABLE +INDECISION +INDECISIONS +INDECISIVE +INDECISIVELY +INDECISIVENESS +INDECLINABLE +INDECOMPOSABLE +INDECOROUS +INDECOROUSLY +INDECOROUSNESS +INDECORUM +INDECORUMS +INDEED +INDEFATIGABLE +INDEFATIGABLY +INDEFEASIBILITY +INDEFEASIBLE +INDEFEASIBLY +INDEFECTIBILITY +INDEFECTIBLE +INDEFECTIBLY +INDEFENSIBILITY +INDEFENSIBLE +INDEFENSIBLY +INDEFINABILITY +INDEFINABLE +INDEFINABLENESS +INDEFINABLES +INDEFINABLY +INDEFINITE +INDEFINITELY +INDEFINITENESS +INDEFINITES +INDEHISCENCE +INDEHISCENCES +INDEHISCENT +INDELIBILITIES +INDELIBILITY +INDELIBLE +INDELIBLY +INDELICACIES +INDELICACY +INDELICATE +INDELICATELY +INDELICATENESS +INDEMNIFICATION +INDEMNIFIED +INDEMNIFIER +INDEMNIFIERS +INDEMNIFIES +INDEMNIFY +INDEMNIFYING +INDEMNITIES +INDEMNITY +INDEMONSTRABLE +INDEMONSTRABLY +INDENE +INDENES +INDENT +INDENTATION +INDENTATIONS +INDENTED +INDENTER +INDENTERS +INDENTING +INDENTION +INDENTIONS +INDENTOR +INDENTORS +INDENTS +INDENTURE +INDENTURED +INDENTURES +INDENTURING +INDEPENDENCE +INDEPENDENCES +INDEPENDENCIES +INDEPENDENCY +INDEPENDENT +INDEPENDENTLY +INDEPENDENTS +INDESCRIBABLE +INDESCRIBABLY +INDESTRUCTIBLE +INDESTRUCTIBLY +INDETERMINABLE +INDETERMINABLY +INDETERMINACIES +INDETERMINACY +INDETERMINATE +INDETERMINATELY +INDETERMINATION +INDETERMINISM +INDETERMINISMS +INDETERMINIST +INDETERMINISTIC +INDETERMINISTS +INDEVOUT +INDEX +INDEXABLE +INDEXATION +INDEXATIONS +INDEXED +INDEXER +INDEXERS +INDEXES +INDEXICAL +INDEXICALS +INDEXING +INDEXINGS +INDICAN +INDICANS +INDICANT +INDICANTS +INDICATE +INDICATED +INDICATES +INDICATING +INDICATION +INDICATIONAL +INDICATIONS +INDICATIVE +INDICATIVELY +INDICATIVES +INDICATOR +INDICATORS +INDICATORY +INDICES +INDICIA +INDICIAS +INDICIUM +INDICIUMS +INDICT +INDICTABLE +INDICTED +INDICTEE +INDICTEES +INDICTER +INDICTERS +INDICTING +INDICTION +INDICTIONS +INDICTMENT +INDICTMENTS +INDICTOR +INDICTORS +INDICTS +INDIE +INDIES +INDIFFERENCE +INDIFFERENCES +INDIFFERENCIES +INDIFFERENCY +INDIFFERENT +INDIFFERENTISM +INDIFFERENTISMS +INDIFFERENTIST +INDIFFERENTISTS +INDIFFERENTLY +INDIGEN +INDIGENCE +INDIGENCES +INDIGENCIES +INDIGENCY +INDIGENE +INDIGENES +INDIGENIZATION +INDIGENIZATIONS +INDIGENIZE +INDIGENIZED +INDIGENIZES +INDIGENIZING +INDIGENOUS +INDIGENOUSLY +INDIGENOUSNESS +INDIGENS +INDIGENT +INDIGENTS +INDIGESTED +INDIGESTIBILITY +INDIGESTIBLE +INDIGESTIBLES +INDIGESTION +INDIGESTIONS +INDIGN +INDIGNANT +INDIGNANTLY +INDIGNATION +INDIGNATIONS +INDIGNITIES +INDIGNITY +INDIGNLY +INDIGO +INDIGOES +INDIGOID +INDIGOIDS +INDIGOS +INDIGOTIN +INDIGOTINS +INDINAVIR +INDINAVIRS +INDIRECT +INDIRECTION +INDIRECTIONS +INDIRECTLY +INDIRECTNESS +INDIRECTNESSES +INDISCERNIBLE +INDISCIPLINABLE +INDISCIPLINE +INDISCIPLINED +INDISCIPLINES +INDISCOVERABLE +INDISCREET +INDISCREETLY +INDISCREETNESS +INDISCRETION +INDISCRETIONS +INDISCRIMINATE +INDISPENSABLE +INDISPENSABLES +INDISPENSABLY +INDISPOSE +INDISPOSED +INDISPOSES +INDISPOSING +INDISPOSITION +INDISPOSITIONS +INDISPUTABLE +INDISPUTABLY +INDISSOCIABLE +INDISSOCIABLY +INDISSOLUBILITY +INDISSOLUBLE +INDISSOLUBLY +INDISTINCT +INDISTINCTIVE +INDISTINCTLY +INDISTINCTNESS +INDITE +INDITED +INDITER +INDITERS +INDITES +INDITING +INDIUM +INDIUMS +INDIVIDUAL +INDIVIDUALISE +INDIVIDUALISED +INDIVIDUALISES +INDIVIDUALISING +INDIVIDUALISM +INDIVIDUALISMS +INDIVIDUALIST +INDIVIDUALISTIC +INDIVIDUALISTS +INDIVIDUALITIES +INDIVIDUALITY +INDIVIDUALIZE +INDIVIDUALIZED +INDIVIDUALIZES +INDIVIDUALIZING +INDIVIDUALLY +INDIVIDUALS +INDIVIDUATE +INDIVIDUATED +INDIVIDUATES +INDIVIDUATING +INDIVIDUATION +INDIVIDUATIONS +INDIVISIBILITY +INDIVISIBLE +INDIVISIBLES +INDIVISIBLY +INDOCILE +INDOCILITIES +INDOCILITY +INDOCTRINATE +INDOCTRINATED +INDOCTRINATES +INDOCTRINATING +INDOCTRINATION +INDOCTRINATIONS +INDOCTRINATOR +INDOCTRINATORS +INDOL +INDOLE +INDOLENCE +INDOLENCES +INDOLENT +INDOLENTLY +INDOLES +INDOLS +INDOMETHACIN +INDOMETHACINS +INDOMITABILITY +INDOMITABLE +INDOMITABLENESS +INDOMITABLY +INDOOR +INDOORS +INDOPHENOL +INDOPHENOLS +INDORSE +INDORSED +INDORSEE +INDORSEES +INDORSEMENT +INDORSEMENTS +INDORSER +INDORSERS +INDORSES +INDORSING +INDORSOR +INDORSORS +INDOW +INDOWED +INDOWING +INDOWS +INDOXYL +INDOXYLS +INDRAFT +INDRAFTS +INDRAUGHT +INDRAUGHTS +INDRAWN +INDRI +INDRIS +INDUBITABILITY +INDUBITABLE +INDUBITABLENESS +INDUBITABLY +INDUCE +INDUCED +INDUCEMENT +INDUCEMENTS +INDUCER +INDUCERS +INDUCES +INDUCIBILITIES +INDUCIBILITY +INDUCIBLE +INDUCING +INDUCT +INDUCTANCE +INDUCTANCES +INDUCTED +INDUCTEE +INDUCTEES +INDUCTILE +INDUCTING +INDUCTION +INDUCTIONS +INDUCTIVE +INDUCTIVELY +INDUCTOR +INDUCTORS +INDUCTS +INDUE +INDUED +INDUES +INDUING +INDULGE +INDULGED +INDULGENCE +INDULGENCES +INDULGENT +INDULGENTLY +INDULGER +INDULGERS +INDULGES +INDULGING +INDULIN +INDULINE +INDULINES +INDULINS +INDULT +INDULTS +INDURATE +INDURATED +INDURATES +INDURATING +INDURATION +INDURATIONS +INDURATIVE +INDUSIA +INDUSIAL +INDUSIATE +INDUSIUM +INDUSTRIAL +INDUSTRIALISE +INDUSTRIALISED +INDUSTRIALISES +INDUSTRIALISING +INDUSTRIALISM +INDUSTRIALISMS +INDUSTRIALIST +INDUSTRIALISTS +INDUSTRIALIZE +INDUSTRIALIZED +INDUSTRIALIZES +INDUSTRIALIZING +INDUSTRIALLY +INDUSTRIALS +INDUSTRIES +INDUSTRIOUS +INDUSTRIOUSLY +INDUSTRIOUSNESS +INDUSTRY +INDWELL +INDWELLER +INDWELLERS +INDWELLING +INDWELLS +INDWELT +INEARTH +INEARTHED +INEARTHING +INEARTHS +INEBRIANT +INEBRIANTS +INEBRIATE +INEBRIATED +INEBRIATES +INEBRIATING +INEBRIATION +INEBRIATIONS +INEBRIETIES +INEBRIETY +INEDIBLE +INEDIBLY +INEDITA +INEDITED +INEDUCABILITIES +INEDUCABILITY +INEDUCABLE +INEFFABILITIES +INEFFABILITY +INEFFABLE +INEFFABLENESS +INEFFABLENESSES +INEFFABLY +INEFFACEABILITY +INEFFACEABLE +INEFFACEABLY +INEFFECTIVE +INEFFECTIVELY +INEFFECTIVENESS +INEFFECTUAL +INEFFECTUALITY +INEFFECTUALLY +INEFFECTUALNESS +INEFFICACIES +INEFFICACIOUS +INEFFICACIOUSLY +INEFFICACY +INEFFICIENCIES +INEFFICIENCY +INEFFICIENT +INEFFICIENTLY +INEFFICIENTS +INEGALITARIAN +INELASTIC +INELASTICITIES +INELASTICITY +INELEGANCE +INELEGANCES +INELEGANT +INELEGANTLY +INELIGIBILITIES +INELIGIBILITY +INELIGIBLE +INELIGIBLES +INELOQUENT +INELOQUENTLY +INELUCTABILITY +INELUCTABLE +INELUCTABLY +INELUDIBLE +INENARRABLE +INEPT +INEPTITUDE +INEPTITUDES +INEPTLY +INEPTNESS +INEPTNESSES +INEQUALITIES +INEQUALITY +INEQUITABLE +INEQUITABLY +INEQUITIES +INEQUITY +INEQUIVALVE +INEQUIVALVED +INERADICABILITY +INERADICABLE +INERADICABLY +INERRABLE +INERRANCIES +INERRANCY +INERRANT +INERT +INERTIA +INERTIAE +INERTIAL +INERTIALLY +INERTIAS +INERTLY +INERTNESS +INERTNESSES +INERTS +INESCAPABLE +INESCAPABLY +INESSENTIAL +INESSENTIALS +INESTIMABLE +INESTIMABLY +INEVITABILITIES +INEVITABILITY +INEVITABLE +INEVITABLENESS +INEVITABLY +INEXACT +INEXACTITUDE +INEXACTITUDES +INEXACTLY +INEXACTNESS +INEXACTNESSES +INEXCUSABLE +INEXCUSABLENESS +INEXCUSABLY +INEXHAUSTIBLE +INEXHAUSTIBLY +INEXISTENCE +INEXISTENCES +INEXISTENT +INEXORABILITIES +INEXORABILITY +INEXORABLE +INEXORABLENESS +INEXORABLY +INEXPEDIENCE +INEXPEDIENCES +INEXPEDIENCIES +INEXPEDIENCY +INEXPEDIENT +INEXPEDIENTLY +INEXPENSIVE +INEXPENSIVELY +INEXPENSIVENESS +INEXPERIENCE +INEXPERIENCED +INEXPERIENCES +INEXPERT +INEXPERTLY +INEXPERTNESS +INEXPERTNESSES +INEXPERTS +INEXPIABLE +INEXPIABLY +INEXPLAINABLE +INEXPLICABILITY +INEXPLICABLE +INEXPLICABLY +INEXPLICIT +INEXPRESSIBLE +INEXPRESSIBLY +INEXPRESSIVE +INEXPRESSIVELY +INEXPUGNABLE +INEXPUGNABLY +INEXPUNGIBLE +INEXTRICABILITY +INEXTRICABLE +INEXTRICABLY +INFALL +INFALLIBILITIES +INFALLIBILITY +INFALLIBLE +INFALLIBLY +INFALLING +INFALLS +INFAMIES +INFAMOUS +INFAMOUSLY +INFAMY +INFANCIES +INFANCY +INFANT +INFANTA +INFANTAS +INFANTE +INFANTES +INFANTICIDAL +INFANTICIDE +INFANTICIDES +INFANTILE +INFANTILISM +INFANTILISMS +INFANTILITIES +INFANTILITY +INFANTILIZATION +INFANTILIZE +INFANTILIZED +INFANTILIZES +INFANTILIZING +INFANTINE +INFANTRIES +INFANTRY +INFANTRYMAN +INFANTRYMEN +INFANTS +INFARCT +INFARCTED +INFARCTION +INFARCTIONS +INFARCTS +INFARE +INFARES +INFATUATE +INFATUATED +INFATUATES +INFATUATING +INFATUATION +INFATUATIONS +INFAUNA +INFAUNAE +INFAUNAL +INFAUNAS +INFEASIBILITIES +INFEASIBILITY +INFEASIBLE +INFECT +INFECTANT +INFECTED +INFECTER +INFECTERS +INFECTING +INFECTION +INFECTIONS +INFECTIOUS +INFECTIOUSLY +INFECTIOUSNESS +INFECTIVE +INFECTIVITIES +INFECTIVITY +INFECTOR +INFECTORS +INFECTS +INFECUND +INFELICITIES +INFELICITOUS +INFELICITOUSLY +INFELICITY +INFEOFF +INFEOFFED +INFEOFFING +INFEOFFS +INFER +INFERABLE +INFERABLY +INFERENCE +INFERENCES +INFERENTIAL +INFERENTIALLY +INFERIOR +INFERIORITIES +INFERIORITY +INFERIORLY +INFERIORS +INFERNAL +INFERNALLY +INFERNO +INFERNOS +INFERRED +INFERRER +INFERRERS +INFERRIBLE +INFERRING +INFERS +INFERTILE +INFERTILITIES +INFERTILITY +INFEST +INFESTANT +INFESTANTS +INFESTATION +INFESTATIONS +INFESTED +INFESTER +INFESTERS +INFESTING +INFESTS +INFIDEL +INFIDELIC +INFIDELITIES +INFIDELITY +INFIDELS +INFIELD +INFIELDER +INFIELDERS +INFIELDS +INFIGHT +INFIGHTER +INFIGHTERS +INFIGHTING +INFIGHTINGS +INFIGHTS +INFILL +INFILTRATE +INFILTRATED +INFILTRATES +INFILTRATING +INFILTRATION +INFILTRATIONS +INFILTRATIVE +INFILTRATOR +INFILTRATORS +INFINITE +INFINITELY +INFINITENESS +INFINITENESSES +INFINITES +INFINITESIMAL +INFINITESIMALLY +INFINITESIMALS +INFINITIES +INFINITIVAL +INFINITIVE +INFINITIVELY +INFINITIVES +INFINITUDE +INFINITUDES +INFINITY +INFIRM +INFIRMARIES +INFIRMARY +INFIRMED +INFIRMING +INFIRMITIES +INFIRMITY +INFIRMLY +INFIRMS +INFIX +INFIXATION +INFIXATIONS +INFIXED +INFIXES +INFIXING +INFIXION +INFIXIONS +INFLAME +INFLAMED +INFLAMER +INFLAMERS +INFLAMES +INFLAMING +INFLAMMABILITY +INFLAMMABLE +INFLAMMABLENESS +INFLAMMABLES +INFLAMMABLY +INFLAMMATION +INFLAMMATIONS +INFLAMMATORILY +INFLAMMATORY +INFLATABLE +INFLATABLES +INFLATE +INFLATED +INFLATER +INFLATERS +INFLATES +INFLATING +INFLATION +INFLATIONARY +INFLATIONISM +INFLATIONISMS +INFLATIONIST +INFLATIONISTS +INFLATIONS +INFLATOR +INFLATORS +INFLECT +INFLECTABLE +INFLECTED +INFLECTING +INFLECTION +INFLECTIONAL +INFLECTIONALLY +INFLECTIONS +INFLECTIVE +INFLECTOR +INFLECTORS +INFLECTS +INFLEXED +INFLEXIBILITIES +INFLEXIBILITY +INFLEXIBLE +INFLEXIBLENESS +INFLEXIBLY +INFLEXION +INFLEXIONS +INFLICT +INFLICTED +INFLICTER +INFLICTERS +INFLICTING +INFLICTION +INFLICTIONS +INFLICTIVE +INFLICTOR +INFLICTORS +INFLICTS +INFLIGHT +INFLORESCENCE +INFLORESCENCES +INFLOW +INFLOWS +INFLUENCE +INFLUENCEABLE +INFLUENCED +INFLUENCES +INFLUENCING +INFLUENT +INFLUENTIAL +INFLUENTIALLY +INFLUENTIALS +INFLUENTS +INFLUENZA +INFLUENZAL +INFLUENZAS +INFLUX +INFLUXES +INFO +INFOBAHN +INFOBAHNS +INFOLD +INFOLDED +INFOLDER +INFOLDERS +INFOLDING +INFOLDS +INFOMERCIAL +INFOMERCIALS +INFORM +INFORMAL +INFORMALITIES +INFORMALITY +INFORMALLY +INFORMANT +INFORMANTS +INFORMATICS +INFORMATION +INFORMATIONAL +INFORMATIONALLY +INFORMATIONS +INFORMATIVE +INFORMATIVELY +INFORMATIVENESS +INFORMATORILY +INFORMATORY +INFORMED +INFORMEDLY +INFORMER +INFORMERS +INFORMING +INFORMS +INFOS +INFOTAINMENT +INFOTAINMENTS +INFOUGHT +INFRA +INFRACT +INFRACTED +INFRACTING +INFRACTION +INFRACTIONS +INFRACTOR +INFRACTORS +INFRACTS +INFRAHUMAN +INFRAHUMANS +INFRANGIBILITY +INFRANGIBLE +INFRANGIBLY +INFRARED +INFRAREDS +INFRASONIC +INFRASPECIFIC +INFRASTRUCTURE +INFRASTRUCTURES +INFREQUENCE +INFREQUENCES +INFREQUENCIES +INFREQUENCY +INFREQUENT +INFREQUENTLY +INFRINGE +INFRINGED +INFRINGEMENT +INFRINGEMENTS +INFRINGER +INFRINGERS +INFRINGES +INFRINGING +INFRUGAL +INFUNDIBULA +INFUNDIBULAR +INFUNDIBULIFORM +INFUNDIBULUM +INFURIATE +INFURIATED +INFURIATES +INFURIATING +INFURIATINGLY +INFURIATION +INFURIATIONS +INFUSCATE +INFUSE +INFUSED +INFUSER +INFUSERS +INFUSES +INFUSIBILITIES +INFUSIBILITY +INFUSIBLE +INFUSIBLENESS +INFUSIBLENESSES +INFUSING +INFUSION +INFUSIONS +INFUSIVE +INFUSORIAN +INFUSORIANS +INGATE +INGATES +INGATHER +INGATHERED +INGATHERING +INGATHERINGS +INGATHERS +INGENIOUS +INGENIOUSLY +INGENIOUSNESS +INGENIOUSNESSES +INGENUE +INGENUES +INGENUITIES +INGENUITY +INGENUOUS +INGENUOUSLY +INGENUOUSNESS +INGENUOUSNESSES +INGEST +INGESTA +INGESTED +INGESTIBLE +INGESTING +INGESTION +INGESTIONS +INGESTIVE +INGESTS +INGLE +INGLENOOK +INGLENOOKS +INGLES +INGLORIOUS +INGLORIOUSLY +INGLORIOUSNESS +INGOING +INGOT +INGOTED +INGOTING +INGOTS +INGRAFT +INGRAFTED +INGRAFTING +INGRAFTS +INGRAIN +INGRAINED +INGRAINEDLY +INGRAINING +INGRAINS +INGRATE +INGRATES +INGRATIATE +INGRATIATED +INGRATIATES +INGRATIATING +INGRATIATINGLY +INGRATIATION +INGRATIATIONS +INGRATIATORY +INGRATITUDE +INGRATITUDES +INGREDIENT +INGREDIENTS +INGRESS +INGRESSES +INGRESSION +INGRESSIONS +INGRESSIVE +INGRESSIVENESS +INGRESSIVES +INGROUND +INGROUP +INGROUPS +INGROWING +INGROWN +INGROWNNESS +INGROWNNESSES +INGROWTH +INGROWTHS +INGUINAL +INGULF +INGULFED +INGULFING +INGULFS +INGURGITATE +INGURGITATED +INGURGITATES +INGURGITATING +INGURGITATION +INGURGITATIONS +INHABIT +INHABITABLE +INHABITANCIES +INHABITANCY +INHABITANT +INHABITANTS +INHABITATION +INHABITATIONS +INHABITED +INHABITER +INHABITERS +INHABITING +INHABITS +INHALANT +INHALANTS +INHALATION +INHALATIONAL +INHALATIONS +INHALATOR +INHALATORS +INHALE +INHALED +INHALER +INHALERS +INHALES +INHALING +INHARMONIC +INHARMONIES +INHARMONIOUS +INHARMONIOUSLY +INHARMONY +INHAUL +INHAULER +INHAULERS +INHAULS +INHERE +INHERED +INHERENCE +INHERENCES +INHERENCIES +INHERENCY +INHERENT +INHERENTLY +INHERES +INHERING +INHERIT +INHERITABILITY +INHERITABLE +INHERITABLENESS +INHERITANCE +INHERITANCES +INHERITED +INHERITING +INHERITOR +INHERITORS +INHERITRESS +INHERITRESSES +INHERITRICES +INHERITRIX +INHERITRIXES +INHERITS +INHESION +INHESIONS +INHIBIN +INHIBINS +INHIBIT +INHIBITED +INHIBITER +INHIBITERS +INHIBITING +INHIBITION +INHIBITIONS +INHIBITIVE +INHIBITOR +INHIBITORS +INHIBITORY +INHIBITS +INHOLDER +INHOLDERS +INHOLDING +INHOLDINGS +INHOMOGENEITIES +INHOMOGENEITY +INHOMOGENEOUS +INHOSPITABLE +INHOSPITABLY +INHOSPITALITIES +INHOSPITALITY +INHUMAN +INHUMANE +INHUMANELY +INHUMANITIES +INHUMANITY +INHUMANLY +INHUMANNESS +INHUMANNESSES +INHUMATION +INHUMATIONS +INHUME +INHUMED +INHUMER +INHUMERS +INHUMES +INHUMING +INIA +INIMICAL +INIMICALLY +INIMITABLE +INIMITABLENESS +INIMITABLY +INION +INIONS +INIQUITIES +INIQUITOUS +INIQUITOUSLY +INIQUITOUSNESS +INIQUITY +INITIAL +INITIALED +INITIALER +INITIALERS +INITIALING +INITIALISM +INITIALISMS +INITIALIZATION +INITIALIZATIONS +INITIALIZE +INITIALIZED +INITIALIZES +INITIALIZING +INITIALLED +INITIALLING +INITIALLY +INITIALNESS +INITIALNESSES +INITIALS +INITIATE +INITIATED +INITIATES +INITIATING +INITIATION +INITIATIONS +INITIATIVE +INITIATIVES +INITIATOR +INITIATORS +INITIATORY +INJECT +INJECTABLE +INJECTABLES +INJECTANT +INJECTANTS +INJECTED +INJECTING +INJECTION +INJECTIONS +INJECTIVE +INJECTOR +INJECTORS +INJECTS +INJUDICIOUS +INJUDICIOUSLY +INJUDICIOUSNESS +INJUNCTION +INJUNCTIONS +INJUNCTIVE +INJURABLE +INJURE +INJURED +INJURER +INJURERS +INJURES +INJURIES +INJURING +INJURIOUS +INJURIOUSLY +INJURIOUSNESS +INJURIOUSNESSES +INJURY +INJUSTICE +INJUSTICES +INK +INKBERRIES +INKBERRY +INKBLOT +INKBLOTS +INKED +INKER +INKERS +INKHORN +INKHORNS +INKIER +INKIEST +INKINESS +INKINESSES +INKING +INKJET +INKLE +INKLES +INKLESS +INKLIKE +INKLING +INKLINGS +INKPOT +INKPOTS +INKS +INKSTAND +INKSTANDS +INKSTONE +INKSTONES +INKWELL +INKWELLS +INKWOOD +INKWOODS +INKY +INLACE +INLACED +INLACES +INLACING +INLAID +INLAND +INLANDER +INLANDERS +INLANDS +INLAY +INLAYER +INLAYERS +INLAYING +INLAYS +INLET +INLETS +INLETTING +INLIER +INLIERS +INLY +INLYING +INMATE +INMATES +INMESH +INMESHED +INMESHES +INMESHING +INMOST +INN +INNAGE +INNAGES +INNARDS +INNATE +INNATELY +INNATENESS +INNATENESSES +INNED +INNER +INNERLY +INNERMOST +INNERMOSTS +INNERNESS +INNERNESSES +INNERS +INNERSOLE +INNERSOLES +INNERSPRING +INNERVATE +INNERVATED +INNERVATES +INNERVATING +INNERVATION +INNERVATIONS +INNERVE +INNERVED +INNERVES +INNERVING +INNING +INNINGS +INNKEEPER +INNKEEPERS +INNLESS +INNOCENCE +INNOCENCES +INNOCENCIES +INNOCENCY +INNOCENT +INNOCENTER +INNOCENTEST +INNOCENTLY +INNOCENTS +INNOCUOUS +INNOCUOUSLY +INNOCUOUSNESS +INNOCUOUSNESSES +INNOMINATE +INNOVATE +INNOVATED +INNOVATES +INNOVATING +INNOVATION +INNOVATIONAL +INNOVATIONS +INNOVATIVE +INNOVATIVELY +INNOVATIVENESS +INNOVATOR +INNOVATORS +INNOVATORY +INNOXIOUS +INNS +INNUENDO +INNUENDOED +INNUENDOES +INNUENDOING +INNUENDOS +INNUMERABLE +INNUMERABLY +INNUMERACIES +INNUMERACY +INNUMERATE +INNUMERATES +INNUMEROUS +INOBSERVANCE +INOBSERVANCES +INOBSERVANT +INOCULA +INOCULANT +INOCULANTS +INOCULATE +INOCULATED +INOCULATES +INOCULATING +INOCULATION +INOCULATIONS +INOCULATIVE +INOCULATOR +INOCULATORS +INOCULUM +INOCULUMS +INODOROUS +INOFFENSIVE +INOFFENSIVELY +INOFFENSIVENESS +INOPERABLE +INOPERATIVE +INOPERATIVENESS +INOPERCULATE +INOPERCULATES +INOPPORTUNE +INOPPORTUNELY +INOPPORTUNENESS +INORDINATE +INORDINATELY +INORDINATENESS +INORGANIC +INORGANICALLY +INOSCULATE +INOSCULATED +INOSCULATES +INOSCULATING +INOSCULATION +INOSCULATIONS +INOSINE +INOSINES +INOSITE +INOSITES +INOSITOL +INOSITOLS +INOTROPIC +INPATIENT +INPATIENTS +INPHASE +INPOUR +INPOURED +INPOURING +INPOURINGS +INPOURS +INPUT +INPUTS +INPUTTED +INPUTTER +INPUTTERS +INPUTTING +INQUEST +INQUESTS +INQUIET +INQUIETED +INQUIETING +INQUIETS +INQUIETUDE +INQUIETUDES +INQUILINE +INQUILINES +INQUIRE +INQUIRED +INQUIRER +INQUIRERS +INQUIRES +INQUIRIES +INQUIRING +INQUIRINGLY +INQUIRY +INQUISITION +INQUISITIONAL +INQUISITIONS +INQUISITIVE +INQUISITIVELY +INQUISITIVENESS +INQUISITOR +INQUISITORIAL +INQUISITORIALLY +INQUISITORS +INRO +INROAD +INROADS +INRUN +INRUNS +INRUSH +INRUSHES +INRUSHING +INRUSHINGS +INS +INSALUBRIOUS +INSALUBRITIES +INSALUBRITY +INSANE +INSANELY +INSANENESS +INSANENESSES +INSANER +INSANEST +INSANITARY +INSANITATION +INSANITATIONS +INSANITIES +INSANITY +INSATIABILITIES +INSATIABILITY +INSATIABLE +INSATIABLENESS +INSATIABLY +INSATIATE +INSATIATELY +INSATIATENESS +INSATIATENESSES +INSCAPE +INSCAPES +INSCRIBE +INSCRIBED +INSCRIBER +INSCRIBERS +INSCRIBES +INSCRIBING +INSCRIPTION +INSCRIPTIONAL +INSCRIPTIONS +INSCRIPTIVE +INSCRIPTIVELY +INSCROLL +INSCROLLED +INSCROLLING +INSCROLLS +INSCRUTABILITY +INSCRUTABLE +INSCRUTABLENESS +INSCRUTABLY +INSCULP +INSCULPED +INSCULPING +INSCULPS +INSEAM +INSEAMS +INSECT +INSECTAN +INSECTARIES +INSECTARY +INSECTICIDAL +INSECTICIDALLY +INSECTICIDE +INSECTICIDES +INSECTILE +INSECTIVORE +INSECTIVORES +INSECTIVOROUS +INSECTS +INSECURE +INSECURELY +INSECURENESS +INSECURENESSES +INSECURITIES +INSECURITY +INSELBERG +INSELBERGE +INSELBERGS +INSEMINATE +INSEMINATED +INSEMINATES +INSEMINATING +INSEMINATION +INSEMINATIONS +INSEMINATOR +INSEMINATORS +INSENSATE +INSENSATELY +INSENSIBILITIES +INSENSIBILITY +INSENSIBLE +INSENSIBLENESS +INSENSIBLY +INSENSITIVE +INSENSITIVELY +INSENSITIVENESS +INSENSITIVITIES +INSENSITIVITY +INSENTIENCE +INSENTIENCES +INSENTIENT +INSEPARABILITY +INSEPARABLE +INSEPARABLENESS +INSEPARABLES +INSEPARABLY +INSERT +INSERTED +INSERTER +INSERTERS +INSERTING +INSERTION +INSERTIONAL +INSERTIONS +INSERTS +INSET +INSETS +INSETTED +INSETTER +INSETTERS +INSETTING +INSHEATH +INSHEATHE +INSHEATHED +INSHEATHES +INSHEATHING +INSHEATHS +INSHORE +INSHRINE +INSHRINED +INSHRINES +INSHRINING +INSIDE +INSIDER +INSIDERS +INSIDES +INSIDIOUS +INSIDIOUSLY +INSIDIOUSNESS +INSIDIOUSNESSES +INSIGHT +INSIGHTFUL +INSIGHTFULLY +INSIGHTS +INSIGNE +INSIGNIA +INSIGNIAS +INSIGNIFICANCE +INSIGNIFICANCES +INSIGNIFICANCY +INSIGNIFICANT +INSIGNIFICANTLY +INSINCERE +INSINCERELY +INSINCERITIES +INSINCERITY +INSINUATE +INSINUATED +INSINUATES +INSINUATING +INSINUATINGLY +INSINUATION +INSINUATIONS +INSINUATIVE +INSINUATOR +INSINUATORS +INSIPID +INSIPIDITIES +INSIPIDITY +INSIPIDLY +INSIST +INSISTED +INSISTENCE +INSISTENCES +INSISTENCIES +INSISTENCY +INSISTENT +INSISTENTLY +INSISTER +INSISTERS +INSISTING +INSISTS +INSNARE +INSNARED +INSNARER +INSNARERS +INSNARES +INSNARING +INSOBRIETIES +INSOBRIETY +INSOCIABILITIES +INSOCIABILITY +INSOCIABLE +INSOCIABLY +INSOFAR +INSOLATE +INSOLATED +INSOLATES +INSOLATING +INSOLATION +INSOLATIONS +INSOLE +INSOLENCE +INSOLENCES +INSOLENT +INSOLENTLY +INSOLENTS +INSOLES +INSOLUBILITIES +INSOLUBILITY +INSOLUBILIZE +INSOLUBILIZED +INSOLUBILIZES +INSOLUBILIZING +INSOLUBLE +INSOLUBLENESS +INSOLUBLENESSES +INSOLUBLES +INSOLUBLY +INSOLVABLE +INSOLVABLY +INSOLVENCIES +INSOLVENCY +INSOLVENT +INSOLVENTS +INSOMNIA +INSOMNIAC +INSOMNIACS +INSOMNIAS +INSOMUCH +INSOUCIANCE +INSOUCIANCES +INSOUCIANT +INSOUCIANTLY +INSOUL +INSOULED +INSOULING +INSOULS +INSPAN +INSPANNED +INSPANNING +INSPANS +INSPECT +INSPECTED +INSPECTING +INSPECTION +INSPECTIONS +INSPECTIVE +INSPECTOR +INSPECTORATE +INSPECTORATES +INSPECTORS +INSPECTORSHIP +INSPECTORSHIPS +INSPECTS +INSPHERE +INSPHERED +INSPHERES +INSPHERING +INSPIRATION +INSPIRATIONAL +INSPIRATIONALLY +INSPIRATIONS +INSPIRATOR +INSPIRATORS +INSPIRATORY +INSPIRE +INSPIRED +INSPIRER +INSPIRERS +INSPIRES +INSPIRING +INSPIRIT +INSPIRITED +INSPIRITING +INSPIRITINGLY +INSPIRITS +INSPISSATE +INSPISSATED +INSPISSATES +INSPISSATING +INSPISSATION +INSPISSATIONS +INSPISSATOR +INSPISSATORS +INSTABILITIES +INSTABILITY +INSTABLE +INSTAL +INSTALL +INSTALLATION +INSTALLATIONS +INSTALLED +INSTALLER +INSTALLERS +INSTALLING +INSTALLMENT +INSTALLMENTS +INSTALLS +INSTALMENT +INSTALMENTS +INSTALS +INSTANCE +INSTANCED +INSTANCES +INSTANCIES +INSTANCING +INSTANCY +INSTANT +INSTANTANEITIES +INSTANTANEITY +INSTANTANEOUS +INSTANTANEOUSLY +INSTANTER +INSTANTIATE +INSTANTIATED +INSTANTIATES +INSTANTIATING +INSTANTIATION +INSTANTIATIONS +INSTANTLY +INSTANTNESS +INSTANTNESSES +INSTANTS +INSTAR +INSTARRED +INSTARRING +INSTARS +INSTATE +INSTATED +INSTATES +INSTATING +INSTAURATION +INSTAURATIONS +INSTEAD +INSTEP +INSTEPS +INSTIGATE +INSTIGATED +INSTIGATES +INSTIGATING +INSTIGATION +INSTIGATIONS +INSTIGATIVE +INSTIGATOR +INSTIGATORS +INSTIL +INSTILL +INSTILLATION +INSTILLATIONS +INSTILLED +INSTILLER +INSTILLERS +INSTILLING +INSTILLMENT +INSTILLMENTS +INSTILLS +INSTILS +INSTINCT +INSTINCTIVE +INSTINCTIVELY +INSTINCTS +INSTINCTUAL +INSTINCTUALLY +INSTITUTE +INSTITUTED +INSTITUTER +INSTITUTERS +INSTITUTES +INSTITUTING +INSTITUTION +INSTITUTIONAL +INSTITUTIONALLY +INSTITUTIONS +INSTITUTOR +INSTITUTORS +INSTROKE +INSTROKES +INSTRUCT +INSTRUCTED +INSTRUCTING +INSTRUCTION +INSTRUCTIONAL +INSTRUCTIONS +INSTRUCTIVE +INSTRUCTIVELY +INSTRUCTIVENESS +INSTRUCTOR +INSTRUCTORS +INSTRUCTORSHIP +INSTRUCTORSHIPS +INSTRUCTRESS +INSTRUCTRESSES +INSTRUCTS +INSTRUMENT +INSTRUMENTAL +INSTRUMENTALISM +INSTRUMENTALIST +INSTRUMENTALITY +INSTRUMENTALLY +INSTRUMENTALS +INSTRUMENTATION +INSTRUMENTED +INSTRUMENTING +INSTRUMENTS +INSUBORDINATE +INSUBORDINATELY +INSUBORDINATES +INSUBORDINATION +INSUBSTANTIAL +INSUFFERABLE +INSUFFERABLY +INSUFFICIENCIES +INSUFFICIENCY +INSUFFICIENT +INSUFFICIENTLY +INSUFFLATE +INSUFFLATED +INSUFFLATES +INSUFFLATING +INSUFFLATION +INSUFFLATIONS +INSUFFLATOR +INSUFFLATORS +INSULANT +INSULANTS +INSULAR +INSULARISM +INSULARISMS +INSULARITIES +INSULARITY +INSULARLY +INSULARS +INSULATE +INSULATED +INSULATES +INSULATING +INSULATION +INSULATIONS +INSULATOR +INSULATORS +INSULIN +INSULINS +INSULT +INSULTED +INSULTER +INSULTERS +INSULTING +INSULTINGLY +INSULTS +INSUPERABLE +INSUPERABLY +INSUPPORTABLE +INSUPPORTABLY +INSUPPRESSIBLE +INSURABILITIES +INSURABILITY +INSURABLE +INSURANCE +INSURANCES +INSURANT +INSURANTS +INSURE +INSURED +INSUREDS +INSURER +INSURERS +INSURES +INSURGENCE +INSURGENCES +INSURGENCIES +INSURGENCY +INSURGENT +INSURGENTLY +INSURGENTS +INSURING +INSURMOUNTABLE +INSURMOUNTABLY +INSURRECTION +INSURRECTIONAL +INSURRECTIONARY +INSURRECTIONIST +INSURRECTIONS +INSUSCEPTIBLE +INSUSCEPTIBLY +INSWATHE +INSWATHED +INSWATHES +INSWATHING +INSWEPT +INTACT +INTACTLY +INTACTNESS +INTACTNESSES +INTAGLI +INTAGLIO +INTAGLIOED +INTAGLIOING +INTAGLIOS +INTAKE +INTAKES +INTANGIBILITIES +INTANGIBILITY +INTANGIBLE +INTANGIBLENESS +INTANGIBLES +INTANGIBLY +INTARSIA +INTARSIAS +INTEGER +INTEGERS +INTEGRABILITIES +INTEGRABILITY +INTEGRABLE +INTEGRAL +INTEGRALITIES +INTEGRALITY +INTEGRALLY +INTEGRALS +INTEGRAND +INTEGRANDS +INTEGRANT +INTEGRANTS +INTEGRATE +INTEGRATED +INTEGRATES +INTEGRATING +INTEGRATION +INTEGRATIONIST +INTEGRATIONISTS +INTEGRATIONS +INTEGRATIVE +INTEGRATOR +INTEGRATORS +INTEGRITIES +INTEGRITY +INTEGUMENT +INTEGUMENTARY +INTEGUMENTS +INTELLECT +INTELLECTION +INTELLECTIONS +INTELLECTIVE +INTELLECTIVELY +INTELLECTS +INTELLECTUAL +INTELLECTUALISM +INTELLECTUALIST +INTELLECTUALITY +INTELLECTUALIZE +INTELLECTUALLY +INTELLECTUALS +INTELLIGENCE +INTELLIGENCER +INTELLIGENCERS +INTELLIGENCES +INTELLIGENT +INTELLIGENTIAL +INTELLIGENTLY +INTELLIGENTSIA +INTELLIGENTSIAS +INTELLIGIBILITY +INTELLIGIBLE +INTELLIGIBLY +INTEMPERANCE +INTEMPERANCES +INTEMPERATE +INTEMPERATELY +INTEMPERATENESS +INTEND +INTENDANCE +INTENDANCES +INTENDANT +INTENDANTS +INTENDED +INTENDEDLY +INTENDEDS +INTENDER +INTENDERS +INTENDING +INTENDMENT +INTENDMENTS +INTENDS +INTENERATE +INTENERATED +INTENERATES +INTENERATING +INTENERATION +INTENERATIONS +INTENSE +INTENSELY +INTENSENESS +INTENSENESSES +INTENSER +INTENSEST +INTENSIFICATION +INTENSIFIED +INTENSIFIER +INTENSIFIERS +INTENSIFIES +INTENSIFY +INTENSIFYING +INTENSION +INTENSIONAL +INTENSIONALITY +INTENSIONALLY +INTENSIONS +INTENSITIES +INTENSITY +INTENSIVE +INTENSIVELY +INTENSIVENESS +INTENSIVENESSES +INTENSIVES +INTENT +INTENTION +INTENTIONAL +INTENTIONALITY +INTENTIONALLY +INTENTIONS +INTENTLY +INTENTNESS +INTENTNESSES +INTENTS +INTER +INTERABANG +INTERABANGS +INTERACT +INTERACTANT +INTERACTANTS +INTERACTED +INTERACTING +INTERACTION +INTERACTIONAL +INTERACTIONS +INTERACTIVE +INTERACTIVELY +INTERACTS +INTERAGE +INTERAGENCY +INTERALLELIC +INTERALLIED +INTERANIMATION +INTERANIMATIONS +INTERANNUAL +INTERARCH +INTERARCHED +INTERARCHES +INTERARCHING +INTERATOMIC +INTERBANK +INTERBASIN +INTERBED +INTERBEDDED +INTERBEDDING +INTERBEDS +INTERBEHAVIOR +INTERBEHAVIORAL +INTERBEHAVIORS +INTERBOROUGH +INTERBRANCH +INTERBRED +INTERBREED +INTERBREEDING +INTERBREEDS +INTERCALARY +INTERCALATE +INTERCALATED +INTERCALATES +INTERCALATING +INTERCALATION +INTERCALATIONS +INTERCAMPUS +INTERCASTE +INTERCEDE +INTERCEDED +INTERCEDER +INTERCEDERS +INTERCEDES +INTERCEDING +INTERCELL +INTERCELLULAR +INTERCENSAL +INTERCEPT +INTERCEPTED +INTERCEPTER +INTERCEPTERS +INTERCEPTING +INTERCEPTION +INTERCEPTIONS +INTERCEPTOR +INTERCEPTORS +INTERCEPTS +INTERCESSION +INTERCESSIONAL +INTERCESSIONS +INTERCESSOR +INTERCESSORS +INTERCESSORY +INTERCHAIN +INTERCHANGE +INTERCHANGEABLE +INTERCHANGEABLY +INTERCHANGED +INTERCHANGER +INTERCHANGERS +INTERCHANGES +INTERCHANGING +INTERCHANNEL +INTERCHURCH +INTERCITY +INTERCLAN +INTERCLASS +INTERCLUB +INTERCLUSTER +INTERCOASTAL +INTERCOLLEGIATE +INTERCOLONIAL +INTERCOM +INTERCOMMUNAL +INTERCOMMUNION +INTERCOMMUNIONS +INTERCOMMUNITY +INTERCOMPANY +INTERCOMPARE +INTERCOMPARED +INTERCOMPARES +INTERCOMPARING +INTERCOMPARISON +INTERCOMS +INTERCONNECT +INTERCONNECTED +INTERCONNECTING +INTERCONNECTION +INTERCONNECTS +INTERCONVERSION +INTERCONVERT +INTERCONVERTED +INTERCONVERTING +INTERCONVERTS +INTERCOOLER +INTERCOOLERS +INTERCORPORATE +INTERCORRELATE +INTERCORRELATED +INTERCORRELATES +INTERCORTICAL +INTERCOSTAL +INTERCOSTALS +INTERCOUNTRY +INTERCOUNTY +INTERCOUPLE +INTERCOURSE +INTERCOURSES +INTERCRATER +INTERCROP +INTERCROPPED +INTERCROPPING +INTERCROPS +INTERCROSS +INTERCROSSED +INTERCROSSES +INTERCROSSING +INTERCULTURAL +INTERCULTURALLY +INTERCULTURE +INTERCURRENT +INTERCUT +INTERCUTS +INTERCUTTING +INTERDEALER +INTERDENTAL +INTERDENTALLY +INTERDEPEND +INTERDEPENDED +INTERDEPENDENCE +INTERDEPENDENCY +INTERDEPENDENT +INTERDEPENDING +INTERDEPENDS +INTERDIALECTAL +INTERDICT +INTERDICTED +INTERDICTING +INTERDICTION +INTERDICTIONS +INTERDICTIVE +INTERDICTOR +INTERDICTORS +INTERDICTORY +INTERDICTS +INTERDIFFUSE +INTERDIFFUSED +INTERDIFFUSES +INTERDIFFUSING +INTERDIFFUSION +INTERDIFFUSIONS +INTERDIGITATE +INTERDIGITATED +INTERDIGITATES +INTERDIGITATING +INTERDIGITATION +INTERDISTRICT +INTERDIVISIONAL +INTERDOMINION +INTERELECTRODE +INTERELECTRON +INTERELECTRONIC +INTEREPIDEMIC +INTEREST +INTERESTED +INTERESTEDLY +INTERESTING +INTERESTINGLY +INTERESTINGNESS +INTERESTS +INTERETHNIC +INTERFACE +INTERFACED +INTERFACES +INTERFACIAL +INTERFACING +INTERFACINGS +INTERFACULTY +INTERFAITH +INTERFAMILIAL +INTERFAMILY +INTERFERE +INTERFERED +INTERFERENCE +INTERFERENCES +INTERFERENTIAL +INTERFERER +INTERFERERS +INTERFERES +INTERFERING +INTERFEROGRAM +INTERFEROGRAMS +INTERFEROMETER +INTERFEROMETERS +INTERFEROMETRIC +INTERFEROMETRY +INTERFERON +INTERFERONS +INTERFERTILE +INTERFERTILITY +INTERFIBER +INTERFILE +INTERFILED +INTERFILES +INTERFILING +INTERFIRM +INTERFLOW +INTERFLOWED +INTERFLOWING +INTERFLOWS +INTERFLUVE +INTERFLUVES +INTERFLUVIAL +INTERFOLD +INTERFOLDED +INTERFOLDING +INTERFOLDS +INTERFRATERNITY +INTERFUSE +INTERFUSED +INTERFUSES +INTERFUSING +INTERFUSION +INTERFUSIONS +INTERGALACTIC +INTERGANG +INTERGENERATION +INTERGENERIC +INTERGLACIAL +INTERGLACIALS +INTERGRADATION +INTERGRADATIONS +INTERGRADE +INTERGRADED +INTERGRADES +INTERGRADING +INTERGRAFT +INTERGRAFTED +INTERGRAFTING +INTERGRAFTS +INTERGRANULAR +INTERGROUP +INTERGROWTH +INTERGROWTHS +INTERIM +INTERIMS +INTERINDIVIDUAL +INTERINDUSTRY +INTERINFLUENCE +INTERINFLUENCES +INTERINVOLVE +INTERINVOLVED +INTERINVOLVES +INTERINVOLVING +INTERIONIC +INTERIOR +INTERIORISE +INTERIORISED +INTERIORISES +INTERIORISING +INTERIORITIES +INTERIORITY +INTERIORIZATION +INTERIORIZE +INTERIORIZED +INTERIORIZES +INTERIORIZING +INTERIORLY +INTERIORS +INTERISLAND +INTERJECT +INTERJECTED +INTERJECTING +INTERJECTION +INTERJECTIONAL +INTERJECTIONS +INTERJECTOR +INTERJECTORS +INTERJECTORY +INTERJECTS +INTERJOIN +INTERJOINED +INTERJOINING +INTERJOINS +INTERKNIT +INTERKNITS +INTERKNITTED +INTERKNITTING +INTERKNOT +INTERKNOTS +INTERKNOTTED +INTERKNOTTING +INTERLACE +INTERLACED +INTERLACEMENT +INTERLACEMENTS +INTERLACES +INTERLACING +INTERLACUSTRINE +INTERLAID +INTERLAMINAR +INTERLAP +INTERLAPPED +INTERLAPPING +INTERLAPS +INTERLARD +INTERLARDED +INTERLARDING +INTERLARDS +INTERLAY +INTERLAYER +INTERLAYERED +INTERLAYERING +INTERLAYERS +INTERLAYING +INTERLAYS +INTERLEAF +INTERLEAVE +INTERLEAVED +INTERLEAVES +INTERLEAVING +INTERLEND +INTERLENDING +INTERLENDS +INTERLENT +INTERLEUKIN +INTERLEUKINS +INTERLIBRARY +INTERLINE +INTERLINEAR +INTERLINEARLY +INTERLINEARS +INTERLINEATION +INTERLINEATIONS +INTERLINED +INTERLINER +INTERLINERS +INTERLINES +INTERLINING +INTERLININGS +INTERLINK +INTERLINKED +INTERLINKING +INTERLINKS +INTERLOAN +INTERLOANS +INTERLOBULAR +INTERLOCAL +INTERLOCK +INTERLOCKED +INTERLOCKING +INTERLOCKS +INTERLOCUTOR +INTERLOCUTORS +INTERLOCUTORY +INTERLOOP +INTERLOOPED +INTERLOOPING +INTERLOOPS +INTERLOPE +INTERLOPED +INTERLOPER +INTERLOPERS +INTERLOPES +INTERLOPING +INTERLUDE +INTERLUDES +INTERLUNAR +INTERLUNARY +INTERMALE +INTERMARGINAL +INTERMARRIAGE +INTERMARRIAGES +INTERMARRIED +INTERMARRIES +INTERMARRY +INTERMARRYING +INTERMAT +INTERMATS +INTERMATTED +INTERMATTING +INTERMEDDLE +INTERMEDDLED +INTERMEDDLER +INTERMEDDLERS +INTERMEDDLES +INTERMEDDLING +INTERMEDIACIES +INTERMEDIACY +INTERMEDIARIES +INTERMEDIARY +INTERMEDIATE +INTERMEDIATED +INTERMEDIATELY +INTERMEDIATES +INTERMEDIATING +INTERMEDIATION +INTERMEDIATIONS +INTERMEDIN +INTERMEDINS +INTERMEMBRANE +INTERMENSTRUAL +INTERMENT +INTERMENTS +INTERMESH +INTERMESHED +INTERMESHES +INTERMESHING +INTERMETALLIC +INTERMETALLICS +INTERMEZZI +INTERMEZZO +INTERMEZZOS +INTERMINABLE +INTERMINABLY +INTERMINGLE +INTERMINGLED +INTERMINGLES +INTERMINGLING +INTERMISSION +INTERMISSIONS +INTERMIT +INTERMITOTIC +INTERMITS +INTERMITTED +INTERMITTENCE +INTERMITTENCES +INTERMITTENCIES +INTERMITTENCY +INTERMITTENT +INTERMITTENTLY +INTERMITTER +INTERMITTERS +INTERMITTING +INTERMIX +INTERMIXED +INTERMIXES +INTERMIXING +INTERMIXTURE +INTERMIXTURES +INTERMODAL +INTERMODULATION +INTERMOLECULAR +INTERMONT +INTERMONTANE +INTERMOUNTAIN +INTERN +INTERNAL +INTERNALISE +INTERNALISED +INTERNALISES +INTERNALISING +INTERNALITIES +INTERNALITY +INTERNALIZATION +INTERNALIZE +INTERNALIZED +INTERNALIZES +INTERNALIZING +INTERNALLY +INTERNALS +INTERNATIONAL +INTERNATIONALLY +INTERNATIONALS +INTERNE +INTERNECINE +INTERNED +INTERNEE +INTERNEES +INTERNES +INTERNEURON +INTERNEURONAL +INTERNEURONS +INTERNING +INTERNIST +INTERNISTS +INTERNMENT +INTERNMENTS +INTERNODAL +INTERNODE +INTERNODES +INTERNS +INTERNSHIP +INTERNSHIPS +INTERNUCLEAR +INTERNUCLEON +INTERNUCLEONIC +INTERNUCLEOTIDE +INTERNUNCIAL +INTERNUNCIO +INTERNUNCIOS +INTEROBSERVER +INTEROCEAN +INTEROCEANIC +INTEROCEPTIVE +INTEROCEPTOR +INTEROCEPTORS +INTEROFFICE +INTEROPERABLE +INTEROPERATIVE +INTERORBITAL +INTERORGAN +INTERPANDEMIC +INTERPARISH +INTERPAROCHIAL +INTERPAROXYSMAL +INTERPARTICLE +INTERPARTY +INTERPELLATE +INTERPELLATED +INTERPELLATES +INTERPELLATING +INTERPELLATION +INTERPELLATIONS +INTERPELLATOR +INTERPELLATORS +INTERPENETRATE +INTERPENETRATED +INTERPENETRATES +INTERPERCEPTUAL +INTERPERMEATE +INTERPERMEATED +INTERPERMEATES +INTERPERMEATING +INTERPERSONAL +INTERPERSONALLY +INTERPHALANGEAL +INTERPHASE +INTERPHASES +INTERPLANETARY +INTERPLANT +INTERPLANTED +INTERPLANTING +INTERPLANTS +INTERPLAY +INTERPLAYED +INTERPLAYING +INTERPLAYS +INTERPLEAD +INTERPLEADED +INTERPLEADER +INTERPLEADERS +INTERPLEADING +INTERPLEADS +INTERPLED +INTERPLUVIAL +INTERPOINT +INTERPOLATE +INTERPOLATED +INTERPOLATES +INTERPOLATING +INTERPOLATION +INTERPOLATIONS +INTERPOLATIVE +INTERPOLATOR +INTERPOLATORS +INTERPOPULATION +INTERPOSE +INTERPOSED +INTERPOSER +INTERPOSERS +INTERPOSES +INTERPOSING +INTERPOSITION +INTERPOSITIONS +INTERPRET +INTERPRETABLE +INTERPRETATION +INTERPRETATIONS +INTERPRETATIVE +INTERPRETED +INTERPRETER +INTERPRETERS +INTERPRETING +INTERPRETIVE +INTERPRETIVELY +INTERPRETS +INTERPROVINCIAL +INTERPROXIMAL +INTERPSYCHIC +INTERPUPILLARY +INTERRACE +INTERRACIAL +INTERRACIALLY +INTERRED +INTERREGES +INTERREGIONAL +INTERREGNA +INTERREGNUM +INTERREGNUMS +INTERRELATE +INTERRELATED +INTERRELATEDLY +INTERRELATES +INTERRELATING +INTERRELATION +INTERRELATIONS +INTERRELIGIOUS +INTERRENAL +INTERREX +INTERRING +INTERROBANG +INTERROBANGS +INTERROGATE +INTERROGATED +INTERROGATEE +INTERROGATEES +INTERROGATES +INTERROGATING +INTERROGATION +INTERROGATIONAL +INTERROGATIONS +INTERROGATIVE +INTERROGATIVELY +INTERROGATIVES +INTERROGATOR +INTERROGATORIES +INTERROGATORS +INTERROGATORY +INTERROGEE +INTERROGEES +INTERROW +INTERRUPT +INTERRUPTED +INTERRUPTER +INTERRUPTERS +INTERRUPTIBLE +INTERRUPTING +INTERRUPTION +INTERRUPTIONS +INTERRUPTIVE +INTERRUPTOR +INTERRUPTORS +INTERRUPTS +INTERS +INTERSCHOLASTIC +INTERSCHOOL +INTERSECT +INTERSECTED +INTERSECTING +INTERSECTION +INTERSECTIONAL +INTERSECTIONS +INTERSECTS +INTERSEGMENT +INTERSEGMENTAL +INTERSENSORY +INTERSERVICE +INTERSESSION +INTERSESSIONS +INTERSEX +INTERSEXES +INTERSEXUAL +INTERSEXUALITY +INTERSEXUALLY +INTERSOCIETAL +INTERSOCIETY +INTERSPACE +INTERSPACED +INTERSPACES +INTERSPACING +INTERSPECIES +INTERSPECIFIC +INTERSPERSE +INTERSPERSED +INTERSPERSES +INTERSPERSING +INTERSPERSION +INTERSPERSIONS +INTERSTADIAL +INTERSTADIALS +INTERSTAGE +INTERSTATE +INTERSTATES +INTERSTATION +INTERSTELLAR +INTERSTERILE +INTERSTERILITY +INTERSTICE +INTERSTICES +INTERSTIMULUS +INTERSTITIAL +INTERSTITIALLY +INTERSTRAIN +INTERSTRAND +INTERSTRATIFIED +INTERSTRATIFIES +INTERSTRATIFY +INTERSUBJECTIVE +INTERSYSTEM +INTERTERM +INTERTERMINAL +INTERTEXTUAL +INTERTEXTUALITY +INTERTEXTUALLY +INTERTIDAL +INTERTIDALLY +INTERTIE +INTERTIES +INTERTILL +INTERTILLAGE +INTERTILLAGES +INTERTILLED +INTERTILLING +INTERTILLS +INTERTRIAL +INTERTRIBAL +INTERTROOP +INTERTROPICAL +INTERTWINE +INTERTWINED +INTERTWINEMENT +INTERTWINEMENTS +INTERTWINES +INTERTWINING +INTERTWIST +INTERTWISTED +INTERTWISTING +INTERTWISTS +INTERUNION +INTERUNIT +INTERUNIVERSITY +INTERURBAN +INTERVAL +INTERVALE +INTERVALES +INTERVALLEY +INTERVALLIC +INTERVALOMETER +INTERVALOMETERS +INTERVALS +INTERVENE +INTERVENED +INTERVENER +INTERVENERS +INTERVENES +INTERVENING +INTERVENOR +INTERVENORS +INTERVENTION +INTERVENTIONISM +INTERVENTIONIST +INTERVENTIONS +INTERVERTEBRAL +INTERVIEW +INTERVIEWED +INTERVIEWEE +INTERVIEWEES +INTERVIEWER +INTERVIEWERS +INTERVIEWING +INTERVIEWS +INTERVILLAGE +INTERVISIBILITY +INTERVISIBLE +INTERVISITATION +INTERVOCALIC +INTERWAR +INTERWEAVE +INTERWEAVED +INTERWEAVES +INTERWEAVING +INTERWORK +INTERWORKED +INTERWORKING +INTERWORKINGS +INTERWORKS +INTERWOVE +INTERWOVEN +INTERZONAL +INTERZONE +INTESTACIES +INTESTACY +INTESTATE +INTESTATES +INTESTINAL +INTESTINALLY +INTESTINE +INTESTINES +INTHRAL +INTHRALL +INTHRALLED +INTHRALLING +INTHRALLS +INTHRALS +INTHRONE +INTHRONED +INTHRONES +INTHRONING +INTI +INTIFADA +INTIFADAH +INTIFADAHS +INTIFADAS +INTIFADEH +INTIFADEHS +INTIMA +INTIMACIES +INTIMACY +INTIMAE +INTIMAL +INTIMAS +INTIMATE +INTIMATED +INTIMATELY +INTIMATENESS +INTIMATENESSES +INTIMATER +INTIMATERS +INTIMATES +INTIMATING +INTIMATION +INTIMATIONS +INTIME +INTIMIDATE +INTIMIDATED +INTIMIDATES +INTIMIDATING +INTIMIDATINGLY +INTIMIDATION +INTIMIDATIONS +INTIMIDATOR +INTIMIDATORS +INTIMIDATORY +INTIMIST +INTIMISTS +INTINCTION +INTINCTIONS +INTINE +INTINES +INTIS +INTITLE +INTITLED +INTITLES +INTITLING +INTITULE +INTITULED +INTITULES +INTITULING +INTO +INTOLERABILITY +INTOLERABLE +INTOLERABLENESS +INTOLERABLY +INTOLERANCE +INTOLERANCES +INTOLERANT +INTOLERANTLY +INTOLERANTNESS +INTOMB +INTOMBED +INTOMBING +INTOMBS +INTONATE +INTONATED +INTONATES +INTONATING +INTONATION +INTONATIONAL +INTONATIONS +INTONE +INTONED +INTONER +INTONERS +INTONES +INTONING +INTORT +INTORTED +INTORTING +INTORTS +INTOWN +INTOXICANT +INTOXICANTS +INTOXICATE +INTOXICATED +INTOXICATEDLY +INTOXICATES +INTOXICATING +INTOXICATION +INTOXICATIONS +INTRACARDIAC +INTRACARDIAL +INTRACARDIALLY +INTRACELLULAR +INTRACELLULARLY +INTRACEREBRAL +INTRACEREBRALLY +INTRACITY +INTRACOMPANY +INTRACRANIAL +INTRACRANIALLY +INTRACTABILITY +INTRACTABLE +INTRACTABLY +INTRACUTANEOUS +INTRADAY +INTRADERMAL +INTRADERMALLY +INTRADOS +INTRADOSES +INTRAGALACTIC +INTRAGENIC +INTRAMOLECULAR +INTRAMURAL +INTRAMURALLY +INTRAMUSCULAR +INTRAMUSCULARLY +INTRANASAL +INTRANASALLY +INTRANET +INTRANETS +INTRANSIGEANCE +INTRANSIGEANCES +INTRANSIGEANT +INTRANSIGEANTLY +INTRANSIGEANTS +INTRANSIGENCE +INTRANSIGENCES +INTRANSIGENT +INTRANSIGENTLY +INTRANSIGENTS +INTRANSITIVE +INTRANSITIVELY +INTRANSITIVITY +INTRANT +INTRANTS +INTRAOCULAR +INTRAOCULARLY +INTRAPERITONEAL +INTRAPERSONAL +INTRAPLATE +INTRAPOPULATION +INTRAPRENEUR +INTRAPRENEURIAL +INTRAPRENEURS +INTRAPSYCHIC +INTRASPECIES +INTRASPECIFIC +INTRASTATE +INTRATHECAL +INTRATHECALLY +INTRATHORACIC +INTRAUTERINE +INTRAVASCULAR +INTRAVASCULARLY +INTRAVENOUS +INTRAVENOUSLY +INTRAVITAL +INTRAVITALLY +INTRAVITAM +INTRAZONAL +INTREAT +INTREATED +INTREATING +INTREATS +INTRENCH +INTRENCHED +INTRENCHES +INTRENCHING +INTREPID +INTREPIDITIES +INTREPIDITY +INTREPIDLY +INTREPIDNESS +INTREPIDNESSES +INTRICACIES +INTRICACY +INTRICATE +INTRICATELY +INTRICATENESS +INTRICATENESSES +INTRIGANT +INTRIGANTS +INTRIGUANT +INTRIGUANTS +INTRIGUE +INTRIGUED +INTRIGUER +INTRIGUERS +INTRIGUES +INTRIGUING +INTRIGUINGLY +INTRINSIC +INTRINSICAL +INTRINSICALLY +INTRO +INTRODUCE +INTRODUCED +INTRODUCER +INTRODUCERS +INTRODUCES +INTRODUCING +INTRODUCTION +INTRODUCTIONS +INTRODUCTORILY +INTRODUCTORY +INTROFIED +INTROFIES +INTROFY +INTROFYING +INTROGRESSANT +INTROGRESSANTS +INTROGRESSION +INTROGRESSIONS +INTROGRESSIVE +INTROIT +INTROITS +INTROJECT +INTROJECTED +INTROJECTING +INTROJECTION +INTROJECTIONS +INTROJECTS +INTROMISSION +INTROMISSIONS +INTROMIT +INTROMITS +INTROMITTED +INTROMITTENT +INTROMITTER +INTROMITTERS +INTROMITTING +INTRON +INTRONS +INTRORSE +INTROS +INTROSPECT +INTROSPECTED +INTROSPECTING +INTROSPECTION +INTROSPECTIONAL +INTROSPECTIONS +INTROSPECTIVE +INTROSPECTIVELY +INTROSPECTS +INTROVERSION +INTROVERSIONS +INTROVERSIVE +INTROVERSIVELY +INTROVERT +INTROVERTED +INTROVERTING +INTROVERTS +INTRUDE +INTRUDED +INTRUDER +INTRUDERS +INTRUDES +INTRUDING +INTRUSION +INTRUSIONS +INTRUSIVE +INTRUSIVELY +INTRUSIVENESS +INTRUSIVENESSES +INTRUSIVES +INTRUST +INTRUSTED +INTRUSTING +INTRUSTS +INTUBATE +INTUBATED +INTUBATES +INTUBATING +INTUBATION +INTUBATIONS +INTUIT +INTUITABLE +INTUITED +INTUITING +INTUITION +INTUITIONAL +INTUITIONISM +INTUITIONISMS +INTUITIONIST +INTUITIONISTS +INTUITIONS +INTUITIVE +INTUITIVELY +INTUITIVENESS +INTUITIVENESSES +INTUITS +INTUMESCE +INTUMESCED +INTUMESCENCE +INTUMESCENCES +INTUMESCENT +INTUMESCES +INTUMESCING +INTURN +INTURNED +INTURNS +INTUSSUSCEPT +INTUSSUSCEPTED +INTUSSUSCEPTING +INTUSSUSCEPTION +INTUSSUSCEPTIVE +INTUSSUSCEPTS +INTWINE +INTWINED +INTWINES +INTWINING +INTWIST +INTWISTED +INTWISTING +INTWISTS +INULASE +INULASES +INULIN +INULINS +INUNCTION +INUNCTIONS +INUNDANT +INUNDATE +INUNDATED +INUNDATES +INUNDATING +INUNDATION +INUNDATIONS +INUNDATOR +INUNDATORS +INUNDATORY +INURBANE +INURE +INURED +INUREMENT +INUREMENTS +INURES +INURING +INURN +INURNED +INURNING +INURNMENT +INURNMENTS +INURNS +INUTILE +INUTILELY +INUTILITIES +INUTILITY +INVADE +INVADED +INVADER +INVADERS +INVADES +INVADING +INVAGINATE +INVAGINATED +INVAGINATES +INVAGINATING +INVAGINATION +INVAGINATIONS +INVALID +INVALIDATE +INVALIDATED +INVALIDATES +INVALIDATING +INVALIDATION +INVALIDATIONS +INVALIDATOR +INVALIDATORS +INVALIDED +INVALIDING +INVALIDISM +INVALIDISMS +INVALIDITIES +INVALIDITY +INVALIDLY +INVALIDS +INVALUABLE +INVALUABLENESS +INVALUABLY +INVAR +INVARIABILITIES +INVARIABILITY +INVARIABLE +INVARIABLES +INVARIABLY +INVARIANCE +INVARIANCES +INVARIANT +INVARIANTS +INVARS +INVASION +INVASIONS +INVASIVE +INVASIVENESS +INVASIVENESSES +INVECTED +INVECTIVE +INVECTIVELY +INVECTIVENESS +INVECTIVENESSES +INVECTIVES +INVEIGH +INVEIGHED +INVEIGHER +INVEIGHERS +INVEIGHING +INVEIGHS +INVEIGLE +INVEIGLED +INVEIGLEMENT +INVEIGLEMENTS +INVEIGLER +INVEIGLERS +INVEIGLES +INVEIGLING +INVENT +INVENTED +INVENTER +INVENTERS +INVENTING +INVENTION +INVENTIONS +INVENTIVE +INVENTIVELY +INVENTIVENESS +INVENTIVENESSES +INVENTOR +INVENTORIAL +INVENTORIALLY +INVENTORIED +INVENTORIES +INVENTORS +INVENTORY +INVENTORYING +INVENTRESS +INVENTRESSES +INVENTS +INVERITIES +INVERITY +INVERNESS +INVERNESSES +INVERSE +INVERSED +INVERSELY +INVERSES +INVERSING +INVERSION +INVERSIONS +INVERSIVE +INVERT +INVERTASE +INVERTASES +INVERTEBRATE +INVERTEBRATES +INVERTED +INVERTER +INVERTERS +INVERTIBLE +INVERTIN +INVERTING +INVERTINS +INVERTOR +INVERTORS +INVERTS +INVEST +INVESTABLE +INVESTED +INVESTIGATE +INVESTIGATED +INVESTIGATES +INVESTIGATING +INVESTIGATION +INVESTIGATIONAL +INVESTIGATIONS +INVESTIGATIVE +INVESTIGATOR +INVESTIGATORS +INVESTIGATORY +INVESTING +INVESTITURE +INVESTITURES +INVESTMENT +INVESTMENTS +INVESTOR +INVESTORS +INVESTS +INVETERACIES +INVETERACY +INVETERATE +INVETERATELY +INVIABILITIES +INVIABILITY +INVIABLE +INVIABLY +INVIDIOUS +INVIDIOUSLY +INVIDIOUSNESS +INVIDIOUSNESSES +INVIGILATE +INVIGILATED +INVIGILATES +INVIGILATING +INVIGILATION +INVIGILATIONS +INVIGILATOR +INVIGILATORS +INVIGORATE +INVIGORATED +INVIGORATES +INVIGORATING +INVIGORATINGLY +INVIGORATION +INVIGORATIONS +INVIGORATOR +INVIGORATORS +INVINCIBILITIES +INVINCIBILITY +INVINCIBLE +INVINCIBLENESS +INVINCIBLY +INVIOLABILITIES +INVIOLABILITY +INVIOLABLE +INVIOLABLENESS +INVIOLABLY +INVIOLACIES +INVIOLACY +INVIOLATE +INVIOLATELY +INVIOLATENESS +INVIOLATENESSES +INVIRILE +INVISCID +INVISIBILITIES +INVISIBILITY +INVISIBLE +INVISIBLENESS +INVISIBLENESSES +INVISIBLES +INVISIBLY +INVITAL +INVITATION +INVITATIONAL +INVITATIONALS +INVITATIONS +INVITATORIES +INVITATORY +INVITE +INVITED +INVITEE +INVITEES +INVITER +INVITERS +INVITES +INVITING +INVITINGLY +INVOCATE +INVOCATED +INVOCATES +INVOCATING +INVOCATION +INVOCATIONAL +INVOCATIONS +INVOCATORY +INVOICE +INVOICED +INVOICES +INVOICING +INVOKE +INVOKED +INVOKER +INVOKERS +INVOKES +INVOKING +INVOLUCEL +INVOLUCELS +INVOLUCRA +INVOLUCRAL +INVOLUCRATE +INVOLUCRE +INVOLUCRES +INVOLUCRUM +INVOLUNTARILY +INVOLUNTARINESS +INVOLUNTARY +INVOLUTE +INVOLUTED +INVOLUTES +INVOLUTING +INVOLUTION +INVOLUTIONAL +INVOLUTIONS +INVOLVE +INVOLVED +INVOLVEDLY +INVOLVEMENT +INVOLVEMENTS +INVOLVER +INVOLVERS +INVOLVES +INVOLVING +INVULNERABILITY +INVULNERABLE +INVULNERABLY +INWALL +INWALLED +INWALLING +INWALLS +INWARD +INWARDLY +INWARDNESS +INWARDNESSES +INWARDS +INWEAVE +INWEAVED +INWEAVES +INWEAVING +INWIND +INWINDING +INWINDS +INWOUND +INWOVE +INWOVEN +INWRAP +INWRAPPED +INWRAPPING +INWRAPS +INWROUGHT +IODATE +IODATED +IODATES +IODATING +IODATION +IODATIONS +IODIC +IODID +IODIDE +IODIDES +IODIDS +IODIN +IODINATE +IODINATED +IODINATES +IODINATING +IODINATION +IODINATIONS +IODINE +IODINES +IODINS +IODISE +IODISED +IODISES +IODISING +IODISM +IODISMS +IODIZE +IODIZED +IODIZER +IODIZERS +IODIZES +IODIZING +IODOFORM +IODOFORMS +IODOMETRIES +IODOMETRY +IODOPHOR +IODOPHORS +IODOPSIN +IODOPSINS +IODOUS +IOLITE +IOLITES +ION +IONIC +IONICITIES +IONICITY +IONICS +IONISE +IONISED +IONISES +IONISING +IONIUM +IONIUMS +IONIZABLE +IONIZATION +IONIZATIONS +IONIZE +IONIZED +IONIZER +IONIZERS +IONIZES +IONIZING +IONOGEN +IONOGENIC +IONOGENS +IONOMER +IONOMERS +IONONE +IONONES +IONOPHORE +IONOPHORES +IONOSONDE +IONOSONDES +IONOSPHERE +IONOSPHERES +IONOSPHERIC +IONOSPHERICALLY +IONS +IONTOPHORESES +IONTOPHORESIS +IONTOPHORETIC +IOTA +IOTACISM +IOTACISMS +IOTAS +IPECAC +IPECACS +IPECACUANHA +IPECACUANHAS +IPOMOEA +IPOMOEAS +IPRONIAZID +IPRONIAZIDS +IPSILATERAL +IPSILATERALLY +IRACUND +IRADE +IRADES +IRASCIBILITIES +IRASCIBILITY +IRASCIBLE +IRASCIBLENESS +IRASCIBLENESSES +IRASCIBLY +IRATE +IRATELY +IRATENESS +IRATENESSES +IRATER +IRATEST +IRE +IRED +IREFUL +IREFULLY +IRELESS +IRENIC +IRENICAL +IRENICALLY +IRENICS +IRES +IRID +IRIDES +IRIDESCENCE +IRIDESCENCES +IRIDESCENT +IRIDESCENTLY +IRIDIC +IRIDIUM +IRIDIUMS +IRIDOLOGIES +IRIDOLOGIST +IRIDOLOGISTS +IRIDOLOGY +IRIDOSMINE +IRIDOSMINES +IRIDS +IRING +IRIS +IRISED +IRISES +IRISING +IRITIC +IRITIS +IRITISES +IRK +IRKED +IRKING +IRKS +IRKSOME +IRKSOMELY +IRKSOMENESS +IRKSOMENESSES +IROKO +IROKOS +IRON +IRONBARK +IRONBARKS +IRONBOUND +IRONCLAD +IRONCLADS +IRONE +IRONED +IRONER +IRONERS +IRONES +IRONFISTED +IRONHANDED +IRONHEARTED +IRONIC +IRONICAL +IRONICALLY +IRONICALNESS +IRONICALNESSES +IRONIES +IRONING +IRONINGS +IRONIST +IRONISTS +IRONIZE +IRONIZED +IRONIZES +IRONIZING +IRONLIKE +IRONMAN +IRONMASTER +IRONMASTERS +IRONMEN +IRONMONGER +IRONMONGERIES +IRONMONGERS +IRONMONGERY +IRONNESS +IRONNESSES +IRONS +IRONSIDE +IRONSIDES +IRONSMITH +IRONSMITHS +IRONSTONE +IRONSTONES +IRONWARE +IRONWARES +IRONWEED +IRONWEEDS +IRONWOMAN +IRONWOMEN +IRONWOOD +IRONWOODS +IRONWORK +IRONWORKER +IRONWORKERS +IRONWORKS +IRONY +IRRADIANCE +IRRADIANCES +IRRADIANT +IRRADIATE +IRRADIATED +IRRADIATES +IRRADIATING +IRRADIATION +IRRADIATIONS +IRRADIATIVE +IRRADIATOR +IRRADIATORS +IRRADICABLE +IRRADICABLY +IRRATIONAL +IRRATIONALISM +IRRATIONALISMS +IRRATIONALIST +IRRATIONALISTIC +IRRATIONALISTS +IRRATIONALITIES +IRRATIONALITY +IRRATIONALLY +IRRATIONALS +IRREAL +IRREALITIES +IRREALITY +IRRECLAIMABLE +IRRECLAIMABLY +IRRECONCILABLE +IRRECONCILABLES +IRRECONCILABLY +IRRECOVERABLE +IRRECOVERABLY +IRRECUSABLE +IRRECUSABLY +IRREDEEMABLE +IRREDEEMABLY +IRREDENTA +IRREDENTAS +IRREDENTISM +IRREDENTISMS +IRREDENTIST +IRREDENTISTS +IRREDUCIBILITY +IRREDUCIBLE +IRREDUCIBLY +IRREFLEXIVE +IRREFORMABILITY +IRREFORMABLE +IRREFRAGABILITY +IRREFRAGABLE +IRREFRAGABLY +IRREFUTABILITY +IRREFUTABLE +IRREFUTABLY +IRREGARDLESS +IRREGULAR +IRREGULARITIES +IRREGULARITY +IRREGULARLY +IRREGULARS +IRRELATIVE +IRRELATIVELY +IRRELEVANCE +IRRELEVANCES +IRRELEVANCIES +IRRELEVANCY +IRRELEVANT +IRRELEVANTLY +IRRELIGION +IRRELIGIONIST +IRRELIGIONISTS +IRRELIGIONS +IRRELIGIOUS +IRRELIGIOUSLY +IRREMEABLE +IRREMEDIABLE +IRREMEDIABLY +IRREMOVABILITY +IRREMOVABLE +IRREMOVABLY +IRREPARABLE +IRREPARABLENESS +IRREPARABLY +IRREPEALABILITY +IRREPEALABLE +IRREPLACEABLE +IRREPLACEABLY +IRREPRESSIBLE +IRREPRESSIBLY +IRREPROACHABLE +IRREPROACHABLY +IRREPRODUCIBLE +IRRESISTIBILITY +IRRESISTIBLE +IRRESISTIBLY +IRRESOLUBLE +IRRESOLUTE +IRRESOLUTELY +IRRESOLUTENESS +IRRESOLUTION +IRRESOLUTIONS +IRRESOLVABLE +IRRESPONSIBLE +IRRESPONSIBLES +IRRESPONSIBLY +IRRESPONSIVE +IRRETRIEVABLE +IRRETRIEVABLY +IRREVERENCE +IRREVERENCES +IRREVERENT +IRREVERENTLY +IRREVERSIBILITY +IRREVERSIBLE +IRREVERSIBLY +IRREVOCABILITY +IRREVOCABLE +IRREVOCABLENESS +IRREVOCABLY +IRRIDENTA +IRRIDENTAS +IRRIGABLE +IRRIGABLY +IRRIGATE +IRRIGATED +IRRIGATES +IRRIGATING +IRRIGATION +IRRIGATIONS +IRRIGATOR +IRRIGATORS +IRRIGUOUS +IRRITABILITIES +IRRITABILITY +IRRITABLE +IRRITABLENESS +IRRITABLENESSES +IRRITABLY +IRRITANCIES +IRRITANCY +IRRITANT +IRRITANTS +IRRITATE +IRRITATED +IRRITATES +IRRITATING +IRRITATINGLY +IRRITATION +IRRITATIONS +IRRITATIVE +IRRITATOR +IRRITATORS +IRROTATIONAL +IRRUPT +IRRUPTED +IRRUPTING +IRRUPTION +IRRUPTIONS +IRRUPTIVE +IRRUPTIVELY +IRRUPTS +IS +ISAGOGE +ISAGOGES +ISAGOGIC +ISAGOGICS +ISALLOBAR +ISALLOBARIC +ISALLOBARS +ISARITHM +ISARITHMS +ISATIN +ISATINE +ISATINES +ISATINIC +ISATINS +ISBA +ISBAS +ISCHAEMIA +ISCHAEMIAS +ISCHEMIA +ISCHEMIAS +ISCHEMIC +ISCHIA +ISCHIADIC +ISCHIAL +ISCHIATIC +ISCHIUM +ISEIKONIA +ISEIKONIAS +ISEIKONIC +ISENTROPIC +ISENTROPICALLY +ISINGLASS +ISINGLASSES +ISLAND +ISLANDED +ISLANDER +ISLANDERS +ISLANDING +ISLANDS +ISLE +ISLED +ISLELESS +ISLES +ISLET +ISLETED +ISLETS +ISLING +ISM +ISMS +ISOAGGLUTININ +ISOAGGLUTININS +ISOALLOXAZINE +ISOALLOXAZINES +ISOANTIBODIES +ISOANTIBODY +ISOANTIGEN +ISOANTIGENIC +ISOANTIGENS +ISOBAR +ISOBARE +ISOBARES +ISOBARIC +ISOBARISM +ISOBARISMS +ISOBARS +ISOBATH +ISOBATHIC +ISOBATHS +ISOBUTANE +ISOBUTANES +ISOBUTENE +ISOBUTENES +ISOBUTYL +ISOBUTYLENE +ISOBUTYLENES +ISOBUTYLS +ISOCALORIC +ISOCARBOXAZID +ISOCARBOXAZIDS +ISOCHEIM +ISOCHEIMS +ISOCHIME +ISOCHIMES +ISOCHOR +ISOCHORE +ISOCHORES +ISOCHORIC +ISOCHORS +ISOCHROMOSOME +ISOCHROMOSOMES +ISOCHRON +ISOCHRONAL +ISOCHRONALLY +ISOCHRONE +ISOCHRONES +ISOCHRONISM +ISOCHRONISMS +ISOCHRONOUS +ISOCHRONOUSLY +ISOCHRONS +ISOCLINAL +ISOCLINALS +ISOCLINE +ISOCLINES +ISOCLINIC +ISOCLINICS +ISOCRACIES +ISOCRACY +ISOCYANATE +ISOCYANATES +ISOCYCLIC +ISODIAMETRIC +ISODOSE +ISOELECTRIC +ISOELECTRONIC +ISOENZYMATIC +ISOENZYME +ISOENZYMES +ISOENZYMIC +ISOFORM +ISOFORMS +ISOGAMETE +ISOGAMETES +ISOGAMETIC +ISOGAMIES +ISOGAMOUS +ISOGAMY +ISOGENEIC +ISOGENIC +ISOGENIES +ISOGENOUS +ISOGENY +ISOGLOSS +ISOGLOSSAL +ISOGLOSSES +ISOGLOSSIC +ISOGON +ISOGONAL +ISOGONALS +ISOGONE +ISOGONES +ISOGONIC +ISOGONICS +ISOGONIES +ISOGONS +ISOGONY +ISOGRAFT +ISOGRAFTED +ISOGRAFTING +ISOGRAFTS +ISOGRAM +ISOGRAMS +ISOGRAPH +ISOGRAPHS +ISOGRIV +ISOGRIVS +ISOHEL +ISOHELS +ISOHYET +ISOHYETAL +ISOHYETS +ISOLABLE +ISOLATABLE +ISOLATE +ISOLATED +ISOLATES +ISOLATING +ISOLATION +ISOLATIONISM +ISOLATIONISMS +ISOLATIONIST +ISOLATIONISTS +ISOLATIONS +ISOLATOR +ISOLATORS +ISOLEAD +ISOLEADS +ISOLEUCINE +ISOLEUCINES +ISOLINE +ISOLINES +ISOLOG +ISOLOGOUS +ISOLOGS +ISOLOGUE +ISOLOGUES +ISOMER +ISOMERASE +ISOMERASES +ISOMERIC +ISOMERISM +ISOMERISMS +ISOMERIZATION +ISOMERIZATIONS +ISOMERIZE +ISOMERIZED +ISOMERIZES +ISOMERIZING +ISOMEROUS +ISOMERS +ISOMETRIC +ISOMETRICALLY +ISOMETRICS +ISOMETRIES +ISOMETRY +ISOMORPH +ISOMORPHIC +ISOMORPHICALLY +ISOMORPHISM +ISOMORPHISMS +ISOMORPHOUS +ISOMORPHS +ISONIAZID +ISONIAZIDS +ISONOMIC +ISONOMIES +ISONOMY +ISOOCTANE +ISOOCTANES +ISOPACH +ISOPACHS +ISOPHOTAL +ISOPHOTE +ISOPHOTES +ISOPIESTIC +ISOPLETH +ISOPLETHIC +ISOPLETHS +ISOPOD +ISOPODAN +ISOPODANS +ISOPODS +ISOPRENALINE +ISOPRENALINES +ISOPRENE +ISOPRENES +ISOPRENOID +ISOPROPYL +ISOPROPYLS +ISOPROTERENOL +ISOPROTERENOLS +ISOPYCNIC +ISOSCELES +ISOSMOTIC +ISOSMOTICALLY +ISOSPIN +ISOSPINS +ISOSPORIES +ISOSPORY +ISOSTACIES +ISOSTACY +ISOSTASIES +ISOSTASY +ISOSTATIC +ISOSTATICALLY +ISOSTERIC +ISOTACH +ISOTACHS +ISOTACTIC +ISOTHERAL +ISOTHERE +ISOTHERES +ISOTHERM +ISOTHERMAL +ISOTHERMALLY +ISOTHERMS +ISOTONE +ISOTONES +ISOTONIC +ISOTONICALLY +ISOTONICITIES +ISOTONICITY +ISOTOPE +ISOTOPES +ISOTOPIC +ISOTOPICALLY +ISOTOPIES +ISOTOPY +ISOTROPIC +ISOTROPIES +ISOTROPY +ISOTYPE +ISOTYPES +ISOTYPIC +ISOZYME +ISOZYMES +ISOZYMIC +ISSEI +ISSEIS +ISSUABLE +ISSUABLY +ISSUANCE +ISSUANCES +ISSUANT +ISSUE +ISSUED +ISSUELESS +ISSUER +ISSUERS +ISSUES +ISSUING +ISTHMI +ISTHMIAN +ISTHMIANS +ISTHMIC +ISTHMOID +ISTHMUS +ISTHMUSES +ISTLE +ISTLES +IT +ITALIANATE +ITALIANATED +ITALIANATES +ITALIANATING +ITALIANISE +ITALIANISED +ITALIANISES +ITALIANISING +ITALIANIZE +ITALIANIZED +ITALIANIZES +ITALIANIZING +ITALIC +ITALICISE +ITALICISED +ITALICISES +ITALICISING +ITALICIZATION +ITALICIZATIONS +ITALICIZE +ITALICIZED +ITALICIZES +ITALICIZING +ITALICS +ITCH +ITCHED +ITCHES +ITCHIER +ITCHIEST +ITCHILY +ITCHINESS +ITCHINESSES +ITCHING +ITCHINGS +ITCHY +ITEM +ITEMED +ITEMING +ITEMISE +ITEMISED +ITEMISES +ITEMISING +ITEMIZATION +ITEMIZATIONS +ITEMIZE +ITEMIZED +ITEMIZER +ITEMIZERS +ITEMIZES +ITEMIZING +ITEMS +ITERANCE +ITERANCES +ITERANT +ITERATE +ITERATED +ITERATES +ITERATING +ITERATION +ITERATIONS +ITERATIVE +ITERATIVELY +ITERUM +ITHER +ITHYPHALLIC +ITINERACIES +ITINERACY +ITINERANCIES +ITINERANCY +ITINERANT +ITINERANTLY +ITINERANTS +ITINERARIES +ITINERARY +ITINERATE +ITINERATED +ITINERATES +ITINERATING +ITINERATION +ITINERATIONS +ITS +ITSELF +IVERMECTIN +IVERMECTINS +IVIED +IVIES +IVORIES +IVORY +IVORYBILL +IVORYBILLS +IVORYLIKE +IVY +IVYLIKE +IWIS +IXIA +IXIAS +IXODID +IXODIDS +IXORA +IXORAS +IXTLE +IXTLES +IZAR +IZARS +IZZARD +IZZARDS +JAB +JABBED +JABBER +JABBERED +JABBERER +JABBERERS +JABBERING +JABBERS +JABBERWOCKIES +JABBERWOCKY +JABBING +JABIRU +JABIRUS +JABORANDI +JABORANDIS +JABOT +JABOTICABA +JABOTICABAS +JABOTS +JABS +JACAL +JACALES +JACALS +JACAMAR +JACAMARS +JACANA +JACANAS +JACARANDA +JACARANDAS +JACINTH +JACINTHE +JACINTHES +JACINTHS +JACK +JACKAL +JACKALS +JACKANAPES +JACKANAPESES +JACKAROO +JACKAROOS +JACKASS +JACKASSERIES +JACKASSERY +JACKASSES +JACKBOOT +JACKBOOTED +JACKBOOTS +JACKDAW +JACKDAWS +JACKED +JACKER +JACKEROO +JACKEROOS +JACKERS +JACKET +JACKETED +JACKETING +JACKETLESS +JACKETS +JACKFISH +JACKFISHES +JACKFRUIT +JACKFRUITS +JACKHAMMER +JACKHAMMERED +JACKHAMMERING +JACKHAMMERS +JACKIES +JACKING +JACKKNIFE +JACKKNIFED +JACKKNIFES +JACKKNIFING +JACKKNIVES +JACKLEG +JACKLEGS +JACKLIGHT +JACKLIGHTED +JACKLIGHTING +JACKLIGHTS +JACKPLANE +JACKPLANES +JACKPOT +JACKPOTS +JACKRABBIT +JACKRABBITS +JACKROLL +JACKROLLED +JACKROLLING +JACKROLLS +JACKS +JACKSCREW +JACKSCREWS +JACKSHAFT +JACKSHAFTS +JACKSMELT +JACKSMELTS +JACKSNIPE +JACKSNIPES +JACKSTAY +JACKSTAYS +JACKSTONE +JACKSTONES +JACKSTRAW +JACKSTRAWS +JACKY +JACOBIN +JACOBINS +JACOBUS +JACOBUSES +JACONET +JACONETS +JACQUARD +JACQUARDS +JACQUERIE +JACQUERIES +JACTATION +JACTATIONS +JACTITATION +JACTITATIONS +JACULATE +JACULATED +JACULATES +JACULATING +JACUZZI +JACUZZIS +JADE +JADED +JADEDLY +JADEDNESS +JADEDNESSES +JADEITE +JADEITES +JADELIKE +JADES +JADING +JADISH +JADISHLY +JADITIC +JAEGER +JAEGERS +JAG +JAGER +JAGERS +JAGG +JAGGARIES +JAGGARY +JAGGED +JAGGEDER +JAGGEDEST +JAGGEDLY +JAGGEDNESS +JAGGEDNESSES +JAGGER +JAGGERIES +JAGGERS +JAGGERY +JAGGHERIES +JAGGHERY +JAGGIER +JAGGIES +JAGGIEST +JAGGING +JAGGS +JAGGY +JAGLESS +JAGRA +JAGRAS +JAGS +JAGUAR +JAGUARONDI +JAGUARONDIS +JAGUARS +JAGUARUNDI +JAGUARUNDIS +JAIL +JAILABLE +JAILBAIT +JAILBIRD +JAILBIRDS +JAILBREAK +JAILBREAKS +JAILED +JAILER +JAILERS +JAILHOUSE +JAILHOUSES +JAILING +JAILOR +JAILORS +JAILS +JAKE +JAKES +JALAP +JALAPENO +JALAPENOS +JALAPIC +JALAPIN +JALAPINS +JALAPS +JALOP +JALOPIES +JALOPPIES +JALOPPY +JALOPS +JALOPY +JALOUSIE +JALOUSIED +JALOUSIES +JAM +JAMB +JAMBALAYA +JAMBALAYAS +JAMBE +JAMBEAU +JAMBEAUX +JAMBED +JAMBES +JAMBING +JAMBOREE +JAMBOREES +JAMBS +JAMLIKE +JAMMABLE +JAMMED +JAMMER +JAMMERS +JAMMIER +JAMMIES +JAMMIEST +JAMMING +JAMMY +JAMPACKED +JAMS +JANE +JANES +JANGLE +JANGLED +JANGLER +JANGLERS +JANGLES +JANGLIER +JANGLIEST +JANGLING +JANGLY +JANIFORM +JANISARIES +JANISARY +JANISSARIES +JANISSARY +JANITOR +JANITORIAL +JANITORS +JANIZARIES +JANIZARY +JANTY +JAPAN +JAPANIZE +JAPANIZED +JAPANIZES +JAPANIZING +JAPANNED +JAPANNER +JAPANNERS +JAPANNING +JAPANS +JAPE +JAPED +JAPER +JAPERIES +JAPERS +JAPERY +JAPES +JAPING +JAPINGLY +JAPONAISERIE +JAPONAISERIES +JAPONICA +JAPONICAS +JAR +JARDINIERE +JARDINIERES +JARFUL +JARFULS +JARGON +JARGONED +JARGONEER +JARGONEERS +JARGONEL +JARGONELS +JARGONING +JARGONISH +JARGONIST +JARGONISTIC +JARGONISTS +JARGONIZE +JARGONIZED +JARGONIZES +JARGONIZING +JARGONS +JARGONY +JARGOON +JARGOONS +JARHEAD +JARHEADS +JARINA +JARINAS +JARL +JARLDOM +JARLDOMS +JARLS +JARLSBERG +JARLSBERGS +JAROSITE +JAROSITES +JAROVIZE +JAROVIZED +JAROVIZES +JAROVIZING +JARRAH +JARRAHS +JARRED +JARRING +JARRINGLY +JARS +JARSFUL +JARVEY +JARVEYS +JASMIN +JASMINE +JASMINES +JASMINS +JASPER +JASPERS +JASPERWARE +JASPERWARES +JASPERY +JASPILITE +JASPILITES +JASSID +JASSIDS +JATO +JATOS +JAUK +JAUKED +JAUKING +JAUKS +JAUNCE +JAUNCED +JAUNCES +JAUNCING +JAUNDICE +JAUNDICED +JAUNDICES +JAUNDICING +JAUNT +JAUNTED +JAUNTIER +JAUNTIEST +JAUNTILY +JAUNTINESS +JAUNTINESSES +JAUNTING +JAUNTS +JAUNTY +JAUP +JAUPED +JAUPING +JAUPS +JAVA +JAVAS +JAVELIN +JAVELINA +JAVELINAS +JAVELINED +JAVELINING +JAVELINS +JAW +JAWAN +JAWANS +JAWBONE +JAWBONED +JAWBONER +JAWBONERS +JAWBONES +JAWBONING +JAWBONINGS +JAWBREAKER +JAWBREAKERS +JAWED +JAWING +JAWLESS +JAWLIKE +JAWLINE +JAWLINES +JAWS +JAY +JAYBIRD +JAYBIRDS +JAYGEE +JAYGEES +JAYHAWKER +JAYHAWKERS +JAYS +JAYVEE +JAYVEES +JAYWALK +JAYWALKED +JAYWALKER +JAYWALKERS +JAYWALKING +JAYWALKS +JAZZ +JAZZBO +JAZZBOS +JAZZED +JAZZER +JAZZERS +JAZZES +JAZZIER +JAZZIEST +JAZZILY +JAZZINESS +JAZZINESSES +JAZZING +JAZZLIKE +JAZZMAN +JAZZMEN +JAZZY +JEALOUS +JEALOUSIES +JEALOUSLY +JEALOUSNESS +JEALOUSNESSES +JEALOUSY +JEAN +JEANED +JEANS +JEBEL +JEBELS +JEE +JEED +JEEING +JEEP +JEEPED +JEEPERS +JEEPING +JEEPNEY +JEEPNEYS +JEEPS +JEER +JEERED +JEERER +JEERERS +JEERING +JEERINGLY +JEERS +JEES +JEEZ +JEFE +JEFES +JEHAD +JEHADS +JEHU +JEHUS +JEJUNA +JEJUNAL +JEJUNE +JEJUNELY +JEJUNENESS +JEJUNENESSES +JEJUNITIES +JEJUNITY +JEJUNUM +JELL +JELLABA +JELLABAS +JELLED +JELLIED +JELLIES +JELLIFIED +JELLIFIES +JELLIFY +JELLIFYING +JELLING +JELLO +JELLOS +JELLS +JELLY +JELLYBEAN +JELLYBEANS +JELLYFISH +JELLYFISHES +JELLYING +JELLYLIKE +JELLYROLL +JELLYROLLS +JELUTONG +JELUTONGS +JEMADAR +JEMADARS +JEMIDAR +JEMIDARS +JEMMIED +JEMMIES +JEMMY +JEMMYING +JENNET +JENNETS +JENNIES +JENNY +JEON +JEOPARD +JEOPARDED +JEOPARDIES +JEOPARDING +JEOPARDISE +JEOPARDISED +JEOPARDISES +JEOPARDISING +JEOPARDIZE +JEOPARDIZED +JEOPARDIZES +JEOPARDIZING +JEOPARDS +JEOPARDY +JEQUIRITIES +JEQUIRITY +JERBOA +JERBOAS +JEREED +JEREEDS +JEREMIAD +JEREMIADS +JERID +JERIDS +JERK +JERKED +JERKER +JERKERS +JERKIER +JERKIES +JERKIEST +JERKILY +JERKIN +JERKINESS +JERKINESSES +JERKING +JERKINGLY +JERKINS +JERKS +JERKWATER +JERKWATERS +JERKY +JEROBOAM +JEROBOAMS +JERREED +JERREEDS +JERRICAN +JERRICANS +JERRID +JERRIDS +JERRIES +JERRY +JERRYCAN +JERRYCANS +JERSEY +JERSEYED +JERSEYS +JESS +JESSAMINE +JESSAMINES +JESSANT +JESSE +JESSED +JESSES +JESSING +JEST +JESTED +JESTER +JESTERS +JESTFUL +JESTING +JESTINGLY +JESTINGS +JESTS +JESUIT +JESUITIC +JESUITICAL +JESUITICALLY +JESUITISM +JESUITISMS +JESUITRIES +JESUITRY +JESUITS +JET +JETBEAD +JETBEADS +JETE +JETES +JETFOIL +JETFOILS +JETLAG +JETLAGS +JETLIKE +JETLINER +JETLINERS +JETON +JETONS +JETPORT +JETPORTS +JETS +JETSAM +JETSAMS +JETSOM +JETSOMS +JETSTREAM +JETSTREAMS +JETTED +JETTIED +JETTIER +JETTIES +JETTIEST +JETTINESS +JETTINESSES +JETTING +JETTISON +JETTISONABLE +JETTISONED +JETTISONING +JETTISONS +JETTON +JETTONS +JETTY +JETTYING +JETWAY +JETWAYS +JEU +JEUX +JEW +JEWED +JEWEL +JEWELED +JEWELER +JEWELERS +JEWELFISH +JEWELFISHES +JEWELING +JEWELLED +JEWELLER +JEWELLERIES +JEWELLERS +JEWELLERY +JEWELLIKE +JEWELLING +JEWELRIES +JEWELRY +JEWELS +JEWELWEED +JEWELWEEDS +JEWFISH +JEWFISHES +JEWING +JEWS +JEZAIL +JEZAILS +JEZEBEL +JEZEBELS +JIAO +JIB +JIBB +JIBBED +JIBBER +JIBBERS +JIBBING +JIBBOOM +JIBBOOMS +JIBBS +JIBE +JIBED +JIBER +JIBERS +JIBES +JIBING +JIBINGLY +JIBS +JICAMA +JICAMAS +JIFF +JIFFIES +JIFFS +JIFFY +JIG +JIGABOO +JIGABOOS +JIGGED +JIGGER +JIGGERED +JIGGERING +JIGGERS +JIGGIER +JIGGIEST +JIGGING +JIGGISH +JIGGLE +JIGGLED +JIGGLES +JIGGLIER +JIGGLIEST +JIGGLING +JIGGLY +JIGGY +JIGLIKE +JIGS +JIGSAW +JIGSAWED +JIGSAWING +JIGSAWN +JIGSAWS +JIHAD +JIHADS +JILL +JILLION +JILLIONS +JILLS +JILT +JILTED +JILTER +JILTERS +JILTING +JILTS +JIMINY +JIMJAMS +JIMMIE +JIMMIED +JIMMIES +JIMMINY +JIMMY +JIMMYING +JIMP +JIMPER +JIMPEST +JIMPLY +JIMPY +JIMSONWEED +JIMSONWEEDS +JIN +JINGAL +JINGALL +JINGALLS +JINGALS +JINGKO +JINGKOES +JINGLE +JINGLED +JINGLER +JINGLERS +JINGLES +JINGLIER +JINGLIEST +JINGLING +JINGLY +JINGO +JINGOES +JINGOISH +JINGOISM +JINGOISMS +JINGOIST +JINGOISTIC +JINGOISTICALLY +JINGOISTS +JINK +JINKED +JINKER +JINKERS +JINKING +JINKS +JINN +JINNEE +JINNI +JINNIS +JINNS +JINRICKSHA +JINRICKSHAS +JINRIKISHA +JINRIKISHAS +JINRIKSHA +JINRIKSHAS +JINS +JINX +JINXED +JINXES +JINXING +JIPIJAPA +JIPIJAPAS +JISM +JISMS +JITNEY +JITNEYS +JITTER +JITTERBUG +JITTERBUGGED +JITTERBUGGING +JITTERBUGS +JITTERED +JITTERIER +JITTERIEST +JITTERINESS +JITTERINESSES +JITTERING +JITTERS +JITTERY +JIUJITSU +JIUJITSUS +JIUJUTSU +JIUJUTSUS +JIVE +JIVEASS +JIVED +JIVER +JIVERS +JIVES +JIVEY +JIVIER +JIVIEST +JIVING +JIVY +JNANA +JNANAS +JO +JOANNES +JOB +JOBBED +JOBBER +JOBBERIES +JOBBERS +JOBBERY +JOBBING +JOBHOLDER +JOBHOLDERS +JOBLESS +JOBLESSNESS +JOBLESSNESSES +JOBNAME +JOBNAMES +JOBS +JOCK +JOCKETTE +JOCKETTES +JOCKEY +JOCKEYED +JOCKEYING +JOCKEYISH +JOCKEYS +JOCKO +JOCKOS +JOCKS +JOCKSTRAP +JOCKSTRAPS +JOCOSE +JOCOSELY +JOCOSENESS +JOCOSENESSES +JOCOSITIES +JOCOSITY +JOCULAR +JOCULARITIES +JOCULARITY +JOCULARLY +JOCUND +JOCUNDITIES +JOCUNDITY +JOCUNDLY +JODHPUR +JODHPURS +JOE +JOES +JOEY +JOEYS +JOG +JOGGED +JOGGER +JOGGERS +JOGGING +JOGGINGS +JOGGLE +JOGGLED +JOGGLER +JOGGLERS +JOGGLES +JOGGLING +JOGS +JOHANNES +JOHN +JOHNBOAT +JOHNBOATS +JOHNNIE +JOHNNIES +JOHNNY +JOHNNYCAKE +JOHNNYCAKES +JOHNS +JOHNSON +JOHNSONGRASS +JOHNSONGRASSES +JOHNSONS +JOIN +JOINABLE +JOINDER +JOINDERS +JOINED +JOINER +JOINERIES +JOINERS +JOINERY +JOINING +JOININGS +JOINS +JOINT +JOINTED +JOINTEDLY +JOINTEDNESS +JOINTEDNESSES +JOINTER +JOINTERS +JOINTING +JOINTLESS +JOINTLY +JOINTRESS +JOINTRESSES +JOINTS +JOINTURE +JOINTURED +JOINTURES +JOINTURING +JOINTWEED +JOINTWEEDS +JOINTWORM +JOINTWORMS +JOIST +JOISTED +JOISTING +JOISTS +JOJOBA +JOJOBAS +JOKE +JOKED +JOKER +JOKERS +JOKES +JOKESTER +JOKESTERS +JOKEY +JOKIER +JOKIEST +JOKILY +JOKINESS +JOKINESSES +JOKING +JOKINGLY +JOKY +JOLE +JOLES +JOLLIED +JOLLIER +JOLLIERS +JOLLIES +JOLLIEST +JOLLIFICATION +JOLLIFICATIONS +JOLLIFIED +JOLLIFIES +JOLLIFY +JOLLIFYING +JOLLILY +JOLLINESS +JOLLINESSES +JOLLITIES +JOLLITY +JOLLY +JOLLYBOAT +JOLLYBOATS +JOLLYING +JOLT +JOLTED +JOLTER +JOLTERS +JOLTIER +JOLTIEST +JOLTILY +JOLTING +JOLTINGLY +JOLTS +JOLTY +JOMON +JONES +JONESED +JONESES +JONESING +JONGLEUR +JONGLEURS +JONNYCAKE +JONNYCAKES +JONQUIL +JONQUILS +JORAM +JORAMS +JORDAN +JORDANS +JORUM +JORUMS +JOSEPH +JOSEPHS +JOSH +JOSHED +JOSHER +JOSHERS +JOSHES +JOSHING +JOSHINGLY +JOSS +JOSSES +JOSTLE +JOSTLED +JOSTLER +JOSTLERS +JOSTLES +JOSTLING +JOT +JOTA +JOTAS +JOTS +JOTTED +JOTTER +JOTTERS +JOTTING +JOTTINGS +JOTTY +JOUAL +JOUALS +JOUK +JOUKED +JOUKING +JOUKS +JOULE +JOULES +JOUNCE +JOUNCED +JOUNCES +JOUNCIER +JOUNCIEST +JOUNCING +JOUNCY +JOURNAL +JOURNALED +JOURNALESE +JOURNALESES +JOURNALING +JOURNALISM +JOURNALISMS +JOURNALIST +JOURNALISTIC +JOURNALISTS +JOURNALIZE +JOURNALIZED +JOURNALIZER +JOURNALIZERS +JOURNALIZES +JOURNALIZING +JOURNALS +JOURNEY +JOURNEYED +JOURNEYER +JOURNEYERS +JOURNEYING +JOURNEYMAN +JOURNEYMEN +JOURNEYS +JOURNEYWORK +JOURNEYWORKS +JOURNO +JOURNOS +JOUST +JOUSTED +JOUSTER +JOUSTERS +JOUSTING +JOUSTS +JOVIAL +JOVIALITIES +JOVIALITY +JOVIALLY +JOVIALTIES +JOVIALTY +JOW +JOWAR +JOWARS +JOWED +JOWING +JOWL +JOWLED +JOWLIER +JOWLIEST +JOWLINESS +JOWLINESSES +JOWLS +JOWLY +JOWS +JOY +JOYANCE +JOYANCES +JOYED +JOYFUL +JOYFULLER +JOYFULLEST +JOYFULLY +JOYFULNESS +JOYFULNESSES +JOYING +JOYLESS +JOYLESSLY +JOYLESSNESS +JOYLESSNESSES +JOYOUS +JOYOUSLY +JOYOUSNESS +JOYOUSNESSES +JOYPOP +JOYPOPPED +JOYPOPPER +JOYPOPPERS +JOYPOPPING +JOYPOPS +JOYRIDDEN +JOYRIDE +JOYRIDER +JOYRIDERS +JOYRIDES +JOYRIDING +JOYRIDINGS +JOYRODE +JOYS +JOYSTICK +JOYSTICKS +JUBA +JUBAS +JUBBAH +JUBBAHS +JUBE +JUBES +JUBHAH +JUBHAHS +JUBILANCE +JUBILANCES +JUBILANT +JUBILANTLY +JUBILARIAN +JUBILARIANS +JUBILATE +JUBILATED +JUBILATES +JUBILATING +JUBILATION +JUBILATIONS +JUBILE +JUBILEE +JUBILEES +JUBILES +JUCO +JUCOS +JUDAS +JUDASES +JUDDER +JUDDERED +JUDDERING +JUDDERS +JUDGE +JUDGED +JUDGEMENT +JUDGEMENTS +JUDGER +JUDGERS +JUDGES +JUDGESHIP +JUDGESHIPS +JUDGING +JUDGMATIC +JUDGMATICAL +JUDGMATICALLY +JUDGMENT +JUDGMENTAL +JUDGMENTALLY +JUDGMENTS +JUDICABLE +JUDICATORIES +JUDICATORY +JUDICATURE +JUDICATURES +JUDICIAL +JUDICIALLY +JUDICIARIES +JUDICIARY +JUDICIOUS +JUDICIOUSLY +JUDICIOUSNESS +JUDICIOUSNESSES +JUDO +JUDOIST +JUDOISTS +JUDOKA +JUDOKAS +JUDOS +JUG +JUGA +JUGAL +JUGATE +JUGFUL +JUGFULS +JUGGED +JUGGERNAUT +JUGGERNAUTS +JUGGING +JUGGLE +JUGGLED +JUGGLER +JUGGLERIES +JUGGLERS +JUGGLERY +JUGGLES +JUGGLING +JUGGLINGS +JUGHEAD +JUGHEADS +JUGS +JUGSFUL +JUGULA +JUGULAR +JUGULARS +JUGULATE +JUGULATED +JUGULATES +JUGULATING +JUGULUM +JUGUM +JUGUMS +JUICE +JUICED +JUICEHEAD +JUICEHEADS +JUICELESS +JUICER +JUICERS +JUICES +JUICIER +JUICIEST +JUICILY +JUICINESS +JUICINESSES +JUICING +JUICY +JUJITSU +JUJITSUS +JUJU +JUJUBE +JUJUBES +JUJUISM +JUJUISMS +JUJUIST +JUJUISTS +JUJUS +JUJUTSU +JUJUTSUS +JUKE +JUKEBOX +JUKEBOXES +JUKED +JUKES +JUKING +JUKU +JUKUS +JULEP +JULEPS +JULIENNE +JULIENNED +JULIENNES +JULIENNING +JUMBAL +JUMBALS +JUMBLE +JUMBLED +JUMBLER +JUMBLERS +JUMBLES +JUMBLING +JUMBO +JUMBOS +JUMBUCK +JUMBUCKS +JUMP +JUMPABLE +JUMPED +JUMPER +JUMPERS +JUMPIER +JUMPIEST +JUMPILY +JUMPINESS +JUMPINESSES +JUMPING +JUMPINGLY +JUMPOFF +JUMPOFFS +JUMPS +JUMPSUIT +JUMPSUITS +JUMPY +JUN +JUNCO +JUNCOES +JUNCOS +JUNCTION +JUNCTIONAL +JUNCTIONS +JUNCTURAL +JUNCTURE +JUNCTURES +JUNGLE +JUNGLED +JUNGLEGYM +JUNGLEGYMS +JUNGLELIKE +JUNGLES +JUNGLIER +JUNGLIEST +JUNGLY +JUNIOR +JUNIORATE +JUNIORATES +JUNIORITIES +JUNIORITY +JUNIORS +JUNIPER +JUNIPERS +JUNK +JUNKED +JUNKER +JUNKERS +JUNKET +JUNKETED +JUNKETEER +JUNKETEERED +JUNKETEERING +JUNKETEERS +JUNKETER +JUNKETERS +JUNKETING +JUNKETS +JUNKIE +JUNKIER +JUNKIES +JUNKIEST +JUNKING +JUNKMAN +JUNKMEN +JUNKS +JUNKY +JUNKYARD +JUNKYARDS +JUNTA +JUNTAS +JUNTO +JUNTOS +JUPE +JUPES +JUPON +JUPONS +JURA +JURAL +JURALLY +JURANT +JURANTS +JURASSIC +JURAT +JURATORY +JURATS +JUREL +JURELS +JURIDIC +JURIDICAL +JURIDICALLY +JURIED +JURIES +JURISCONSULT +JURISCONSULTS +JURISDICTION +JURISDICTIONAL +JURISDICTIONS +JURISPRUDENCE +JURISPRUDENCES +JURISPRUDENT +JURISPRUDENTIAL +JURISPRUDENTS +JURIST +JURISTIC +JURISTICALLY +JURISTS +JUROR +JURORS +JURY +JURYING +JURYLESS +JURYMAN +JURYMEN +JURYWOMAN +JURYWOMEN +JUS +JUSSIVE +JUSSIVES +JUST +JUSTED +JUSTER +JUSTERS +JUSTEST +JUSTICE +JUSTICES +JUSTICIABILITY +JUSTICIABLE +JUSTICIAR +JUSTICIARS +JUSTIFIABILITY +JUSTIFIABLE +JUSTIFIABLY +JUSTIFICATION +JUSTIFICATIONS +JUSTIFICATIVE +JUSTIFICATORY +JUSTIFIED +JUSTIFIER +JUSTIFIERS +JUSTIFIES +JUSTIFY +JUSTIFYING +JUSTING +JUSTLE +JUSTLED +JUSTLES +JUSTLING +JUSTLY +JUSTNESS +JUSTNESSES +JUSTS +JUT +JUTE +JUTELIKE +JUTES +JUTS +JUTTED +JUTTIED +JUTTIES +JUTTING +JUTTINGLY +JUTTY +JUTTYING +JUVENAL +JUVENALS +JUVENESCENCE +JUVENESCENCES +JUVENESCENT +JUVENILE +JUVENILES +JUVENILIA +JUVENILITIES +JUVENILITY +JUXTAPOSE +JUXTAPOSED +JUXTAPOSES +JUXTAPOSING +JUXTAPOSITION +JUXTAPOSITIONAL +JUXTAPOSITIONS +KA +KAAS +KAB +KABAB +KABABS +KABAKA +KABAKAS +KABALA +KABALAS +KABALISM +KABALISMS +KABALIST +KABALISTS +KABAR +KABARS +KABAYA +KABAYAS +KABBALA +KABBALAH +KABBALAHS +KABBALAS +KABBALISM +KABBALISMS +KABBALIST +KABBALISTS +KABELJOU +KABELJOUS +KABIKI +KABIKIS +KABOB +KABOBS +KABS +KABUKI +KABUKIS +KACHINA +KACHINAS +KADDISH +KADDISHES +KADDISHIM +KADI +KADIS +KAE +KAES +KAF +KAFFEEKLATSCH +KAFFEEKLATSCHES +KAFFIR +KAFFIRS +KAFFIYAH +KAFFIYAHS +KAFFIYEH +KAFFIYEHS +KAFIR +KAFIRS +KAFS +KAFTAN +KAFTANS +KAGU +KAGUS +KAHUNA +KAHUNAS +KAIAK +KAIAKS +KAIF +KAIFS +KAIL +KAILS +KAILYARD +KAILYARDS +KAIN +KAINIT +KAINITE +KAINITES +KAINITS +KAINS +KAIROMONE +KAIROMONES +KAISER +KAISERDOM +KAISERDOMS +KAISERIN +KAISERINS +KAISERISM +KAISERISMS +KAISERS +KAJEPUT +KAJEPUTS +KAKA +KAKAPO +KAKAPOS +KAKAS +KAKEMONO +KAKEMONOS +KAKI +KAKIEMON +KAKIEMONS +KAKIS +KALAM +KALAMATA +KALAMATAS +KALAMS +KALANCHOE +KALANCHOES +KALE +KALEIDOSCOPE +KALEIDOSCOPES +KALEIDOSCOPIC +KALENDS +KALES +KALEWIFE +KALEWIVES +KALEYARD +KALEYARDS +KALIAN +KALIANS +KALIF +KALIFATE +KALIFATES +KALIFS +KALIMBA +KALIMBAS +KALIPH +KALIPHATE +KALIPHATES +KALIPHS +KALIUM +KALIUMS +KALLIDIN +KALLIDINS +KALLIKREIN +KALLIKREINS +KALMIA +KALMIAS +KALONG +KALONGS +KALPA +KALPAC +KALPACS +KALPAK +KALPAKS +KALPAS +KALSOMINE +KALSOMINED +KALSOMINES +KALSOMINING +KALYPTRA +KALYPTRAS +KAMAAINA +KAMAAINAS +KAMACITE +KAMACITES +KAMALA +KAMALAS +KAME +KAMES +KAMI +KAMIK +KAMIKAZE +KAMIKAZES +KAMIKS +KAMPONG +KAMPONGS +KAMSEEN +KAMSEENS +KAMSIN +KAMSINS +KANA +KANAKA +KANAKAS +KANAMYCIN +KANAMYCINS +KANAS +KANBAN +KANBANS +KANE +KANES +KANGAROO +KANGAROOS +KANJI +KANJIS +KANTAR +KANTARS +KANTELE +KANTELES +KANZU +KANZUS +KAOLIANG +KAOLIANGS +KAOLIN +KAOLINE +KAOLINES +KAOLINIC +KAOLINITE +KAOLINITES +KAOLINITIC +KAOLINS +KAON +KAONIC +KAONS +KAPA +KAPAS +KAPELLMEISTER +KAPELLMEISTERS +KAPH +KAPHS +KAPOK +KAPOKS +KAPPA +KAPPAS +KAPUT +KAPUTT +KARABINER +KARABINERS +KARAKUL +KARAKULS +KARAOKE +KARAOKES +KARAT +KARATE +KARATEIST +KARATEISTS +KARATES +KARATS +KARMA +KARMAS +KARMIC +KARN +KARNS +KAROO +KAROOS +KAROSS +KAROSSES +KARROO +KARROOS +KARST +KARSTIC +KARSTS +KART +KARTING +KARTINGS +KARTS +KARYOGAMIES +KARYOGAMY +KARYOKINESES +KARYOKINESIS +KARYOKINETIC +KARYOLOGIC +KARYOLOGICAL +KARYOLOGIES +KARYOLOGY +KARYOLYMPH +KARYOLYMPHS +KARYOSOME +KARYOSOMES +KARYOTIN +KARYOTINS +KARYOTYPE +KARYOTYPED +KARYOTYPES +KARYOTYPIC +KARYOTYPICALLY +KARYOTYPING +KAS +KASBAH +KASBAHS +KASHA +KASHAS +KASHER +KASHERED +KASHERING +KASHERS +KASHMIR +KASHMIRS +KASHRUT +KASHRUTH +KASHRUTHS +KASHRUTS +KAT +KATA +KATABATIC +KATAKANA +KATAKANAS +KATAS +KATCHINA +KATCHINAS +KATCINA +KATCINAS +KATHARSES +KATHARSIS +KATHODAL +KATHODE +KATHODES +KATHODIC +KATION +KATIONS +KATS +KATSURA +KATSURAS +KATYDID +KATYDIDS +KATZENJAMMER +KATZENJAMMERS +KAURI +KAURIES +KAURIS +KAURY +KAVA +KAVAKAVA +KAVAKAVAS +KAVAS +KAVASS +KAVASSES +KAY +KAYAK +KAYAKED +KAYAKER +KAYAKERS +KAYAKING +KAYAKINGS +KAYAKS +KAYLES +KAYO +KAYOED +KAYOES +KAYOING +KAYOS +KAYS +KAZACHKI +KAZACHOK +KAZATSKI +KAZATSKIES +KAZATSKY +KAZILLION +KAZILLIONS +KAZOO +KAZOOS +KBAR +KBARS +KEA +KEAS +KEBAB +KEBABS +KEBAR +KEBARS +KEBBIE +KEBBIES +KEBBOCK +KEBBOCKS +KEBBUCK +KEBBUCKS +KEBLAH +KEBLAHS +KEBOB +KEBOBS +KECK +KECKED +KECKING +KECKLE +KECKLED +KECKLES +KECKLING +KECKS +KEDDAH +KEDDAHS +KEDGE +KEDGED +KEDGEREE +KEDGEREES +KEDGES +KEDGING +KEEF +KEEFS +KEEK +KEEKED +KEEKING +KEEKS +KEEL +KEELAGE +KEELAGES +KEELBOAT +KEELBOATS +KEELED +KEELHALE +KEELHALED +KEELHALES +KEELHALING +KEELHAUL +KEELHAULED +KEELHAULING +KEELHAULS +KEELING +KEELLESS +KEELS +KEELSON +KEELSONS +KEEN +KEENED +KEENER +KEENERS +KEENEST +KEENING +KEENLY +KEENNESS +KEENNESSES +KEENS +KEEP +KEEPABLE +KEEPER +KEEPERS +KEEPING +KEEPINGS +KEEPS +KEEPSAKE +KEEPSAKES +KEESHOND +KEESHONDEN +KEESHONDS +KEESTER +KEESTERS +KEET +KEETS +KEEVE +KEEVES +KEF +KEFFIYAH +KEFFIYAHS +KEFFIYEH +KEFFIYEHS +KEFIR +KEFIRS +KEFS +KEG +KEGELER +KEGELERS +KEGGED +KEGGER +KEGGERS +KEGGING +KEGLER +KEGLERS +KEGLING +KEGLINGS +KEGS +KEIR +KEIRETSU +KEIRETSUS +KEIRS +KEISTER +KEISTERS +KEITLOA +KEITLOAS +KELEP +KELEPS +KELIM +KELIMS +KELLIES +KELLY +KELOID +KELOIDAL +KELOIDS +KELP +KELPED +KELPIE +KELPIES +KELPING +KELPS +KELPY +KELSON +KELSONS +KELT +KELTER +KELTERS +KELTS +KELVIN +KELVINS +KEMP +KEMPS +KEMPT +KEN +KENAF +KENAFS +KENCH +KENCHES +KENDO +KENDOS +KENNED +KENNEL +KENNELED +KENNELING +KENNELLED +KENNELLING +KENNELS +KENNING +KENNINGS +KENO +KENOS +KENOSIS +KENOSISES +KENOTIC +KENOTRON +KENOTRONS +KENS +KENSPECKLE +KENT +KENTE +KENTES +KENTLEDGE +KENTLEDGES +KEP +KEPHALIN +KEPHALINS +KEPI +KEPIS +KEPPED +KEPPEN +KEPPING +KEPS +KEPT +KERAMIC +KERAMICS +KERATIN +KERATINIZATION +KERATINIZATIONS +KERATINIZE +KERATINIZED +KERATINIZES +KERATINIZING +KERATINOPHILIC +KERATINOUS +KERATINS +KERATITIDES +KERATITIS +KERATITISES +KERATOID +KERATOMA +KERATOMAS +KERATOMATA +KERATOPLASTIES +KERATOPLASTY +KERATOSE +KERATOSES +KERATOSIC +KERATOSIS +KERATOTIC +KERB +KERBED +KERBING +KERBS +KERCHIEF +KERCHIEFED +KERCHIEFS +KERCHIEVES +KERCHOO +KERF +KERFED +KERFING +KERFLOOEY +KERFS +KERFUFFLE +KERFUFFLES +KERMES +KERMESS +KERMESSE +KERMESSES +KERMIS +KERMISES +KERN +KERNE +KERNED +KERNEL +KERNELED +KERNELING +KERNELLED +KERNELLING +KERNELLY +KERNELS +KERNES +KERNING +KERNITE +KERNITES +KERNS +KEROGEN +KEROGENS +KEROSENE +KEROSENES +KEROSINE +KEROSINES +KERPLUNK +KERPLUNKED +KERPLUNKING +KERPLUNKS +KERRIA +KERRIAS +KERRIES +KERRY +KERSEY +KERSEYMERE +KERSEYMERES +KERSEYS +KERYGMA +KERYGMAS +KERYGMATA +KERYGMATIC +KESTREL +KESTRELS +KETAMINE +KETAMINES +KETCH +KETCHES +KETCHUP +KETCHUPS +KETENE +KETENES +KETO +KETOGENESES +KETOGENESIS +KETOGENIC +KETOL +KETOLS +KETONE +KETONEMIA +KETONEMIAS +KETONES +KETONIC +KETONURIA +KETONURIAS +KETOSE +KETOSES +KETOSIS +KETOSTEROID +KETOSTEROIDS +KETOTIC +KETTLE +KETTLEDRUM +KETTLEDRUMS +KETTLES +KEVEL +KEVELS +KEVIL +KEVILS +KEWPIE +KEWPIES +KEX +KEXES +KEY +KEYBOARD +KEYBOARDED +KEYBOARDER +KEYBOARDERS +KEYBOARDING +KEYBOARDIST +KEYBOARDISTS +KEYBOARDS +KEYBUTTON +KEYBUTTONS +KEYCARD +KEYCARDS +KEYED +KEYHOLE +KEYHOLES +KEYING +KEYLESS +KEYNOTE +KEYNOTED +KEYNOTER +KEYNOTERS +KEYNOTES +KEYNOTING +KEYPAD +KEYPADS +KEYPAL +KEYPALS +KEYPUNCH +KEYPUNCHED +KEYPUNCHER +KEYPUNCHERS +KEYPUNCHES +KEYPUNCHING +KEYS +KEYSET +KEYSETS +KEYSTER +KEYSTERS +KEYSTONE +KEYSTONES +KEYSTROKE +KEYSTROKED +KEYSTROKES +KEYSTROKING +KEYWAY +KEYWAYS +KEYWORD +KEYWORDS +KHADDAR +KHADDARS +KHADI +KHADIS +KHAF +KHAFS +KHAKI +KHAKILIKE +KHAKIS +KHALIF +KHALIFA +KHALIFAS +KHALIFATE +KHALIFATES +KHALIFS +KHAMSEEN +KHAMSEENS +KHAMSIN +KHAMSINS +KHAN +KHANATE +KHANATES +KHANS +KHAPH +KHAPHS +KHAT +KHATS +KHAZEN +KHAZENIM +KHAZENS +KHEDA +KHEDAH +KHEDAHS +KHEDAS +KHEDIVAL +KHEDIVE +KHEDIVES +KHEDIVIAL +KHET +KHETH +KHETHS +KHETS +KHI +KHIRKAH +KHIRKAHS +KHIS +KHOUM +KHOUMS +KI +KIANG +KIANGS +KIAUGH +KIAUGHS +KIBBE +KIBBEH +KIBBEHS +KIBBES +KIBBI +KIBBIS +KIBBITZ +KIBBITZED +KIBBITZER +KIBBITZERS +KIBBITZES +KIBBITZING +KIBBLE +KIBBLED +KIBBLES +KIBBLING +KIBBUTZ +KIBBUTZIM +KIBBUTZNIK +KIBBUTZNIKS +KIBE +KIBEI +KIBEIS +KIBES +KIBITZ +KIBITZED +KIBITZER +KIBITZERS +KIBITZES +KIBITZING +KIBLA +KIBLAH +KIBLAHS +KIBLAS +KIBOSH +KIBOSHED +KIBOSHES +KIBOSHING +KICK +KICKABLE +KICKBACK +KICKBACKS +KICKBALL +KICKBALLS +KICKBOARD +KICKBOARDS +KICKBOX +KICKBOXED +KICKBOXER +KICKBOXERS +KICKBOXES +KICKBOXING +KICKBOXINGS +KICKED +KICKER +KICKERS +KICKIER +KICKIEST +KICKING +KICKOFF +KICKOFFS +KICKS +KICKSHAW +KICKSHAWS +KICKSTAND +KICKSTANDS +KICKSTART +KICKSTARTED +KICKSTARTING +KICKSTARTS +KICKUP +KICKUPS +KICKY +KID +KIDDED +KIDDER +KIDDERS +KIDDIE +KIDDIES +KIDDING +KIDDINGLY +KIDDISH +KIDDO +KIDDOES +KIDDOS +KIDDUSH +KIDDUSHES +KIDDY +KIDLIKE +KIDNAP +KIDNAPED +KIDNAPEE +KIDNAPEES +KIDNAPER +KIDNAPERS +KIDNAPING +KIDNAPPED +KIDNAPPEE +KIDNAPPEES +KIDNAPPER +KIDNAPPERS +KIDNAPPING +KIDNAPS +KIDNEY +KIDNEYS +KIDS +KIDSKIN +KIDSKINS +KIDVID +KIDVIDS +KIEF +KIEFS +KIELBASA +KIELBASAS +KIELBASI +KIELBASY +KIER +KIERS +KIESELGUHR +KIESELGUHRS +KIESELGUR +KIESELGURS +KIESERITE +KIESERITES +KIESTER +KIESTERS +KIF +KIFS +KIKE +KIKES +KILDERKIN +KILDERKINS +KILIM +KILIMS +KILL +KILLABLE +KILLDEE +KILLDEER +KILLDEERS +KILLDEES +KILLED +KILLER +KILLERS +KILLICK +KILLICKS +KILLIE +KILLIES +KILLIFISH +KILLIFISHES +KILLING +KILLINGLY +KILLINGS +KILLJOY +KILLJOYS +KILLOCK +KILLOCKS +KILLS +KILN +KILNED +KILNING +KILNS +KILO +KILOBAR +KILOBARS +KILOBASE +KILOBASES +KILOBAUD +KILOBAUDS +KILOBIT +KILOBITS +KILOBYTE +KILOBYTES +KILOCALORIE +KILOCALORIES +KILOCURIE +KILOCURIES +KILOCYCLE +KILOCYCLES +KILOGAUSS +KILOGAUSSES +KILOGRAM +KILOGRAMS +KILOHERTZ +KILOHERTZES +KILOJOULE +KILOJOULES +KILOLITER +KILOLITERS +KILOLITRE +KILOLITRES +KILOMETER +KILOMETERS +KILOMETRE +KILOMETRES +KILOMOLE +KILOMOLES +KILOPARSEC +KILOPARSECS +KILOPASCAL +KILOPASCALS +KILORAD +KILORADS +KILOS +KILOTON +KILOTONS +KILOVOLT +KILOVOLTS +KILOWATT +KILOWATTS +KILT +KILTED +KILTER +KILTERS +KILTIE +KILTIES +KILTING +KILTINGS +KILTLIKE +KILTS +KILTY +KIMBERLITE +KIMBERLITES +KIMCHEE +KIMCHEES +KIMCHI +KIMCHIS +KIMONO +KIMONOED +KIMONOS +KIN +KINA +KINARA +KINARAS +KINAS +KINASE +KINASES +KIND +KINDER +KINDERGARTEN +KINDERGARTENER +KINDERGARTENERS +KINDERGARTENS +KINDERGARTNER +KINDERGARTNERS +KINDEST +KINDHEARTED +KINDHEARTEDLY +KINDHEARTEDNESS +KINDLE +KINDLED +KINDLER +KINDLERS +KINDLES +KINDLESS +KINDLESSLY +KINDLIER +KINDLIEST +KINDLINESS +KINDLINESSES +KINDLING +KINDLINGS +KINDLY +KINDNESS +KINDNESSES +KINDRED +KINDREDS +KINDS +KINE +KINEMA +KINEMAS +KINEMATIC +KINEMATICAL +KINEMATICALLY +KINEMATICS +KINES +KINESCOPE +KINESCOPED +KINESCOPES +KINESCOPING +KINESES +KINESIC +KINESICS +KINESIOLOGIES +KINESIOLOGY +KINESIS +KINESTHESES +KINESTHESIA +KINESTHESIAS +KINESTHESIS +KINESTHETIC +KINESTHETICALLY +KINETIC +KINETICALLY +KINETICIST +KINETICISTS +KINETICS +KINETIN +KINETINS +KINETOCHORE +KINETOCHORES +KINETOPLAST +KINETOPLASTS +KINETOSCOPE +KINETOSCOPES +KINETOSOME +KINETOSOMES +KINFOLK +KINFOLKS +KING +KINGBIRD +KINGBIRDS +KINGBOLT +KINGBOLTS +KINGCRAFT +KINGCRAFTS +KINGCUP +KINGCUPS +KINGDOM +KINGDOMS +KINGED +KINGFISH +KINGFISHER +KINGFISHERS +KINGFISHES +KINGHOOD +KINGHOODS +KINGING +KINGLESS +KINGLET +KINGLETS +KINGLIER +KINGLIEST +KINGLIKE +KINGLINESS +KINGLINESSES +KINGLY +KINGMAKER +KINGMAKERS +KINGPIN +KINGPINS +KINGPOST +KINGPOSTS +KINGS +KINGSHIP +KINGSHIPS +KINGSIDE +KINGSIDES +KINGSNAKE +KINGSNAKES +KINGWOOD +KINGWOODS +KININ +KININS +KINK +KINKAJOU +KINKAJOUS +KINKED +KINKIER +KINKIEST +KINKILY +KINKINESS +KINKINESSES +KINKING +KINKS +KINKY +KINLESS +KINNIKINNICK +KINNIKINNICKS +KINO +KINOS +KINS +KINSFOLK +KINSHIP +KINSHIPS +KINSMAN +KINSMEN +KINSWOMAN +KINSWOMEN +KIOSK +KIOSKS +KIP +KIPPED +KIPPEN +KIPPER +KIPPERED +KIPPERER +KIPPERERS +KIPPERING +KIPPERS +KIPPING +KIPS +KIPSKIN +KIPSKINS +KIR +KIRIGAMI +KIRIGAMIS +KIRK +KIRKMAN +KIRKMEN +KIRKS +KIRMESS +KIRMESSES +KIRN +KIRNED +KIRNING +KIRNS +KIRS +KIRSCH +KIRSCHES +KIRTLE +KIRTLED +KIRTLES +KIS +KISHKA +KISHKAS +KISHKE +KISHKES +KISMAT +KISMATS +KISMET +KISMETIC +KISMETS +KISS +KISSABLE +KISSABLY +KISSED +KISSER +KISSERS +KISSES +KISSING +KISSY +KIST +KISTFUL +KISTFULS +KISTS +KIT +KITBAG +KITBAGS +KITCHEN +KITCHENET +KITCHENETS +KITCHENETTE +KITCHENETTES +KITCHENS +KITCHENWARE +KITCHENWARES +KITE +KITED +KITELIKE +KITER +KITERS +KITES +KITH +KITHARA +KITHARAS +KITHE +KITHED +KITHES +KITHING +KITHS +KITING +KITLING +KITLINGS +KITS +KITSCH +KITSCHES +KITSCHIFIED +KITSCHIFIES +KITSCHIFY +KITSCHIFYING +KITSCHY +KITTED +KITTEL +KITTEN +KITTENED +KITTENING +KITTENISH +KITTENISHLY +KITTENISHNESS +KITTENISHNESSES +KITTENS +KITTIES +KITTING +KITTIWAKE +KITTIWAKES +KITTLE +KITTLED +KITTLER +KITTLES +KITTLEST +KITTLING +KITTY +KIVA +KIVAS +KIWI +KIWIFRUIT +KIWIFRUITS +KIWIS +KLATCH +KLATCHES +KLATSCH +KLATSCHES +KLAVERN +KLAVERNS +KLAXON +KLAXONS +KLEAGLE +KLEAGLES +KLEBSIELLA +KLEBSIELLAS +KLEENEX +KLEENEXES +KLEPHT +KLEPHTIC +KLEPHTS +KLEPTO +KLEPTOMANIA +KLEPTOMANIAC +KLEPTOMANIACS +KLEPTOMANIAS +KLEPTOS +KLEZMER +KLEZMERS +KLEZMORIM +KLICK +KLICKS +KLIK +KLIKS +KLISTER +KLISTERS +KLONDIKE +KLONDIKES +KLONG +KLONGS +KLOOF +KLOOFS +KLUDGE +KLUDGED +KLUDGES +KLUDGEY +KLUDGIER +KLUDGIEST +KLUDGING +KLUDGY +KLUGE +KLUGED +KLUGES +KLUGING +KLUTZ +KLUTZES +KLUTZIER +KLUTZIEST +KLUTZINESS +KLUTZINESSES +KLUTZY +KLYSTRON +KLYSTRONS +KNACK +KNACKED +KNACKER +KNACKERED +KNACKERIES +KNACKERS +KNACKERY +KNACKING +KNACKS +KNACKWURST +KNACKWURSTS +KNAP +KNAPPED +KNAPPER +KNAPPERS +KNAPPING +KNAPS +KNAPSACK +KNAPSACKED +KNAPSACKS +KNAPWEED +KNAPWEEDS +KNAR +KNARRED +KNARRY +KNARS +KNAUR +KNAURS +KNAVE +KNAVERIES +KNAVERY +KNAVES +KNAVISH +KNAVISHLY +KNAWE +KNAWEL +KNAWELS +KNAWES +KNEAD +KNEADABLE +KNEADED +KNEADER +KNEADERS +KNEADING +KNEADS +KNEE +KNEECAP +KNEECAPPED +KNEECAPPING +KNEECAPPINGS +KNEECAPS +KNEED +KNEEHOLE +KNEEHOLES +KNEEING +KNEEL +KNEELED +KNEELER +KNEELERS +KNEELING +KNEELS +KNEEPAD +KNEEPADS +KNEEPAN +KNEEPANS +KNEEPIECE +KNEEPIECES +KNEES +KNEESIES +KNEESOCK +KNEESOCKS +KNELL +KNELLED +KNELLING +KNELLS +KNELT +KNESSET +KNESSETS +KNEW +KNICKERBOCKER +KNICKERBOCKERS +KNICKERS +KNICKKNACK +KNICKKNACKS +KNIFE +KNIFED +KNIFELIKE +KNIFEPOINT +KNIFEPOINTS +KNIFER +KNIFERS +KNIFES +KNIFING +KNIGHT +KNIGHTED +KNIGHTHOOD +KNIGHTHOODS +KNIGHTING +KNIGHTLINESS +KNIGHTLINESSES +KNIGHTLY +KNIGHTS +KNISH +KNISHES +KNIT +KNITS +KNITTABLE +KNITTED +KNITTER +KNITTERS +KNITTING +KNITTINGS +KNITWEAR +KNIVES +KNOB +KNOBBED +KNOBBIER +KNOBBIEST +KNOBBLIER +KNOBBLIEST +KNOBBLY +KNOBBY +KNOBKERRIE +KNOBKERRIES +KNOBLIKE +KNOBS +KNOCK +KNOCKABOUT +KNOCKABOUTS +KNOCKDOWN +KNOCKDOWNS +KNOCKED +KNOCKER +KNOCKERS +KNOCKING +KNOCKLESS +KNOCKOFF +KNOCKOFFS +KNOCKOUT +KNOCKOUTS +KNOCKS +KNOCKWURST +KNOCKWURSTS +KNOLL +KNOLLED +KNOLLER +KNOLLERS +KNOLLING +KNOLLS +KNOLLY +KNOP +KNOPPED +KNOPS +KNOSP +KNOSPS +KNOT +KNOTGRASS +KNOTGRASSES +KNOTHOLE +KNOTHOLES +KNOTLESS +KNOTLIKE +KNOTS +KNOTTED +KNOTTER +KNOTTERS +KNOTTIER +KNOTTIEST +KNOTTILY +KNOTTINESS +KNOTTINESSES +KNOTTING +KNOTTINGS +KNOTTY +KNOTWEED +KNOTWEEDS +KNOUT +KNOUTED +KNOUTING +KNOUTS +KNOW +KNOWABLE +KNOWER +KNOWERS +KNOWING +KNOWINGER +KNOWINGEST +KNOWINGLY +KNOWINGNESS +KNOWINGNESSES +KNOWINGS +KNOWLEDGE +KNOWLEDGEABLE +KNOWLEDGEABLY +KNOWLEDGES +KNOWN +KNOWNS +KNOWS +KNUBBIER +KNUBBIEST +KNUBBY +KNUCKLE +KNUCKLEBALL +KNUCKLEBALLER +KNUCKLEBALLERS +KNUCKLEBALLS +KNUCKLEBONE +KNUCKLEBONES +KNUCKLED +KNUCKLEHEAD +KNUCKLEHEADED +KNUCKLEHEADS +KNUCKLER +KNUCKLERS +KNUCKLES +KNUCKLIER +KNUCKLIEST +KNUCKLING +KNUCKLY +KNUR +KNURL +KNURLED +KNURLIER +KNURLIEST +KNURLING +KNURLS +KNURLY +KNURS +KOA +KOALA +KOALAS +KOAN +KOANS +KOAS +KOB +KOBO +KOBOLD +KOBOLDS +KOBOS +KOBS +KOEL +KOELS +KOHL +KOHLRABI +KOHLRABIES +KOHLS +KOI +KOINE +KOINES +KOIS +KOJI +KOJIS +KOKANEE +KOKANEES +KOLA +KOLACKY +KOLAS +KOLBASI +KOLBASIS +KOLBASSI +KOLBASSIS +KOLHOZ +KOLHOZES +KOLHOZY +KOLINSKI +KOLINSKIES +KOLINSKY +KOLKHOS +KOLKHOSES +KOLKHOSY +KOLKHOZ +KOLKHOZES +KOLKHOZNIK +KOLKHOZNIKI +KOLKHOZNIKS +KOLKHOZY +KOLKOZ +KOLKOZES +KOLKOZY +KOLO +KOLOS +KOMATIK +KOMATIKS +KOMBU +KOMBUS +KOMONDOR +KOMONDOROCK +KOMONDOROK +KOMONDORS +KONK +KONKED +KONKING +KONKS +KOODOO +KOODOOS +KOOK +KOOKABURRA +KOOKABURRAS +KOOKIE +KOOKIER +KOOKIEST +KOOKINESS +KOOKINESSES +KOOKS +KOOKY +KOP +KOPECK +KOPECKS +KOPEK +KOPEKS +KOPH +KOPHS +KOPIYKA +KOPIYKAS +KOPJE +KOPJES +KOPPA +KOPPAS +KOPPIE +KOPPIES +KOPS +KOR +KORA +KORAI +KORAS +KORAT +KORATS +KORE +KORMA +KORMAS +KORS +KORUN +KORUNA +KORUNAS +KORUNY +KOS +KOSHER +KOSHERED +KOSHERING +KOSHERS +KOSS +KOTO +KOTOS +KOTOW +KOTOWED +KOTOWER +KOTOWERS +KOTOWING +KOTOWS +KOUMIS +KOUMISES +KOUMISS +KOUMISSES +KOUMYS +KOUMYSES +KOUMYSS +KOUMYSSES +KOUPREY +KOUPREYS +KOUROI +KOUROS +KOUSSO +KOUSSOS +KOWTOW +KOWTOWED +KOWTOWER +KOWTOWERS +KOWTOWING +KOWTOWS +KRAAL +KRAALED +KRAALING +KRAALS +KRAFT +KRAFTS +KRAIT +KRAITS +KRAKEN +KRAKENS +KRATER +KRATERS +KRAUT +KRAUTS +KREEP +KREEPS +KREMLIN +KREMLINOLOGIES +KREMLINOLOGIST +KREMLINOLOGISTS +KREMLINOLOGY +KREMLINS +KREPLACH +KREPLECH +KREUTZER +KREUTZERS +KREUZER +KREUZERS +KREWE +KREWES +KRILL +KRILLS +KRIMMER +KRIMMERS +KRIS +KRISES +KRONA +KRONE +KRONEN +KRONER +KRONOR +KRONUR +KROON +KROONI +KROONS +KRUBI +KRUBIS +KRUBUT +KRUBUTS +KRULLER +KRULLERS +KRUMHORN +KRUMHORNS +KRUMKAKE +KRUMKAKES +KRUMMHOLZ +KRUMMHORN +KRUMMHORNS +KRYOLITE +KRYOLITES +KRYOLITH +KRYOLITHS +KRYPTON +KRYPTONS +KUCHEN +KUCHENS +KUDO +KUDOS +KUDU +KUDUS +KUDZU +KUDZUS +KUE +KUES +KUFI +KUFIS +KUGEL +KUGELS +KUKRI +KUKRIS +KULAK +KULAKI +KULAKS +KULTUR +KULTURS +KUMISS +KUMISSES +KUMMEL +KUMMELS +KUMQUAT +KUMQUATS +KUMYS +KUMYSES +KUNA +KUNDALINI +KUNDALINIS +KUNE +KUNZITE +KUNZITES +KURBASH +KURBASHED +KURBASHES +KURBASHING +KURGAN +KURGANS +KURRAJONG +KURRAJONGS +KURTA +KURTAS +KURTOSES +KURTOSIS +KURTOSISES +KURU +KURUS +KUSSO +KUSSOS +KUVASZ +KUVASZOK +KVAS +KVASES +KVASS +KVASSES +KVELL +KVELLED +KVELLING +KVELLS +KVETCH +KVETCHED +KVETCHER +KVETCHERS +KVETCHES +KVETCHIER +KVETCHIEST +KVETCHING +KVETCHY +KWACHA +KWACHAS +KWANZA +KWANZAS +KWASHIORKOR +KWASHIORKORS +KYACK +KYACKS +KYAK +KYAKS +KYANISE +KYANISED +KYANISES +KYANISING +KYANITE +KYANITES +KYANIZE +KYANIZED +KYANIZES +KYANIZING +KYAR +KYARS +KYAT +KYATS +KYBOSH +KYBOSHED +KYBOSHES +KYBOSHING +KYE +KYES +KYLIKES +KYLIX +KYMOGRAM +KYMOGRAMS +KYMOGRAPH +KYMOGRAPHIC +KYMOGRAPHIES +KYMOGRAPHS +KYMOGRAPHY +KYPHOSES +KYPHOSIS +KYPHOTIC +KYRIE +KYRIES +KYTE +KYTES +KYTHE +KYTHED +KYTHES +KYTHING +LA +LAAGER +LAAGERED +LAAGERING +LAAGERS +LAARI +LAB +LABANOTATION +LABANOTATIONS +LABARA +LABARUM +LABARUMS +LABDANUM +LABDANUMS +LABEL +LABELABLE +LABELED +LABELER +LABELERS +LABELING +LABELLA +LABELLATE +LABELLED +LABELLER +LABELLERS +LABELLING +LABELLOID +LABELLUM +LABELS +LABIA +LABIAL +LABIALITIES +LABIALITY +LABIALIZATION +LABIALIZATIONS +LABIALIZE +LABIALIZED +LABIALIZES +LABIALIZING +LABIALLY +LABIALS +LABIATE +LABIATED +LABIATES +LABILE +LABILITIES +LABILITY +LABIODENTAL +LABIODENTALS +LABIOVELAR +LABIOVELARS +LABIUM +LABOR +LABORATORIES +LABORATORY +LABORED +LABOREDLY +LABORER +LABORERS +LABORING +LABORIOUS +LABORIOUSLY +LABORIOUSNESS +LABORIOUSNESSES +LABORITE +LABORITES +LABORS +LABORSAVING +LABOUR +LABOURED +LABOURER +LABOURERS +LABOURING +LABOURS +LABRA +LABRADOR +LABRADORITE +LABRADORITES +LABRADORS +LABRET +LABRETS +LABROID +LABROIDS +LABRUM +LABRUMS +LABRUSCA +LABS +LABURNUM +LABURNUMS +LABYRINTH +LABYRINTHIAN +LABYRINTHINE +LABYRINTHODONT +LABYRINTHODONTS +LABYRINTHS +LAC +LACCOLITH +LACCOLITHIC +LACCOLITHS +LACE +LACED +LACELESS +LACELIKE +LACER +LACERABLE +LACERATE +LACERATED +LACERATES +LACERATING +LACERATION +LACERATIONS +LACERATIVE +LACERS +LACERTID +LACERTIDS +LACES +LACEWING +LACEWINGS +LACEWOOD +LACEWOODS +LACEWORK +LACEWORKS +LACEY +LACHES +LACHRYMAL +LACHRYMALS +LACHRYMATOR +LACHRYMATORS +LACHRYMOSE +LACHRYMOSELY +LACHRYMOSITIES +LACHRYMOSITY +LACIER +LACIEST +LACILY +LACINESS +LACINESSES +LACING +LACINGS +LACINIATE +LACINIATION +LACINIATIONS +LACK +LACKADAISICAL +LACKADAISICALLY +LACKADAY +LACKED +LACKER +LACKERED +LACKERING +LACKERS +LACKEY +LACKEYED +LACKEYING +LACKEYS +LACKING +LACKLUSTER +LACKLUSTERS +LACKS +LACONIC +LACONICALLY +LACONISM +LACONISMS +LACQUER +LACQUERED +LACQUERER +LACQUERERS +LACQUERING +LACQUERS +LACQUERWARE +LACQUERWARES +LACQUERWORK +LACQUERWORKS +LACQUEY +LACQUEYED +LACQUEYING +LACQUEYS +LACRIMAL +LACRIMALS +LACRIMATION +LACRIMATIONS +LACRIMATOR +LACRIMATORS +LACROSSE +LACROSSES +LACS +LACTALBUMIN +LACTALBUMINS +LACTAM +LACTAMS +LACTARY +LACTASE +LACTASES +LACTATE +LACTATED +LACTATES +LACTATING +LACTATION +LACTATIONAL +LACTATIONS +LACTEAL +LACTEALLY +LACTEALS +LACTEAN +LACTEOUS +LACTIC +LACTIFEROUS +LACTOBACILLI +LACTOBACILLUS +LACTOGENIC +LACTOGLOBULIN +LACTOGLOBULINS +LACTONE +LACTONES +LACTONIC +LACTOSE +LACTOSES +LACUNA +LACUNAE +LACUNAL +LACUNAR +LACUNARIA +LACUNARS +LACUNARY +LACUNAS +LACUNATE +LACUNE +LACUNES +LACUNOSE +LACUSTRINE +LACY +LAD +LADANUM +LADANUMS +LADDER +LADDERED +LADDERING +LADDERLIKE +LADDERS +LADDIE +LADDIES +LADDISH +LADE +LADED +LADEN +LADENED +LADENING +LADENS +LADER +LADERS +LADES +LADHOOD +LADHOODS +LADIES +LADING +LADINGS +LADINO +LADINOS +LADLE +LADLED +LADLEFUL +LADLEFULS +LADLER +LADLERS +LADLES +LADLING +LADRON +LADRONE +LADRONES +LADRONS +LADS +LADY +LADYBIRD +LADYBIRDS +LADYBUG +LADYBUGS +LADYFINGER +LADYFINGERS +LADYFISH +LADYFISHES +LADYHOOD +LADYHOODS +LADYISH +LADYKIN +LADYKINS +LADYLIKE +LADYLOVE +LADYLOVES +LADYPALM +LADYPALMS +LADYSHIP +LADYSHIPS +LAETRILE +LAETRILES +LAEVO +LAG +LAGAN +LAGANS +LAGEND +LAGENDS +LAGER +LAGERED +LAGERING +LAGERS +LAGGARD +LAGGARDLY +LAGGARDNESS +LAGGARDNESSES +LAGGARDS +LAGGED +LAGGER +LAGGERS +LAGGING +LAGGINGS +LAGNAPPE +LAGNAPPES +LAGNIAPPE +LAGNIAPPES +LAGOMORPH +LAGOMORPHS +LAGOON +LAGOONAL +LAGOONS +LAGS +LAGUNA +LAGUNAS +LAGUNE +LAGUNES +LAHAR +LAHARS +LAIC +LAICAL +LAICALLY +LAICH +LAICHS +LAICISE +LAICISED +LAICISES +LAICISING +LAICISM +LAICISMS +LAICIZATION +LAICIZATIONS +LAICIZE +LAICIZED +LAICIZES +LAICIZING +LAICS +LAID +LAIGH +LAIGHS +LAIN +LAIR +LAIRD +LAIRDLY +LAIRDS +LAIRDSHIP +LAIRDSHIPS +LAIRED +LAIRING +LAIRS +LAITANCE +LAITANCES +LAITH +LAITHLY +LAITIES +LAITY +LAKE +LAKEBED +LAKEBEDS +LAKED +LAKEFRONT +LAKEFRONTS +LAKELIKE +LAKEPORT +LAKEPORTS +LAKER +LAKERS +LAKES +LAKESHORE +LAKESHORES +LAKESIDE +LAKESIDES +LAKH +LAKHS +LAKIER +LAKIEST +LAKING +LAKINGS +LAKY +LALIQUE +LALIQUES +LALL +LALLAN +LALLAND +LALLANDS +LALLANS +LALLATION +LALLATIONS +LALLED +LALLING +LALLS +LALLYGAG +LALLYGAGGED +LALLYGAGGING +LALLYGAGS +LAM +LAMA +LAMAS +LAMASERIES +LAMASERY +LAMB +LAMBADA +LAMBADAS +LAMBAST +LAMBASTE +LAMBASTED +LAMBASTES +LAMBASTING +LAMBASTS +LAMBDA +LAMBDAS +LAMBDOID +LAMBED +LAMBENCIES +LAMBENCY +LAMBENT +LAMBENTLY +LAMBER +LAMBERS +LAMBERT +LAMBERTS +LAMBIE +LAMBIER +LAMBIES +LAMBIEST +LAMBING +LAMBKILL +LAMBKILLS +LAMBKIN +LAMBKINS +LAMBLIKE +LAMBREQUIN +LAMBREQUINS +LAMBRUSCO +LAMBRUSCOS +LAMBS +LAMBSKIN +LAMBSKINS +LAMBY +LAME +LAMEBRAIN +LAMEBRAINED +LAMEBRAINS +LAMED +LAMEDH +LAMEDHS +LAMEDS +LAMELLA +LAMELLAE +LAMELLAR +LAMELLAS +LAMELLATE +LAMELLATELY +LAMELLIBRANCH +LAMELLIBRANCHS +LAMELLICORN +LAMELLICORNS +LAMELLIFORM +LAMELLOSE +LAMELY +LAMENESS +LAMENESSES +LAMENT +LAMENTABLE +LAMENTABLENESS +LAMENTABLY +LAMENTATION +LAMENTATIONS +LAMENTED +LAMENTEDLY +LAMENTER +LAMENTERS +LAMENTING +LAMENTS +LAMER +LAMES +LAMEST +LAMIA +LAMIAE +LAMIAS +LAMINA +LAMINABLE +LAMINAE +LAMINAL +LAMINALS +LAMINAR +LAMINARIA +LAMINARIAN +LAMINARIANS +LAMINARIAS +LAMINARIN +LAMINARINS +LAMINARY +LAMINAS +LAMINATE +LAMINATED +LAMINATES +LAMINATING +LAMINATION +LAMINATIONS +LAMINATOR +LAMINATORS +LAMING +LAMININ +LAMININS +LAMINITIS +LAMINITISES +LAMINOSE +LAMINOUS +LAMISTER +LAMISTERS +LAMMED +LAMMERGEIER +LAMMERGEIERS +LAMMERGEYER +LAMMERGEYERS +LAMMING +LAMP +LAMPAD +LAMPADS +LAMPAS +LAMPASES +LAMPBLACK +LAMPBLACKS +LAMPED +LAMPERS +LAMPERSES +LAMPING +LAMPION +LAMPIONS +LAMPLIGHT +LAMPLIGHTER +LAMPLIGHTERS +LAMPLIGHTS +LAMPOON +LAMPOONED +LAMPOONER +LAMPOONERIES +LAMPOONERS +LAMPOONERY +LAMPOONING +LAMPOONS +LAMPPOST +LAMPPOSTS +LAMPREY +LAMPREYS +LAMPS +LAMPSHADE +LAMPSHADES +LAMPSHELL +LAMPSHELLS +LAMPYRID +LAMPYRIDS +LAMS +LAMSTER +LAMSTERS +LANAI +LANAIS +LANATE +LANATED +LANCE +LANCED +LANCELET +LANCELETS +LANCEOLATE +LANCER +LANCERS +LANCES +LANCET +LANCETED +LANCETS +LANCEWOOD +LANCEWOODS +LANCIERS +LANCIFORM +LANCINATE +LANCINATED +LANCINATES +LANCINATING +LANCING +LAND +LANDAU +LANDAULET +LANDAULETS +LANDAUS +LANDED +LANDER +LANDERS +LANDFALL +LANDFALLS +LANDFILL +LANDFILLED +LANDFILLING +LANDFILLS +LANDFORM +LANDFORMS +LANDGRAB +LANDGRABS +LANDGRAVE +LANDGRAVES +LANDHOLDER +LANDHOLDERS +LANDHOLDING +LANDHOLDINGS +LANDING +LANDINGS +LANDLADIES +LANDLADY +LANDLER +LANDLERS +LANDLESS +LANDLESSNESS +LANDLESSNESSES +LANDLINE +LANDLINES +LANDLOCKED +LANDLOPER +LANDLOPERS +LANDLORD +LANDLORDISM +LANDLORDISMS +LANDLORDS +LANDLUBBER +LANDLUBBERLY +LANDLUBBERS +LANDLUBBING +LANDMAN +LANDMARK +LANDMARKED +LANDMARKING +LANDMARKS +LANDMASS +LANDMASSES +LANDMEN +LANDOWNER +LANDOWNERS +LANDOWNERSHIP +LANDOWNERSHIPS +LANDOWNING +LANDOWNINGS +LANDS +LANDSCAPE +LANDSCAPED +LANDSCAPER +LANDSCAPERS +LANDSCAPES +LANDSCAPING +LANDSCAPIST +LANDSCAPISTS +LANDSIDE +LANDSIDES +LANDSKIP +LANDSKIPS +LANDSLEIT +LANDSLID +LANDSLIDDEN +LANDSLIDE +LANDSLIDES +LANDSLIDING +LANDSLIP +LANDSLIPS +LANDSMAN +LANDSMEN +LANDWARD +LANDWARDS +LANE +LANELY +LANES +LANEWAY +LANEWAYS +LANG +LANGBEINITE +LANGBEINITES +LANGLAUF +LANGLAUFER +LANGLAUFERS +LANGLAUFS +LANGLEY +LANGLEYS +LANGOSTINO +LANGOSTINOS +LANGOUSTE +LANGOUSTES +LANGOUSTINE +LANGOUSTINES +LANGRAGE +LANGRAGES +LANGREL +LANGRELS +LANGRIDGE +LANGRIDGES +LANGSHAN +LANGSHANS +LANGSYNE +LANGSYNES +LANGUAGE +LANGUAGES +LANGUE +LANGUES +LANGUET +LANGUETS +LANGUETTE +LANGUETTES +LANGUID +LANGUIDLY +LANGUIDNESS +LANGUIDNESSES +LANGUISH +LANGUISHED +LANGUISHER +LANGUISHERS +LANGUISHES +LANGUISHING +LANGUISHINGLY +LANGUISHMENT +LANGUISHMENTS +LANGUOR +LANGUOROUS +LANGUOROUSLY +LANGUORS +LANGUR +LANGURS +LANIARD +LANIARDS +LANIARIES +LANIARY +LANITAL +LANITALS +LANK +LANKER +LANKEST +LANKIER +LANKIEST +LANKILY +LANKINESS +LANKINESSES +LANKLY +LANKNESS +LANKNESSES +LANKY +LANNER +LANNERET +LANNERETS +LANNERS +LANOLIN +LANOLINE +LANOLINES +LANOLINS +LANOSE +LANOSITIES +LANOSITY +LANTANA +LANTANAS +LANTERN +LANTERNS +LANTHANIDE +LANTHANIDES +LANTHANON +LANTHANONS +LANTHANUM +LANTHANUMS +LANTHORN +LANTHORNS +LANUGINOUS +LANUGO +LANUGOS +LANYARD +LANYARDS +LAOGAI +LAOGAIS +LAP +LAPAROSCOPE +LAPAROSCOPES +LAPAROSCOPIC +LAPAROSCOPIES +LAPAROSCOPIST +LAPAROSCOPISTS +LAPAROSCOPY +LAPAROTOMIES +LAPAROTOMY +LAPBOARD +LAPBOARDS +LAPDOG +LAPDOGS +LAPEL +LAPELED +LAPELLED +LAPELS +LAPFUL +LAPFULS +LAPIDARIAN +LAPIDARIES +LAPIDARY +LAPIDATE +LAPIDATED +LAPIDATES +LAPIDATING +LAPIDES +LAPIDIFIED +LAPIDIFIES +LAPIDIFY +LAPIDIFYING +LAPIDIST +LAPIDISTS +LAPILLI +LAPILLUS +LAPIN +LAPINS +LAPIS +LAPISES +LAPPED +LAPPER +LAPPERED +LAPPERING +LAPPERS +LAPPET +LAPPETED +LAPPETS +LAPPING +LAPS +LAPSABLE +LAPSE +LAPSED +LAPSER +LAPSERS +LAPSES +LAPSIBLE +LAPSING +LAPSTRAKE +LAPSTREAK +LAPSUS +LAPTOP +LAPTOPS +LAPWING +LAPWINGS +LAR +LARBOARD +LARBOARDS +LARCENER +LARCENERS +LARCENIES +LARCENIST +LARCENISTS +LARCENOUS +LARCENOUSLY +LARCENY +LARCH +LARCHEN +LARCHES +LARD +LARDED +LARDER +LARDERS +LARDIER +LARDIEST +LARDING +LARDLIKE +LARDON +LARDONS +LARDOON +LARDOONS +LARDS +LARDY +LAREE +LAREES +LARES +LARGANDO +LARGE +LARGEHEARTED +LARGELY +LARGEMOUTH +LARGEMOUTHS +LARGENESS +LARGENESSES +LARGER +LARGES +LARGESS +LARGESSE +LARGESSES +LARGEST +LARGHETTO +LARGHETTOS +LARGISH +LARGO +LARGOS +LARI +LARIAT +LARIATED +LARIATING +LARIATS +LARINE +LARIS +LARK +LARKED +LARKER +LARKERS +LARKIER +LARKIEST +LARKINESS +LARKINESSES +LARKING +LARKISH +LARKS +LARKSOME +LARKSPUR +LARKSPURS +LARKY +LARRIGAN +LARRIGANS +LARRIKIN +LARRIKINS +LARRUP +LARRUPED +LARRUPER +LARRUPERS +LARRUPING +LARRUPS +LARS +LARUM +LARUMS +LARVA +LARVAE +LARVAL +LARVAS +LARVICIDAL +LARVICIDE +LARVICIDES +LARYNGAL +LARYNGALS +LARYNGEAL +LARYNGEALS +LARYNGECTOMEE +LARYNGECTOMEES +LARYNGECTOMIES +LARYNGECTOMIZED +LARYNGECTOMY +LARYNGES +LARYNGITIC +LARYNGITIS +LARYNGITISES +LARYNGOLOGIES +LARYNGOLOGY +LARYNGOSCOPE +LARYNGOSCOPES +LARYNGOSCOPIES +LARYNGOSCOPY +LARYNX +LARYNXES +LAS +LASAGNA +LASAGNAS +LASAGNE +LASAGNES +LASCAR +LASCARS +LASCIVIOUS +LASCIVIOUSLY +LASCIVIOUSNESS +LASE +LASED +LASER +LASERDISC +LASERDISCS +LASERDISK +LASERDISKS +LASERS +LASES +LASH +LASHED +LASHER +LASHERS +LASHES +LASHING +LASHINGS +LASHINS +LASHKAR +LASHKARS +LASING +LASS +LASSES +LASSI +LASSIE +LASSIES +LASSIS +LASSITUDE +LASSITUDES +LASSO +LASSOED +LASSOER +LASSOERS +LASSOES +LASSOING +LASSOS +LAST +LASTBORN +LASTBORNS +LASTED +LASTER +LASTERS +LASTING +LASTINGLY +LASTINGNESS +LASTINGNESSES +LASTINGS +LASTLY +LASTS +LAT +LATAKIA +LATAKIAS +LATCH +LATCHED +LATCHES +LATCHET +LATCHETS +LATCHING +LATCHKEY +LATCHKEYS +LATCHSTRING +LATCHSTRINGS +LATE +LATECOMER +LATECOMERS +LATED +LATEEN +LATEENER +LATEENERS +LATEENS +LATELY +LATEN +LATENCIES +LATENCY +LATENED +LATENESS +LATENESSES +LATENING +LATENS +LATENSIFICATION +LATENT +LATENTLY +LATENTS +LATER +LATERAD +LATERAL +LATERALED +LATERALING +LATERALIZATION +LATERALIZATIONS +LATERALIZE +LATERALIZED +LATERALIZES +LATERALIZING +LATERALLED +LATERALLING +LATERALLY +LATERALS +LATERBORN +LATERBORNS +LATERITE +LATERITES +LATERITIC +LATERIZATION +LATERIZATIONS +LATERIZE +LATERIZED +LATERIZES +LATERIZING +LATEST +LATESTS +LATEWOOD +LATEWOODS +LATEX +LATEXES +LATH +LATHE +LATHED +LATHER +LATHERED +LATHERER +LATHERERS +LATHERING +LATHERS +LATHERY +LATHES +LATHI +LATHIER +LATHIEST +LATHING +LATHINGS +LATHIS +LATHS +LATHWORK +LATHWORKS +LATHY +LATHYRISM +LATHYRISMS +LATHYRITIC +LATI +LATICES +LATICIFER +LATICIFERS +LATIFUNDIA +LATIFUNDIO +LATIFUNDIOS +LATIFUNDIUM +LATIGO +LATIGOES +LATIGOS +LATILLA +LATILLAS +LATIMERIA +LATIMERIAS +LATINA +LATINAS +LATINITIES +LATINITY +LATINIZATION +LATINIZATIONS +LATINIZE +LATINIZED +LATINIZES +LATINIZING +LATINO +LATINOS +LATISH +LATITUDE +LATITUDES +LATITUDINAL +LATITUDINALLY +LATITUDINARIAN +LATITUDINARIANS +LATKE +LATKES +LATOSOL +LATOSOLIC +LATOSOLS +LATRIA +LATRIAS +LATRINE +LATRINES +LATS +LATTE +LATTEN +LATTENS +LATTER +LATTERLY +LATTES +LATTICE +LATTICED +LATTICES +LATTICEWORK +LATTICEWORKS +LATTICING +LATTICINGS +LATTIN +LATTINS +LATU +LAUAN +LAUANS +LAUD +LAUDABLE +LAUDABLENESS +LAUDABLENESSES +LAUDABLY +LAUDANUM +LAUDANUMS +LAUDATION +LAUDATIONS +LAUDATIVE +LAUDATOR +LAUDATORS +LAUDATORY +LAUDED +LAUDER +LAUDERS +LAUDING +LAUDS +LAUGH +LAUGHABLE +LAUGHABLENESS +LAUGHABLENESSES +LAUGHABLY +LAUGHED +LAUGHER +LAUGHERS +LAUGHING +LAUGHINGLY +LAUGHINGS +LAUGHINGSTOCK +LAUGHINGSTOCKS +LAUGHLINE +LAUGHLINES +LAUGHS +LAUGHTER +LAUGHTERS +LAUNCE +LAUNCES +LAUNCH +LAUNCHED +LAUNCHER +LAUNCHERS +LAUNCHES +LAUNCHING +LAUNCHPAD +LAUNCHPADS +LAUNDER +LAUNDERED +LAUNDERER +LAUNDERERS +LAUNDERETTE +LAUNDERETTES +LAUNDERING +LAUNDERS +LAUNDRESS +LAUNDRESSES +LAUNDRETTE +LAUNDRETTES +LAUNDRIES +LAUNDRY +LAUNDRYMAN +LAUNDRYMEN +LAURA +LAURAE +LAURAS +LAUREATE +LAUREATED +LAUREATES +LAUREATESHIP +LAUREATESHIPS +LAUREATING +LAUREATION +LAUREATIONS +LAUREL +LAURELED +LAURELING +LAURELLED +LAURELLING +LAURELS +LAUWINE +LAUWINES +LAV +LAVA +LAVABO +LAVABOES +LAVABOS +LAVAGE +LAVAGES +LAVALAVA +LAVALAVAS +LAVALIER +LAVALIERE +LAVALIERES +LAVALIERS +LAVALIKE +LAVALLIERE +LAVALLIERES +LAVAS +LAVASH +LAVASHES +LAVATION +LAVATIONS +LAVATORIES +LAVATORY +LAVE +LAVED +LAVEER +LAVEERED +LAVEERING +LAVEERS +LAVENDER +LAVENDERED +LAVENDERING +LAVENDERS +LAVER +LAVEROCK +LAVEROCKS +LAVERS +LAVES +LAVING +LAVISH +LAVISHED +LAVISHER +LAVISHERS +LAVISHES +LAVISHEST +LAVISHING +LAVISHLY +LAVISHNESS +LAVISHNESSES +LAVROCK +LAVROCKS +LAVS +LAW +LAWBOOK +LAWBOOKS +LAWBREAKER +LAWBREAKERS +LAWBREAKING +LAWBREAKINGS +LAWED +LAWFUL +LAWFULLY +LAWFULNESS +LAWFULNESSES +LAWGIVER +LAWGIVERS +LAWGIVING +LAWGIVINGS +LAWINE +LAWINES +LAWING +LAWINGS +LAWLESS +LAWLESSLY +LAWLESSNESS +LAWLESSNESSES +LAWLIKE +LAWMAKER +LAWMAKERS +LAWMAKING +LAWMAKINGS +LAWMAN +LAWMEN +LAWN +LAWNMOWER +LAWNMOWERS +LAWNS +LAWNY +LAWRENCIUM +LAWRENCIUMS +LAWS +LAWSUIT +LAWSUITS +LAWYER +LAWYERED +LAWYERING +LAWYERINGS +LAWYERLIKE +LAWYERLY +LAWYERS +LAX +LAXATION +LAXATIONS +LAXATIVE +LAXATIVES +LAXER +LAXES +LAXEST +LAXITIES +LAXITY +LAXLY +LAXNESS +LAXNESSES +LAY +LAYABOUT +LAYABOUTS +LAYAWAY +LAYAWAYS +LAYED +LAYER +LAYERAGE +LAYERAGES +LAYERED +LAYERING +LAYERINGS +LAYERS +LAYETTE +LAYETTES +LAYIN +LAYING +LAYINS +LAYMAN +LAYMEN +LAYOFF +LAYOFFS +LAYOUT +LAYOUTS +LAYOVER +LAYOVERS +LAYPEOPLE +LAYPERSON +LAYPERSONS +LAYS +LAYUP +LAYUPS +LAYWOMAN +LAYWOMEN +LAZAR +LAZARET +LAZARETS +LAZARETTE +LAZARETTES +LAZARETTO +LAZARETTOS +LAZARS +LAZE +LAZED +LAZES +LAZIED +LAZIER +LAZIES +LAZIEST +LAZILY +LAZINESS +LAZINESSES +LAZING +LAZULI +LAZULIS +LAZULITE +LAZULITES +LAZURITE +LAZURITES +LAZY +LAZYBONES +LAZYING +LAZYISH +LAZZARONE +LAZZARONI +LEA +LEACH +LEACHABILITIES +LEACHABILITY +LEACHABLE +LEACHATE +LEACHATES +LEACHED +LEACHER +LEACHERS +LEACHES +LEACHIER +LEACHIEST +LEACHING +LEACHY +LEAD +LEADED +LEADEN +LEADENED +LEADENING +LEADENLY +LEADENNESS +LEADENNESSES +LEADENS +LEADER +LEADERBOARD +LEADERBOARDS +LEADERLESS +LEADERS +LEADERSHIP +LEADERSHIPS +LEADIER +LEADIEST +LEADING +LEADINGS +LEADLESS +LEADMAN +LEADMEN +LEADOFF +LEADOFFS +LEADPLANT +LEADPLANTS +LEADS +LEADSCREW +LEADSCREWS +LEADSMAN +LEADSMEN +LEADWORK +LEADWORKS +LEADWORT +LEADWORTS +LEADY +LEAF +LEAFAGE +LEAFAGES +LEAFED +LEAFHOPPER +LEAFHOPPERS +LEAFIER +LEAFIEST +LEAFINESS +LEAFINESSES +LEAFING +LEAFLESS +LEAFLET +LEAFLETED +LEAFLETEER +LEAFLETEERS +LEAFLETER +LEAFLETERS +LEAFLETING +LEAFLETS +LEAFLETTED +LEAFLETTING +LEAFLIKE +LEAFS +LEAFSTALK +LEAFSTALKS +LEAFWORM +LEAFWORMS +LEAFY +LEAGUE +LEAGUED +LEAGUER +LEAGUERED +LEAGUERING +LEAGUERS +LEAGUES +LEAGUING +LEAK +LEAKAGE +LEAKAGES +LEAKED +LEAKER +LEAKERS +LEAKIER +LEAKIEST +LEAKILY +LEAKINESS +LEAKINESSES +LEAKING +LEAKLESS +LEAKPROOF +LEAKS +LEAKY +LEAL +LEALLY +LEALTIES +LEALTY +LEAN +LEANED +LEANER +LEANERS +LEANEST +LEANING +LEANINGS +LEANLY +LEANNESS +LEANNESSES +LEANS +LEANT +LEAP +LEAPED +LEAPER +LEAPERS +LEAPFROG +LEAPFROGGED +LEAPFROGGING +LEAPFROGS +LEAPING +LEAPS +LEAPT +LEAR +LEARIER +LEARIEST +LEARN +LEARNABLE +LEARNED +LEARNEDLY +LEARNEDNESS +LEARNEDNESSES +LEARNER +LEARNERS +LEARNING +LEARNINGS +LEARNS +LEARNT +LEARS +LEARY +LEAS +LEASABLE +LEASE +LEASEBACK +LEASEBACKS +LEASED +LEASEHOLD +LEASEHOLDER +LEASEHOLDERS +LEASEHOLDS +LEASER +LEASERS +LEASES +LEASH +LEASHED +LEASHES +LEASHING +LEASING +LEASINGS +LEAST +LEASTS +LEASTWAYS +LEASTWISE +LEATHER +LEATHERBACK +LEATHERBACKS +LEATHERED +LEATHERETTE +LEATHERETTES +LEATHERING +LEATHERLEAF +LEATHERLEAVES +LEATHERLIKE +LEATHERN +LEATHERNECK +LEATHERNECKS +LEATHERS +LEATHERWOOD +LEATHERWOODS +LEATHERY +LEAVE +LEAVED +LEAVEN +LEAVENED +LEAVENING +LEAVENINGS +LEAVENS +LEAVER +LEAVERS +LEAVES +LEAVIER +LEAVIEST +LEAVING +LEAVINGS +LEAVY +LEBEN +LEBENS +LEBENSRAUM +LEBENSRAUMS +LEBKUCHEN +LECH +LECHAYIM +LECHAYIMS +LECHED +LECHER +LECHERED +LECHERIES +LECHERING +LECHEROUS +LECHEROUSLY +LECHEROUSNESS +LECHEROUSNESSES +LECHERS +LECHERY +LECHES +LECHING +LECHWE +LECHWES +LECITHIN +LECITHINASE +LECITHINASES +LECITHINS +LECTERN +LECTERNS +LECTIN +LECTINS +LECTION +LECTIONARIES +LECTIONARY +LECTIONS +LECTOR +LECTORS +LECTOTYPE +LECTOTYPES +LECTURE +LECTURED +LECTURER +LECTURERS +LECTURES +LECTURESHIP +LECTURESHIPS +LECTURING +LECYTHI +LECYTHIS +LECYTHUS +LED +LEDERHOSEN +LEDGE +LEDGER +LEDGERS +LEDGES +LEDGIER +LEDGIEST +LEDGY +LEE +LEEBOARD +LEEBOARDS +LEECH +LEECHED +LEECHES +LEECHING +LEECHLIKE +LEEK +LEEKS +LEER +LEERED +LEERIER +LEERIEST +LEERILY +LEERINESS +LEERINESSES +LEERING +LEERINGLY +LEERS +LEERY +LEES +LEET +LEETS +LEEWARD +LEEWARDLY +LEEWARDS +LEEWAY +LEEWAYS +LEFT +LEFTER +LEFTEST +LEFTIES +LEFTISH +LEFTISM +LEFTISMS +LEFTIST +LEFTISTS +LEFTMOST +LEFTMOSTS +LEFTOVER +LEFTOVERS +LEFTS +LEFTWARD +LEFTWARDS +LEFTWING +LEFTY +LEG +LEGACIES +LEGACY +LEGAL +LEGALESE +LEGALESES +LEGALISE +LEGALISED +LEGALISES +LEGALISING +LEGALISM +LEGALISMS +LEGALIST +LEGALISTIC +LEGALISTICALLY +LEGALISTS +LEGALITIES +LEGALITY +LEGALIZATION +LEGALIZATIONS +LEGALIZE +LEGALIZED +LEGALIZER +LEGALIZERS +LEGALIZES +LEGALIZING +LEGALLY +LEGALS +LEGATE +LEGATED +LEGATEE +LEGATEES +LEGATES +LEGATESHIP +LEGATESHIPS +LEGATINE +LEGATING +LEGATION +LEGATIONS +LEGATO +LEGATOR +LEGATORS +LEGATOS +LEGEND +LEGENDARIES +LEGENDARILY +LEGENDARY +LEGENDIZE +LEGENDIZED +LEGENDIZES +LEGENDIZING +LEGENDRIES +LEGENDRY +LEGENDS +LEGER +LEGERDEMAIN +LEGERDEMAINS +LEGERITIES +LEGERITY +LEGERS +LEGES +LEGGED +LEGGIER +LEGGIERO +LEGGIEST +LEGGIN +LEGGINESS +LEGGINESSES +LEGGING +LEGGINGS +LEGGINS +LEGGY +LEGHORN +LEGHORNS +LEGIBILITIES +LEGIBILITY +LEGIBLE +LEGIBLY +LEGION +LEGIONARIES +LEGIONARY +LEGIONNAIRE +LEGIONNAIRES +LEGIONS +LEGISLATE +LEGISLATED +LEGISLATES +LEGISLATING +LEGISLATION +LEGISLATIONS +LEGISLATIVE +LEGISLATIVELY +LEGISLATIVES +LEGISLATOR +LEGISLATORIAL +LEGISLATORS +LEGISLATORSHIP +LEGISLATORSHIPS +LEGISLATURE +LEGISLATURES +LEGIST +LEGISTS +LEGIT +LEGITIMACIES +LEGITIMACY +LEGITIMATE +LEGITIMATED +LEGITIMATELY +LEGITIMATES +LEGITIMATING +LEGITIMATION +LEGITIMATIONS +LEGITIMATIZE +LEGITIMATIZED +LEGITIMATIZES +LEGITIMATIZING +LEGITIMATOR +LEGITIMATORS +LEGITIMISE +LEGITIMISED +LEGITIMISES +LEGITIMISING +LEGITIMISM +LEGITIMISMS +LEGITIMIST +LEGITIMISTS +LEGITIMIZATION +LEGITIMIZATIONS +LEGITIMIZE +LEGITIMIZED +LEGITIMIZER +LEGITIMIZERS +LEGITIMIZES +LEGITIMIZING +LEGITS +LEGLESS +LEGLIKE +LEGMAN +LEGMEN +LEGONG +LEGONGS +LEGROOM +LEGROOMS +LEGS +LEGUME +LEGUMES +LEGUMIN +LEGUMINOUS +LEGUMINS +LEGWARMER +LEGWARMERS +LEGWORK +LEGWORKS +LEHAYIM +LEHAYIMS +LEHR +LEHRS +LEHUA +LEHUAS +LEI +LEIOMYOMA +LEIOMYOMAS +LEIOMYOMATA +LEIS +LEISHMANIA +LEISHMANIAL +LEISHMANIAS +LEISHMANIASES +LEISHMANIASIS +LEISTER +LEISTERED +LEISTERING +LEISTERS +LEISURE +LEISURED +LEISURELINESS +LEISURELINESSES +LEISURELY +LEISURES +LEITMOTIF +LEITMOTIFS +LEITMOTIV +LEITMOTIVS +LEK +LEKE +LEKKED +LEKKING +LEKS +LEKU +LEKVAR +LEKVARS +LEKYTHI +LEKYTHOI +LEKYTHOS +LEKYTHUS +LEMAN +LEMANS +LEMMA +LEMMAS +LEMMATA +LEMMATIZE +LEMMATIZED +LEMMATIZES +LEMMATIZING +LEMMING +LEMMINGLIKE +LEMMINGS +LEMNISCAL +LEMNISCATE +LEMNISCATES +LEMNISCI +LEMNISCUS +LEMON +LEMONADE +LEMONADES +LEMONGRASS +LEMONGRASSES +LEMONISH +LEMONLIKE +LEMONS +LEMONY +LEMPIRA +LEMPIRAS +LEMUR +LEMURES +LEMURINE +LEMURLIKE +LEMUROID +LEMUROIDS +LEMURS +LEND +LENDABLE +LENDER +LENDERS +LENDING +LENDS +LENES +LENGTH +LENGTHEN +LENGTHENED +LENGTHENER +LENGTHENERS +LENGTHENING +LENGTHENS +LENGTHIER +LENGTHIEST +LENGTHILY +LENGTHINESS +LENGTHINESSES +LENGTHS +LENGTHWAYS +LENGTHWISE +LENGTHY +LENIENCE +LENIENCES +LENIENCIES +LENIENCY +LENIENT +LENIENTLY +LENIS +LENITE +LENITED +LENITES +LENITIES +LENITING +LENITION +LENITIONS +LENITIVE +LENITIVELY +LENITIVES +LENITY +LENO +LENOS +LENS +LENSE +LENSED +LENSES +LENSING +LENSLESS +LENSMAN +LENSMEN +LENT +LENTAMENTE +LENTANDO +LENTEN +LENTIC +LENTICEL +LENTICELS +LENTICULAR +LENTICULE +LENTICULES +LENTIGINES +LENTIGO +LENTIL +LENTILS +LENTISK +LENTISKS +LENTISSIMO +LENTIVIRUS +LENTIVIRUSES +LENTO +LENTOID +LENTOIDS +LENTOS +LEONE +LEONES +LEONINE +LEOPARD +LEOPARDESS +LEOPARDESSES +LEOPARDS +LEOTARD +LEOTARDED +LEOTARDS +LEPER +LEPERS +LEPIDOLITE +LEPIDOLITES +LEPIDOPTERA +LEPIDOPTERAN +LEPIDOPTERANS +LEPIDOPTERIST +LEPIDOPTERISTS +LEPIDOPTEROLOGY +LEPIDOPTEROUS +LEPIDOTE +LEPIDOTES +LEPORID +LEPORIDAE +LEPORIDS +LEPORINE +LEPRECHAUN +LEPRECHAUNISH +LEPRECHAUNS +LEPROMATOUS +LEPROSARIA +LEPROSARIUM +LEPROSARIUMS +LEPROSE +LEPROSIES +LEPROSY +LEPROTIC +LEPROUS +LEPROUSLY +LEPT +LEPTA +LEPTIN +LEPTINS +LEPTOCEPHALI +LEPTOCEPHALUS +LEPTON +LEPTONIC +LEPTONS +LEPTOPHOS +LEPTOPHOSES +LEPTOSOME +LEPTOSOMES +LEPTOSPIRAL +LEPTOSPIRE +LEPTOSPIRES +LEPTOSPIROSES +LEPTOSPIROSIS +LEPTOTENE +LEPTOTENES +LES +LESBIAN +LESBIANISM +LESBIANISMS +LESBIANS +LESBO +LESBOS +LESES +LESION +LESIONED +LESIONING +LESIONS +LESPEDEZA +LESPEDEZAS +LESS +LESSEE +LESSEES +LESSEN +LESSENED +LESSENING +LESSENS +LESSER +LESSON +LESSONED +LESSONING +LESSONS +LESSOR +LESSORS +LEST +LET +LETCH +LETCHED +LETCHES +LETCHING +LETDOWN +LETDOWNS +LETHAL +LETHALITIES +LETHALITY +LETHALLY +LETHALS +LETHARGIC +LETHARGICALLY +LETHARGIES +LETHARGY +LETHE +LETHEAN +LETHES +LETS +LETTED +LETTER +LETTERBOX +LETTERBOXED +LETTERBOXES +LETTERBOXING +LETTERBOXINGS +LETTERED +LETTERER +LETTERERS +LETTERFORM +LETTERFORMS +LETTERHEAD +LETTERHEADS +LETTERING +LETTERINGS +LETTERMAN +LETTERMEN +LETTERPRESS +LETTERPRESSES +LETTERS +LETTERSPACING +LETTERSPACINGS +LETTING +LETTUCE +LETTUCES +LETUP +LETUPS +LEU +LEUCEMIA +LEUCEMIAS +LEUCEMIC +LEUCIN +LEUCINE +LEUCINES +LEUCINS +LEUCITE +LEUCITES +LEUCITIC +LEUCOCIDIN +LEUCOCIDINS +LEUCOCYTE +LEUCOCYTES +LEUCOMA +LEUCOMAS +LEUCOPLAST +LEUCOPLASTS +LEUD +LEUDES +LEUDS +LEUKAEMIA +LEUKAEMIAS +LEUKAEMOGENESES +LEUKAEMOGENESIS +LEUKEMIA +LEUKEMIAS +LEUKEMIC +LEUKEMICS +LEUKEMOGENESES +LEUKEMOGENESIS +LEUKEMOGENIC +LEUKEMOID +LEUKOCYTE +LEUKOCYTES +LEUKOCYTIC +LEUKOCYTOSES +LEUKOCYTOSIS +LEUKODYSTROPHY +LEUKOMA +LEUKOMAS +LEUKON +LEUKONS +LEUKOPENIA +LEUKOPENIAS +LEUKOPENIC +LEUKOPLAKIA +LEUKOPLAKIAS +LEUKOPLAKIC +LEUKOPOIESES +LEUKOPOIESIS +LEUKOPOIETIC +LEUKORRHEA +LEUKORRHEAL +LEUKORRHEAS +LEUKOSES +LEUKOSIS +LEUKOTIC +LEUKOTOMIES +LEUKOTOMY +LEUKOTRIENE +LEUKOTRIENES +LEV +LEVA +LEVANT +LEVANTED +LEVANTER +LEVANTERS +LEVANTINE +LEVANTINES +LEVANTING +LEVANTS +LEVATOR +LEVATORES +LEVATORS +LEVEE +LEVEED +LEVEEING +LEVEES +LEVEL +LEVELED +LEVELER +LEVELERS +LEVELHEADED +LEVELHEADEDNESS +LEVELING +LEVELLED +LEVELLER +LEVELLERS +LEVELLING +LEVELLY +LEVELNESS +LEVELNESSES +LEVELS +LEVER +LEVERAGE +LEVERAGED +LEVERAGES +LEVERAGING +LEVERED +LEVERET +LEVERETS +LEVERING +LEVERS +LEVIABLE +LEVIATHAN +LEVIATHANS +LEVIED +LEVIER +LEVIERS +LEVIES +LEVIGATE +LEVIGATED +LEVIGATES +LEVIGATING +LEVIGATION +LEVIGATIONS +LEVIN +LEVINS +LEVIRATE +LEVIRATES +LEVIRATIC +LEVIS +LEVITATE +LEVITATED +LEVITATES +LEVITATING +LEVITATION +LEVITATIONAL +LEVITATIONS +LEVITATOR +LEVITATORS +LEVITIES +LEVITY +LEVO +LEVODOPA +LEVODOPAS +LEVOGYRE +LEVOROTARY +LEVOROTATORY +LEVULIN +LEVULINS +LEVULOSE +LEVULOSES +LEVY +LEVYING +LEWD +LEWDER +LEWDEST +LEWDLY +LEWDNESS +LEWDNESSES +LEWIS +LEWISES +LEWISITE +LEWISITES +LEWISSON +LEWISSONS +LEX +LEXEME +LEXEMES +LEXEMIC +LEXES +LEXICA +LEXICAL +LEXICALISATION +LEXICALISATIONS +LEXICALITIES +LEXICALITY +LEXICALIZATION +LEXICALIZATIONS +LEXICALIZE +LEXICALIZED +LEXICALIZES +LEXICALIZING +LEXICALLY +LEXICOGRAPHER +LEXICOGRAPHERS +LEXICOGRAPHIC +LEXICOGRAPHICAL +LEXICOGRAPHIES +LEXICOGRAPHY +LEXICOLOGIES +LEXICOLOGIST +LEXICOLOGISTS +LEXICOLOGY +LEXICON +LEXICONS +LEXIS +LEY +LEYS +LEZ +LEZZES +LEZZIE +LEZZIES +LEZZY +LI +LIABILITIES +LIABILITY +LIABLE +LIAISE +LIAISED +LIAISES +LIAISING +LIAISON +LIAISONS +LIANA +LIANAS +LIANE +LIANES +LIANG +LIANGS +LIANOID +LIAR +LIARD +LIARDS +LIARS +LIB +LIBATION +LIBATIONARY +LIBATIONS +LIBBER +LIBBERS +LIBECCHIO +LIBECCHIOS +LIBECCIO +LIBECCIOS +LIBEL +LIBELANT +LIBELANTS +LIBELED +LIBELEE +LIBELEES +LIBELER +LIBELERS +LIBELING +LIBELIST +LIBELISTS +LIBELLANT +LIBELLANTS +LIBELLED +LIBELLEE +LIBELLEES +LIBELLER +LIBELLERS +LIBELLING +LIBELLOUS +LIBELOUS +LIBELS +LIBER +LIBERAL +LIBERALISE +LIBERALISED +LIBERALISES +LIBERALISING +LIBERALISM +LIBERALISMS +LIBERALIST +LIBERALISTIC +LIBERALISTS +LIBERALITIES +LIBERALITY +LIBERALIZATION +LIBERALIZATIONS +LIBERALIZE +LIBERALIZED +LIBERALIZER +LIBERALIZERS +LIBERALIZES +LIBERALIZING +LIBERALLY +LIBERALNESS +LIBERALNESSES +LIBERALS +LIBERATE +LIBERATED +LIBERATES +LIBERATING +LIBERATION +LIBERATIONIST +LIBERATIONISTS +LIBERATIONS +LIBERATOR +LIBERATORS +LIBERS +LIBERTARIAN +LIBERTARIANISM +LIBERTARIANISMS +LIBERTARIANS +LIBERTIES +LIBERTINAGE +LIBERTINAGES +LIBERTINE +LIBERTINES +LIBERTINISM +LIBERTINISMS +LIBERTY +LIBIDINAL +LIBIDINALLY +LIBIDINOUS +LIBIDINOUSLY +LIBIDINOUSNESS +LIBIDO +LIBIDOS +LIBLAB +LIBLABS +LIBRA +LIBRAE +LIBRARIAN +LIBRARIANS +LIBRARIANSHIP +LIBRARIANSHIPS +LIBRARIES +LIBRARY +LIBRAS +LIBRATE +LIBRATED +LIBRATES +LIBRATING +LIBRATION +LIBRATIONAL +LIBRATIONS +LIBRATORY +LIBRETTI +LIBRETTIST +LIBRETTISTS +LIBRETTO +LIBRETTOS +LIBRI +LIBRIFORM +LIBS +LICE +LICENCE +LICENCED +LICENCEE +LICENCEES +LICENCER +LICENCERS +LICENCES +LICENCING +LICENSABLE +LICENSE +LICENSED +LICENSEE +LICENSEES +LICENSER +LICENSERS +LICENSES +LICENSING +LICENSOR +LICENSORS +LICENSURE +LICENSURES +LICENTE +LICENTIATE +LICENTIATES +LICENTIOUS +LICENTIOUSLY +LICENTIOUSNESS +LICH +LICHEE +LICHEES +LICHEN +LICHENED +LICHENIN +LICHENING +LICHENINS +LICHENOLOGICAL +LICHENOLOGIES +LICHENOLOGIST +LICHENOLOGISTS +LICHENOLOGY +LICHENOSE +LICHENOUS +LICHENS +LICHES +LICHI +LICHIS +LICHT +LICHTED +LICHTING +LICHTLY +LICHTS +LICIT +LICITLY +LICITNESS +LICITNESSES +LICK +LICKED +LICKER +LICKERISH +LICKERISHLY +LICKERISHNESS +LICKERISHNESSES +LICKERS +LICKING +LICKINGS +LICKS +LICKSPIT +LICKSPITS +LICKSPITTLE +LICKSPITTLES +LICORICE +LICORICES +LICTOR +LICTORIAN +LICTORS +LID +LIDAR +LIDARS +LIDDED +LIDDING +LIDLESS +LIDO +LIDOCAINE +LIDOCAINES +LIDOS +LIDS +LIE +LIEBFRAUMILCH +LIEBFRAUMILCHS +LIED +LIEDER +LIEF +LIEFER +LIEFEST +LIEFLY +LIEGE +LIEGEMAN +LIEGEMEN +LIEGES +LIEN +LIENABLE +LIENAL +LIENS +LIENTERIES +LIENTERY +LIER +LIERNE +LIERNES +LIERS +LIES +LIEU +LIEUS +LIEUTENANCIES +LIEUTENANCY +LIEUTENANT +LIEUTENANTS +LIEVE +LIEVER +LIEVEST +LIFE +LIFEBLOOD +LIFEBLOODS +LIFEBOAT +LIFEBOATS +LIFECARE +LIFECARES +LIFEFUL +LIFEGUARD +LIFEGUARDED +LIFEGUARDING +LIFEGUARDS +LIFELESS +LIFELESSLY +LIFELESSNESS +LIFELESSNESSES +LIFELIKE +LIFELIKENESS +LIFELIKENESSES +LIFELINE +LIFELINES +LIFELONG +LIFEMANSHIP +LIFEMANSHIPS +LIFER +LIFERS +LIFESAVER +LIFESAVERS +LIFESAVING +LIFESAVINGS +LIFESPAN +LIFESPANS +LIFESTYLE +LIFESTYLES +LIFETIME +LIFETIMES +LIFEWAY +LIFEWAYS +LIFEWORK +LIFEWORKS +LIFEWORLD +LIFEWORLDS +LIFT +LIFTABLE +LIFTED +LIFTER +LIFTERS +LIFTGATE +LIFTGATES +LIFTING +LIFTMAN +LIFTMEN +LIFTOFF +LIFTOFFS +LIFTS +LIGAMENT +LIGAMENTOUS +LIGAMENTS +LIGAN +LIGAND +LIGANDS +LIGANS +LIGASE +LIGASES +LIGATE +LIGATED +LIGATES +LIGATING +LIGATION +LIGATIONS +LIGATIVE +LIGATURE +LIGATURED +LIGATURES +LIGATURING +LIGER +LIGERS +LIGHT +LIGHTBULB +LIGHTBULBS +LIGHTED +LIGHTEN +LIGHTENED +LIGHTENER +LIGHTENERS +LIGHTENING +LIGHTENS +LIGHTER +LIGHTERAGE +LIGHTERAGES +LIGHTERED +LIGHTERING +LIGHTERS +LIGHTEST +LIGHTFACE +LIGHTFACED +LIGHTFACES +LIGHTFAST +LIGHTFASTNESS +LIGHTFASTNESSES +LIGHTFUL +LIGHTHEARTED +LIGHTHEARTEDLY +LIGHTHOUSE +LIGHTHOUSES +LIGHTING +LIGHTINGS +LIGHTISH +LIGHTLESS +LIGHTLY +LIGHTNESS +LIGHTNESSES +LIGHTNING +LIGHTNINGED +LIGHTNINGS +LIGHTPLANE +LIGHTPLANES +LIGHTPROOF +LIGHTS +LIGHTSHIP +LIGHTSHIPS +LIGHTSOME +LIGHTSOMELY +LIGHTSOMENESS +LIGHTSOMENESSES +LIGHTTIGHT +LIGHTWAVE +LIGHTWEIGHT +LIGHTWEIGHTS +LIGHTWOOD +LIGHTWOODS +LIGNALOES +LIGNAN +LIGNANS +LIGNEOUS +LIGNIFICATION +LIGNIFICATIONS +LIGNIFIED +LIGNIFIES +LIGNIFY +LIGNIFYING +LIGNIN +LIGNINS +LIGNITE +LIGNITES +LIGNITIC +LIGNOCELLULOSE +LIGNOCELLULOSES +LIGNOCELLULOSIC +LIGNOSULFONATE +LIGNOSULFONATES +LIGROIN +LIGROINE +LIGROINES +LIGROINS +LIGULA +LIGULAE +LIGULAR +LIGULAS +LIGULATE +LIGULATED +LIGULE +LIGULES +LIGULOID +LIGURE +LIGURES +LIKABILITIES +LIKABILITY +LIKABLE +LIKABLENESS +LIKABLENESSES +LIKE +LIKEABLE +LIKED +LIKELIER +LIKELIEST +LIKELIHOOD +LIKELIHOODS +LIKELY +LIKEN +LIKENED +LIKENESS +LIKENESSES +LIKENING +LIKENS +LIKER +LIKERS +LIKES +LIKEST +LIKEWISE +LIKING +LIKINGS +LIKUTA +LILAC +LILACS +LILANGENI +LILIED +LILIES +LILLIPUT +LILLIPUTIAN +LILLIPUTIANS +LILLIPUTS +LILO +LILOS +LILT +LILTED +LILTING +LILTINGLY +LILTINGNESS +LILTINGNESSES +LILTS +LILY +LILYLIKE +LIMA +LIMACINE +LIMACON +LIMACONS +LIMAN +LIMANS +LIMAS +LIMB +LIMBA +LIMBAS +LIMBATE +LIMBECK +LIMBECKS +LIMBED +LIMBER +LIMBERED +LIMBERER +LIMBEREST +LIMBERING +LIMBERLY +LIMBERNESS +LIMBERNESSES +LIMBERS +LIMBI +LIMBIC +LIMBIER +LIMBIEST +LIMBING +LIMBLESS +LIMBO +LIMBOS +LIMBS +LIMBUS +LIMBUSES +LIMBY +LIME +LIMEADE +LIMEADES +LIMED +LIMEKILN +LIMEKILNS +LIMELESS +LIMELIGHT +LIMELIGHTED +LIMELIGHTING +LIMELIGHTS +LIMEN +LIMENS +LIMERICK +LIMERICKS +LIMES +LIMESTONE +LIMESTONES +LIMEWATER +LIMEWATERS +LIMEY +LIMEYS +LIMIER +LIMIEST +LIMINA +LIMINAL +LIMINESS +LIMINESSES +LIMING +LIMIT +LIMITABLE +LIMITARY +LIMITATION +LIMITATIONAL +LIMITATIONS +LIMITATIVE +LIMITED +LIMITEDLY +LIMITEDNESS +LIMITEDNESSES +LIMITEDS +LIMITER +LIMITERS +LIMITES +LIMITING +LIMITINGLY +LIMITLESS +LIMITLESSLY +LIMITLESSNESS +LIMITLESSNESSES +LIMITROPHE +LIMITS +LIMMER +LIMMERS +LIMN +LIMNED +LIMNER +LIMNERS +LIMNETIC +LIMNIC +LIMNING +LIMNOLOGIC +LIMNOLOGICAL +LIMNOLOGIES +LIMNOLOGIST +LIMNOLOGISTS +LIMNOLOGY +LIMNS +LIMO +LIMONENE +LIMONENES +LIMONITE +LIMONITES +LIMONITIC +LIMOS +LIMOUSINE +LIMOUSINES +LIMP +LIMPA +LIMPAS +LIMPED +LIMPER +LIMPERS +LIMPEST +LIMPET +LIMPETS +LIMPID +LIMPIDITIES +LIMPIDITY +LIMPIDLY +LIMPIDNESS +LIMPIDNESSES +LIMPING +LIMPINGLY +LIMPKIN +LIMPKINS +LIMPLY +LIMPNESS +LIMPNESSES +LIMPS +LIMPSEY +LIMPSIER +LIMPSIEST +LIMPSY +LIMULI +LIMULOID +LIMULOIDS +LIMULUS +LIMY +LIN +LINABLE +LINAC +LINACS +LINAGE +LINAGES +LINALOL +LINALOLS +LINALOOL +LINALOOLS +LINCHPIN +LINCHPINS +LINCOMYCIN +LINCOMYCINS +LINDANE +LINDANES +LINDEN +LINDENS +LINDIES +LINDY +LINE +LINEABLE +LINEAGE +LINEAGES +LINEAL +LINEALITIES +LINEALITY +LINEALLY +LINEAMENT +LINEAMENTAL +LINEAMENTS +LINEAR +LINEARISE +LINEARISED +LINEARISES +LINEARISING +LINEARITIES +LINEARITY +LINEARIZATION +LINEARIZATIONS +LINEARIZE +LINEARIZED +LINEARIZES +LINEARIZING +LINEARLY +LINEATE +LINEATED +LINEATION +LINEATIONS +LINEBACKER +LINEBACKERS +LINEBACKING +LINEBACKINGS +LINEBRED +LINEBREEDING +LINEBREEDINGS +LINECASTER +LINECASTERS +LINECASTING +LINECASTINGS +LINECUT +LINECUTS +LINED +LINELESS +LINELIKE +LINEMAN +LINEMEN +LINEN +LINENS +LINENY +LINEOLATE +LINER +LINERBOARD +LINERBOARDS +LINERLESS +LINERS +LINES +LINESMAN +LINESMEN +LINEUP +LINEUPS +LINEY +LING +LINGA +LINGAM +LINGAMS +LINGAS +LINGBERRIES +LINGBERRY +LINGCOD +LINGCODS +LINGER +LINGERED +LINGERER +LINGERERS +LINGERIE +LINGERIES +LINGERING +LINGERINGLY +LINGERS +LINGIER +LINGIEST +LINGO +LINGOES +LINGONBERRIES +LINGONBERRY +LINGS +LINGUA +LINGUAE +LINGUAL +LINGUALLY +LINGUALS +LINGUICA +LINGUICAS +LINGUINE +LINGUINES +LINGUINI +LINGUINIS +LINGUISA +LINGUISAS +LINGUIST +LINGUISTIC +LINGUISTICAL +LINGUISTICALLY +LINGUISTICIAN +LINGUISTICIANS +LINGUISTICS +LINGUISTS +LINGULA +LINGULAE +LINGULAR +LINGULATE +LINGY +LINIER +LINIEST +LINIMENT +LINIMENTS +LININ +LINING +LININGS +LININS +LINK +LINKABLE +LINKAGE +LINKAGES +LINKBOY +LINKBOYS +LINKED +LINKER +LINKERS +LINKING +LINKMAN +LINKMEN +LINKS +LINKSLAND +LINKSLANDS +LINKSMAN +LINKSMEN +LINKUP +LINKUPS +LINKWORK +LINKWORKS +LINKY +LINN +LINNET +LINNETS +LINNS +LINO +LINOCUT +LINOCUTS +LINOLEATE +LINOLEATES +LINOLEUM +LINOLEUMS +LINOS +LINOTYPE +LINOTYPED +LINOTYPER +LINOTYPERS +LINOTYPES +LINOTYPING +LINS +LINSANG +LINSANGS +LINSEED +LINSEEDS +LINSEY +LINSEYS +LINSTOCK +LINSTOCKS +LINT +LINTED +LINTEL +LINTELS +LINTER +LINTERS +LINTIER +LINTIEST +LINTING +LINTLESS +LINTOL +LINTOLS +LINTS +LINTWHITE +LINTWHITES +LINTY +LINUM +LINUMS +LINURON +LINURONS +LINY +LION +LIONESS +LIONESSES +LIONFISH +LIONFISHES +LIONHEARTED +LIONISE +LIONISED +LIONISER +LIONISERS +LIONISES +LIONISING +LIONIZATION +LIONIZATIONS +LIONIZE +LIONIZED +LIONIZER +LIONIZERS +LIONIZES +LIONIZING +LIONLIKE +LIONS +LIP +LIPA +LIPASE +LIPASES +LIPE +LIPECTOMIES +LIPECTOMY +LIPID +LIPIDE +LIPIDES +LIPIDIC +LIPIDS +LIPIN +LIPINS +LIPLESS +LIPLIKE +LIPOCYTE +LIPOCYTES +LIPOGENESES +LIPOGENESIS +LIPOID +LIPOIDAL +LIPOIDS +LIPOLITIC +LIPOLYSES +LIPOLYSIS +LIPOLYTIC +LIPOMA +LIPOMAS +LIPOMATA +LIPOMATOUS +LIPOPHILIC +LIPOPROTEIN +LIPOPROTEINS +LIPOSOMAL +LIPOSOME +LIPOSOMES +LIPOSUCTION +LIPOSUCTIONS +LIPOTROPIC +LIPOTROPIES +LIPOTROPIN +LIPOTROPINS +LIPOTROPY +LIPPED +LIPPEN +LIPPENED +LIPPENING +LIPPENS +LIPPER +LIPPERED +LIPPERING +LIPPERS +LIPPIER +LIPPIEST +LIPPINESS +LIPPINESSES +LIPPING +LIPPINGS +LIPPY +LIPREAD +LIPREADER +LIPREADERS +LIPREADING +LIPREADINGS +LIPREADS +LIPS +LIPSTICK +LIPSTICKED +LIPSTICKS +LIQUATE +LIQUATED +LIQUATES +LIQUATING +LIQUATION +LIQUATIONS +LIQUEFACTION +LIQUEFACTIONS +LIQUEFIED +LIQUEFIER +LIQUEFIERS +LIQUEFIES +LIQUEFY +LIQUEFYING +LIQUESCENT +LIQUEUR +LIQUEURS +LIQUID +LIQUIDAMBAR +LIQUIDAMBARS +LIQUIDATE +LIQUIDATED +LIQUIDATES +LIQUIDATING +LIQUIDATION +LIQUIDATIONS +LIQUIDATOR +LIQUIDATORS +LIQUIDITIES +LIQUIDITY +LIQUIDIZE +LIQUIDIZED +LIQUIDIZES +LIQUIDIZING +LIQUIDLY +LIQUIDNESS +LIQUIDNESSES +LIQUIDS +LIQUIFIED +LIQUIFIES +LIQUIFY +LIQUIFYING +LIQUOR +LIQUORED +LIQUORICE +LIQUORICES +LIQUORING +LIQUORISH +LIQUORS +LIRA +LIRAS +LIRE +LIRI +LIRIOPE +LIRIOPES +LIRIPIPE +LIRIPIPES +LIROT +LIROTH +LIS +LISENTE +LISLE +LISLES +LISP +LISPED +LISPER +LISPERS +LISPING +LISPINGLY +LISPS +LISSOM +LISSOME +LISSOMELY +LISSOMENESS +LISSOMENESSES +LISSOMLY +LIST +LISTABLE +LISTED +LISTEE +LISTEES +LISTEL +LISTELS +LISTEN +LISTENABLE +LISTENED +LISTENER +LISTENERS +LISTENERSHIP +LISTENERSHIPS +LISTENING +LISTENS +LISTER +LISTERIA +LISTERIAS +LISTERIOSES +LISTERIOSIS +LISTERS +LISTING +LISTINGS +LISTLESS +LISTLESSLY +LISTLESSNESS +LISTLESSNESSES +LISTS +LIT +LITAI +LITANIES +LITANY +LITAS +LITCHI +LITCHIS +LITE +LITENESS +LITENESSES +LITER +LITERACIES +LITERACY +LITERAL +LITERALISM +LITERALISMS +LITERALIST +LITERALISTIC +LITERALISTS +LITERALITIES +LITERALITY +LITERALIZATION +LITERALIZATIONS +LITERALIZE +LITERALIZED +LITERALIZES +LITERALIZING +LITERALLY +LITERALNESS +LITERALNESSES +LITERALS +LITERARILY +LITERARINESS +LITERARINESSES +LITERARY +LITERATE +LITERATELY +LITERATENESS +LITERATENESSES +LITERATES +LITERATI +LITERATIM +LITERATION +LITERATIONS +LITERATOR +LITERATORS +LITERATURE +LITERATURES +LITERATUS +LITERS +LITHARGE +LITHARGES +LITHE +LITHELY +LITHEMIA +LITHEMIAS +LITHEMIC +LITHENESS +LITHENESSES +LITHER +LITHESOME +LITHEST +LITHIA +LITHIAS +LITHIASES +LITHIASIS +LITHIC +LITHIFICATION +LITHIFICATIONS +LITHIFIED +LITHIFIES +LITHIFY +LITHIFYING +LITHIUM +LITHIUMS +LITHO +LITHOED +LITHOGRAPH +LITHOGRAPHED +LITHOGRAPHER +LITHOGRAPHERS +LITHOGRAPHIC +LITHOGRAPHIES +LITHOGRAPHING +LITHOGRAPHS +LITHOGRAPHY +LITHOID +LITHOIDAL +LITHOING +LITHOLOGIC +LITHOLOGICAL +LITHOLOGICALLY +LITHOLOGIES +LITHOLOGY +LITHOPHANE +LITHOPHANES +LITHOPHYTE +LITHOPHYTES +LITHOPONE +LITHOPONES +LITHOPS +LITHOS +LITHOSOL +LITHOSOLS +LITHOSPHERE +LITHOSPHERES +LITHOSPHERIC +LITHOTOMIES +LITHOTOMY +LITHOTRIPSIES +LITHOTRIPSY +LITHOTRIPTER +LITHOTRIPTERS +LITHOTRIPTOR +LITHOTRIPTORS +LITIGABLE +LITIGANT +LITIGANTS +LITIGATE +LITIGATED +LITIGATES +LITIGATING +LITIGATION +LITIGATIONS +LITIGATOR +LITIGATORS +LITIGIOUS +LITIGIOUSLY +LITIGIOUSNESS +LITIGIOUSNESSES +LITMUS +LITMUSES +LITORAL +LITOTES +LITOTIC +LITRE +LITRES +LITS +LITTEN +LITTER +LITTERATEUR +LITTERATEURS +LITTERBAG +LITTERBAGS +LITTERBUG +LITTERBUGS +LITTERED +LITTERER +LITTERERS +LITTERING +LITTERMATE +LITTERMATES +LITTERS +LITTERY +LITTLE +LITTLENECK +LITTLENECKS +LITTLENESS +LITTLENESSES +LITTLER +LITTLES +LITTLEST +LITTLISH +LITTORAL +LITTORALS +LITU +LITURGIC +LITURGICAL +LITURGICALLY +LITURGICS +LITURGIES +LITURGIOLOGIES +LITURGIOLOGIST +LITURGIOLOGISTS +LITURGIOLOGY +LITURGISM +LITURGISMS +LITURGIST +LITURGISTS +LITURGY +LIVABILITIES +LIVABILITY +LIVABLE +LIVABLENESS +LIVABLENESSES +LIVE +LIVEABILITIES +LIVEABILITY +LIVEABLE +LIVED +LIVELIER +LIVELIEST +LIVELIHOOD +LIVELIHOODS +LIVELILY +LIVELINESS +LIVELINESSES +LIVELONG +LIVELY +LIVEN +LIVENED +LIVENER +LIVENERS +LIVENESS +LIVENESSES +LIVENING +LIVENS +LIVER +LIVERED +LIVERIED +LIVERIES +LIVERING +LIVERISH +LIVERISHNESS +LIVERISHNESSES +LIVERLEAF +LIVERLEAVES +LIVERS +LIVERWORT +LIVERWORTS +LIVERWURST +LIVERWURSTS +LIVERY +LIVERYMAN +LIVERYMEN +LIVES +LIVEST +LIVESTOCK +LIVESTOCKS +LIVETRAP +LIVETRAPPED +LIVETRAPPING +LIVETRAPS +LIVID +LIVIDITIES +LIVIDITY +LIVIDLY +LIVIDNESS +LIVIDNESSES +LIVIER +LIVIERS +LIVING +LIVINGLY +LIVINGNESS +LIVINGNESSES +LIVINGS +LIVRE +LIVRES +LIVYER +LIVYERS +LIXIVIA +LIXIVIAL +LIXIVIATE +LIXIVIATED +LIXIVIATES +LIXIVIATING +LIXIVIATION +LIXIVIATIONS +LIXIVIUM +LIXIVIUMS +LIZARD +LIZARDS +LLAMA +LLAMAS +LLANO +LLANOS +LO +LOACH +LOACHES +LOAD +LOADED +LOADER +LOADERS +LOADING +LOADINGS +LOADMASTER +LOADMASTERS +LOADS +LOADSTAR +LOADSTARS +LOADSTONE +LOADSTONES +LOAF +LOAFED +LOAFER +LOAFERS +LOAFING +LOAFS +LOAM +LOAMED +LOAMIER +LOAMIEST +LOAMINESS +LOAMINESSES +LOAMING +LOAMLESS +LOAMS +LOAMY +LOAN +LOANABLE +LOANED +LOANER +LOANERS +LOANING +LOANINGS +LOANS +LOANSHIFT +LOANSHIFTS +LOANWORD +LOANWORDS +LOATH +LOATHE +LOATHED +LOATHER +LOATHERS +LOATHES +LOATHFUL +LOATHING +LOATHINGS +LOATHLY +LOATHNESS +LOATHNESSES +LOATHSOME +LOATHSOMELY +LOATHSOMENESS +LOATHSOMENESSES +LOAVES +LOB +LOBAR +LOBATE +LOBATED +LOBATELY +LOBATION +LOBATIONS +LOBBED +LOBBER +LOBBERS +LOBBIED +LOBBIES +LOBBING +LOBBY +LOBBYER +LOBBYERS +LOBBYGOW +LOBBYGOWS +LOBBYING +LOBBYISM +LOBBYISMS +LOBBYIST +LOBBYISTS +LOBE +LOBECTOMIES +LOBECTOMY +LOBED +LOBEFIN +LOBEFINS +LOBELIA +LOBELIAS +LOBELINE +LOBELINES +LOBES +LOBLOLLIES +LOBLOLLY +LOBO +LOBOS +LOBOTOMIES +LOBOTOMISE +LOBOTOMISED +LOBOTOMISES +LOBOTOMISING +LOBOTOMIZE +LOBOTOMIZED +LOBOTOMIZES +LOBOTOMIZING +LOBOTOMY +LOBS +LOBSCOUSE +LOBSCOUSES +LOBSTER +LOBSTERED +LOBSTERER +LOBSTERERS +LOBSTERING +LOBSTERINGS +LOBSTERLIKE +LOBSTERMAN +LOBSTERMEN +LOBSTERS +LOBSTICK +LOBSTICKS +LOBULAR +LOBULARLY +LOBULATE +LOBULATED +LOBULATION +LOBULATIONS +LOBULE +LOBULES +LOBULOSE +LOBWORM +LOBWORMS +LOCA +LOCAL +LOCALE +LOCALES +LOCALISE +LOCALISED +LOCALISES +LOCALISING +LOCALISM +LOCALISMS +LOCALIST +LOCALISTS +LOCALITE +LOCALITES +LOCALITIES +LOCALITY +LOCALIZABILITY +LOCALIZABLE +LOCALIZATION +LOCALIZATIONS +LOCALIZE +LOCALIZED +LOCALIZER +LOCALIZERS +LOCALIZES +LOCALIZING +LOCALLY +LOCALNESS +LOCALNESSES +LOCALS +LOCATABLE +LOCATE +LOCATED +LOCATER +LOCATERS +LOCATES +LOCATING +LOCATION +LOCATIONAL +LOCATIONALLY +LOCATIONS +LOCATIVE +LOCATIVES +LOCATOR +LOCATORS +LOCH +LOCHAN +LOCHANS +LOCHIA +LOCHIAL +LOCHS +LOCI +LOCK +LOCKABLE +LOCKAGE +LOCKAGES +LOCKBOX +LOCKBOXES +LOCKDOWN +LOCKDOWNS +LOCKED +LOCKER +LOCKERS +LOCKET +LOCKETS +LOCKING +LOCKJAW +LOCKJAWS +LOCKKEEPER +LOCKKEEPERS +LOCKMAKER +LOCKMAKERS +LOCKNUT +LOCKNUTS +LOCKOUT +LOCKOUTS +LOCKRAM +LOCKRAMS +LOCKS +LOCKSET +LOCKSETS +LOCKSMITH +LOCKSMITHING +LOCKSMITHINGS +LOCKSMITHS +LOCKSTEP +LOCKSTEPS +LOCKSTITCH +LOCKSTITCHED +LOCKSTITCHES +LOCKSTITCHING +LOCKUP +LOCKUPS +LOCO +LOCOED +LOCOES +LOCOFOCO +LOCOFOCOS +LOCOING +LOCOISM +LOCOISMS +LOCOMOTE +LOCOMOTED +LOCOMOTES +LOCOMOTING +LOCOMOTION +LOCOMOTIONS +LOCOMOTIVE +LOCOMOTIVES +LOCOMOTOR +LOCOMOTORS +LOCOMOTORY +LOCOS +LOCOWEED +LOCOWEEDS +LOCULAR +LOCULATE +LOCULATED +LOCULE +LOCULED +LOCULES +LOCULI +LOCULICIDAL +LOCULUS +LOCUM +LOCUMS +LOCUS +LOCUST +LOCUSTA +LOCUSTAE +LOCUSTAL +LOCUSTS +LOCUTION +LOCUTIONS +LOCUTORIES +LOCUTORY +LODE +LODEN +LODENS +LODES +LODESTAR +LODESTARS +LODESTONE +LODESTONES +LODGE +LODGED +LODGEMENT +LODGEMENTS +LODGER +LODGERS +LODGES +LODGING +LODGINGS +LODGMENT +LODGMENTS +LODICULE +LODICULES +LOESS +LOESSAL +LOESSES +LOESSIAL +LOFT +LOFTED +LOFTER +LOFTERS +LOFTIER +LOFTIEST +LOFTILY +LOFTINESS +LOFTINESSES +LOFTING +LOFTLESS +LOFTLIKE +LOFTS +LOFTY +LOG +LOGAN +LOGANBERRIES +LOGANBERRY +LOGANIA +LOGANS +LOGAOEDIC +LOGAOEDICS +LOGARITHM +LOGARITHMIC +LOGARITHMICALLY +LOGARITHMS +LOGBOOK +LOGBOOKS +LOGE +LOGES +LOGGATS +LOGGED +LOGGER +LOGGERHEAD +LOGGERHEADS +LOGGERS +LOGGETS +LOGGIA +LOGGIAS +LOGGIE +LOGGIER +LOGGIEST +LOGGING +LOGGINGS +LOGGISH +LOGGY +LOGIA +LOGIC +LOGICAL +LOGICALITIES +LOGICALITY +LOGICALLY +LOGICALNESS +LOGICALNESSES +LOGICIAN +LOGICIANS +LOGICISE +LOGICISED +LOGICISES +LOGICISING +LOGICIZE +LOGICIZED +LOGICIZES +LOGICIZING +LOGICLESS +LOGICS +LOGIER +LOGIEST +LOGILY +LOGIN +LOGINESS +LOGINESSES +LOGINS +LOGION +LOGIONS +LOGISTIC +LOGISTICAL +LOGISTICALLY +LOGISTICIAN +LOGISTICIANS +LOGISTICS +LOGJAM +LOGJAMMED +LOGJAMMING +LOGJAMS +LOGNORMAL +LOGNORMALITIES +LOGNORMALITY +LOGNORMALLY +LOGO +LOGOGRAM +LOGOGRAMMATIC +LOGOGRAMS +LOGOGRAPH +LOGOGRAPHIC +LOGOGRAPHICALLY +LOGOGRAPHS +LOGOGRIPH +LOGOGRIPHS +LOGOI +LOGOMACH +LOGOMACHIES +LOGOMACHS +LOGOMACHY +LOGON +LOGONS +LOGOPHILE +LOGOPHILES +LOGORRHEA +LOGORRHEAS +LOGORRHEIC +LOGOS +LOGOTYPE +LOGOTYPES +LOGOTYPIES +LOGOTYPY +LOGROLL +LOGROLLED +LOGROLLER +LOGROLLERS +LOGROLLING +LOGROLLINGS +LOGROLLS +LOGS +LOGWAY +LOGWAYS +LOGWOOD +LOGWOODS +LOGY +LOID +LOIDED +LOIDING +LOIDS +LOIN +LOINCLOTH +LOINCLOTHS +LOINS +LOITER +LOITERED +LOITERER +LOITERERS +LOITERING +LOITERS +LOLL +LOLLED +LOLLER +LOLLERS +LOLLIES +LOLLING +LOLLINGLY +LOLLIPOP +LOLLIPOPS +LOLLOP +LOLLOPED +LOLLOPING +LOLLOPS +LOLLOPY +LOLLS +LOLLY +LOLLYGAG +LOLLYGAGGED +LOLLYGAGGING +LOLLYGAGS +LOLLYPOP +LOLLYPOPS +LOMEIN +LOMEINS +LOMENT +LOMENTA +LOMENTS +LOMENTUM +LOMENTUMS +LONE +LONELIER +LONELIEST +LONELILY +LONELINESS +LONELINESSES +LONELY +LONENESS +LONENESSES +LONER +LONERS +LONESOME +LONESOMELY +LONESOMENESS +LONESOMENESSES +LONESOMES +LONG +LONGAN +LONGANIMITIES +LONGANIMITY +LONGANS +LONGBOAT +LONGBOATS +LONGBOW +LONGBOWMAN +LONGBOWMEN +LONGBOWS +LONGCLOTH +LONGCLOTHS +LONGE +LONGED +LONGEING +LONGER +LONGERON +LONGERONS +LONGERS +LONGES +LONGEST +LONGEVITIES +LONGEVITY +LONGEVOUS +LONGHAIR +LONGHAIRED +LONGHAIRS +LONGHAND +LONGHANDS +LONGHEAD +LONGHEADED +LONGHEADEDNESS +LONGHEADS +LONGHORN +LONGHORNS +LONGHOUSE +LONGHOUSES +LONGICORN +LONGICORNS +LONGIES +LONGING +LONGINGLY +LONGINGS +LONGISH +LONGITUDE +LONGITUDES +LONGITUDINAL +LONGITUDINALLY +LONGJUMP +LONGJUMPED +LONGJUMPING +LONGJUMPS +LONGLEAF +LONGLEAVES +LONGLINE +LONGLINES +LONGLY +LONGNECK +LONGNECKS +LONGNESS +LONGNESSES +LONGS +LONGSHIP +LONGSHIPS +LONGSHORE +LONGSHOREMAN +LONGSHOREMEN +LONGSHORING +LONGSHORINGS +LONGSIGHTED +LONGSIGHTEDNESS +LONGSOME +LONGSOMELY +LONGSOMENESS +LONGSOMENESSES +LONGSPUR +LONGSPURS +LONGTIME +LONGUEUR +LONGUEURS +LONGWAYS +LONGWISE +LOO +LOOBIES +LOOBY +LOOED +LOOEY +LOOEYS +LOOF +LOOFA +LOOFAH +LOOFAHS +LOOFAS +LOOFS +LOOIE +LOOIES +LOOING +LOOK +LOOKALIKE +LOOKALIKES +LOOKDOWN +LOOKDOWNS +LOOKED +LOOKER +LOOKERS +LOOKING +LOOKISM +LOOKISMS +LOOKIST +LOOKISTS +LOOKOUT +LOOKOUTS +LOOKS +LOOKSISM +LOOKSISMS +LOOKUP +LOOKUPS +LOOM +LOOMED +LOOMING +LOOMS +LOON +LOONEY +LOONEYS +LOONIE +LOONIER +LOONIES +LOONIEST +LOONILY +LOONINESS +LOONINESSES +LOONS +LOONY +LOOP +LOOPED +LOOPER +LOOPERS +LOOPHOLE +LOOPHOLED +LOOPHOLES +LOOPHOLING +LOOPIER +LOOPIEST +LOOPILY +LOOPINESS +LOOPINESSES +LOOPING +LOOPS +LOOPY +LOOS +LOOSE +LOOSED +LOOSELY +LOOSEN +LOOSENED +LOOSENER +LOOSENERS +LOOSENESS +LOOSENESSES +LOOSENING +LOOSENS +LOOSER +LOOSES +LOOSEST +LOOSESTRIFE +LOOSESTRIFES +LOOSING +LOOT +LOOTED +LOOTER +LOOTERS +LOOTING +LOOTS +LOP +LOPE +LOPED +LOPER +LOPERS +LOPES +LOPHOPHORE +LOPHOPHORES +LOPING +LOPPED +LOPPER +LOPPERED +LOPPERING +LOPPERS +LOPPIER +LOPPIEST +LOPPING +LOPPY +LOPS +LOPSIDED +LOPSIDEDLY +LOPSIDEDNESS +LOPSIDEDNESSES +LOPSTICK +LOPSTICKS +LOQUACIOUS +LOQUACIOUSLY +LOQUACIOUSNESS +LOQUACITIES +LOQUACITY +LOQUAT +LOQUATS +LORAL +LORAN +LORANS +LORAZEPAM +LORAZEPAMS +LORD +LORDED +LORDING +LORDINGS +LORDLESS +LORDLIER +LORDLIEST +LORDLIKE +LORDLINESS +LORDLINESSES +LORDLING +LORDLINGS +LORDLY +LORDOMA +LORDOMAS +LORDOSES +LORDOSIS +LORDOTIC +LORDS +LORDSHIP +LORDSHIPS +LORE +LOREAL +LORES +LORGNETTE +LORGNETTES +LORGNON +LORGNONS +LORICA +LORICAE +LORICATE +LORICATED +LORICATES +LORIES +LORIKEET +LORIKEETS +LORIMER +LORIMERS +LORINER +LORINERS +LORIS +LORISES +LORN +LORNNESS +LORNNESSES +LORRIES +LORRY +LORY +LOSABLE +LOSABLENESS +LOSABLENESSES +LOSE +LOSEL +LOSELS +LOSER +LOSERS +LOSES +LOSING +LOSINGLY +LOSINGS +LOSS +LOSSES +LOSSLESS +LOSSY +LOST +LOSTNESS +LOSTNESSES +LOT +LOTA +LOTAH +LOTAHS +LOTAS +LOTH +LOTHARIO +LOTHARIOS +LOTHSOME +LOTI +LOTIC +LOTION +LOTIONS +LOTOS +LOTOSES +LOTS +LOTTE +LOTTED +LOTTER +LOTTERIES +LOTTERS +LOTTERY +LOTTES +LOTTING +LOTTO +LOTTOS +LOTUS +LOTUSES +LOTUSLAND +LOTUSLANDS +LOUCHE +LOUD +LOUDEN +LOUDENED +LOUDENING +LOUDENS +LOUDER +LOUDEST +LOUDISH +LOUDLIER +LOUDLIEST +LOUDLY +LOUDMOUTH +LOUDMOUTHED +LOUDMOUTHS +LOUDNESS +LOUDNESSES +LOUDSPEAKER +LOUDSPEAKERS +LOUGH +LOUGHS +LOUIE +LOUIES +LOUIS +LOUMA +LOUMAS +LOUNGE +LOUNGED +LOUNGER +LOUNGERS +LOUNGES +LOUNGEWEAR +LOUNGEWEARS +LOUNGING +LOUNGY +LOUP +LOUPE +LOUPED +LOUPEN +LOUPES +LOUPING +LOUPS +LOUR +LOURED +LOURING +LOURS +LOURY +LOUSE +LOUSED +LOUSES +LOUSEWORT +LOUSEWORTS +LOUSIER +LOUSIEST +LOUSILY +LOUSINESS +LOUSINESSES +LOUSING +LOUSY +LOUT +LOUTED +LOUTING +LOUTISH +LOUTISHLY +LOUTISHNESS +LOUTISHNESSES +LOUTS +LOUVER +LOUVERED +LOUVERS +LOUVRE +LOUVRED +LOUVRES +LOVABILITIES +LOVABILITY +LOVABLE +LOVABLENESS +LOVABLENESSES +LOVABLY +LOVAGE +LOVAGES +LOVASTATIN +LOVASTATINS +LOVAT +LOVATS +LOVE +LOVEABLE +LOVEABLY +LOVEBIRD +LOVEBIRDS +LOVEBUG +LOVEBUGS +LOVED +LOVEFEST +LOVEFESTS +LOVELESS +LOVELESSLY +LOVELESSNESS +LOVELESSNESSES +LOVELIER +LOVELIES +LOVELIEST +LOVELILY +LOVELINESS +LOVELINESSES +LOVELOCK +LOVELOCKS +LOVELORN +LOVELORNNESS +LOVELORNNESSES +LOVELY +LOVEMAKER +LOVEMAKERS +LOVEMAKING +LOVEMAKINGS +LOVER +LOVERLY +LOVERS +LOVES +LOVESEAT +LOVESEATS +LOVESICK +LOVESICKNESS +LOVESICKNESSES +LOVESOME +LOVEVINE +LOVEVINES +LOVING +LOVINGLY +LOVINGNESS +LOVINGNESSES +LOW +LOWBALL +LOWBALLED +LOWBALLING +LOWBALLS +LOWBORN +LOWBOY +LOWBOYS +LOWBRED +LOWBROW +LOWBROWED +LOWBROWS +LOWDOWN +LOWDOWNS +LOWE +LOWED +LOWER +LOWERCASE +LOWERCASED +LOWERCASES +LOWERCASING +LOWERED +LOWERING +LOWERMOST +LOWERS +LOWERY +LOWES +LOWEST +LOWING +LOWINGS +LOWISH +LOWLAND +LOWLANDER +LOWLANDERS +LOWLANDS +LOWLIER +LOWLIEST +LOWLIFE +LOWLIFER +LOWLIFERS +LOWLIFES +LOWLIGHT +LOWLIGHTS +LOWLIHEAD +LOWLIHEADS +LOWLILY +LOWLINESS +LOWLINESSES +LOWLIVES +LOWLY +LOWN +LOWNESS +LOWNESSES +LOWRIDER +LOWRIDERS +LOWS +LOWSE +LOX +LOXED +LOXES +LOXING +LOXODROME +LOXODROMES +LOYAL +LOYALER +LOYALEST +LOYALISM +LOYALISMS +LOYALIST +LOYALISTS +LOYALLY +LOYALTIES +LOYALTY +LOZENGE +LOZENGES +LUAU +LUAUS +LUBBER +LUBBERLINESS +LUBBERLINESSES +LUBBERLY +LUBBERS +LUBE +LUBED +LUBES +LUBING +LUBRIC +LUBRICAL +LUBRICANT +LUBRICANTS +LUBRICATE +LUBRICATED +LUBRICATES +LUBRICATING +LUBRICATION +LUBRICATIONS +LUBRICATIVE +LUBRICATOR +LUBRICATORS +LUBRICIOUS +LUBRICIOUSLY +LUBRICITIES +LUBRICITY +LUBRICOUS +LUCARNE +LUCARNES +LUCE +LUCENCE +LUCENCES +LUCENCIES +LUCENCY +LUCENT +LUCENTLY +LUCERN +LUCERNE +LUCERNES +LUCERNS +LUCES +LUCID +LUCIDITIES +LUCIDITY +LUCIDLY +LUCIDNESS +LUCIDNESSES +LUCIFER +LUCIFERASE +LUCIFERASES +LUCIFERIN +LUCIFERINS +LUCIFEROUS +LUCIFERS +LUCITE +LUCITES +LUCK +LUCKED +LUCKIE +LUCKIER +LUCKIES +LUCKIEST +LUCKILY +LUCKINESS +LUCKINESSES +LUCKING +LUCKLESS +LUCKS +LUCKY +LUCRATIVE +LUCRATIVELY +LUCRATIVENESS +LUCRATIVENESSES +LUCRE +LUCRES +LUCUBRATE +LUCUBRATED +LUCUBRATES +LUCUBRATING +LUCUBRATION +LUCUBRATIONS +LUCULENT +LUCULENTLY +LUDE +LUDES +LUDIC +LUDICROUS +LUDICROUSLY +LUDICROUSNESS +LUDICROUSNESSES +LUES +LUETIC +LUETICS +LUFF +LUFFA +LUFFAS +LUFFED +LUFFING +LUFFS +LUFTMENSCH +LUFTMENSCHEN +LUG +LUGE +LUGED +LUGEING +LUGER +LUGERS +LUGES +LUGGAGE +LUGGAGES +LUGGED +LUGGER +LUGGERS +LUGGIE +LUGGIES +LUGGING +LUGING +LUGS +LUGSAIL +LUGSAILS +LUGUBRIOUS +LUGUBRIOUSLY +LUGUBRIOUSNESS +LUGWORM +LUGWORMS +LUKEWARM +LUKEWARMLY +LUKEWARMNESS +LUKEWARMNESSES +LULL +LULLABIED +LULLABIES +LULLABY +LULLABYING +LULLED +LULLER +LULLERS +LULLING +LULLS +LULU +LULUS +LUM +LUMA +LUMAS +LUMBAGO +LUMBAGOS +LUMBAR +LUMBARS +LUMBER +LUMBERED +LUMBERER +LUMBERERS +LUMBERING +LUMBERINGS +LUMBERJACK +LUMBERJACKS +LUMBERLY +LUMBERMAN +LUMBERMEN +LUMBERS +LUMBERYARD +LUMBERYARDS +LUMBOSACRAL +LUMBRICAL +LUMBRICALS +LUMEN +LUMENAL +LUMENS +LUMINA +LUMINAIRE +LUMINAIRES +LUMINAL +LUMINANCE +LUMINANCES +LUMINARIA +LUMINARIAS +LUMINARIES +LUMINARY +LUMINESCE +LUMINESCED +LUMINESCENCE +LUMINESCENCES +LUMINESCENT +LUMINESCES +LUMINESCING +LUMINIFEROUS +LUMINISM +LUMINISMS +LUMINIST +LUMINISTS +LUMINOSITIES +LUMINOSITY +LUMINOUS +LUMINOUSLY +LUMINOUSNESS +LUMINOUSNESSES +LUMMOX +LUMMOXES +LUMP +LUMPECTOMIES +LUMPECTOMY +LUMPED +LUMPEN +LUMPENS +LUMPER +LUMPERS +LUMPFISH +LUMPFISHES +LUMPIER +LUMPIEST +LUMPILY +LUMPINESS +LUMPINESSES +LUMPING +LUMPINGLY +LUMPISH +LUMPISHLY +LUMPISHNESS +LUMPISHNESSES +LUMPS +LUMPY +LUMS +LUNA +LUNACIES +LUNACY +LUNAR +LUNARIAN +LUNARIANS +LUNARS +LUNAS +LUNATE +LUNATED +LUNATELY +LUNATIC +LUNATICS +LUNATION +LUNATIONS +LUNCH +LUNCHBOX +LUNCHBOXES +LUNCHED +LUNCHEON +LUNCHEONETTE +LUNCHEONETTES +LUNCHEONS +LUNCHER +LUNCHERS +LUNCHES +LUNCHING +LUNCHMEAT +LUNCHMEATS +LUNCHROOM +LUNCHROOMS +LUNCHTIME +LUNCHTIMES +LUNE +LUNES +LUNET +LUNETS +LUNETTE +LUNETTES +LUNG +LUNGAN +LUNGANS +LUNGE +LUNGED +LUNGEE +LUNGEES +LUNGER +LUNGERS +LUNGES +LUNGFISH +LUNGFISHES +LUNGFUL +LUNGFULS +LUNGI +LUNGING +LUNGIS +LUNGS +LUNGWORM +LUNGWORMS +LUNGWORT +LUNGWORTS +LUNGYI +LUNGYIS +LUNIER +LUNIES +LUNIEST +LUNISOLAR +LUNITIDAL +LUNK +LUNKER +LUNKERS +LUNKHEAD +LUNKHEADED +LUNKHEADS +LUNKS +LUNT +LUNTED +LUNTING +LUNTS +LUNULA +LUNULAE +LUNULAR +LUNULATE +LUNULATED +LUNULE +LUNULES +LUNY +LUPANAR +LUPANARS +LUPIN +LUPINE +LUPINES +LUPINS +LUPOUS +LUPULIN +LUPULINS +LUPUS +LUPUSES +LURCH +LURCHED +LURCHER +LURCHERS +LURCHES +LURCHING +LURDAN +LURDANE +LURDANES +LURDANS +LURE +LURED +LURER +LURERS +LURES +LUREX +LUREXES +LURID +LURIDLY +LURIDNESS +LURIDNESSES +LURING +LURINGLY +LURK +LURKED +LURKER +LURKERS +LURKING +LURKINGLY +LURKS +LUSCIOUS +LUSCIOUSLY +LUSCIOUSNESS +LUSCIOUSNESSES +LUSH +LUSHED +LUSHER +LUSHES +LUSHEST +LUSHING +LUSHLY +LUSHNESS +LUSHNESSES +LUST +LUSTED +LUSTER +LUSTERED +LUSTERING +LUSTERLESS +LUSTERS +LUSTERWARE +LUSTERWARES +LUSTFUL +LUSTFULLY +LUSTFULNESS +LUSTFULNESSES +LUSTIER +LUSTIEST +LUSTIHOOD +LUSTIHOODS +LUSTILY +LUSTINESS +LUSTINESSES +LUSTING +LUSTRA +LUSTRAL +LUSTRATE +LUSTRATED +LUSTRATES +LUSTRATING +LUSTRATION +LUSTRATIONS +LUSTRE +LUSTRED +LUSTRES +LUSTRING +LUSTRINGS +LUSTROUS +LUSTROUSLY +LUSTROUSNESS +LUSTROUSNESSES +LUSTRUM +LUSTRUMS +LUSTS +LUSTY +LUSUS +LUSUSES +LUTANIST +LUTANISTS +LUTE +LUTEA +LUTEAL +LUTECIUM +LUTECIUMS +LUTED +LUTEFISK +LUTEFISKS +LUTEIN +LUTEINIZATION +LUTEINIZATIONS +LUTEINIZE +LUTEINIZED +LUTEINIZES +LUTEINIZING +LUTEINS +LUTENIST +LUTENISTS +LUTEOLIN +LUTEOLINS +LUTEOTROPHIC +LUTEOTROPHIN +LUTEOTROPHINS +LUTEOTROPIC +LUTEOTROPIN +LUTEOTROPINS +LUTEOUS +LUTES +LUTESTRING +LUTESTRINGS +LUTETIUM +LUTETIUMS +LUTEUM +LUTFISK +LUTFISKS +LUTHERN +LUTHERNS +LUTHIER +LUTHIERS +LUTING +LUTINGS +LUTIST +LUTISTS +LUTZ +LUTZES +LUV +LUVS +LUX +LUXATE +LUXATED +LUXATES +LUXATING +LUXATION +LUXATIONS +LUXE +LUXES +LUXURIANCE +LUXURIANCES +LUXURIANT +LUXURIANTLY +LUXURIATE +LUXURIATED +LUXURIATES +LUXURIATING +LUXURIES +LUXURIOUS +LUXURIOUSLY +LUXURIOUSNESS +LUXURIOUSNESSES +LUXURY +LWEI +LWEIS +LYARD +LYART +LYASE +LYASES +LYCANTHROPIES +LYCANTHROPY +LYCEA +LYCEE +LYCEES +LYCEUM +LYCEUMS +LYCH +LYCHEE +LYCHEES +LYCHES +LYCHNIS +LYCHNISES +LYCOPENE +LYCOPENES +LYCOPOD +LYCOPODIUM +LYCOPODIUMS +LYCOPODS +LYCRA +LYCRAS +LYDDITE +LYDDITES +LYE +LYES +LYING +LYINGLY +LYINGS +LYMPH +LYMPHADENITIS +LYMPHADENITISES +LYMPHADENOPATHY +LYMPHANGIOGRAM +LYMPHANGIOGRAMS +LYMPHATIC +LYMPHATICALLY +LYMPHATICS +LYMPHOBLAST +LYMPHOBLASTIC +LYMPHOBLASTS +LYMPHOCYTE +LYMPHOCYTES +LYMPHOCYTIC +LYMPHOCYTOSES +LYMPHOCYTOSIS +LYMPHOGRAM +LYMPHOGRAMS +LYMPHOGRANULOMA +LYMPHOGRAPHIC +LYMPHOGRAPHIES +LYMPHOGRAPHY +LYMPHOID +LYMPHOKINE +LYMPHOKINES +LYMPHOMA +LYMPHOMAS +LYMPHOMATA +LYMPHOMATOSES +LYMPHOMATOSIS +LYMPHOMATOUS +LYMPHOSARCOMA +LYMPHOSARCOMAS +LYMPHOSARCOMATA +LYMPHS +LYNCEAN +LYNCH +LYNCHED +LYNCHER +LYNCHERS +LYNCHES +LYNCHING +LYNCHINGS +LYNCHPIN +LYNCHPINS +LYNX +LYNXES +LYONNAISE +LYOPHILE +LYOPHILED +LYOPHILIC +LYOPHILISE +LYOPHILISED +LYOPHILISES +LYOPHILISING +LYOPHILIZATION +LYOPHILIZATIONS +LYOPHILIZE +LYOPHILIZED +LYOPHILIZER +LYOPHILIZERS +LYOPHILIZES +LYOPHILIZING +LYOPHOBIC +LYRATE +LYRATED +LYRATELY +LYRE +LYREBIRD +LYREBIRDS +LYRES +LYRIC +LYRICAL +LYRICALLY +LYRICALNESS +LYRICALNESSES +LYRICISE +LYRICISED +LYRICISES +LYRICISING +LYRICISM +LYRICISMS +LYRICIST +LYRICISTS +LYRICIZE +LYRICIZED +LYRICIZES +LYRICIZING +LYRICON +LYRICONS +LYRICS +LYRIFORM +LYRISM +LYRISMS +LYRIST +LYRISTS +LYSATE +LYSATES +LYSE +LYSED +LYSES +LYSIMETER +LYSIMETERS +LYSIMETRIC +LYSIN +LYSINE +LYSINES +LYSING +LYSINS +LYSIS +LYSOGEN +LYSOGENIC +LYSOGENICITIES +LYSOGENICITY +LYSOGENIES +LYSOGENISE +LYSOGENISED +LYSOGENISES +LYSOGENISING +LYSOGENIZATION +LYSOGENIZATIONS +LYSOGENIZE +LYSOGENIZED +LYSOGENIZES +LYSOGENIZING +LYSOGENS +LYSOGENY +LYSOLECITHIN +LYSOLECITHINS +LYSOSOMAL +LYSOSOME +LYSOSOMES +LYSOZYME +LYSOZYMES +LYSSA +LYSSAS +LYTIC +LYTICALLY +LYTTA +LYTTAE +LYTTAS +MA +MAAR +MAARS +MABE +MABES +MAC +MACABER +MACABRE +MACABRELY +MACACO +MACACOS +MACADAM +MACADAMIA +MACADAMIAS +MACADAMIZE +MACADAMIZED +MACADAMIZES +MACADAMIZING +MACADAMS +MACAQUE +MACAQUES +MACARONI +MACARONIC +MACARONICS +MACARONIES +MACARONIS +MACAROON +MACAROONS +MACAW +MACAWS +MACCABAW +MACCABAWS +MACCABOY +MACCABOYS +MACCHIA +MACCHIE +MACCOBOY +MACCOBOYS +MACE +MACED +MACEDOINE +MACEDOINES +MACER +MACERATE +MACERATED +MACERATER +MACERATERS +MACERATES +MACERATING +MACERATION +MACERATIONS +MACERATOR +MACERATORS +MACERS +MACES +MACH +MACHE +MACHES +MACHETE +MACHETES +MACHICOLATED +MACHICOLATION +MACHICOLATIONS +MACHINABILITIES +MACHINABILITY +MACHINABLE +MACHINATE +MACHINATED +MACHINATES +MACHINATING +MACHINATION +MACHINATIONS +MACHINATOR +MACHINATORS +MACHINE +MACHINEABILITY +MACHINEABLE +MACHINED +MACHINELIKE +MACHINERIES +MACHINERY +MACHINES +MACHINING +MACHINIST +MACHINISTS +MACHISMO +MACHISMOS +MACHO +MACHOISM +MACHOISMS +MACHOS +MACHREE +MACHREES +MACHS +MACHZOR +MACHZORIM +MACHZORS +MACING +MACINTOSH +MACINTOSHES +MACK +MACKEREL +MACKERELS +MACKINAW +MACKINAWS +MACKINTOSH +MACKINTOSHES +MACKLE +MACKLED +MACKLES +MACKLING +MACKS +MACLE +MACLED +MACLES +MACON +MACONS +MACRAME +MACRAMES +MACRO +MACROAGGREGATE +MACROAGGREGATED +MACROAGGREGATES +MACROBIOTIC +MACROCOSM +MACROCOSMIC +MACROCOSMICALLY +MACROCOSMS +MACROCYCLIC +MACROCYST +MACROCYSTS +MACROCYTE +MACROCYTES +MACROCYTIC +MACROCYTOSES +MACROCYTOSIS +MACRODONT +MACROECONOMIC +MACROECONOMICS +MACROEVOLUTION +MACROEVOLUTIONS +MACROFOSSIL +MACROFOSSILS +MACROGAMETE +MACROGAMETES +MACROGLOBULIN +MACROGLOBULINS +MACROMERE +MACROMERES +MACROMOLE +MACROMOLECULAR +MACROMOLECULE +MACROMOLECULES +MACROMOLES +MACRON +MACRONS +MACRONUCLEAR +MACRONUCLEI +MACRONUCLEUS +MACRONUTRIENT +MACRONUTRIENTS +MACROPHAGE +MACROPHAGES +MACROPHAGIC +MACROPHOTOGRAPH +MACROPHYTE +MACROPHYTES +MACROPHYTIC +MACROPTEROUS +MACROS +MACROSCALE +MACROSCALES +MACROSCOPIC +MACROSCOPICALLY +MACROSTRUCTURAL +MACROSTRUCTURE +MACROSTRUCTURES +MACRURAL +MACRURAN +MACRURANS +MACRUROUS +MACS +MACULA +MACULAE +MACULAR +MACULAS +MACULATE +MACULATED +MACULATES +MACULATING +MACULATION +MACULATIONS +MACULE +MACULED +MACULES +MACULING +MACUMBA +MACUMBAS +MAD +MADAM +MADAME +MADAMES +MADAMS +MADCAP +MADCAPS +MADDED +MADDEN +MADDENED +MADDENING +MADDENINGLY +MADDENS +MADDER +MADDERS +MADDEST +MADDING +MADDISH +MADE +MADEIRA +MADEIRAS +MADELEINE +MADELEINES +MADEMOISELLE +MADEMOISELLES +MADERIZE +MADERIZED +MADERIZES +MADERIZING +MADHOUSE +MADHOUSES +MADLY +MADMAN +MADMEN +MADNESS +MADNESSES +MADONNA +MADONNAS +MADRAS +MADRASA +MADRASAH +MADRASAHS +MADRASAS +MADRASES +MADRASSA +MADRASSAH +MADRASSAHS +MADRASSAS +MADRE +MADREPORE +MADREPORES +MADREPORIAN +MADREPORIANS +MADREPORIC +MADREPORITE +MADREPORITES +MADRES +MADRIGAL +MADRIGALIAN +MADRIGALIST +MADRIGALISTS +MADRIGALS +MADRILENE +MADRILENES +MADRONA +MADRONAS +MADRONE +MADRONES +MADRONO +MADRONOS +MADS +MADTOM +MADTOMS +MADURO +MADUROS +MADWOMAN +MADWOMEN +MADWORT +MADWORTS +MADZOON +MADZOONS +MAE +MAELSTROM +MAELSTROMS +MAENAD +MAENADES +MAENADIC +MAENADISM +MAENADISMS +MAENADS +MAES +MAESTOSO +MAESTOSOS +MAESTRI +MAESTRO +MAESTROS +MAFFIA +MAFFIAS +MAFFICK +MAFFICKED +MAFFICKER +MAFFICKERS +MAFFICKING +MAFFICKS +MAFIA +MAFIAS +MAFIC +MAFIOSI +MAFIOSO +MAFIOSOS +MAFTIR +MAFTIRS +MAG +MAGALOG +MAGALOGS +MAGALOGUE +MAGALOGUES +MAGAZINE +MAGAZINES +MAGAZINIST +MAGAZINISTS +MAGDALEN +MAGDALENE +MAGDALENES +MAGDALENS +MAGE +MAGENTA +MAGENTAS +MAGES +MAGGOT +MAGGOTS +MAGGOTY +MAGI +MAGIAN +MAGIANS +MAGIC +MAGICAL +MAGICALLY +MAGICIAN +MAGICIANS +MAGICKED +MAGICKING +MAGICS +MAGILP +MAGILPS +MAGISTER +MAGISTERIAL +MAGISTERIALLY +MAGISTERIUM +MAGISTERIUMS +MAGISTERS +MAGISTRACIES +MAGISTRACY +MAGISTRAL +MAGISTRALLY +MAGISTRATE +MAGISTRATES +MAGISTRATICAL +MAGISTRATICALLY +MAGISTRATURE +MAGISTRATURES +MAGLEV +MAGLEVS +MAGMA +MAGMAS +MAGMATA +MAGMATIC +MAGNANIMITIES +MAGNANIMITY +MAGNANIMOUS +MAGNANIMOUSLY +MAGNANIMOUSNESS +MAGNATE +MAGNATES +MAGNESIA +MAGNESIAN +MAGNESIAS +MAGNESIC +MAGNESITE +MAGNESITES +MAGNESIUM +MAGNESIUMS +MAGNET +MAGNETIC +MAGNETICALLY +MAGNETICS +MAGNETISE +MAGNETISED +MAGNETISES +MAGNETISING +MAGNETISM +MAGNETISMS +MAGNETITE +MAGNETITES +MAGNETIZABLE +MAGNETIZATION +MAGNETIZATIONS +MAGNETIZE +MAGNETIZED +MAGNETIZER +MAGNETIZERS +MAGNETIZES +MAGNETIZING +MAGNETO +MAGNETOELECTRIC +MAGNETOGRAPH +MAGNETOGRAPHS +MAGNETOMETER +MAGNETOMETERS +MAGNETOMETRIC +MAGNETOMETRIES +MAGNETOMETRY +MAGNETON +MAGNETONS +MAGNETOPAUSE +MAGNETOPAUSES +MAGNETOS +MAGNETOSPHERE +MAGNETOSPHERES +MAGNETOSPHERIC +MAGNETOSTATIC +MAGNETRON +MAGNETRONS +MAGNETS +MAGNIFIC +MAGNIFICAL +MAGNIFICALLY +MAGNIFICAT +MAGNIFICATION +MAGNIFICATIONS +MAGNIFICATS +MAGNIFICENCE +MAGNIFICENCES +MAGNIFICENT +MAGNIFICENTLY +MAGNIFICO +MAGNIFICOES +MAGNIFICOS +MAGNIFIED +MAGNIFIER +MAGNIFIERS +MAGNIFIES +MAGNIFY +MAGNIFYING +MAGNILOQUENCE +MAGNILOQUENCES +MAGNILOQUENT +MAGNILOQUENTLY +MAGNITUDE +MAGNITUDES +MAGNOLIA +MAGNOLIAS +MAGNUM +MAGNUMS +MAGOT +MAGOTS +MAGPIE +MAGPIES +MAGS +MAGUEY +MAGUEYS +MAGUS +MAHARAJA +MAHARAJAH +MAHARAJAHS +MAHARAJAS +MAHARANEE +MAHARANEES +MAHARANI +MAHARANIS +MAHARISHI +MAHARISHIS +MAHATMA +MAHATMAS +MAHIMAHI +MAHIMAHIS +MAHJONG +MAHJONGG +MAHJONGGS +MAHJONGS +MAHLSTICK +MAHLSTICKS +MAHOE +MAHOES +MAHOGANIES +MAHOGANY +MAHONIA +MAHONIAS +MAHOUT +MAHOUTS +MAHUANG +MAHUANGS +MAHZOR +MAHZORIM +MAHZORS +MAIASAUR +MAIASAURA +MAIASAURAS +MAIASAURS +MAID +MAIDEN +MAIDENHAIR +MAIDENHAIRS +MAIDENHEAD +MAIDENHEADS +MAIDENHOOD +MAIDENHOODS +MAIDENLINESS +MAIDENLINESSES +MAIDENLY +MAIDENS +MAIDHOOD +MAIDHOODS +MAIDISH +MAIDS +MAIDSERVANT +MAIDSERVANTS +MAIEUTIC +MAIGRE +MAIHEM +MAIHEMS +MAIL +MAILABILITIES +MAILABILITY +MAILABLE +MAILBAG +MAILBAGS +MAILBOX +MAILBOXES +MAILE +MAILED +MAILER +MAILERS +MAILES +MAILGRAM +MAILGRAMS +MAILING +MAILINGS +MAILL +MAILLESS +MAILLOT +MAILLOTS +MAILLS +MAILMAN +MAILMEN +MAILROOM +MAILROOMS +MAILS +MAIM +MAIMED +MAIMER +MAIMERS +MAIMING +MAIMS +MAIN +MAINFRAME +MAINFRAMES +MAINLAND +MAINLANDER +MAINLANDERS +MAINLANDS +MAINLINE +MAINLINED +MAINLINER +MAINLINERS +MAINLINES +MAINLINING +MAINLY +MAINMAST +MAINMASTS +MAINS +MAINSAIL +MAINSAILS +MAINSHEET +MAINSHEETS +MAINSPRING +MAINSPRINGS +MAINSTAY +MAINSTAYS +MAINSTREAM +MAINSTREAMED +MAINSTREAMING +MAINSTREAMS +MAINTAIN +MAINTAINABILITY +MAINTAINABLE +MAINTAINED +MAINTAINER +MAINTAINERS +MAINTAINING +MAINTAINS +MAINTENANCE +MAINTENANCES +MAINTOP +MAINTOPS +MAIOLICA +MAIOLICAS +MAIR +MAIRS +MAISONETTE +MAISONETTES +MAIST +MAISTS +MAIZE +MAIZES +MAJAGUA +MAJAGUAS +MAJESTIC +MAJESTICALLY +MAJESTIES +MAJESTY +MAJOLICA +MAJOLICAS +MAJOR +MAJORDOMO +MAJORDOMOS +MAJORED +MAJORETTE +MAJORETTES +MAJORING +MAJORITARIAN +MAJORITARIANISM +MAJORITARIANS +MAJORITIES +MAJORITY +MAJORLY +MAJORS +MAJUSCULAR +MAJUSCULE +MAJUSCULES +MAKABLE +MAKAR +MAKARS +MAKE +MAKEABLE +MAKEBATE +MAKEBATES +MAKEFAST +MAKEFASTS +MAKEOVER +MAKEOVERS +MAKER +MAKEREADIES +MAKEREADY +MAKERS +MAKES +MAKESHIFT +MAKESHIFTS +MAKEUP +MAKEUPS +MAKEWEIGHT +MAKEWEIGHTS +MAKIMONO +MAKIMONOS +MAKING +MAKINGS +MAKO +MAKOS +MAKUTA +MALABSORPTION +MALABSORPTIONS +MALACCA +MALACCAS +MALACHITE +MALACHITES +MALACOLOGICAL +MALACOLOGIES +MALACOLOGIST +MALACOLOGISTS +MALACOLOGY +MALACOSTRACAN +MALACOSTRACANS +MALADAPTATION +MALADAPTATIONS +MALADAPTED +MALADAPTIVE +MALADIES +MALADJUSTED +MALADJUSTIVE +MALADJUSTMENT +MALADJUSTMENTS +MALADMINISTER +MALADMINISTERED +MALADMINISTERS +MALADROIT +MALADROITLY +MALADROITNESS +MALADROITNESSES +MALADROITS +MALADY +MALAGUENA +MALAGUENAS +MALAISE +MALAISES +MALAMUTE +MALAMUTES +MALANDERS +MALANGA +MALANGAS +MALAPERT +MALAPERTLY +MALAPERTNESS +MALAPERTNESSES +MALAPERTS +MALAPPORTIONED +MALAPROP +MALAPROPIAN +MALAPROPISM +MALAPROPISMS +MALAPROPIST +MALAPROPISTS +MALAPROPOS +MALAPROPS +MALAR +MALARIA +MALARIAL +MALARIAN +MALARIAS +MALARIOLOGIES +MALARIOLOGIST +MALARIOLOGISTS +MALARIOLOGY +MALARIOUS +MALARKEY +MALARKEYS +MALARKIES +MALARKY +MALAROMA +MALAROMAS +MALARS +MALATE +MALATES +MALATHION +MALATHIONS +MALCONTENT +MALCONTENTED +MALCONTENTEDLY +MALCONTENTS +MALDISTRIBUTION +MALE +MALEATE +MALEATES +MALEDICT +MALEDICTED +MALEDICTING +MALEDICTION +MALEDICTIONS +MALEDICTORY +MALEDICTS +MALEFACTION +MALEFACTIONS +MALEFACTOR +MALEFACTORS +MALEFIC +MALEFICENCE +MALEFICENCES +MALEFICENT +MALEMIUT +MALEMIUTS +MALEMUTE +MALEMUTES +MALENESS +MALENESSES +MALES +MALEVOLENCE +MALEVOLENCES +MALEVOLENT +MALEVOLENTLY +MALFEASANCE +MALFEASANCES +MALFED +MALFORMATION +MALFORMATIONS +MALFORMED +MALFUNCTION +MALFUNCTIONED +MALFUNCTIONING +MALFUNCTIONS +MALGRE +MALIC +MALICE +MALICES +MALICIOUS +MALICIOUSLY +MALICIOUSNESS +MALICIOUSNESSES +MALIGN +MALIGNANCE +MALIGNANCES +MALIGNANCIES +MALIGNANCY +MALIGNANT +MALIGNANTLY +MALIGNED +MALIGNER +MALIGNERS +MALIGNING +MALIGNITIES +MALIGNITY +MALIGNLY +MALIGNS +MALIHINI +MALIHINIS +MALINE +MALINES +MALINGER +MALINGERED +MALINGERER +MALINGERERS +MALINGERING +MALINGERS +MALISON +MALISONS +MALKIN +MALKINS +MALL +MALLARD +MALLARDS +MALLEABILITIES +MALLEABILITY +MALLEABLE +MALLEABLY +MALLED +MALLEE +MALLEES +MALLEI +MALLEMUCK +MALLEMUCKS +MALLEOLAR +MALLEOLI +MALLEOLUS +MALLET +MALLETS +MALLEUS +MALLING +MALLINGS +MALLOW +MALLOWS +MALLS +MALM +MALMIER +MALMIEST +MALMS +MALMSEY +MALMSEYS +MALMY +MALNOURISHED +MALNUTRITION +MALNUTRITIONS +MALOCCLUSION +MALOCCLUSIONS +MALODOR +MALODOROUS +MALODOROUSLY +MALODOROUSNESS +MALODORS +MALOLACTIC +MALOTI +MALPIGHIA +MALPOSED +MALPOSITION +MALPOSITIONS +MALPRACTICE +MALPRACTICES +MALPRACTITIONER +MALT +MALTASE +MALTASES +MALTED +MALTEDS +MALTHA +MALTHAS +MALTIER +MALTIEST +MALTINESS +MALTINESSES +MALTING +MALTOL +MALTOLS +MALTOSE +MALTOSES +MALTREAT +MALTREATED +MALTREATER +MALTREATERS +MALTREATING +MALTREATMENT +MALTREATMENTS +MALTREATS +MALTS +MALTSTER +MALTSTERS +MALTY +MALVASIA +MALVASIAN +MALVASIAS +MALVERSATION +MALVERSATIONS +MAMA +MAMALIGA +MAMALIGAS +MAMAS +MAMBA +MAMBAS +MAMBO +MAMBOED +MAMBOES +MAMBOING +MAMBOS +MAMELUKE +MAMELUKES +MAMEY +MAMEYES +MAMEYS +MAMIE +MAMIES +MAMLUK +MAMLUKS +MAMMA +MAMMAE +MAMMAL +MAMMALIAN +MAMMALIANS +MAMMALITIES +MAMMALITY +MAMMALOGIES +MAMMALOGIST +MAMMALOGISTS +MAMMALOGY +MAMMALS +MAMMARY +MAMMAS +MAMMATE +MAMMATI +MAMMATUS +MAMMEE +MAMMEES +MAMMER +MAMMERED +MAMMERING +MAMMERS +MAMMET +MAMMETS +MAMMEY +MAMMEYS +MAMMIE +MAMMIES +MAMMILLA +MAMMILLAE +MAMMILLARY +MAMMILLATED +MAMMITIDES +MAMMITIS +MAMMOCK +MAMMOCKED +MAMMOCKING +MAMMOCKS +MAMMOGRAM +MAMMOGRAMS +MAMMOGRAPHIC +MAMMOGRAPHIES +MAMMOGRAPHY +MAMMON +MAMMONISM +MAMMONISMS +MAMMONIST +MAMMONISTS +MAMMONS +MAMMOTH +MAMMOTHS +MAMMY +MAMZER +MAMZERS +MAN +MANA +MANACLE +MANACLED +MANACLES +MANACLING +MANAGE +MANAGEABILITIES +MANAGEABILITY +MANAGEABLE +MANAGEABLENESS +MANAGEABLY +MANAGED +MANAGEMENT +MANAGEMENTAL +MANAGEMENTS +MANAGER +MANAGERESS +MANAGERESSES +MANAGERIAL +MANAGERIALLY +MANAGERS +MANAGERSHIP +MANAGERSHIPS +MANAGES +MANAGING +MANAKIN +MANAKINS +MANANA +MANANAS +MANAS +MANAT +MANATEE +MANATEES +MANATOID +MANATS +MANCHE +MANCHES +MANCHET +MANCHETS +MANCHINEEL +MANCHINEELS +MANCIPLE +MANCIPLES +MANDALA +MANDALAS +MANDALIC +MANDAMUS +MANDAMUSED +MANDAMUSES +MANDAMUSING +MANDARIN +MANDARINATE +MANDARINATES +MANDARINIC +MANDARINISM +MANDARINISMS +MANDARINS +MANDATARIES +MANDATARY +MANDATE +MANDATED +MANDATES +MANDATING +MANDATOR +MANDATORIES +MANDATORILY +MANDATORS +MANDATORY +MANDIBLE +MANDIBLES +MANDIBULAR +MANDIBULATE +MANDIOCA +MANDIOCAS +MANDOLA +MANDOLAS +MANDOLIN +MANDOLINE +MANDOLINES +MANDOLINIST +MANDOLINISTS +MANDOLINS +MANDRAGORA +MANDRAGORAS +MANDRAKE +MANDRAKES +MANDREL +MANDRELS +MANDRIL +MANDRILL +MANDRILLS +MANDRILS +MANDUCATE +MANDUCATED +MANDUCATES +MANDUCATING +MANE +MANED +MANEGE +MANEGES +MANELESS +MANES +MANEUVER +MANEUVERABILITY +MANEUVERABLE +MANEUVERED +MANEUVERER +MANEUVERERS +MANEUVERING +MANEUVERS +MANFUL +MANFULLY +MANFULNESS +MANFULNESSES +MANGA +MANGABEY +MANGABEYS +MANGABIES +MANGABY +MANGANATE +MANGANATES +MANGANESE +MANGANESES +MANGANESIAN +MANGANIC +MANGANIN +MANGANINS +MANGANITE +MANGANITES +MANGANOUS +MANGAS +MANGE +MANGEL +MANGELS +MANGER +MANGERS +MANGES +MANGEY +MANGIER +MANGIEST +MANGILY +MANGINESS +MANGINESSES +MANGLE +MANGLED +MANGLER +MANGLERS +MANGLES +MANGLING +MANGO +MANGOES +MANGOLD +MANGOLDS +MANGONEL +MANGONELS +MANGOS +MANGOSTEEN +MANGOSTEENS +MANGROVE +MANGROVES +MANGY +MANHANDLE +MANHANDLED +MANHANDLES +MANHANDLING +MANHATTAN +MANHATTANS +MANHOLE +MANHOLES +MANHOOD +MANHOODS +MANHUNT +MANHUNTS +MANIA +MANIAC +MANIACAL +MANIACALLY +MANIACS +MANIAS +MANIC +MANICALLY +MANICOTTI +MANICOTTIS +MANICS +MANICURE +MANICURED +MANICURES +MANICURING +MANICURIST +MANICURISTS +MANIFEST +MANIFESTANT +MANIFESTANTS +MANIFESTATION +MANIFESTATIONS +MANIFESTED +MANIFESTER +MANIFESTERS +MANIFESTING +MANIFESTLY +MANIFESTO +MANIFESTOED +MANIFESTOES +MANIFESTOING +MANIFESTOS +MANIFESTS +MANIFOLD +MANIFOLDED +MANIFOLDING +MANIFOLDLY +MANIFOLDNESS +MANIFOLDNESSES +MANIFOLDS +MANIHOT +MANIHOTS +MANIKIN +MANIKINS +MANILA +MANILAS +MANILLA +MANILLAS +MANILLE +MANILLES +MANIOC +MANIOCA +MANIOCAS +MANIOCS +MANIPLE +MANIPLES +MANIPULABILITY +MANIPULABLE +MANIPULAR +MANIPULARS +MANIPULATABLE +MANIPULATE +MANIPULATED +MANIPULATES +MANIPULATING +MANIPULATION +MANIPULATIONS +MANIPULATIVE +MANIPULATIVELY +MANIPULATOR +MANIPULATORS +MANIPULATORY +MANITO +MANITOS +MANITOU +MANITOUS +MANITU +MANITUS +MANKIND +MANLESS +MANLIER +MANLIEST +MANLIKE +MANLIKELY +MANLILY +MANLINESS +MANLINESSES +MANLY +MANMADE +MANNA +MANNAN +MANNANS +MANNAS +MANNED +MANNEQUIN +MANNEQUINS +MANNER +MANNERED +MANNERISM +MANNERISMS +MANNERIST +MANNERISTIC +MANNERISTS +MANNERLESS +MANNERLINESS +MANNERLINESSES +MANNERLY +MANNERS +MANNIKIN +MANNIKINS +MANNING +MANNISH +MANNISHLY +MANNISHNESS +MANNISHNESSES +MANNITE +MANNITES +MANNITIC +MANNITOL +MANNITOLS +MANNOSE +MANNOSES +MANO +MANOEUVRE +MANOEUVRED +MANOEUVRES +MANOEUVRING +MANOMETER +MANOMETERS +MANOMETRIC +MANOMETRICALLY +MANOMETRIES +MANOMETRY +MANOR +MANORIAL +MANORIALISM +MANORIALISMS +MANORS +MANOS +MANPACK +MANPOWER +MANPOWERS +MANQUE +MANROPE +MANROPES +MANS +MANSARD +MANSARDED +MANSARDS +MANSE +MANSERVANT +MANSES +MANSION +MANSIONS +MANSLAUGHTER +MANSLAUGHTERS +MANSLAYER +MANSLAYERS +MANSUETUDE +MANSUETUDES +MANTA +MANTAS +MANTEAU +MANTEAUS +MANTEAUX +MANTEL +MANTELET +MANTELETS +MANTELPIECE +MANTELPIECES +MANTELS +MANTELSHELF +MANTELSHELVES +MANTES +MANTIC +MANTICORE +MANTICORES +MANTID +MANTIDS +MANTILLA +MANTILLAS +MANTIS +MANTISES +MANTISSA +MANTISSAS +MANTLE +MANTLED +MANTLES +MANTLET +MANTLETS +MANTLING +MANTLINGS +MANTRA +MANTRAM +MANTRAMS +MANTRAP +MANTRAPS +MANTRAS +MANTRIC +MANTUA +MANTUAS +MANUAL +MANUALLY +MANUALS +MANUARY +MANUBRIA +MANUBRIAL +MANUBRIUM +MANUBRIUMS +MANUFACTORIES +MANUFACTORY +MANUFACTURE +MANUFACTURED +MANUFACTURER +MANUFACTURERS +MANUFACTURES +MANUFACTURING +MANUFACTURINGS +MANUMISSION +MANUMISSIONS +MANUMIT +MANUMITS +MANUMITTED +MANUMITTING +MANURE +MANURED +MANURER +MANURERS +MANURES +MANURIAL +MANURING +MANUS +MANUSCRIPT +MANUSCRIPTS +MANWARD +MANWARDS +MANWISE +MANY +MANYFOLD +MANYPLIES +MANZANITA +MANZANITAS +MAP +MAPLE +MAPLELIKE +MAPLES +MAPLIKE +MAPMAKER +MAPMAKERS +MAPMAKING +MAPMAKINGS +MAPPABLE +MAPPED +MAPPER +MAPPERS +MAPPING +MAPPINGS +MAPS +MAQUETTE +MAQUETTES +MAQUI +MAQUILA +MAQUILADORA +MAQUILADORAS +MAQUILAS +MAQUILLAGE +MAQUILLAGES +MAQUIS +MAR +MARA +MARABOU +MARABOUS +MARABOUT +MARABOUTS +MARACA +MARACAS +MARANATHA +MARANATHAS +MARANTA +MARANTAS +MARAS +MARASCA +MARASCAS +MARASCHINO +MARASCHINOS +MARASMIC +MARASMOID +MARASMUS +MARASMUSES +MARATHON +MARATHONER +MARATHONERS +MARATHONING +MARATHONINGS +MARATHONS +MARAUD +MARAUDED +MARAUDER +MARAUDERS +MARAUDING +MARAUDS +MARAVEDI +MARAVEDIS +MARBELIZE +MARBELIZED +MARBELIZES +MARBELIZING +MARBLE +MARBLED +MARBLEISE +MARBLEISED +MARBLEISES +MARBLEISING +MARBLEIZE +MARBLEIZED +MARBLEIZES +MARBLEIZING +MARBLER +MARBLERS +MARBLES +MARBLIER +MARBLIEST +MARBLING +MARBLINGS +MARBLY +MARC +MARCASITE +MARCASITES +MARCATO +MARCATOS +MARCEL +MARCELLED +MARCELLER +MARCELLERS +MARCELLING +MARCELS +MARCH +MARCHED +MARCHEN +MARCHER +MARCHERS +MARCHES +MARCHESA +MARCHESE +MARCHESI +MARCHING +MARCHIONESS +MARCHIONESSES +MARCHLAND +MARCHLANDS +MARCHLIKE +MARCHPANE +MARCHPANES +MARCS +MARE +MAREMMA +MAREMME +MARENGO +MARES +MARGARIC +MARGARIN +MARGARINE +MARGARINES +MARGARINS +MARGARITA +MARGARITAS +MARGARITE +MARGARITES +MARGAY +MARGAYS +MARGE +MARGENT +MARGENTED +MARGENTING +MARGENTS +MARGES +MARGIN +MARGINAL +MARGINALIA +MARGINALITIES +MARGINALITY +MARGINALIZATION +MARGINALIZE +MARGINALIZED +MARGINALIZES +MARGINALIZING +MARGINALLY +MARGINALS +MARGINATE +MARGINATED +MARGINATES +MARGINATING +MARGINATION +MARGINATIONS +MARGINED +MARGINING +MARGINS +MARGRAVATE +MARGRAVATES +MARGRAVE +MARGRAVES +MARGRAVIAL +MARGRAVIATE +MARGRAVIATES +MARGRAVINE +MARGRAVINES +MARGUERITE +MARGUERITES +MARIA +MARIACHI +MARIACHIS +MARICULTURE +MARICULTURES +MARICULTURIST +MARICULTURISTS +MARIGOLD +MARIGOLDS +MARIHUANA +MARIHUANAS +MARIJUANA +MARIJUANAS +MARIMBA +MARIMBAS +MARIMBIST +MARIMBISTS +MARINA +MARINADE +MARINADED +MARINADES +MARINADING +MARINARA +MARINARAS +MARINAS +MARINATE +MARINATED +MARINATES +MARINATING +MARINATION +MARINATIONS +MARINE +MARINER +MARINERS +MARINES +MARIONETTE +MARIONETTES +MARIPOSA +MARIPOSAS +MARISH +MARISHES +MARITAL +MARITALLY +MARITIME +MARJORAM +MARJORAMS +MARK +MARKA +MARKAS +MARKDOWN +MARKDOWNS +MARKED +MARKEDLY +MARKEDNESS +MARKEDNESSES +MARKER +MARKERS +MARKET +MARKETABILITIES +MARKETABILITY +MARKETABLE +MARKETED +MARKETEER +MARKETEERS +MARKETER +MARKETERS +MARKETING +MARKETINGS +MARKETPLACE +MARKETPLACES +MARKETS +MARKHOOR +MARKHOORS +MARKHOR +MARKHORS +MARKING +MARKINGS +MARKKA +MARKKAA +MARKKAS +MARKS +MARKSMAN +MARKSMANSHIP +MARKSMANSHIPS +MARKSMEN +MARKSWOMAN +MARKSWOMEN +MARKUP +MARKUPS +MARL +MARLED +MARLIER +MARLIEST +MARLIN +MARLINE +MARLINES +MARLINESPIKE +MARLINESPIKES +MARLING +MARLINGS +MARLINS +MARLINSPIKE +MARLINSPIKES +MARLITE +MARLITES +MARLITIC +MARLS +MARLSTONE +MARLSTONES +MARLY +MARMALADE +MARMALADES +MARMITE +MARMITES +MARMOREAL +MARMOREALLY +MARMOREAN +MARMOSET +MARMOSETS +MARMOT +MARMOTS +MAROCAIN +MAROCAINS +MAROON +MAROONED +MAROONING +MAROONS +MARPLOT +MARPLOTS +MARQUE +MARQUEE +MARQUEES +MARQUES +MARQUESS +MARQUESSATE +MARQUESSATES +MARQUESSES +MARQUETERIE +MARQUETERIES +MARQUETRIES +MARQUETRY +MARQUIS +MARQUISATE +MARQUISATES +MARQUISE +MARQUISES +MARQUISETTE +MARQUISETTES +MARRAM +MARRAMS +MARRANO +MARRANOS +MARRED +MARRER +MARRERS +MARRIAGE +MARRIAGEABILITY +MARRIAGEABLE +MARRIAGES +MARRIED +MARRIEDS +MARRIER +MARRIERS +MARRIES +MARRING +MARRON +MARRONS +MARROW +MARROWBONE +MARROWBONES +MARROWED +MARROWFAT +MARROWFATS +MARROWING +MARROWS +MARROWY +MARRY +MARRYING +MARS +MARSALA +MARSALAS +MARSE +MARSEILLE +MARSEILLES +MARSES +MARSH +MARSHAL +MARSHALCIES +MARSHALCY +MARSHALED +MARSHALING +MARSHALL +MARSHALLED +MARSHALLING +MARSHALLS +MARSHALS +MARSHALSHIP +MARSHALSHIPS +MARSHES +MARSHIER +MARSHIEST +MARSHINESS +MARSHINESSES +MARSHLAND +MARSHLANDS +MARSHLIKE +MARSHMALLOW +MARSHMALLOWS +MARSHMALLOWY +MARSHY +MARSUPIA +MARSUPIAL +MARSUPIALS +MARSUPIUM +MART +MARTAGON +MARTAGONS +MARTED +MARTELLO +MARTELLOS +MARTEN +MARTENS +MARTENSITE +MARTENSITES +MARTENSITIC +MARTENSITICALLY +MARTIAL +MARTIALLY +MARTIAN +MARTIANS +MARTIN +MARTINET +MARTINETS +MARTING +MARTINGAL +MARTINGALE +MARTINGALES +MARTINGALS +MARTINI +MARTINIS +MARTINS +MARTLET +MARTLETS +MARTS +MARTYR +MARTYRDOM +MARTYRDOMS +MARTYRED +MARTYRIES +MARTYRING +MARTYRIZATION +MARTYRIZATIONS +MARTYRIZE +MARTYRIZED +MARTYRIZES +MARTYRIZING +MARTYRLY +MARTYROLOGIES +MARTYROLOGIST +MARTYROLOGISTS +MARTYROLOGY +MARTYRS +MARTYRY +MARVEL +MARVELED +MARVELING +MARVELLED +MARVELLING +MARVELLOUS +MARVELOUS +MARVELOUSLY +MARVELOUSNESS +MARVELOUSNESSES +MARVELS +MARVY +MARYJANE +MARYJANES +MARZIPAN +MARZIPANS +MAS +MASA +MASALA +MASALAS +MASAS +MASCARA +MASCARAED +MASCARAING +MASCARAS +MASCARPONE +MASCARPONES +MASCON +MASCONS +MASCOT +MASCOTS +MASCULINE +MASCULINELY +MASCULINES +MASCULINISE +MASCULINISED +MASCULINISES +MASCULINISING +MASCULINIST +MASCULINISTS +MASCULINITIES +MASCULINITY +MASCULINIZATION +MASCULINIZE +MASCULINIZED +MASCULINIZES +MASCULINIZING +MASER +MASERS +MASH +MASHED +MASHER +MASHERS +MASHES +MASHGIACH +MASHGIAH +MASHGICHIM +MASHGIHIM +MASHIE +MASHIES +MASHING +MASHY +MASJID +MASJIDS +MASK +MASKABLE +MASKED +MASKEG +MASKEGS +MASKER +MASKERS +MASKING +MASKINGS +MASKLIKE +MASKS +MASOCHISM +MASOCHISMS +MASOCHIST +MASOCHISTIC +MASOCHISTICALLY +MASOCHISTS +MASON +MASONED +MASONIC +MASONING +MASONITE +MASONITES +MASONRIES +MASONRY +MASONS +MASQUE +MASQUER +MASQUERADE +MASQUERADED +MASQUERADER +MASQUERADERS +MASQUERADES +MASQUERADING +MASQUERS +MASQUES +MASS +MASSA +MASSACRE +MASSACRED +MASSACRER +MASSACRERS +MASSACRES +MASSACRING +MASSAGE +MASSAGED +MASSAGER +MASSAGERS +MASSAGES +MASSAGING +MASSAS +MASSASAUGA +MASSASAUGAS +MASSCULT +MASSCULTS +MASSE +MASSED +MASSEDLY +MASSES +MASSETER +MASSETERIC +MASSETERS +MASSEUR +MASSEURS +MASSEUSE +MASSEUSES +MASSICOT +MASSICOTS +MASSIER +MASSIEST +MASSIF +MASSIFS +MASSINESS +MASSINESSES +MASSING +MASSIVE +MASSIVELY +MASSIVENESS +MASSIVENESSES +MASSLESS +MASSY +MAST +MASTABA +MASTABAH +MASTABAHS +MASTABAS +MASTECTOMIES +MASTECTOMY +MASTED +MASTER +MASTERDOM +MASTERDOMS +MASTERED +MASTERFUL +MASTERFULLY +MASTERFULNESS +MASTERFULNESSES +MASTERIES +MASTERING +MASTERLINESS +MASTERLINESSES +MASTERLY +MASTERMIND +MASTERMINDED +MASTERMINDING +MASTERMINDS +MASTERPIECE +MASTERPIECES +MASTERS +MASTERSHIP +MASTERSHIPS +MASTERSINGER +MASTERSINGERS +MASTERSTROKE +MASTERSTROKES +MASTERWORK +MASTERWORKS +MASTERY +MASTHEAD +MASTHEADED +MASTHEADING +MASTHEADS +MASTIC +MASTICATE +MASTICATED +MASTICATES +MASTICATING +MASTICATION +MASTICATIONS +MASTICATOR +MASTICATORIES +MASTICATORS +MASTICATORY +MASTICHE +MASTICHES +MASTICS +MASTIFF +MASTIFFS +MASTIGOPHORAN +MASTIGOPHORANS +MASTING +MASTITIC +MASTITIDES +MASTITIS +MASTIX +MASTIXES +MASTLESS +MASTLIKE +MASTODON +MASTODONIC +MASTODONS +MASTODONT +MASTODONTS +MASTOID +MASTOIDECTOMIES +MASTOIDECTOMY +MASTOIDITIS +MASTOIDITISES +MASTOIDS +MASTOPEXIES +MASTOPEXY +MASTS +MASTURBATE +MASTURBATED +MASTURBATES +MASTURBATING +MASTURBATION +MASTURBATIONS +MASTURBATOR +MASTURBATORS +MASTURBATORY +MASURIUM +MASURIUMS +MAT +MATADOR +MATADORS +MATAMBALA +MATCH +MATCHABLE +MATCHBOARD +MATCHBOARDS +MATCHBOOK +MATCHBOOKS +MATCHBOX +MATCHBOXES +MATCHED +MATCHER +MATCHERS +MATCHES +MATCHING +MATCHLESS +MATCHLESSLY +MATCHLOCK +MATCHLOCKS +MATCHMADE +MATCHMAKE +MATCHMAKER +MATCHMAKERS +MATCHMAKES +MATCHMAKING +MATCHMAKINGS +MATCHMARK +MATCHMARKED +MATCHMARKING +MATCHMARKS +MATCHSTICK +MATCHSTICKS +MATCHUP +MATCHUPS +MATCHWOOD +MATCHWOODS +MATE +MATED +MATELASSE +MATELASSES +MATELESS +MATELOT +MATELOTE +MATELOTES +MATELOTS +MATER +MATERFAMILIAS +MATERFAMILIASES +MATERIAL +MATERIALISE +MATERIALISED +MATERIALISES +MATERIALISING +MATERIALISM +MATERIALISMS +MATERIALIST +MATERIALISTIC +MATERIALISTS +MATERIALITIES +MATERIALITY +MATERIALIZATION +MATERIALIZE +MATERIALIZED +MATERIALIZER +MATERIALIZERS +MATERIALIZES +MATERIALIZING +MATERIALLY +MATERIALNESS +MATERIALNESSES +MATERIALS +MATERIEL +MATERIELS +MATERNAL +MATERNALLY +MATERNITIES +MATERNITY +MATERS +MATES +MATESHIP +MATESHIPS +MATEY +MATEYNESS +MATEYNESSES +MATEYS +MATH +MATHEMATIC +MATHEMATICAL +MATHEMATICALLY +MATHEMATICIAN +MATHEMATICIANS +MATHEMATICS +MATHEMATIZATION +MATHEMATIZE +MATHEMATIZED +MATHEMATIZES +MATHEMATIZING +MATHS +MATIER +MATIEST +MATILDA +MATILDAS +MATIN +MATINAL +MATINEE +MATINEES +MATINESS +MATINESSES +MATING +MATINGS +MATINS +MATLESS +MATRASS +MATRASSES +MATRES +MATRIARCH +MATRIARCHAL +MATRIARCHATE +MATRIARCHATES +MATRIARCHIES +MATRIARCHS +MATRIARCHY +MATRICES +MATRICIDAL +MATRICIDE +MATRICIDES +MATRICULANT +MATRICULANTS +MATRICULATE +MATRICULATED +MATRICULATES +MATRICULATING +MATRICULATION +MATRICULATIONS +MATRILINEAL +MATRILINEALLY +MATRIMONIAL +MATRIMONIALLY +MATRIMONIES +MATRIMONY +MATRIX +MATRIXES +MATRON +MATRONAL +MATRONIZE +MATRONIZED +MATRONIZES +MATRONIZING +MATRONLY +MATRONS +MATRONYMIC +MATRONYMICS +MATS +MATSAH +MATSAHS +MATSUTAKE +MATSUTAKES +MATT +MATTE +MATTED +MATTEDLY +MATTER +MATTERED +MATTERFUL +MATTERING +MATTERS +MATTERY +MATTES +MATTIN +MATTING +MATTINGS +MATTINS +MATTOCK +MATTOCKS +MATTOID +MATTOIDS +MATTRASS +MATTRASSES +MATTRESS +MATTRESSES +MATTS +MATURATE +MATURATED +MATURATES +MATURATING +MATURATION +MATURATIONAL +MATURATIONS +MATURE +MATURED +MATURELY +MATURER +MATURERS +MATURES +MATUREST +MATURING +MATURITIES +MATURITY +MATUTINAL +MATUTINALLY +MATZA +MATZAH +MATZAHS +MATZAS +MATZO +MATZOH +MATZOHS +MATZOON +MATZOONS +MATZOS +MATZOT +MATZOTH +MAUD +MAUDLIN +MAUDLINLY +MAUDS +MAUGER +MAUGRE +MAUL +MAULED +MAULER +MAULERS +MAULING +MAULS +MAULSTICK +MAULSTICKS +MAUMET +MAUMETRIES +MAUMETRY +MAUMETS +MAUN +MAUND +MAUNDER +MAUNDERED +MAUNDERER +MAUNDERERS +MAUNDERING +MAUNDERS +MAUNDIES +MAUNDS +MAUNDY +MAUSOLEA +MAUSOLEAN +MAUSOLEUM +MAUSOLEUMS +MAUT +MAUTS +MAUVE +MAUVES +MAVEN +MAVENS +MAVERICK +MAVERICKS +MAVIE +MAVIES +MAVIN +MAVINS +MAVIS +MAVISES +MAVOURNEEN +MAVOURNEENS +MAVOURNIN +MAVOURNINS +MAW +MAWED +MAWING +MAWKISH +MAWKISHLY +MAWKISHNESS +MAWKISHNESSES +MAWN +MAWS +MAX +MAXED +MAXES +MAXI +MAXICOAT +MAXICOATS +MAXILLA +MAXILLAE +MAXILLARIES +MAXILLARY +MAXILLAS +MAXILLIPED +MAXILLIPEDS +MAXILLOFACIAL +MAXIM +MAXIMA +MAXIMAL +MAXIMALIST +MAXIMALISTS +MAXIMALLY +MAXIMALS +MAXIMIN +MAXIMINS +MAXIMISE +MAXIMISED +MAXIMISES +MAXIMISING +MAXIMITE +MAXIMITES +MAXIMIZATION +MAXIMIZATIONS +MAXIMIZE +MAXIMIZED +MAXIMIZER +MAXIMIZERS +MAXIMIZES +MAXIMIZING +MAXIMS +MAXIMUM +MAXIMUMLY +MAXIMUMS +MAXING +MAXIS +MAXIXE +MAXIXES +MAXWELL +MAXWELLS +MAY +MAYA +MAYAN +MAYAPPLE +MAYAPPLES +MAYAS +MAYBE +MAYBES +MAYBIRD +MAYBIRDS +MAYBUSH +MAYBUSHES +MAYDAY +MAYDAYS +MAYED +MAYEST +MAYFLIES +MAYFLOWER +MAYFLOWERS +MAYFLY +MAYHAP +MAYHAPPEN +MAYHEM +MAYHEMS +MAYING +MAYINGS +MAYO +MAYONNAISE +MAYONNAISES +MAYOR +MAYORAL +MAYORALTIES +MAYORALTY +MAYORESS +MAYORESSES +MAYORS +MAYORSHIP +MAYORSHIPS +MAYOS +MAYPOLE +MAYPOLES +MAYPOP +MAYPOPS +MAYS +MAYST +MAYVIN +MAYVINS +MAYWEED +MAYWEEDS +MAZAEDIA +MAZAEDIUM +MAZARD +MAZARDS +MAZE +MAZED +MAZEDLY +MAZEDNESS +MAZEDNESSES +MAZELIKE +MAZELTOV +MAZER +MAZERS +MAZES +MAZIER +MAZIEST +MAZILY +MAZINESS +MAZINESSES +MAZING +MAZOURKA +MAZOURKAS +MAZUMA +MAZUMAS +MAZURKA +MAZURKAS +MAZY +MAZZARD +MAZZARDS +MBAQANGA +MBAQANGAS +MBIRA +MBIRAS +ME +MEAD +MEADOW +MEADOWLAND +MEADOWLANDS +MEADOWLARK +MEADOWLARKS +MEADOWS +MEADOWSWEET +MEADOWSWEETS +MEADOWY +MEADS +MEAGER +MEAGERLY +MEAGERNESS +MEAGERNESSES +MEAGRE +MEAGRELY +MEAL +MEALIE +MEALIER +MEALIES +MEALIEST +MEALINESS +MEALINESSES +MEALLESS +MEALS +MEALTIME +MEALTIMES +MEALWORM +MEALWORMS +MEALY +MEALYBUG +MEALYBUGS +MEALYMOUTHED +MEAN +MEANDER +MEANDERED +MEANDERER +MEANDERERS +MEANDERING +MEANDERS +MEANDROUS +MEANER +MEANERS +MEANEST +MEANIE +MEANIES +MEANING +MEANINGFUL +MEANINGFULLY +MEANINGFULNESS +MEANINGLESS +MEANINGLESSLY +MEANINGLESSNESS +MEANINGLY +MEANINGS +MEANLY +MEANNESS +MEANNESSES +MEANS +MEANT +MEANTIME +MEANTIMES +MEANWHILE +MEANWHILES +MEANY +MEASLE +MEASLED +MEASLES +MEASLIER +MEASLIEST +MEASLY +MEASURABILITIES +MEASURABILITY +MEASURABLE +MEASURABLY +MEASURE +MEASURED +MEASUREDLY +MEASURELESS +MEASUREMENT +MEASUREMENTS +MEASURER +MEASURERS +MEASURES +MEASURING +MEAT +MEATAL +MEATBALL +MEATBALLS +MEATED +MEATHEAD +MEATHEADS +MEATIER +MEATIEST +MEATILY +MEATINESS +MEATINESSES +MEATLESS +MEATLOAF +MEATLOAVES +MEATMAN +MEATMEN +MEATPACKING +MEATPACKINGS +MEATS +MEATUS +MEATUSES +MEATY +MECAMYLAMINE +MECAMYLAMINES +MECCA +MECCAS +MECHANIC +MECHANICAL +MECHANICALLY +MECHANICALS +MECHANICIAN +MECHANICIANS +MECHANICS +MECHANISM +MECHANISMS +MECHANIST +MECHANISTIC +MECHANISTICALLY +MECHANISTS +MECHANIZABLE +MECHANIZATION +MECHANIZATIONS +MECHANIZE +MECHANIZED +MECHANIZER +MECHANIZERS +MECHANIZES +MECHANIZING +MECHANOCHEMICAL +MECHANORECEPTOR +MECHITZA +MECHITZAS +MECHITZOT +MECLIZINE +MECLIZINES +MECONIUM +MECONIUMS +MED +MEDAILLON +MEDAILLONS +MEDAKA +MEDAKAS +MEDAL +MEDALED +MEDALING +MEDALIST +MEDALISTS +MEDALLED +MEDALLIC +MEDALLING +MEDALLION +MEDALLIONS +MEDALLIST +MEDALLISTS +MEDALS +MEDDLE +MEDDLED +MEDDLER +MEDDLERS +MEDDLES +MEDDLESOME +MEDDLESOMENESS +MEDDLING +MEDEVAC +MEDEVACED +MEDEVACING +MEDEVACKED +MEDEVACKING +MEDEVACS +MEDFLIES +MEDFLY +MEDIA +MEDIACIES +MEDIACY +MEDIAD +MEDIAE +MEDIAEVAL +MEDIAEVALS +MEDIAGENIC +MEDIAL +MEDIALLY +MEDIALS +MEDIAN +MEDIANLY +MEDIANS +MEDIANT +MEDIANTS +MEDIAS +MEDIASTINA +MEDIASTINAL +MEDIASTINUM +MEDIATE +MEDIATED +MEDIATELY +MEDIATES +MEDIATING +MEDIATION +MEDIATIONAL +MEDIATIONS +MEDIATIVE +MEDIATIZE +MEDIATIZED +MEDIATIZES +MEDIATIZING +MEDIATOR +MEDIATORS +MEDIATORY +MEDIATRICES +MEDIATRIX +MEDIATRIXES +MEDIC +MEDICABLE +MEDICAID +MEDICAIDS +MEDICAL +MEDICALLY +MEDICALS +MEDICAMENT +MEDICAMENTOUS +MEDICAMENTS +MEDICANT +MEDICANTS +MEDICARE +MEDICARES +MEDICATE +MEDICATED +MEDICATES +MEDICATING +MEDICATION +MEDICATIONS +MEDICIDE +MEDICIDES +MEDICINABLE +MEDICINAL +MEDICINALLY +MEDICINALS +MEDICINE +MEDICINED +MEDICINES +MEDICINING +MEDICK +MEDICKS +MEDICO +MEDICOLEGAL +MEDICOS +MEDICS +MEDIEVAL +MEDIEVALISM +MEDIEVALISMS +MEDIEVALIST +MEDIEVALISTS +MEDIEVALLY +MEDIEVALS +MEDIGAP +MEDIGAPS +MEDII +MEDINA +MEDINAS +MEDIOCRE +MEDIOCRITIES +MEDIOCRITY +MEDITATE +MEDITATED +MEDITATES +MEDITATING +MEDITATION +MEDITATIONS +MEDITATIVE +MEDITATIVELY +MEDITATIVENESS +MEDITATOR +MEDITATORS +MEDITERRANEAN +MEDIUM +MEDIUMISTIC +MEDIUMS +MEDIUMSHIP +MEDIUMSHIPS +MEDIUS +MEDIVAC +MEDIVACED +MEDIVACING +MEDIVACKED +MEDIVACKING +MEDIVACS +MEDLAR +MEDLARS +MEDLEY +MEDLEYS +MEDS +MEDULLA +MEDULLAE +MEDULLAR +MEDULLARY +MEDULLAS +MEDULLATED +MEDULLOBLASTOMA +MEDUSA +MEDUSAE +MEDUSAL +MEDUSAN +MEDUSANS +MEDUSAS +MEDUSOID +MEDUSOIDS +MEED +MEEDS +MEEK +MEEKER +MEEKEST +MEEKLY +MEEKNESS +MEEKNESSES +MEERKAT +MEERKATS +MEERSCHAUM +MEERSCHAUMS +MEET +MEETER +MEETERS +MEETING +MEETINGHOUSE +MEETINGHOUSES +MEETINGS +MEETLY +MEETNESS +MEETNESSES +MEETS +MEG +MEGA +MEGABAR +MEGABARS +MEGABIT +MEGABITS +MEGABUCK +MEGABUCKS +MEGABYTE +MEGABYTES +MEGACITIES +MEGACITY +MEGACORPORATION +MEGACYCLE +MEGACYCLES +MEGADEAL +MEGADEALS +MEGADEATH +MEGADEATHS +MEGADOSE +MEGADOSES +MEGADYNE +MEGADYNES +MEGAFAUNA +MEGAFAUNAE +MEGAFAUNAL +MEGAFAUNAS +MEGAFLOP +MEGAFLOPS +MEGAGAMETE +MEGAGAMETES +MEGAGAMETOPHYTE +MEGAHERTZ +MEGAHERTZES +MEGAHIT +MEGAHITS +MEGAKARYOCYTE +MEGAKARYOCYTES +MEGAKARYOCYTIC +MEGALITH +MEGALITHIC +MEGALITHS +MEGALOBLAST +MEGALOBLASTIC +MEGALOBLASTS +MEGALOMANIA +MEGALOMANIAC +MEGALOMANIACAL +MEGALOMANIACS +MEGALOMANIAS +MEGALOMANIC +MEGALOPIC +MEGALOPOLIS +MEGALOPOLISES +MEGALOPOLITAN +MEGALOPOLITANS +MEGALOPS +MEGALOPSES +MEGAPARSEC +MEGAPARSECS +MEGAPHONE +MEGAPHONED +MEGAPHONES +MEGAPHONIC +MEGAPHONING +MEGAPIXEL +MEGAPIXELS +MEGAPLEX +MEGAPLEXES +MEGAPOD +MEGAPODE +MEGAPODES +MEGAPODS +MEGAPROJECT +MEGAPROJECTS +MEGARA +MEGARON +MEGASCOPIC +MEGASCOPICALLY +MEGASPORANGIA +MEGASPORANGIUM +MEGASPORE +MEGASPORES +MEGASPORIC +MEGASPOROPHYLL +MEGASPOROPHYLLS +MEGASS +MEGASSE +MEGASSES +MEGASTAR +MEGASTARS +MEGATHERE +MEGATHERES +MEGATON +MEGATONNAGE +MEGATONNAGES +MEGATONS +MEGAVITAMIN +MEGAVITAMINS +MEGAVOLT +MEGAVOLTS +MEGAWATT +MEGAWATTS +MEGILLA +MEGILLAH +MEGILLAHS +MEGILLAS +MEGILP +MEGILPH +MEGILPHS +MEGILPS +MEGOHM +MEGOHMS +MEGRIM +MEGRIMS +MEGS +MEHNDI +MEHNDIS +MEIKLE +MEINIE +MEINIES +MEINY +MEIOSES +MEIOSIS +MEIOTIC +MEIOTICALLY +MEISTER +MEISTERS +MEITNERIUM +MEITNERIUMS +MEL +MELALEUCA +MELALEUCAS +MELAMDIM +MELAMED +MELAMINE +MELAMINES +MELANCHOLIA +MELANCHOLIAC +MELANCHOLIACS +MELANCHOLIAS +MELANCHOLIC +MELANCHOLICS +MELANCHOLIES +MELANCHOLY +MELANGE +MELANGES +MELANIAN +MELANIC +MELANICS +MELANIN +MELANINS +MELANISM +MELANISMS +MELANIST +MELANISTIC +MELANISTS +MELANITE +MELANITES +MELANITIC +MELANIZATION +MELANIZATIONS +MELANIZE +MELANIZED +MELANIZES +MELANIZING +MELANOBLAST +MELANOBLASTS +MELANOCYTE +MELANOCYTES +MELANOGENESES +MELANOGENESIS +MELANOID +MELANOIDS +MELANOMA +MELANOMAS +MELANOMATA +MELANOPHORE +MELANOPHORES +MELANOSES +MELANOSIS +MELANOSOME +MELANOSOMES +MELANOTIC +MELANOUS +MELAPHYRE +MELAPHYRES +MELASTOME +MELATONIN +MELATONINS +MELD +MELDED +MELDER +MELDERS +MELDING +MELDS +MELEE +MELEES +MELENA +MELENAS +MELIC +MELILITE +MELILITES +MELILOT +MELILOTS +MELINITE +MELINITES +MELIORATE +MELIORATED +MELIORATES +MELIORATING +MELIORATION +MELIORATIONS +MELIORATIVE +MELIORATOR +MELIORATORS +MELIORISM +MELIORISMS +MELIORIST +MELIORISTIC +MELIORISTS +MELISMA +MELISMAS +MELISMATA +MELISMATIC +MELL +MELLED +MELLIFIC +MELLIFLUENT +MELLIFLUENTLY +MELLIFLUOUS +MELLIFLUOUSLY +MELLIFLUOUSNESS +MELLING +MELLOPHONE +MELLOPHONES +MELLOTRON +MELLOTRONS +MELLOW +MELLOWED +MELLOWER +MELLOWEST +MELLOWING +MELLOWLY +MELLOWNESS +MELLOWNESSES +MELLOWS +MELLS +MELODEON +MELODEONS +MELODIA +MELODIAS +MELODIC +MELODICA +MELODICALLY +MELODICAS +MELODIES +MELODIOUS +MELODIOUSLY +MELODIOUSNESS +MELODIOUSNESSES +MELODISE +MELODISED +MELODISES +MELODISING +MELODIST +MELODISTS +MELODIZE +MELODIZED +MELODIZER +MELODIZERS +MELODIZES +MELODIZING +MELODRAMA +MELODRAMAS +MELODRAMATIC +MELODRAMATICS +MELODRAMATISE +MELODRAMATISED +MELODRAMATISES +MELODRAMATISING +MELODRAMATIST +MELODRAMATISTS +MELODRAMATIZE +MELODRAMATIZED +MELODRAMATIZES +MELODRAMATIZING +MELODY +MELOID +MELOIDS +MELON +MELONGENE +MELONGENES +MELONS +MELPHALAN +MELPHALANS +MELS +MELT +MELTABILITIES +MELTABILITY +MELTABLE +MELTAGE +MELTAGES +MELTDOWN +MELTDOWNS +MELTED +MELTER +MELTERS +MELTING +MELTINGLY +MELTON +MELTONS +MELTS +MELTWATER +MELTWATERS +MELTY +MEM +MEMBER +MEMBERED +MEMBERS +MEMBERSHIP +MEMBERSHIPS +MEMBRANAL +MEMBRANE +MEMBRANED +MEMBRANES +MEMBRANOUS +MEMBRANOUSLY +MEME +MEMENTO +MEMENTOES +MEMENTOS +MEMES +MEMETICS +MEMO +MEMOIR +MEMOIRIST +MEMOIRISTS +MEMOIRS +MEMORABILIA +MEMORABILITIES +MEMORABILITY +MEMORABLE +MEMORABLENESS +MEMORABLENESSES +MEMORABLY +MEMORANDA +MEMORANDUM +MEMORANDUMS +MEMORIAL +MEMORIALISE +MEMORIALISED +MEMORIALISES +MEMORIALISING +MEMORIALIST +MEMORIALISTS +MEMORIALIZE +MEMORIALIZED +MEMORIALIZES +MEMORIALIZING +MEMORIALLY +MEMORIALS +MEMORIES +MEMORISE +MEMORISED +MEMORISES +MEMORISING +MEMORITER +MEMORIZABLE +MEMORIZATION +MEMORIZATIONS +MEMORIZE +MEMORIZED +MEMORIZER +MEMORIZERS +MEMORIZES +MEMORIZING +MEMORY +MEMOS +MEMS +MEMSAHIB +MEMSAHIBS +MEN +MENACE +MENACED +MENACER +MENACERS +MENACES +MENACING +MENACINGLY +MENAD +MENADIONE +MENADIONES +MENADS +MENAGE +MENAGERIE +MENAGERIES +MENAGES +MENARCHE +MENARCHEAL +MENARCHES +MENAZON +MENAZONS +MEND +MENDABLE +MENDACIOUS +MENDACIOUSLY +MENDACIOUSNESS +MENDACITIES +MENDACITY +MENDED +MENDELEVIUM +MENDELEVIUMS +MENDER +MENDERS +MENDICANCIES +MENDICANCY +MENDICANT +MENDICANTS +MENDICITIES +MENDICITY +MENDIGO +MENDIGOS +MENDING +MENDINGS +MENDS +MENFOLK +MENFOLKS +MENHADEN +MENHADENS +MENHIR +MENHIRS +MENIAL +MENIALLY +MENIALS +MENINGEAL +MENINGES +MENINGIOMA +MENINGIOMAS +MENINGIOMATA +MENINGITIC +MENINGITIDES +MENINGITIS +MENINGOCOCCAL +MENINGOCOCCI +MENINGOCOCCIC +MENINGOCOCCUS +MENINX +MENISCAL +MENISCATE +MENISCI +MENISCOID +MENISCUS +MENISCUSES +MENO +MENOLOGIES +MENOLOGY +MENOPAUSAL +MENOPAUSE +MENOPAUSES +MENORAH +MENORAHS +MENORRHAGIA +MENORRHAGIAS +MENORRHEA +MENORRHEAS +MENSA +MENSAE +MENSAL +MENSAS +MENSCH +MENSCHEN +MENSCHES +MENSCHY +MENSE +MENSED +MENSEFUL +MENSELESS +MENSERVANTS +MENSES +MENSH +MENSHEN +MENSHES +MENSING +MENSTRUA +MENSTRUAL +MENSTRUALLY +MENSTRUATE +MENSTRUATED +MENSTRUATES +MENSTRUATING +MENSTRUATION +MENSTRUATIONS +MENSTRUUM +MENSTRUUMS +MENSURABILITIES +MENSURABILITY +MENSURABLE +MENSURAL +MENSURATION +MENSURATIONS +MENSWEAR +MENTA +MENTAL +MENTALESE +MENTALESES +MENTALISM +MENTALISMS +MENTALIST +MENTALISTIC +MENTALISTS +MENTALITIES +MENTALITY +MENTALLY +MENTATION +MENTATIONS +MENTEE +MENTEES +MENTHENE +MENTHENES +MENTHOL +MENTHOLATED +MENTHOLS +MENTION +MENTIONABLE +MENTIONED +MENTIONER +MENTIONERS +MENTIONING +MENTIONS +MENTOR +MENTORED +MENTORING +MENTORS +MENTORSHIP +MENTORSHIPS +MENTUM +MENU +MENUDO +MENUDOS +MENUS +MEOU +MEOUED +MEOUING +MEOUS +MEOW +MEOWED +MEOWING +MEOWS +MEPERIDINE +MEPERIDINES +MEPHITIC +MEPHITIS +MEPHITISES +MEPROBAMATE +MEPROBAMATES +MERBROMIN +MERBROMINS +MERC +MERCANTILE +MERCANTILISM +MERCANTILISMS +MERCANTILIST +MERCANTILISTIC +MERCANTILISTS +MERCAPTAN +MERCAPTANS +MERCAPTO +MERCAPTOPURINE +MERCAPTOPURINES +MERCENARIES +MERCENARILY +MERCENARINESS +MERCENARINESSES +MERCENARY +MERCER +MERCERIES +MERCERISE +MERCERISED +MERCERISES +MERCERISING +MERCERIZATION +MERCERIZATIONS +MERCERIZE +MERCERIZED +MERCERIZES +MERCERIZING +MERCERS +MERCERY +MERCES +MERCH +MERCHANDISE +MERCHANDISED +MERCHANDISER +MERCHANDISERS +MERCHANDISES +MERCHANDISING +MERCHANDISINGS +MERCHANDIZE +MERCHANDIZED +MERCHANDIZES +MERCHANDIZING +MERCHANDIZINGS +MERCHANT +MERCHANTABILITY +MERCHANTABLE +MERCHANTED +MERCHANTING +MERCHANTMAN +MERCHANTMEN +MERCHANTS +MERCHES +MERCIES +MERCIFUL +MERCIFULLY +MERCIFULNESS +MERCIFULNESSES +MERCILESS +MERCILESSLY +MERCILESSNESS +MERCILESSNESSES +MERCS +MERCURATE +MERCURATED +MERCURATES +MERCURATING +MERCURATION +MERCURATIONS +MERCURIAL +MERCURIALLY +MERCURIALNESS +MERCURIALNESSES +MERCURIALS +MERCURIC +MERCURIES +MERCUROUS +MERCURY +MERCY +MERDE +MERDES +MERE +MERELY +MERENGUE +MERENGUES +MERER +MERES +MEREST +MERETRICIOUS +MERETRICIOUSLY +MERGANSER +MERGANSERS +MERGE +MERGED +MERGEE +MERGEES +MERGENCE +MERGENCES +MERGER +MERGERS +MERGES +MERGING +MERIDIAN +MERIDIANS +MERIDIONAL +MERIDIONALLY +MERIDIONALS +MERINGUE +MERINGUES +MERINO +MERINOS +MERISES +MERISIS +MERISTEM +MERISTEMATIC +MERISTEMS +MERISTIC +MERISTICALLY +MERIT +MERITED +MERITING +MERITLESS +MERITOCRACIES +MERITOCRACY +MERITOCRAT +MERITOCRATIC +MERITOCRATS +MERITORIOUS +MERITORIOUSLY +MERITORIOUSNESS +MERITS +MERK +MERKS +MERL +MERLE +MERLES +MERLIN +MERLINS +MERLON +MERLONS +MERLOT +MERLOTS +MERLS +MERMAID +MERMAIDS +MERMAN +MERMEN +MEROBLASTIC +MEROBLASTICALLY +MEROCRINE +MEROMORPHIC +MEROMYOSIN +MEROMYOSINS +MEROPIA +MEROPIAS +MEROPIC +MEROZOITE +MEROZOITES +MERRIER +MERRIEST +MERRILY +MERRIMENT +MERRIMENTS +MERRINESS +MERRINESSES +MERRY +MERRYMAKER +MERRYMAKERS +MERRYMAKING +MERRYMAKINGS +MERRYTHOUGHT +MERRYTHOUGHTS +MESA +MESALLIANCE +MESALLIANCES +MESALLY +MESARCH +MESAS +MESCAL +MESCALINE +MESCALINES +MESCALS +MESCLUN +MESCLUNS +MESDAMES +MESDEMOISELLES +MESEEMED +MESEEMETH +MESEEMS +MESENCEPHALA +MESENCEPHALIC +MESENCEPHALON +MESENCHYMAL +MESENCHYME +MESENCHYMES +MESENTERA +MESENTERIC +MESENTERIES +MESENTERON +MESENTERY +MESH +MESHED +MESHES +MESHIER +MESHIEST +MESHING +MESHUGA +MESHUGAAS +MESHUGAH +MESHUGGA +MESHUGGAH +MESHUGGE +MESHUGGENER +MESHUGGENERS +MESHWORK +MESHWORKS +MESHY +MESIAL +MESIALLY +MESIAN +MESIC +MESICALLY +MESMERIC +MESMERICALLY +MESMERISE +MESMERISED +MESMERISES +MESMERISING +MESMERISM +MESMERISMS +MESMERIST +MESMERISTS +MESMERIZE +MESMERIZED +MESMERIZER +MESMERIZERS +MESMERIZES +MESMERIZING +MESNALTIES +MESNALTY +MESNE +MESNES +MESOBLAST +MESOBLASTS +MESOCARP +MESOCARPS +MESOCRANIES +MESOCRANY +MESOCYCLONE +MESOCYCLONES +MESODERM +MESODERMAL +MESODERMS +MESOGLEA +MESOGLEAL +MESOGLEAS +MESOGLOEA +MESOGLOEAS +MESOMERE +MESOMERES +MESOMORPH +MESOMORPHIC +MESOMORPHIES +MESOMORPHS +MESOMORPHY +MESON +MESONEPHRIC +MESONEPHROI +MESONEPHROS +MESONIC +MESONS +MESOPAUSE +MESOPAUSES +MESOPELAGIC +MESOPHYL +MESOPHYLL +MESOPHYLLIC +MESOPHYLLOUS +MESOPHYLLS +MESOPHYLS +MESOPHYTE +MESOPHYTES +MESOPHYTIC +MESOSCALE +MESOSOME +MESOSOMES +MESOSPHERE +MESOSPHERES +MESOSPHERIC +MESOTHELIA +MESOTHELIAL +MESOTHELIOMA +MESOTHELIOMAS +MESOTHELIOMATA +MESOTHELIUM +MESOTHORACES +MESOTHORACIC +MESOTHORAX +MESOTHORAXES +MESOTRON +MESOTRONS +MESOTROPHIC +MESOZOAN +MESOZOANS +MESOZOIC +MESQUIT +MESQUITE +MESQUITES +MESQUITS +MESS +MESSAGE +MESSAGED +MESSAGES +MESSAGING +MESSALINE +MESSALINES +MESSAN +MESSANS +MESSED +MESSEIGNEURS +MESSENGER +MESSENGERED +MESSENGERING +MESSENGERS +MESSES +MESSIAH +MESSIAHS +MESSIAHSHIP +MESSIAHSHIPS +MESSIANIC +MESSIANISM +MESSIANISMS +MESSIER +MESSIEST +MESSIEURS +MESSILY +MESSINESS +MESSINESSES +MESSING +MESSMAN +MESSMATE +MESSMATES +MESSMEN +MESSUAGE +MESSUAGES +MESSY +MESTEE +MESTEES +MESTESO +MESTESOES +MESTESOS +MESTINO +MESTINOES +MESTINOS +MESTIZA +MESTIZAS +MESTIZO +MESTIZOES +MESTIZOS +MESTRANOL +MESTRANOLS +MET +META +METABOLIC +METABOLICALLY +METABOLISM +METABOLISMS +METABOLITE +METABOLITES +METABOLIZABLE +METABOLIZE +METABOLIZED +METABOLIZES +METABOLIZING +METACARPAL +METACARPALS +METACARPI +METACARPUS +METACENTER +METACENTERS +METACENTRIC +METACENTRICS +METACERCARIA +METACERCARIAE +METACERCARIAL +METACHROMATIC +METAETHICAL +METAETHICS +METAFICTION +METAFICTIONAL +METAFICTIONIST +METAFICTIONISTS +METAFICTIONS +METAGALACTIC +METAGALAXIES +METAGALAXY +METAGE +METAGENESES +METAGENESIS +METAGENETIC +METAGENIC +METAGES +METAL +METALANGUAGE +METALANGUAGES +METALED +METALHEAD +METALHEADS +METALING +METALINGUISTIC +METALINGUISTICS +METALISE +METALISED +METALISES +METALISING +METALIST +METALISTS +METALIZE +METALIZED +METALIZES +METALIZING +METALLED +METALLIC +METALLICALLY +METALLICS +METALLIFEROUS +METALLIKE +METALLINE +METALLING +METALLIST +METALLISTS +METALLIZATION +METALLIZATIONS +METALLIZE +METALLIZED +METALLIZES +METALLIZING +METALLOGRAPHER +METALLOGRAPHERS +METALLOGRAPHIC +METALLOGRAPHIES +METALLOGRAPHY +METALLOID +METALLOIDAL +METALLOIDS +METALLOPHONE +METALLOPHONES +METALLURGICAL +METALLURGICALLY +METALLURGIES +METALLURGIST +METALLURGISTS +METALLURGY +METALMARK +METALMARKS +METALS +METALSMITH +METALSMITHS +METALWARE +METALWARES +METALWORK +METALWORKER +METALWORKERS +METALWORKING +METALWORKINGS +METALWORKS +METAMATHEMATICS +METAMER +METAMERE +METAMERES +METAMERIC +METAMERICALLY +METAMERISM +METAMERISMS +METAMERS +METAMORPHIC +METAMORPHICALLY +METAMORPHISM +METAMORPHISMS +METAMORPHOSE +METAMORPHOSED +METAMORPHOSES +METAMORPHOSING +METAMORPHOSIS +METANALYSES +METANALYSIS +METANEPHRIC +METANEPHROI +METANEPHROS +METAPHASE +METAPHASES +METAPHOR +METAPHORIC +METAPHORICAL +METAPHORICALLY +METAPHORS +METAPHOSPHATE +METAPHOSPHATES +METAPHRASE +METAPHRASES +METAPHYSIC +METAPHYSICAL +METAPHYSICALLY +METAPHYSICIAN +METAPHYSICIANS +METAPHYSICS +METAPLASIA +METAPLASIAS +METAPLASM +METAPLASMS +METAPLASTIC +METAPSYCHOLOGY +METASEQUOIA +METASEQUOIAS +METASOMATIC +METASOMATISM +METASOMATISMS +METASTABILITIES +METASTABILITY +METASTABLE +METASTABLY +METASTASES +METASTASIS +METASTASIZE +METASTASIZED +METASTASIZES +METASTASIZING +METASTATIC +METASTATICALLY +METATAG +METATAGS +METATARSAL +METATARSALS +METATARSI +METATARSUS +METATE +METATES +METATHESES +METATHESIS +METATHETIC +METATHETICAL +METATHETICALLY +METATHORACES +METATHORACIC +METATHORAX +METATHORAXES +METAXYLEM +METAXYLEMS +METAZOA +METAZOAL +METAZOAN +METAZOANS +METAZOIC +METAZOON +METE +METED +METEMPSYCHOSES +METEMPSYCHOSIS +METENCEPHALA +METENCEPHALIC +METENCEPHALON +METEOR +METEORIC +METEORICALLY +METEORITE +METEORITES +METEORITIC +METEORITICAL +METEORITICIST +METEORITICISTS +METEORITICS +METEOROID +METEOROIDAL +METEOROIDS +METEOROLOGIC +METEOROLOGICAL +METEOROLOGIES +METEOROLOGIST +METEOROLOGISTS +METEOROLOGY +METEORS +METEPA +METEPAS +METER +METERAGE +METERAGES +METERED +METERING +METERS +METERSTICK +METERSTICKS +METES +METESTRUS +METESTRUSES +METFORMIN +METFORMINS +METH +METHACRYLATE +METHACRYLATES +METHADON +METHADONE +METHADONES +METHADONS +METHAMPHETAMINE +METHANATION +METHANATIONS +METHANE +METHANES +METHANOL +METHANOLS +METHAQUALONE +METHAQUALONES +METHEDRINE +METHEDRINES +METHEGLIN +METHEGLINS +METHEMOGLOBIN +METHEMOGLOBINS +METHENAMINE +METHENAMINES +METHICILLIN +METHICILLINS +METHINKS +METHIONINE +METHIONINES +METHOD +METHODIC +METHODICAL +METHODICALLY +METHODICALNESS +METHODISE +METHODISED +METHODISES +METHODISING +METHODISM +METHODISMS +METHODIST +METHODISTIC +METHODISTS +METHODIZE +METHODIZED +METHODIZES +METHODIZING +METHODOLOGICAL +METHODOLOGIES +METHODOLOGIST +METHODOLOGISTS +METHODOLOGY +METHODS +METHOTREXATE +METHOTREXATES +METHOUGHT +METHOXIDE +METHOXIDES +METHOXY +METHOXYCHLOR +METHOXYCHLORS +METHOXYFLURANE +METHOXYFLURANES +METHOXYL +METHS +METHYL +METHYLAL +METHYLALS +METHYLAMINE +METHYLAMINES +METHYLASE +METHYLASES +METHYLATE +METHYLATED +METHYLATES +METHYLATING +METHYLATION +METHYLATIONS +METHYLATOR +METHYLATORS +METHYLCELLULOSE +METHYLDOPA +METHYLDOPAS +METHYLENE +METHYLENES +METHYLIC +METHYLMERCURIES +METHYLMERCURY +METHYLPHENIDATE +METHYLS +METHYLXANTHINE +METHYLXANTHINES +METHYSERGIDE +METHYSERGIDES +METICAIS +METICAL +METICALS +METICULOSITIES +METICULOSITY +METICULOUS +METICULOUSLY +METICULOUSNESS +METIER +METIERS +METING +METIS +METISSE +METISSES +METOL +METOLS +METONYM +METONYMIC +METONYMICAL +METONYMIES +METONYMS +METONYMY +METOPAE +METOPE +METOPES +METOPIC +METOPON +METOPONS +METRALGIA +METRALGIAS +METRAZOL +METRAZOLS +METRE +METRED +METRES +METRIC +METRICAL +METRICALLY +METRICATE +METRICATED +METRICATES +METRICATING +METRICATION +METRICATIONS +METRICISM +METRICISMS +METRICIZE +METRICIZED +METRICIZES +METRICIZING +METRICS +METRIFIED +METRIFIES +METRIFY +METRIFYING +METRING +METRIST +METRISTS +METRITIS +METRITISES +METRO +METROLOGICAL +METROLOGIES +METROLOGIST +METROLOGISTS +METROLOGY +METRONIDAZOLE +METRONIDAZOLES +METRONOME +METRONOMES +METRONOMIC +METRONOMICAL +METRONOMICALLY +METROPLEX +METROPLEXES +METROPOLIS +METROPOLISES +METROPOLITAN +METROPOLITANS +METRORRHAGIA +METRORRHAGIAS +METROS +METTLE +METTLED +METTLES +METTLESOME +METUMP +METUMPS +MEUNIERE +MEW +MEWED +MEWING +MEWL +MEWLED +MEWLER +MEWLERS +MEWLING +MEWLS +MEWS +MEZCAL +MEZCALS +MEZE +MEZEREON +MEZEREONS +MEZEREUM +MEZEREUMS +MEZES +MEZQUIT +MEZQUITE +MEZQUITES +MEZQUITS +MEZUZA +MEZUZAH +MEZUZAHS +MEZUZAS +MEZUZOT +MEZUZOTH +MEZZALUNA +MEZZALUNAS +MEZZANINE +MEZZANINES +MEZZO +MEZZOS +MEZZOTINT +MEZZOTINTED +MEZZOTINTING +MEZZOTINTS +MHO +MHOS +MI +MIAOU +MIAOUED +MIAOUING +MIAOUS +MIAOW +MIAOWED +MIAOWING +MIAOWS +MIASM +MIASMA +MIASMAL +MIASMAS +MIASMATA +MIASMATIC +MIASMIC +MIASMICALLY +MIASMS +MIAUL +MIAULED +MIAULING +MIAULS +MIB +MIBS +MIC +MICA +MICACEOUS +MICAS +MICAWBER +MICAWBERS +MICE +MICELL +MICELLA +MICELLAE +MICELLAR +MICELLE +MICELLES +MICELLS +MICHE +MICHED +MICHES +MICHING +MICK +MICKEY +MICKEYS +MICKLE +MICKLER +MICKLES +MICKLEST +MICKS +MICRA +MICRIFIED +MICRIFIES +MICRIFY +MICRIFYING +MICRO +MICROAMPERE +MICROAMPERES +MICROANALYSES +MICROANALYSIS +MICROANALYST +MICROANALYSTS +MICROANALYTIC +MICROANALYTICAL +MICROANATOMICAL +MICROANATOMIES +MICROANATOMY +MICROBALANCE +MICROBALANCES +MICROBAR +MICROBAROGRAPH +MICROBAROGRAPHS +MICROBARS +MICROBE +MICROBEAM +MICROBEAMS +MICROBES +MICROBIAL +MICROBIAN +MICROBIC +MICROBIOLOGIC +MICROBIOLOGICAL +MICROBIOLOGIES +MICROBIOLOGIST +MICROBIOLOGISTS +MICROBIOLOGY +MICROBREW +MICROBREWER +MICROBREWERIES +MICROBREWERS +MICROBREWERY +MICROBREWING +MICROBREWINGS +MICROBREWS +MICROBURST +MICROBURSTS +MICROBUS +MICROBUSES +MICROBUSSES +MICROCAP +MICROCAPSULE +MICROCAPSULES +MICROCASSETTE +MICROCASSETTES +MICROCEPHALIC +MICROCEPHALICS +MICROCEPHALIES +MICROCEPHALY +MICROCHIP +MICROCHIPS +MICROCIRCUIT +MICROCIRCUITRY +MICROCIRCUITS +MICROCLIMATE +MICROCLIMATES +MICROCLIMATIC +MICROCLINE +MICROCLINES +MICROCOCCAL +MICROCOCCI +MICROCOCCUS +MICROCODE +MICROCODES +MICROCOMPUTER +MICROCOMPUTERS +MICROCOPIES +MICROCOPY +MICROCOSM +MICROCOSMIC +MICROCOSMICALLY +MICROCOSMOS +MICROCOSMOSES +MICROCOSMS +MICROCRYSTAL +MICROCRYSTALS +MICROCULTURAL +MICROCULTURE +MICROCULTURES +MICROCURIE +MICROCURIES +MICROCYTE +MICROCYTES +MICROCYTIC +MICRODISSECTION +MICRODONT +MICRODOT +MICRODOTS +MICROEARTHQUAKE +MICROECONOMIC +MICROECONOMICS +MICROELECTRODE +MICROELECTRODES +MICROELECTRONIC +MICROELEMENT +MICROELEMENTS +MICROEVOLUTION +MICROEVOLUTIONS +MICROFARAD +MICROFARADS +MICROFAUNA +MICROFAUNAE +MICROFAUNAL +MICROFAUNAS +MICROFIBRIL +MICROFIBRILLAR +MICROFIBRILS +MICROFICHE +MICROFICHES +MICROFILAMENT +MICROFILAMENTS +MICROFILARIA +MICROFILARIAE +MICROFILARIAL +MICROFILM +MICROFILMABLE +MICROFILMED +MICROFILMER +MICROFILMERS +MICROFILMING +MICROFILMS +MICROFLORA +MICROFLORAE +MICROFLORAL +MICROFLORAS +MICROFORM +MICROFORMS +MICROFOSSIL +MICROFOSSILS +MICROFUNGI +MICROFUNGUS +MICROGAMETE +MICROGAMETES +MICROGAMETOCYTE +MICROGRAM +MICROGRAMS +MICROGRAPH +MICROGRAPHED +MICROGRAPHIC +MICROGRAPHICS +MICROGRAPHING +MICROGRAPHS +MICROGRAVITIES +MICROGRAVITY +MICROGROOVE +MICROGROOVES +MICROHABITAT +MICROHABITATS +MICROHM +MICROHMS +MICROIMAGE +MICROIMAGES +MICROINCH +MICROINCHES +MICROINJECT +MICROINJECTED +MICROINJECTING +MICROINJECTION +MICROINJECTIONS +MICROINJECTS +MICROLITER +MICROLITERS +MICROLITH +MICROLITHIC +MICROLITHS +MICROLOAN +MICROLOANS +MICROLUCES +MICROLUX +MICROLUXES +MICROMANAGE +MICROMANAGED +MICROMANAGEMENT +MICROMANAGER +MICROMANAGERS +MICROMANAGES +MICROMANAGING +MICROMERE +MICROMERES +MICROMETEORITE +MICROMETEORITES +MICROMETEORITIC +MICROMETEOROID +MICROMETEOROIDS +MICROMETER +MICROMETERS +MICROMETHOD +MICROMETHODS +MICROMHO +MICROMHOS +MICROMINI +MICROMINIATURE +MICROMINIS +MICROMOLAR +MICROMOLE +MICROMOLES +MICROMORPHOLOGY +MICRON +MICRONIZE +MICRONIZED +MICRONIZES +MICRONIZING +MICRONS +MICRONUCLEI +MICRONUCLEUS +MICRONUTRIENT +MICRONUTRIENTS +MICROORGANISM +MICROORGANISMS +MICROPARTICLE +MICROPARTICLES +MICROPHAGE +MICROPHAGES +MICROPHONE +MICROPHONES +MICROPHONIC +MICROPHONICS +MICROPHOTOGRAPH +MICROPHOTOMETER +MICROPHOTOMETRY +MICROPHYLL +MICROPHYLLOUS +MICROPHYLLS +MICROPHYSICAL +MICROPHYSICALLY +MICROPHYSICS +MICROPIPET +MICROPIPETS +MICROPIPETTE +MICROPIPETTES +MICROPLANKTON +MICROPLANKTONS +MICROPORE +MICROPORES +MICROPOROSITIES +MICROPOROSITY +MICROPOROUS +MICROPRISM +MICROPRISMS +MICROPROBE +MICROPROBES +MICROPROCESSOR +MICROPROCESSORS +MICROPROGRAM +MICROPROGRAMS +MICROPROJECTION +MICROPROJECTOR +MICROPROJECTORS +MICROPUBLISHER +MICROPUBLISHERS +MICROPUBLISHING +MICROPULSATION +MICROPULSATIONS +MICROPUNCTURE +MICROPUNCTURES +MICROPYLAR +MICROPYLE +MICROPYLES +MICROQUAKE +MICROQUAKES +MICRORADIOGRAPH +MICROREADER +MICROREADERS +MICROS +MICROSCALE +MICROSCALES +MICROSCOPE +MICROSCOPES +MICROSCOPIC +MICROSCOPICAL +MICROSCOPICALLY +MICROSCOPIES +MICROSCOPIST +MICROSCOPISTS +MICROSCOPY +MICROSECOND +MICROSECONDS +MICROSEISM +MICROSEISMIC +MICROSEISMICITY +MICROSEISMS +MICROSOMAL +MICROSOME +MICROSOMES +MICROSPHERE +MICROSPHERES +MICROSPHERICAL +MICROSPORANGIA +MICROSPORANGIUM +MICROSPORE +MICROSPORES +MICROSPOROCYTE +MICROSPOROCYTES +MICROSPOROPHYLL +MICROSPOROUS +MICROSTATE +MICROSTATES +MICROSTRUCTURAL +MICROSTRUCTURE +MICROSTRUCTURES +MICROSURGERIES +MICROSURGERY +MICROSURGICAL +MICROSWITCH +MICROSWITCHES +MICROTECHNIC +MICROTECHNICS +MICROTECHNIQUE +MICROTECHNIQUES +MICROTOME +MICROTOMES +MICROTOMIES +MICROTOMY +MICROTONAL +MICROTONALITIES +MICROTONALITY +MICROTONALLY +MICROTONE +MICROTONES +MICROTUBULAR +MICROTUBULE +MICROTUBULES +MICROVASCULAR +MICROVILLAR +MICROVILLI +MICROVILLOUS +MICROVILLUS +MICROVOLT +MICROVOLTS +MICROWATT +MICROWATTS +MICROWAVABLE +MICROWAVE +MICROWAVEABLE +MICROWAVED +MICROWAVES +MICROWAVING +MICROWORLD +MICROWORLDS +MICRURGIES +MICRURGY +MICS +MICTURATE +MICTURATED +MICTURATES +MICTURATING +MICTURITION +MICTURITIONS +MID +MIDAIR +MIDAIRS +MIDBRAIN +MIDBRAINS +MIDCAP +MIDCOURSE +MIDCULT +MIDCULTS +MIDDAY +MIDDAYS +MIDDEN +MIDDENS +MIDDIES +MIDDLE +MIDDLEBROW +MIDDLEBROWS +MIDDLED +MIDDLEMAN +MIDDLEMEN +MIDDLER +MIDDLERS +MIDDLES +MIDDLEWEIGHT +MIDDLEWEIGHTS +MIDDLING +MIDDLINGLY +MIDDLINGS +MIDDORSAL +MIDDY +MIDFIELD +MIDFIELDER +MIDFIELDERS +MIDFIELDS +MIDGE +MIDGES +MIDGET +MIDGETS +MIDGUT +MIDGUTS +MIDI +MIDINETTE +MIDINETTES +MIDIRON +MIDIRONS +MIDIS +MIDISKIRT +MIDISKIRTS +MIDLAND +MIDLANDS +MIDLATITUDE +MIDLATITUDES +MIDLEG +MIDLEGS +MIDLIFE +MIDLIFER +MIDLIFERS +MIDLINE +MIDLINES +MIDLIST +MIDLISTS +MIDLIVES +MIDMONTH +MIDMONTHS +MIDMOST +MIDMOSTS +MIDNIGHT +MIDNIGHTLY +MIDNIGHTS +MIDNOON +MIDNOONS +MIDPOINT +MIDPOINTS +MIDRANGE +MIDRANGES +MIDRASH +MIDRASHIC +MIDRASHIM +MIDRASHOT +MIDRASHOTH +MIDRIB +MIDRIBS +MIDRIFF +MIDRIFFS +MIDS +MIDSAGITTAL +MIDSECTION +MIDSECTIONS +MIDSHIP +MIDSHIPMAN +MIDSHIPMEN +MIDSHIPS +MIDSIZE +MIDSIZED +MIDSOLE +MIDSOLES +MIDSPACE +MIDSPACES +MIDST +MIDSTORIES +MIDSTORY +MIDSTREAM +MIDSTREAMS +MIDSTS +MIDSUMMER +MIDSUMMERS +MIDTERM +MIDTERMS +MIDTOWN +MIDTOWNS +MIDWATCH +MIDWATCHES +MIDWAY +MIDWAYS +MIDWEEK +MIDWEEKLY +MIDWEEKS +MIDWIFE +MIDWIFED +MIDWIFERIES +MIDWIFERY +MIDWIFES +MIDWIFING +MIDWINTER +MIDWINTERS +MIDWIVED +MIDWIVES +MIDWIVING +MIDYEAR +MIDYEARS +MIEN +MIENS +MIFEPRISTONE +MIFEPRISTONES +MIFF +MIFFED +MIFFIER +MIFFIEST +MIFFINESS +MIFFINESSES +MIFFING +MIFFS +MIFFY +MIG +MIGG +MIGGLE +MIGGLES +MIGGS +MIGHT +MIGHTIER +MIGHTIEST +MIGHTILY +MIGHTINESS +MIGHTINESSES +MIGHTS +MIGHTY +MIGNON +MIGNONETTE +MIGNONETTES +MIGNONNE +MIGNONS +MIGRAINE +MIGRAINES +MIGRAINOUS +MIGRANT +MIGRANTS +MIGRATE +MIGRATED +MIGRATES +MIGRATING +MIGRATION +MIGRATIONAL +MIGRATIONS +MIGRATOR +MIGRATORS +MIGRATORY +MIGS +MIHRAB +MIHRABS +MIJNHEER +MIJNHEERS +MIKADO +MIKADOS +MIKE +MIKED +MIKES +MIKING +MIKRA +MIKRON +MIKRONS +MIKVAH +MIKVAHS +MIKVEH +MIKVEHS +MIKVOS +MIKVOT +MIKVOTH +MIL +MILADI +MILADIES +MILADIS +MILADY +MILAGE +MILAGES +MILCH +MILCHIG +MILD +MILDED +MILDEN +MILDENED +MILDENING +MILDENS +MILDER +MILDEST +MILDEW +MILDEWED +MILDEWING +MILDEWS +MILDEWY +MILDING +MILDLY +MILDNESS +MILDNESSES +MILDS +MILE +MILEAGE +MILEAGES +MILEPOST +MILEPOSTS +MILER +MILERS +MILES +MILESIAN +MILESIMO +MILESIMOS +MILESTONE +MILESTONES +MILFOIL +MILFOILS +MILIA +MILIARIA +MILIARIAL +MILIARIAS +MILIARY +MILIEU +MILIEUS +MILIEUX +MILITANCE +MILITANCES +MILITANCIES +MILITANCY +MILITANT +MILITANTLY +MILITANTNESS +MILITANTNESSES +MILITANTS +MILITARIA +MILITARIES +MILITARILY +MILITARISE +MILITARISED +MILITARISES +MILITARISING +MILITARISM +MILITARISMS +MILITARIST +MILITARISTIC +MILITARISTS +MILITARIZATION +MILITARIZATIONS +MILITARIZE +MILITARIZED +MILITARIZES +MILITARIZING +MILITARY +MILITATE +MILITATED +MILITATES +MILITATING +MILITIA +MILITIAMAN +MILITIAMEN +MILITIAS +MILIUM +MILK +MILKED +MILKER +MILKERS +MILKFISH +MILKFISHES +MILKIER +MILKIEST +MILKILY +MILKINESS +MILKINESSES +MILKING +MILKLESS +MILKMAID +MILKMAIDS +MILKMAN +MILKMEN +MILKS +MILKSHAKE +MILKSHAKES +MILKSHED +MILKSHEDS +MILKSOP +MILKSOPPY +MILKSOPS +MILKWEED +MILKWEEDS +MILKWOOD +MILKWOODS +MILKWORT +MILKWORTS +MILKY +MILL +MILLABLE +MILLAGE +MILLAGES +MILLBOARD +MILLBOARDS +MILLCAKE +MILLCAKES +MILLDAM +MILLDAMS +MILLE +MILLED +MILLEFIORI +MILLEFIORIS +MILLEFLEUR +MILLEFLEURS +MILLENARIAN +MILLENARIANISM +MILLENARIANISMS +MILLENARIANS +MILLENARIES +MILLENARY +MILLENNIA +MILLENNIAL +MILLENNIALISM +MILLENNIALISMS +MILLENNIALIST +MILLENNIALISTS +MILLENNIUM +MILLENNIUMS +MILLEPED +MILLEPEDE +MILLEPEDES +MILLEPEDS +MILLEPORE +MILLEPORES +MILLER +MILLERITE +MILLERITES +MILLERS +MILLES +MILLESIMAL +MILLESIMALLY +MILLESIMALS +MILLET +MILLETS +MILLHOUSE +MILLHOUSES +MILLIAMPERE +MILLIAMPERES +MILLIARD +MILLIARDS +MILLIARE +MILLIARES +MILLIARIES +MILLIARY +MILLIBAR +MILLIBARS +MILLICURIE +MILLICURIES +MILLIDEGREE +MILLIDEGREES +MILLIEME +MILLIEMES +MILLIER +MILLIERS +MILLIGAL +MILLIGALS +MILLIGRAM +MILLIGRAMS +MILLIHENRIES +MILLIHENRY +MILLIHENRYS +MILLILAMBERT +MILLILAMBERTS +MILLILITER +MILLILITERS +MILLILUCES +MILLILUX +MILLILUXES +MILLIME +MILLIMES +MILLIMETER +MILLIMETERS +MILLIMHO +MILLIMHOS +MILLIMICRON +MILLIMICRONS +MILLIMOLAR +MILLIMOLE +MILLIMOLES +MILLINE +MILLINER +MILLINERIES +MILLINERS +MILLINERY +MILLINES +MILLING +MILLINGS +MILLIOHM +MILLIOHMS +MILLION +MILLIONAIRE +MILLIONAIRES +MILLIONAIRESS +MILLIONAIRESSES +MILLIONFOLD +MILLIONS +MILLIONTH +MILLIONTHS +MILLIOSMOL +MILLIOSMOLS +MILLIPED +MILLIPEDE +MILLIPEDES +MILLIPEDS +MILLIRADIAN +MILLIRADIANS +MILLIREM +MILLIREMS +MILLIROENTGEN +MILLIROENTGENS +MILLISECOND +MILLISECONDS +MILLIVOLT +MILLIVOLTS +MILLIWATT +MILLIWATTS +MILLPOND +MILLPONDS +MILLRACE +MILLRACES +MILLRUN +MILLRUNS +MILLS +MILLSTONE +MILLSTONES +MILLSTREAM +MILLSTREAMS +MILLWORK +MILLWORKS +MILLWRIGHT +MILLWRIGHTS +MILNEB +MILNEBS +MILO +MILORD +MILORDS +MILOS +MILPA +MILPAS +MILREIS +MILS +MILT +MILTED +MILTER +MILTERS +MILTIER +MILTIEST +MILTING +MILTS +MILTY +MIM +MIMBAR +MIMBARS +MIME +MIMED +MIMEO +MIMEOED +MIMEOGRAPH +MIMEOGRAPHED +MIMEOGRAPHING +MIMEOGRAPHS +MIMEOING +MIMEOS +MIMER +MIMERS +MIMES +MIMESES +MIMESIS +MIMESISES +MIMETIC +MIMETICALLY +MIMETITE +MIMETITES +MIMIC +MIMICAL +MIMICKED +MIMICKER +MIMICKERS +MIMICKING +MIMICRIES +MIMICRY +MIMICS +MIMING +MIMOSA +MIMOSAS +MINA +MINABLE +MINACIOUS +MINACITIES +MINACITY +MINAE +MINARET +MINARETED +MINARETS +MINAS +MINATORY +MINAUDIERE +MINAUDIERES +MINCE +MINCED +MINCEMEAT +MINCEMEATS +MINCER +MINCERS +MINCES +MINCIER +MINCIEST +MINCING +MINCINGLY +MINCY +MIND +MINDBLOWER +MINDBLOWERS +MINDED +MINDEDNESS +MINDEDNESSES +MINDER +MINDERS +MINDFUL +MINDFULLY +MINDFULNESS +MINDFULNESSES +MINDING +MINDLESS +MINDLESSLY +MINDLESSNESS +MINDLESSNESSES +MINDS +MINDSET +MINDSETS +MINE +MINEABLE +MINED +MINEFIELD +MINEFIELDS +MINELAYER +MINELAYERS +MINER +MINERAL +MINERALISE +MINERALISED +MINERALISES +MINERALISING +MINERALIZABLE +MINERALIZATION +MINERALIZATIONS +MINERALIZE +MINERALIZED +MINERALIZER +MINERALIZERS +MINERALIZES +MINERALIZING +MINERALOGIC +MINERALOGICAL +MINERALOGICALLY +MINERALOGIES +MINERALOGIST +MINERALOGISTS +MINERALOGY +MINERALS +MINERS +MINES +MINESHAFT +MINESHAFTS +MINESTRONE +MINESTRONES +MINESWEEPER +MINESWEEPERS +MINESWEEPING +MINESWEEPINGS +MINGIER +MINGIEST +MINGLE +MINGLED +MINGLER +MINGLERS +MINGLES +MINGLING +MINGY +MINI +MINIATURE +MINIATURES +MINIATURIST +MINIATURISTIC +MINIATURISTS +MINIATURIZATION +MINIATURIZE +MINIATURIZED +MINIATURIZES +MINIATURIZING +MINIBAR +MINIBARS +MINIBIKE +MINIBIKER +MINIBIKERS +MINIBIKES +MINIBUS +MINIBUSES +MINIBUSSES +MINICAB +MINICABS +MINICAM +MINICAMP +MINICAMPS +MINICAMS +MINICAR +MINICARS +MINICOMPUTER +MINICOMPUTERS +MINICOURSE +MINICOURSES +MINIDISC +MINIDISCS +MINIDRESS +MINIDRESSES +MINIFIED +MINIFIES +MINIFY +MINIFYING +MINIKIN +MINIKINS +MINILAB +MINILABS +MINIM +MINIMA +MINIMAL +MINIMALISM +MINIMALISMS +MINIMALIST +MINIMALISTS +MINIMALLY +MINIMALS +MINIMAX +MINIMAXES +MINIMILL +MINIMILLS +MINIMISE +MINIMISED +MINIMISES +MINIMISING +MINIMIZATION +MINIMIZATIONS +MINIMIZE +MINIMIZED +MINIMIZER +MINIMIZERS +MINIMIZES +MINIMIZING +MINIMS +MINIMUM +MINIMUMS +MINING +MININGS +MINION +MINIONS +MINIPARK +MINIPARKS +MINIPILL +MINIPILLS +MINIS +MINISCHOOL +MINISCHOOLS +MINISCULE +MINISCULES +MINISERIES +MINISH +MINISHED +MINISHES +MINISHING +MINISKI +MINISKIRT +MINISKIRTED +MINISKIRTS +MINISKIS +MINISTATE +MINISTATES +MINISTER +MINISTERED +MINISTERIAL +MINISTERIALLY +MINISTERING +MINISTERS +MINISTRANT +MINISTRANTS +MINISTRATION +MINISTRATIONS +MINISTRIES +MINISTRY +MINITOWER +MINITOWERS +MINITRACK +MINITRACKS +MINIUM +MINIUMS +MINIVAN +MINIVANS +MINIVER +MINIVERS +MINK +MINKE +MINKES +MINKS +MINNESINGER +MINNESINGERS +MINNIES +MINNOW +MINNOWS +MINNY +MINOR +MINORCA +MINORCAS +MINORED +MINORING +MINORITIES +MINORITY +MINORS +MINOXIDIL +MINOXIDILS +MINSTER +MINSTERS +MINSTREL +MINSTRELS +MINSTRELSIES +MINSTRELSY +MINT +MINTAGE +MINTAGES +MINTED +MINTER +MINTERS +MINTIER +MINTIEST +MINTING +MINTS +MINTY +MINUEND +MINUENDS +MINUET +MINUETS +MINUS +MINUSCULE +MINUSCULES +MINUSES +MINUTE +MINUTED +MINUTELY +MINUTEMAN +MINUTEMEN +MINUTENESS +MINUTENESSES +MINUTER +MINUTES +MINUTEST +MINUTIA +MINUTIAE +MINUTIAL +MINUTING +MINX +MINXES +MINXISH +MINYAN +MINYANIM +MINYANS +MIOCENE +MIOSES +MIOSIS +MIOTIC +MIOTICS +MIPS +MIQUELET +MIQUELETS +MIR +MIRABELLE +MIRABELLES +MIRACIDIA +MIRACIDIAL +MIRACIDIUM +MIRACLE +MIRACLES +MIRACULOUS +MIRACULOUSLY +MIRACULOUSNESS +MIRADOR +MIRADORS +MIRAGE +MIRAGES +MIRANDIZE +MIRANDIZED +MIRANDIZES +MIRANDIZING +MIRE +MIRED +MIREPOIX +MIRES +MIREX +MIREXES +MIRI +MIRIER +MIRIEST +MIRIN +MIRINESS +MIRINESSES +MIRING +MIRINS +MIRK +MIRKER +MIRKEST +MIRKIER +MIRKIEST +MIRKILY +MIRKS +MIRKY +MIRLITON +MIRLITONS +MIRROR +MIRRORED +MIRRORING +MIRRORLIKE +MIRRORS +MIRS +MIRTH +MIRTHFUL +MIRTHFULLY +MIRTHFULNESS +MIRTHFULNESSES +MIRTHLESS +MIRTHLESSLY +MIRTHS +MIRY +MIRZA +MIRZAS +MIS +MISACT +MISACTED +MISACTING +MISACTS +MISADAPT +MISADAPTED +MISADAPTING +MISADAPTS +MISADD +MISADDED +MISADDING +MISADDRESS +MISADDRESSED +MISADDRESSES +MISADDRESSING +MISADDS +MISADJUST +MISADJUSTED +MISADJUSTING +MISADJUSTS +MISADVENTURE +MISADVENTURES +MISADVICE +MISADVICES +MISADVISE +MISADVISED +MISADVISES +MISADVISING +MISAGENT +MISAGENTS +MISAIM +MISAIMED +MISAIMING +MISAIMS +MISALIGN +MISALIGNED +MISALIGNING +MISALIGNMENT +MISALIGNMENTS +MISALIGNS +MISALLIANCE +MISALLIANCES +MISALLIED +MISALLIES +MISALLOCATE +MISALLOCATED +MISALLOCATES +MISALLOCATING +MISALLOCATION +MISALLOCATIONS +MISALLOT +MISALLOTS +MISALLOTTED +MISALLOTTING +MISALLY +MISALLYING +MISALTER +MISALTERED +MISALTERING +MISALTERS +MISANALYSES +MISANALYSIS +MISANDRIES +MISANDRY +MISANTHROPE +MISANTHROPES +MISANTHROPIC +MISANTHROPIES +MISANTHROPY +MISAPPLICATION +MISAPPLICATIONS +MISAPPLIED +MISAPPLIES +MISAPPLY +MISAPPLYING +MISAPPRAISAL +MISAPPRAISALS +MISAPPREHEND +MISAPPREHENDED +MISAPPREHENDING +MISAPPREHENDS +MISAPPREHENSION +MISAPPROPRIATE +MISAPPROPRIATED +MISAPPROPRIATES +MISARTICULATE +MISARTICULATED +MISARTICULATES +MISARTICULATING +MISASSAY +MISASSAYED +MISASSAYING +MISASSAYS +MISASSEMBLE +MISASSEMBLED +MISASSEMBLES +MISASSEMBLING +MISASSIGN +MISASSIGNED +MISASSIGNING +MISASSIGNS +MISASSUMPTION +MISASSUMPTIONS +MISATE +MISATONE +MISATONED +MISATONES +MISATONING +MISATTRIBUTE +MISATTRIBUTED +MISATTRIBUTES +MISATTRIBUTING +MISATTRIBUTION +MISATTRIBUTIONS +MISAVER +MISAVERRED +MISAVERRING +MISAVERS +MISAWARD +MISAWARDED +MISAWARDING +MISAWARDS +MISBALANCE +MISBALANCED +MISBALANCES +MISBALANCING +MISBECAME +MISBECOME +MISBECOMES +MISBECOMING +MISBEGAN +MISBEGIN +MISBEGINNING +MISBEGINS +MISBEGOT +MISBEGOTTEN +MISBEGUN +MISBEHAVE +MISBEHAVED +MISBEHAVER +MISBEHAVERS +MISBEHAVES +MISBEHAVING +MISBEHAVIOR +MISBEHAVIORS +MISBELIEF +MISBELIEFS +MISBELIEVE +MISBELIEVED +MISBELIEVER +MISBELIEVERS +MISBELIEVES +MISBELIEVING +MISBIAS +MISBIASED +MISBIASES +MISBIASING +MISBIASSED +MISBIASSES +MISBIASSING +MISBILL +MISBILLED +MISBILLING +MISBILLS +MISBIND +MISBINDING +MISBINDS +MISBOUND +MISBRAND +MISBRANDED +MISBRANDING +MISBRANDS +MISBUILD +MISBUILDING +MISBUILDS +MISBUILT +MISBUTTON +MISBUTTONED +MISBUTTONING +MISBUTTONS +MISCALCULATE +MISCALCULATED +MISCALCULATES +MISCALCULATING +MISCALCULATION +MISCALCULATIONS +MISCALL +MISCALLED +MISCALLER +MISCALLERS +MISCALLING +MISCALLS +MISCAPTION +MISCAPTIONED +MISCAPTIONING +MISCAPTIONS +MISCARRIAGE +MISCARRIAGES +MISCARRIED +MISCARRIES +MISCARRY +MISCARRYING +MISCAST +MISCASTING +MISCASTS +MISCATALOG +MISCATALOGED +MISCATALOGING +MISCATALOGS +MISCEGENATION +MISCEGENATIONAL +MISCEGENATIONS +MISCELLANEA +MISCELLANEOUS +MISCELLANEOUSLY +MISCELLANIES +MISCELLANIST +MISCELLANISTS +MISCELLANY +MISCHANCE +MISCHANCES +MISCHANNEL +MISCHANNELED +MISCHANNELING +MISCHANNELLED +MISCHANNELLING +MISCHANNELS +MISCHARACTERIZE +MISCHARGE +MISCHARGED +MISCHARGES +MISCHARGING +MISCHIEF +MISCHIEFS +MISCHIEVOUS +MISCHIEVOUSLY +MISCHIEVOUSNESS +MISCHOICE +MISCHOICES +MISCHOOSE +MISCHOOSES +MISCHOOSING +MISCHOSE +MISCHOSEN +MISCIBILITIES +MISCIBILITY +MISCIBLE +MISCITATION +MISCITATIONS +MISCITE +MISCITED +MISCITES +MISCITING +MISCLAIM +MISCLAIMED +MISCLAIMING +MISCLAIMS +MISCLASS +MISCLASSED +MISCLASSES +MISCLASSIFIED +MISCLASSIFIES +MISCLASSIFY +MISCLASSIFYING +MISCLASSING +MISCODE +MISCODED +MISCODES +MISCODING +MISCOIN +MISCOINED +MISCOINING +MISCOINS +MISCOLOR +MISCOLORED +MISCOLORING +MISCOLORS +MISCOMPUTATION +MISCOMPUTATIONS +MISCOMPUTE +MISCOMPUTED +MISCOMPUTES +MISCOMPUTING +MISCONCEIVE +MISCONCEIVED +MISCONCEIVER +MISCONCEIVERS +MISCONCEIVES +MISCONCEIVING +MISCONCEPTION +MISCONCEPTIONS +MISCONDUCT +MISCONDUCTED +MISCONDUCTING +MISCONDUCTS +MISCONNECT +MISCONNECTED +MISCONNECTING +MISCONNECTION +MISCONNECTIONS +MISCONNECTS +MISCONSTRUCTION +MISCONSTRUE +MISCONSTRUED +MISCONSTRUES +MISCONSTRUING +MISCOOK +MISCOOKED +MISCOOKING +MISCOOKS +MISCOPIED +MISCOPIES +MISCOPY +MISCOPYING +MISCORRELATION +MISCORRELATIONS +MISCOUNT +MISCOUNTED +MISCOUNTING +MISCOUNTS +MISCREANT +MISCREANTS +MISCREATE +MISCREATED +MISCREATES +MISCREATING +MISCREATION +MISCREATIONS +MISCUE +MISCUED +MISCUES +MISCUING +MISCUT +MISCUTS +MISCUTTING +MISDATE +MISDATED +MISDATES +MISDATING +MISDEAL +MISDEALER +MISDEALERS +MISDEALING +MISDEALS +MISDEALT +MISDEED +MISDEEDS +MISDEEM +MISDEEMED +MISDEEMING +MISDEEMS +MISDEFINE +MISDEFINED +MISDEFINES +MISDEFINING +MISDEMEANANT +MISDEMEANANTS +MISDEMEANOR +MISDEMEANORS +MISDESCRIBE +MISDESCRIBED +MISDESCRIBES +MISDESCRIBING +MISDESCRIPTION +MISDESCRIPTIONS +MISDEVELOP +MISDEVELOPED +MISDEVELOPING +MISDEVELOPS +MISDIAGNOSE +MISDIAGNOSED +MISDIAGNOSES +MISDIAGNOSING +MISDIAGNOSIS +MISDIAL +MISDIALED +MISDIALING +MISDIALLED +MISDIALLING +MISDIALS +MISDID +MISDIRECT +MISDIRECTED +MISDIRECTING +MISDIRECTION +MISDIRECTIONS +MISDIRECTS +MISDISTRIBUTION +MISDIVIDE +MISDIVIDED +MISDIVIDES +MISDIVIDING +MISDIVISION +MISDIVISIONS +MISDO +MISDOER +MISDOERS +MISDOES +MISDOING +MISDOINGS +MISDONE +MISDOUBT +MISDOUBTED +MISDOUBTING +MISDOUBTS +MISDRAW +MISDRAWING +MISDRAWN +MISDRAWS +MISDREW +MISDRIVE +MISDRIVEN +MISDRIVES +MISDRIVING +MISDROVE +MISE +MISEASE +MISEASES +MISEAT +MISEATEN +MISEATING +MISEATS +MISEDIT +MISEDITED +MISEDITING +MISEDITS +MISEDUCATE +MISEDUCATED +MISEDUCATES +MISEDUCATING +MISEDUCATION +MISEDUCATIONS +MISEMPHASES +MISEMPHASIS +MISEMPHASIZE +MISEMPHASIZED +MISEMPHASIZES +MISEMPHASIZING +MISEMPLOY +MISEMPLOYED +MISEMPLOYING +MISEMPLOYMENT +MISEMPLOYMENTS +MISEMPLOYS +MISENROL +MISENROLL +MISENROLLED +MISENROLLING +MISENROLLS +MISENROLS +MISENTER +MISENTERED +MISENTERING +MISENTERS +MISENTRIES +MISENTRY +MISER +MISERABLE +MISERABLENESS +MISERABLENESSES +MISERABLES +MISERABLY +MISERERE +MISERERES +MISERICORD +MISERICORDE +MISERICORDES +MISERICORDS +MISERIES +MISERLINESS +MISERLINESSES +MISERLY +MISERS +MISERY +MISES +MISESTEEM +MISESTEEMED +MISESTEEMING +MISESTEEMS +MISESTIMATE +MISESTIMATED +MISESTIMATES +MISESTIMATING +MISESTIMATION +MISESTIMATIONS +MISEVALUATE +MISEVALUATED +MISEVALUATES +MISEVALUATING +MISEVALUATION +MISEVALUATIONS +MISEVENT +MISEVENTS +MISFAITH +MISFAITHS +MISFEASANCE +MISFEASANCES +MISFEASOR +MISFEASORS +MISFED +MISFEED +MISFEEDING +MISFEEDS +MISFIELD +MISFIELDED +MISFIELDING +MISFIELDS +MISFILE +MISFILED +MISFILES +MISFILING +MISFIRE +MISFIRED +MISFIRES +MISFIRING +MISFIT +MISFITS +MISFITTED +MISFITTING +MISFOCUS +MISFOCUSED +MISFOCUSES +MISFOCUSING +MISFOCUSSED +MISFOCUSSES +MISFOCUSSING +MISFORM +MISFORMED +MISFORMING +MISFORMS +MISFORTUNE +MISFORTUNES +MISFRAME +MISFRAMED +MISFRAMES +MISFRAMING +MISFUNCTION +MISFUNCTIONED +MISFUNCTIONING +MISFUNCTIONS +MISGAUGE +MISGAUGED +MISGAUGES +MISGAUGING +MISGAVE +MISGIVE +MISGIVEN +MISGIVES +MISGIVING +MISGIVINGS +MISGOVERN +MISGOVERNED +MISGOVERNING +MISGOVERNMENT +MISGOVERNMENTS +MISGOVERNS +MISGRADE +MISGRADED +MISGRADES +MISGRADING +MISGRAFT +MISGRAFTED +MISGRAFTING +MISGRAFTS +MISGREW +MISGROW +MISGROWING +MISGROWN +MISGROWS +MISGUESS +MISGUESSED +MISGUESSES +MISGUESSING +MISGUIDANCE +MISGUIDANCES +MISGUIDE +MISGUIDED +MISGUIDEDLY +MISGUIDEDNESS +MISGUIDEDNESSES +MISGUIDER +MISGUIDERS +MISGUIDES +MISGUIDING +MISHANDLE +MISHANDLED +MISHANDLES +MISHANDLING +MISHANTER +MISHANTERS +MISHAP +MISHAPS +MISHEAR +MISHEARD +MISHEARING +MISHEARS +MISHEGAAS +MISHEGOSS +MISHIT +MISHITS +MISHITTING +MISHMASH +MISHMASHES +MISHMOSH +MISHMOSHES +MISIDENTIFIED +MISIDENTIFIES +MISIDENTIFY +MISIDENTIFYING +MISIMPRESSION +MISIMPRESSIONS +MISINFER +MISINFERRED +MISINFERRING +MISINFERS +MISINFORM +MISINFORMATION +MISINFORMATIONS +MISINFORMED +MISINFORMING +MISINFORMS +MISINTER +MISINTERPRET +MISINTERPRETED +MISINTERPRETING +MISINTERPRETS +MISINTERRED +MISINTERRING +MISINTERS +MISJOIN +MISJOINDER +MISJOINDERS +MISJOINED +MISJOINING +MISJOINS +MISJUDGE +MISJUDGED +MISJUDGES +MISJUDGING +MISJUDGMENT +MISJUDGMENTS +MISKAL +MISKALS +MISKEEP +MISKEEPING +MISKEEPS +MISKEPT +MISKICK +MISKICKED +MISKICKING +MISKICKS +MISKNEW +MISKNOW +MISKNOWING +MISKNOWLEDGE +MISKNOWLEDGES +MISKNOWN +MISKNOWS +MISLABEL +MISLABELED +MISLABELING +MISLABELLED +MISLABELLING +MISLABELS +MISLABOR +MISLABORED +MISLABORING +MISLABORS +MISLAID +MISLAIN +MISLAY +MISLAYER +MISLAYERS +MISLAYING +MISLAYS +MISLEAD +MISLEADER +MISLEADERS +MISLEADING +MISLEADINGLY +MISLEADS +MISLEARED +MISLEARN +MISLEARNED +MISLEARNING +MISLEARNS +MISLEARNT +MISLED +MISLIE +MISLIES +MISLIGHT +MISLIGHTED +MISLIGHTING +MISLIGHTS +MISLIKE +MISLIKED +MISLIKER +MISLIKERS +MISLIKES +MISLIKING +MISLIT +MISLIVE +MISLIVED +MISLIVES +MISLIVING +MISLOCATE +MISLOCATED +MISLOCATES +MISLOCATING +MISLOCATION +MISLOCATIONS +MISLODGE +MISLODGED +MISLODGES +MISLODGING +MISLYING +MISMADE +MISMAKE +MISMAKES +MISMAKING +MISMANAGE +MISMANAGED +MISMANAGEMENT +MISMANAGEMENTS +MISMANAGES +MISMANAGING +MISMARK +MISMARKED +MISMARKING +MISMARKS +MISMARRIAGE +MISMARRIAGES +MISMATCH +MISMATCHED +MISMATCHES +MISMATCHING +MISMATE +MISMATED +MISMATES +MISMATING +MISMEET +MISMEETING +MISMEETS +MISMET +MISMOVE +MISMOVED +MISMOVES +MISMOVING +MISNAME +MISNAMED +MISNAMES +MISNAMING +MISNOMER +MISNOMERED +MISNOMERS +MISNUMBER +MISNUMBERED +MISNUMBERING +MISNUMBERS +MISO +MISOGAMIC +MISOGAMIES +MISOGAMIST +MISOGAMISTS +MISOGAMY +MISOGYNIC +MISOGYNIES +MISOGYNIST +MISOGYNISTIC +MISOGYNISTS +MISOGYNY +MISOLOGIES +MISOLOGY +MISONEISM +MISONEISMS +MISONEIST +MISONEISTS +MISORDER +MISORDERED +MISORDERING +MISORDERS +MISORIENT +MISORIENTATION +MISORIENTATIONS +MISORIENTED +MISORIENTING +MISORIENTS +MISOS +MISPACKAGE +MISPACKAGED +MISPACKAGES +MISPACKAGING +MISPAGE +MISPAGED +MISPAGES +MISPAGING +MISPAINT +MISPAINTED +MISPAINTING +MISPAINTS +MISPARSE +MISPARSED +MISPARSES +MISPARSING +MISPART +MISPARTED +MISPARTING +MISPARTS +MISPATCH +MISPATCHED +MISPATCHES +MISPATCHING +MISPEN +MISPENNED +MISPENNING +MISPENS +MISPERCEIVE +MISPERCEIVED +MISPERCEIVES +MISPERCEIVING +MISPERCEPTION +MISPERCEPTIONS +MISPHRASE +MISPHRASED +MISPHRASES +MISPHRASING +MISPICKEL +MISPICKELS +MISPLACE +MISPLACED +MISPLACEMENT +MISPLACEMENTS +MISPLACES +MISPLACING +MISPLAN +MISPLANNED +MISPLANNING +MISPLANS +MISPLANT +MISPLANTED +MISPLANTING +MISPLANTS +MISPLAY +MISPLAYED +MISPLAYING +MISPLAYS +MISPLEAD +MISPLEADED +MISPLEADING +MISPLEADS +MISPLED +MISPOINT +MISPOINTED +MISPOINTING +MISPOINTS +MISPOISE +MISPOISED +MISPOISES +MISPOISING +MISPOSITION +MISPOSITIONED +MISPOSITIONING +MISPOSITIONS +MISPRICE +MISPRICED +MISPRICES +MISPRICING +MISPRINT +MISPRINTED +MISPRINTING +MISPRINTS +MISPRISION +MISPRISIONS +MISPRIZE +MISPRIZED +MISPRIZER +MISPRIZERS +MISPRIZES +MISPRIZING +MISPROGRAM +MISPROGRAMED +MISPROGRAMING +MISPROGRAMMED +MISPROGRAMMING +MISPROGRAMS +MISPRONOUNCE +MISPRONOUNCED +MISPRONOUNCES +MISPRONOUNCING +MISQUOTATION +MISQUOTATIONS +MISQUOTE +MISQUOTED +MISQUOTER +MISQUOTERS +MISQUOTES +MISQUOTING +MISRAISE +MISRAISED +MISRAISES +MISRAISING +MISRATE +MISRATED +MISRATES +MISRATING +MISREAD +MISREADING +MISREADS +MISRECKON +MISRECKONED +MISRECKONING +MISRECKONS +MISRECOLLECTION +MISRECORD +MISRECORDED +MISRECORDING +MISRECORDS +MISREFER +MISREFERENCE +MISREFERENCES +MISREFERRED +MISREFERRING +MISREFERS +MISREGISTER +MISREGISTERED +MISREGISTERING +MISREGISTERS +MISREGISTRATION +MISRELATE +MISRELATED +MISRELATES +MISRELATING +MISRELIED +MISRELIES +MISRELY +MISRELYING +MISREMEMBER +MISREMEMBERED +MISREMEMBERING +MISREMEMBERS +MISRENDER +MISRENDERED +MISRENDERING +MISRENDERS +MISREPORT +MISREPORTED +MISREPORTING +MISREPORTS +MISREPRESENT +MISREPRESENTED +MISREPRESENTING +MISREPRESENTS +MISRHYMED +MISROUTE +MISROUTED +MISROUTES +MISROUTING +MISRULE +MISRULED +MISRULES +MISRULING +MISS +MISSABLE +MISSAID +MISSAL +MISSALS +MISSAY +MISSAYING +MISSAYS +MISSEAT +MISSEATED +MISSEATING +MISSEATS +MISSED +MISSEL +MISSELS +MISSEND +MISSENDING +MISSENDS +MISSENSE +MISSENSES +MISSENT +MISSES +MISSET +MISSETS +MISSETTING +MISSHAPE +MISSHAPED +MISSHAPEN +MISSHAPENLY +MISSHAPER +MISSHAPERS +MISSHAPES +MISSHAPING +MISSHOD +MISSIES +MISSILE +MISSILEER +MISSILEERS +MISSILEMAN +MISSILEMEN +MISSILERIES +MISSILERY +MISSILES +MISSILRIES +MISSILRY +MISSING +MISSIOLOGIES +MISSIOLOGY +MISSION +MISSIONAL +MISSIONARIES +MISSIONARY +MISSIONED +MISSIONER +MISSIONERS +MISSIONING +MISSIONIZATION +MISSIONIZATIONS +MISSIONIZE +MISSIONIZED +MISSIONIZER +MISSIONIZERS +MISSIONIZES +MISSIONIZING +MISSIONS +MISSIS +MISSISES +MISSIVE +MISSIVES +MISSORT +MISSORTED +MISSORTING +MISSORTS +MISSOUND +MISSOUNDED +MISSOUNDING +MISSOUNDS +MISSOUT +MISSOUTS +MISSPACE +MISSPACED +MISSPACES +MISSPACING +MISSPEAK +MISSPEAKING +MISSPEAKS +MISSPELL +MISSPELLED +MISSPELLING +MISSPELLINGS +MISSPELLS +MISSPELT +MISSPEND +MISSPENDING +MISSPENDS +MISSPENT +MISSPOKE +MISSPOKEN +MISSTAMP +MISSTAMPED +MISSTAMPING +MISSTAMPS +MISSTART +MISSTARTED +MISSTARTING +MISSTARTS +MISSTATE +MISSTATED +MISSTATEMENT +MISSTATEMENTS +MISSTATES +MISSTATING +MISSTEER +MISSTEERED +MISSTEERING +MISSTEERS +MISSTEP +MISSTEPPED +MISSTEPPING +MISSTEPS +MISSTOP +MISSTOPPED +MISSTOPPING +MISSTOPS +MISSTRICKEN +MISSTRIKE +MISSTRIKES +MISSTRIKING +MISSTRUCK +MISSTYLE +MISSTYLED +MISSTYLES +MISSTYLING +MISSUIT +MISSUITED +MISSUITING +MISSUITS +MISSUS +MISSUSES +MISSY +MIST +MISTAKABLE +MISTAKE +MISTAKEN +MISTAKENLY +MISTAKER +MISTAKERS +MISTAKES +MISTAKING +MISTAUGHT +MISTBOW +MISTBOWS +MISTEACH +MISTEACHES +MISTEACHING +MISTED +MISTEND +MISTENDED +MISTENDING +MISTENDS +MISTER +MISTERM +MISTERMED +MISTERMING +MISTERMS +MISTERS +MISTEUK +MISTHINK +MISTHINKING +MISTHINKS +MISTHOUGHT +MISTHREW +MISTHROW +MISTHROWING +MISTHROWN +MISTHROWS +MISTIER +MISTIEST +MISTILY +MISTIME +MISTIMED +MISTIMES +MISTIMING +MISTINESS +MISTINESSES +MISTING +MISTITLE +MISTITLED +MISTITLES +MISTITLING +MISTLETOE +MISTLETOES +MISTOOK +MISTOUCH +MISTOUCHED +MISTOUCHES +MISTOUCHING +MISTRACE +MISTRACED +MISTRACES +MISTRACING +MISTRAIN +MISTRAINED +MISTRAINING +MISTRAINS +MISTRAL +MISTRALS +MISTRANSCRIBE +MISTRANSCRIBED +MISTRANSCRIBES +MISTRANSCRIBING +MISTRANSLATE +MISTRANSLATED +MISTRANSLATES +MISTRANSLATING +MISTRANSLATION +MISTRANSLATIONS +MISTREAT +MISTREATED +MISTREATING +MISTREATMENT +MISTREATMENTS +MISTREATS +MISTRESS +MISTRESSES +MISTRIAL +MISTRIALS +MISTRUST +MISTRUSTED +MISTRUSTFUL +MISTRUSTFULLY +MISTRUSTFULNESS +MISTRUSTING +MISTRUSTS +MISTRUTH +MISTRUTHS +MISTRYST +MISTRYSTED +MISTRYSTING +MISTRYSTS +MISTS +MISTUNE +MISTUNED +MISTUNES +MISTUNING +MISTUTOR +MISTUTORED +MISTUTORING +MISTUTORS +MISTY +MISTYPE +MISTYPED +MISTYPES +MISTYPING +MISUNDERSTAND +MISUNDERSTANDS +MISUNDERSTOOD +MISUNION +MISUNIONS +MISUSAGE +MISUSAGES +MISUSE +MISUSED +MISUSER +MISUSERS +MISUSES +MISUSING +MISUTILIZATION +MISUTILIZATIONS +MISVALUE +MISVALUED +MISVALUES +MISVALUING +MISVOCALIZATION +MISWORD +MISWORDED +MISWORDING +MISWORDS +MISWRIT +MISWRITE +MISWRITES +MISWRITING +MISWRITTEN +MISWROTE +MISYOKE +MISYOKED +MISYOKES +MISYOKING +MITE +MITER +MITERED +MITERER +MITERERS +MITERING +MITERS +MITERWORT +MITERWORTS +MITES +MITHER +MITHERS +MITHRIDATE +MITHRIDATES +MITICIDAL +MITICIDE +MITICIDES +MITIER +MITIEST +MITIGABLE +MITIGATE +MITIGATED +MITIGATES +MITIGATING +MITIGATION +MITIGATIONS +MITIGATIVE +MITIGATOR +MITIGATORS +MITIGATORY +MITIS +MITISES +MITOCHONDRIA +MITOCHONDRIAL +MITOCHONDRION +MITOGEN +MITOGENIC +MITOGENICITIES +MITOGENICITY +MITOGENS +MITOMYCIN +MITOMYCINS +MITOSES +MITOSIS +MITOTIC +MITOTICALLY +MITRAL +MITRE +MITRED +MITRES +MITREWORT +MITREWORTS +MITRING +MITSVAH +MITSVAHS +MITSVOTH +MITT +MITTEN +MITTENED +MITTENS +MITTIMUS +MITTIMUSES +MITTS +MITY +MITZVAH +MITZVAHS +MITZVOTH +MIX +MIXABLE +MIXED +MIXEDLY +MIXER +MIXERS +MIXES +MIXIBLE +MIXING +MIXOLOGIES +MIXOLOGIST +MIXOLOGISTS +MIXOLOGY +MIXT +MIXTURE +MIXTURES +MIXUP +MIXUPS +MIZEN +MIZENMAST +MIZENMASTS +MIZENS +MIZUNA +MIZUNAS +MIZZEN +MIZZENMAST +MIZZENMASTS +MIZZENS +MIZZLE +MIZZLED +MIZZLES +MIZZLING +MIZZLY +MM +MNEMONIC +MNEMONICALLY +MNEMONICS +MO +MOA +MOAN +MOANED +MOANER +MOANERS +MOANFUL +MOANING +MOANINGLY +MOANS +MOAS +MOAT +MOATED +MOATING +MOATLIKE +MOATS +MOB +MOBBED +MOBBER +MOBBERS +MOBBING +MOBBISH +MOBBISHLY +MOBBISM +MOBBISMS +MOBCAP +MOBCAPS +MOBILE +MOBILES +MOBILISE +MOBILISED +MOBILISES +MOBILISING +MOBILITIES +MOBILITY +MOBILIZATION +MOBILIZATIONS +MOBILIZE +MOBILIZED +MOBILIZER +MOBILIZERS +MOBILIZES +MOBILIZING +MOBLED +MOBOCRACIES +MOBOCRACY +MOBOCRAT +MOBOCRATIC +MOBOCRATS +MOBS +MOBSTER +MOBSTERS +MOC +MOCCASIN +MOCCASINS +MOCHA +MOCHAS +MOCHILA +MOCHILAS +MOCK +MOCKABLE +MOCKED +MOCKER +MOCKERIES +MOCKERS +MOCKERY +MOCKING +MOCKINGBIRD +MOCKINGBIRDS +MOCKINGLY +MOCKS +MOCKTAIL +MOCKTAILS +MOCKUP +MOCKUPS +MOCS +MOD +MODAL +MODALITIES +MODALITY +MODALLY +MODALS +MODE +MODEL +MODELED +MODELER +MODELERS +MODELING +MODELINGS +MODELIST +MODELISTS +MODELLED +MODELLER +MODELLERS +MODELLING +MODELS +MODEM +MODEMED +MODEMING +MODEMS +MODERATE +MODERATED +MODERATELY +MODERATENESS +MODERATENESSES +MODERATES +MODERATING +MODERATION +MODERATIONS +MODERATO +MODERATOR +MODERATORS +MODERATORSHIP +MODERATORSHIPS +MODERATOS +MODERN +MODERNE +MODERNER +MODERNES +MODERNEST +MODERNISATION +MODERNISATIONS +MODERNISE +MODERNISED +MODERNISES +MODERNISING +MODERNISM +MODERNISMS +MODERNIST +MODERNISTIC +MODERNISTS +MODERNITIES +MODERNITY +MODERNIZATION +MODERNIZATIONS +MODERNIZE +MODERNIZED +MODERNIZER +MODERNIZERS +MODERNIZES +MODERNIZING +MODERNLY +MODERNNESS +MODERNNESSES +MODERNS +MODES +MODEST +MODESTER +MODESTEST +MODESTIES +MODESTLY +MODESTY +MODI +MODICA +MODICUM +MODICUMS +MODIFIABILITIES +MODIFIABILITY +MODIFIABLE +MODIFICATION +MODIFICATIONS +MODIFIED +MODIFIER +MODIFIERS +MODIFIES +MODIFY +MODIFYING +MODILLION +MODILLIONS +MODIOLI +MODIOLUS +MODISH +MODISHLY +MODISHNESS +MODISHNESSES +MODISTE +MODISTES +MODS +MODULABILITIES +MODULABILITY +MODULAR +MODULARITIES +MODULARITY +MODULARIZED +MODULARLY +MODULARS +MODULATE +MODULATED +MODULATES +MODULATING +MODULATION +MODULATIONS +MODULATOR +MODULATORS +MODULATORY +MODULE +MODULES +MODULI +MODULO +MODULUS +MODUS +MOFETTE +MOFETTES +MOFFETTE +MOFFETTES +MOG +MOGGED +MOGGIE +MOGGIES +MOGGING +MOGGY +MOGHUL +MOGHULS +MOGS +MOGUL +MOGULED +MOGULS +MOHAIR +MOHAIRS +MOHALIM +MOHAWK +MOHAWKS +MOHEL +MOHELIM +MOHELS +MOHUR +MOHURS +MOIDORE +MOIDORES +MOIETIES +MOIETY +MOIL +MOILED +MOILER +MOILERS +MOILING +MOILINGLY +MOILS +MOIRA +MOIRAI +MOIRE +MOIRES +MOIST +MOISTEN +MOISTENED +MOISTENER +MOISTENERS +MOISTENING +MOISTENS +MOISTER +MOISTEST +MOISTFUL +MOISTLY +MOISTNESS +MOISTNESSES +MOISTURE +MOISTURES +MOISTURISE +MOISTURISED +MOISTURISES +MOISTURISING +MOISTURIZE +MOISTURIZED +MOISTURIZER +MOISTURIZERS +MOISTURIZES +MOISTURIZING +MOJARRA +MOJARRAS +MOJO +MOJOES +MOJOS +MOKE +MOKES +MOL +MOLA +MOLAL +MOLALITIES +MOLALITY +MOLAR +MOLARITIES +MOLARITY +MOLARS +MOLAS +MOLASSES +MOLASSESES +MOLD +MOLDABLE +MOLDBOARD +MOLDBOARDS +MOLDED +MOLDER +MOLDERED +MOLDERING +MOLDERS +MOLDIER +MOLDIEST +MOLDINESS +MOLDINESSES +MOLDING +MOLDINGS +MOLDS +MOLDWARP +MOLDWARPS +MOLDY +MOLE +MOLECULAR +MOLECULARLY +MOLECULE +MOLECULES +MOLEHILL +MOLEHILLS +MOLES +MOLESKIN +MOLESKINS +MOLEST +MOLESTATION +MOLESTATIONS +MOLESTED +MOLESTER +MOLESTERS +MOLESTING +MOLESTS +MOLIES +MOLINE +MOLL +MOLLAH +MOLLAHS +MOLLIE +MOLLIES +MOLLIFICATION +MOLLIFICATIONS +MOLLIFIED +MOLLIFIER +MOLLIFIERS +MOLLIFIES +MOLLIFY +MOLLIFYING +MOLLS +MOLLUSC +MOLLUSCA +MOLLUSCAN +MOLLUSCANS +MOLLUSCICIDAL +MOLLUSCICIDE +MOLLUSCICIDES +MOLLUSCS +MOLLUSCUM +MOLLUSK +MOLLUSKAN +MOLLUSKANS +MOLLUSKS +MOLLY +MOLLYCODDLE +MOLLYCODDLED +MOLLYCODDLER +MOLLYCODDLERS +MOLLYCODDLES +MOLLYCODDLING +MOLLYMAWK +MOLLYMAWKS +MOLOCH +MOLOCHS +MOLS +MOLT +MOLTED +MOLTEN +MOLTENLY +MOLTER +MOLTERS +MOLTING +MOLTO +MOLTS +MOLY +MOLYBDATE +MOLYBDATES +MOLYBDENITE +MOLYBDENITES +MOLYBDENUM +MOLYBDENUMS +MOLYBDIC +MOLYBDOUS +MOM +MOME +MOMENT +MOMENTA +MOMENTARILY +MOMENTARINESS +MOMENTARINESSES +MOMENTARY +MOMENTLY +MOMENTO +MOMENTOES +MOMENTOS +MOMENTOUS +MOMENTOUSLY +MOMENTOUSNESS +MOMENTOUSNESSES +MOMENTS +MOMENTUM +MOMENTUMS +MOMES +MOMI +MOMISM +MOMISMS +MOMMA +MOMMAS +MOMMIES +MOMMY +MOMS +MOMSER +MOMSERS +MOMUS +MOMUSES +MOMZER +MOMZERS +MON +MONACHAL +MONACHISM +MONACHISMS +MONACID +MONACIDIC +MONACIDS +MONAD +MONADAL +MONADELPHOUS +MONADES +MONADIC +MONADICAL +MONADISM +MONADISMS +MONADNOCK +MONADNOCKS +MONADS +MONANDRIES +MONANDRY +MONARCH +MONARCHAL +MONARCHIAL +MONARCHIC +MONARCHICAL +MONARCHICALLY +MONARCHIES +MONARCHISM +MONARCHISMS +MONARCHIST +MONARCHISTS +MONARCHS +MONARCHY +MONARDA +MONARDAS +MONAS +MONASTERIES +MONASTERY +MONASTIC +MONASTICALLY +MONASTICISM +MONASTICISMS +MONASTICS +MONATOMIC +MONAURAL +MONAURALLY +MONAXIAL +MONAXON +MONAXONS +MONAZITE +MONAZITES +MONDE +MONDES +MONDO +MONDOS +MONECIAN +MONECIOUS +MONELLIN +MONELLINS +MONERAN +MONERANS +MONESTROUS +MONETARILY +MONETARISM +MONETARISMS +MONETARIST +MONETARISTS +MONETARY +MONETISE +MONETISED +MONETISES +MONETISING +MONETIZATION +MONETIZATIONS +MONETIZE +MONETIZED +MONETIZES +MONETIZING +MONEY +MONEYBAG +MONEYBAGS +MONEYED +MONEYER +MONEYERS +MONEYGRUBBING +MONEYGRUBBINGS +MONEYLENDER +MONEYLENDERS +MONEYLESS +MONEYMAKER +MONEYMAKERS +MONEYMAKING +MONEYMAKINGS +MONEYMAN +MONEYMEN +MONEYS +MONEYWORT +MONEYWORTS +MONGEESE +MONGER +MONGERED +MONGERING +MONGERS +MONGO +MONGOE +MONGOES +MONGOL +MONGOLIAN +MONGOLISM +MONGOLISMS +MONGOLOID +MONGOLOIDS +MONGOLS +MONGOOSE +MONGOOSES +MONGOS +MONGREL +MONGRELIZATION +MONGRELIZATIONS +MONGRELIZE +MONGRELIZED +MONGRELIZES +MONGRELIZING +MONGRELLY +MONGRELS +MONGST +MONICKER +MONICKERS +MONIE +MONIED +MONIES +MONIKER +MONIKERS +MONILIASES +MONILIASIS +MONILIFORM +MONISH +MONISHED +MONISHES +MONISHING +MONISM +MONISMS +MONIST +MONISTIC +MONISTS +MONITION +MONITIONS +MONITIVE +MONITOR +MONITORED +MONITORIAL +MONITORIES +MONITORING +MONITORS +MONITORSHIP +MONITORSHIPS +MONITORY +MONK +MONKERIES +MONKERY +MONKEY +MONKEYED +MONKEYING +MONKEYISH +MONKEYPOD +MONKEYPODS +MONKEYPOT +MONKEYPOTS +MONKEYS +MONKEYSHINE +MONKEYSHINES +MONKFISH +MONKFISHES +MONKHOOD +MONKHOODS +MONKISH +MONKISHLY +MONKS +MONKSHOOD +MONKSHOODS +MONO +MONOACID +MONOACIDIC +MONOACIDS +MONOAMINE +MONOAMINERGIC +MONOAMINES +MONOBASIC +MONOCARBOXYLIC +MONOCARP +MONOCARPIC +MONOCARPS +MONOCHASIA +MONOCHASIAL +MONOCHASIUM +MONOCHORD +MONOCHORDS +MONOCHROMAT +MONOCHROMATIC +MONOCHROMATISM +MONOCHROMATISMS +MONOCHROMATOR +MONOCHROMATORS +MONOCHROMATS +MONOCHROME +MONOCHROMES +MONOCHROMIC +MONOCHROMIST +MONOCHROMISTS +MONOCLE +MONOCLED +MONOCLES +MONOCLINE +MONOCLINES +MONOCLINIC +MONOCLONAL +MONOCLONALS +MONOCOQUE +MONOCOQUES +MONOCOT +MONOCOTS +MONOCOTYL +MONOCOTYLEDON +MONOCOTYLEDONS +MONOCOTYLS +MONOCRACIES +MONOCRACY +MONOCRAT +MONOCRATIC +MONOCRATS +MONOCRYSTAL +MONOCRYSTALLINE +MONOCRYSTALS +MONOCULAR +MONOCULARLY +MONOCULARS +MONOCULTURAL +MONOCULTURE +MONOCULTURES +MONOCYCLE +MONOCYCLES +MONOCYCLIC +MONOCYTE +MONOCYTES +MONOCYTIC +MONODIC +MONODICAL +MONODICALLY +MONODIES +MONODISPERSE +MONODIST +MONODISTS +MONODRAMA +MONODRAMAS +MONODRAMATIC +MONODY +MONOECIES +MONOECIOUS +MONOECISM +MONOECISMS +MONOECY +MONOESTER +MONOESTERS +MONOFIL +MONOFILAMENT +MONOFILAMENTS +MONOFILS +MONOFUEL +MONOFUELS +MONOGAMIC +MONOGAMIES +MONOGAMIST +MONOGAMISTS +MONOGAMOUS +MONOGAMOUSLY +MONOGAMY +MONOGASTRIC +MONOGENEAN +MONOGENEANS +MONOGENESES +MONOGENESIS +MONOGENETIC +MONOGENIC +MONOGENICALLY +MONOGENIES +MONOGENY +MONOGERM +MONOGLOT +MONOGLOTS +MONOGLYCERIDE +MONOGLYCERIDES +MONOGRAM +MONOGRAMED +MONOGRAMING +MONOGRAMMATIC +MONOGRAMMED +MONOGRAMMER +MONOGRAMMERS +MONOGRAMMING +MONOGRAMS +MONOGRAPH +MONOGRAPHED +MONOGRAPHIC +MONOGRAPHING +MONOGRAPHS +MONOGYNIES +MONOGYNOUS +MONOGYNY +MONOHULL +MONOHULLS +MONOHYBRID +MONOHYBRIDS +MONOHYDRIC +MONOHYDROXY +MONOICOUS +MONOKINE +MONOKINES +MONOLAYER +MONOLAYERS +MONOLINGUAL +MONOLINGUALS +MONOLITH +MONOLITHIC +MONOLITHICALLY +MONOLITHS +MONOLOG +MONOLOGGED +MONOLOGGING +MONOLOGIC +MONOLOGIES +MONOLOGIST +MONOLOGISTS +MONOLOGS +MONOLOGUE +MONOLOGUED +MONOLOGUES +MONOLOGUING +MONOLOGUIST +MONOLOGUISTS +MONOLOGY +MONOMANIA +MONOMANIAC +MONOMANIACAL +MONOMANIACALLY +MONOMANIACS +MONOMANIAS +MONOMER +MONOMERIC +MONOMERS +MONOMETALLIC +MONOMETALLISM +MONOMETALLISMS +MONOMETALLIST +MONOMETALLISTS +MONOMETER +MONOMETERS +MONOMIAL +MONOMIALS +MONOMOLECULAR +MONOMOLECULARLY +MONOMORPHEMIC +MONOMORPHIC +MONOMORPHISM +MONOMORPHISMS +MONONUCLEAR +MONONUCLEARS +MONONUCLEATE +MONONUCLEATED +MONONUCLEOSES +MONONUCLEOSIS +MONONUCLEOTIDE +MONONUCLEOTIDES +MONOPHAGIES +MONOPHAGOUS +MONOPHAGY +MONOPHONIC +MONOPHONICALLY +MONOPHONIES +MONOPHONY +MONOPHTHONG +MONOPHTHONGAL +MONOPHTHONGS +MONOPHYLETIC +MONOPHYLIES +MONOPHYLY +MONOPLANE +MONOPLANES +MONOPLOID +MONOPLOIDS +MONOPOD +MONOPODE +MONOPODES +MONOPODIA +MONOPODIAL +MONOPODIALLY +MONOPODIES +MONOPODIUM +MONOPODS +MONOPODY +MONOPOLE +MONOPOLES +MONOPOLIES +MONOPOLISE +MONOPOLISED +MONOPOLISES +MONOPOLISING +MONOPOLIST +MONOPOLISTIC +MONOPOLISTS +MONOPOLIZATION +MONOPOLIZATIONS +MONOPOLIZE +MONOPOLIZED +MONOPOLIZER +MONOPOLIZERS +MONOPOLIZES +MONOPOLIZING +MONOPOLY +MONOPROPELLANT +MONOPROPELLANTS +MONOPSONIES +MONOPSONISTIC +MONOPSONY +MONORAIL +MONORAILS +MONORCHID +MONORCHIDISM +MONORCHIDISMS +MONORCHIDS +MONORHYME +MONORHYMED +MONORHYMES +MONOS +MONOSACCHARIDE +MONOSACCHARIDES +MONOSOME +MONOSOMES +MONOSOMIC +MONOSOMICS +MONOSOMIES +MONOSOMY +MONOSPECIFIC +MONOSPECIFICITY +MONOSTELE +MONOSTELES +MONOSTELIC +MONOSTELIES +MONOSTELY +MONOSTICH +MONOSTICHS +MONOSTOME +MONOSYLLABIC +MONOSYLLABICITY +MONOSYLLABLE +MONOSYLLABLES +MONOSYNAPTIC +MONOTERPENE +MONOTERPENES +MONOTHEISM +MONOTHEISMS +MONOTHEIST +MONOTHEISTIC +MONOTHEISTICAL +MONOTHEISTS +MONOTINT +MONOTINTS +MONOTONE +MONOTONES +MONOTONIC +MONOTONICALLY +MONOTONICITIES +MONOTONICITY +MONOTONIES +MONOTONOUS +MONOTONOUSLY +MONOTONOUSNESS +MONOTONY +MONOTREME +MONOTREMES +MONOTYPE +MONOTYPES +MONOTYPIC +MONOUNSATURATE +MONOUNSATURATED +MONOUNSATURATES +MONOVALENT +MONOVULAR +MONOXIDE +MONOXIDES +MONOZYGOTIC +MONS +MONSEIGNEUR +MONSIEUR +MONSIGNOR +MONSIGNORI +MONSIGNORIAL +MONSIGNORS +MONSOON +MONSOONAL +MONSOONS +MONSTER +MONSTERA +MONSTERAS +MONSTERS +MONSTRANCE +MONSTRANCES +MONSTROSITIES +MONSTROSITY +MONSTROUS +MONSTROUSLY +MONSTROUSNESS +MONSTROUSNESSES +MONTADALE +MONTADALES +MONTAGE +MONTAGED +MONTAGES +MONTAGING +MONTAGNARD +MONTAGNARDS +MONTANE +MONTANES +MONTE +MONTEITH +MONTEITHS +MONTERO +MONTEROS +MONTES +MONTH +MONTHLIES +MONTHLONG +MONTHLY +MONTHS +MONTICULE +MONTICULES +MONTMORILLONITE +MONUMENT +MONUMENTAL +MONUMENTALITIES +MONUMENTALITY +MONUMENTALIZE +MONUMENTALIZED +MONUMENTALIZES +MONUMENTALIZING +MONUMENTALLY +MONUMENTS +MONURON +MONURONS +MONY +MONZONITE +MONZONITES +MOO +MOOCH +MOOCHED +MOOCHER +MOOCHERS +MOOCHES +MOOCHING +MOOD +MOODIER +MOODIEST +MOODILY +MOODINESS +MOODINESSES +MOODS +MOODY +MOOED +MOOING +MOOL +MOOLA +MOOLAH +MOOLAHS +MOOLAS +MOOLEY +MOOLEYS +MOOLS +MOON +MOONBEAM +MOONBEAMS +MOONBLIND +MOONBOW +MOONBOWS +MOONCALF +MOONCALVES +MOONCHILD +MOONCHILDREN +MOONDUST +MOONDUSTS +MOONED +MOONER +MOONERS +MOONEYE +MOONEYES +MOONFACED +MOONFISH +MOONFISHES +MOONFLOWER +MOONFLOWERS +MOONIER +MOONIEST +MOONILY +MOONINESS +MOONINESSES +MOONING +MOONISH +MOONISHLY +MOONLESS +MOONLET +MOONLETS +MOONLIGHT +MOONLIGHTED +MOONLIGHTER +MOONLIGHTERS +MOONLIGHTING +MOONLIGHTS +MOONLIKE +MOONLIT +MOONPORT +MOONPORTS +MOONQUAKE +MOONQUAKES +MOONRISE +MOONRISES +MOONROOF +MOONROOFS +MOONS +MOONSAIL +MOONSAILS +MOONSCAPE +MOONSCAPES +MOONSEED +MOONSEEDS +MOONSET +MOONSETS +MOONSHINE +MOONSHINED +MOONSHINER +MOONSHINERS +MOONSHINES +MOONSHINING +MOONSHINY +MOONSHOT +MOONSHOTS +MOONSTONE +MOONSTONES +MOONSTRUCK +MOONWALK +MOONWALKED +MOONWALKING +MOONWALKS +MOONWARD +MOONWARDS +MOONWORT +MOONWORTS +MOONY +MOOR +MOORAGE +MOORAGES +MOORCOCK +MOORCOCKS +MOORED +MOORFOWL +MOORFOWLS +MOORHEN +MOORHENS +MOORIER +MOORIEST +MOORING +MOORINGS +MOORISH +MOORLAND +MOORLANDS +MOORS +MOORWORT +MOORWORTS +MOORY +MOOS +MOOSE +MOOSEBIRD +MOOSEBIRDS +MOOSEWOOD +MOOSEWOODS +MOOT +MOOTED +MOOTER +MOOTERS +MOOTING +MOOTNESS +MOOTNESSES +MOOTS +MOP +MOPBOARD +MOPBOARDS +MOPE +MOPED +MOPEDS +MOPER +MOPERIES +MOPERS +MOPERY +MOPES +MOPEY +MOPIER +MOPIEST +MOPINESS +MOPINESSES +MOPING +MOPINGLY +MOPISH +MOPISHLY +MOPOKE +MOPOKES +MOPPED +MOPPER +MOPPERS +MOPPET +MOPPETS +MOPPING +MOPS +MOPY +MOQUETTE +MOQUETTES +MOR +MORA +MORAE +MORAINAL +MORAINE +MORAINES +MORAINIC +MORAL +MORALE +MORALES +MORALISE +MORALISED +MORALISES +MORALISING +MORALISM +MORALISMS +MORALIST +MORALISTIC +MORALISTICALLY +MORALISTS +MORALITIES +MORALITY +MORALIZATION +MORALIZATIONS +MORALIZE +MORALIZED +MORALIZER +MORALIZERS +MORALIZES +MORALIZING +MORALLY +MORALS +MORAS +MORASS +MORASSES +MORASSY +MORATORIA +MORATORIUM +MORATORIUMS +MORATORY +MORAY +MORAYS +MORBID +MORBIDITIES +MORBIDITY +MORBIDLY +MORBIDNESS +MORBIDNESSES +MORBIFIC +MORBILLI +MORCEAU +MORCEAUX +MORDACITIES +MORDACITY +MORDANCIES +MORDANCY +MORDANT +MORDANTED +MORDANTING +MORDANTLY +MORDANTS +MORDENT +MORDENTS +MORE +MOREEN +MOREENS +MOREL +MORELLE +MORELLES +MORELLO +MORELLOS +MORELS +MORENESS +MORENESSES +MOREOVER +MORES +MORESQUE +MORESQUES +MORGAN +MORGANATIC +MORGANATICALLY +MORGANITE +MORGANITES +MORGANS +MORGEN +MORGENS +MORGUE +MORGUES +MORIBUND +MORIBUNDITIES +MORIBUNDITY +MORION +MORIONS +MORN +MORNING +MORNINGS +MORNS +MOROCCO +MOROCCOS +MORON +MORONIC +MORONICALLY +MORONISM +MORONISMS +MORONITIES +MORONITY +MORONS +MOROSE +MOROSELY +MOROSENESS +MOROSENESSES +MOROSITIES +MOROSITY +MORPH +MORPHACTIN +MORPHACTINS +MORPHALLAXES +MORPHALLAXIS +MORPHED +MORPHEME +MORPHEMES +MORPHEMIC +MORPHEMICALLY +MORPHEMICS +MORPHIA +MORPHIAS +MORPHIC +MORPHIN +MORPHINE +MORPHINES +MORPHING +MORPHINGS +MORPHINIC +MORPHINISM +MORPHINISMS +MORPHINS +MORPHO +MORPHOGEN +MORPHOGENESES +MORPHOGENESIS +MORPHOGENETIC +MORPHOGENIC +MORPHOGENS +MORPHOLOGIC +MORPHOLOGICAL +MORPHOLOGICALLY +MORPHOLOGIES +MORPHOLOGIST +MORPHOLOGISTS +MORPHOLOGY +MORPHOMETRIC +MORPHOMETRIES +MORPHOMETRY +MORPHOPHONEMICS +MORPHOS +MORPHOSES +MORPHOSIS +MORPHS +MORRION +MORRIONS +MORRIS +MORRISES +MORRO +MORROS +MORROW +MORROWS +MORS +MORSE +MORSEL +MORSELED +MORSELING +MORSELLED +MORSELLING +MORSELS +MORT +MORTADELLA +MORTADELLAS +MORTAL +MORTALITIES +MORTALITY +MORTALLY +MORTALS +MORTAR +MORTARBOARD +MORTARBOARDS +MORTARED +MORTARING +MORTARLESS +MORTARMAN +MORTARMEN +MORTARS +MORTARY +MORTGAGE +MORTGAGED +MORTGAGEE +MORTGAGEES +MORTGAGER +MORTGAGERS +MORTGAGES +MORTGAGING +MORTGAGOR +MORTGAGORS +MORTICE +MORTICED +MORTICES +MORTICIAN +MORTICIANS +MORTICING +MORTIFICATION +MORTIFICATIONS +MORTIFIED +MORTIFIER +MORTIFIERS +MORTIFIES +MORTIFY +MORTIFYING +MORTISE +MORTISED +MORTISER +MORTISERS +MORTISES +MORTISING +MORTMAIN +MORTMAINS +MORTS +MORTUARIES +MORTUARY +MORULA +MORULAE +MORULAR +MORULAS +MORULATION +MORULATIONS +MOS +MOSAIC +MOSAICALLY +MOSAICISM +MOSAICISMS +MOSAICIST +MOSAICISTS +MOSAICKED +MOSAICKING +MOSAICLIKE +MOSAICS +MOSASAUR +MOSASAURS +MOSCHATE +MOSCHATEL +MOSCHATELS +MOSEY +MOSEYED +MOSEYING +MOSEYS +MOSH +MOSHAV +MOSHAVIM +MOSHED +MOSHER +MOSHERS +MOSHES +MOSHING +MOSHINGS +MOSK +MOSKS +MOSQUE +MOSQUES +MOSQUITO +MOSQUITOES +MOSQUITOEY +MOSQUITOS +MOSS +MOSSBACK +MOSSBACKED +MOSSBACKS +MOSSED +MOSSER +MOSSERS +MOSSES +MOSSGROWN +MOSSIER +MOSSIEST +MOSSINESS +MOSSINESSES +MOSSING +MOSSLIKE +MOSSO +MOSSY +MOST +MOSTE +MOSTEST +MOSTESTS +MOSTLY +MOSTS +MOT +MOTE +MOTEL +MOTELS +MOTES +MOTET +MOTETS +MOTEY +MOTH +MOTHBALL +MOTHBALLED +MOTHBALLING +MOTHBALLS +MOTHER +MOTHERBOARD +MOTHERBOARDS +MOTHERED +MOTHERFUCKER +MOTHERFUCKERS +MOTHERFUCKING +MOTHERHOOD +MOTHERHOODS +MOTHERHOUSE +MOTHERHOUSES +MOTHERING +MOTHERINGS +MOTHERLAND +MOTHERLANDS +MOTHERLESS +MOTHERLESSNESS +MOTHERLINESS +MOTHERLINESSES +MOTHERLY +MOTHERS +MOTHERY +MOTHIER +MOTHIEST +MOTHLIKE +MOTHPROOF +MOTHPROOFED +MOTHPROOFER +MOTHPROOFERS +MOTHPROOFING +MOTHPROOFS +MOTHS +MOTHY +MOTIF +MOTIFIC +MOTIFS +MOTILE +MOTILES +MOTILITIES +MOTILITY +MOTION +MOTIONAL +MOTIONED +MOTIONER +MOTIONERS +MOTIONING +MOTIONLESS +MOTIONLESSLY +MOTIONLESSNESS +MOTIONS +MOTIVATE +MOTIVATED +MOTIVATES +MOTIVATING +MOTIVATION +MOTIVATIONAL +MOTIVATIONALLY +MOTIVATIONS +MOTIVATIVE +MOTIVATOR +MOTIVATORS +MOTIVE +MOTIVED +MOTIVELESS +MOTIVELESSLY +MOTIVES +MOTIVIC +MOTIVING +MOTIVITIES +MOTIVITY +MOTLEY +MOTLEYER +MOTLEYEST +MOTLEYS +MOTLIER +MOTLIEST +MOTMOT +MOTMOTS +MOTOCROSS +MOTOCROSSES +MOTONEURON +MOTONEURONAL +MOTONEURONS +MOTOR +MOTORBIKE +MOTORBIKED +MOTORBIKES +MOTORBIKING +MOTORBOAT +MOTORBOATED +MOTORBOATER +MOTORBOATERS +MOTORBOATING +MOTORBOATINGS +MOTORBOATS +MOTORBUS +MOTORBUSES +MOTORBUSSES +MOTORCADE +MOTORCADED +MOTORCADES +MOTORCADING +MOTORCAR +MOTORCARS +MOTORCYCLE +MOTORCYCLED +MOTORCYCLES +MOTORCYCLING +MOTORCYCLIST +MOTORCYCLISTS +MOTORDOM +MOTORDOMS +MOTORED +MOTORIC +MOTORICALLY +MOTORING +MOTORINGS +MOTORISE +MOTORISED +MOTORISES +MOTORISING +MOTORIST +MOTORISTS +MOTORIZATION +MOTORIZATIONS +MOTORIZE +MOTORIZED +MOTORIZES +MOTORIZING +MOTORLESS +MOTORMAN +MOTORMEN +MOTORMOUTH +MOTORMOUTHS +MOTORS +MOTORSHIP +MOTORSHIPS +MOTORTRUCK +MOTORTRUCKS +MOTORWAY +MOTORWAYS +MOTS +MOTT +MOTTE +MOTTES +MOTTLE +MOTTLED +MOTTLER +MOTTLERS +MOTTLES +MOTTLING +MOTTO +MOTTOES +MOTTOS +MOTTS +MOUCH +MOUCHED +MOUCHES +MOUCHING +MOUCHOIR +MOUCHOIRS +MOUE +MOUES +MOUFFLON +MOUFFLONS +MOUFLON +MOUFLONS +MOUILLE +MOUJIK +MOUJIKS +MOULAGE +MOULAGES +MOULD +MOULDED +MOULDER +MOULDERED +MOULDERING +MOULDERS +MOULDIER +MOULDIEST +MOULDING +MOULDINGS +MOULDS +MOULDY +MOULIN +MOULINS +MOULT +MOULTED +MOULTER +MOULTERS +MOULTING +MOULTS +MOUND +MOUNDBIRD +MOUNDBIRDS +MOUNDED +MOUNDING +MOUNDS +MOUNT +MOUNTABLE +MOUNTAIN +MOUNTAINEER +MOUNTAINEERING +MOUNTAINEERINGS +MOUNTAINEERS +MOUNTAINOUS +MOUNTAINOUSLY +MOUNTAINOUSNESS +MOUNTAINS +MOUNTAINSIDE +MOUNTAINSIDES +MOUNTAINTOP +MOUNTAINTOPS +MOUNTAINY +MOUNTEBANK +MOUNTEBANKED +MOUNTEBANKERIES +MOUNTEBANKERY +MOUNTEBANKING +MOUNTEBANKS +MOUNTED +MOUNTER +MOUNTERS +MOUNTING +MOUNTINGS +MOUNTS +MOURN +MOURNED +MOURNER +MOURNERS +MOURNFUL +MOURNFULLER +MOURNFULLEST +MOURNFULLY +MOURNFULNESS +MOURNFULNESSES +MOURNING +MOURNINGLY +MOURNINGS +MOURNS +MOUSAKA +MOUSAKAS +MOUSE +MOUSEBIRD +MOUSEBIRDS +MOUSED +MOUSELIKE +MOUSEPAD +MOUSEPADS +MOUSER +MOUSERS +MOUSES +MOUSETAIL +MOUSETAILS +MOUSETRAP +MOUSETRAPPED +MOUSETRAPPING +MOUSETRAPS +MOUSEY +MOUSIER +MOUSIEST +MOUSILY +MOUSINESS +MOUSINESSES +MOUSING +MOUSINGS +MOUSSAKA +MOUSSAKAS +MOUSSE +MOUSSED +MOUSSELINE +MOUSSELINES +MOUSSES +MOUSSING +MOUSTACHE +MOUSTACHES +MOUSTACHIO +MOUSTACHIOS +MOUSY +MOUTH +MOUTHBREEDER +MOUTHBREEDERS +MOUTHED +MOUTHER +MOUTHERS +MOUTHFEEL +MOUTHFEELS +MOUTHFUL +MOUTHFULS +MOUTHIER +MOUTHIEST +MOUTHILY +MOUTHING +MOUTHLESS +MOUTHLIKE +MOUTHPART +MOUTHPARTS +MOUTHPIECE +MOUTHPIECES +MOUTHS +MOUTHWASH +MOUTHWASHES +MOUTHWATERING +MOUTHWATERINGLY +MOUTHY +MOUTON +MOUTONNEE +MOUTONS +MOVABILITIES +MOVABILITY +MOVABLE +MOVABLENESS +MOVABLENESSES +MOVABLES +MOVABLY +MOVE +MOVEABLE +MOVEABLES +MOVEABLY +MOVED +MOVELESS +MOVELESSLY +MOVELESSNESS +MOVELESSNESSES +MOVEMENT +MOVEMENTS +MOVER +MOVERS +MOVES +MOVIE +MOVIEDOM +MOVIEDOMS +MOVIEGOER +MOVIEGOERS +MOVIEGOING +MOVIEGOINGS +MOVIEMAKER +MOVIEMAKERS +MOVIEMAKING +MOVIEMAKINGS +MOVIEOLA +MOVIEOLAS +MOVIES +MOVING +MOVINGLY +MOVIOLA +MOVIOLAS +MOW +MOWED +MOWER +MOWERS +MOWING +MOWINGS +MOWN +MOWS +MOXA +MOXAS +MOXIE +MOXIES +MOZETTA +MOZETTAS +MOZETTE +MOZO +MOZOS +MOZZARELLA +MOZZARELLAS +MOZZETTA +MOZZETTAS +MOZZETTE +MRIDANGA +MRIDANGAM +MRIDANGAMS +MRIDANGAS +MU +MUCH +MUCHACHO +MUCHACHOS +MUCHES +MUCHLY +MUCHNESS +MUCHNESSES +MUCHO +MUCID +MUCIDITIES +MUCIDITY +MUCILAGE +MUCILAGES +MUCILAGINOUS +MUCILAGINOUSLY +MUCIN +MUCINOGEN +MUCINOGENS +MUCINOID +MUCINOUS +MUCINS +MUCK +MUCKAMUCK +MUCKAMUCKS +MUCKED +MUCKER +MUCKERS +MUCKIER +MUCKIEST +MUCKILY +MUCKING +MUCKLE +MUCKLES +MUCKLUCK +MUCKLUCKS +MUCKRAKE +MUCKRAKED +MUCKRAKER +MUCKRAKERS +MUCKRAKES +MUCKRAKING +MUCKS +MUCKWORM +MUCKWORMS +MUCKY +MUCLUC +MUCLUCS +MUCOCUTANEOUS +MUCOID +MUCOIDAL +MUCOIDS +MUCOLYTIC +MUCOPEPTIDE +MUCOPEPTIDES +MUCOPROTEIN +MUCOPROTEINS +MUCOR +MUCORS +MUCOSA +MUCOSAE +MUCOSAL +MUCOSAS +MUCOSE +MUCOSITIES +MUCOSITY +MUCOUS +MUCRO +MUCRONATE +MUCRONES +MUCUS +MUCUSES +MUD +MUDBUG +MUDBUGS +MUDCAP +MUDCAPPED +MUDCAPPING +MUDCAPS +MUDCAT +MUDCATS +MUDDED +MUDDER +MUDDERS +MUDDIED +MUDDIER +MUDDIES +MUDDIEST +MUDDILY +MUDDINESS +MUDDINESSES +MUDDING +MUDDLE +MUDDLED +MUDDLEHEADED +MUDDLEHEADEDLY +MUDDLER +MUDDLERS +MUDDLES +MUDDLING +MUDDLY +MUDDY +MUDDYING +MUDFISH +MUDFISHES +MUDFLAP +MUDFLAPS +MUDFLAT +MUDFLATS +MUDFLOW +MUDFLOWS +MUDGUARD +MUDGUARDS +MUDHEN +MUDHENS +MUDHOLE +MUDHOLES +MUDLARK +MUDLARKS +MUDPACK +MUDPACKS +MUDPUPPIES +MUDPUPPY +MUDRA +MUDRAS +MUDROCK +MUDROCKS +MUDROOM +MUDROOMS +MUDS +MUDSILL +MUDSILLS +MUDSKIPPER +MUDSKIPPERS +MUDSLIDE +MUDSLIDES +MUDSLINGER +MUDSLINGERS +MUDSLINGING +MUDSLINGINGS +MUDSTONE +MUDSTONES +MUEDDIN +MUEDDINS +MUENSTER +MUENSTERS +MUESLI +MUESLIS +MUEZZIN +MUEZZINS +MUFF +MUFFED +MUFFIN +MUFFINEER +MUFFINEERS +MUFFING +MUFFINS +MUFFLE +MUFFLED +MUFFLER +MUFFLERED +MUFFLERS +MUFFLES +MUFFLING +MUFFS +MUFTI +MUFTIS +MUG +MUGFUL +MUGFULS +MUGG +MUGGAR +MUGGARS +MUGGED +MUGGEE +MUGGEES +MUGGER +MUGGERS +MUGGIER +MUGGIEST +MUGGILY +MUGGINESS +MUGGINESSES +MUGGING +MUGGINGS +MUGGINS +MUGGS +MUGGUR +MUGGURS +MUGGY +MUGHAL +MUGHALS +MUGS +MUGWORT +MUGWORTS +MUGWUMP +MUGWUMPS +MUHLIES +MUHLY +MUJAHEDEEN +MUJAHEDIN +MUJAHIDEEN +MUJAHIDIN +MUJIK +MUJIKS +MUKLUK +MUKLUKS +MUKTUK +MUKTUKS +MULATTO +MULATTOES +MULATTOS +MULBERRIES +MULBERRY +MULCH +MULCHED +MULCHES +MULCHING +MULCT +MULCTED +MULCTING +MULCTS +MULE +MULED +MULES +MULETA +MULETAS +MULETEER +MULETEERS +MULEY +MULEYS +MULIEBRITIES +MULIEBRITY +MULING +MULISH +MULISHLY +MULISHNESS +MULISHNESSES +MULL +MULLA +MULLAH +MULLAHISM +MULLAHISMS +MULLAHS +MULLAS +MULLED +MULLEIN +MULLEINS +MULLEN +MULLENS +MULLER +MULLERS +MULLET +MULLETS +MULLEY +MULLEYS +MULLIGAN +MULLIGANS +MULLIGATAWNIES +MULLIGATAWNY +MULLING +MULLION +MULLIONED +MULLIONING +MULLIONS +MULLITE +MULLITES +MULLOCK +MULLOCKS +MULLOCKY +MULLS +MULTIAGE +MULTIAGENCY +MULTIARMED +MULTIATOM +MULTIAUTHOR +MULTIAXIAL +MULTIBAND +MULTIBANK +MULTIBARREL +MULTIBARRELED +MULTIBILLION +MULTIBLADED +MULTIBRANCHED +MULTIBUILDING +MULTICAMPUS +MULTICAR +MULTICARBON +MULTICAUSAL +MULTICELL +MULTICELLED +MULTICELLULAR +MULTICENTER +MULTICHAIN +MULTICHAMBERED +MULTICHANNEL +MULTICHARACTER +MULTICITY +MULTICLIENT +MULTICOATED +MULTICOLOR +MULTICOLORED +MULTICOLORS +MULTICOLUMN +MULTICOMPONENT +MULTICONDUCTOR +MULTICOPY +MULTICOUNTY +MULTICOURSE +MULTICULTURAL +MULTICURIE +MULTICURRENCIES +MULTICURRENCY +MULTIDAY +MULTIDIALECTAL +MULTIDISC +MULTIDISCIPLINE +MULTIDIVISIONAL +MULTIDOMAIN +MULTIDRUG +MULTIELECTRODE +MULTIELEMENT +MULTIEMPLOYER +MULTIEMPLOYERS +MULTIENGINE +MULTIENZYME +MULTIETHNIC +MULTIETHNICS +MULTIFACETED +MULTIFACTOR +MULTIFACTORIAL +MULTIFAMILY +MULTIFARIOUS +MULTIFID +MULTIFILAMENT +MULTIFLASH +MULTIFOCAL +MULTIFOIL +MULTIFOILS +MULTIFOLD +MULTIFORM +MULTIFORMITIES +MULTIFORMITY +MULTIFREQUENCY +MULTIFUNCTION +MULTIFUNCTIONAL +MULTIGENIC +MULTIGERM +MULTIGRADE +MULTIGRAIN +MULTIGRID +MULTIGROUP +MULTIHEADED +MULTIHOSPITAL +MULTIHUED +MULTIHULL +MULTIHULLS +MULTIJET +MULTILANE +MULTILANES +MULTILATERAL +MULTILATERALISM +MULTILATERALIST +MULTILATERALLY +MULTILAYER +MULTILAYERED +MULTILEVEL +MULTILEVELED +MULTILINE +MULTILINGUAL +MULTILINGUALISM +MULTILINGUALLY +MULTILOBE +MULTILOBED +MULTILOBES +MULTIMANNED +MULTIMEDIA +MULTIMEDIAS +MULTIMEGATON +MULTIMEGAWATT +MULTIMEGAWATTS +MULTIMEMBER +MULTIMETALLIC +MULTIMILLENNIAL +MULTIMILLION +MULTIMODAL +MULTIMODE +MULTIMOLECULAR +MULTINATION +MULTINATIONAL +MULTINATIONALS +MULTINOMIAL +MULTINOMIALS +MULTINUCLEAR +MULTINUCLEATE +MULTINUCLEATED +MULTIORGASMIC +MULTIPACK +MULTIPACKS +MULTIPAGE +MULTIPANED +MULTIPARA +MULTIPARAE +MULTIPARAMETER +MULTIPARAS +MULTIPAROUS +MULTIPART +MULTIPARTICLE +MULTIPARTITE +MULTIPARTY +MULTIPATH +MULTIPED +MULTIPEDE +MULTIPEDES +MULTIPEDS +MULTIPHASE +MULTIPHASIC +MULTIPHOTON +MULTIPICTURE +MULTIPIECE +MULTIPION +MULTIPISTON +MULTIPLANT +MULTIPLAYER +MULTIPLE +MULTIPLES +MULTIPLET +MULTIPLETS +MULTIPLEX +MULTIPLEXED +MULTIPLEXER +MULTIPLEXERS +MULTIPLEXES +MULTIPLEXING +MULTIPLEXOR +MULTIPLEXORS +MULTIPLICAND +MULTIPLICANDS +MULTIPLICATION +MULTIPLICATIONS +MULTIPLICATIVE +MULTIPLICITIES +MULTIPLICITY +MULTIPLIED +MULTIPLIER +MULTIPLIERS +MULTIPLIES +MULTIPLY +MULTIPLYING +MULTIPOLAR +MULTIPOLARITIES +MULTIPOLARITY +MULTIPOLE +MULTIPOLES +MULTIPORT +MULTIPOTENTIAL +MULTIPOWER +MULTIPROBLEM +MULTIPROCESSING +MULTIPROCESSOR +MULTIPROCESSORS +MULTIPRODUCT +MULTIPRONGED +MULTIPURPOSE +MULTIRACIAL +MULTIRACIALISM +MULTIRACIALISMS +MULTIRANGE +MULTIREGIONAL +MULTIRELIGIOUS +MULTIROOM +MULTISCREEN +MULTISENSE +MULTISENSORY +MULTISERVICE +MULTISIDED +MULTISITE +MULTISIZE +MULTISKILLED +MULTISOURCE +MULTISPECIES +MULTISPECTRAL +MULTISPEED +MULTISPORT +MULTISTAGE +MULTISTATE +MULTISTEMMED +MULTISTEP +MULTISTORIED +MULTISTORY +MULTISTRANDED +MULTISYLLABIC +MULTISYSTEM +MULTITALENTED +MULTITASK +MULTITASKED +MULTITASKING +MULTITASKINGS +MULTITASKS +MULTITERMINAL +MULTITIERED +MULTITON +MULTITONE +MULTITONES +MULTITOWERED +MULTITRACK +MULTITRILLION +MULTITUDE +MULTITUDES +MULTITUDINOUS +MULTITUDINOUSLY +MULTIUNION +MULTIUNIT +MULTIUSE +MULTIUSER +MULTIVALENCE +MULTIVALENCES +MULTIVALENT +MULTIVALENTS +MULTIVARIABLE +MULTIVARIATE +MULTIVERSITIES +MULTIVERSITY +MULTIVITAMIN +MULTIVITAMINS +MULTIVOLTINE +MULTIVOLUME +MULTIWALL +MULTIWARHEAD +MULTIWAVELENGTH +MULTIYEAR +MULTURE +MULTURES +MUM +MUMBLE +MUMBLED +MUMBLER +MUMBLERS +MUMBLES +MUMBLING +MUMBLY +MUMM +MUMMED +MUMMER +MUMMERIES +MUMMERS +MUMMERY +MUMMICHOG +MUMMICHOGS +MUMMIED +MUMMIES +MUMMIFICATION +MUMMIFICATIONS +MUMMIFIED +MUMMIFIES +MUMMIFY +MUMMIFYING +MUMMING +MUMMS +MUMMY +MUMMYING +MUMP +MUMPED +MUMPER +MUMPERS +MUMPING +MUMPS +MUMS +MUMU +MUMUS +MUN +MUNCH +MUNCHABLE +MUNCHABLES +MUNCHED +MUNCHER +MUNCHERS +MUNCHES +MUNCHIES +MUNCHING +MUNCHKIN +MUNCHKINS +MUNDANE +MUNDANELY +MUNDANENESS +MUNDANENESSES +MUNDANITIES +MUNDANITY +MUNDUNGO +MUNDUNGOS +MUNDUNGUS +MUNDUNGUSES +MUNGO +MUNGOES +MUNGOOSE +MUNGOOSES +MUNGOS +MUNI +MUNICIPAL +MUNICIPALITIES +MUNICIPALITY +MUNICIPALIZE +MUNICIPALIZED +MUNICIPALIZES +MUNICIPALIZING +MUNICIPALLY +MUNICIPALS +MUNIFICENCE +MUNIFICENCES +MUNIFICENT +MUNIFICENTLY +MUNIMENT +MUNIMENTS +MUNIS +MUNITION +MUNITIONED +MUNITIONING +MUNITIONS +MUNNION +MUNNIONS +MUNS +MUNSTER +MUNSTERS +MUNTIN +MUNTING +MUNTINGS +MUNTINS +MUNTJAC +MUNTJACS +MUNTJAK +MUNTJAKS +MUON +MUONIC +MUONIUM +MUONIUMS +MUONS +MURA +MURAENID +MURAENIDS +MURAL +MURALED +MURALIST +MURALISTS +MURALLED +MURALS +MURAS +MURDER +MURDERED +MURDEREE +MURDEREES +MURDERER +MURDERERS +MURDERESS +MURDERESSES +MURDERING +MURDEROUS +MURDEROUSLY +MURDEROUSNESS +MURDEROUSNESSES +MURDERS +MURE +MURED +MUREIN +MUREINS +MURES +MUREX +MUREXES +MURIATE +MURIATED +MURIATES +MURICATE +MURICATED +MURICES +MURID +MURIDS +MURINE +MURINES +MURING +MURK +MURKER +MURKEST +MURKIER +MURKIEST +MURKILY +MURKINESS +MURKINESSES +MURKLY +MURKS +MURKY +MURMUR +MURMURED +MURMURER +MURMURERS +MURMURING +MURMUROUS +MURMUROUSLY +MURMURS +MURPHIES +MURPHY +MURR +MURRA +MURRAIN +MURRAINS +MURRAS +MURRE +MURRELET +MURRELETS +MURRES +MURREY +MURREYS +MURRHA +MURRHAS +MURRHINE +MURRIES +MURRINE +MURRS +MURRY +MURTHER +MURTHERED +MURTHERING +MURTHERS +MUS +MUSCA +MUSCADEL +MUSCADELS +MUSCADET +MUSCADETS +MUSCADINE +MUSCADINES +MUSCAE +MUSCARINE +MUSCARINES +MUSCARINIC +MUSCAT +MUSCATEL +MUSCATELS +MUSCATS +MUSCID +MUSCIDS +MUSCLE +MUSCLED +MUSCLEMAN +MUSCLEMEN +MUSCLES +MUSCLING +MUSCLY +MUSCOVADO +MUSCOVADOS +MUSCOVITE +MUSCOVITES +MUSCULAR +MUSCULARITIES +MUSCULARITY +MUSCULARLY +MUSCULATURE +MUSCULATURES +MUSCULOSKELETAL +MUSE +MUSED +MUSEFUL +MUSEOLOGICAL +MUSEOLOGIES +MUSEOLOGIST +MUSEOLOGISTS +MUSEOLOGY +MUSER +MUSERS +MUSES +MUSETTE +MUSETTES +MUSEUM +MUSEUMS +MUSH +MUSHED +MUSHER +MUSHERS +MUSHES +MUSHIER +MUSHIEST +MUSHILY +MUSHINESS +MUSHINESSES +MUSHING +MUSHROOM +MUSHROOMED +MUSHROOMING +MUSHROOMS +MUSHY +MUSIC +MUSICAL +MUSICALE +MUSICALES +MUSICALISE +MUSICALISED +MUSICALISES +MUSICALISING +MUSICALITIES +MUSICALITY +MUSICALIZATION +MUSICALIZATIONS +MUSICALIZE +MUSICALIZED +MUSICALIZES +MUSICALIZING +MUSICALLY +MUSICALS +MUSICIAN +MUSICIANLY +MUSICIANS +MUSICIANSHIP +MUSICIANSHIPS +MUSICK +MUSICKED +MUSICKING +MUSICKS +MUSICLESS +MUSICOLOGICAL +MUSICOLOGIES +MUSICOLOGIST +MUSICOLOGISTS +MUSICOLOGY +MUSICS +MUSING +MUSINGLY +MUSINGS +MUSJID +MUSJIDS +MUSK +MUSKEG +MUSKEGS +MUSKELLUNGE +MUSKET +MUSKETEER +MUSKETEERS +MUSKETRIES +MUSKETRY +MUSKETS +MUSKIE +MUSKIER +MUSKIES +MUSKIEST +MUSKILY +MUSKINESS +MUSKINESSES +MUSKIT +MUSKITS +MUSKMELON +MUSKMELONS +MUSKOX +MUSKOXEN +MUSKRAT +MUSKRATS +MUSKROOT +MUSKROOTS +MUSKS +MUSKY +MUSLIN +MUSLINS +MUSPIKE +MUSPIKES +MUSQUASH +MUSQUASHES +MUSS +MUSSED +MUSSEL +MUSSELS +MUSSES +MUSSIER +MUSSIEST +MUSSILY +MUSSINESS +MUSSINESSES +MUSSING +MUSSY +MUST +MUSTACHE +MUSTACHED +MUSTACHES +MUSTACHIO +MUSTACHIOED +MUSTACHIOS +MUSTANG +MUSTANGS +MUSTARD +MUSTARDS +MUSTARDY +MUSTED +MUSTEE +MUSTEES +MUSTELID +MUSTELIDS +MUSTELINE +MUSTER +MUSTERED +MUSTERING +MUSTERS +MUSTH +MUSTHS +MUSTIER +MUSTIEST +MUSTILY +MUSTINESS +MUSTINESSES +MUSTING +MUSTS +MUSTY +MUT +MUTABILITIES +MUTABILITY +MUTABLE +MUTABLY +MUTAGEN +MUTAGENESES +MUTAGENESIS +MUTAGENIC +MUTAGENICALLY +MUTAGENICITIES +MUTAGENICITY +MUTAGENS +MUTANT +MUTANTS +MUTASE +MUTASES +MUTATE +MUTATED +MUTATES +MUTATING +MUTATION +MUTATIONAL +MUTATIONALLY +MUTATIONS +MUTATIVE +MUTCH +MUTCHES +MUTCHKIN +MUTCHKINS +MUTE +MUTED +MUTEDLY +MUTELY +MUTENESS +MUTENESSES +MUTER +MUTES +MUTEST +MUTICOUS +MUTILATE +MUTILATED +MUTILATES +MUTILATING +MUTILATION +MUTILATIONS +MUTILATOR +MUTILATORS +MUTINE +MUTINED +MUTINEER +MUTINEERED +MUTINEERING +MUTINEERS +MUTINES +MUTING +MUTINIED +MUTINIES +MUTINING +MUTINOUS +MUTINOUSLY +MUTINOUSNESS +MUTINOUSNESSES +MUTINY +MUTINYING +MUTISM +MUTISMS +MUTON +MUTONS +MUTS +MUTT +MUTTER +MUTTERED +MUTTERER +MUTTERERS +MUTTERING +MUTTERS +MUTTON +MUTTONCHOPS +MUTTONFISH +MUTTONFISHES +MUTTONS +MUTTONY +MUTTS +MUTUAL +MUTUALISM +MUTUALISMS +MUTUALIST +MUTUALISTIC +MUTUALISTS +MUTUALITIES +MUTUALITY +MUTUALIZATION +MUTUALIZATIONS +MUTUALIZE +MUTUALIZED +MUTUALIZES +MUTUALIZING +MUTUALLY +MUTUALS +MUTUEL +MUTUELS +MUTULAR +MUTULE +MUTULES +MUUMUU +MUUMUUS +MUZHIK +MUZHIKS +MUZJIK +MUZJIKS +MUZZIER +MUZZIEST +MUZZILY +MUZZINESS +MUZZINESSES +MUZZLE +MUZZLED +MUZZLER +MUZZLERS +MUZZLES +MUZZLING +MUZZY +MY +MYALGIA +MYALGIAS +MYALGIC +MYASES +MYASIS +MYASTHENIA +MYASTHENIAS +MYASTHENIC +MYASTHENICS +MYC +MYCELE +MYCELES +MYCELIA +MYCELIAL +MYCELIAN +MYCELIUM +MYCELOID +MYCETOMA +MYCETOMAS +MYCETOMATA +MYCETOMATOUS +MYCETOPHAGOUS +MYCETOZOAN +MYCETOZOANS +MYCOBACTERIA +MYCOBACTERIAL +MYCOBACTERIUM +MYCOFLORA +MYCOFLORAE +MYCOFLORAS +MYCOLOGIC +MYCOLOGICAL +MYCOLOGICALLY +MYCOLOGIES +MYCOLOGIST +MYCOLOGISTS +MYCOLOGY +MYCOPHAGIES +MYCOPHAGIST +MYCOPHAGISTS +MYCOPHAGOUS +MYCOPHAGY +MYCOPHILE +MYCOPHILES +MYCOPLASMA +MYCOPLASMAL +MYCOPLASMAS +MYCOPLASMATA +MYCORHIZA +MYCORHIZAE +MYCORHIZAS +MYCORRHIZA +MYCORRHIZAE +MYCORRHIZAL +MYCORRHIZAS +MYCOSES +MYCOSIS +MYCOTIC +MYCOTOXIN +MYCOTOXINS +MYCOVIRUS +MYCOVIRUSES +MYCS +MYDRIASES +MYDRIASIS +MYDRIATIC +MYDRIATICS +MYELENCEPHALA +MYELENCEPHALIC +MYELENCEPHALON +MYELIN +MYELINATED +MYELINE +MYELINES +MYELINIC +MYELINS +MYELITIDES +MYELITIS +MYELOBLAST +MYELOBLASTIC +MYELOBLASTS +MYELOCYTE +MYELOCYTES +MYELOCYTIC +MYELOFIBROSES +MYELOFIBROSIS +MYELOFIBROTIC +MYELOGENOUS +MYELOGRAM +MYELOGRAMS +MYELOID +MYELOMA +MYELOMAS +MYELOMATA +MYELOMATOUS +MYELOPATHIC +MYELOPATHIES +MYELOPATHY +MYIASES +MYIASIS +MYLAR +MYLARS +MYLONITE +MYLONITES +MYNA +MYNAH +MYNAHS +MYNAS +MYNHEER +MYNHEERS +MYOBLAST +MYOBLASTS +MYOCARDIA +MYOCARDIAL +MYOCARDITIS +MYOCARDITISES +MYOCARDIUM +MYOCLONIC +MYOCLONUS +MYOCLONUSES +MYOELECTRIC +MYOELECTRICAL +MYOFIBRIL +MYOFIBRILLAR +MYOFIBRILS +MYOFILAMENT +MYOFILAMENTS +MYOGENIC +MYOGLOBIN +MYOGLOBINS +MYOGRAPH +MYOGRAPHS +MYOID +MYOINOSITOL +MYOINOSITOLS +MYOLOGIC +MYOLOGIES +MYOLOGIST +MYOLOGISTS +MYOLOGY +MYOMA +MYOMAS +MYOMATA +MYOMATOUS +MYONEURAL +MYOPATHIC +MYOPATHIES +MYOPATHY +MYOPE +MYOPES +MYOPIA +MYOPIAS +MYOPIC +MYOPICALLY +MYOPIES +MYOPY +MYOSCOPE +MYOSCOPES +MYOSES +MYOSIN +MYOSINS +MYOSIS +MYOSITIS +MYOSITISES +MYOSOTE +MYOSOTES +MYOSOTIS +MYOSOTISES +MYOTIC +MYOTICS +MYOTOME +MYOTOMES +MYOTONIA +MYOTONIAS +MYOTONIC +MYRIAD +MYRIADS +MYRIAPOD +MYRIAPODS +MYRICA +MYRICAS +MYRIOPOD +MYRIOPODS +MYRMECOLOGICAL +MYRMECOLOGIES +MYRMECOLOGIST +MYRMECOLOGISTS +MYRMECOLOGY +MYRMECOPHILE +MYRMECOPHILES +MYRMECOPHILOUS +MYRMIDON +MYRMIDONES +MYRMIDONS +MYROBALAN +MYROBALANS +MYRRH +MYRRHIC +MYRRHS +MYRTLE +MYRTLES +MYSELF +MYSID +MYSIDS +MYSOST +MYSOSTS +MYSTAGOG +MYSTAGOGIES +MYSTAGOGS +MYSTAGOGUE +MYSTAGOGUES +MYSTAGOGY +MYSTERIES +MYSTERIOUS +MYSTERIOUSLY +MYSTERIOUSNESS +MYSTERY +MYSTIC +MYSTICAL +MYSTICALLY +MYSTICETE +MYSTICETES +MYSTICISM +MYSTICISMS +MYSTICLY +MYSTICS +MYSTIFICATION +MYSTIFICATIONS +MYSTIFIED +MYSTIFIER +MYSTIFIERS +MYSTIFIES +MYSTIFY +MYSTIFYING +MYSTIFYINGLY +MYSTIQUE +MYSTIQUES +MYTH +MYTHIC +MYTHICAL +MYTHICALLY +MYTHICIZE +MYTHICIZED +MYTHICIZER +MYTHICIZERS +MYTHICIZES +MYTHICIZING +MYTHIER +MYTHIEST +MYTHMAKER +MYTHMAKERS +MYTHMAKING +MYTHMAKINGS +MYTHOGRAPHER +MYTHOGRAPHERS +MYTHOGRAPHIES +MYTHOGRAPHY +MYTHOI +MYTHOLOGER +MYTHOLOGERS +MYTHOLOGIC +MYTHOLOGICAL +MYTHOLOGICALLY +MYTHOLOGIES +MYTHOLOGIST +MYTHOLOGISTS +MYTHOLOGIZE +MYTHOLOGIZED +MYTHOLOGIZER +MYTHOLOGIZERS +MYTHOLOGIZES +MYTHOLOGIZING +MYTHOLOGY +MYTHOMANIA +MYTHOMANIAC +MYTHOMANIACS +MYTHOMANIAS +MYTHOPEIC +MYTHOPOEIA +MYTHOPOEIAS +MYTHOPOEIC +MYTHOPOETIC +MYTHOPOETICAL +MYTHOS +MYTHS +MYTHY +MYXAMEBA +MYXAMEBAE +MYXAMEBAS +MYXAMOEBA +MYXAMOEBAE +MYXAMOEBAS +MYXEDEMA +MYXEDEMAS +MYXEDEMATOUS +MYXEDEMIC +MYXOCYTE +MYXOCYTES +MYXOEDEMA +MYXOEDEMAS +MYXOID +MYXOMA +MYXOMAS +MYXOMATA +MYXOMATOSES +MYXOMATOSIS +MYXOMATOUS +MYXOMYCETE +MYXOMYCETES +MYXOVIRAL +MYXOVIRUS +MYXOVIRUSES +NA +NAAN +NAANS +NAB +NABBED +NABBER +NABBERS +NABBING +NABE +NABES +NABIS +NABOB +NABOBERIES +NABOBERY +NABOBESS +NABOBESSES +NABOBISH +NABOBISM +NABOBISMS +NABOBS +NABS +NACELLE +NACELLES +NACHAS +NACHES +NACHO +NACHOS +NACRE +NACRED +NACREOUS +NACRES +NADA +NADAS +NADIR +NADIRAL +NADIRS +NAE +NAETHING +NAETHINGS +NAEVI +NAEVOID +NAEVUS +NAFF +NAFFED +NAFFING +NAFFS +NAG +NAGANA +NAGANAS +NAGGED +NAGGER +NAGGERS +NAGGIER +NAGGIEST +NAGGING +NAGGINGLY +NAGGY +NAGS +NAH +NAIAD +NAIADES +NAIADS +NAIF +NAIFS +NAIL +NAILBITER +NAILBITERS +NAILBRUSH +NAILBRUSHES +NAILED +NAILER +NAILERS +NAILFOLD +NAILFOLDS +NAILHEAD +NAILHEADS +NAILING +NAILS +NAILSET +NAILSETS +NAINSOOK +NAINSOOKS +NAIRA +NAIRAS +NAIRU +NAIRUS +NAISSANCE +NAISSANCES +NAIVE +NAIVELY +NAIVENESS +NAIVENESSES +NAIVER +NAIVES +NAIVEST +NAIVETE +NAIVETES +NAIVETIES +NAIVETY +NAKED +NAKEDER +NAKEDEST +NAKEDLY +NAKEDNESS +NAKEDNESSES +NAKFA +NAKFAS +NALA +NALAS +NALED +NALEDS +NALORPHINE +NALORPHINES +NALOXONE +NALOXONES +NALTREXONE +NALTREXONES +NAM +NAMABLE +NAMAYCUSH +NAMAYCUSHES +NAME +NAMEABLE +NAMED +NAMELESS +NAMELESSLY +NAMELESSNESS +NAMELESSNESSES +NAMELY +NAMEPLATE +NAMEPLATES +NAMER +NAMERS +NAMES +NAMESAKE +NAMESAKES +NAMETAG +NAMETAGS +NAMING +NAN +NANA +NANAS +NANCE +NANCES +NANCIES +NANCIFIED +NANCY +NANDIN +NANDINA +NANDINAS +NANDINS +NANISM +NANISMS +NANKEEN +NANKEENS +NANKIN +NANKINS +NANNIE +NANNIES +NANNOPLANKTON +NANNOPLANKTONS +NANNY +NANNYISH +NANOGRAM +NANOGRAMS +NANOMETER +NANOMETERS +NANOMETRE +NANOMETRES +NANOSCALE +NANOSECOND +NANOSECONDS +NANOTECH +NANOTECHNOLOGY +NANOTECHS +NANOTESLA +NANOTESLAS +NANOTUBE +NANOTUBES +NANOWATT +NANOWATTS +NANS +NAOI +NAOS +NAP +NAPA +NAPALM +NAPALMED +NAPALMING +NAPALMS +NAPAS +NAPE +NAPERIES +NAPERY +NAPES +NAPHTHA +NAPHTHALENE +NAPHTHALENES +NAPHTHAS +NAPHTHENE +NAPHTHENES +NAPHTHENIC +NAPHTHOL +NAPHTHOLS +NAPHTHOUS +NAPHTHYL +NAPHTHYLAMINE +NAPHTHYLAMINES +NAPHTHYLS +NAPHTOL +NAPHTOLS +NAPIFORM +NAPKIN +NAPKINS +NAPLESS +NAPOLEON +NAPOLEONS +NAPPA +NAPPAS +NAPPE +NAPPED +NAPPER +NAPPERS +NAPPES +NAPPIE +NAPPIER +NAPPIES +NAPPIEST +NAPPINESS +NAPPINESSES +NAPPING +NAPPY +NAPRAPATHIES +NAPRAPATHY +NAPROXEN +NAPROXENS +NAPS +NARC +NARCEIN +NARCEINE +NARCEINES +NARCEINS +NARCISM +NARCISMS +NARCISSI +NARCISSISM +NARCISSISMS +NARCISSIST +NARCISSISTIC +NARCISSISTS +NARCISSUS +NARCISSUSES +NARCIST +NARCISTIC +NARCISTS +NARCO +NARCOLEPSIES +NARCOLEPSY +NARCOLEPTIC +NARCOLEPTICS +NARCOMA +NARCOMAS +NARCOMATA +NARCOS +NARCOSE +NARCOSES +NARCOSIS +NARCOTIC +NARCOTICALLY +NARCOTICS +NARCOTISM +NARCOTISMS +NARCOTIZE +NARCOTIZED +NARCOTIZES +NARCOTIZING +NARCS +NARD +NARDINE +NARDS +NARES +NARGHILE +NARGHILES +NARGILE +NARGILEH +NARGILEHS +NARGILES +NARIAL +NARIC +NARINE +NARIS +NARK +NARKED +NARKING +NARKS +NARKY +NARRATE +NARRATED +NARRATER +NARRATERS +NARRATES +NARRATING +NARRATION +NARRATIONAL +NARRATIONS +NARRATIVE +NARRATIVELY +NARRATIVES +NARRATOLOGICAL +NARRATOLOGIES +NARRATOLOGIST +NARRATOLOGISTS +NARRATOLOGY +NARRATOR +NARRATORS +NARROW +NARROWBAND +NARROWCASTING +NARROWCASTINGS +NARROWED +NARROWER +NARROWEST +NARROWING +NARROWISH +NARROWLY +NARROWNESS +NARROWNESSES +NARROWS +NARTHEX +NARTHEXES +NARWAL +NARWALS +NARWHAL +NARWHALE +NARWHALES +NARWHALS +NARY +NASAL +NASALISE +NASALISED +NASALISES +NASALISING +NASALISM +NASALISMS +NASALITIES +NASALITY +NASALIZATION +NASALIZATIONS +NASALIZE +NASALIZED +NASALIZES +NASALIZING +NASALLY +NASALS +NASCENCE +NASCENCES +NASCENCIES +NASCENCY +NASCENT +NASEBERRIES +NASEBERRY +NASIAL +NASION +NASIONS +NASOGASTRIC +NASOPHARYNGEAL +NASOPHARYNGES +NASOPHARYNX +NASOPHARYNXES +NASTIC +NASTIER +NASTIES +NASTIEST +NASTILY +NASTINESS +NASTINESSES +NASTURTIUM +NASTURTIUMS +NASTY +NATAL +NATALITIES +NATALITY +NATANT +NATANTLY +NATATION +NATATIONS +NATATORIA +NATATORIAL +NATATORIUM +NATATORIUMS +NATATORY +NATCH +NATES +NATHELESS +NATHLESS +NATION +NATIONAL +NATIONALISE +NATIONALISED +NATIONALISES +NATIONALISING +NATIONALISM +NATIONALISMS +NATIONALIST +NATIONALISTIC +NATIONALISTS +NATIONALITIES +NATIONALITY +NATIONALIZATION +NATIONALIZE +NATIONALIZED +NATIONALIZER +NATIONALIZERS +NATIONALIZES +NATIONALIZING +NATIONALLY +NATIONALS +NATIONHOOD +NATIONHOODS +NATIONS +NATIONWIDE +NATIVE +NATIVELY +NATIVENESS +NATIVENESSES +NATIVES +NATIVISM +NATIVISMS +NATIVIST +NATIVISTIC +NATIVISTS +NATIVITIES +NATIVITY +NATRIUM +NATRIUMS +NATRIURESES +NATRIURESIS +NATRIURETIC +NATRIURETICS +NATROLITE +NATROLITES +NATRON +NATRONS +NATTER +NATTERED +NATTERING +NATTERS +NATTIER +NATTIEST +NATTILY +NATTINESS +NATTINESSES +NATTY +NATURAL +NATURALISE +NATURALISED +NATURALISES +NATURALISING +NATURALISM +NATURALISMS +NATURALIST +NATURALISTIC +NATURALISTS +NATURALIZATION +NATURALIZATIONS +NATURALIZE +NATURALIZED +NATURALIZES +NATURALIZING +NATURALLY +NATURALNESS +NATURALNESSES +NATURALS +NATURE +NATURED +NATURES +NATURISM +NATURISMS +NATURIST +NATURISTS +NATUROPATH +NATUROPATHIC +NATUROPATHIES +NATUROPATHS +NATUROPATHY +NAUGAHYDE +NAUGAHYDES +NAUGHT +NAUGHTIER +NAUGHTIES +NAUGHTIEST +NAUGHTILY +NAUGHTINESS +NAUGHTINESSES +NAUGHTS +NAUGHTY +NAUMACHIA +NAUMACHIAE +NAUMACHIAS +NAUMACHIES +NAUMACHY +NAUPLIAL +NAUPLII +NAUPLIUS +NAUSEA +NAUSEANT +NAUSEANTS +NAUSEAS +NAUSEATE +NAUSEATED +NAUSEATES +NAUSEATING +NAUSEATINGLY +NAUSEOUS +NAUSEOUSLY +NAUSEOUSNESS +NAUSEOUSNESSES +NAUTCH +NAUTCHES +NAUTICAL +NAUTICALLY +NAUTILI +NAUTILOID +NAUTILOIDS +NAUTILUS +NAUTILUSES +NAVAID +NAVAIDS +NAVAL +NAVALLY +NAVAR +NAVARS +NAVE +NAVEL +NAVELS +NAVELWORT +NAVELWORTS +NAVES +NAVETTE +NAVETTES +NAVICERT +NAVICERTS +NAVICULAR +NAVICULARS +NAVIES +NAVIGABILITIES +NAVIGABILITY +NAVIGABLE +NAVIGABLY +NAVIGATE +NAVIGATED +NAVIGATES +NAVIGATING +NAVIGATION +NAVIGATIONAL +NAVIGATIONALLY +NAVIGATIONS +NAVIGATOR +NAVIGATORS +NAVVIES +NAVVY +NAVY +NAW +NAWAB +NAWABS +NAY +NAYS +NAYSAID +NAYSAY +NAYSAYER +NAYSAYERS +NAYSAYING +NAYSAYINGS +NAYSAYS +NAZI +NAZIFICATION +NAZIFICATIONS +NAZIFIED +NAZIFIES +NAZIFY +NAZIFYING +NAZIS +NE +NEAP +NEAPS +NEAR +NEARBY +NEARED +NEARER +NEAREST +NEARING +NEARLIER +NEARLIEST +NEARLY +NEARNESS +NEARNESSES +NEARS +NEARSHORE +NEARSIDE +NEARSIDES +NEARSIGHTED +NEARSIGHTEDLY +NEARSIGHTEDNESS +NEAT +NEATEN +NEATENED +NEATENING +NEATENS +NEATER +NEATEST +NEATH +NEATHERD +NEATHERDS +NEATLY +NEATNESS +NEATNESSES +NEATNIK +NEATNIKS +NEATS +NEB +NEBBISH +NEBBISHES +NEBBISHY +NEBENKERN +NEBENKERNS +NEBS +NEBULA +NEBULAE +NEBULAR +NEBULAS +NEBULE +NEBULISE +NEBULISED +NEBULISES +NEBULISING +NEBULIZATION +NEBULIZATIONS +NEBULIZE +NEBULIZED +NEBULIZER +NEBULIZERS +NEBULIZES +NEBULIZING +NEBULOSE +NEBULOSITIES +NEBULOSITY +NEBULOUS +NEBULOUSLY +NEBULOUSNESS +NEBULOUSNESSES +NEBULY +NECESSARIES +NECESSARILY +NECESSARY +NECESSITARIAN +NECESSITARIANS +NECESSITATE +NECESSITATED +NECESSITATES +NECESSITATING +NECESSITATION +NECESSITATIONS +NECESSITIES +NECESSITOUS +NECESSITOUSLY +NECESSITOUSNESS +NECESSITY +NECK +NECKBAND +NECKBANDS +NECKCLOTH +NECKCLOTHS +NECKED +NECKER +NECKERCHIEF +NECKERCHIEFS +NECKERCHIEVES +NECKERS +NECKING +NECKINGS +NECKLACE +NECKLACED +NECKLACES +NECKLACING +NECKLESS +NECKLIKE +NECKLINE +NECKLINES +NECKPIECE +NECKPIECES +NECKS +NECKTIE +NECKTIES +NECKWEAR +NECROLOGICAL +NECROLOGIES +NECROLOGIST +NECROLOGISTS +NECROLOGY +NECROMANCER +NECROMANCERS +NECROMANCIES +NECROMANCY +NECROMANTIC +NECROMANTICALLY +NECROPHAGOUS +NECROPHILIA +NECROPHILIAC +NECROPHILIACS +NECROPHILIAS +NECROPHILIC +NECROPHILISM +NECROPHILISMS +NECROPOLEIS +NECROPOLES +NECROPOLI +NECROPOLIS +NECROPOLISES +NECROPSIED +NECROPSIES +NECROPSY +NECROPSYING +NECROSE +NECROSED +NECROSES +NECROSING +NECROSIS +NECROTIC +NECROTIZE +NECROTIZED +NECROTIZES +NECROTIZING +NECROTOMIES +NECROTOMY +NECTAR +NECTAREAN +NECTARIAL +NECTARIED +NECTARIES +NECTARINE +NECTARINES +NECTAROUS +NECTARS +NECTARY +NEDDIES +NEDDY +NEE +NEED +NEEDED +NEEDER +NEEDERS +NEEDFUL +NEEDFULLY +NEEDFULNESS +NEEDFULNESSES +NEEDFULS +NEEDIER +NEEDIEST +NEEDILY +NEEDINESS +NEEDINESSES +NEEDING +NEEDLE +NEEDLED +NEEDLEFISH +NEEDLEFISHES +NEEDLELIKE +NEEDLEPOINT +NEEDLEPOINTS +NEEDLER +NEEDLERS +NEEDLES +NEEDLESS +NEEDLESSLY +NEEDLESSNESS +NEEDLESSNESSES +NEEDLEWOMAN +NEEDLEWOMEN +NEEDLEWORK +NEEDLEWORKER +NEEDLEWORKERS +NEEDLEWORKS +NEEDLING +NEEDLINGS +NEEDS +NEEDY +NEEM +NEEMS +NEEP +NEEPS +NEFARIOUS +NEFARIOUSLY +NEG +NEGATE +NEGATED +NEGATER +NEGATERS +NEGATES +NEGATING +NEGATION +NEGATIONAL +NEGATIONS +NEGATIVE +NEGATIVED +NEGATIVELY +NEGATIVENESS +NEGATIVENESSES +NEGATIVES +NEGATIVING +NEGATIVISM +NEGATIVISMS +NEGATIVIST +NEGATIVISTIC +NEGATIVISTS +NEGATIVITIES +NEGATIVITY +NEGATON +NEGATONS +NEGATOR +NEGATORS +NEGATRON +NEGATRONS +NEGLECT +NEGLECTED +NEGLECTER +NEGLECTERS +NEGLECTFUL +NEGLECTFULLY +NEGLECTFULNESS +NEGLECTING +NEGLECTOR +NEGLECTORS +NEGLECTS +NEGLIGE +NEGLIGEE +NEGLIGEES +NEGLIGENCE +NEGLIGENCES +NEGLIGENT +NEGLIGENTLY +NEGLIGES +NEGLIGIBILITIES +NEGLIGIBILITY +NEGLIGIBLE +NEGLIGIBLY +NEGOTIABILITIES +NEGOTIABILITY +NEGOTIABLE +NEGOTIANT +NEGOTIANTS +NEGOTIATE +NEGOTIATED +NEGOTIATES +NEGOTIATING +NEGOTIATION +NEGOTIATIONS +NEGOTIATOR +NEGOTIATORS +NEGOTIATORY +NEGRITUDE +NEGRITUDES +NEGROID +NEGROIDS +NEGRONI +NEGRONIS +NEGROPHIL +NEGROPHILS +NEGROPHOBE +NEGROPHOBES +NEGROPHOBIA +NEGROPHOBIAS +NEGS +NEGUS +NEGUSES +NEIF +NEIFS +NEIGH +NEIGHBOR +NEIGHBORED +NEIGHBORHOOD +NEIGHBORHOODS +NEIGHBORING +NEIGHBORLINESS +NEIGHBORLY +NEIGHBORS +NEIGHBOUR +NEIGHBOURED +NEIGHBOURING +NEIGHBOURS +NEIGHED +NEIGHING +NEIGHS +NEIST +NEITHER +NEKTON +NEKTONIC +NEKTONS +NELLIE +NELLIES +NELLY +NELSON +NELSONS +NELUMBIUM +NELUMBIUMS +NELUMBO +NELUMBOS +NEMA +NEMAS +NEMATIC +NEMATICIDAL +NEMATICIDE +NEMATICIDES +NEMATOCIDAL +NEMATOCIDE +NEMATOCIDES +NEMATOCYST +NEMATOCYSTS +NEMATODE +NEMATODES +NEMATOLOGICAL +NEMATOLOGIES +NEMATOLOGIST +NEMATOLOGISTS +NEMATOLOGY +NEMERTEAN +NEMERTEANS +NEMERTINE +NEMERTINES +NEMESES +NEMESIS +NEMOPHILA +NEMOPHILAS +NENE +NENES +NEOCLASSIC +NEOCLASSICAL +NEOCLASSICISM +NEOCLASSICISMS +NEOCLASSICIST +NEOCLASSICISTS +NEOCOLONIAL +NEOCOLONIALISM +NEOCOLONIALISMS +NEOCOLONIALIST +NEOCOLONIALISTS +NEOCON +NEOCONS +NEOCONSERVATISM +NEOCONSERVATIVE +NEOCORTEX +NEOCORTEXES +NEOCORTICAL +NEOCORTICES +NEODYMIUM +NEODYMIUMS +NEOGENE +NEOLIBERAL +NEOLIBERALISM +NEOLIBERALISMS +NEOLIBERALS +NEOLITH +NEOLITHIC +NEOLITHS +NEOLOGIC +NEOLOGIES +NEOLOGISM +NEOLOGISMS +NEOLOGIST +NEOLOGISTIC +NEOLOGISTS +NEOLOGIZE +NEOLOGIZED +NEOLOGIZES +NEOLOGIZING +NEOLOGY +NEOMORPH +NEOMORPHS +NEOMYCIN +NEOMYCINS +NEON +NEONATAL +NEONATALLY +NEONATE +NEONATES +NEONATOLOGIES +NEONATOLOGIST +NEONATOLOGISTS +NEONATOLOGY +NEONED +NEONS +NEOORTHODOX +NEOORTHODOXIES +NEOORTHODOXY +NEOPHILIA +NEOPHILIAC +NEOPHILIACS +NEOPHILIAS +NEOPHYTE +NEOPHYTES +NEOPHYTIC +NEOPLASIA +NEOPLASIAS +NEOPLASM +NEOPLASMS +NEOPLASTIC +NEOPLASTICISM +NEOPLASTICISMS +NEOPLASTICIST +NEOPLASTICISTS +NEOPLASTIES +NEOPLASTY +NEOPRENE +NEOPRENES +NEOREALISM +NEOREALISMS +NEOREALIST +NEOREALISTIC +NEOREALISTS +NEOSTIGMINE +NEOSTIGMINES +NEOTENIC +NEOTENIES +NEOTENOUS +NEOTENY +NEOTERIC +NEOTERICS +NEOTROPIC +NEOTROPICS +NEOTYPE +NEOTYPES +NEPENTHE +NEPENTHEAN +NEPENTHES +NEPETA +NEPETAS +NEPHELINE +NEPHELINES +NEPHELINIC +NEPHELINITE +NEPHELINITES +NEPHELINITIC +NEPHELITE +NEPHELITES +NEPHELOMETER +NEPHELOMETERS +NEPHELOMETRIC +NEPHELOMETRIES +NEPHELOMETRY +NEPHEW +NEPHEWS +NEPHOGRAM +NEPHOGRAMS +NEPHOLOGIES +NEPHOLOGY +NEPHOSCOPE +NEPHOSCOPES +NEPHRECTOMIES +NEPHRECTOMIZE +NEPHRECTOMIZED +NEPHRECTOMIZES +NEPHRECTOMIZING +NEPHRECTOMY +NEPHRIC +NEPHRIDIA +NEPHRIDIAL +NEPHRIDIUM +NEPHRISM +NEPHRISMS +NEPHRITE +NEPHRITES +NEPHRITIC +NEPHRITIDES +NEPHRITIS +NEPHRITISES +NEPHROLOGIES +NEPHROLOGIST +NEPHROLOGISTS +NEPHROLOGY +NEPHRON +NEPHRONS +NEPHROPATHIC +NEPHROPATHIES +NEPHROPATHY +NEPHROSES +NEPHROSIS +NEPHROSTOME +NEPHROSTOMES +NEPHROTIC +NEPHROTICS +NEPHROTOXIC +NEPHROTOXICITY +NEPOTIC +NEPOTISM +NEPOTISMS +NEPOTIST +NEPOTISTIC +NEPOTISTS +NEPTUNIUM +NEPTUNIUMS +NERD +NERDIER +NERDIEST +NERDINESS +NERDINESSES +NERDISH +NERDS +NERDY +NEREID +NEREIDES +NEREIDS +NEREIS +NERITIC +NEROL +NEROLI +NEROLIS +NEROLS +NERTS +NERTZ +NERVATE +NERVATION +NERVATIONS +NERVATURE +NERVATURES +NERVE +NERVED +NERVELESS +NERVELESSLY +NERVELESSNESS +NERVELESSNESSES +NERVES +NERVIER +NERVIEST +NERVILY +NERVINE +NERVINES +NERVINESS +NERVINESSES +NERVING +NERVINGS +NERVOSITIES +NERVOSITY +NERVOUS +NERVOUSLY +NERVOUSNESS +NERVOUSNESSES +NERVULE +NERVULES +NERVURE +NERVURES +NERVY +NESCIENCE +NESCIENCES +NESCIENT +NESCIENTS +NESS +NESSES +NEST +NESTABLE +NESTED +NESTER +NESTERS +NESTING +NESTLE +NESTLED +NESTLER +NESTLERS +NESTLES +NESTLIKE +NESTLING +NESTLINGS +NESTOR +NESTORS +NESTS +NET +NETHER +NETHERMOST +NETHERWORLD +NETHERWORLDS +NETIQUETTE +NETIQUETTES +NETIZEN +NETIZENS +NETLESS +NETLIKE +NETMINDER +NETMINDERS +NETOP +NETOPS +NETS +NETSUKE +NETSUKES +NETT +NETTABLE +NETTED +NETTER +NETTERS +NETTIER +NETTIEST +NETTING +NETTINGS +NETTLE +NETTLED +NETTLER +NETTLERS +NETTLES +NETTLESOME +NETTLIER +NETTLIEST +NETTLING +NETTLY +NETTS +NETTY +NETWORK +NETWORKED +NETWORKER +NETWORKERS +NETWORKING +NETWORKINGS +NETWORKS +NEUK +NEUKS +NEUM +NEUMATIC +NEUME +NEUMES +NEUMIC +NEUMS +NEURAL +NEURALGIA +NEURALGIAS +NEURALGIC +NEURALLY +NEURAMINIDASE +NEURAMINIDASES +NEURASTHENIA +NEURASTHENIAS +NEURASTHENIC +NEURASTHENICS +NEURAXON +NEURAXONS +NEURILEMMA +NEURILEMMAL +NEURILEMMAS +NEURINE +NEURINES +NEURITIC +NEURITICS +NEURITIDES +NEURITIS +NEURITISES +NEUROACTIVE +NEUROANATOMIC +NEUROANATOMICAL +NEUROANATOMIES +NEUROANATOMIST +NEUROANATOMISTS +NEUROANATOMY +NEUROBIOLOGICAL +NEUROBIOLOGIES +NEUROBIOLOGIST +NEUROBIOLOGISTS +NEUROBIOLOGY +NEUROBLASTOMA +NEUROBLASTOMAS +NEUROBLASTOMATA +NEUROCHEMICAL +NEUROCHEMICALS +NEUROCHEMIST +NEUROCHEMISTRY +NEUROCHEMISTS +NEUROCOEL +NEUROCOELS +NEUROENDOCRINE +NEUROFIBRIL +NEUROFIBRILLARY +NEUROFIBRILS +NEUROFIBROMA +NEUROFIBROMAS +NEUROFIBROMATA +NEUROGENIC +NEUROGENICALLY +NEUROGLIA +NEUROGLIAL +NEUROGLIAS +NEUROHORMONAL +NEUROHORMONE +NEUROHORMONES +NEUROHUMOR +NEUROHUMORAL +NEUROHUMORS +NEUROHYPOPHYSES +NEUROHYPOPHYSIS +NEUROID +NEUROLEPTIC +NEUROLEPTICS +NEUROLOGIC +NEUROLOGICAL +NEUROLOGICALLY +NEUROLOGIES +NEUROLOGIST +NEUROLOGISTS +NEUROLOGY +NEUROMA +NEUROMAS +NEUROMAST +NEUROMASTS +NEUROMATA +NEUROMUSCULAR +NEURON +NEURONAL +NEURONE +NEURONES +NEURONIC +NEURONS +NEUROPATH +NEUROPATHIC +NEUROPATHICALLY +NEUROPATHIES +NEUROPATHOLOGIC +NEUROPATHOLOGY +NEUROPATHS +NEUROPATHY +NEUROPEPTIDE +NEUROPEPTIDES +NEUROPHYSIOLOGY +NEUROPSYCHIATRY +NEUROPSYCHOLOGY +NEUROPTERAN +NEUROPTERANS +NEUROPTEROUS +NEURORADIOLOGY +NEUROSAL +NEUROSCIENCE +NEUROSCIENCES +NEUROSCIENTIFIC +NEUROSCIENTIST +NEUROSCIENTISTS +NEUROSECRETION +NEUROSECRETIONS +NEUROSECRETORY +NEUROSENSORY +NEUROSES +NEUROSIS +NEUROSPORA +NEUROSPORAS +NEUROSURGEON +NEUROSURGEONS +NEUROSURGERIES +NEUROSURGERY +NEUROSURGICAL +NEUROTIC +NEUROTICALLY +NEUROTICISM +NEUROTICISMS +NEUROTICS +NEUROTOMIES +NEUROTOMY +NEUROTOXIC +NEUROTOXICITIES +NEUROTOXICITY +NEUROTOXIN +NEUROTOXINS +NEUROTROPIC +NEURULA +NEURULAE +NEURULAR +NEURULAS +NEURULATION +NEURULATIONS +NEUSTIC +NEUSTON +NEUSTONIC +NEUSTONS +NEUTER +NEUTERED +NEUTERING +NEUTERS +NEUTRAL +NEUTRALISE +NEUTRALISED +NEUTRALISES +NEUTRALISING +NEUTRALISM +NEUTRALISMS +NEUTRALIST +NEUTRALISTIC +NEUTRALISTS +NEUTRALITIES +NEUTRALITY +NEUTRALIZATION +NEUTRALIZATIONS +NEUTRALIZE +NEUTRALIZED +NEUTRALIZER +NEUTRALIZERS +NEUTRALIZES +NEUTRALIZING +NEUTRALLY +NEUTRALNESS +NEUTRALNESSES +NEUTRALS +NEUTRINO +NEUTRINOLESS +NEUTRINOS +NEUTRON +NEUTRONIC +NEUTRONS +NEUTROPHIL +NEUTROPHILIC +NEUTROPHILS +NEVE +NEVER +NEVERMIND +NEVERMINDS +NEVERMORE +NEVERTHELESS +NEVES +NEVI +NEVOID +NEVUS +NEW +NEWBIE +NEWBIES +NEWBORN +NEWBORNS +NEWCOMER +NEWCOMERS +NEWEL +NEWELS +NEWER +NEWEST +NEWFANGLED +NEWFANGLEDNESS +NEWFOUND +NEWIE +NEWIES +NEWISH +NEWLY +NEWLYWED +NEWLYWEDS +NEWMARKET +NEWMARKETS +NEWMOWN +NEWNESS +NEWNESSES +NEWS +NEWSAGENT +NEWSAGENTS +NEWSBEAT +NEWSBEATS +NEWSBOY +NEWSBOYS +NEWSBREAK +NEWSBREAKS +NEWSCAST +NEWSCASTER +NEWSCASTERS +NEWSCASTS +NEWSDEALER +NEWSDEALERS +NEWSDESK +NEWSDESKS +NEWSGIRL +NEWSGIRLS +NEWSGROUP +NEWSGROUPS +NEWSHAWK +NEWSHAWKS +NEWSHOUND +NEWSHOUNDS +NEWSIE +NEWSIER +NEWSIES +NEWSIEST +NEWSINESS +NEWSINESSES +NEWSLESS +NEWSLETTER +NEWSLETTERS +NEWSMAGAZINE +NEWSMAGAZINES +NEWSMAKER +NEWSMAKERS +NEWSMAN +NEWSMEN +NEWSMONGER +NEWSMONGERS +NEWSPAPER +NEWSPAPERED +NEWSPAPERING +NEWSPAPERMAN +NEWSPAPERMEN +NEWSPAPERS +NEWSPAPERWOMAN +NEWSPAPERWOMEN +NEWSPEAK +NEWSPEAKS +NEWSPEOPLE +NEWSPERSON +NEWSPERSONS +NEWSPRINT +NEWSPRINTS +NEWSREADER +NEWSREADERS +NEWSREEL +NEWSREELS +NEWSROOM +NEWSROOMS +NEWSSTAND +NEWSSTANDS +NEWSWEEKLIES +NEWSWEEKLY +NEWSWIRE +NEWSWIRES +NEWSWOMAN +NEWSWOMEN +NEWSWORTHINESS +NEWSWORTHY +NEWSWRITING +NEWSWRITINGS +NEWSY +NEWT +NEWTON +NEWTONS +NEWTS +NEWWAVER +NEWWAVERS +NEXT +NEXTDOOR +NEXUS +NEXUSES +NGULTRUM +NGULTRUMS +NGWEE +NIACIN +NIACINAMIDE +NIACINAMIDES +NIACINS +NIALAMIDE +NIALAMIDES +NIB +NIBBED +NIBBING +NIBBLE +NIBBLED +NIBBLER +NIBBLERS +NIBBLES +NIBBLING +NIBLICK +NIBLICKS +NIBLIKE +NIBS +NICAD +NICADS +NICCOLITE +NICCOLITES +NICE +NICELY +NICENESS +NICENESSES +NICER +NICEST +NICETIES +NICETY +NICHE +NICHED +NICHES +NICHING +NICK +NICKED +NICKEL +NICKELED +NICKELIC +NICKELIFEROUS +NICKELING +NICKELLED +NICKELLING +NICKELODEON +NICKELODEONS +NICKELOUS +NICKELS +NICKER +NICKERED +NICKERING +NICKERS +NICKING +NICKLE +NICKLED +NICKLES +NICKLING +NICKNACK +NICKNACKS +NICKNAME +NICKNAMED +NICKNAMER +NICKNAMERS +NICKNAMES +NICKNAMING +NICKS +NICOISE +NICOL +NICOLS +NICOTIANA +NICOTIANAS +NICOTIN +NICOTINAMIDE +NICOTINAMIDES +NICOTINE +NICOTINES +NICOTINIC +NICOTINS +NICTATE +NICTATED +NICTATES +NICTATING +NICTATION +NICTATIONS +NICTITANT +NICTITATE +NICTITATED +NICTITATES +NICTITATING +NIDAL +NIDATE +NIDATED +NIDATES +NIDATING +NIDATION +NIDATIONS +NIDDERING +NIDDERINGS +NIDE +NIDED +NIDERING +NIDERINGS +NIDES +NIDGET +NIDGETS +NIDI +NIDICOLOUS +NIDIFICATION +NIDIFICATIONS +NIDIFIED +NIDIFIES +NIDIFUGOUS +NIDIFY +NIDIFYING +NIDING +NIDUS +NIDUSES +NIECE +NIECES +NIELLI +NIELLIST +NIELLISTS +NIELLO +NIELLOED +NIELLOING +NIELLOS +NIEVE +NIEVES +NIFEDIPINE +NIFEDIPINES +NIFFER +NIFFERED +NIFFERING +NIFFERS +NIFTIER +NIFTIES +NIFTIEST +NIFTILY +NIFTINESS +NIFTINESSES +NIFTY +NIGELLA +NIGELLAS +NIGGARD +NIGGARDED +NIGGARDING +NIGGARDLINESS +NIGGARDLINESSES +NIGGARDLY +NIGGARDS +NIGGER +NIGGERS +NIGGLE +NIGGLED +NIGGLER +NIGGLERS +NIGGLES +NIGGLIER +NIGGLIEST +NIGGLING +NIGGLINGLY +NIGGLINGS +NIGGLY +NIGH +NIGHED +NIGHER +NIGHEST +NIGHING +NIGHNESS +NIGHNESSES +NIGHS +NIGHT +NIGHTCAP +NIGHTCAPS +NIGHTCLOTHES +NIGHTCLUB +NIGHTCLUBBED +NIGHTCLUBBER +NIGHTCLUBBERS +NIGHTCLUBBING +NIGHTCLUBS +NIGHTDRESS +NIGHTDRESSES +NIGHTFALL +NIGHTFALLS +NIGHTGLOW +NIGHTGLOWS +NIGHTGOWN +NIGHTGOWNS +NIGHTHAWK +NIGHTHAWKS +NIGHTIE +NIGHTIES +NIGHTINGALE +NIGHTINGALES +NIGHTJAR +NIGHTJARS +NIGHTLESS +NIGHTLIFE +NIGHTLIFES +NIGHTLIVES +NIGHTLONG +NIGHTLY +NIGHTMARE +NIGHTMARES +NIGHTMARISH +NIGHTMARISHLY +NIGHTS +NIGHTSCOPE +NIGHTSCOPES +NIGHTSHADE +NIGHTSHADES +NIGHTSHIRT +NIGHTSHIRTS +NIGHTSIDE +NIGHTSIDES +NIGHTSPOT +NIGHTSPOTS +NIGHTSTAND +NIGHTSTANDS +NIGHTSTICK +NIGHTSTICKS +NIGHTTIDE +NIGHTTIDES +NIGHTTIME +NIGHTTIMES +NIGHTWALKER +NIGHTWALKERS +NIGHTWEAR +NIGHTY +NIGRIFIED +NIGRIFIES +NIGRIFY +NIGRIFYING +NIGRITUDE +NIGRITUDES +NIGROSIN +NIGROSINE +NIGROSINES +NIGROSINS +NIHIL +NIHILISM +NIHILISMS +NIHILIST +NIHILISTIC +NIHILISTS +NIHILITIES +NIHILITY +NIHILS +NIL +NILGAI +NILGAIS +NILGAU +NILGAUS +NILGHAI +NILGHAIS +NILGHAU +NILGHAUS +NILL +NILLED +NILLING +NILLS +NILPOTENT +NILPOTENTS +NILS +NIM +NIMBI +NIMBLE +NIMBLENESS +NIMBLENESSES +NIMBLER +NIMBLEST +NIMBLY +NIMBOSTRATI +NIMBOSTRATUS +NIMBUS +NIMBUSED +NIMBUSES +NIMBYNESS +NIMBYNESSES +NIMIETIES +NIMIETY +NIMIOUS +NIMMED +NIMMING +NIMROD +NIMRODS +NIMS +NINCOMPOOP +NINCOMPOOPERIES +NINCOMPOOPERY +NINCOMPOOPS +NINE +NINEBARK +NINEBARKS +NINEFOLD +NINEPIN +NINEPINS +NINES +NINETEEN +NINETEENS +NINETEENTH +NINETEENTHS +NINETIES +NINETIETH +NINETIETHS +NINETY +NINHYDRIN +NINHYDRINS +NINJA +NINJAS +NINNIES +NINNY +NINNYHAMMER +NINNYHAMMERS +NINNYISH +NINON +NINONS +NINTH +NINTHLY +NINTHS +NIOBATE +NIOBATES +NIOBIC +NIOBITE +NIOBITES +NIOBIUM +NIOBIUMS +NIOBOUS +NIP +NIPA +NIPAS +NIPPED +NIPPER +NIPPERS +NIPPIER +NIPPIEST +NIPPILY +NIPPINESS +NIPPINESSES +NIPPING +NIPPINGLY +NIPPLE +NIPPLED +NIPPLES +NIPPY +NIPS +NIRVANA +NIRVANAS +NIRVANIC +NISEI +NISEIS +NISI +NISUS +NIT +NITCHIE +NITCHIES +NITE +NITER +NITERIE +NITERIES +NITERS +NITERY +NITES +NITID +NITINOL +NITINOLS +NITON +NITONS +NITPICK +NITPICKED +NITPICKER +NITPICKERS +NITPICKIER +NITPICKIEST +NITPICKING +NITPICKS +NITPICKY +NITRATE +NITRATED +NITRATES +NITRATING +NITRATION +NITRATIONS +NITRATOR +NITRATORS +NITRE +NITRES +NITRIC +NITRID +NITRIDE +NITRIDED +NITRIDES +NITRIDING +NITRIDS +NITRIFICATION +NITRIFICATIONS +NITRIFIED +NITRIFIER +NITRIFIERS +NITRIFIES +NITRIFY +NITRIFYING +NITRIL +NITRILE +NITRILES +NITRILS +NITRITE +NITRITES +NITRO +NITROBENZENE +NITROBENZENES +NITROCELLULOSE +NITROCELLULOSES +NITROFURAN +NITROFURANS +NITROGEN +NITROGENASE +NITROGENASES +NITROGENOUS +NITROGENS +NITROGLYCERIN +NITROGLYCERINE +NITROGLYCERINES +NITROGLYCERINS +NITROLIC +NITROMETHANE +NITROMETHANES +NITROPARAFFIN +NITROPARAFFINS +NITROS +NITROSAMINE +NITROSAMINES +NITROSO +NITROSYL +NITROSYLS +NITROUS +NITS +NITTIER +NITTIEST +NITTY +NITWIT +NITWITS +NIVAL +NIVEOUS +NIX +NIXE +NIXED +NIXES +NIXIE +NIXIES +NIXING +NIXY +NIZAM +NIZAMATE +NIZAMATES +NIZAMS +NO +NOB +NOBBIER +NOBBIEST +NOBBILY +NOBBLE +NOBBLED +NOBBLER +NOBBLERS +NOBBLES +NOBBLING +NOBBY +NOBELIUM +NOBELIUMS +NOBILIARY +NOBILITIES +NOBILITY +NOBLE +NOBLEMAN +NOBLEMEN +NOBLENESS +NOBLENESSES +NOBLER +NOBLES +NOBLESSE +NOBLESSES +NOBLEST +NOBLEWOMAN +NOBLEWOMEN +NOBLY +NOBODIES +NOBODY +NOBS +NOCENT +NOCICEPTIVE +NOCK +NOCKED +NOCKING +NOCKS +NOCTAMBULIST +NOCTAMBULISTS +NOCTILUCA +NOCTILUCAS +NOCTUID +NOCTUIDS +NOCTULE +NOCTULES +NOCTUOID +NOCTURN +NOCTURNAL +NOCTURNALLY +NOCTURNE +NOCTURNES +NOCTURNS +NOCUOUS +NOCUOUSLY +NOD +NODAL +NODALITIES +NODALITY +NODALLY +NODDED +NODDER +NODDERS +NODDIES +NODDING +NODDINGLY +NODDLE +NODDLED +NODDLES +NODDLING +NODDY +NODE +NODES +NODI +NODICAL +NODOSE +NODOSITIES +NODOSITY +NODOUS +NODS +NODULAR +NODULATION +NODULATIONS +NODULE +NODULES +NODULOSE +NODULOUS +NODUS +NOEL +NOELS +NOES +NOESIS +NOESISES +NOETIC +NOG +NOGG +NOGGED +NOGGIN +NOGGING +NOGGINGS +NOGGINS +NOGGS +NOGS +NOH +NOHOW +NOIL +NOILS +NOILY +NOIR +NOIRISH +NOIRS +NOISE +NOISED +NOISELESS +NOISELESSLY +NOISEMAKER +NOISEMAKERS +NOISEMAKING +NOISEMAKINGS +NOISES +NOISETTE +NOISETTES +NOISIER +NOISIEST +NOISILY +NOISINESS +NOISINESSES +NOISING +NOISOME +NOISOMELY +NOISOMENESS +NOISOMENESSES +NOISY +NOLO +NOLOS +NOM +NOMA +NOMAD +NOMADIC +NOMADISM +NOMADISMS +NOMADS +NOMARCH +NOMARCHIES +NOMARCHS +NOMARCHY +NOMAS +NOMBLES +NOMBRIL +NOMBRILS +NOME +NOMEN +NOMENCLATOR +NOMENCLATORIAL +NOMENCLATORS +NOMENCLATURAL +NOMENCLATURE +NOMENCLATURES +NOMES +NOMINA +NOMINAL +NOMINALISM +NOMINALISMS +NOMINALIST +NOMINALISTIC +NOMINALISTS +NOMINALLY +NOMINALS +NOMINATE +NOMINATED +NOMINATES +NOMINATING +NOMINATION +NOMINATIONS +NOMINATIVE +NOMINATIVES +NOMINATOR +NOMINATORS +NOMINEE +NOMINEES +NOMISM +NOMISMS +NOMISTIC +NOMOGRAM +NOMOGRAMS +NOMOGRAPH +NOMOGRAPHIC +NOMOGRAPHIES +NOMOGRAPHS +NOMOGRAPHY +NOMOI +NOMOLOGIC +NOMOLOGICAL +NOMOLOGIES +NOMOLOGY +NOMOS +NOMOTHETIC +NOMS +NONA +NONABRASIVE +NONABSORBABLE +NONABSORBENT +NONABSORPTIVE +NONABSTRACT +NONACADEMIC +NONACADEMICS +NONACCEPTANCE +NONACCEPTANCES +NONACCOUNTABLE +NONACCREDITED +NONACCRUAL +NONACHIEVEMENT +NONACHIEVEMENTS +NONACID +NONACIDIC +NONACIDS +NONACQUISITIVE +NONACTING +NONACTION +NONACTIONS +NONACTIVATED +NONACTIVE +NONACTOR +NONACTORS +NONADAPTIVE +NONADDICT +NONADDICTIVE +NONADDICTS +NONADDITIVE +NONADDITIVITIES +NONADDITIVITY +NONADHESIVE +NONADIABATIC +NONADJACENT +NONADMIRER +NONADMIRERS +NONADMISSION +NONADMISSIONS +NONADULT +NONADULTS +NONAESTHETIC +NONAFFILIATED +NONAFFLUENT +NONAGE +NONAGENARIAN +NONAGENARIANS +NONAGES +NONAGGRESSION +NONAGGRESSIONS +NONAGGRESSIVE +NONAGON +NONAGONAL +NONAGONS +NONAGRICULTURAL +NONALCOHOLIC +NONALIGNED +NONALIGNMENT +NONALIGNMENTS +NONALLELIC +NONALLERGENIC +NONALLERGIC +NONALPHABETIC +NONALUMINUM +NONAMBIGUOUS +NONANALYTIC +NONANATOMIC +NONANIMAL +NONANSWER +NONANSWERS +NONANTAGONISTIC +NONANTIBIOTIC +NONANTIBIOTICS +NONANTIGENIC +NONAPPEARANCE +NONAPPEARANCES +NONAQUATIC +NONAQUEOUS +NONARABLE +NONARBITRARY +NONARCHITECT +NONARCHITECTS +NONARCHITECTURE +NONARGUMENT +NONARGUMENTS +NONARISTOCRATIC +NONAROMATIC +NONAROMATICS +NONART +NONARTIST +NONARTISTIC +NONARTISTS +NONARTS +NONAS +NONASCETIC +NONASPIRIN +NONASSERTIVE +NONASSOCIATED +NONASTRONOMICAL +NONATHLETE +NONATHLETES +NONATHLETIC +NONATOMIC +NONATTACHED +NONATTACHMENT +NONATTACHMENTS +NONATTENDANCE +NONATTENDANCES +NONATTENDER +NONATTENDERS +NONAUDITORY +NONAUTHOR +NONAUTHORS +NONAUTOMATED +NONAUTOMATIC +NONAUTOMOTIVE +NONAUTONOMOUS +NONAVAILABILITY +NONBACTERIAL +NONBANK +NONBANKING +NONBANKS +NONBARBITURATE +NONBARBITURATES +NONBASIC +NONBEARING +NONBEHAVIORAL +NONBEING +NONBEINGS +NONBELIEF +NONBELIEFS +NONBELIEVER +NONBELIEVERS +NONBELLIGERENCY +NONBELLIGERENT +NONBELLIGERENTS +NONBETTING +NONBINARY +NONBINDING +NONBIOGRAPHICAL +NONBIOLOGICAL +NONBIOLOGICALLY +NONBIOLOGIST +NONBIOLOGISTS +NONBITING +NONBLACK +NONBLACKS +NONBODIES +NONBODY +NONBONDED +NONBONDING +NONBOOK +NONBOOKS +NONBOTANIST +NONBOTANISTS +NONBRAND +NONBREAKABLE +NONBREATHING +NONBREEDER +NONBREEDERS +NONBREEDING +NONBROADCAST +NONBUILDING +NONBURNABLE +NONBUSINESS +NONBUYING +NONCABINET +NONCAKING +NONCALLABLE +NONCALORIC +NONCAMPUS +NONCANCELABLE +NONCANCEROUS +NONCANDIDACIES +NONCANDIDACY +NONCANDIDATE +NONCANDIDATES +NONCAPITAL +NONCAPITALIST +NONCAPITALISTS +NONCARCINOGEN +NONCARCINOGENIC +NONCARCINOGENS +NONCARDIAC +NONCAREER +NONCARRIER +NONCARRIERS +NONCASH +NONCASUAL +NONCAUSAL +NONCE +NONCELEBRATION +NONCELEBRATIONS +NONCELEBRITIES +NONCELEBRITY +NONCELLULAR +NONCELLULOSIC +NONCENTRAL +NONCEREAL +NONCERTIFICATED +NONCERTIFIED +NONCES +NONCHALANCE +NONCHALANCES +NONCHALANT +NONCHALANTLY +NONCHARACTER +NONCHARACTERS +NONCHARISMATIC +NONCHARISMATICS +NONCHAUVINIST +NONCHEMICAL +NONCHEMICALS +NONCHROMOSOMAL +NONCHURCH +NONCHURCHGOER +NONCHURCHGOERS +NONCIRCULAR +NONCIRCULATING +NONCITIZEN +NONCITIZENS +NONCLANDESTINE +NONCLASS +NONCLASSES +NONCLASSICAL +NONCLASSIFIED +NONCLASSROOM +NONCLERICAL +NONCLING +NONCLINICAL +NONCLOGGING +NONCODING +NONCOERCIVE +NONCOGNITIVE +NONCOHERENT +NONCOINCIDENCE +NONCOINCIDENCES +NONCOITAL +NONCOKING +NONCOLA +NONCOLAS +NONCOLLECTOR +NONCOLLECTORS +NONCOLLEGE +NONCOLLEGIATE +NONCOLLINEAR +NONCOLOR +NONCOLORED +NONCOLORFAST +NONCOLORS +NONCOM +NONCOMBAT +NONCOMBATANT +NONCOMBATANTS +NONCOMBATIVE +NONCOMBUSTIBLE +NONCOMMERCIAL +NONCOMMITMENT +NONCOMMITMENTS +NONCOMMITTAL +NONCOMMITTALLY +NONCOMMITTED +NONCOMMUNIST +NONCOMMUNISTS +NONCOMMUNITY +NONCOMMUTATIVE +NONCOMPARABLE +NONCOMPATIBLE +NONCOMPETITION +NONCOMPETITIVE +NONCOMPETITOR +NONCOMPETITORS +NONCOMPLEX +NONCOMPLIANCE +NONCOMPLIANCES +NONCOMPLICATED +NONCOMPLYING +NONCOMPOSER +NONCOMPOSERS +NONCOMPOUND +NONCOMPRESSIBLE +NONCOMPUTER +NONCOMPUTERIZED +NONCOMS +NONCONCEPTUAL +NONCONCERN +NONCONCERNS +NONCONCLUSION +NONCONCLUSIONS +NONCONCUR +NONCONCURRED +NONCONCURRENCE +NONCONCURRENCES +NONCONCURRENT +NONCONCURRING +NONCONCURS +NONCONDENSABLE +NONCONDITIONED +NONCONDUCTING +NONCONDUCTION +NONCONDUCTIVE +NONCONDUCTOR +NONCONDUCTORS +NONCONFERENCE +NONCONFIDENCE +NONCONFIDENCES +NONCONFIDENTIAL +NONCONFLICTING +NONCONFORM +NONCONFORMANCE +NONCONFORMANCES +NONCONFORMED +NONCONFORMER +NONCONFORMERS +NONCONFORMING +NONCONFORMISM +NONCONFORMISMS +NONCONFORMIST +NONCONFORMISTS +NONCONFORMITIES +NONCONFORMITY +NONCONFORMS +NONCONGRUENT +NONCONJUGATED +NONCONNECTION +NONCONNECTIONS +NONCONSCIOUS +NONCONSECUTIVE +NONCONSENSUAL +NONCONSERVATION +NONCONSERVATIVE +NONCONSOLIDATED +NONCONSTANT +NONCONSTRUCTION +NONCONSTRUCTIVE +NONCONSUMER +NONCONSUMERS +NONCONSUMING +NONCONSUMPTION +NONCONSUMPTIONS +NONCONSUMPTIVE +NONCONTACT +NONCONTAGIOUS +NONCONTEMPORARY +NONCONTIGUOUS +NONCONTINGENT +NONCONTINUOUS +NONCONTRACT +NONCONTRACTUAL +NONCONTRIBUTORY +NONCONTROLLABLE +NONCONTROLLED +NONCONTROLLING +NONCONVENTIONAL +NONCONVERTIBLE +NONCOOPERATION +NONCOOPERATIONS +NONCOOPERATIVE +NONCOOPERATOR +NONCOOPERATORS +NONCOPLANAR +NONCORE +NONCORPORATE +NONCORRELATION +NONCORRELATIONS +NONCORRODIBLE +NONCORRODING +NONCORROSIVE +NONCOUNTRY +NONCOUNTY +NONCOVERAGE +NONCOVERAGES +NONCREATIVE +NONCREATIVITIES +NONCREATIVITY +NONCREDENTIALED +NONCREDIT +NONCRIME +NONCRIMES +NONCRIMINAL +NONCRIMINALS +NONCRISES +NONCRISIS +NONCRITICAL +NONCROSSOVER +NONCRUSHABLE +NONCRYSTALLINE +NONCULINARY +NONCULTIVATED +NONCULTIVATION +NONCULTIVATIONS +NONCULTURAL +NONCUMULATIVE +NONCURRENT +NONCUSTODIAL +NONCUSTOMER +NONCUSTOMERS +NONCYCLIC +NONCYCLICAL +NONDAIRY +NONDANCE +NONDANCER +NONDANCERS +NONDANCES +NONDECEPTIVE +NONDECISION +NONDECISIONS +NONDECREASING +NONDEDUCTIBLE +NONDEDUCTIVE +NONDEFENSE +NONDEFERRABLE +NONDEFORMING +NONDEGENERATE +NONDEGRADABLE +NONDEGREE +NONDELEGATE +NONDELEGATES +NONDELIBERATE +NONDELINQUENT +NONDELINQUENTS +NONDELIVERIES +NONDELIVERY +NONDEMAND +NONDEMANDING +NONDEMANDS +NONDEMOCRATIC +NONDEPARTMENTAL +NONDEPENDENT +NONDEPENDENTS +NONDEPLETABLE +NONDEPLETING +NONDEPOSITION +NONDEPOSITIONS +NONDEPRESSED +NONDERIVATIVE +NONDESCRIPT +NONDESCRIPTIVE +NONDESCRIPTS +NONDESERT +NONDESTRUCTIVE +NONDETACHABLE +NONDEVELOPMENT +NONDEVELOPMENTS +NONDEVIANT +NONDIABETIC +NONDIABETICS +NONDIALYZABLE +NONDIAPAUSING +NONDIDACTIC +NONDIFFUSIBLE +NONDIMENSIONAL +NONDIPLOMATIC +NONDIRECTED +NONDIRECTIONAL +NONDIRECTIVE +NONDISABLED +NONDISCLOSURE +NONDISCLOSURES +NONDISCOUNT +NONDISCURSIVE +NONDISJUNCTION +NONDISJUNCTIONS +NONDISPERSIVE +NONDISRUPTIVE +NONDISTINCTIVE +NONDIVERSIFIED +NONDIVIDING +NONDOCTOR +NONDOCTORS +NONDOCTRINAIRE +NONDOCUMENTARY +NONDOGMATIC +NONDOLLAR +NONDOMESTIC +NONDOMINANT +NONDORMANT +NONDRAMATIC +NONDRINKER +NONDRINKERS +NONDRINKING +NONDRIP +NONDRIVER +NONDRIVERS +NONDRUG +NONDRYING +NONDURABLE +NONE +NONEARNING +NONECONOMIC +NONECONOMIST +NONECONOMISTS +NONEDIBLE +NONEDIBLES +NONEDITORIAL +NONEDUCATION +NONEDUCATIONAL +NONEFFECTIVE +NONEGO +NONEGOS +NONELASTIC +NONELECT +NONELECTED +NONELECTION +NONELECTIONS +NONELECTIVE +NONELECTRIC +NONELECTRICAL +NONELECTROLYTE +NONELECTROLYTES +NONELECTRONIC +NONELEMENTARY +NONELITE +NONEMERGENCIES +NONEMERGENCY +NONEMOTIONAL +NONEMPHATIC +NONEMPIRICAL +NONEMPLOYEE +NONEMPLOYEES +NONEMPLOYMENT +NONEMPLOYMENTS +NONEMPTY +NONENCAPSULATED +NONENDING +NONENERGY +NONENFORCEMENT +NONENFORCEMENTS +NONENGAGEMENT +NONENGAGEMENTS +NONENGINEERING +NONENTITIES +NONENTITY +NONENTRIES +NONENTRY +NONENZYMATIC +NONENZYMIC +NONEQUAL +NONEQUALS +NONEQUILIBRIA +NONEQUILIBRIUM +NONEQUILIBRIUMS +NONEQUIVALENCE +NONEQUIVALENCES +NONEQUIVALENT +NONEROTIC +NONES +NONESSENTIAL +NONESSENTIALS +NONESTABLISHED +NONESTERIFIED +NONESUCH +NONESUCHES +NONET +NONETHELESS +NONETHICAL +NONETHNIC +NONETHNICS +NONETS +NONEVALUATIVE +NONEVENT +NONEVENTS +NONEVIDENCE +NONEVIDENCES +NONEXCLUSIVE +NONEXECUTIVE +NONEXECUTIVES +NONEXEMPT +NONEXEMPTS +NONEXISTENCE +NONEXISTENCES +NONEXISTENT +NONEXISTENTIAL +NONEXOTIC +NONEXPENDABLE +NONEXPERIMENTAL +NONEXPERT +NONEXPERTS +NONEXPLANATORY +NONEXPLOITATION +NONEXPLOITATIVE +NONEXPLOITIVE +NONEXPLOSIVE +NONEXPOSED +NONEXTANT +NONFACT +NONFACTOR +NONFACTORS +NONFACTS +NONFACTUAL +NONFACULTY +NONFADING +NONFAMILIAL +NONFAMILIES +NONFAMILY +NONFAN +NONFANS +NONFARM +NONFARMER +NONFARMERS +NONFAT +NONFATAL +NONFATTENING +NONFATTY +NONFEASANCE +NONFEASANCES +NONFEDERAL +NONFEDERATED +NONFEMINIST +NONFEMINISTS +NONFERROUS +NONFEUDAL +NONFICTION +NONFICTIONAL +NONFICTIONS +NONFIGURATIVE +NONFILAMENTOUS +NONFILIAL +NONFILTERABLE +NONFINAL +NONFINANCIAL +NONFINITE +NONFISCAL +NONFISSIONABLE +NONFLAMMABILITY +NONFLAMMABLE +NONFLOWERING +NONFLUENCIES +NONFLUENCY +NONFLUID +NONFLUIDS +NONFLUORESCENT +NONFLYING +NONFOCAL +NONFOOD +NONFORFEITABLE +NONFORFEITURE +NONFORFEITURES +NONFORMAL +NONFOSSIL +NONFREEZING +NONFRIVOLOUS +NONFROZEN +NONFUEL +NONFULFILLMENT +NONFULFILLMENTS +NONFUNCTIONAL +NONFUNCTIONING +NONFUNDED +NONGAME +NONGASEOUS +NONGAY +NONGAYS +NONGENETIC +NONGENITAL +NONGEOMETRICAL +NONGHETTO +NONGLAMOROUS +NONGLARE +NONGLARES +NONGLAZED +NONGLOSSY +NONGOLFER +NONGOLFERS +NONGONOCOCCAL +NONGOVERNMENT +NONGOVERNMENTAL +NONGRADED +NONGRADUATE +NONGRADUATES +NONGRAMMATICAL +NONGRANULAR +NONGREASY +NONGREEN +NONGREGARIOUS +NONGROWING +NONGROWTH +NONGUEST +NONGUESTS +NONGUILT +NONGUILTS +NONHALOGENATED +NONHANDICAPPED +NONHAPPENING +NONHAPPENINGS +NONHARDY +NONHARMONIC +NONHAZARDOUS +NONHEME +NONHEMOLYTIC +NONHEREDITARY +NONHERO +NONHEROES +NONHEROIC +NONHIERARCHICAL +NONHISTONE +NONHISTORICAL +NONHOME +NONHOMOGENEOUS +NONHOMOLOGOUS +NONHOMOSEXUAL +NONHOMOSEXUALS +NONHORMONAL +NONHOSPITAL +NONHOSPITALIZED +NONHOSTILE +NONHOUSING +NONHUMAN +NONHUMANS +NONHUNTER +NONHUNTERS +NONHUNTING +NONHYGROSCOPIC +NONHYSTERICAL +NONIDEAL +NONIDENTICAL +NONIDENTITIES +NONIDENTITY +NONIDEOLOGICAL +NONILLION +NONILLIONS +NONIMAGE +NONIMAGES +NONIMITATIVE +NONIMMIGRANT +NONIMMIGRANTS +NONIMMUNE +NONIMPACT +NONIMPLICATION +NONIMPLICATIONS +NONIMPORTATION +NONIMPORTATIONS +NONINCLUSION +NONINCLUSIONS +NONINCREASING +NONINCUMBENT +NONINCUMBENTS +NONINDEPENDENCE +NONINDIGENOUS +NONINDIVIDUAL +NONINDUCTIVE +NONINDUSTRIAL +NONINDUSTRY +NONINERT +NONINFECTED +NONINFECTIOUS +NONINFECTIVE +NONINFESTED +NONINFLAMMABLE +NONINFLAMMATORY +NONINFLATIONARY +NONINFLECTIONAL +NONINFLUENCE +NONINFLUENCES +NONINFORMATION +NONINFORMATIONS +NONINFRINGEMENT +NONINITIAL +NONINITIATE +NONINITIATES +NONINJURY +NONINSECT +NONINSECTICIDAL +NONINSECTS +NONINSTALLMENT +NONINSTALLMENTS +NONINSTRUMENTAL +NONINSURANCE +NONINSURED +NONINTEGRAL +NONINTEGRATED +NONINTELLECTUAL +NONINTERACTING +NONINTERACTIVE +NONINTERCOURSE +NONINTERCOURSES +NONINTEREST +NONINTERFERENCE +NONINTERSECTING +NONINTERVENTION +NONINTIMIDATING +NONINTOXICANT +NONINTOXICANTS +NONINTOXICATING +NONINTRUSIVE +NONINTUITIVE +NONINVASIVE +NONINVOLVED +NONINVOLVEMENT +NONINVOLVEMENTS +NONIONIC +NONIONIZING +NONIRON +NONIRRADIATED +NONIRRIGATED +NONIRRITANT +NONIRRITANTS +NONIRRITATING +NONISSUE +NONISSUES +NONJOINDER +NONJOINDERS +NONJOINER +NONJOINERS +NONJUDGMENTAL +NONJUDICIAL +NONJURIES +NONJURING +NONJUROR +NONJURORS +NONJURY +NONJUSTICIABLE +NONKOSHER +NONKOSHERS +NONLABOR +NONLANDOWNER +NONLANDOWNERS +NONLANGUAGE +NONLANGUAGES +NONLAWYER +NONLAWYERS +NONLEADED +NONLEAFY +NONLEAGUE +NONLEGAL +NONLEGUME +NONLEGUMES +NONLEGUMINOUS +NONLETHAL +NONLEVEL +NONLEXICAL +NONLIABLE +NONLIBRARIAN +NONLIBRARIANS +NONLIBRARY +NONLIFE +NONLINEAL +NONLINEAR +NONLINEARITIES +NONLINEARITY +NONLINGUISTIC +NONLIQUID +NONLIQUIDS +NONLITERAL +NONLITERARY +NONLITERATE +NONLITERATES +NONLIVES +NONLIVING +NONLIVINGS +NONLOCAL +NONLOCALS +NONLOGICAL +NONLOVING +NONLOYAL +NONLUMINOUS +NONLYRIC +NONMAGNETIC +NONMAINSTREAM +NONMAJOR +NONMAJORS +NONMALIGNANT +NONMALLEABLE +NONMAN +NONMANAGEMENT +NONMANAGERIAL +NONMANUAL +NONMARITAL +NONMARKET +NONMARKETS +NONMATERIAL +NONMATHEMATICAL +NONMATRICULATED +NONMATURE +NONMEANINGFUL +NONMEASURABLE +NONMEAT +NONMECHANICAL +NONMECHANISTIC +NONMEDICAL +NONMEETING +NONMEETINGS +NONMEMBER +NONMEMBERS +NONMEMBERSHIP +NONMEMBERSHIPS +NONMEN +NONMENTAL +NONMERCURIAL +NONMETAL +NONMETALLIC +NONMETALS +NONMETAMERIC +NONMETAPHORICAL +NONMETRIC +NONMETRICAL +NONMETRO +NONMETROPOLITAN +NONMICROBIAL +NONMIGRANT +NONMIGRATORY +NONMILITANT +NONMILITANTS +NONMILITARY +NONMIMETIC +NONMINORITIES +NONMINORITY +NONMOBILE +NONMODAL +NONMODERN +NONMODERNS +NONMOLECULAR +NONMONETARIST +NONMONETARISTS +NONMONETARY +NONMONEY +NONMONOGAMOUS +NONMORAL +NONMORTAL +NONMORTALS +NONMOTILE +NONMOTILITIES +NONMOTILITY +NONMOTORIZED +NONMOVING +NONMUNICIPAL +NONMUSIC +NONMUSICAL +NONMUSICALS +NONMUSICIAN +NONMUSICIANS +NONMUSICS +NONMUTANT +NONMUTANTS +NONMUTUAL +NONMYELINATED +NONMYSTICAL +NONNARRATIVE +NONNASAL +NONNATIONAL +NONNATIONALS +NONNATIVE +NONNATIVES +NONNATURAL +NONNAVAL +NONNECESSITIES +NONNECESSITY +NONNEGATIVE +NONNEGLIGENT +NONNEGOTIABLE +NONNEGOTIABLES +NONNETWORK +NONNEURAL +NONNEWS +NONNITROGENOUS +NONNOBLE +NONNORMAL +NONNORMATIVE +NONNOVEL +NONNOVELS +NONNUCLEAR +NONNUCLEATED +NONNUMERICAL +NONNUTRITIOUS +NONNUTRITIVE +NONOBESE +NONOBJECTIVE +NONOBJECTIVISM +NONOBJECTIVISMS +NONOBJECTIVIST +NONOBJECTIVISTS +NONOBJECTIVITY +NONOBSCENE +NONOBSERVANCE +NONOBSERVANCES +NONOBSERVANT +NONOBVIOUS +NONOCCUPATIONAL +NONOCCURRENCE +NONOCCURRENCES +NONOFFICIAL +NONOFFICIALS +NONOHMIC +NONOILY +NONOPERATIC +NONOPERATING +NONOPERATIONAL +NONOPERATIVE +NONOPTIMAL +NONORAL +NONORALLY +NONORGANIC +NONORGASMIC +NONORTHODOX +NONOVERLAPPING +NONOWNER +NONOWNERS +NONOXIDIZING +NONPAGAN +NONPAGANS +NONPAID +NONPAPAL +NONPAPIST +NONPAPISTS +NONPAR +NONPARALLEL +NONPARAMETRIC +NONPARASITIC +NONPAREIL +NONPAREILS +NONPARENT +NONPARENTS +NONPARITIES +NONPARITY +NONPARTICIPANT +NONPARTICIPANTS +NONPARTIES +NONPARTISAN +NONPARTISANSHIP +NONPARTY +NONPASSERINE +NONPASSIVE +NONPAST +NONPASTS +NONPATHOGENIC +NONPAYING +NONPAYMENT +NONPAYMENTS +NONPEAK +NONPERFORMANCE +NONPERFORMANCES +NONPERFORMER +NONPERFORMERS +NONPERFORMING +NONPERISHABLE +NONPERISHABLES +NONPERMISSIVE +NONPERSISTENT +NONPERSON +NONPERSONAL +NONPERSONS +NONPETROLEUM +NONPHILOSOPHER +NONPHILOSOPHERS +NONPHONEMIC +NONPHONETIC +NONPHOSPHATE +NONPHOTOGRAPHIC +NONPHYSICAL +NONPHYSICIAN +NONPHYSICIANS +NONPLANAR +NONPLASTIC +NONPLASTICS +NONPLAY +NONPLAYER +NONPLAYERS +NONPLAYING +NONPLAYS +NONPLIANT +NONPLUS +NONPLUSED +NONPLUSES +NONPLUSING +NONPLUSSED +NONPLUSSES +NONPLUSSING +NONPOETIC +NONPOINT +NONPOISONOUS +NONPOLAR +NONPOLARIZABLE +NONPOLICE +NONPOLITICAL +NONPOLITICALLY +NONPOLITICIAN +NONPOLITICIANS +NONPOLLUTING +NONPOOR +NONPOROUS +NONPOSSESSION +NONPOSSESSIONS +NONPOSTAL +NONPRACTICAL +NONPRACTICING +NONPREGNANT +NONPRESCRIPTION +NONPRINT +NONPROBLEM +NONPROBLEMS +NONPRODUCING +NONPRODUCTIVE +NONPROFESSIONAL +NONPROFESSORIAL +NONPROFIT +NONPROFITS +NONPROGRAM +NONPROGRAMMER +NONPROGRAMMERS +NONPROGRESSIVE +NONPROPRIETARY +NONPROS +NONPROSSED +NONPROSSES +NONPROSSING +NONPROTEIN +NONPROVEN +NONPSYCHIATRIC +NONPSYCHIATRIST +NONPSYCHOTIC +NONPUBLIC +NONPUNITIVE +NONPURPOSIVE +NONQUANTIFIABLE +NONQUANTITATIVE +NONQUOTA +NONRACIAL +NONRACIALLY +NONRADIOACTIVE +NONRAILROAD +NONRANDOM +NONRANDOMNESS +NONRANDOMNESSES +NONRATED +NONRATIONAL +NONREACTIVE +NONREACTOR +NONREACTORS +NONREADER +NONREADERS +NONREADING +NONREALISTIC +NONRECEIPT +NONRECEIPTS +NONRECIPROCAL +NONRECOGNITION +NONRECOGNITIONS +NONRECOMBINANT +NONRECOMBINANTS +NONRECOURSE +NONRECURRENT +NONRECURRING +NONRECYCLABLE +NONRECYCLABLES +NONREDUCING +NONREDUNDANT +NONREFILLABLE +NONREFLECTING +NONREFUNDABLE +NONREGULATED +NONREGULATION +NONRELATIVE +NONRELATIVES +NONRELATIVISTIC +NONRELEVANT +NONRELIGIOUS +NONRENEWABLE +NONRENEWAL +NONREPAYABLE +NONREPRODUCTIVE +NONRESIDENCE +NONRESIDENCES +NONRESIDENCIES +NONRESIDENCY +NONRESIDENT +NONRESIDENTIAL +NONRESIDENTS +NONRESISTANCE +NONRESISTANCES +NONRESISTANT +NONRESISTANTS +NONRESONANT +NONRESPONDENT +NONRESPONDENTS +NONRESPONDER +NONRESPONDERS +NONRESPONSE +NONRESPONSES +NONRESPONSIVE +NONRESTRICTED +NONRESTRICTIVE +NONRETRACTILE +NONRETROACTIVE +NONRETURNABLE +NONRETURNABLES +NONREUSABLE +NONREVERSIBLE +NONRHOTIC +NONRIGID +NONRIOTER +NONRIOTERS +NONRIOTING +NONRIVAL +NONRIVALS +NONROTATING +NONROUTINE +NONROYAL +NONRUBBER +NONRULING +NONRUMINANT +NONRUMINANTS +NONRURAL +NONSACRED +NONSALABLE +NONSALINE +NONSAPONIFIABLE +NONSCHEDULED +NONSCHOOL +NONSCIENCE +NONSCIENCES +NONSCIENTIFIC +NONSCIENTIST +NONSCIENTISTS +NONSEASONAL +NONSECRET +NONSECRETOR +NONSECRETORS +NONSECRETORY +NONSECRETS +NONSECTARIAN +NONSECURE +NONSEDIMENTABLE +NONSEGREGATED +NONSEGREGATION +NONSEGREGATIONS +NONSELECTED +NONSELECTIVE +NONSELF +NONSELVES +NONSENSATIONAL +NONSENSE +NONSENSES +NONSENSICAL +NONSENSICALLY +NONSENSICALNESS +NONSENSITIVE +NONSENSUOUS +NONSENTENCE +NONSENTENCES +NONSEPTATE +NONSEQUENTIAL +NONSERIAL +NONSERIALS +NONSERIOUS +NONSEXIST +NONSEXUAL +NONSHRINK +NONSHRINKABLE +NONSIGNER +NONSIGNERS +NONSIGNIFICANT +NONSIMULTANEOUS +NONSINKABLE +NONSKATER +NONSKATERS +NONSKED +NONSKEDS +NONSKELETAL +NONSKID +NONSKIER +NONSKIERS +NONSLIP +NONSMOKER +NONSMOKERS +NONSMOKING +NONSOCIAL +NONSOCIALIST +NONSOCIALISTS +NONSOLAR +NONSOLID +NONSOLIDS +NONSOLUTION +NONSOLUTIONS +NONSPATIAL +NONSPEAKER +NONSPEAKERS +NONSPEAKING +NONSPECIALIST +NONSPECIALISTS +NONSPECIFIC +NONSPECIFICALLY +NONSPECTACULAR +NONSPECULATIVE +NONSPEECH +NONSPHERICAL +NONSPORTING +NONSTANDARD +NONSTAPLE +NONSTAPLES +NONSTARTER +NONSTARTERS +NONSTATIC +NONSTATIONARY +NONSTATISTICAL +NONSTEADY +NONSTEROID +NONSTEROIDAL +NONSTEROIDS +NONSTICK +NONSTICKY +NONSTOP +NONSTOPS +NONSTORIES +NONSTORY +NONSTRATEGIC +NONSTRUCTURAL +NONSTRUCTURED +NONSTUDENT +NONSTUDENTS +NONSTYLE +NONSTYLES +NONSUBJECT +NONSUBJECTIVE +NONSUBJECTS +NONSUBSIDIZED +NONSUCCESS +NONSUCCESSES +NONSUCH +NONSUCHES +NONSUGAR +NONSUGARS +NONSUIT +NONSUITED +NONSUITING +NONSUITS +NONSUPERVISORY +NONSUPPORT +NONSUPPORTS +NONSURGICAL +NONSWIMMER +NONSWIMMERS +NONSYLLABIC +NONSYMBOLIC +NONSYMMETRIC +NONSYMMETRICAL +NONSYNCHRONOUS +NONSYSTEM +NONSYSTEMATIC +NONSYSTEMIC +NONSYSTEMS +NONTALKER +NONTALKERS +NONTARGET +NONTARIFF +NONTAX +NONTAXABLE +NONTAXES +NONTEACHING +NONTECHNICAL +NONTEMPORAL +NONTENURED +NONTERMINAL +NONTERMINALS +NONTERMINATING +NONTHEATRICAL +NONTHEIST +NONTHEISTIC +NONTHEISTS +NONTHEOLOGICAL +NONTHEORETICAL +NONTHERAPEUTIC +NONTHERMAL +NONTHINKING +NONTHREATENING +NONTIDAL +NONTITLE +NONTOBACCO +NONTONAL +NONTONIC +NONTOTALITARIAN +NONTOXIC +NONTRADITIONAL +NONTRAGIC +NONTRANSFERABLE +NONTREATMENT +NONTREATMENTS +NONTRIBAL +NONTRIVIAL +NONTROPICAL +NONTRUMP +NONTRUTH +NONTRUTHS +NONTURBULENT +NONTYPICAL +NONUNANIMOUS +NONUNIFORM +NONUNIFORMITIES +NONUNIFORMITY +NONUNION +NONUNIONIZED +NONUNIONS +NONUNIQUE +NONUNIQUENESS +NONUNIQUENESSES +NONUNIVERSAL +NONUNIVERSITY +NONUPLE +NONUPLES +NONURBAN +NONURGENT +NONUSABLE +NONUSE +NONUSER +NONUSERS +NONUSES +NONUSING +NONUTILITARIAN +NONUTILITIES +NONUTILITY +NONUTOPIAN +NONVACANT +NONVALID +NONVALIDITIES +NONVALIDITY +NONVANISHING +NONVASCULAR +NONVECTOR +NONVECTORS +NONVEGETARIAN +NONVEGETARIANS +NONVENOMOUS +NONVENOUS +NONVERBAL +NONVERBALLY +NONVESTED +NONVETERAN +NONVETERANS +NONVIABLE +NONVIEWER +NONVIEWERS +NONVINTAGE +NONVIOLENCE +NONVIOLENCES +NONVIOLENT +NONVIOLENTLY +NONVIRAL +NONVIRGIN +NONVIRGINS +NONVIRILE +NONVISCOUS +NONVISUAL +NONVITAL +NONVOCAL +NONVOCALS +NONVOCATIONAL +NONVOLATILE +NONVOLCANIC +NONVOLUNTARY +NONVOTER +NONVOTERS +NONVOTING +NONWAGE +NONWAR +NONWARS +NONWHITE +NONWHITES +NONWINGED +NONWINNING +NONWOODY +NONWOOL +NONWORD +NONWORDS +NONWORK +NONWORKER +NONWORKERS +NONWORKING +NONWOVEN +NONWOVENS +NONWRITER +NONWRITERS +NONYELLOWING +NONYL +NONYLS +NONZERO +NOO +NOODGE +NOODGED +NOODGES +NOODGING +NOODLE +NOODLED +NOODLES +NOODLING +NOOGIE +NOOGIES +NOOK +NOOKIE +NOOKIES +NOOKLIKE +NOOKS +NOOKY +NOON +NOONDAY +NOONDAYS +NOONING +NOONINGS +NOONS +NOONTIDE +NOONTIDES +NOONTIME +NOONTIMES +NOOSE +NOOSED +NOOSER +NOOSERS +NOOSES +NOOSING +NOOSPHERE +NOOSPHERES +NOOTROPIC +NOOTROPICS +NOPAL +NOPALES +NOPALITO +NOPALITOS +NOPALS +NOPE +NOPLACE +NOR +NORADRENALIN +NORADRENALINE +NORADRENALINES +NORADRENALINS +NORADRENERGIC +NORDIC +NOREPINEPHRINE +NOREPINEPHRINES +NORETHINDRONE +NORETHINDRONES +NORI +NORIA +NORIAS +NORIS +NORITE +NORITES +NORITIC +NORLAND +NORLANDS +NORM +NORMAL +NORMALCIES +NORMALCY +NORMALISE +NORMALISED +NORMALISES +NORMALISING +NORMALITIES +NORMALITY +NORMALIZABLE +NORMALIZATION +NORMALIZATIONS +NORMALIZE +NORMALIZED +NORMALIZER +NORMALIZERS +NORMALIZES +NORMALIZING +NORMALLY +NORMALS +NORMANDE +NORMATIVE +NORMATIVELY +NORMATIVENESS +NORMATIVENESSES +NORMED +NORMLESS +NORMOTENSIVE +NORMOTENSIVES +NORMOTHERMIA +NORMOTHERMIAS +NORMOTHERMIC +NORMS +NORTH +NORTHBOUND +NORTHEAST +NORTHEASTER +NORTHEASTERLY +NORTHEASTERN +NORTHEASTERS +NORTHEASTS +NORTHEASTWARD +NORTHEASTWARDS +NORTHER +NORTHERLIES +NORTHERLY +NORTHERN +NORTHERNMOST +NORTHERNS +NORTHERS +NORTHING +NORTHINGS +NORTHLAND +NORTHLANDS +NORTHMOST +NORTHS +NORTHWARD +NORTHWARDS +NORTHWEST +NORTHWESTER +NORTHWESTERLY +NORTHWESTERN +NORTHWESTERS +NORTHWESTS +NORTHWESTWARD +NORTHWESTWARDS +NORTRIPTYLINE +NORTRIPTYLINES +NOS +NOSE +NOSEBAG +NOSEBAGS +NOSEBAND +NOSEBANDS +NOSEBLEED +NOSEBLEEDS +NOSED +NOSEDIVE +NOSEDIVED +NOSEDIVES +NOSEDIVING +NOSEDOVE +NOSEGAY +NOSEGAYS +NOSEGUARD +NOSEGUARDS +NOSELESS +NOSELIKE +NOSEPIECE +NOSEPIECES +NOSES +NOSEWHEEL +NOSEWHEELS +NOSEY +NOSH +NOSHED +NOSHER +NOSHERS +NOSHES +NOSHING +NOSIER +NOSIEST +NOSILY +NOSINESS +NOSINESSES +NOSING +NOSINGS +NOSOCOMIAL +NOSOLOGIC +NOSOLOGICAL +NOSOLOGICALLY +NOSOLOGIES +NOSOLOGY +NOSTALGIA +NOSTALGIAS +NOSTALGIC +NOSTALGICALLY +NOSTALGICS +NOSTALGIST +NOSTALGISTS +NOSTOC +NOSTOCS +NOSTOLOGIES +NOSTOLOGY +NOSTRIL +NOSTRILS +NOSTRUM +NOSTRUMS +NOSY +NOT +NOTA +NOTABILIA +NOTABILITIES +NOTABILITY +NOTABLE +NOTABLENESS +NOTABLENESSES +NOTABLES +NOTABLY +NOTAL +NOTARIAL +NOTARIALLY +NOTARIES +NOTARIZATION +NOTARIZATIONS +NOTARIZE +NOTARIZED +NOTARIZES +NOTARIZING +NOTARY +NOTATE +NOTATED +NOTATES +NOTATING +NOTATION +NOTATIONAL +NOTATIONS +NOTCH +NOTCHBACK +NOTCHBACKS +NOTCHED +NOTCHER +NOTCHERS +NOTCHES +NOTCHING +NOTE +NOTEBOOK +NOTEBOOKS +NOTECARD +NOTECARDS +NOTECASE +NOTECASES +NOTED +NOTEDLY +NOTEDNESS +NOTEDNESSES +NOTELESS +NOTEPAD +NOTEPADS +NOTEPAPER +NOTEPAPERS +NOTER +NOTERS +NOTES +NOTEWORTHILY +NOTEWORTHINESS +NOTEWORTHY +NOTHER +NOTHING +NOTHINGNESS +NOTHINGNESSES +NOTHINGS +NOTICE +NOTICEABLE +NOTICEABLY +NOTICED +NOTICER +NOTICERS +NOTICES +NOTICING +NOTIFIABLE +NOTIFICATION +NOTIFICATIONS +NOTIFIED +NOTIFIER +NOTIFIERS +NOTIFIES +NOTIFY +NOTIFYING +NOTING +NOTION +NOTIONAL +NOTIONALITIES +NOTIONALITY +NOTIONALLY +NOTIONS +NOTOCHORD +NOTOCHORDAL +NOTOCHORDS +NOTORIETIES +NOTORIETY +NOTORIOUS +NOTORIOUSLY +NOTORNIS +NOTTURNI +NOTTURNO +NOTUM +NOTWITHSTANDING +NOUGAT +NOUGATS +NOUGHT +NOUGHTS +NOUMENA +NOUMENAL +NOUMENON +NOUN +NOUNAL +NOUNALLY +NOUNLESS +NOUNS +NOURISH +NOURISHED +NOURISHER +NOURISHERS +NOURISHES +NOURISHING +NOURISHMENT +NOURISHMENTS +NOUS +NOUSES +NOUVEAU +NOUVELLE +NOUVELLES +NOVA +NOVACULITE +NOVACULITES +NOVAE +NOVALIKE +NOVAS +NOVATION +NOVATIONS +NOVEL +NOVELETTE +NOVELETTES +NOVELETTISH +NOVELISE +NOVELISED +NOVELISES +NOVELISING +NOVELIST +NOVELISTIC +NOVELISTICALLY +NOVELISTS +NOVELIZATION +NOVELIZATIONS +NOVELIZE +NOVELIZED +NOVELIZER +NOVELIZERS +NOVELIZES +NOVELIZING +NOVELLA +NOVELLAS +NOVELLE +NOVELLY +NOVELS +NOVELTIES +NOVELTY +NOVEMDECILLION +NOVEMDECILLIONS +NOVENA +NOVENAE +NOVENAS +NOVERCAL +NOVICE +NOVICES +NOVICIATE +NOVICIATES +NOVITIATE +NOVITIATES +NOVOBIOCIN +NOVOBIOCINS +NOVOCAINE +NOVOCAINES +NOW +NOWADAYS +NOWAY +NOWAYS +NOWHERE +NOWHERES +NOWHITHER +NOWISE +NOWNESS +NOWNESSES +NOWS +NOWT +NOWTS +NOXIOUS +NOXIOUSLY +NOXIOUSNESS +NOXIOUSNESSES +NOYADE +NOYADES +NOZZLE +NOZZLES +NTH +NU +NUANCE +NUANCED +NUANCES +NUB +NUBBIER +NUBBIEST +NUBBIN +NUBBINESS +NUBBINESSES +NUBBINS +NUBBLE +NUBBLES +NUBBLIER +NUBBLIEST +NUBBLY +NUBBY +NUBIA +NUBIAS +NUBILE +NUBILITIES +NUBILITY +NUBILOSE +NUBILOUS +NUBS +NUBUCK +NUBUCKS +NUCELLAR +NUCELLI +NUCELLUS +NUCHA +NUCHAE +NUCHAL +NUCHALS +NUCLEAL +NUCLEAR +NUCLEASE +NUCLEASES +NUCLEATE +NUCLEATED +NUCLEATES +NUCLEATING +NUCLEATION +NUCLEATIONS +NUCLEATOR +NUCLEATORS +NUCLEI +NUCLEIN +NUCLEINIC +NUCLEINS +NUCLEOCAPSID +NUCLEOCAPSIDS +NUCLEOID +NUCLEOIDS +NUCLEOLAR +NUCLEOLE +NUCLEOLES +NUCLEOLI +NUCLEOLUS +NUCLEON +NUCLEONIC +NUCLEONICS +NUCLEONS +NUCLEOPHILE +NUCLEOPHILES +NUCLEOPHILIC +NUCLEOPHILICITY +NUCLEOPLASM +NUCLEOPLASMIC +NUCLEOPLASMS +NUCLEOPROTEIN +NUCLEOPROTEINS +NUCLEOSIDE +NUCLEOSIDES +NUCLEOSOMAL +NUCLEOSOME +NUCLEOSOMES +NUCLEOSYNTHESES +NUCLEOSYNTHESIS +NUCLEOSYNTHETIC +NUCLEOTIDASE +NUCLEOTIDASES +NUCLEOTIDE +NUCLEOTIDES +NUCLEUS +NUCLEUSES +NUCLIDE +NUCLIDES +NUCLIDIC +NUDE +NUDELY +NUDENESS +NUDENESSES +NUDER +NUDES +NUDEST +NUDGE +NUDGED +NUDGER +NUDGERS +NUDGES +NUDGING +NUDIBRANCH +NUDIBRANCHS +NUDICAUL +NUDIE +NUDIES +NUDISM +NUDISMS +NUDIST +NUDISTS +NUDITIES +NUDITY +NUDNICK +NUDNICKS +NUDNIK +NUDNIKS +NUDZH +NUDZHED +NUDZHES +NUDZHING +NUGATORY +NUGGET +NUGGETS +NUGGETY +NUISANCE +NUISANCES +NUKE +NUKED +NUKES +NUKING +NULL +NULLAH +NULLAHS +NULLED +NULLIFICATION +NULLIFICATIONS +NULLIFIED +NULLIFIER +NULLIFIERS +NULLIFIES +NULLIFY +NULLIFYING +NULLING +NULLIPARA +NULLIPARAE +NULLIPARAS +NULLIPAROUS +NULLIPORE +NULLIPORES +NULLITIES +NULLITY +NULLS +NUMB +NUMBAT +NUMBATS +NUMBED +NUMBER +NUMBERABLE +NUMBERED +NUMBERER +NUMBERERS +NUMBERING +NUMBERLESS +NUMBERS +NUMBEST +NUMBFISH +NUMBFISHES +NUMBING +NUMBINGLY +NUMBLES +NUMBLY +NUMBNESS +NUMBNESSES +NUMBS +NUMBSKULL +NUMBSKULLS +NUMCHUCK +NUMCHUCKS +NUMEN +NUMERABLE +NUMERABLY +NUMERACIES +NUMERACY +NUMERAL +NUMERALLY +NUMERALS +NUMERARY +NUMERATE +NUMERATED +NUMERATES +NUMERATING +NUMERATION +NUMERATIONS +NUMERATOR +NUMERATORS +NUMERIC +NUMERICAL +NUMERICALLY +NUMERICS +NUMEROLOGICAL +NUMEROLOGIES +NUMEROLOGIST +NUMEROLOGISTS +NUMEROLOGY +NUMEROUS +NUMEROUSLY +NUMEROUSNESS +NUMEROUSNESSES +NUMINA +NUMINOUS +NUMINOUSNESS +NUMINOUSNESSES +NUMISMATIC +NUMISMATICALLY +NUMISMATICS +NUMISMATIST +NUMISMATISTS +NUMMARY +NUMMULAR +NUMMULITE +NUMMULITES +NUMSKULL +NUMSKULLS +NUN +NUNATAK +NUNATAKS +NUNCHAKU +NUNCHAKUS +NUNCIATURE +NUNCIATURES +NUNCIO +NUNCIOS +NUNCLE +NUNCLES +NUNCUPATIVE +NUNLIKE +NUNNATION +NUNNATIONS +NUNNERIES +NUNNERY +NUNNISH +NUNS +NUPTIAL +NUPTIALITIES +NUPTIALITY +NUPTIALLY +NUPTIALS +NURD +NURDS +NURL +NURLED +NURLING +NURLS +NURSE +NURSED +NURSEMAID +NURSEMAIDS +NURSER +NURSERIES +NURSERS +NURSERY +NURSERYMAN +NURSERYMEN +NURSES +NURSING +NURSINGS +NURSLING +NURSLINGS +NURTURAL +NURTURANCE +NURTURANCES +NURTURANT +NURTURE +NURTURED +NURTURER +NURTURERS +NURTURES +NURTURING +NUS +NUT +NUTANT +NUTATE +NUTATED +NUTATES +NUTATING +NUTATION +NUTATIONAL +NUTATIONS +NUTBROWN +NUTCASE +NUTCASES +NUTCRACKER +NUTCRACKERS +NUTGALL +NUTGALLS +NUTGRASS +NUTGRASSES +NUTHATCH +NUTHATCHES +NUTHOUSE +NUTHOUSES +NUTLET +NUTLETS +NUTLIKE +NUTMEAT +NUTMEATS +NUTMEG +NUTMEGS +NUTPICK +NUTPICKS +NUTRACEUTICAL +NUTRACEUTICALS +NUTRIA +NUTRIAS +NUTRIENT +NUTRIENTS +NUTRIMENT +NUTRIMENTS +NUTRITION +NUTRITIONAL +NUTRITIONALLY +NUTRITIONIST +NUTRITIONISTS +NUTRITIONS +NUTRITIOUS +NUTRITIOUSLY +NUTRITIOUSNESS +NUTRITIVE +NUTRITIVELY +NUTRITIVES +NUTS +NUTSEDGE +NUTSEDGES +NUTSHELL +NUTSHELLS +NUTSIER +NUTSIEST +NUTSY +NUTTED +NUTTER +NUTTERS +NUTTIER +NUTTIEST +NUTTILY +NUTTINESS +NUTTINESSES +NUTTING +NUTTINGS +NUTTY +NUTWOOD +NUTWOODS +NUZZLE +NUZZLED +NUZZLER +NUZZLERS +NUZZLES +NUZZLING +NYALA +NYALAS +NYCTALOPIA +NYCTALOPIAS +NYLGHAI +NYLGHAIS +NYLGHAU +NYLGHAUS +NYLON +NYLONS +NYMPH +NYMPHA +NYMPHAE +NYMPHAL +NYMPHALID +NYMPHALIDS +NYMPHEAN +NYMPHET +NYMPHETIC +NYMPHETS +NYMPHETTE +NYMPHETTES +NYMPHO +NYMPHOLEPSIES +NYMPHOLEPSY +NYMPHOLEPT +NYMPHOLEPTIC +NYMPHOLEPTS +NYMPHOMANIA +NYMPHOMANIAC +NYMPHOMANIACAL +NYMPHOMANIACS +NYMPHOMANIAS +NYMPHOS +NYMPHS +NYSTAGMIC +NYSTAGMUS +NYSTAGMUSES +NYSTATIN +NYSTATINS +OAF +OAFISH +OAFISHLY +OAFISHNESS +OAFISHNESSES +OAFS +OAK +OAKEN +OAKIER +OAKIEST +OAKLIKE +OAKMOSS +OAKMOSSES +OAKS +OAKUM +OAKUMS +OAKY +OAR +OARED +OARFISH +OARFISHES +OARING +OARLESS +OARLIKE +OARLOCK +OARLOCKS +OARS +OARSMAN +OARSMANSHIP +OARSMANSHIPS +OARSMEN +OARSWOMAN +OARSWOMEN +OASES +OASIS +OAST +OASTHOUSE +OASTHOUSES +OASTS +OAT +OATCAKE +OATCAKES +OATEN +OATER +OATERS +OATH +OATHS +OATLIKE +OATMEAL +OATMEALS +OATS +OAVES +OBA +OBAS +OBBLIGATI +OBBLIGATO +OBBLIGATOS +OBCONIC +OBCONICAL +OBCORDATE +OBDURACIES +OBDURACY +OBDURATE +OBDURATELY +OBDURATENESS +OBDURATENESSES +OBE +OBEAH +OBEAHISM +OBEAHISMS +OBEAHS +OBEDIENCE +OBEDIENCES +OBEDIENT +OBEDIENTLY +OBEISANCE +OBEISANCES +OBEISANT +OBEISANTLY +OBELI +OBELIA +OBELIAS +OBELISCAL +OBELISE +OBELISED +OBELISES +OBELISING +OBELISK +OBELISKS +OBELISM +OBELISMS +OBELIZE +OBELIZED +OBELIZES +OBELIZING +OBELUS +OBENTO +OBENTOS +OBES +OBESE +OBESELY +OBESENESS +OBESENESSES +OBESITIES +OBESITY +OBEY +OBEYABLE +OBEYED +OBEYER +OBEYERS +OBEYING +OBEYS +OBFUSCATE +OBFUSCATED +OBFUSCATES +OBFUSCATING +OBFUSCATION +OBFUSCATIONS +OBFUSCATORY +OBI +OBIA +OBIAS +OBIISM +OBIISMS +OBIS +OBIT +OBITS +OBITUARIES +OBITUARIST +OBITUARISTS +OBITUARY +OBJECT +OBJECTED +OBJECTIFICATION +OBJECTIFIED +OBJECTIFIES +OBJECTIFY +OBJECTIFYING +OBJECTING +OBJECTION +OBJECTIONABLE +OBJECTIONABLY +OBJECTIONS +OBJECTIVE +OBJECTIVELY +OBJECTIVENESS +OBJECTIVENESSES +OBJECTIVES +OBJECTIVISM +OBJECTIVISMS +OBJECTIVIST +OBJECTIVISTIC +OBJECTIVISTS +OBJECTIVITIES +OBJECTIVITY +OBJECTLESS +OBJECTLESSNESS +OBJECTOR +OBJECTORS +OBJECTS +OBJET +OBJETS +OBJURGATE +OBJURGATED +OBJURGATES +OBJURGATING +OBJURGATION +OBJURGATIONS +OBJURGATORY +OBLANCEOLATE +OBLAST +OBLASTI +OBLASTS +OBLATE +OBLATELY +OBLATENESS +OBLATENESSES +OBLATES +OBLATION +OBLATIONS +OBLATORY +OBLIGABLE +OBLIGATE +OBLIGATED +OBLIGATELY +OBLIGATES +OBLIGATI +OBLIGATING +OBLIGATION +OBLIGATIONS +OBLIGATO +OBLIGATOR +OBLIGATORILY +OBLIGATORS +OBLIGATORY +OBLIGATOS +OBLIGE +OBLIGED +OBLIGEE +OBLIGEES +OBLIGER +OBLIGERS +OBLIGES +OBLIGING +OBLIGINGLY +OBLIGINGNESS +OBLIGINGNESSES +OBLIGOR +OBLIGORS +OBLIQUE +OBLIQUED +OBLIQUELY +OBLIQUENESS +OBLIQUENESSES +OBLIQUES +OBLIQUING +OBLIQUITIES +OBLIQUITY +OBLITERATE +OBLITERATED +OBLITERATES +OBLITERATING +OBLITERATION +OBLITERATIONS +OBLITERATIVE +OBLITERATOR +OBLITERATORS +OBLIVION +OBLIVIONS +OBLIVIOUS +OBLIVIOUSLY +OBLIVIOUSNESS +OBLIVIOUSNESSES +OBLONG +OBLONGLY +OBLONGS +OBLOQUIAL +OBLOQUIES +OBLOQUY +OBNOXIOUS +OBNOXIOUSLY +OBNOXIOUSNESS +OBNOXIOUSNESSES +OBNUBILATE +OBNUBILATED +OBNUBILATES +OBNUBILATING +OBNUBILATION +OBNUBILATIONS +OBOE +OBOES +OBOIST +OBOISTS +OBOL +OBOLE +OBOLES +OBOLI +OBOLS +OBOLUS +OBOVATE +OBOVOID +OBSCENE +OBSCENELY +OBSCENER +OBSCENEST +OBSCENITIES +OBSCENITY +OBSCURANT +OBSCURANTIC +OBSCURANTISM +OBSCURANTISMS +OBSCURANTIST +OBSCURANTISTS +OBSCURANTS +OBSCURATION +OBSCURATIONS +OBSCURE +OBSCURED +OBSCURELY +OBSCURENESS +OBSCURENESSES +OBSCURER +OBSCURES +OBSCUREST +OBSCURING +OBSCURITIES +OBSCURITY +OBSECRATE +OBSECRATED +OBSECRATES +OBSECRATING +OBSEQUIES +OBSEQUIOUS +OBSEQUIOUSLY +OBSEQUIOUSNESS +OBSEQUY +OBSERVABILITIES +OBSERVABILITY +OBSERVABLE +OBSERVABLES +OBSERVABLY +OBSERVANCE +OBSERVANCES +OBSERVANT +OBSERVANTLY +OBSERVANTS +OBSERVATION +OBSERVATIONAL +OBSERVATIONALLY +OBSERVATIONS +OBSERVATORIES +OBSERVATORY +OBSERVE +OBSERVED +OBSERVER +OBSERVERS +OBSERVES +OBSERVING +OBSERVINGLY +OBSESS +OBSESSED +OBSESSES +OBSESSING +OBSESSION +OBSESSIONAL +OBSESSIONALLY +OBSESSIONS +OBSESSIVE +OBSESSIVELY +OBSESSIVENESS +OBSESSIVENESSES +OBSESSIVES +OBSESSOR +OBSESSORS +OBSIDIAN +OBSIDIANS +OBSOLESCE +OBSOLESCED +OBSOLESCENCE +OBSOLESCENCES +OBSOLESCENT +OBSOLESCENTLY +OBSOLESCES +OBSOLESCING +OBSOLETE +OBSOLETED +OBSOLETELY +OBSOLETENESS +OBSOLETENESSES +OBSOLETES +OBSOLETING +OBSTACLE +OBSTACLES +OBSTETRIC +OBSTETRICAL +OBSTETRICALLY +OBSTETRICIAN +OBSTETRICIANS +OBSTETRICS +OBSTINACIES +OBSTINACY +OBSTINATE +OBSTINATELY +OBSTINATENESS +OBSTINATENESSES +OBSTREPEROUS +OBSTREPEROUSLY +OBSTRUCT +OBSTRUCTED +OBSTRUCTING +OBSTRUCTION +OBSTRUCTIONISM +OBSTRUCTIONISMS +OBSTRUCTIONIST +OBSTRUCTIONISTS +OBSTRUCTIONS +OBSTRUCTIVE +OBSTRUCTIVENESS +OBSTRUCTIVES +OBSTRUCTOR +OBSTRUCTORS +OBSTRUCTS +OBSTRUENT +OBSTRUENTS +OBTAIN +OBTAINABILITIES +OBTAINABILITY +OBTAINABLE +OBTAINED +OBTAINER +OBTAINERS +OBTAINING +OBTAINMENT +OBTAINMENTS +OBTAINS +OBTECT +OBTECTED +OBTEST +OBTESTED +OBTESTING +OBTESTS +OBTRUDE +OBTRUDED +OBTRUDER +OBTRUDERS +OBTRUDES +OBTRUDING +OBTRUSION +OBTRUSIONS +OBTRUSIVE +OBTRUSIVELY +OBTRUSIVENESS +OBTRUSIVENESSES +OBTUND +OBTUNDED +OBTUNDENT +OBTUNDENTS +OBTUNDING +OBTUNDITIES +OBTUNDITY +OBTUNDS +OBTURATE +OBTURATED +OBTURATES +OBTURATING +OBTURATION +OBTURATIONS +OBTURATOR +OBTURATORS +OBTUSE +OBTUSELY +OBTUSENESS +OBTUSENESSES +OBTUSER +OBTUSEST +OBTUSITIES +OBTUSITY +OBVERSE +OBVERSELY +OBVERSES +OBVERSION +OBVERSIONS +OBVERT +OBVERTED +OBVERTING +OBVERTS +OBVIABLE +OBVIATE +OBVIATED +OBVIATES +OBVIATING +OBVIATION +OBVIATIONS +OBVIATOR +OBVIATORS +OBVIOUS +OBVIOUSLY +OBVIOUSNESS +OBVIOUSNESSES +OBVOLUTE +OCA +OCARINA +OCARINAS +OCAS +OCCASION +OCCASIONAL +OCCASIONALLY +OCCASIONED +OCCASIONING +OCCASIONS +OCCIDENT +OCCIDENTAL +OCCIDENTALIZE +OCCIDENTALIZED +OCCIDENTALIZES +OCCIDENTALIZING +OCCIDENTALLY +OCCIDENTS +OCCIPITA +OCCIPITAL +OCCIPITALLY +OCCIPITALS +OCCIPUT +OCCIPUTS +OCCLUDE +OCCLUDED +OCCLUDENT +OCCLUDES +OCCLUDING +OCCLUSAL +OCCLUSION +OCCLUSIONS +OCCLUSIVE +OCCLUSIVES +OCCULT +OCCULTATION +OCCULTATIONS +OCCULTED +OCCULTER +OCCULTERS +OCCULTING +OCCULTISM +OCCULTISMS +OCCULTIST +OCCULTISTS +OCCULTLY +OCCULTS +OCCUPANCIES +OCCUPANCY +OCCUPANT +OCCUPANTS +OCCUPATION +OCCUPATIONAL +OCCUPATIONALLY +OCCUPATIONS +OCCUPIED +OCCUPIER +OCCUPIERS +OCCUPIES +OCCUPY +OCCUPYING +OCCUR +OCCURRED +OCCURRENCE +OCCURRENCES +OCCURRENT +OCCURRENTS +OCCURRING +OCCURS +OCEAN +OCEANARIA +OCEANARIUM +OCEANARIUMS +OCEANAUT +OCEANAUTS +OCEANFRONT +OCEANFRONTS +OCEANGOING +OCEANIC +OCEANOGRAPHER +OCEANOGRAPHERS +OCEANOGRAPHIC +OCEANOGRAPHICAL +OCEANOGRAPHIES +OCEANOGRAPHY +OCEANOLOGIES +OCEANOLOGIST +OCEANOLOGISTS +OCEANOLOGY +OCEANS +OCELLAR +OCELLATE +OCELLATED +OCELLI +OCELLUS +OCELOID +OCELOT +OCELOTS +OCHER +OCHERED +OCHERING +OCHEROUS +OCHERS +OCHERY +OCHLOCRACIES +OCHLOCRACY +OCHLOCRAT +OCHLOCRATIC +OCHLOCRATICAL +OCHLOCRATS +OCHONE +OCHRE +OCHREA +OCHREAE +OCHRED +OCHREOUS +OCHRES +OCHRING +OCHROID +OCHROUS +OCHRY +OCICAT +OCICATS +OCKER +OCKERS +OCOTILLO +OCOTILLOS +OCREA +OCREAE +OCREATE +OCTACHORD +OCTACHORDS +OCTAD +OCTADIC +OCTADS +OCTAGON +OCTAGONAL +OCTAGONALLY +OCTAGONS +OCTAHEDRA +OCTAHEDRAL +OCTAHEDRALLY +OCTAHEDRON +OCTAHEDRONS +OCTAL +OCTAMETER +OCTAMETERS +OCTAN +OCTANE +OCTANES +OCTANGLE +OCTANGLES +OCTANOL +OCTANOLS +OCTANS +OCTANT +OCTANTAL +OCTANTS +OCTAPEPTIDE +OCTAPEPTIDES +OCTARCHIES +OCTARCHY +OCTAVAL +OCTAVE +OCTAVES +OCTAVO +OCTAVOS +OCTENNIAL +OCTET +OCTETS +OCTETTE +OCTETTES +OCTILLION +OCTILLIONS +OCTODECILLION +OCTODECILLIONS +OCTOGENARIAN +OCTOGENARIANS +OCTONARIES +OCTONARY +OCTOPI +OCTOPLOID +OCTOPLOIDS +OCTOPOD +OCTOPODAN +OCTOPODANS +OCTOPODES +OCTOPODS +OCTOPUS +OCTOPUSES +OCTOROON +OCTOROONS +OCTOSYLLABIC +OCTOSYLLABICS +OCTOSYLLABLE +OCTOSYLLABLES +OCTOTHORP +OCTOTHORPS +OCTROI +OCTROIS +OCTUPLE +OCTUPLED +OCTUPLES +OCTUPLET +OCTUPLETS +OCTUPLEX +OCTUPLING +OCTUPLY +OCTYL +OCTYLS +OCULAR +OCULARIST +OCULARISTS +OCULARLY +OCULARS +OCULI +OCULIST +OCULISTS +OCULOMOTOR +OCULUS +OD +ODA +ODAH +ODAHS +ODALISK +ODALISKS +ODALISQUE +ODALISQUES +ODAS +ODD +ODDBALL +ODDBALLS +ODDER +ODDEST +ODDISH +ODDITIES +ODDITY +ODDLY +ODDMENT +ODDMENTS +ODDNESS +ODDNESSES +ODDS +ODDSMAKER +ODDSMAKERS +ODE +ODEA +ODEON +ODEONS +ODES +ODEUM +ODEUMS +ODIC +ODIFEROUS +ODIOUS +ODIOUSLY +ODIOUSNESS +ODIOUSNESSES +ODIST +ODISTS +ODIUM +ODIUMS +ODOGRAPH +ODOGRAPHS +ODOMETER +ODOMETERS +ODOMETRIES +ODOMETRY +ODONATE +ODONATES +ODONTOBLAST +ODONTOBLASTIC +ODONTOBLASTS +ODONTOGLOSSUM +ODONTOGLOSSUMS +ODONTOID +ODONTOIDS +ODOR +ODORANT +ODORANTS +ODORED +ODORFUL +ODORIFEROUS +ODORIFEROUSLY +ODORIFEROUSNESS +ODORIZE +ODORIZED +ODORIZES +ODORIZING +ODORLESS +ODOROUS +ODOROUSLY +ODOROUSNESS +ODOROUSNESSES +ODORS +ODOUR +ODOURFUL +ODOURS +ODS +ODYL +ODYLE +ODYLES +ODYLS +ODYSSEY +ODYSSEYS +OE +OECOLOGIES +OECOLOGY +OECUMENICAL +OEDEMA +OEDEMAS +OEDEMATA +OEDIPAL +OEDIPALLY +OEDIPEAN +OEILLADE +OEILLADES +OENOLOGIES +OENOLOGY +OENOMEL +OENOMELS +OENOPHILE +OENOPHILES +OERSTED +OERSTEDS +OES +OESOPHAGI +OESOPHAGUS +OESTRIN +OESTRINS +OESTRIOL +OESTRIOLS +OESTROGEN +OESTROGENS +OESTRONE +OESTRONES +OESTROUS +OESTRUM +OESTRUMS +OESTRUS +OESTRUSES +OEUVRE +OEUVRES +OF +OFAY +OFAYS +OFF +OFFAL +OFFALS +OFFBEAT +OFFBEATS +OFFCAST +OFFCASTS +OFFCUT +OFFCUTS +OFFED +OFFENCE +OFFENCES +OFFEND +OFFENDED +OFFENDER +OFFENDERS +OFFENDING +OFFENDS +OFFENSE +OFFENSELESS +OFFENSES +OFFENSIVE +OFFENSIVELY +OFFENSIVENESS +OFFENSIVENESSES +OFFENSIVES +OFFER +OFFERED +OFFERER +OFFERERS +OFFERING +OFFERINGS +OFFEROR +OFFERORS +OFFERS +OFFERTORIES +OFFERTORY +OFFHAND +OFFHANDED +OFFHANDEDLY +OFFHANDEDNESS +OFFHANDEDNESSES +OFFICE +OFFICEHOLDER +OFFICEHOLDERS +OFFICER +OFFICERED +OFFICERING +OFFICERS +OFFICES +OFFICIAL +OFFICIALDOM +OFFICIALDOMS +OFFICIALESE +OFFICIALESES +OFFICIALISM +OFFICIALISMS +OFFICIALLY +OFFICIALS +OFFICIANT +OFFICIANTS +OFFICIARIES +OFFICIARY +OFFICIATE +OFFICIATED +OFFICIATES +OFFICIATING +OFFICIATION +OFFICIATIONS +OFFICINAL +OFFICINALS +OFFICIOUS +OFFICIOUSLY +OFFICIOUSNESS +OFFICIOUSNESSES +OFFING +OFFINGS +OFFISH +OFFISHLY +OFFISHNESS +OFFISHNESSES +OFFKEY +OFFLINE +OFFLOAD +OFFLOADED +OFFLOADING +OFFLOADS +OFFPRINT +OFFPRINTED +OFFPRINTING +OFFPRINTS +OFFRAMP +OFFRAMPS +OFFS +OFFSCOURING +OFFSCOURINGS +OFFSCREEN +OFFSET +OFFSETS +OFFSETTING +OFFSHOOT +OFFSHOOTS +OFFSHORE +OFFSHORES +OFFSIDE +OFFSIDES +OFFSPRING +OFFSPRINGS +OFFSTAGE +OFFSTAGES +OFFTRACK +OFT +OFTEN +OFTENER +OFTENEST +OFTENTIMES +OFTER +OFTEST +OFTTIMES +OGAM +OGAMS +OGDOAD +OGDOADS +OGEE +OGEES +OGHAM +OGHAMIC +OGHAMIST +OGHAMISTS +OGHAMS +OGIVAL +OGIVE +OGIVES +OGLE +OGLED +OGLER +OGLERS +OGLES +OGLING +OGRE +OGREISH +OGREISHLY +OGREISM +OGREISMS +OGRES +OGRESS +OGRESSES +OGRISH +OGRISHLY +OGRISM +OGRISMS +OH +OHED +OHIA +OHIAS +OHING +OHM +OHMAGE +OHMAGES +OHMIC +OHMICALLY +OHMMETER +OHMMETERS +OHMS +OHO +OHS +OI +OIDIA +OIDIOID +OIDIUM +OIL +OILBIRD +OILBIRDS +OILCAMP +OILCAMPS +OILCAN +OILCANS +OILCLOTH +OILCLOTHS +OILCUP +OILCUPS +OILED +OILER +OILERS +OILHOLE +OILHOLES +OILIER +OILIEST +OILILY +OILINESS +OILINESSES +OILING +OILMAN +OILMEN +OILPAPER +OILPAPERS +OILPROOF +OILS +OILSEED +OILSEEDS +OILSKIN +OILSKINS +OILSTONE +OILSTONES +OILTIGHT +OILWAY +OILWAYS +OILY +OINK +OINKED +OINKING +OINKS +OINOLOGIES +OINOLOGY +OINOMEL +OINOMELS +OINTMENT +OINTMENTS +OITICICA +OITICICAS +OKA +OKAPI +OKAPIS +OKAS +OKAY +OKAYED +OKAYING +OKAYS +OKE +OKEH +OKEHS +OKES +OKEYDOKE +OKEYDOKEY +OKRA +OKRAS +OLD +OLDEN +OLDER +OLDEST +OLDFANGLED +OLDIE +OLDIES +OLDISH +OLDNESS +OLDNESSES +OLDS +OLDSQUAW +OLDSQUAWS +OLDSTER +OLDSTERS +OLDSTYLE +OLDSTYLES +OLDWIFE +OLDWIVES +OLDY +OLE +OLEA +OLEAGINOUS +OLEAGINOUSLY +OLEAGINOUSNESS +OLEANDER +OLEANDERS +OLEANDOMYCIN +OLEANDOMYCINS +OLEASTER +OLEASTERS +OLEATE +OLEATES +OLECRANAL +OLECRANON +OLECRANONS +OLEFIN +OLEFINE +OLEFINES +OLEFINIC +OLEFINS +OLEIC +OLEIN +OLEINE +OLEINES +OLEINS +OLEO +OLEOGRAPH +OLEOGRAPHS +OLEOMARGARINE +OLEOMARGARINES +OLEORESIN +OLEORESINOUS +OLEORESINS +OLEOS +OLES +OLESTRA +OLESTRAS +OLEUM +OLEUMS +OLFACTION +OLFACTIONS +OLFACTIVE +OLFACTOMETER +OLFACTOMETERS +OLFACTORIES +OLFACTORY +OLIBANUM +OLIBANUMS +OLICOOK +OLICOOKS +OLIGARCH +OLIGARCHIC +OLIGARCHICAL +OLIGARCHIES +OLIGARCHS +OLIGARCHY +OLIGOCENE +OLIGOCHAETE +OLIGOCHAETES +OLIGOCLASE +OLIGOCLASES +OLIGODENDROCYTE +OLIGODENDROGLIA +OLIGOGENE +OLIGOGENES +OLIGOMER +OLIGOMERIC +OLIGOMERIZATION +OLIGOMERS +OLIGONUCLEOTIDE +OLIGOPHAGIES +OLIGOPHAGOUS +OLIGOPHAGY +OLIGOPOLIES +OLIGOPOLISTIC +OLIGOPOLY +OLIGOPSONIES +OLIGOPSONISTIC +OLIGOPSONY +OLIGOSACCHARIDE +OLIGOTROPHIC +OLIGURIA +OLIGURIAS +OLINGO +OLINGOS +OLIO +OLIOS +OLIVACEOUS +OLIVARY +OLIVE +OLIVENITE +OLIVENITES +OLIVES +OLIVINE +OLIVINES +OLIVINIC +OLIVINITIC +OLLA +OLLAS +OLOGIES +OLOGIST +OLOGISTS +OLOGY +OLOLIUQUI +OLOLIUQUIS +OLOROSO +OLOROSOS +OLYMPIAD +OLYMPIADS +OM +OMASA +OMASUM +OMBER +OMBERS +OMBRE +OMBRES +OMBUDSMAN +OMBUDSMANSHIP +OMBUDSMANSHIPS +OMBUDSMEN +OMEGA +OMEGAS +OMELET +OMELETS +OMELETTE +OMELETTES +OMEN +OMENED +OMENING +OMENS +OMENTA +OMENTAL +OMENTUM +OMENTUMS +OMER +OMERS +OMICRON +OMICRONS +OMIKRON +OMIKRONS +OMINOUS +OMINOUSLY +OMINOUSNESS +OMINOUSNESSES +OMISSIBLE +OMISSION +OMISSIONS +OMISSIVE +OMIT +OMITS +OMITTED +OMITTER +OMITTERS +OMITTING +OMMATIDIA +OMMATIDIAL +OMMATIDIUM +OMNIARCH +OMNIARCHS +OMNIBUS +OMNIBUSES +OMNIBUSSES +OMNICOMPETENCE +OMNICOMPETENCES +OMNICOMPETENT +OMNIDIRECTIONAL +OMNIFARIOUS +OMNIFIC +OMNIFICENT +OMNIFORM +OMNIMODE +OMNIPOTENCE +OMNIPOTENCES +OMNIPOTENT +OMNIPOTENTLY +OMNIPOTENTS +OMNIPRESENCE +OMNIPRESENCES +OMNIPRESENT +OMNIRANGE +OMNIRANGES +OMNISCIENCE +OMNISCIENCES +OMNISCIENT +OMNISCIENTLY +OMNIVORA +OMNIVORE +OMNIVORES +OMNIVOROUS +OMNIVOROUSLY +OMOPHAGIA +OMOPHAGIAS +OMOPHAGIC +OMOPHAGIES +OMOPHAGY +OMPHALI +OMPHALOS +OMPHALOSKEPSES +OMPHALOSKEPSIS +OMS +ON +ONAGER +ONAGERS +ONAGRI +ONANISM +ONANISMS +ONANIST +ONANISTIC +ONANISTS +ONBOARD +ONCE +ONCET +ONCHOCERCIASES +ONCHOCERCIASIS +ONCIDIUM +ONCIDIUMS +ONCOGENE +ONCOGENES +ONCOGENESES +ONCOGENESIS +ONCOGENIC +ONCOGENICITIES +ONCOGENICITY +ONCOLOGIC +ONCOLOGICAL +ONCOLOGIES +ONCOLOGIST +ONCOLOGISTS +ONCOLOGY +ONCOMING +ONCOMINGS +ONCORNAVIRUS +ONCORNAVIRUSES +ONCOVIRUS +ONCOVIRUSES +ONDOGRAM +ONDOGRAMS +ONE +ONEFOLD +ONEIRIC +ONEIRICALLY +ONEIROMANCIES +ONEIROMANCY +ONENESS +ONENESSES +ONERIER +ONERIEST +ONEROUS +ONEROUSLY +ONEROUSNESS +ONEROUSNESSES +ONERY +ONES +ONESELF +ONETIME +ONGOING +ONGOINGNESS +ONGOINGNESSES +ONION +ONIONS +ONIONSKIN +ONIONSKINS +ONIONY +ONIUM +ONLAY +ONLAYS +ONLINE +ONLOAD +ONLOADED +ONLOADING +ONLOADS +ONLOOKER +ONLOOKERS +ONLOOKING +ONLY +ONO +ONOMASTIC +ONOMASTICALLY +ONOMASTICIAN +ONOMASTICIANS +ONOMASTICS +ONOMATOLOGIES +ONOMATOLOGIST +ONOMATOLOGISTS +ONOMATOLOGY +ONOMATOPOEIA +ONOMATOPOEIAS +ONOMATOPOEIC +ONOMATOPOETIC +ONOS +ONRUSH +ONRUSHES +ONRUSHING +ONS +ONSCREEN +ONSET +ONSETS +ONSHORE +ONSIDE +ONSLAUGHT +ONSLAUGHTS +ONSTAGE +ONSTREAM +ONTIC +ONTICALLY +ONTO +ONTOGENESES +ONTOGENESIS +ONTOGENETIC +ONTOGENETICALLY +ONTOGENIC +ONTOGENIES +ONTOGENY +ONTOLOGIC +ONTOLOGICAL +ONTOLOGICALLY +ONTOLOGIES +ONTOLOGIST +ONTOLOGISTS +ONTOLOGY +ONUS +ONUSES +ONWARD +ONWARDS +ONYCHOPHORAN +ONYCHOPHORANS +ONYX +ONYXES +OOCYST +OOCYSTS +OOCYTE +OOCYTES +OODLES +OODLINS +OOGAMETE +OOGAMETES +OOGAMIES +OOGAMOUS +OOGAMY +OOGENESES +OOGENESIS +OOGENETIC +OOGENIES +OOGENY +OOGONIA +OOGONIAL +OOGONIUM +OOGONIUMS +OOH +OOHED +OOHING +OOHS +OOLACHAN +OOLACHANS +OOLITE +OOLITES +OOLITH +OOLITHS +OOLITIC +OOLOGIC +OOLOGICAL +OOLOGIES +OOLOGIST +OOLOGISTS +OOLOGY +OOLONG +OOLONGS +OOMIAC +OOMIACK +OOMIACKS +OOMIACS +OOMIAK +OOMIAKS +OOMPAH +OOMPAHED +OOMPAHING +OOMPAHS +OOMPH +OOMPHS +OOPHORECTOMIES +OOPHORECTOMY +OOPHYTE +OOPHYTES +OOPHYTIC +OOPS +OORALI +OORALIS +OORIE +OOSPERM +OOSPERMS +OOSPHERE +OOSPHERES +OOSPORE +OOSPORES +OOSPORIC +OOT +OOTHECA +OOTHECAE +OOTHECAL +OOTID +OOTIDS +OOTS +OOZE +OOZED +OOZES +OOZIER +OOZIEST +OOZILY +OOZINESS +OOZINESSES +OOZING +OOZY +OP +OPACIFIED +OPACIFIER +OPACIFIERS +OPACIFIES +OPACIFY +OPACIFYING +OPACITIES +OPACITY +OPAH +OPAHS +OPAL +OPALESCE +OPALESCED +OPALESCENCE +OPALESCENCES +OPALESCENT +OPALESCENTLY +OPALESCES +OPALESCING +OPALINE +OPALINES +OPALS +OPAQUE +OPAQUED +OPAQUELY +OPAQUENESS +OPAQUENESSES +OPAQUER +OPAQUES +OPAQUEST +OPAQUING +OPE +OPED +OPEN +OPENABILITIES +OPENABILITY +OPENABLE +OPENCAST +OPENED +OPENER +OPENERS +OPENEST +OPENHANDED +OPENHANDEDLY +OPENHANDEDNESS +OPENHEARTED +OPENHEARTEDLY +OPENHEARTEDNESS +OPENING +OPENINGS +OPENLY +OPENMOUTHED +OPENMOUTHEDLY +OPENMOUTHEDNESS +OPENNESS +OPENNESSES +OPENS +OPENWORK +OPENWORKS +OPERA +OPERABILITIES +OPERABILITY +OPERABLE +OPERABLY +OPERAGOER +OPERAGOERS +OPERAGOING +OPERAGOINGS +OPERAND +OPERANDS +OPERANT +OPERANTLY +OPERANTS +OPERAS +OPERATE +OPERATED +OPERATES +OPERATIC +OPERATICALLY +OPERATICS +OPERATING +OPERATION +OPERATIONAL +OPERATIONALISM +OPERATIONALISMS +OPERATIONALIST +OPERATIONALISTS +OPERATIONALLY +OPERATIONISM +OPERATIONISMS +OPERATIONIST +OPERATIONISTS +OPERATIONS +OPERATIVE +OPERATIVELY +OPERATIVENESS +OPERATIVENESSES +OPERATIVES +OPERATOR +OPERATORLESS +OPERATORS +OPERCELE +OPERCELES +OPERCULA +OPERCULAR +OPERCULARS +OPERCULATE +OPERCULATED +OPERCULE +OPERCULES +OPERCULUM +OPERCULUMS +OPERETTA +OPERETTAS +OPERETTIST +OPERETTISTS +OPERON +OPERONS +OPEROSE +OPEROSELY +OPEROSENESS +OPEROSENESSES +OPES +OPHIDIAN +OPHIDIANS +OPHIOLITE +OPHIOLITES +OPHIOLOGIES +OPHIOLOGY +OPHITE +OPHITES +OPHITIC +OPHIUROID +OPHIUROIDS +OPHTHALMIA +OPHTHALMIAS +OPHTHALMIC +OPHTHALMOLOGIC +OPHTHALMOLOGIES +OPHTHALMOLOGIST +OPHTHALMOLOGY +OPHTHALMOSCOPE +OPHTHALMOSCOPES +OPHTHALMOSCOPIC +OPHTHALMOSCOPY +OPIATE +OPIATED +OPIATES +OPIATING +OPINE +OPINED +OPINES +OPING +OPINING +OPINION +OPINIONATED +OPINIONATEDLY +OPINIONATEDNESS +OPINIONATIVE +OPINIONATIVELY +OPINIONED +OPINIONS +OPIOID +OPIOIDS +OPISTHOBRANCH +OPISTHOBRANCHS +OPIUM +OPIUMISM +OPIUMISMS +OPIUMS +OPOSSUM +OPOSSUMS +OPPIDAN +OPPIDANS +OPPILANT +OPPILATE +OPPILATED +OPPILATES +OPPILATING +OPPONENCIES +OPPONENCY +OPPONENT +OPPONENTS +OPPORTUNE +OPPORTUNELY +OPPORTUNENESS +OPPORTUNENESSES +OPPORTUNISM +OPPORTUNISMS +OPPORTUNIST +OPPORTUNISTIC +OPPORTUNISTS +OPPORTUNITIES +OPPORTUNITY +OPPOSABILITIES +OPPOSABILITY +OPPOSABLE +OPPOSE +OPPOSED +OPPOSELESS +OPPOSER +OPPOSERS +OPPOSES +OPPOSING +OPPOSITE +OPPOSITELY +OPPOSITENESS +OPPOSITENESSES +OPPOSITES +OPPOSITION +OPPOSITIONAL +OPPOSITIONIST +OPPOSITIONISTS +OPPOSITIONS +OPPRESS +OPPRESSED +OPPRESSES +OPPRESSING +OPPRESSION +OPPRESSIONS +OPPRESSIVE +OPPRESSIVELY +OPPRESSIVENESS +OPPRESSOR +OPPRESSORS +OPPROBRIOUS +OPPROBRIOUSLY +OPPROBRIOUSNESS +OPPROBRIUM +OPPROBRIUMS +OPPUGN +OPPUGNANT +OPPUGNED +OPPUGNER +OPPUGNERS +OPPUGNING +OPPUGNS +OPS +OPSIN +OPSINS +OPSONIC +OPSONIFIED +OPSONIFIES +OPSONIFY +OPSONIFYING +OPSONIN +OPSONINS +OPSONIZE +OPSONIZED +OPSONIZES +OPSONIZING +OPT +OPTATIVE +OPTATIVELY +OPTATIVES +OPTED +OPTIC +OPTICAL +OPTICALLY +OPTICIAN +OPTICIANS +OPTICIST +OPTICISTS +OPTICS +OPTIMA +OPTIMAL +OPTIMALITIES +OPTIMALITY +OPTIMALLY +OPTIME +OPTIMES +OPTIMISATION +OPTIMISATIONS +OPTIMISE +OPTIMISED +OPTIMISES +OPTIMISING +OPTIMISM +OPTIMISMS +OPTIMIST +OPTIMISTIC +OPTIMISTICALLY +OPTIMISTS +OPTIMIZATION +OPTIMIZATIONS +OPTIMIZE +OPTIMIZED +OPTIMIZER +OPTIMIZERS +OPTIMIZES +OPTIMIZING +OPTIMUM +OPTIMUMS +OPTING +OPTION +OPTIONAL +OPTIONALITIES +OPTIONALITY +OPTIONALLY +OPTIONALS +OPTIONED +OPTIONEE +OPTIONEES +OPTIONING +OPTIONS +OPTOELECTRONIC +OPTOELECTRONICS +OPTOKINETIC +OPTOMETER +OPTOMETERS +OPTOMETRIC +OPTOMETRIES +OPTOMETRIST +OPTOMETRISTS +OPTOMETRY +OPTS +OPULENCE +OPULENCES +OPULENCIES +OPULENCY +OPULENT +OPULENTLY +OPUNTIA +OPUNTIAS +OPUS +OPUSCULA +OPUSCULAR +OPUSCULE +OPUSCULES +OPUSCULUM +OPUSES +OQUASSA +OQUASSAS +OR +ORA +ORACH +ORACHE +ORACHES +ORACLE +ORACLES +ORACULAR +ORACULARITIES +ORACULARITY +ORACULARLY +ORAD +ORAL +ORALISM +ORALISMS +ORALIST +ORALISTS +ORALITIES +ORALITY +ORALLY +ORALS +ORANG +ORANGE +ORANGEADE +ORANGEADES +ORANGERIE +ORANGERIES +ORANGERY +ORANGES +ORANGEWOOD +ORANGEWOODS +ORANGEY +ORANGIER +ORANGIEST +ORANGISH +ORANGS +ORANGUTAN +ORANGUTANS +ORANGY +ORATE +ORATED +ORATES +ORATING +ORATION +ORATIONS +ORATOR +ORATORICAL +ORATORICALLY +ORATORIES +ORATORIO +ORATORIOS +ORATORS +ORATORY +ORATRESS +ORATRESSES +ORATRICES +ORATRIX +ORB +ORBED +ORBICULAR +ORBICULARLY +ORBICULATE +ORBIER +ORBIEST +ORBING +ORBIT +ORBITAL +ORBITALS +ORBITED +ORBITER +ORBITERS +ORBITING +ORBITS +ORBLESS +ORBS +ORBY +ORC +ORCA +ORCAS +ORCEIN +ORCEINS +ORCHARD +ORCHARDIST +ORCHARDISTS +ORCHARDS +ORCHESTRA +ORCHESTRAL +ORCHESTRALLY +ORCHESTRAS +ORCHESTRATE +ORCHESTRATED +ORCHESTRATER +ORCHESTRATERS +ORCHESTRATES +ORCHESTRATING +ORCHESTRATION +ORCHESTRATIONAL +ORCHESTRATIONS +ORCHESTRATOR +ORCHESTRATORS +ORCHID +ORCHIDACEOUS +ORCHIDLIKE +ORCHIDS +ORCHIL +ORCHILS +ORCHIS +ORCHISES +ORCHITIC +ORCHITIS +ORCHITISES +ORCIN +ORCINOL +ORCINOLS +ORCINS +ORCS +ORDAIN +ORDAINED +ORDAINER +ORDAINERS +ORDAINING +ORDAINMENT +ORDAINMENTS +ORDAINS +ORDEAL +ORDEALS +ORDER +ORDERABLE +ORDERED +ORDERER +ORDERERS +ORDERING +ORDERLESS +ORDERLIES +ORDERLINESS +ORDERLINESSES +ORDERLY +ORDERS +ORDINAL +ORDINALLY +ORDINALS +ORDINANCE +ORDINANCES +ORDINAND +ORDINANDS +ORDINARIER +ORDINARIES +ORDINARIEST +ORDINARILY +ORDINARINESS +ORDINARINESSES +ORDINARY +ORDINATE +ORDINATES +ORDINATION +ORDINATIONS +ORDINES +ORDNANCE +ORDNANCES +ORDO +ORDONNANCE +ORDONNANCES +ORDOS +ORDURE +ORDURES +ORDUROUS +ORE +OREAD +OREADS +ORECTIC +ORECTIVE +OREGANO +OREGANOS +OREIDE +OREIDES +OREODONT +OREODONTS +ORES +ORFRAY +ORFRAYS +ORGAN +ORGANA +ORGANDIE +ORGANDIES +ORGANDY +ORGANELLE +ORGANELLES +ORGANIC +ORGANICALLY +ORGANICISM +ORGANICISMS +ORGANICIST +ORGANICISTS +ORGANICITIES +ORGANICITY +ORGANICS +ORGANISATION +ORGANISATIONS +ORGANISE +ORGANISED +ORGANISER +ORGANISERS +ORGANISES +ORGANISING +ORGANISM +ORGANISMAL +ORGANISMIC +ORGANISMICALLY +ORGANISMS +ORGANIST +ORGANISTS +ORGANIZABLE +ORGANIZATION +ORGANIZATIONAL +ORGANIZATIONS +ORGANIZE +ORGANIZED +ORGANIZER +ORGANIZERS +ORGANIZES +ORGANIZING +ORGANOCHLORINE +ORGANOCHLORINES +ORGANOGENESES +ORGANOGENESIS +ORGANOGENETIC +ORGANOLEPTIC +ORGANOLOGIES +ORGANOLOGY +ORGANOMERCURIAL +ORGANOMETALLIC +ORGANOMETALLICS +ORGANON +ORGANONS +ORGANOPHOSPHATE +ORGANOSOL +ORGANOSOLS +ORGANS +ORGANUM +ORGANUMS +ORGANZA +ORGANZAS +ORGANZINE +ORGANZINES +ORGASM +ORGASMED +ORGASMIC +ORGASMING +ORGASMS +ORGASTIC +ORGEAT +ORGEATS +ORGIAC +ORGIAST +ORGIASTIC +ORGIASTICALLY +ORGIASTS +ORGIC +ORGIES +ORGONE +ORGONES +ORGULOUS +ORGY +ORIBATID +ORIBATIDS +ORIBI +ORIBIS +ORIEL +ORIELS +ORIENT +ORIENTAL +ORIENTALISM +ORIENTALISMS +ORIENTALIST +ORIENTALISTS +ORIENTALIZE +ORIENTALIZED +ORIENTALIZES +ORIENTALIZING +ORIENTALLY +ORIENTALS +ORIENTATE +ORIENTATED +ORIENTATES +ORIENTATING +ORIENTATION +ORIENTATIONAL +ORIENTATIONALLY +ORIENTATIONS +ORIENTED +ORIENTEER +ORIENTEERING +ORIENTEERINGS +ORIENTEERS +ORIENTER +ORIENTERS +ORIENTING +ORIENTS +ORIFICE +ORIFICES +ORIFICIAL +ORIFLAMME +ORIFLAMMES +ORIGAMI +ORIGAMIS +ORIGAN +ORIGANS +ORIGANUM +ORIGANUMS +ORIGIN +ORIGINAL +ORIGINALITIES +ORIGINALITY +ORIGINALLY +ORIGINALS +ORIGINATE +ORIGINATED +ORIGINATES +ORIGINATING +ORIGINATION +ORIGINATIONS +ORIGINATIVE +ORIGINATIVELY +ORIGINATOR +ORIGINATORS +ORIGINS +ORINASAL +ORINASALS +ORIOLE +ORIOLES +ORISHA +ORISHAS +ORISMOLOGICAL +ORISMOLOGIES +ORISMOLOGY +ORISON +ORISONS +ORLE +ORLES +ORLON +ORLONS +ORLOP +ORLOPS +ORMER +ORMERS +ORMOLU +ORMOLUS +ORNAMENT +ORNAMENTAL +ORNAMENTALLY +ORNAMENTALS +ORNAMENTATION +ORNAMENTATIONS +ORNAMENTED +ORNAMENTING +ORNAMENTS +ORNATE +ORNATELY +ORNATENESS +ORNATENESSES +ORNERIER +ORNERIEST +ORNERINESS +ORNERINESSES +ORNERY +ORNIS +ORNITHES +ORNITHIC +ORNITHINE +ORNITHINES +ORNITHISCHIAN +ORNITHISCHIANS +ORNITHOID +ORNITHOLOGIC +ORNITHOLOGICAL +ORNITHOLOGIES +ORNITHOLOGIST +ORNITHOLOGISTS +ORNITHOLOGY +ORNITHOPOD +ORNITHOPODS +ORNITHOPTER +ORNITHOPTERS +ORNITHOSES +ORNITHOSIS +OROGENESES +OROGENESIS +OROGENETIC +OROGENIC +OROGENIES +OROGENY +OROGRAPHIC +OROGRAPHICAL +OROGRAPHIES +OROGRAPHY +OROIDE +OROIDES +OROLOGIES +OROLOGIST +OROLOGISTS +OROLOGY +OROMETER +OROMETERS +OROPHARYNGEAL +OROPHARYNGES +OROPHARYNX +OROPHARYNXES +OROTUND +OROTUNDITIES +OROTUNDITY +ORPHAN +ORPHANAGE +ORPHANAGES +ORPHANED +ORPHANHOOD +ORPHANHOODS +ORPHANING +ORPHANS +ORPHIC +ORPHICAL +ORPHICALLY +ORPHISM +ORPHISMS +ORPHREY +ORPHREYED +ORPHREYS +ORPIMENT +ORPIMENTS +ORPIN +ORPINE +ORPINES +ORPINS +ORRA +ORRERIES +ORRERY +ORRICE +ORRICES +ORRIS +ORRISES +ORRISROOT +ORRISROOTS +ORS +ORT +ORTHICON +ORTHICONS +ORTHO +ORTHOCENTER +ORTHOCENTERS +ORTHOCHROMATIC +ORTHOCLASE +ORTHOCLASES +ORTHODONTIA +ORTHODONTIAS +ORTHODONTIC +ORTHODONTICALLY +ORTHODONTICS +ORTHODONTIST +ORTHODONTISTS +ORTHODOX +ORTHODOXES +ORTHODOXIES +ORTHODOXLY +ORTHODOXY +ORTHOEPIC +ORTHOEPICALLY +ORTHOEPIES +ORTHOEPIST +ORTHOEPISTS +ORTHOEPY +ORTHOGENESES +ORTHOGENESIS +ORTHOGENETIC +ORTHOGONAL +ORTHOGONALITIES +ORTHOGONALITY +ORTHOGONALIZE +ORTHOGONALIZED +ORTHOGONALIZES +ORTHOGONALIZING +ORTHOGONALLY +ORTHOGRADE +ORTHOGRAPHIC +ORTHOGRAPHICAL +ORTHOGRAPHIES +ORTHOGRAPHY +ORTHOMOLECULAR +ORTHONORMAL +ORTHOPAEDIC +ORTHOPAEDICS +ORTHOPEDIC +ORTHOPEDICALLY +ORTHOPEDICS +ORTHOPEDIST +ORTHOPEDISTS +ORTHOPHOSPHATE +ORTHOPHOSPHATES +ORTHOPSYCHIATRY +ORTHOPTER +ORTHOPTERA +ORTHOPTERAN +ORTHOPTERANS +ORTHOPTERIST +ORTHOPTERISTS +ORTHOPTEROID +ORTHOPTEROIDS +ORTHOPTERS +ORTHOPTIC +ORTHORHOMBIC +ORTHOSCOPIC +ORTHOSES +ORTHOSIS +ORTHOSTATIC +ORTHOTIC +ORTHOTICS +ORTHOTIST +ORTHOTISTS +ORTHOTROPOUS +ORTOLAN +ORTOLANS +ORTS +ORYX +ORYXES +ORZO +ORZOS +OS +OSAR +OSCILLATE +OSCILLATED +OSCILLATES +OSCILLATING +OSCILLATION +OSCILLATIONAL +OSCILLATIONS +OSCILLATOR +OSCILLATORS +OSCILLATORY +OSCILLOGRAM +OSCILLOGRAMS +OSCILLOGRAPH +OSCILLOGRAPHIC +OSCILLOGRAPHIES +OSCILLOGRAPHS +OSCILLOGRAPHY +OSCILLOSCOPE +OSCILLOSCOPES +OSCILLOSCOPIC +OSCINE +OSCINES +OSCININE +OSCITANCE +OSCITANCES +OSCITANCIES +OSCITANCY +OSCITANT +OSCULA +OSCULANT +OSCULAR +OSCULATE +OSCULATED +OSCULATES +OSCULATING +OSCULATION +OSCULATIONS +OSCULATORY +OSCULE +OSCULES +OSCULUM +OSE +OSES +OSETRA +OSETRAS +OSIER +OSIERED +OSIERS +OSMATIC +OSMETERIA +OSMETERIUM +OSMIC +OSMICALLY +OSMICS +OSMIOUS +OSMIRIDIUM +OSMIRIDIUMS +OSMIUM +OSMIUMS +OSMOL +OSMOLAL +OSMOLALITIES +OSMOLALITY +OSMOLAR +OSMOLARITIES +OSMOLARITY +OSMOLE +OSMOLES +OSMOLS +OSMOMETER +OSMOMETERS +OSMOMETRIC +OSMOMETRIES +OSMOMETRY +OSMOREGULATION +OSMOREGULATIONS +OSMOREGULATORY +OSMOSE +OSMOSED +OSMOSES +OSMOSING +OSMOSIS +OSMOTIC +OSMOTICALLY +OSMOUS +OSMUND +OSMUNDA +OSMUNDAS +OSMUNDINE +OSMUNDINES +OSMUNDS +OSNABURG +OSNABURGS +OSPREY +OSPREYS +OSSA +OSSATURE +OSSATURES +OSSEIN +OSSEINS +OSSEOUS +OSSEOUSLY +OSSETRA +OSSETRAS +OSSIA +OSSICLE +OSSICLES +OSSICULAR +OSSIFIC +OSSIFICATION +OSSIFICATIONS +OSSIFIED +OSSIFIER +OSSIFIERS +OSSIFIES +OSSIFRAGE +OSSIFRAGES +OSSIFY +OSSIFYING +OSSUARIES +OSSUARY +OSTEAL +OSTEITIC +OSTEITIDES +OSTEITIS +OSTENSIBLE +OSTENSIBLY +OSTENSIVE +OSTENSIVELY +OSTENSORIA +OSTENSORIES +OSTENSORIUM +OSTENSORY +OSTENTATION +OSTENTATIONS +OSTENTATIOUS +OSTENTATIOUSLY +OSTEOARTHRITIC +OSTEOARTHRITIS +OSTEOBLAST +OSTEOBLASTIC +OSTEOBLASTS +OSTEOCLAST +OSTEOCLASTIC +OSTEOCLASTS +OSTEOCYTE +OSTEOCYTES +OSTEOGENESES +OSTEOGENESIS +OSTEOGENIC +OSTEOID +OSTEOIDS +OSTEOLOGICAL +OSTEOLOGIES +OSTEOLOGIST +OSTEOLOGISTS +OSTEOLOGY +OSTEOMA +OSTEOMALACIA +OSTEOMALACIAS +OSTEOMAS +OSTEOMATA +OSTEOMYELITIS +OSTEOMYELITISES +OSTEOPATH +OSTEOPATHIC +OSTEOPATHICALLY +OSTEOPATHIES +OSTEOPATHS +OSTEOPATHY +OSTEOPLASTIC +OSTEOPLASTIES +OSTEOPLASTY +OSTEOPOROSES +OSTEOPOROSIS +OSTEOPOROTIC +OSTEOSARCOMA +OSTEOSARCOMAS +OSTEOSARCOMATA +OSTEOSES +OSTEOSIS +OSTEOSISES +OSTEOTOME +OSTEOTOMES +OSTEOTOMIES +OSTEOTOMY +OSTIA +OSTIARIES +OSTIARY +OSTINATI +OSTINATO +OSTINATOS +OSTIOLAR +OSTIOLE +OSTIOLES +OSTIUM +OSTLER +OSTLERS +OSTMARK +OSTMARKS +OSTOMATE +OSTOMATES +OSTOMIES +OSTOMY +OSTOSES +OSTOSIS +OSTOSISES +OSTRACA +OSTRACISE +OSTRACISED +OSTRACISES +OSTRACISING +OSTRACISM +OSTRACISMS +OSTRACIZE +OSTRACIZED +OSTRACIZES +OSTRACIZING +OSTRACOD +OSTRACODE +OSTRACODERM +OSTRACODERMS +OSTRACODES +OSTRACODS +OSTRACON +OSTRAKA +OSTRAKON +OSTRICH +OSTRICHES +OSTRICHLIKE +OTALGIA +OTALGIAS +OTALGIC +OTALGIES +OTALGY +OTHER +OTHERGUESS +OTHERNESS +OTHERNESSES +OTHERS +OTHERWHERE +OTHERWHILE +OTHERWHILES +OTHERWISE +OTHERWORLD +OTHERWORLDLY +OTHERWORLDS +OTIC +OTIOSE +OTIOSELY +OTIOSENESS +OTIOSENESSES +OTIOSITIES +OTIOSITY +OTITIC +OTITIDES +OTITIS +OTITISES +OTOCYST +OTOCYSTIC +OTOCYSTS +OTOLARYNGOLOGY +OTOLITH +OTOLITHIC +OTOLITHS +OTOLOGIES +OTOLOGIST +OTOLOGISTS +OTOLOGY +OTOPLASTIES +OTOPLASTY +OTOSCLEROSES +OTOSCLEROSIS +OTOSCOPE +OTOSCOPES +OTOSCOPIES +OTOSCOPY +OTOTOXIC +OTOTOXICITIES +OTOTOXICITY +OTTAR +OTTARS +OTTAVA +OTTAVAS +OTTER +OTTERS +OTTO +OTTOMAN +OTTOMANS +OTTOS +OUABAIN +OUABAINS +OUBLIETTE +OUBLIETTES +OUCH +OUCHED +OUCHES +OUCHING +OUD +OUDS +OUGHT +OUGHTED +OUGHTING +OUGHTS +OUGUIYA +OUGUIYAS +OUISTITI +OUISTITIS +OUNCE +OUNCES +OUPH +OUPHE +OUPHES +OUPHS +OUR +OURANG +OURANGS +OURARI +OURARIS +OUREBI +OUREBIS +OURIE +OURS +OURSELF +OURSELVES +OUSEL +OUSELS +OUST +OUSTED +OUSTER +OUSTERS +OUSTING +OUSTS +OUT +OUTACHIEVE +OUTACHIEVED +OUTACHIEVES +OUTACHIEVING +OUTACT +OUTACTED +OUTACTING +OUTACTS +OUTADD +OUTADDED +OUTADDING +OUTADDS +OUTAGE +OUTAGES +OUTARGUE +OUTARGUED +OUTARGUES +OUTARGUING +OUTASK +OUTASKED +OUTASKING +OUTASKS +OUTATE +OUTBACK +OUTBACKER +OUTBACKERS +OUTBACKS +OUTBAKE +OUTBAKED +OUTBAKES +OUTBAKING +OUTBALANCE +OUTBALANCED +OUTBALANCES +OUTBALANCING +OUTBARGAIN +OUTBARGAINED +OUTBARGAINING +OUTBARGAINS +OUTBARK +OUTBARKED +OUTBARKING +OUTBARKS +OUTBAWL +OUTBAWLED +OUTBAWLING +OUTBAWLS +OUTBEAM +OUTBEAMED +OUTBEAMING +OUTBEAMS +OUTBEG +OUTBEGGED +OUTBEGGING +OUTBEGS +OUTBID +OUTBIDDEN +OUTBIDDER +OUTBIDDERS +OUTBIDDING +OUTBIDS +OUTBITCH +OUTBITCHED +OUTBITCHES +OUTBITCHING +OUTBLAZE +OUTBLAZED +OUTBLAZES +OUTBLAZING +OUTBLEAT +OUTBLEATED +OUTBLEATING +OUTBLEATS +OUTBLESS +OUTBLESSED +OUTBLESSES +OUTBLESSING +OUTBLOOM +OUTBLOOMED +OUTBLOOMING +OUTBLOOMS +OUTBLUFF +OUTBLUFFED +OUTBLUFFING +OUTBLUFFS +OUTBLUSH +OUTBLUSHED +OUTBLUSHES +OUTBLUSHING +OUTBOARD +OUTBOARDS +OUTBOAST +OUTBOASTED +OUTBOASTING +OUTBOASTS +OUTBOUGHT +OUTBOUND +OUTBOX +OUTBOXED +OUTBOXES +OUTBOXING +OUTBRAG +OUTBRAGGED +OUTBRAGGING +OUTBRAGS +OUTBRAVE +OUTBRAVED +OUTBRAVES +OUTBRAVING +OUTBRAWL +OUTBRAWLED +OUTBRAWLING +OUTBRAWLS +OUTBRAZEN +OUTBRAZENED +OUTBRAZENING +OUTBRAZENS +OUTBREAK +OUTBREAKS +OUTBRED +OUTBREED +OUTBREEDING +OUTBREEDINGS +OUTBREEDS +OUTBRIBE +OUTBRIBED +OUTBRIBES +OUTBRIBING +OUTBUILD +OUTBUILDING +OUTBUILDINGS +OUTBUILDS +OUTBUILT +OUTBULGE +OUTBULGED +OUTBULGES +OUTBULGING +OUTBULK +OUTBULKED +OUTBULKING +OUTBULKS +OUTBULLIED +OUTBULLIES +OUTBULLY +OUTBULLYING +OUTBURN +OUTBURNED +OUTBURNING +OUTBURNS +OUTBURNT +OUTBURST +OUTBURSTS +OUTBUY +OUTBUYING +OUTBUYS +OUTBY +OUTBYE +OUTCALL +OUTCALLS +OUTCAPER +OUTCAPERED +OUTCAPERING +OUTCAPERS +OUTCAST +OUTCASTE +OUTCASTES +OUTCASTS +OUTCATCH +OUTCATCHES +OUTCATCHING +OUTCAUGHT +OUTCAVIL +OUTCAVILED +OUTCAVILING +OUTCAVILLED +OUTCAVILLING +OUTCAVILS +OUTCHARGE +OUTCHARGED +OUTCHARGES +OUTCHARGING +OUTCHARM +OUTCHARMED +OUTCHARMING +OUTCHARMS +OUTCHEAT +OUTCHEATED +OUTCHEATING +OUTCHEATS +OUTCHID +OUTCHIDDEN +OUTCHIDE +OUTCHIDED +OUTCHIDES +OUTCHIDING +OUTCITIES +OUTCITY +OUTCLASS +OUTCLASSED +OUTCLASSES +OUTCLASSING +OUTCLIMB +OUTCLIMBED +OUTCLIMBING +OUTCLIMBS +OUTCLOMB +OUTCOACH +OUTCOACHED +OUTCOACHES +OUTCOACHING +OUTCOME +OUTCOMES +OUTCOMPETE +OUTCOMPETED +OUTCOMPETES +OUTCOMPETING +OUTCOOK +OUTCOOKED +OUTCOOKING +OUTCOOKS +OUTCOUNT +OUTCOUNTED +OUTCOUNTING +OUTCOUNTS +OUTCRAWL +OUTCRAWLED +OUTCRAWLING +OUTCRAWLS +OUTCRIED +OUTCRIES +OUTCROP +OUTCROPPED +OUTCROPPING +OUTCROPPINGS +OUTCROPS +OUTCROSS +OUTCROSSED +OUTCROSSES +OUTCROSSING +OUTCROW +OUTCROWD +OUTCROWDED +OUTCROWDING +OUTCROWDS +OUTCROWED +OUTCROWING +OUTCROWS +OUTCRY +OUTCRYING +OUTCURSE +OUTCURSED +OUTCURSES +OUTCURSING +OUTCURVE +OUTCURVES +OUTDANCE +OUTDANCED +OUTDANCES +OUTDANCING +OUTDARE +OUTDARED +OUTDARES +OUTDARING +OUTDATE +OUTDATED +OUTDATEDLY +OUTDATEDNESS +OUTDATEDNESSES +OUTDATES +OUTDATING +OUTDAZZLE +OUTDAZZLED +OUTDAZZLES +OUTDAZZLING +OUTDEBATE +OUTDEBATED +OUTDEBATES +OUTDEBATING +OUTDELIVER +OUTDELIVERED +OUTDELIVERING +OUTDELIVERS +OUTDESIGN +OUTDESIGNED +OUTDESIGNING +OUTDESIGNS +OUTDID +OUTDISTANCE +OUTDISTANCED +OUTDISTANCES +OUTDISTANCING +OUTDO +OUTDODGE +OUTDODGED +OUTDODGES +OUTDODGING +OUTDOER +OUTDOERS +OUTDOES +OUTDOING +OUTDONE +OUTDOOR +OUTDOORS +OUTDOORSMAN +OUTDOORSMANSHIP +OUTDOORSMEN +OUTDOORSY +OUTDRAG +OUTDRAGGED +OUTDRAGGING +OUTDRAGS +OUTDRANK +OUTDRAW +OUTDRAWING +OUTDRAWN +OUTDRAWS +OUTDREAM +OUTDREAMED +OUTDREAMING +OUTDREAMS +OUTDREAMT +OUTDRESS +OUTDRESSED +OUTDRESSES +OUTDRESSING +OUTDREW +OUTDRINK +OUTDRINKING +OUTDRINKS +OUTDRIVE +OUTDRIVEN +OUTDRIVES +OUTDRIVING +OUTDROP +OUTDROPPED +OUTDROPPING +OUTDROPS +OUTDROVE +OUTDRUNK +OUTDUEL +OUTDUELED +OUTDUELING +OUTDUELLED +OUTDUELLING +OUTDUELS +OUTEARN +OUTEARNED +OUTEARNING +OUTEARNS +OUTEAT +OUTEATEN +OUTEATING +OUTEATS +OUTECHO +OUTECHOED +OUTECHOES +OUTECHOING +OUTED +OUTER +OUTERCOAT +OUTERCOATS +OUTERMOST +OUTERS +OUTERWEAR +OUTFABLE +OUTFABLED +OUTFABLES +OUTFABLING +OUTFACE +OUTFACED +OUTFACES +OUTFACING +OUTFALL +OUTFALLS +OUTFAST +OUTFASTED +OUTFASTING +OUTFASTS +OUTFAWN +OUTFAWNED +OUTFAWNING +OUTFAWNS +OUTFEAST +OUTFEASTED +OUTFEASTING +OUTFEASTS +OUTFEEL +OUTFEELING +OUTFEELS +OUTFELT +OUTFENCE +OUTFENCED +OUTFENCES +OUTFENCING +OUTFIELD +OUTFIELDER +OUTFIELDERS +OUTFIELDS +OUTFIGHT +OUTFIGHTING +OUTFIGHTS +OUTFIGURE +OUTFIGURED +OUTFIGURES +OUTFIGURING +OUTFIND +OUTFINDING +OUTFINDS +OUTFIRE +OUTFIRED +OUTFIRES +OUTFIRING +OUTFISH +OUTFISHED +OUTFISHES +OUTFISHING +OUTFIT +OUTFITS +OUTFITTED +OUTFITTER +OUTFITTERS +OUTFITTING +OUTFLANK +OUTFLANKED +OUTFLANKING +OUTFLANKS +OUTFLEW +OUTFLIES +OUTFLOAT +OUTFLOATED +OUTFLOATING +OUTFLOATS +OUTFLOW +OUTFLOWED +OUTFLOWING +OUTFLOWN +OUTFLOWS +OUTFLY +OUTFLYING +OUTFOOL +OUTFOOLED +OUTFOOLING +OUTFOOLS +OUTFOOT +OUTFOOTED +OUTFOOTING +OUTFOOTS +OUTFOUGHT +OUTFOUND +OUTFOX +OUTFOXED +OUTFOXES +OUTFOXING +OUTFROWN +OUTFROWNED +OUTFROWNING +OUTFROWNS +OUTFUMBLE +OUTFUMBLED +OUTFUMBLES +OUTFUMBLING +OUTGAIN +OUTGAINED +OUTGAINING +OUTGAINS +OUTGALLOP +OUTGALLOPED +OUTGALLOPING +OUTGALLOPS +OUTGAMBLE +OUTGAMBLED +OUTGAMBLES +OUTGAMBLING +OUTGAS +OUTGASSED +OUTGASSES +OUTGASSING +OUTGAVE +OUTGAZE +OUTGAZED +OUTGAZES +OUTGAZING +OUTGENERAL +OUTGENERALED +OUTGENERALING +OUTGENERALS +OUTGIVE +OUTGIVEN +OUTGIVES +OUTGIVING +OUTGIVINGS +OUTGLARE +OUTGLARED +OUTGLARES +OUTGLARING +OUTGLEAM +OUTGLEAMED +OUTGLEAMING +OUTGLEAMS +OUTGLITTER +OUTGLITTERED +OUTGLITTERING +OUTGLITTERS +OUTGLOW +OUTGLOWED +OUTGLOWING +OUTGLOWS +OUTGNAW +OUTGNAWED +OUTGNAWING +OUTGNAWN +OUTGNAWS +OUTGO +OUTGOES +OUTGOING +OUTGOINGNESS +OUTGOINGNESSES +OUTGOINGS +OUTGONE +OUTGREW +OUTGRIN +OUTGRINNED +OUTGRINNING +OUTGRINS +OUTGROSS +OUTGROSSED +OUTGROSSES +OUTGROSSING +OUTGROUP +OUTGROUPS +OUTGROW +OUTGROWING +OUTGROWN +OUTGROWS +OUTGROWTH +OUTGROWTHS +OUTGUESS +OUTGUESSED +OUTGUESSES +OUTGUESSING +OUTGUIDE +OUTGUIDED +OUTGUIDES +OUTGUIDING +OUTGUN +OUTGUNNED +OUTGUNNING +OUTGUNS +OUTGUSH +OUTGUSHED +OUTGUSHES +OUTGUSHING +OUTHANDLE +OUTHANDLED +OUTHANDLES +OUTHANDLING +OUTHAUL +OUTHAULS +OUTHEAR +OUTHEARD +OUTHEARING +OUTHEARS +OUTHIT +OUTHITS +OUTHITTING +OUTHOMER +OUTHOMERED +OUTHOMERING +OUTHOMERS +OUTHOUSE +OUTHOUSES +OUTHOWL +OUTHOWLED +OUTHOWLING +OUTHOWLS +OUTHUMOR +OUTHUMORED +OUTHUMORING +OUTHUMORS +OUTHUNT +OUTHUNTED +OUTHUNTING +OUTHUNTS +OUTHUSTLE +OUTHUSTLED +OUTHUSTLES +OUTHUSTLING +OUTING +OUTINGS +OUTINTRIGUE +OUTINTRIGUED +OUTINTRIGUES +OUTINTRIGUING +OUTJINX +OUTJINXED +OUTJINXES +OUTJINXING +OUTJOCKEY +OUTJOCKEYED +OUTJOCKEYING +OUTJOCKEYS +OUTJUGGLE +OUTJUGGLED +OUTJUGGLES +OUTJUGGLING +OUTJUMP +OUTJUMPED +OUTJUMPING +OUTJUMPS +OUTJUT +OUTJUTS +OUTJUTTED +OUTJUTTING +OUTKEEP +OUTKEEPING +OUTKEEPS +OUTKEPT +OUTKICK +OUTKICKED +OUTKICKING +OUTKICKS +OUTKILL +OUTKILLED +OUTKILLING +OUTKILLS +OUTKISS +OUTKISSED +OUTKISSES +OUTKISSING +OUTLAID +OUTLAIN +OUTLAND +OUTLANDER +OUTLANDERS +OUTLANDISH +OUTLANDISHLY +OUTLANDISHNESS +OUTLANDS +OUTLAST +OUTLASTED +OUTLASTING +OUTLASTS +OUTLAUGH +OUTLAUGHED +OUTLAUGHING +OUTLAUGHS +OUTLAW +OUTLAWED +OUTLAWING +OUTLAWRIES +OUTLAWRY +OUTLAWS +OUTLAY +OUTLAYING +OUTLAYS +OUTLEAD +OUTLEADING +OUTLEADS +OUTLEAP +OUTLEAPED +OUTLEAPING +OUTLEAPS +OUTLEAPT +OUTLEARN +OUTLEARNED +OUTLEARNING +OUTLEARNS +OUTLEARNT +OUTLED +OUTLET +OUTLETS +OUTLIE +OUTLIER +OUTLIERS +OUTLIES +OUTLINE +OUTLINED +OUTLINER +OUTLINERS +OUTLINES +OUTLINING +OUTLIVE +OUTLIVED +OUTLIVER +OUTLIVERS +OUTLIVES +OUTLIVING +OUTLOOK +OUTLOOKS +OUTLOVE +OUTLOVED +OUTLOVES +OUTLOVING +OUTLYING +OUTMAN +OUTMANEUVER +OUTMANEUVERED +OUTMANEUVERING +OUTMANEUVERS +OUTMANIPULATE +OUTMANIPULATED +OUTMANIPULATES +OUTMANIPULATING +OUTMANNED +OUTMANNING +OUTMANS +OUTMARCH +OUTMARCHED +OUTMARCHES +OUTMARCHING +OUTMASTER +OUTMASTERED +OUTMASTERING +OUTMASTERS +OUTMATCH +OUTMATCHED +OUTMATCHES +OUTMATCHING +OUTMODE +OUTMODED +OUTMODES +OUTMODING +OUTMOST +OUTMOVE +OUTMOVED +OUTMOVES +OUTMOVING +OUTMUSCLE +OUTMUSCLED +OUTMUSCLES +OUTMUSCLING +OUTNUMBER +OUTNUMBERED +OUTNUMBERING +OUTNUMBERS +OUTOFFICE +OUTOFFICES +OUTORGANIZE +OUTORGANIZED +OUTORGANIZES +OUTORGANIZING +OUTPACE +OUTPACED +OUTPACES +OUTPACING +OUTPAINT +OUTPAINTED +OUTPAINTING +OUTPAINTS +OUTPASS +OUTPASSED +OUTPASSES +OUTPASSING +OUTPATIENT +OUTPATIENTS +OUTPEOPLE +OUTPEOPLED +OUTPEOPLES +OUTPEOPLING +OUTPERFORM +OUTPERFORMED +OUTPERFORMING +OUTPERFORMS +OUTPITCH +OUTPITCHED +OUTPITCHES +OUTPITCHING +OUTPITIED +OUTPITIES +OUTPITY +OUTPITYING +OUTPLACE +OUTPLACED +OUTPLACEMENT +OUTPLACEMENTS +OUTPLACES +OUTPLACING +OUTPLAN +OUTPLANNED +OUTPLANNING +OUTPLANS +OUTPLAY +OUTPLAYED +OUTPLAYING +OUTPLAYS +OUTPLOD +OUTPLODDED +OUTPLODDING +OUTPLODS +OUTPLOT +OUTPLOTS +OUTPLOTTED +OUTPLOTTING +OUTPOINT +OUTPOINTED +OUTPOINTING +OUTPOINTS +OUTPOLITICK +OUTPOLITICKED +OUTPOLITICKING +OUTPOLITICKS +OUTPOLL +OUTPOLLED +OUTPOLLING +OUTPOLLS +OUTPOPULATE +OUTPOPULATED +OUTPOPULATES +OUTPOPULATING +OUTPORT +OUTPORTS +OUTPOST +OUTPOSTS +OUTPOUR +OUTPOURED +OUTPOURER +OUTPOURERS +OUTPOURING +OUTPOURINGS +OUTPOURS +OUTPOWER +OUTPOWERED +OUTPOWERING +OUTPOWERS +OUTPRAY +OUTPRAYED +OUTPRAYING +OUTPRAYS +OUTPREACH +OUTPREACHED +OUTPREACHES +OUTPREACHING +OUTPREEN +OUTPREENED +OUTPREENING +OUTPREENS +OUTPRESS +OUTPRESSED +OUTPRESSES +OUTPRESSING +OUTPRICE +OUTPRICED +OUTPRICES +OUTPRICING +OUTPRODUCE +OUTPRODUCED +OUTPRODUCES +OUTPRODUCING +OUTPROMISE +OUTPROMISED +OUTPROMISES +OUTPROMISING +OUTPULL +OUTPULLED +OUTPULLING +OUTPULLS +OUTPUNCH +OUTPUNCHED +OUTPUNCHES +OUTPUNCHING +OUTPUPIL +OUTPUPILS +OUTPURSUE +OUTPURSUED +OUTPURSUES +OUTPURSUING +OUTPUSH +OUTPUSHED +OUTPUSHES +OUTPUSHING +OUTPUT +OUTPUTS +OUTPUTTED +OUTPUTTING +OUTQUOTE +OUTQUOTED +OUTQUOTES +OUTQUOTING +OUTRACE +OUTRACED +OUTRACES +OUTRACING +OUTRAGE +OUTRAGED +OUTRAGEOUS +OUTRAGEOUSLY +OUTRAGEOUSNESS +OUTRAGES +OUTRAGING +OUTRAISE +OUTRAISED +OUTRAISES +OUTRAISING +OUTRAN +OUTRANCE +OUTRANCES +OUTRANG +OUTRANGE +OUTRANGED +OUTRANGES +OUTRANGING +OUTRANK +OUTRANKED +OUTRANKING +OUTRANKS +OUTRATE +OUTRATED +OUTRATES +OUTRATING +OUTRAVE +OUTRAVED +OUTRAVES +OUTRAVING +OUTRE +OUTREACH +OUTREACHED +OUTREACHES +OUTREACHING +OUTREAD +OUTREADING +OUTREADS +OUTREASON +OUTREASONED +OUTREASONING +OUTREASONS +OUTREBOUND +OUTREBOUNDED +OUTREBOUNDING +OUTREBOUNDS +OUTRECKON +OUTRECKONED +OUTRECKONING +OUTRECKONS +OUTREPRODUCE +OUTREPRODUCED +OUTREPRODUCES +OUTREPRODUCING +OUTRIDDEN +OUTRIDE +OUTRIDER +OUTRIDERS +OUTRIDES +OUTRIDING +OUTRIG +OUTRIGGED +OUTRIGGER +OUTRIGGERS +OUTRIGGING +OUTRIGHT +OUTRIGHTLY +OUTRIGS +OUTRING +OUTRINGING +OUTRINGS +OUTRIVAL +OUTRIVALED +OUTRIVALING +OUTRIVALLED +OUTRIVALLING +OUTRIVALS +OUTROAR +OUTROARED +OUTROARING +OUTROARS +OUTROCK +OUTROCKED +OUTROCKING +OUTROCKS +OUTRODE +OUTROLL +OUTROLLED +OUTROLLING +OUTROLLS +OUTROOT +OUTROOTED +OUTROOTING +OUTROOTS +OUTROW +OUTROWED +OUTROWING +OUTROWS +OUTRUN +OUTRUNG +OUTRUNNER +OUTRUNNERS +OUTRUNNING +OUTRUNS +OUTRUSH +OUTRUSHED +OUTRUSHES +OUTRUSHING +OUTS +OUTSAID +OUTSAIL +OUTSAILED +OUTSAILING +OUTSAILS +OUTSANG +OUTSAT +OUTSAVOR +OUTSAVORED +OUTSAVORING +OUTSAVORS +OUTSAW +OUTSAY +OUTSAYING +OUTSAYS +OUTSCHEME +OUTSCHEMED +OUTSCHEMES +OUTSCHEMING +OUTSCOLD +OUTSCOLDED +OUTSCOLDING +OUTSCOLDS +OUTSCOOP +OUTSCOOPED +OUTSCOOPING +OUTSCOOPS +OUTSCORE +OUTSCORED +OUTSCORES +OUTSCORING +OUTSCORN +OUTSCORNED +OUTSCORNING +OUTSCORNS +OUTSCREAM +OUTSCREAMED +OUTSCREAMING +OUTSCREAMS +OUTSEE +OUTSEEING +OUTSEEN +OUTSEES +OUTSELL +OUTSELLING +OUTSELLS +OUTSERT +OUTSERTS +OUTSERVE +OUTSERVED +OUTSERVES +OUTSERVING +OUTSET +OUTSETS +OUTSHAME +OUTSHAMED +OUTSHAMES +OUTSHAMING +OUTSHINE +OUTSHINED +OUTSHINES +OUTSHINING +OUTSHONE +OUTSHOOT +OUTSHOOTING +OUTSHOOTS +OUTSHOT +OUTSHOUT +OUTSHOUTED +OUTSHOUTING +OUTSHOUTS +OUTSIDE +OUTSIDER +OUTSIDERNESS +OUTSIDERNESSES +OUTSIDERS +OUTSIDES +OUTSIGHT +OUTSIGHTS +OUTSIN +OUTSING +OUTSINGING +OUTSINGS +OUTSINNED +OUTSINNING +OUTSINS +OUTSIT +OUTSITS +OUTSITTING +OUTSIZE +OUTSIZED +OUTSIZES +OUTSKATE +OUTSKATED +OUTSKATES +OUTSKATING +OUTSKIRT +OUTSKIRTS +OUTSLEEP +OUTSLEEPING +OUTSLEEPS +OUTSLEPT +OUTSLICK +OUTSLICKED +OUTSLICKING +OUTSLICKS +OUTSMART +OUTSMARTED +OUTSMARTING +OUTSMARTS +OUTSMELL +OUTSMELLED +OUTSMELLING +OUTSMELLS +OUTSMELT +OUTSMILE +OUTSMILED +OUTSMILES +OUTSMILING +OUTSMOKE +OUTSMOKED +OUTSMOKES +OUTSMOKING +OUTSNORE +OUTSNORED +OUTSNORES +OUTSNORING +OUTSOAR +OUTSOARED +OUTSOARING +OUTSOARS +OUTSOLD +OUTSOLE +OUTSOLES +OUTSOURCE +OUTSOURCED +OUTSOURCES +OUTSOURCING +OUTSOURCINGS +OUTSPAN +OUTSPANNED +OUTSPANNING +OUTSPANS +OUTSPARKLE +OUTSPARKLED +OUTSPARKLES +OUTSPARKLING +OUTSPEAK +OUTSPEAKING +OUTSPEAKS +OUTSPED +OUTSPEED +OUTSPEEDED +OUTSPEEDING +OUTSPEEDS +OUTSPELL +OUTSPELLED +OUTSPELLING +OUTSPELLS +OUTSPELT +OUTSPEND +OUTSPENDING +OUTSPENDS +OUTSPENT +OUTSPOKE +OUTSPOKEN +OUTSPOKENLY +OUTSPOKENNESS +OUTSPOKENNESSES +OUTSPRANG +OUTSPREAD +OUTSPREADING +OUTSPREADS +OUTSPRING +OUTSPRINGING +OUTSPRINGS +OUTSPRINT +OUTSPRINTED +OUTSPRINTING +OUTSPRINTS +OUTSPRUNG +OUTSTAND +OUTSTANDING +OUTSTANDINGLY +OUTSTANDS +OUTSTARE +OUTSTARED +OUTSTARES +OUTSTARING +OUTSTART +OUTSTARTED +OUTSTARTING +OUTSTARTS +OUTSTATE +OUTSTATED +OUTSTATES +OUTSTATING +OUTSTATION +OUTSTATIONS +OUTSTAY +OUTSTAYED +OUTSTAYING +OUTSTAYS +OUTSTEER +OUTSTEERED +OUTSTEERING +OUTSTEERS +OUTSTOOD +OUTSTRETCH +OUTSTRETCHED +OUTSTRETCHES +OUTSTRETCHING +OUTSTRIDDEN +OUTSTRIDE +OUTSTRIDES +OUTSTRIDING +OUTSTRIP +OUTSTRIPPED +OUTSTRIPPING +OUTSTRIPS +OUTSTRIVE +OUTSTRIVEN +OUTSTRIVES +OUTSTRIVING +OUTSTRODE +OUTSTROKE +OUTSTROKES +OUTSTROVE +OUTSTUDIED +OUTSTUDIES +OUTSTUDY +OUTSTUDYING +OUTSTUNT +OUTSTUNTED +OUTSTUNTING +OUTSTUNTS +OUTSULK +OUTSULKED +OUTSULKING +OUTSULKS +OUTSUNG +OUTSWAM +OUTSWARE +OUTSWEAR +OUTSWEARING +OUTSWEARS +OUTSWEEP +OUTSWEEPING +OUTSWEEPS +OUTSWEPT +OUTSWIM +OUTSWIMMING +OUTSWIMS +OUTSWING +OUTSWINGING +OUTSWINGS +OUTSWORE +OUTSWORN +OUTSWUM +OUTSWUNG +OUTTAKE +OUTTAKES +OUTTALK +OUTTALKED +OUTTALKING +OUTTALKS +OUTTASK +OUTTASKED +OUTTASKING +OUTTASKS +OUTTELL +OUTTELLING +OUTTELLS +OUTTHANK +OUTTHANKED +OUTTHANKING +OUTTHANKS +OUTTHIEVE +OUTTHIEVED +OUTTHIEVES +OUTTHIEVING +OUTTHINK +OUTTHINKING +OUTTHINKS +OUTTHOUGHT +OUTTHREW +OUTTHROB +OUTTHROBBED +OUTTHROBBING +OUTTHROBS +OUTTHROW +OUTTHROWING +OUTTHROWN +OUTTHROWS +OUTTHRUST +OUTTHRUSTED +OUTTHRUSTING +OUTTHRUSTS +OUTTOLD +OUTTOWER +OUTTOWERED +OUTTOWERING +OUTTOWERS +OUTTRADE +OUTTRADED +OUTTRADES +OUTTRADING +OUTTRAVEL +OUTTRAVELED +OUTTRAVELING +OUTTRAVELLED +OUTTRAVELLING +OUTTRAVELS +OUTTRICK +OUTTRICKED +OUTTRICKING +OUTTRICKS +OUTTROT +OUTTROTS +OUTTROTTED +OUTTROTTING +OUTTRUMP +OUTTRUMPED +OUTTRUMPING +OUTTRUMPS +OUTTURN +OUTTURNS +OUTVALUE +OUTVALUED +OUTVALUES +OUTVALUING +OUTVAUNT +OUTVAUNTED +OUTVAUNTING +OUTVAUNTS +OUTVIE +OUTVIED +OUTVIES +OUTVOICE +OUTVOICED +OUTVOICES +OUTVOICING +OUTVOTE +OUTVOTED +OUTVOTES +OUTVOTING +OUTVYING +OUTWAIT +OUTWAITED +OUTWAITING +OUTWAITS +OUTWALK +OUTWALKED +OUTWALKING +OUTWALKS +OUTWAR +OUTWARD +OUTWARDLY +OUTWARDNESS +OUTWARDNESSES +OUTWARDS +OUTWARRED +OUTWARRING +OUTWARS +OUTWASH +OUTWASHES +OUTWASTE +OUTWASTED +OUTWASTES +OUTWASTING +OUTWATCH +OUTWATCHED +OUTWATCHES +OUTWATCHING +OUTWEAR +OUTWEARIED +OUTWEARIES +OUTWEARING +OUTWEARS +OUTWEARY +OUTWEARYING +OUTWEEP +OUTWEEPING +OUTWEEPS +OUTWEIGH +OUTWEIGHED +OUTWEIGHING +OUTWEIGHS +OUTWENT +OUTWEPT +OUTWHIRL +OUTWHIRLED +OUTWHIRLING +OUTWHIRLS +OUTWILE +OUTWILED +OUTWILES +OUTWILING +OUTWILL +OUTWILLED +OUTWILLING +OUTWILLS +OUTWIND +OUTWINDED +OUTWINDING +OUTWINDS +OUTWISH +OUTWISHED +OUTWISHES +OUTWISHING +OUTWIT +OUTWITH +OUTWITS +OUTWITTED +OUTWITTING +OUTWORE +OUTWORK +OUTWORKED +OUTWORKER +OUTWORKERS +OUTWORKING +OUTWORKS +OUTWORN +OUTWRESTLE +OUTWRESTLED +OUTWRESTLES +OUTWRESTLING +OUTWRIT +OUTWRITE +OUTWRITES +OUTWRITING +OUTWRITTEN +OUTWROTE +OUTWROUGHT +OUTYELL +OUTYELLED +OUTYELLING +OUTYELLS +OUTYELP +OUTYELPED +OUTYELPING +OUTYELPS +OUTYIELD +OUTYIELDED +OUTYIELDING +OUTYIELDS +OUZEL +OUZELS +OUZO +OUZOS +OVA +OVAL +OVALBUMIN +OVALBUMINS +OVALITIES +OVALITY +OVALLY +OVALNESS +OVALNESSES +OVALS +OVARIAL +OVARIAN +OVARIECTOMIES +OVARIECTOMIZED +OVARIECTOMY +OVARIES +OVARIOLE +OVARIOLES +OVARIOTOMIES +OVARIOTOMY +OVARITIDES +OVARITIS +OVARY +OVATE +OVATELY +OVATION +OVATIONAL +OVATIONS +OVEN +OVENBIRD +OVENBIRDS +OVENLIKE +OVENPROOF +OVENS +OVENWARE +OVENWARES +OVER +OVERABLE +OVERABSTRACT +OVERABUNDANCE +OVERABUNDANCES +OVERABUNDANT +OVERACCENTUATE +OVERACCENTUATED +OVERACCENTUATES +OVERACHIEVE +OVERACHIEVED +OVERACHIEVEMENT +OVERACHIEVER +OVERACHIEVERS +OVERACHIEVES +OVERACHIEVING +OVERACT +OVERACTED +OVERACTING +OVERACTION +OVERACTIONS +OVERACTIVE +OVERACTIVITIES +OVERACTIVITY +OVERACTS +OVERACUTE +OVERADJUSTMENT +OVERADJUSTMENTS +OVERADVERTISE +OVERADVERTISED +OVERADVERTISES +OVERADVERTISING +OVERAGE +OVERAGED +OVERAGES +OVERAGGRESSIVE +OVERALERT +OVERALL +OVERALLED +OVERALLS +OVERAMBITIOUS +OVERAMPLIFIED +OVERANALYSES +OVERANALYSIS +OVERANALYTICAL +OVERANALYZE +OVERANALYZED +OVERANALYZES +OVERANALYZING +OVERANXIETIES +OVERANXIETY +OVERANXIOUS +OVERAPPLICATION +OVERAPT +OVERARCH +OVERARCHED +OVERARCHES +OVERARCHING +OVERARM +OVERARMED +OVERARMING +OVERARMS +OVERAROUSAL +OVERAROUSALS +OVERARRANGE +OVERARRANGED +OVERARRANGES +OVERARRANGING +OVERARTICULATE +OVERARTICULATED +OVERARTICULATES +OVERASSERT +OVERASSERTED +OVERASSERTING +OVERASSERTION +OVERASSERTIONS +OVERASSERTIVE +OVERASSERTS +OVERASSESSMENT +OVERASSESSMENTS +OVERATE +OVERATTENTION +OVERATTENTIONS +OVERAWE +OVERAWED +OVERAWES +OVERAWING +OVERBAKE +OVERBAKED +OVERBAKES +OVERBAKING +OVERBALANCE +OVERBALANCED +OVERBALANCES +OVERBALANCING +OVERBEAR +OVERBEARING +OVERBEARINGLY +OVERBEARS +OVERBEAT +OVERBEATEN +OVERBEATING +OVERBEATS +OVERBED +OVERBEJEWELED +OVERBET +OVERBETS +OVERBETTED +OVERBETTING +OVERBID +OVERBIDDEN +OVERBIDDING +OVERBIDS +OVERBIG +OVERBILL +OVERBILLED +OVERBILLING +OVERBILLS +OVERBITE +OVERBITES +OVERBLEACH +OVERBLEACHED +OVERBLEACHES +OVERBLEACHING +OVERBLEW +OVERBLOUSE +OVERBLOUSES +OVERBLOW +OVERBLOWING +OVERBLOWN +OVERBLOWS +OVERBOARD +OVERBOIL +OVERBOILED +OVERBOILING +OVERBOILS +OVERBOLD +OVERBOOK +OVERBOOKED +OVERBOOKING +OVERBOOKS +OVERBORE +OVERBORN +OVERBORNE +OVERBORROW +OVERBORROWED +OVERBORROWING +OVERBORROWS +OVERBOUGHT +OVERBRAKE +OVERBRAKED +OVERBRAKES +OVERBRAKING +OVERBREATHING +OVERBREATHINGS +OVERBRED +OVERBREED +OVERBREEDING +OVERBREEDS +OVERBRIEF +OVERBRIEFED +OVERBRIEFING +OVERBRIEFS +OVERBRIGHT +OVERBROAD +OVERBROWSE +OVERBROWSED +OVERBROWSES +OVERBROWSING +OVERBRUTAL +OVERBUILD +OVERBUILDING +OVERBUILDS +OVERBUILT +OVERBURDEN +OVERBURDENED +OVERBURDENING +OVERBURDENS +OVERBURN +OVERBURNED +OVERBURNING +OVERBURNS +OVERBURNT +OVERBUSY +OVERBUY +OVERBUYING +OVERBUYS +OVERCALL +OVERCALLED +OVERCALLING +OVERCALLS +OVERCAME +OVERCAPACITIES +OVERCAPACITY +OVERCAPITALIZE +OVERCAPITALIZED +OVERCAPITALIZES +OVERCAREFUL +OVERCAST +OVERCASTED +OVERCASTING +OVERCASTINGS +OVERCASTS +OVERCAUTION +OVERCAUTIONS +OVERCAUTIOUS +OVERCENTRALIZE +OVERCENTRALIZED +OVERCENTRALIZES +OVERCHARGE +OVERCHARGED +OVERCHARGES +OVERCHARGING +OVERCHEAP +OVERCHILL +OVERCHILLED +OVERCHILLING +OVERCHILLS +OVERCIVIL +OVERCIVILIZED +OVERCLAIM +OVERCLAIMED +OVERCLAIMING +OVERCLAIMS +OVERCLASS +OVERCLASSES +OVERCLASSIFIED +OVERCLASSIFIES +OVERCLASSIFY +OVERCLASSIFYING +OVERCLEAN +OVERCLEANED +OVERCLEANING +OVERCLEANS +OVERCLEAR +OVERCLEARED +OVERCLEARING +OVERCLEARS +OVERCLOSE +OVERCLOUD +OVERCLOUDED +OVERCLOUDING +OVERCLOUDS +OVERCOACH +OVERCOACHED +OVERCOACHES +OVERCOACHING +OVERCOAT +OVERCOATS +OVERCOLD +OVERCOLOR +OVERCOLORED +OVERCOLORING +OVERCOLORS +OVERCOME +OVERCOMER +OVERCOMERS +OVERCOMES +OVERCOMING +OVERCOMMIT +OVERCOMMITMENT +OVERCOMMITMENTS +OVERCOMMITS +OVERCOMMITTED +OVERCOMMITTING +OVERCOMMUNICATE +OVERCOMPENSATE +OVERCOMPENSATED +OVERCOMPENSATES +OVERCOMPLEX +OVERCOMPLIANCE +OVERCOMPLIANCES +OVERCOMPLICATE +OVERCOMPLICATED +OVERCOMPLICATES +OVERCOMPRESS +OVERCOMPRESSED +OVERCOMPRESSES +OVERCOMPRESSING +OVERCONCERN +OVERCONCERNED +OVERCONCERNING +OVERCONCERNS +OVERCONFIDENCE +OVERCONFIDENCES +OVERCONFIDENT +OVERCONFIDENTLY +OVERCONSCIOUS +OVERCONSTRUCT +OVERCONSTRUCTED +OVERCONSTRUCTS +OVERCONSUME +OVERCONSUMED +OVERCONSUMES +OVERCONSUMING +OVERCONSUMPTION +OVERCONTROL +OVERCONTROLLED +OVERCONTROLLING +OVERCONTROLS +OVERCOOK +OVERCOOKED +OVERCOOKING +OVERCOOKS +OVERCOOL +OVERCOOLED +OVERCOOLING +OVERCOOLS +OVERCORRECT +OVERCORRECTED +OVERCORRECTING +OVERCORRECTS +OVERCOUNT +OVERCOUNTED +OVERCOUNTING +OVERCOUNTS +OVERCOY +OVERCRAM +OVERCRAMMED +OVERCRAMMING +OVERCRAMS +OVERCREDULOUS +OVERCRITICAL +OVERCROP +OVERCROPPED +OVERCROPPING +OVERCROPS +OVERCROWD +OVERCROWDED +OVERCROWDING +OVERCROWDS +OVERCULTIVATION +OVERCURE +OVERCURED +OVERCURES +OVERCURING +OVERCUT +OVERCUTS +OVERCUTTING +OVERDARE +OVERDARED +OVERDARES +OVERDARING +OVERDEAR +OVERDECK +OVERDECKED +OVERDECKING +OVERDECKS +OVERDECORATE +OVERDECORATED +OVERDECORATES +OVERDECORATING +OVERDECORATION +OVERDECORATIONS +OVERDEMANDING +OVERDEPENDENCE +OVERDEPENDENCES +OVERDEPENDENT +OVERDESIGN +OVERDESIGNED +OVERDESIGNING +OVERDESIGNS +OVERDETERMINED +OVERDEVELOP +OVERDEVELOPED +OVERDEVELOPING +OVERDEVELOPMENT +OVERDEVELOPS +OVERDID +OVERDIRECT +OVERDIRECTED +OVERDIRECTING +OVERDIRECTS +OVERDISCOUNT +OVERDISCOUNTED +OVERDISCOUNTING +OVERDISCOUNTS +OVERDIVERSITIES +OVERDIVERSITY +OVERDO +OVERDOCUMENT +OVERDOCUMENTED +OVERDOCUMENTING +OVERDOCUMENTS +OVERDOER +OVERDOERS +OVERDOES +OVERDOG +OVERDOGS +OVERDOING +OVERDOMINANCE +OVERDOMINANCES +OVERDOMINANT +OVERDONE +OVERDOSAGE +OVERDOSAGES +OVERDOSE +OVERDOSED +OVERDOSES +OVERDOSING +OVERDRAFT +OVERDRAFTS +OVERDRAMATIC +OVERDRAMATIZE +OVERDRAMATIZED +OVERDRAMATIZES +OVERDRAMATIZING +OVERDRANK +OVERDRAW +OVERDRAWING +OVERDRAWN +OVERDRAWS +OVERDRESS +OVERDRESSED +OVERDRESSES +OVERDRESSING +OVERDREW +OVERDRIED +OVERDRIES +OVERDRINK +OVERDRINKING +OVERDRINKS +OVERDRIVE +OVERDRIVEN +OVERDRIVES +OVERDRIVING +OVERDROVE +OVERDRUNK +OVERDRY +OVERDRYING +OVERDUB +OVERDUBBED +OVERDUBBING +OVERDUBS +OVERDUE +OVERDYE +OVERDYED +OVERDYEING +OVERDYER +OVERDYERS +OVERDYES +OVEREAGER +OVEREAGERNESS +OVEREAGERNESSES +OVEREARNEST +OVEREASY +OVEREAT +OVEREATEN +OVEREATER +OVEREATERS +OVEREATING +OVEREATS +OVERED +OVEREDIT +OVEREDITED +OVEREDITING +OVEREDITS +OVEREDUCATE +OVEREDUCATED +OVEREDUCATES +OVEREDUCATING +OVEREDUCATION +OVEREDUCATIONS +OVERELABORATE +OVERELABORATED +OVERELABORATES +OVERELABORATING +OVERELABORATION +OVEREMBELLISH +OVEREMBELLISHED +OVEREMBELLISHES +OVEREMOTE +OVEREMOTED +OVEREMOTES +OVEREMOTING +OVEREMOTIONAL +OVEREMPHASES +OVEREMPHASIS +OVEREMPHASIZE +OVEREMPHASIZED +OVEREMPHASIZES +OVEREMPHASIZING +OVEREMPHATIC +OVERENAMORED +OVERENCOURAGE +OVERENCOURAGED +OVERENCOURAGES +OVERENCOURAGING +OVERENERGETIC +OVERENGINEER +OVERENGINEERED +OVERENGINEERING +OVERENGINEERS +OVERENROLLED +OVERENTERTAINED +OVERENTHUSIASM +OVERENTHUSIASMS +OVEREQUIPPED +OVERESTIMATE +OVERESTIMATED +OVERESTIMATES +OVERESTIMATING +OVERESTIMATION +OVERESTIMATIONS +OVEREVALUATION +OVEREVALUATIONS +OVEREXAGGERATE +OVEREXAGGERATED +OVEREXAGGERATES +OVEREXCITE +OVEREXCITED +OVEREXCITES +OVEREXCITING +OVEREXERCISE +OVEREXERCISED +OVEREXERCISES +OVEREXERCISING +OVEREXERT +OVEREXERTED +OVEREXERTING +OVEREXERTION +OVEREXERTIONS +OVEREXERTS +OVEREXPAND +OVEREXPANDED +OVEREXPANDING +OVEREXPANDS +OVEREXPANSION +OVEREXPANSIONS +OVEREXPECTATION +OVEREXPLAIN +OVEREXPLAINED +OVEREXPLAINING +OVEREXPLAINS +OVEREXPLICIT +OVEREXPLOIT +OVEREXPLOITED +OVEREXPLOITING +OVEREXPLOITS +OVEREXPOSE +OVEREXPOSED +OVEREXPOSES +OVEREXPOSING +OVEREXPOSURE +OVEREXPOSURES +OVEREXTEND +OVEREXTENDED +OVEREXTENDING +OVEREXTENDS +OVEREXTENSION +OVEREXTENSIONS +OVEREXTRACTION +OVEREXTRACTIONS +OVEREXTRAVAGANT +OVEREXUBERANT +OVERFACILE +OVERFAMILIAR +OVERFAMILIARITY +OVERFAR +OVERFAST +OVERFASTIDIOUS +OVERFAT +OVERFATIGUE +OVERFATIGUED +OVERFATIGUES +OVERFAVOR +OVERFAVORED +OVERFAVORING +OVERFAVORS +OVERFEAR +OVERFEARED +OVERFEARING +OVERFEARS +OVERFED +OVERFEED +OVERFEEDING +OVERFEEDS +OVERFERTILIZE +OVERFERTILIZED +OVERFERTILIZES +OVERFERTILIZING +OVERFILL +OVERFILLED +OVERFILLING +OVERFILLS +OVERFISH +OVERFISHED +OVERFISHES +OVERFISHING +OVERFIT +OVERFLEW +OVERFLIES +OVERFLIGHT +OVERFLIGHTS +OVERFLOOD +OVERFLOODED +OVERFLOODING +OVERFLOODS +OVERFLOW +OVERFLOWED +OVERFLOWING +OVERFLOWN +OVERFLOWS +OVERFLY +OVERFLYING +OVERFOCUS +OVERFOCUSED +OVERFOCUSES +OVERFOCUSING +OVERFOCUSSED +OVERFOCUSSES +OVERFOCUSSING +OVERFOND +OVERFOUL +OVERFRANK +OVERFREE +OVERFULFILL +OVERFULFILLED +OVERFULFILLING +OVERFULFILLS +OVERFULL +OVERFUND +OVERFUNDED +OVERFUNDING +OVERFUNDS +OVERFUSSY +OVERGARMENT +OVERGARMENTS +OVERGENERALIZE +OVERGENERALIZED +OVERGENERALIZES +OVERGENEROSITY +OVERGENEROUS +OVERGENEROUSLY +OVERGILD +OVERGILDED +OVERGILDING +OVERGILDS +OVERGILT +OVERGIRD +OVERGIRDED +OVERGIRDING +OVERGIRDS +OVERGIRT +OVERGLAD +OVERGLAMORIZE +OVERGLAMORIZED +OVERGLAMORIZES +OVERGLAMORIZING +OVERGLAZE +OVERGLAZED +OVERGLAZES +OVERGLAZING +OVERGOAD +OVERGOADED +OVERGOADING +OVERGOADS +OVERGOVERN +OVERGOVERNED +OVERGOVERNING +OVERGOVERNS +OVERGRADE +OVERGRADED +OVERGRADES +OVERGRADING +OVERGRAZE +OVERGRAZED +OVERGRAZES +OVERGRAZING +OVERGREAT +OVERGREW +OVERGROW +OVERGROWING +OVERGROWN +OVERGROWS +OVERGROWTH +OVERGROWTHS +OVERHAND +OVERHANDED +OVERHANDING +OVERHANDLE +OVERHANDLED +OVERHANDLES +OVERHANDLING +OVERHANDS +OVERHANG +OVERHANGING +OVERHANGS +OVERHARD +OVERHARVEST +OVERHARVESTED +OVERHARVESTING +OVERHARVESTS +OVERHASTY +OVERHATE +OVERHATED +OVERHATES +OVERHATING +OVERHAUL +OVERHAULED +OVERHAULING +OVERHAULS +OVERHEAD +OVERHEADS +OVERHEAP +OVERHEAPED +OVERHEAPING +OVERHEAPS +OVERHEAR +OVERHEARD +OVERHEARING +OVERHEARS +OVERHEAT +OVERHEATED +OVERHEATING +OVERHEATS +OVERHELD +OVERHIGH +OVERHOLD +OVERHOLDING +OVERHOLDS +OVERHOLY +OVERHOMOGENIZE +OVERHOMOGENIZED +OVERHOMOGENIZES +OVERHONOR +OVERHONORED +OVERHONORING +OVERHONORS +OVERHOPE +OVERHOPED +OVERHOPES +OVERHOPING +OVERHOT +OVERHUNG +OVERHUNT +OVERHUNTED +OVERHUNTING +OVERHUNTINGS +OVERHUNTS +OVERHYPE +OVERHYPED +OVERHYPES +OVERHYPING +OVERIDEALIZE +OVERIDEALIZED +OVERIDEALIZES +OVERIDEALIZING +OVERIDENTIFIED +OVERIDENTIFIES +OVERIDENTIFY +OVERIDENTIFYING +OVERIDLE +OVERIMAGINATIVE +OVERIMPRESS +OVERIMPRESSED +OVERIMPRESSES +OVERIMPRESSING +OVERINDULGE +OVERINDULGED +OVERINDULGENCE +OVERINDULGENCES +OVERINDULGENT +OVERINDULGES +OVERINDULGING +OVERINFLATE +OVERINFLATED +OVERINFLATES +OVERINFLATING +OVERINFLATION +OVERINFLATIONS +OVERINFORM +OVERINFORMED +OVERINFORMING +OVERINFORMS +OVERING +OVERINGENIOUS +OVERINGENUITIES +OVERINGENUITY +OVERINSISTENT +OVERINTENSE +OVERINTENSITIES +OVERINTENSITY +OVERINVESTMENT +OVERINVESTMENTS +OVERISSUANCE +OVERISSUANCES +OVERISSUE +OVERISSUED +OVERISSUES +OVERISSUING +OVERJOY +OVERJOYED +OVERJOYING +OVERJOYS +OVERJUST +OVERKEEN +OVERKILL +OVERKILLED +OVERKILLING +OVERKILLS +OVERKIND +OVERLABOR +OVERLABORED +OVERLABORING +OVERLABORS +OVERLADE +OVERLADED +OVERLADEN +OVERLADES +OVERLADING +OVERLAID +OVERLAIN +OVERLAND +OVERLANDS +OVERLAP +OVERLAPPED +OVERLAPPING +OVERLAPS +OVERLARGE +OVERLATE +OVERLAVISH +OVERLAX +OVERLAY +OVERLAYING +OVERLAYS +OVERLEAF +OVERLEAP +OVERLEAPED +OVERLEAPING +OVERLEAPS +OVERLEAPT +OVERLEARN +OVERLEARNED +OVERLEARNING +OVERLEARNS +OVERLEARNT +OVERLEND +OVERLENDING +OVERLENDS +OVERLENGTH +OVERLENGTHEN +OVERLENGTHENED +OVERLENGTHENING +OVERLENGTHENS +OVERLENGTHS +OVERLENT +OVERLET +OVERLETS +OVERLETTING +OVERLEWD +OVERLIE +OVERLIES +OVERLIGHT +OVERLIGHTED +OVERLIGHTING +OVERLIGHTS +OVERLIT +OVERLITERAL +OVERLITERARY +OVERLIVE +OVERLIVED +OVERLIVES +OVERLIVING +OVERLOAD +OVERLOADED +OVERLOADING +OVERLOADS +OVERLONG +OVERLOOK +OVERLOOKED +OVERLOOKING +OVERLOOKS +OVERLORD +OVERLORDED +OVERLORDING +OVERLORDS +OVERLORDSHIP +OVERLORDSHIPS +OVERLOUD +OVERLOVE +OVERLOVED +OVERLOVES +OVERLOVING +OVERLUSH +OVERLY +OVERLYING +OVERMAN +OVERMANAGE +OVERMANAGED +OVERMANAGES +OVERMANAGING +OVERMANNED +OVERMANNERED +OVERMANNING +OVERMANS +OVERMANTEL +OVERMANTELS +OVERMANY +OVERMASTER +OVERMASTERED +OVERMASTERING +OVERMASTERS +OVERMATCH +OVERMATCHED +OVERMATCHES +OVERMATCHING +OVERMATURE +OVERMATURITIES +OVERMATURITY +OVERMEDICATE +OVERMEDICATED +OVERMEDICATES +OVERMEDICATING +OVERMEDICATION +OVERMEDICATIONS +OVERMEEK +OVERMELT +OVERMELTED +OVERMELTING +OVERMELTS +OVERMEN +OVERMIGHTY +OVERMILD +OVERMILK +OVERMILKED +OVERMILKING +OVERMILKS +OVERMINE +OVERMINED +OVERMINES +OVERMINING +OVERMIX +OVERMIXED +OVERMIXES +OVERMIXING +OVERMODEST +OVERMODESTLY +OVERMUCH +OVERMUCHES +OVERMUSCLED +OVERNEAR +OVERNEAT +OVERNEW +OVERNICE +OVERNIGHT +OVERNIGHTED +OVERNIGHTER +OVERNIGHTERS +OVERNIGHTING +OVERNIGHTS +OVERNOURISH +OVERNOURISHED +OVERNOURISHES +OVERNOURISHING +OVERNUTRITION +OVERNUTRITIONS +OVEROBVIOUS +OVEROPERATE +OVEROPERATED +OVEROPERATES +OVEROPERATING +OVEROPINIONATED +OVEROPTIMISM +OVEROPTIMISMS +OVEROPTIMIST +OVEROPTIMISTIC +OVEROPTIMISTS +OVERORCHESTRATE +OVERORGANIZE +OVERORGANIZED +OVERORGANIZES +OVERORGANIZING +OVERORNAMENT +OVERORNAMENTED +OVERORNAMENTING +OVERORNAMENTS +OVERPACK +OVERPACKAGE +OVERPACKAGED +OVERPACKAGES +OVERPACKAGING +OVERPACKED +OVERPACKING +OVERPACKS +OVERPAID +OVERPARTICULAR +OVERPASS +OVERPASSED +OVERPASSES +OVERPASSING +OVERPAST +OVERPAY +OVERPAYING +OVERPAYMENT +OVERPAYMENTS +OVERPAYS +OVERPEDAL +OVERPEDALED +OVERPEDALING +OVERPEDALLED +OVERPEDALLING +OVERPEDALS +OVERPEOPLE +OVERPEOPLED +OVERPEOPLES +OVERPEOPLING +OVERPERSUADE +OVERPERSUADED +OVERPERSUADES +OVERPERSUADING +OVERPERSUASION +OVERPERSUASIONS +OVERPERT +OVERPLAID +OVERPLAIDED +OVERPLAIDS +OVERPLAN +OVERPLANNED +OVERPLANNING +OVERPLANS +OVERPLANT +OVERPLANTED +OVERPLANTING +OVERPLANTS +OVERPLAY +OVERPLAYED +OVERPLAYING +OVERPLAYS +OVERPLIED +OVERPLIES +OVERPLOT +OVERPLOTS +OVERPLOTTED +OVERPLOTTING +OVERPLUS +OVERPLUSES +OVERPLY +OVERPLYING +OVERPOPULATE +OVERPOPULATED +OVERPOPULATES +OVERPOPULATING +OVERPOPULATION +OVERPOPULATIONS +OVERPOTENT +OVERPOWER +OVERPOWERED +OVERPOWERING +OVERPOWERINGLY +OVERPOWERS +OVERPRAISE +OVERPRAISED +OVERPRAISES +OVERPRAISING +OVERPRECISE +OVERPRESCRIBE +OVERPRESCRIBED +OVERPRESCRIBES +OVERPRESCRIBING +OVERPRESSURE +OVERPRESSURES +OVERPRICE +OVERPRICED +OVERPRICES +OVERPRICING +OVERPRINT +OVERPRINTED +OVERPRINTING +OVERPRINTS +OVERPRIVILEGED +OVERPRIZE +OVERPRIZED +OVERPRIZES +OVERPRIZING +OVERPROCESS +OVERPROCESSED +OVERPROCESSES +OVERPROCESSING +OVERPRODUCE +OVERPRODUCED +OVERPRODUCES +OVERPRODUCING +OVERPRODUCTION +OVERPRODUCTIONS +OVERPROGRAM +OVERPROGRAMED +OVERPROGRAMING +OVERPROGRAMMED +OVERPROGRAMMING +OVERPROGRAMS +OVERPROMISE +OVERPROMISED +OVERPROMISES +OVERPROMISING +OVERPROMOTE +OVERPROMOTED +OVERPROMOTES +OVERPROMOTING +OVERPROOF +OVERPROPORTION +OVERPROPORTIONS +OVERPROTECT +OVERPROTECTED +OVERPROTECTING +OVERPROTECTION +OVERPROTECTIONS +OVERPROTECTIVE +OVERPROTECTS +OVERPROUD +OVERPUMP +OVERPUMPED +OVERPUMPING +OVERPUMPS +OVERQUALIFIED +OVERQUICK +OVERRAN +OVERRANK +OVERRASH +OVERRATE +OVERRATED +OVERRATES +OVERRATING +OVERREACH +OVERREACHED +OVERREACHER +OVERREACHERS +OVERREACHES +OVERREACHING +OVERREACT +OVERREACTED +OVERREACTING +OVERREACTION +OVERREACTIONS +OVERREACTS +OVERREFINED +OVERREFINEMENT +OVERREFINEMENTS +OVERREGULATE +OVERREGULATED +OVERREGULATES +OVERREGULATING +OVERREGULATION +OVERREGULATIONS +OVERRELIANCE +OVERRELIANCES +OVERREPORT +OVERREPORTED +OVERREPORTING +OVERREPORTS +OVERREPRESENTED +OVERRESPOND +OVERRESPONDED +OVERRESPONDING +OVERRESPONDS +OVERRICH +OVERRIDDEN +OVERRIDE +OVERRIDES +OVERRIDING +OVERRIFE +OVERRIGID +OVERRIPE +OVERROAST +OVERROASTED +OVERROASTING +OVERROASTS +OVERRODE +OVERRUDE +OVERRUFF +OVERRUFFED +OVERRUFFING +OVERRUFFS +OVERRULE +OVERRULED +OVERRULES +OVERRULING +OVERRUN +OVERRUNNING +OVERRUNS +OVERS +OVERSAD +OVERSALE +OVERSALES +OVERSALT +OVERSALTED +OVERSALTING +OVERSALTS +OVERSANGUINE +OVERSATURATE +OVERSATURATED +OVERSATURATES +OVERSATURATING +OVERSATURATION +OVERSATURATIONS +OVERSAUCE +OVERSAUCED +OVERSAUCES +OVERSAUCING +OVERSAVE +OVERSAVED +OVERSAVES +OVERSAVING +OVERSAW +OVERSCALE +OVERSCALED +OVERSCORE +OVERSCORED +OVERSCORES +OVERSCORING +OVERSCRUPULOUS +OVERSEA +OVERSEAS +OVERSECRETION +OVERSECRETIONS +OVERSEE +OVERSEED +OVERSEEDED +OVERSEEDING +OVERSEEDS +OVERSEEING +OVERSEEN +OVERSEER +OVERSEERS +OVERSEES +OVERSELL +OVERSELLING +OVERSELLS +OVERSENSITIVE +OVERSENSITIVITY +OVERSERIOUS +OVERSERIOUSLY +OVERSERVICE +OVERSERVICED +OVERSERVICES +OVERSERVICING +OVERSET +OVERSETS +OVERSETTING +OVERSEW +OVERSEWED +OVERSEWING +OVERSEWN +OVERSEWS +OVERSEXED +OVERSHADE +OVERSHADED +OVERSHADES +OVERSHADING +OVERSHADOW +OVERSHADOWED +OVERSHADOWING +OVERSHADOWS +OVERSHARP +OVERSHIRT +OVERSHIRTS +OVERSHOE +OVERSHOES +OVERSHOOT +OVERSHOOTING +OVERSHOOTS +OVERSHOT +OVERSHOTS +OVERSICK +OVERSIDE +OVERSIDES +OVERSIGHT +OVERSIGHTS +OVERSIMPLE +OVERSIMPLIFIED +OVERSIMPLIFIES +OVERSIMPLIFY +OVERSIMPLIFYING +OVERSIMPLISTIC +OVERSIMPLY +OVERSIZE +OVERSIZED +OVERSIZES +OVERSKIRT +OVERSKIRTS +OVERSLAUGH +OVERSLAUGHED +OVERSLAUGHING +OVERSLAUGHS +OVERSLEEP +OVERSLEEPING +OVERSLEEPS +OVERSLEPT +OVERSLIP +OVERSLIPPED +OVERSLIPPING +OVERSLIPS +OVERSLIPT +OVERSLOW +OVERSMOKE +OVERSMOKED +OVERSMOKES +OVERSMOKING +OVERSOAK +OVERSOAKED +OVERSOAKING +OVERSOAKS +OVERSOFT +OVERSOLD +OVERSOLICITOUS +OVERSOON +OVERSOUL +OVERSOULS +OVERSPECIALIZE +OVERSPECIALIZED +OVERSPECIALIZES +OVERSPECULATE +OVERSPECULATED +OVERSPECULATES +OVERSPECULATING +OVERSPECULATION +OVERSPEND +OVERSPENDER +OVERSPENDERS +OVERSPENDING +OVERSPENDS +OVERSPENT +OVERSPICE +OVERSPICED +OVERSPICES +OVERSPICING +OVERSPILL +OVERSPILLED +OVERSPILLING +OVERSPILLS +OVERSPILT +OVERSPIN +OVERSPINS +OVERSPREAD +OVERSPREADING +OVERSPREADS +OVERSTABILITIES +OVERSTABILITY +OVERSTAFF +OVERSTAFFED +OVERSTAFFING +OVERSTAFFS +OVERSTATE +OVERSTATED +OVERSTATEMENT +OVERSTATEMENTS +OVERSTATES +OVERSTATING +OVERSTAY +OVERSTAYED +OVERSTAYING +OVERSTAYS +OVERSTEER +OVERSTEERED +OVERSTEERING +OVERSTEERS +OVERSTEP +OVERSTEPPED +OVERSTEPPING +OVERSTEPS +OVERSTIMULATE +OVERSTIMULATED +OVERSTIMULATES +OVERSTIMULATING +OVERSTIMULATION +OVERSTIR +OVERSTIRRED +OVERSTIRRING +OVERSTIRS +OVERSTOCK +OVERSTOCKED +OVERSTOCKING +OVERSTOCKS +OVERSTORIES +OVERSTORY +OVERSTRAIN +OVERSTRAINED +OVERSTRAINING +OVERSTRAINS +OVERSTRESS +OVERSTRESSED +OVERSTRESSES +OVERSTRESSING +OVERSTRETCH +OVERSTRETCHED +OVERSTRETCHES +OVERSTRETCHING +OVERSTREW +OVERSTREWED +OVERSTREWING +OVERSTREWN +OVERSTREWS +OVERSTRIDDEN +OVERSTRIDE +OVERSTRIDES +OVERSTRIDING +OVERSTRODE +OVERSTRUCTURED +OVERSTRUNG +OVERSTUDIED +OVERSTUDIES +OVERSTUDY +OVERSTUDYING +OVERSTUFF +OVERSTUFFED +OVERSTUFFING +OVERSTUFFS +OVERSUBSCRIBE +OVERSUBSCRIBED +OVERSUBSCRIBES +OVERSUBSCRIBING +OVERSUBTLE +OVERSUDS +OVERSUDSED +OVERSUDSES +OVERSUDSING +OVERSUP +OVERSUPPED +OVERSUPPING +OVERSUPPLIED +OVERSUPPLIES +OVERSUPPLY +OVERSUPPLYING +OVERSUPS +OVERSURE +OVERSUSPICIOUS +OVERSWEET +OVERSWEETEN +OVERSWEETENED +OVERSWEETENING +OVERSWEETENS +OVERSWEETNESS +OVERSWEETNESSES +OVERSWING +OVERSWINGING +OVERSWINGS +OVERSWUNG +OVERT +OVERTAKE +OVERTAKEN +OVERTAKES +OVERTAKING +OVERTALK +OVERTALKATIVE +OVERTALKED +OVERTALKING +OVERTALKS +OVERTAME +OVERTART +OVERTASK +OVERTASKED +OVERTASKING +OVERTASKS +OVERTAUGHT +OVERTAX +OVERTAXATION +OVERTAXATIONS +OVERTAXED +OVERTAXES +OVERTAXING +OVERTEACH +OVERTEACHES +OVERTEACHING +OVERTHICK +OVERTHIN +OVERTHINK +OVERTHINKING +OVERTHINKS +OVERTHOUGHT +OVERTHREW +OVERTHROW +OVERTHROWING +OVERTHROWN +OVERTHROWS +OVERTIGHT +OVERTIGHTEN +OVERTIGHTENED +OVERTIGHTENING +OVERTIGHTENS +OVERTIME +OVERTIMED +OVERTIMES +OVERTIMID +OVERTIMING +OVERTIP +OVERTIPPED +OVERTIPPING +OVERTIPS +OVERTIRE +OVERTIRED +OVERTIRES +OVERTIRING +OVERTLY +OVERTNESS +OVERTNESSES +OVERTOIL +OVERTOILED +OVERTOILING +OVERTOILS +OVERTONE +OVERTONES +OVERTOOK +OVERTOP +OVERTOPPED +OVERTOPPING +OVERTOPS +OVERTRADE +OVERTRADED +OVERTRADES +OVERTRADING +OVERTRAIN +OVERTRAINED +OVERTRAINING +OVERTRAINS +OVERTREAT +OVERTREATED +OVERTREATING +OVERTREATMENT +OVERTREATMENTS +OVERTREATS +OVERTRICK +OVERTRICKS +OVERTRIM +OVERTRIMMED +OVERTRIMMING +OVERTRIMS +OVERTRUMP +OVERTRUMPED +OVERTRUMPING +OVERTRUMPS +OVERTURE +OVERTURED +OVERTURES +OVERTURING +OVERTURN +OVERTURNED +OVERTURNING +OVERTURNS +OVERURGE +OVERURGED +OVERURGES +OVERURGING +OVERUSE +OVERUSED +OVERUSES +OVERUSING +OVERUTILIZATION +OVERUTILIZE +OVERUTILIZED +OVERUTILIZES +OVERUTILIZING +OVERVALUATION +OVERVALUATIONS +OVERVALUE +OVERVALUED +OVERVALUES +OVERVALUING +OVERVIEW +OVERVIEWS +OVERVIOLENT +OVERVIVID +OVERVOLTAGE +OVERVOLTAGES +OVERVOTE +OVERVOTED +OVERVOTES +OVERVOTING +OVERWARM +OVERWARMED +OVERWARMING +OVERWARMS +OVERWARY +OVERWATCH +OVERWATCHED +OVERWATCHES +OVERWATCHING +OVERWATER +OVERWATERED +OVERWATERING +OVERWATERS +OVERWEAK +OVERWEAR +OVERWEARIED +OVERWEARIES +OVERWEARING +OVERWEARS +OVERWEARY +OVERWEARYING +OVERWEEN +OVERWEENED +OVERWEENING +OVERWEENINGLY +OVERWEENS +OVERWEIGH +OVERWEIGHED +OVERWEIGHING +OVERWEIGHS +OVERWEIGHT +OVERWEIGHTED +OVERWEIGHTING +OVERWEIGHTS +OVERWET +OVERWETS +OVERWETTED +OVERWETTING +OVERWHELM +OVERWHELMED +OVERWHELMING +OVERWHELMINGLY +OVERWHELMS +OVERWIDE +OVERWILY +OVERWIND +OVERWINDING +OVERWINDS +OVERWINTER +OVERWINTERED +OVERWINTERING +OVERWINTERS +OVERWISE +OVERWITHHELD +OVERWITHHOLD +OVERWITHHOLDING +OVERWITHHOLDS +OVERWORD +OVERWORDS +OVERWORE +OVERWORK +OVERWORKED +OVERWORKING +OVERWORKS +OVERWORN +OVERWOUND +OVERWRITE +OVERWRITES +OVERWRITING +OVERWRITTEN +OVERWROTE +OVERWROUGHT +OVERZEAL +OVERZEALOUS +OVERZEALOUSNESS +OVERZEALS +OVIBOS +OVICIDAL +OVICIDE +OVICIDES +OVIDUCAL +OVIDUCT +OVIDUCTAL +OVIDUCTS +OVIFEROUS +OVIFORM +OVINE +OVINES +OVIPARA +OVIPARITIES +OVIPARITY +OVIPAROUS +OVIPOSIT +OVIPOSITED +OVIPOSITING +OVIPOSITION +OVIPOSITIONAL +OVIPOSITIONS +OVIPOSITOR +OVIPOSITORS +OVIPOSITS +OVIRAPTOR +OVIRAPTORS +OVISAC +OVISACS +OVOID +OVOIDAL +OVOIDALS +OVOIDS +OVOLI +OVOLO +OVOLOS +OVONIC +OVONICS +OVOTESTES +OVOTESTIS +OVOVIVIPAROUS +OVOVIVIPAROUSLY +OVULAR +OVULARY +OVULATE +OVULATED +OVULATES +OVULATING +OVULATION +OVULATIONS +OVULATORY +OVULE +OVULES +OVUM +OW +OWE +OWED +OWES +OWING +OWL +OWLET +OWLETS +OWLISH +OWLISHLY +OWLISHNESS +OWLISHNESSES +OWLLIKE +OWLS +OWN +OWNABLE +OWNED +OWNER +OWNERS +OWNERSHIP +OWNERSHIPS +OWNING +OWNS +OWSE +OWSEN +OX +OXACILLIN +OXACILLINS +OXALACETATE +OXALACETATES +OXALATE +OXALATED +OXALATES +OXALATING +OXALIC +OXALIS +OXALISES +OXALOACETATE +OXALOACETATES +OXAZEPAM +OXAZEPAMS +OXAZINE +OXAZINES +OXBLOOD +OXBLOODS +OXBOW +OXBOWS +OXCART +OXCARTS +OXEN +OXES +OXEYE +OXEYES +OXFORD +OXFORDS +OXHEART +OXHEARTS +OXID +OXIDABLE +OXIDANT +OXIDANTS +OXIDASE +OXIDASES +OXIDASIC +OXIDATE +OXIDATED +OXIDATES +OXIDATING +OXIDATION +OXIDATIONS +OXIDATIVE +OXIDATIVELY +OXIDE +OXIDES +OXIDIC +OXIDISE +OXIDISED +OXIDISER +OXIDISERS +OXIDISES +OXIDISING +OXIDIZABLE +OXIDIZE +OXIDIZED +OXIDIZER +OXIDIZERS +OXIDIZES +OXIDIZING +OXIDOREDUCTASE +OXIDOREDUCTASES +OXIDS +OXIM +OXIME +OXIMES +OXIMETER +OXIMETERS +OXIMETRIES +OXIMETRY +OXIMS +OXLIKE +OXLIP +OXLIPS +OXO +OXPECKER +OXPECKERS +OXTAIL +OXTAILS +OXTER +OXTERS +OXTONGUE +OXTONGUES +OXY +OXYACETYLENE +OXYACID +OXYACIDS +OXYCODONE +OXYCODONES +OXYGEN +OXYGENASE +OXYGENASES +OXYGENATE +OXYGENATED +OXYGENATES +OXYGENATING +OXYGENATION +OXYGENATIONS +OXYGENATOR +OXYGENATORS +OXYGENIC +OXYGENIZE +OXYGENIZED +OXYGENIZES +OXYGENIZING +OXYGENLESS +OXYGENOUS +OXYGENS +OXYHEMOGLOBIN +OXYHEMOGLOBINS +OXYHYDROGEN +OXYMORA +OXYMORON +OXYMORONIC +OXYMORONICALLY +OXYMORONS +OXYPHENBUTAZONE +OXYPHIL +OXYPHILE +OXYPHILES +OXYPHILIC +OXYPHILS +OXYSALT +OXYSALTS +OXYSOME +OXYSOMES +OXYTETRACYCLINE +OXYTOCIC +OXYTOCICS +OXYTOCIN +OXYTOCINS +OXYTONE +OXYTONES +OXYURIASES +OXYURIASIS +OY +OYER +OYERS +OYES +OYESSES +OYEZ +OYEZES +OYSTER +OYSTERCATCHER +OYSTERCATCHERS +OYSTERED +OYSTERER +OYSTERERS +OYSTERING +OYSTERINGS +OYSTERMAN +OYSTERMEN +OYSTERS +OZALID +OZALIDS +OZOCERITE +OZOCERITES +OZOKERITE +OZOKERITES +OZONATE +OZONATED +OZONATES +OZONATING +OZONATION +OZONATIONS +OZONE +OZONES +OZONIC +OZONIDE +OZONIDES +OZONISE +OZONISED +OZONISES +OZONISING +OZONIZATION +OZONIZATIONS +OZONIZE +OZONIZED +OZONIZER +OZONIZERS +OZONIZES +OZONIZING +OZONOSPHERE +OZONOSPHERES +OZONOUS +PA +PABLUM +PABLUMS +PABULAR +PABULUM +PABULUMS +PAC +PACA +PACAS +PACE +PACED +PACEMAKER +PACEMAKERS +PACEMAKING +PACEMAKINGS +PACER +PACERS +PACES +PACESETTER +PACESETTERS +PACESETTING +PACEY +PACHA +PACHADOM +PACHADOMS +PACHALIC +PACHALICS +PACHAS +PACHINKO +PACHINKOS +PACHISI +PACHISIS +PACHOULI +PACHOULIS +PACHUCO +PACHUCOS +PACHYDERM +PACHYDERMATOUS +PACHYDERMS +PACHYSANDRA +PACHYSANDRAS +PACHYTENE +PACHYTENES +PACIER +PACIEST +PACIFIABLE +PACIFIC +PACIFICAL +PACIFICALLY +PACIFICATION +PACIFICATIONS +PACIFICATOR +PACIFICATORS +PACIFICISM +PACIFICISMS +PACIFICIST +PACIFICISTS +PACIFIED +PACIFIER +PACIFIERS +PACIFIES +PACIFISM +PACIFISMS +PACIFIST +PACIFISTIC +PACIFISTICALLY +PACIFISTS +PACIFY +PACIFYING +PACING +PACK +PACKABILITIES +PACKABILITY +PACKABLE +PACKAGE +PACKAGED +PACKAGER +PACKAGERS +PACKAGES +PACKAGING +PACKAGINGS +PACKBOARD +PACKBOARDS +PACKED +PACKER +PACKERS +PACKET +PACKETED +PACKETING +PACKETS +PACKHORSE +PACKHORSES +PACKING +PACKINGHOUSE +PACKINGHOUSES +PACKINGS +PACKLY +PACKMAN +PACKMEN +PACKNESS +PACKNESSES +PACKS +PACKSACK +PACKSACKS +PACKSADDLE +PACKSADDLES +PACKTHREAD +PACKTHREADS +PACKWAX +PACKWAXES +PACLITAXEL +PACLITAXELS +PACS +PACT +PACTION +PACTIONS +PACTS +PACY +PAD +PADAUK +PADAUKS +PADDED +PADDER +PADDERS +PADDIES +PADDING +PADDINGS +PADDLE +PADDLEBALL +PADDLEBALLS +PADDLEBOARD +PADDLEBOARDS +PADDLEBOAT +PADDLEBOATS +PADDLED +PADDLEFISH +PADDLEFISHES +PADDLER +PADDLERS +PADDLES +PADDLING +PADDLINGS +PADDOCK +PADDOCKED +PADDOCKING +PADDOCKS +PADDY +PADDYWACK +PADDYWACKED +PADDYWACKING +PADDYWACKS +PADI +PADIS +PADISHAH +PADISHAHS +PADLE +PADLES +PADLOCK +PADLOCKED +PADLOCKING +PADLOCKS +PADNAG +PADNAGS +PADOUK +PADOUKS +PADRE +PADRES +PADRI +PADRONE +PADRONES +PADRONI +PADRONISM +PADRONISMS +PADS +PADSHAH +PADSHAHS +PADUASOY +PADUASOYS +PAEAN +PAEANISM +PAEANISMS +PAEANS +PAEDIATRIC +PAEDIATRICIAN +PAEDIATRICIANS +PAEDIATRICS +PAEDOGENESES +PAEDOGENESIS +PAEDOGENETIC +PAEDOGENIC +PAEDOMORPHIC +PAEDOMORPHISM +PAEDOMORPHISMS +PAEDOMORPHOSES +PAEDOMORPHOSIS +PAELLA +PAELLAS +PAEON +PAEONS +PAESAN +PAESANI +PAESANO +PAESANOS +PAESANS +PAGAN +PAGANDOM +PAGANDOMS +PAGANISE +PAGANISED +PAGANISES +PAGANISH +PAGANISING +PAGANISM +PAGANISMS +PAGANIST +PAGANISTS +PAGANIZE +PAGANIZED +PAGANIZER +PAGANIZERS +PAGANIZES +PAGANIZING +PAGANS +PAGE +PAGEANT +PAGEANTRIES +PAGEANTRY +PAGEANTS +PAGEBOY +PAGEBOYS +PAGED +PAGEFUL +PAGEFULS +PAGER +PAGERS +PAGES +PAGINAL +PAGINATE +PAGINATED +PAGINATES +PAGINATING +PAGINATION +PAGINATIONS +PAGING +PAGINGS +PAGOD +PAGODA +PAGODAS +PAGODS +PAGURIAN +PAGURIANS +PAGURID +PAGURIDS +PAH +PAHLAVI +PAHLAVIS +PAHOEHOE +PAHOEHOES +PAID +PAIK +PAIKED +PAIKING +PAIKS +PAIL +PAILFUL +PAILFULS +PAILLARD +PAILLARDS +PAILLASSE +PAILLASSES +PAILLETTE +PAILLETTES +PAILS +PAILSFUL +PAIN +PAINCH +PAINCHES +PAINED +PAINFUL +PAINFULLER +PAINFULLEST +PAINFULLY +PAINFULNESS +PAINFULNESSES +PAINING +PAINKILLER +PAINKILLERS +PAINKILLING +PAINLESS +PAINLESSLY +PAINLESSNESS +PAINLESSNESSES +PAINS +PAINSTAKING +PAINSTAKINGLY +PAINSTAKINGS +PAINT +PAINTABLE +PAINTBALL +PAINTBALLS +PAINTBRUSH +PAINTBRUSHES +PAINTED +PAINTER +PAINTERLINESS +PAINTERLINESSES +PAINTERLY +PAINTERS +PAINTIER +PAINTIEST +PAINTING +PAINTINGS +PAINTS +PAINTWORK +PAINTWORKS +PAINTY +PAIR +PAIRED +PAIRING +PAIRINGS +PAIRS +PAISA +PAISAN +PAISANA +PAISANAS +PAISANO +PAISANOS +PAISANS +PAISAS +PAISE +PAISLEY +PAISLEYS +PAJAMA +PAJAMAED +PAJAMAS +PAKEHA +PAKEHAS +PAKORA +PAKORAS +PAL +PALABRA +PALABRAS +PALACE +PALACED +PALACES +PALADIN +PALADINS +PALAESTRA +PALAESTRAE +PALAESTRAS +PALAIS +PALANKEEN +PALANKEENS +PALANQUIN +PALANQUINS +PALAPA +PALAPAS +PALATABILITIES +PALATABILITY +PALATABLE +PALATABLENESS +PALATABLENESSES +PALATABLY +PALATAL +PALATALIZATION +PALATALIZATIONS +PALATALIZE +PALATALIZED +PALATALIZES +PALATALIZING +PALATALLY +PALATALS +PALATE +PALATES +PALATIAL +PALATIALLY +PALATIALNESS +PALATIALNESSES +PALATINATE +PALATINATES +PALATINE +PALATINES +PALAVER +PALAVERED +PALAVERER +PALAVERERS +PALAVERING +PALAVERS +PALAZZI +PALAZZO +PALAZZOS +PALE +PALEA +PALEAE +PALEAL +PALEATE +PALED +PALEFACE +PALEFACES +PALELY +PALENESS +PALENESSES +PALEOBIOLOGIC +PALEOBIOLOGICAL +PALEOBIOLOGIES +PALEOBIOLOGIST +PALEOBIOLOGISTS +PALEOBIOLOGY +PALEOBOTANIC +PALEOBOTANICAL +PALEOBOTANIES +PALEOBOTANIST +PALEOBOTANISTS +PALEOBOTANY +PALEOCENE +PALEOECOLOGIC +PALEOECOLOGICAL +PALEOECOLOGIES +PALEOECOLOGIST +PALEOECOLOGISTS +PALEOECOLOGY +PALEOGENE +PALEOGEOGRAPHIC +PALEOGEOGRAPHY +PALEOGRAPHER +PALEOGRAPHERS +PALEOGRAPHIC +PALEOGRAPHICAL +PALEOGRAPHIES +PALEOGRAPHY +PALEOLITH +PALEOLITHS +PALEOLOGIES +PALEOLOGY +PALEOMAGNETIC +PALEOMAGNETISM +PALEOMAGNETISMS +PALEOMAGNETIST +PALEOMAGNETISTS +PALEONTOLOGIC +PALEONTOLOGICAL +PALEONTOLOGIES +PALEONTOLOGIST +PALEONTOLOGISTS +PALEONTOLOGY +PALEOPATHOLOGY +PALEOSOL +PALEOSOLS +PALEOZOIC +PALEOZOOLOGICAL +PALEOZOOLOGIES +PALEOZOOLOGIST +PALEOZOOLOGISTS +PALEOZOOLOGY +PALER +PALES +PALEST +PALESTRA +PALESTRAE +PALESTRAL +PALESTRAS +PALET +PALETOT +PALETOTS +PALETS +PALETTE +PALETTES +PALEWAYS +PALEWISE +PALFREY +PALFREYS +PALIER +PALIEST +PALIKAR +PALIKARS +PALIMONIES +PALIMONY +PALIMPSEST +PALIMPSESTS +PALINDROME +PALINDROMES +PALINDROMIC +PALINDROMIST +PALINDROMISTS +PALING +PALINGENESES +PALINGENESIS +PALINGENETIC +PALINGS +PALINODE +PALINODES +PALISADE +PALISADED +PALISADES +PALISADING +PALISH +PALL +PALLADIA +PALLADIC +PALLADIUM +PALLADIUMS +PALLADOUS +PALLBEARER +PALLBEARERS +PALLED +PALLET +PALLETED +PALLETING +PALLETISE +PALLETISED +PALLETISES +PALLETISING +PALLETIZATION +PALLETIZATIONS +PALLETIZE +PALLETIZED +PALLETIZER +PALLETIZERS +PALLETIZES +PALLETIZING +PALLETS +PALLETTE +PALLETTES +PALLIA +PALLIAL +PALLIASSE +PALLIASSES +PALLIATE +PALLIATED +PALLIATES +PALLIATING +PALLIATION +PALLIATIONS +PALLIATIVE +PALLIATIVELY +PALLIATIVES +PALLIATOR +PALLIATORS +PALLID +PALLIDLY +PALLIDNESS +PALLIDNESSES +PALLIER +PALLIEST +PALLING +PALLIUM +PALLIUMS +PALLOR +PALLORS +PALLS +PALLY +PALM +PALMAR +PALMARY +PALMATE +PALMATED +PALMATELY +PALMATION +PALMATIONS +PALMED +PALMER +PALMERS +PALMERWORM +PALMERWORMS +PALMETTE +PALMETTES +PALMETTO +PALMETTOES +PALMETTOS +PALMFUL +PALMFULS +PALMIER +PALMIEST +PALMING +PALMIST +PALMISTER +PALMISTERS +PALMISTRIES +PALMISTRY +PALMISTS +PALMITATE +PALMITATES +PALMITIN +PALMITINS +PALMLIKE +PALMS +PALMTOP +PALMTOPS +PALMY +PALMYRA +PALMYRAS +PALOMINO +PALOMINOS +PALOOKA +PALOOKAS +PALOVERDE +PALOVERDES +PALP +PALPABILITIES +PALPABILITY +PALPABLE +PALPABLY +PALPAL +PALPATE +PALPATED +PALPATES +PALPATING +PALPATION +PALPATIONS +PALPATOR +PALPATORS +PALPATORY +PALPEBRA +PALPEBRAE +PALPEBRAL +PALPEBRAS +PALPED +PALPI +PALPING +PALPITANT +PALPITATE +PALPITATED +PALPITATES +PALPITATING +PALPITATION +PALPITATIONS +PALPS +PALPUS +PALS +PALSGRAVE +PALSGRAVES +PALSHIP +PALSHIPS +PALSIED +PALSIES +PALSY +PALSYING +PALSYLIKE +PALTER +PALTERED +PALTERER +PALTERERS +PALTERING +PALTERS +PALTRIER +PALTRIEST +PALTRILY +PALTRINESS +PALTRINESSES +PALTRY +PALUDAL +PALUDISM +PALUDISMS +PALY +PALYNOLOGIC +PALYNOLOGICAL +PALYNOLOGICALLY +PALYNOLOGIES +PALYNOLOGIST +PALYNOLOGISTS +PALYNOLOGY +PAM +PAMPA +PAMPAS +PAMPEAN +PAMPEANS +PAMPER +PAMPERED +PAMPERER +PAMPERERS +PAMPERING +PAMPERO +PAMPEROS +PAMPERS +PAMPHLET +PAMPHLETEER +PAMPHLETEERED +PAMPHLETEERING +PAMPHLETEERS +PAMPHLETS +PAMS +PAN +PANACEA +PANACEAN +PANACEAS +PANACHE +PANACHES +PANADA +PANADAS +PANAMA +PANAMAS +PANATELA +PANATELAS +PANATELLA +PANATELLAS +PANBROIL +PANBROILED +PANBROILING +PANBROILS +PANCAKE +PANCAKED +PANCAKES +PANCAKING +PANCETTA +PANCETTAS +PANCHAX +PANCHAXES +PANCHROMATIC +PANCRATIA +PANCRATIC +PANCRATIUM +PANCRATIUMS +PANCREAS +PANCREASES +PANCREATECTOMY +PANCREATIC +PANCREATIN +PANCREATINS +PANCREATITIDES +PANCREATITIS +PANCREOZYMIN +PANCREOZYMINS +PANCYTOPENIA +PANCYTOPENIAS +PANDA +PANDANI +PANDANUS +PANDANUSES +PANDAS +PANDECT +PANDECTS +PANDEMIC +PANDEMICS +PANDEMONIUM +PANDEMONIUMS +PANDER +PANDERED +PANDERER +PANDERERS +PANDERING +PANDERS +PANDIED +PANDIES +PANDIT +PANDITS +PANDOOR +PANDOORS +PANDORA +PANDORAS +PANDORE +PANDORES +PANDOUR +PANDOURS +PANDOWDIES +PANDOWDY +PANDURA +PANDURAS +PANDURATE +PANDY +PANDYING +PANE +PANED +PANEGYRIC +PANEGYRICAL +PANEGYRICALLY +PANEGYRICS +PANEGYRIST +PANEGYRISTS +PANEL +PANELED +PANELESS +PANELING +PANELINGS +PANELIST +PANELISTS +PANELIZED +PANELLED +PANELLING +PANELLINGS +PANELS +PANES +PANETELA +PANETELAS +PANETELLA +PANETELLAS +PANETTONE +PANETTONES +PANETTONI +PANFISH +PANFISHES +PANFRIED +PANFRIES +PANFRY +PANFRYING +PANFUL +PANFULS +PANG +PANGA +PANGAS +PANGED +PANGEN +PANGENE +PANGENES +PANGENESES +PANGENESIS +PANGENETIC +PANGENS +PANGING +PANGOLIN +PANGOLINS +PANGRAM +PANGRAMS +PANGS +PANHANDLE +PANHANDLED +PANHANDLER +PANHANDLERS +PANHANDLES +PANHANDLING +PANHUMAN +PANIC +PANICALLY +PANICKED +PANICKIER +PANICKIEST +PANICKING +PANICKY +PANICLE +PANICLED +PANICLES +PANICS +PANICULATE +PANICUM +PANICUMS +PANIER +PANIERS +PANINI +PANINO +PANJANDRA +PANJANDRUM +PANJANDRUMS +PANLEUKOPENIA +PANLEUKOPENIAS +PANMICTIC +PANMIXES +PANMIXIA +PANMIXIAS +PANMIXIS +PANNE +PANNED +PANNER +PANNERS +PANNES +PANNIER +PANNIERED +PANNIERS +PANNIKIN +PANNIKINS +PANNING +PANOCHA +PANOCHAS +PANOCHE +PANOCHES +PANOPLIED +PANOPLIES +PANOPLY +PANOPTIC +PANORAMA +PANORAMAS +PANORAMIC +PANORAMICALLY +PANPIPE +PANPIPES +PANS +PANSEXUAL +PANSEXUALITIES +PANSEXUALITY +PANSEXUALS +PANSIES +PANSOPHIC +PANSOPHIES +PANSOPHY +PANSY +PANT +PANTALET +PANTALETS +PANTALETTES +PANTALONE +PANTALONES +PANTALOON +PANTALOONS +PANTDRESS +PANTDRESSES +PANTECHNICON +PANTECHNICONS +PANTED +PANTHEISM +PANTHEISMS +PANTHEIST +PANTHEISTIC +PANTHEISTICAL +PANTHEISTICALLY +PANTHEISTS +PANTHEON +PANTHEONS +PANTHER +PANTHERS +PANTIE +PANTIES +PANTIHOSE +PANTILE +PANTILED +PANTILES +PANTING +PANTINGLY +PANTISOCRACIES +PANTISOCRACY +PANTISOCRATIC +PANTISOCRATICAL +PANTISOCRATIST +PANTISOCRATISTS +PANTO +PANTOFFLE +PANTOFFLES +PANTOFLE +PANTOFLES +PANTOGRAPH +PANTOGRAPHIC +PANTOGRAPHS +PANTOMIME +PANTOMIMED +PANTOMIMES +PANTOMIMIC +PANTOMIMING +PANTOMIMIST +PANTOMIMISTS +PANTOS +PANTOTHENATE +PANTOTHENATES +PANTOUM +PANTOUMS +PANTRIES +PANTROPIC +PANTROPICAL +PANTRY +PANTRYMAN +PANTRYMEN +PANTS +PANTSUIT +PANTSUITED +PANTSUITS +PANTY +PANTYHOSE +PANTYWAIST +PANTYWAISTS +PANZER +PANZERS +PAP +PAPA +PAPACIES +PAPACY +PAPADAM +PAPADAMS +PAPADOM +PAPADOMS +PAPADUM +PAPADUMS +PAPAIN +PAPAINS +PAPAL +PAPALLY +PAPARAZZI +PAPARAZZO +PAPAS +PAPAVERINE +PAPAVERINES +PAPAW +PAPAWS +PAPAYA +PAPAYAN +PAPAYAS +PAPER +PAPERBACK +PAPERBACKED +PAPERBACKS +PAPERBARK +PAPERBARKS +PAPERBOARD +PAPERBOARDS +PAPERBOUND +PAPERBOUNDS +PAPERBOY +PAPERBOYS +PAPERCLIP +PAPERCLIPS +PAPERED +PAPERER +PAPERERS +PAPERGIRL +PAPERGIRLS +PAPERHANGER +PAPERHANGERS +PAPERHANGING +PAPERHANGINGS +PAPERINESS +PAPERINESSES +PAPERING +PAPERLESS +PAPERMAKER +PAPERMAKERS +PAPERMAKING +PAPERMAKINGS +PAPERS +PAPERWEIGHT +PAPERWEIGHTS +PAPERWORK +PAPERWORKS +PAPERY +PAPETERIE +PAPETERIES +PAPHIAN +PAPHIANS +PAPILIONACEOUS +PAPILLA +PAPILLAE +PAPILLAR +PAPILLARY +PAPILLATE +PAPILLOMA +PAPILLOMAS +PAPILLOMATA +PAPILLOMATOUS +PAPILLOMAVIRUS +PAPILLON +PAPILLONS +PAPILLOSE +PAPILLOTE +PAPILLOTES +PAPISM +PAPISMS +PAPIST +PAPISTIC +PAPISTRIES +PAPISTRY +PAPISTS +PAPOOSE +PAPOOSES +PAPOVAVIRUS +PAPOVAVIRUSES +PAPPADAM +PAPPADAMS +PAPPI +PAPPIER +PAPPIES +PAPPIEST +PAPPOOSE +PAPPOOSES +PAPPOSE +PAPPOUS +PAPPUS +PAPPY +PAPRICA +PAPRICAS +PAPRIKA +PAPRIKAS +PAPS +PAPULA +PAPULAE +PAPULAR +PAPULE +PAPULES +PAPULOSE +PAPYRAL +PAPYRI +PAPYRIAN +PAPYRINE +PAPYROLOGIES +PAPYROLOGIST +PAPYROLOGISTS +PAPYROLOGY +PAPYRUS +PAPYRUSES +PAR +PARA +PARABIOSES +PARABIOSIS +PARABIOTIC +PARABIOTICALLY +PARABLAST +PARABLASTS +PARABLE +PARABLES +PARABOLA +PARABOLAS +PARABOLIC +PARABOLICALLY +PARABOLOID +PARABOLOIDAL +PARABOLOIDS +PARACHOR +PARACHORS +PARACHUTE +PARACHUTED +PARACHUTES +PARACHUTIC +PARACHUTING +PARACHUTIST +PARACHUTISTS +PARACLETE +PARACLETES +PARACRINE +PARADE +PARADED +PARADER +PARADERS +PARADES +PARADIDDLE +PARADIDDLES +PARADIGM +PARADIGMATIC +PARADIGMS +PARADING +PARADISAIC +PARADISAICAL +PARADISAICALLY +PARADISAL +PARADISE +PARADISES +PARADISIAC +PARADISIACAL +PARADISIACALLY +PARADISIAL +PARADISICAL +PARADOR +PARADORES +PARADORS +PARADOS +PARADOSES +PARADOX +PARADOXES +PARADOXICAL +PARADOXICALITY +PARADOXICALLY +PARADOXICALNESS +PARADROP +PARADROPPED +PARADROPPING +PARADROPS +PARAE +PARAESTHESIA +PARAESTHESIAS +PARAFFIN +PARAFFINE +PARAFFINED +PARAFFINES +PARAFFINIC +PARAFFINING +PARAFFINS +PARAFOIL +PARAFOILS +PARAFORM +PARAFORMS +PARAGENESES +PARAGENESIS +PARAGENETIC +PARAGENETICALLY +PARAGLIDE +PARAGLIDED +PARAGLIDES +PARAGLIDING +PARAGOGE +PARAGOGES +PARAGON +PARAGONED +PARAGONING +PARAGONS +PARAGRAPH +PARAGRAPHED +PARAGRAPHER +PARAGRAPHERS +PARAGRAPHIC +PARAGRAPHING +PARAGRAPHS +PARAINFLUENZA +PARAINFLUENZAS +PARAJOURNALISM +PARAJOURNALISMS +PARAKEET +PARAKEETS +PARAKITE +PARAKITES +PARALANGUAGE +PARALANGUAGES +PARALDEHYDE +PARALDEHYDES +PARALEGAL +PARALEGALS +PARALINGUISTIC +PARALINGUISTICS +PARALLACTIC +PARALLAX +PARALLAXES +PARALLEL +PARALLELED +PARALLELEPIPED +PARALLELEPIPEDS +PARALLELING +PARALLELISM +PARALLELISMS +PARALLELLED +PARALLELLING +PARALLELOGRAM +PARALLELOGRAMS +PARALLELS +PARALOGISM +PARALOGISMS +PARALYSE +PARALYSED +PARALYSES +PARALYSING +PARALYSIS +PARALYTIC +PARALYTICALLY +PARALYTICS +PARALYZATION +PARALYZATIONS +PARALYZE +PARALYZED +PARALYZER +PARALYZERS +PARALYZES +PARALYZING +PARALYZINGLY +PARAMAGNET +PARAMAGNETIC +PARAMAGNETISM +PARAMAGNETISMS +PARAMAGNETS +PARAMATTA +PARAMATTAS +PARAMECIA +PARAMECIUM +PARAMECIUMS +PARAMEDIC +PARAMEDICAL +PARAMEDICALS +PARAMEDICS +PARAMENT +PARAMENTA +PARAMENTS +PARAMETER +PARAMETERIZE +PARAMETERIZED +PARAMETERIZES +PARAMETERIZING +PARAMETERS +PARAMETRIC +PARAMETRICALLY +PARAMETRIZATION +PARAMETRIZE +PARAMETRIZED +PARAMETRIZES +PARAMETRIZING +PARAMILITARY +PARAMNESIA +PARAMNESIAS +PARAMO +PARAMORPH +PARAMORPHS +PARAMOS +PARAMOUNT +PARAMOUNTCIES +PARAMOUNTCY +PARAMOUNTLY +PARAMOUNTS +PARAMOUR +PARAMOURS +PARAMYLUM +PARAMYLUMS +PARAMYXOVIRUS +PARAMYXOVIRUSES +PARANG +PARANGS +PARANOEA +PARANOEAS +PARANOIA +PARANOIAC +PARANOIACS +PARANOIAS +PARANOIC +PARANOICALLY +PARANOICS +PARANOID +PARANOIDAL +PARANOIDS +PARANORMAL +PARANORMALITIES +PARANORMALITY +PARANORMALLY +PARANORMALS +PARANYMPH +PARANYMPHS +PARAPET +PARAPETED +PARAPETS +PARAPH +PARAPHERNALIA +PARAPHRASABLE +PARAPHRASE +PARAPHRASED +PARAPHRASER +PARAPHRASERS +PARAPHRASES +PARAPHRASING +PARAPHRASTIC +PARAPHS +PARAPHYSES +PARAPHYSIS +PARAPLEGIA +PARAPLEGIAS +PARAPLEGIC +PARAPLEGICS +PARAPODIA +PARAPODIAL +PARAPODIUM +PARAPSYCHOLOGY +PARAQUAT +PARAQUATS +PARAQUET +PARAQUETS +PARAROSANILINE +PARAROSANILINES +PARAS +PARASAIL +PARASAILED +PARASAILING +PARASAILINGS +PARASAILS +PARASANG +PARASANGS +PARASEXUAL +PARASEXUALITIES +PARASEXUALITY +PARASHAH +PARASHAHS +PARASHIOTH +PARASHOT +PARASHOTH +PARASITE +PARASITES +PARASITIC +PARASITICAL +PARASITICALLY +PARASITICIDAL +PARASITICIDE +PARASITICIDES +PARASITISE +PARASITISED +PARASITISES +PARASITISING +PARASITISM +PARASITISMS +PARASITIZATION +PARASITIZATIONS +PARASITIZE +PARASITIZED +PARASITIZES +PARASITIZING +PARASITOID +PARASITOIDS +PARASITOLOGIC +PARASITOLOGICAL +PARASITOLOGIES +PARASITOLOGIST +PARASITOLOGISTS +PARASITOLOGY +PARASITOSES +PARASITOSIS +PARASOL +PARASOLED +PARASOLS +PARASYMPATHETIC +PARASYNTHESES +PARASYNTHESIS +PARASYNTHETIC +PARATACTIC +PARATACTICAL +PARATACTICALLY +PARATAXES +PARATAXIS +PARATHION +PARATHIONS +PARATHORMONE +PARATHORMONES +PARATHYROID +PARATHYROIDS +PARATROOP +PARATROOPER +PARATROOPERS +PARATROOPS +PARATYPHOID +PARATYPHOIDS +PARAVANE +PARAVANES +PARAWING +PARAWINGS +PARAZOAN +PARAZOANS +PARBAKE +PARBAKED +PARBAKES +PARBAKING +PARBOIL +PARBOILED +PARBOILING +PARBOILS +PARBUCKLE +PARBUCKLED +PARBUCKLES +PARBUCKLING +PARCEL +PARCELED +PARCELING +PARCELLED +PARCELLING +PARCELS +PARCENARIES +PARCENARY +PARCENER +PARCENERS +PARCH +PARCHED +PARCHEESI +PARCHEESIS +PARCHES +PARCHESI +PARCHESIS +PARCHING +PARCHISI +PARCHISIS +PARCHMENT +PARCHMENTS +PARCLOSE +PARCLOSES +PARD +PARDAH +PARDAHS +PARDEE +PARDI +PARDIE +PARDINE +PARDNER +PARDNERS +PARDON +PARDONABLE +PARDONABLENESS +PARDONABLY +PARDONED +PARDONER +PARDONERS +PARDONING +PARDONS +PARDS +PARDY +PARE +PARECISM +PARECISMS +PARED +PAREGORIC +PAREGORICS +PAREIRA +PAREIRAS +PARENCHYMA +PARENCHYMAL +PARENCHYMAS +PARENCHYMATOUS +PARENT +PARENTAGE +PARENTAGES +PARENTAL +PARENTALLY +PARENTED +PARENTERAL +PARENTERALLY +PARENTHESES +PARENTHESIS +PARENTHESIZE +PARENTHESIZED +PARENTHESIZES +PARENTHESIZING +PARENTHETIC +PARENTHETICAL +PARENTHETICALLY +PARENTHOOD +PARENTHOODS +PARENTING +PARENTINGS +PARENTLESS +PARENTS +PAREO +PAREOS +PARER +PARERGA +PARERGON +PARERS +PARES +PARESES +PARESIS +PARESTHESIA +PARESTHESIAS +PARESTHETIC +PARETIC +PARETICS +PAREU +PAREUS +PAREVE +PARFAIT +PARFAITS +PARFLECHE +PARFLECHES +PARFLESH +PARFLESHES +PARFOCAL +PARFOCALITIES +PARFOCALITY +PARFOCALIZE +PARFOCALIZED +PARFOCALIZES +PARFOCALIZING +PARGE +PARGED +PARGES +PARGET +PARGETED +PARGETING +PARGETINGS +PARGETS +PARGETTED +PARGETTING +PARGING +PARGINGS +PARGO +PARGOS +PARGYLINE +PARGYLINES +PARHELIA +PARHELIC +PARHELION +PARIAH +PARIAHS +PARIAN +PARIANS +PARIES +PARIETAL +PARIETALS +PARIETES +PARING +PARINGS +PARIS +PARISES +PARISH +PARISHES +PARISHIONER +PARISHIONERS +PARITIES +PARITY +PARK +PARKA +PARKADE +PARKADES +PARKAS +PARKED +PARKER +PARKERS +PARKETTE +PARKETTES +PARKING +PARKINGS +PARKINSONIAN +PARKINSONISM +PARKINSONISMS +PARKLAND +PARKLANDS +PARKLIKE +PARKS +PARKWAY +PARKWAYS +PARLANCE +PARLANCES +PARLANDO +PARLANTE +PARLAY +PARLAYED +PARLAYING +PARLAYS +PARLE +PARLED +PARLES +PARLEY +PARLEYED +PARLEYER +PARLEYERS +PARLEYING +PARLEYS +PARLIAMENT +PARLIAMENTARIAN +PARLIAMENTARY +PARLIAMENTS +PARLING +PARLOR +PARLORS +PARLOUR +PARLOURS +PARLOUS +PARLOUSLY +PARMESAN +PARMESANS +PARMIGIANA +PARMIGIANO +PAROCHIAL +PAROCHIALISM +PAROCHIALISMS +PAROCHIALLY +PARODIC +PARODICAL +PARODIED +PARODIES +PARODIST +PARODISTIC +PARODISTS +PARODOI +PARODOS +PARODY +PARODYING +PAROL +PAROLABLE +PAROLE +PAROLED +PAROLEE +PAROLEES +PAROLES +PAROLING +PAROLS +PARONOMASIA +PARONOMASIAS +PARONOMASTIC +PARONYM +PARONYMIC +PARONYMOUS +PARONYMS +PAROQUET +PAROQUETS +PAROSMIA +PAROSMIAS +PAROTIC +PAROTID +PAROTIDS +PAROTITIC +PAROTITIS +PAROTITISES +PAROTOID +PAROTOIDS +PAROUS +PAROXYSM +PAROXYSMAL +PAROXYSMS +PARQUET +PARQUETED +PARQUETING +PARQUETRIES +PARQUETRY +PARQUETS +PARR +PARRAKEET +PARRAKEETS +PARRAL +PARRALS +PARRED +PARREL +PARRELS +PARRICIDAL +PARRICIDE +PARRICIDES +PARRIDGE +PARRIDGES +PARRIED +PARRIER +PARRIERS +PARRIES +PARRING +PARRITCH +PARRITCHES +PARROKET +PARROKETS +PARROT +PARROTED +PARROTER +PARROTERS +PARROTING +PARROTS +PARROTY +PARRS +PARRY +PARRYING +PARS +PARSABLE +PARSE +PARSEC +PARSECS +PARSED +PARSER +PARSERS +PARSES +PARSIMONIES +PARSIMONIOUS +PARSIMONIOUSLY +PARSIMONY +PARSING +PARSLEY +PARSLEYED +PARSLEYS +PARSLIED +PARSNIP +PARSNIPS +PARSON +PARSONAGE +PARSONAGES +PARSONIC +PARSONISH +PARSONS +PART +PARTAKE +PARTAKEN +PARTAKER +PARTAKERS +PARTAKES +PARTAKING +PARTAN +PARTANS +PARTED +PARTERRE +PARTERRES +PARTHENOCARPIC +PARTHENOCARPIES +PARTHENOCARPY +PARTHENOGENESES +PARTHENOGENESIS +PARTHENOGENETIC +PARTIAL +PARTIALITIES +PARTIALITY +PARTIALLY +PARTIALS +PARTIBILITIES +PARTIBILITY +PARTIBLE +PARTICIPANT +PARTICIPANTS +PARTICIPATE +PARTICIPATED +PARTICIPATES +PARTICIPATING +PARTICIPATION +PARTICIPATIONAL +PARTICIPATIONS +PARTICIPATIVE +PARTICIPATOR +PARTICIPATORS +PARTICIPATORY +PARTICIPIAL +PARTICIPIALLY +PARTICIPLE +PARTICIPLES +PARTICLE +PARTICLEBOARD +PARTICLEBOARDS +PARTICLES +PARTICULAR +PARTICULARISE +PARTICULARISED +PARTICULARISES +PARTICULARISING +PARTICULARISM +PARTICULARISMS +PARTICULARIST +PARTICULARISTIC +PARTICULARISTS +PARTICULARITIES +PARTICULARITY +PARTICULARIZE +PARTICULARIZED +PARTICULARIZES +PARTICULARIZING +PARTICULARLY +PARTICULARS +PARTICULATE +PARTICULATES +PARTIED +PARTIER +PARTIERS +PARTIES +PARTING +PARTINGS +PARTISAN +PARTISANLY +PARTISANS +PARTISANSHIP +PARTISANSHIPS +PARTITA +PARTITAS +PARTITE +PARTITION +PARTITIONED +PARTITIONER +PARTITIONERS +PARTITIONING +PARTITIONIST +PARTITIONISTS +PARTITIONS +PARTITIVE +PARTITIVELY +PARTITIVES +PARTIZAN +PARTIZANS +PARTLET +PARTLETS +PARTLY +PARTNER +PARTNERED +PARTNERING +PARTNERLESS +PARTNERS +PARTNERSHIP +PARTNERSHIPS +PARTON +PARTONS +PARTOOK +PARTRIDGE +PARTRIDGEBERRY +PARTRIDGES +PARTS +PARTURIENT +PARTURIENTS +PARTURITION +PARTURITIONS +PARTWAY +PARTY +PARTYER +PARTYERS +PARTYGOER +PARTYGOERS +PARTYING +PARURA +PARURAS +PARURE +PARURES +PARVE +PARVENU +PARVENUE +PARVENUES +PARVENUS +PARVIS +PARVISE +PARVISES +PARVO +PARVOLIN +PARVOLINE +PARVOLINES +PARVOLINS +PARVOS +PARVOVIRUS +PARVOVIRUSES +PAS +PASCAL +PASCALS +PASCHAL +PASCHALS +PASE +PASEO +PASEOS +PASES +PASH +PASHA +PASHADOM +PASHADOMS +PASHALIC +PASHALICS +PASHALIK +PASHALIKS +PASHAS +PASHED +PASHES +PASHING +PASHMINA +PASHMINAS +PASODOBLE +PASODOBLES +PASQUEFLOWER +PASQUEFLOWERS +PASQUIL +PASQUILS +PASQUINADE +PASQUINADED +PASQUINADES +PASQUINADING +PASS +PASSABLE +PASSABLY +PASSACAGLIA +PASSACAGLIAS +PASSADE +PASSADES +PASSADO +PASSADOES +PASSADOS +PASSAGE +PASSAGED +PASSAGES +PASSAGEWAY +PASSAGEWAYS +PASSAGEWORK +PASSAGEWORKS +PASSAGING +PASSALONG +PASSALONGS +PASSANT +PASSBAND +PASSBANDS +PASSBOOK +PASSBOOKS +PASSE +PASSED +PASSEE +PASSEL +PASSELS +PASSEMENTERIE +PASSEMENTERIES +PASSENGER +PASSENGERS +PASSEPIED +PASSEPIEDS +PASSER +PASSERBY +PASSERINE +PASSERINES +PASSERS +PASSERSBY +PASSES +PASSIBLE +PASSIM +PASSING +PASSINGLY +PASSINGS +PASSION +PASSIONAL +PASSIONALS +PASSIONATE +PASSIONATELY +PASSIONATENESS +PASSIONFLOWER +PASSIONFLOWERS +PASSIONLESS +PASSIONS +PASSIVATE +PASSIVATED +PASSIVATES +PASSIVATING +PASSIVATION +PASSIVATIONS +PASSIVE +PASSIVELY +PASSIVENESS +PASSIVENESSES +PASSIVES +PASSIVISM +PASSIVISMS +PASSIVIST +PASSIVISTS +PASSIVITIES +PASSIVITY +PASSKEY +PASSKEYS +PASSLESS +PASSOVER +PASSOVERS +PASSPORT +PASSPORTS +PASSUS +PASSUSES +PASSWORD +PASSWORDS +PAST +PASTA +PASTALIKE +PASTAS +PASTE +PASTEBOARD +PASTEBOARDS +PASTED +PASTEDOWN +PASTEDOWNS +PASTEL +PASTELIST +PASTELISTS +PASTELLIST +PASTELLISTS +PASTELS +PASTER +PASTERN +PASTERNS +PASTERS +PASTES +PASTEUP +PASTEUPS +PASTEURISE +PASTEURISED +PASTEURISES +PASTEURISING +PASTEURIZATION +PASTEURIZATIONS +PASTEURIZE +PASTEURIZED +PASTEURIZER +PASTEURIZERS +PASTEURIZES +PASTEURIZING +PASTICCI +PASTICCIO +PASTICCIOS +PASTICHE +PASTICHES +PASTICHEUR +PASTICHEURS +PASTIE +PASTIER +PASTIES +PASTIEST +PASTIL +PASTILLE +PASTILLES +PASTILS +PASTIME +PASTIMES +PASTINA +PASTINAS +PASTINESS +PASTINESSES +PASTING +PASTIS +PASTISES +PASTITSIO +PASTITSIOS +PASTITSO +PASTITSOS +PASTLESS +PASTNESS +PASTNESSES +PASTOR +PASTORAL +PASTORALE +PASTORALES +PASTORALI +PASTORALISM +PASTORALISMS +PASTORALIST +PASTORALISTS +PASTORALLY +PASTORALNESS +PASTORALNESSES +PASTORALS +PASTORATE +PASTORATES +PASTORED +PASTORING +PASTORIUM +PASTORIUMS +PASTORLY +PASTORS +PASTORSHIP +PASTORSHIPS +PASTRAMI +PASTRAMIS +PASTRIES +PASTROMI +PASTROMIS +PASTRY +PASTS +PASTURAGE +PASTURAGES +PASTURAL +PASTURE +PASTURED +PASTURELAND +PASTURELANDS +PASTURER +PASTURERS +PASTURES +PASTURING +PASTY +PAT +PATACA +PATACAS +PATAGIA +PATAGIAL +PATAGIUM +PATAMAR +PATAMARS +PATCH +PATCHABLE +PATCHBOARD +PATCHBOARDS +PATCHED +PATCHER +PATCHERS +PATCHES +PATCHIER +PATCHIEST +PATCHILY +PATCHINESS +PATCHINESSES +PATCHING +PATCHOULI +PATCHOULIES +PATCHOULIS +PATCHOULY +PATCHWORK +PATCHWORKED +PATCHWORKING +PATCHWORKS +PATCHY +PATE +PATED +PATELLA +PATELLAE +PATELLAR +PATELLAS +PATELLATE +PATELLIFORM +PATEN +PATENCIES +PATENCY +PATENS +PATENT +PATENTABILITIES +PATENTABILITY +PATENTABLE +PATENTED +PATENTEE +PATENTEES +PATENTING +PATENTLY +PATENTOR +PATENTORS +PATENTS +PATER +PATERFAMILIAS +PATERNAL +PATERNALISM +PATERNALISMS +PATERNALIST +PATERNALISTIC +PATERNALISTS +PATERNALLY +PATERNITIES +PATERNITY +PATERNOSTER +PATERNOSTERS +PATERS +PATES +PATH +PATHBREAKING +PATHETIC +PATHETICAL +PATHETICALLY +PATHFINDER +PATHFINDERS +PATHFINDING +PATHFINDINGS +PATHLESS +PATHLESSNESS +PATHLESSNESSES +PATHOBIOLOGIES +PATHOBIOLOGY +PATHOGEN +PATHOGENE +PATHOGENES +PATHOGENESES +PATHOGENESIS +PATHOGENETIC +PATHOGENIC +PATHOGENICITIES +PATHOGENICITY +PATHOGENIES +PATHOGENS +PATHOGENY +PATHOGNOMONIC +PATHOLOGIC +PATHOLOGICAL +PATHOLOGICALLY +PATHOLOGIES +PATHOLOGIST +PATHOLOGISTS +PATHOLOGY +PATHOPHYSIOLOGY +PATHOS +PATHOSES +PATHS +PATHWAY +PATHWAYS +PATIENCE +PATIENCES +PATIENT +PATIENTER +PATIENTEST +PATIENTLY +PATIENTS +PATIN +PATINA +PATINAE +PATINAED +PATINAS +PATINATE +PATINATED +PATINATES +PATINATING +PATINATION +PATINATIONS +PATINE +PATINED +PATINES +PATINING +PATINIZE +PATINIZED +PATINIZES +PATINIZING +PATINS +PATIO +PATIOS +PATISSERIE +PATISSERIES +PATISSIER +PATISSIERS +PATLY +PATNESS +PATNESSES +PATOIS +PATOOTIE +PATOOTIES +PATRESFAMILIAS +PATRIARCH +PATRIARCHAL +PATRIARCHATE +PATRIARCHATES +PATRIARCHIES +PATRIARCHS +PATRIARCHY +PATRIATE +PATRIATED +PATRIATES +PATRIATING +PATRICIAN +PATRICIANS +PATRICIATE +PATRICIATES +PATRICIDAL +PATRICIDE +PATRICIDES +PATRILINEAL +PATRILINIES +PATRILINY +PATRIMONIAL +PATRIMONIES +PATRIMONY +PATRIOT +PATRIOTIC +PATRIOTICALLY +PATRIOTISM +PATRIOTISMS +PATRIOTS +PATRISTIC +PATRISTICAL +PATRISTICS +PATROL +PATROLLED +PATROLLER +PATROLLERS +PATROLLING +PATROLMAN +PATROLMEN +PATROLS +PATRON +PATRONAGE +PATRONAGES +PATRONAL +PATRONESS +PATRONESSES +PATRONISE +PATRONISED +PATRONISES +PATRONISING +PATRONIZATION +PATRONIZATIONS +PATRONIZE +PATRONIZED +PATRONIZES +PATRONIZING +PATRONIZINGLY +PATRONLY +PATRONS +PATRONYMIC +PATRONYMICS +PATROON +PATROONS +PATS +PATSIES +PATSY +PATTAMAR +PATTAMARS +PATTED +PATTEE +PATTEN +PATTENED +PATTENS +PATTER +PATTERED +PATTERER +PATTERERS +PATTERING +PATTERN +PATTERNED +PATTERNING +PATTERNINGS +PATTERNLESS +PATTERNS +PATTERS +PATTIE +PATTIES +PATTING +PATTY +PATTYPAN +PATTYPANS +PATULENT +PATULOUS +PATY +PATZER +PATZERS +PAUCITIES +PAUCITY +PAUGHTY +PAULDRON +PAULDRONS +PAULIN +PAULINS +PAULOWNIA +PAULOWNIAS +PAUNCH +PAUNCHED +PAUNCHES +PAUNCHIER +PAUNCHIEST +PAUNCHINESS +PAUNCHINESSES +PAUNCHY +PAUPER +PAUPERED +PAUPERING +PAUPERISM +PAUPERISMS +PAUPERIZE +PAUPERIZED +PAUPERIZES +PAUPERIZING +PAUPERS +PAUPIETTE +PAUPIETTES +PAUSAL +PAUSE +PAUSED +PAUSER +PAUSERS +PAUSES +PAUSING +PAVAN +PAVANE +PAVANES +PAVANS +PAVE +PAVED +PAVEED +PAVEMENT +PAVEMENTS +PAVER +PAVERS +PAVES +PAVID +PAVILION +PAVILIONED +PAVILIONING +PAVILIONS +PAVILLON +PAVILLONS +PAVIN +PAVING +PAVINGS +PAVINS +PAVIOR +PAVIORS +PAVIOUR +PAVIOURS +PAVIS +PAVISE +PAVISER +PAVISERS +PAVISES +PAVISSE +PAVISSES +PAVLOVA +PAVLOVAS +PAVONINE +PAW +PAWED +PAWER +PAWERS +PAWING +PAWKIER +PAWKIEST +PAWKILY +PAWKINESS +PAWKINESSES +PAWKY +PAWL +PAWLS +PAWN +PAWNABLE +PAWNAGE +PAWNAGES +PAWNBROKER +PAWNBROKERS +PAWNBROKING +PAWNBROKINGS +PAWNED +PAWNEE +PAWNEES +PAWNER +PAWNERS +PAWNING +PAWNOR +PAWNORS +PAWNS +PAWNSHOP +PAWNSHOPS +PAWPAW +PAWPAWS +PAWS +PAX +PAXES +PAXWAX +PAXWAXES +PAY +PAYABLE +PAYABLES +PAYABLY +PAYBACK +PAYBACKS +PAYCHECK +PAYCHECKS +PAYDAY +PAYDAYS +PAYED +PAYEE +PAYEES +PAYER +PAYERS +PAYGRADE +PAYGRADES +PAYING +PAYLOAD +PAYLOADS +PAYMASTER +PAYMASTERS +PAYMENT +PAYMENTS +PAYNIM +PAYNIMS +PAYOFF +PAYOFFS +PAYOLA +PAYOLAS +PAYOR +PAYORS +PAYOUT +PAYOUTS +PAYROLL +PAYROLLS +PAYS +PAZAZZ +PAZAZZES +PE +PEA +PEACE +PEACEABLE +PEACEABLENESS +PEACEABLENESSES +PEACEABLY +PEACED +PEACEFUL +PEACEFULLER +PEACEFULLEST +PEACEFULLY +PEACEFULNESS +PEACEFULNESSES +PEACEKEEPER +PEACEKEEPERS +PEACEKEEPING +PEACEKEEPINGS +PEACEMAKER +PEACEMAKERS +PEACEMAKING +PEACEMAKINGS +PEACENIK +PEACENIKS +PEACES +PEACETIME +PEACETIMES +PEACH +PEACHBLOW +PEACHBLOWS +PEACHED +PEACHER +PEACHERS +PEACHES +PEACHIER +PEACHIEST +PEACHING +PEACHY +PEACING +PEACOAT +PEACOATS +PEACOCK +PEACOCKED +PEACOCKIER +PEACOCKIEST +PEACOCKING +PEACOCKISH +PEACOCKS +PEACOCKY +PEAFOWL +PEAFOWLS +PEAG +PEAGE +PEAGES +PEAGS +PEAHEN +PEAHENS +PEAK +PEAKED +PEAKEDNESS +PEAKEDNESSES +PEAKIER +PEAKIEST +PEAKING +PEAKISH +PEAKLESS +PEAKLIKE +PEAKS +PEAKY +PEAL +PEALED +PEALIKE +PEALING +PEALS +PEAN +PEANS +PEANUT +PEANUTS +PEAR +PEARL +PEARLASH +PEARLASHES +PEARLED +PEARLER +PEARLERS +PEARLESCENCE +PEARLESCENCES +PEARLESCENT +PEARLIER +PEARLIEST +PEARLING +PEARLITE +PEARLITES +PEARLITIC +PEARLIZED +PEARLS +PEARLY +PEARMAIN +PEARMAINS +PEARS +PEART +PEARTER +PEARTEST +PEARTLY +PEARTNESS +PEARTNESSES +PEARWOOD +PEARWOODS +PEAS +PEASANT +PEASANTRIES +PEASANTRY +PEASANTS +PEASCOD +PEASCODS +PEASE +PEASECOD +PEASECODS +PEASEN +PEASES +PEASHOOTER +PEASHOOTERS +PEASOUPER +PEASOUPERS +PEAT +PEATIER +PEATIEST +PEATS +PEATY +PEAVEY +PEAVEYS +PEAVIES +PEAVY +PEBBLE +PEBBLED +PEBBLES +PEBBLIER +PEBBLIEST +PEBBLING +PEBBLY +PEC +PECAN +PECANS +PECCABLE +PECCADILLO +PECCADILLOES +PECCADILLOS +PECCANCIES +PECCANCY +PECCANT +PECCANTLY +PECCARIES +PECCARY +PECCAVI +PECCAVIS +PECH +PECHAN +PECHANS +PECHED +PECHING +PECHS +PECK +PECKED +PECKER +PECKERS +PECKERWOOD +PECKERWOODS +PECKIER +PECKIEST +PECKING +PECKISH +PECKISHLY +PECKS +PECKY +PECORINI +PECORINO +PECORINOS +PECS +PECTASE +PECTASES +PECTATE +PECTATES +PECTEN +PECTENS +PECTIC +PECTIN +PECTINACEOUS +PECTINATE +PECTINATION +PECTINATIONS +PECTINES +PECTINESTERASE +PECTINESTERASES +PECTINOUS +PECTINS +PECTIZE +PECTIZED +PECTIZES +PECTIZING +PECTORAL +PECTORALS +PECULATE +PECULATED +PECULATES +PECULATING +PECULATION +PECULATIONS +PECULATOR +PECULATORS +PECULIA +PECULIAR +PECULIARITIES +PECULIARITY +PECULIARLY +PECULIARS +PECULIUM +PECUNIARILY +PECUNIARY +PED +PEDAGOG +PEDAGOGIC +PEDAGOGICAL +PEDAGOGICALLY +PEDAGOGICS +PEDAGOGIES +PEDAGOGS +PEDAGOGUE +PEDAGOGUES +PEDAGOGY +PEDAL +PEDALED +PEDALER +PEDALERS +PEDALFER +PEDALFERS +PEDALIER +PEDALIERS +PEDALING +PEDALLED +PEDALLER +PEDALLERS +PEDALLING +PEDALO +PEDALOS +PEDALS +PEDANT +PEDANTIC +PEDANTICALLY +PEDANTRIES +PEDANTRY +PEDANTS +PEDATE +PEDATELY +PEDDLE +PEDDLED +PEDDLER +PEDDLERIES +PEDDLERS +PEDDLERY +PEDDLES +PEDDLING +PEDERAST +PEDERASTIC +PEDERASTIES +PEDERASTS +PEDERASTY +PEDES +PEDESTAL +PEDESTALED +PEDESTALING +PEDESTALLED +PEDESTALLING +PEDESTALS +PEDESTRIAN +PEDESTRIANISM +PEDESTRIANISMS +PEDESTRIANS +PEDIATRIC +PEDIATRICIAN +PEDIATRICIANS +PEDIATRICS +PEDIATRIST +PEDIATRISTS +PEDICAB +PEDICABS +PEDICEL +PEDICELLATE +PEDICELS +PEDICLE +PEDICLED +PEDICLES +PEDICULAR +PEDICULATE +PEDICULATES +PEDICULOSES +PEDICULOSIS +PEDICULOUS +PEDICURE +PEDICURED +PEDICURES +PEDICURING +PEDICURIST +PEDICURISTS +PEDIFORM +PEDIGREE +PEDIGREED +PEDIGREES +PEDIMENT +PEDIMENTAL +PEDIMENTED +PEDIMENTS +PEDIPALP +PEDIPALPS +PEDLAR +PEDLARIES +PEDLARS +PEDLARY +PEDLER +PEDLERIES +PEDLERS +PEDLERY +PEDOCAL +PEDOCALIC +PEDOCALS +PEDOGENESES +PEDOGENESIS +PEDOGENETIC +PEDOGENIC +PEDOLOGIC +PEDOLOGICAL +PEDOLOGIES +PEDOLOGIST +PEDOLOGISTS +PEDOLOGY +PEDOMETER +PEDOMETERS +PEDOPHILE +PEDOPHILES +PEDOPHILIA +PEDOPHILIAC +PEDOPHILIAS +PEDOPHILIC +PEDORTHIC +PEDRO +PEDROS +PEDS +PEDUNCLE +PEDUNCLED +PEDUNCLES +PEDUNCULAR +PEDUNCULATE +PEDUNCULATED +PEE +PEEBEEN +PEEBEENS +PEED +PEEING +PEEK +PEEKABOO +PEEKABOOS +PEEKAPOO +PEEKAPOOS +PEEKED +PEEKING +PEEKS +PEEL +PEELABLE +PEELED +PEELER +PEELERS +PEELING +PEELINGS +PEELS +PEEN +PEENED +PEENING +PEENS +PEEP +PEEPED +PEEPER +PEEPERS +PEEPHOLE +PEEPHOLES +PEEPING +PEEPS +PEEPSHOW +PEEPSHOWS +PEEPUL +PEEPULS +PEER +PEERAGE +PEERAGES +PEERED +PEERESS +PEERESSES +PEERIE +PEERIES +PEERING +PEERLESS +PEERS +PEERY +PEES +PEESWEEP +PEESWEEPS +PEETWEET +PEETWEETS +PEEVE +PEEVED +PEEVES +PEEVING +PEEVISH +PEEVISHLY +PEEVISHNESS +PEEVISHNESSES +PEEWEE +PEEWEES +PEEWIT +PEEWITS +PEG +PEGBOARD +PEGBOARDS +PEGBOX +PEGBOXES +PEGGED +PEGGING +PEGLEGGED +PEGLESS +PEGLIKE +PEGMATITE +PEGMATITES +PEGMATITIC +PEGS +PEH +PEHS +PEIGNOIR +PEIGNOIRS +PEIN +PEINED +PEINING +PEINS +PEISE +PEISED +PEISES +PEISING +PEJORATIVE +PEJORATIVELY +PEJORATIVES +PEKAN +PEKANS +PEKE +PEKEPOO +PEKEPOOS +PEKES +PEKIN +PEKINS +PEKOE +PEKOES +PELAGE +PELAGES +PELAGIAL +PELAGIC +PELAGICS +PELARGONIUM +PELARGONIUMS +PELE +PELECYPOD +PELECYPODS +PELERINE +PELERINES +PELES +PELF +PELFS +PELICAN +PELICANS +PELISSE +PELISSES +PELITE +PELITES +PELITIC +PELLAGRA +PELLAGRAS +PELLAGRIN +PELLAGRINS +PELLAGROUS +PELLET +PELLETAL +PELLETED +PELLETING +PELLETISE +PELLETISED +PELLETISES +PELLETISING +PELLETIZATION +PELLETIZATIONS +PELLETIZE +PELLETIZED +PELLETIZER +PELLETIZERS +PELLETIZES +PELLETIZING +PELLETS +PELLICLE +PELLICLES +PELLITORIES +PELLITORY +PELLMELL +PELLMELLS +PELLUCID +PELLUCIDLY +PELMET +PELMETS +PELON +PELORIA +PELORIAN +PELORIAS +PELORIC +PELORUS +PELORUSES +PELOTA +PELOTAS +PELOTON +PELOTONS +PELT +PELTAST +PELTASTS +PELTATE +PELTATELY +PELTATION +PELTATIONS +PELTED +PELTER +PELTERED +PELTERING +PELTERS +PELTING +PELTLESS +PELTRIES +PELTRY +PELTS +PELVES +PELVIC +PELVICS +PELVIS +PELVISES +PELYCOSAUR +PELYCOSAURS +PEMBINA +PEMBINAS +PEMICAN +PEMICANS +PEMMICAN +PEMMICANS +PEMOLINE +PEMOLINES +PEMPHIGUS +PEMPHIGUSES +PEMPHIX +PEMPHIXES +PEN +PENAL +PENALISE +PENALISED +PENALISES +PENALISING +PENALITIES +PENALITY +PENALIZATION +PENALIZATIONS +PENALIZE +PENALIZED +PENALIZES +PENALIZING +PENALLY +PENALTIES +PENALTY +PENANCE +PENANCED +PENANCES +PENANCING +PENANG +PENANGS +PENATES +PENCE +PENCEL +PENCELS +PENCHANT +PENCHANTS +PENCIL +PENCILED +PENCILER +PENCILERS +PENCILING +PENCILINGS +PENCILLED +PENCILLER +PENCILLERS +PENCILLING +PENCILLINGS +PENCILS +PEND +PENDANT +PENDANTLY +PENDANTS +PENDED +PENDENCIES +PENDENCY +PENDENT +PENDENTIVE +PENDENTIVES +PENDENTLY +PENDENTS +PENDING +PENDRAGON +PENDRAGONS +PENDS +PENDULAR +PENDULOUS +PENDULOUSNESS +PENDULOUSNESSES +PENDULUM +PENDULUMS +PENEPLAIN +PENEPLAINS +PENEPLANE +PENEPLANES +PENES +PENETRABILITIES +PENETRABILITY +PENETRABLE +PENETRALIA +PENETRANCE +PENETRANCES +PENETRANT +PENETRANTS +PENETRATE +PENETRATED +PENETRATES +PENETRATING +PENETRATINGLY +PENETRATION +PENETRATIONS +PENETRATIVE +PENETROMETER +PENETROMETERS +PENGO +PENGOS +PENGUIN +PENGUINS +PENHOLDER +PENHOLDERS +PENIAL +PENICIL +PENICILLAMINE +PENICILLAMINES +PENICILLATE +PENICILLIA +PENICILLIN +PENICILLINASE +PENICILLINASES +PENICILLINS +PENICILLIUM +PENICILS +PENILE +PENINSULA +PENINSULAR +PENINSULAS +PENIS +PENISES +PENITENCE +PENITENCES +PENITENT +PENITENTIAL +PENITENTIALLY +PENITENTIARIES +PENITENTIARY +PENITENTLY +PENITENTS +PENKNIFE +PENKNIVES +PENLIGHT +PENLIGHTS +PENLITE +PENLITES +PENMAN +PENMANSHIP +PENMANSHIPS +PENMEN +PENNA +PENNAE +PENNAME +PENNAMES +PENNANT +PENNANTS +PENNATE +PENNATED +PENNE +PENNED +PENNER +PENNERS +PENNI +PENNIA +PENNIES +PENNILESS +PENNINE +PENNINES +PENNING +PENNIS +PENNON +PENNONCEL +PENNONCELS +PENNONED +PENNONS +PENNY +PENNYCRESS +PENNYCRESSES +PENNYROYAL +PENNYROYALS +PENNYWEIGHT +PENNYWEIGHTS +PENNYWHISTLE +PENNYWHISTLES +PENNYWISE +PENNYWORT +PENNYWORTH +PENNYWORTHS +PENNYWORTS +PENOCHE +PENOCHES +PENOLOGICAL +PENOLOGIES +PENOLOGIST +PENOLOGISTS +PENOLOGY +PENONCEL +PENONCELS +PENPOINT +PENPOINTS +PENS +PENSEE +PENSEES +PENSIL +PENSILE +PENSILS +PENSION +PENSIONABLE +PENSIONARIES +PENSIONARY +PENSIONE +PENSIONED +PENSIONER +PENSIONERS +PENSIONES +PENSIONING +PENSIONLESS +PENSIONS +PENSIVE +PENSIVELY +PENSIVENESS +PENSIVENESSES +PENSTEMON +PENSTEMONS +PENSTER +PENSTERS +PENSTOCK +PENSTOCKS +PENT +PENTACLE +PENTACLES +PENTAD +PENTADS +PENTAGON +PENTAGONAL +PENTAGONALLY +PENTAGONALS +PENTAGONS +PENTAGRAM +PENTAGRAMS +PENTAHEDRA +PENTAHEDRAL +PENTAHEDRON +PENTAHEDRONS +PENTAMERIES +PENTAMEROUS +PENTAMERY +PENTAMETER +PENTAMETERS +PENTAMIDINE +PENTAMIDINES +PENTANE +PENTANES +PENTANGLE +PENTANGLES +PENTANOL +PENTANOLS +PENTAPEPTIDE +PENTAPEPTIDES +PENTAPLOID +PENTAPLOIDIES +PENTAPLOIDS +PENTAPLOIDY +PENTARCH +PENTARCHIES +PENTARCHS +PENTARCHY +PENTATHLETE +PENTATHLETES +PENTATHLON +PENTATHLONS +PENTATONIC +PENTAVALENT +PENTAZOCINE +PENTAZOCINES +PENTENE +PENTENES +PENTHOUSE +PENTHOUSES +PENTLANDITE +PENTLANDITES +PENTOBARBITAL +PENTOBARBITALS +PENTOBARBITONE +PENTOBARBITONES +PENTODE +PENTODES +PENTOMIC +PENTOSAN +PENTOSANS +PENTOSE +PENTOSES +PENTOSIDE +PENTOSIDES +PENTOXIDE +PENTOXIDES +PENTSTEMON +PENTSTEMONS +PENTYL +PENTYLS +PENUCHE +PENUCHES +PENUCHI +PENUCHIS +PENUCHLE +PENUCHLES +PENUCKLE +PENUCKLES +PENULT +PENULTIMA +PENULTIMAS +PENULTIMATE +PENULTIMATELY +PENULTS +PENUMBRA +PENUMBRAE +PENUMBRAL +PENUMBRAS +PENURIES +PENURIOUS +PENURIOUSLY +PENURIOUSNESS +PENURIOUSNESSES +PENURY +PEON +PEONAGE +PEONAGES +PEONES +PEONIES +PEONISM +PEONISMS +PEONS +PEONY +PEOPLE +PEOPLED +PEOPLEHOOD +PEOPLEHOODS +PEOPLELESS +PEOPLER +PEOPLERS +PEOPLES +PEOPLING +PEP +PEPEROMIA +PEPEROMIAS +PEPERONI +PEPERONIS +PEPINO +PEPINOS +PEPLA +PEPLOS +PEPLOSES +PEPLUM +PEPLUMED +PEPLUMS +PEPLUS +PEPLUSES +PEPO +PEPONIDA +PEPONIDAS +PEPONIUM +PEPONIUMS +PEPOS +PEPPED +PEPPER +PEPPERBOX +PEPPERBOXES +PEPPERCORN +PEPPERCORNS +PEPPERED +PEPPERER +PEPPERERS +PEPPERGRASS +PEPPERGRASSES +PEPPERINESS +PEPPERINESSES +PEPPERING +PEPPERMINT +PEPPERMINTS +PEPPERMINTY +PEPPERONI +PEPPERONIS +PEPPERS +PEPPERTREE +PEPPERTREES +PEPPERY +PEPPIER +PEPPIEST +PEPPILY +PEPPINESS +PEPPINESSES +PEPPING +PEPPY +PEPS +PEPSIN +PEPSINATE +PEPSINATED +PEPSINATES +PEPSINATING +PEPSINE +PEPSINES +PEPSINOGEN +PEPSINOGENS +PEPSINS +PEPTALK +PEPTALKED +PEPTALKING +PEPTALKS +PEPTIC +PEPTICS +PEPTID +PEPTIDASE +PEPTIDASES +PEPTIDE +PEPTIDES +PEPTIDIC +PEPTIDOGLYCAN +PEPTIDOGLYCANS +PEPTIDS +PEPTIZE +PEPTIZED +PEPTIZER +PEPTIZERS +PEPTIZES +PEPTIZING +PEPTONE +PEPTONES +PEPTONIC +PEPTONIZE +PEPTONIZED +PEPTONIZES +PEPTONIZING +PER +PERACID +PERACIDS +PERADVENTURE +PERADVENTURES +PERAMBULATE +PERAMBULATED +PERAMBULATES +PERAMBULATING +PERAMBULATION +PERAMBULATIONS +PERAMBULATOR +PERAMBULATORS +PERAMBULATORY +PERBORATE +PERBORATES +PERCALE +PERCALES +PERCALINE +PERCALINES +PERCEIVABLE +PERCEIVABLY +PERCEIVE +PERCEIVED +PERCEIVER +PERCEIVERS +PERCEIVES +PERCEIVING +PERCENT +PERCENTAGE +PERCENTAGES +PERCENTAL +PERCENTILE +PERCENTILES +PERCENTS +PERCEPT +PERCEPTIBILITY +PERCEPTIBLE +PERCEPTIBLY +PERCEPTION +PERCEPTIONAL +PERCEPTIONS +PERCEPTIVE +PERCEPTIVELY +PERCEPTIVENESS +PERCEPTIVITIES +PERCEPTIVITY +PERCEPTS +PERCEPTUAL +PERCEPTUALLY +PERCH +PERCHANCE +PERCHED +PERCHER +PERCHERS +PERCHES +PERCHING +PERCHLORATE +PERCHLORATES +PERCIPIENCE +PERCIPIENCES +PERCIPIENT +PERCIPIENTLY +PERCIPIENTS +PERCOID +PERCOIDS +PERCOLATE +PERCOLATED +PERCOLATES +PERCOLATING +PERCOLATION +PERCOLATIONS +PERCOLATOR +PERCOLATORS +PERCUSS +PERCUSSED +PERCUSSES +PERCUSSING +PERCUSSION +PERCUSSIONIST +PERCUSSIONISTS +PERCUSSIONS +PERCUSSIVE +PERCUSSIVELY +PERCUSSIVENESS +PERCUSSOR +PERCUSSORS +PERCUTANEOUS +PERCUTANEOUSLY +PERDIE +PERDITION +PERDITIONS +PERDU +PERDUE +PERDUES +PERDURABILITIES +PERDURABILITY +PERDURABLE +PERDURABLY +PERDURE +PERDURED +PERDURES +PERDURING +PERDUS +PERDY +PERE +PEREA +PEREGRIN +PEREGRINATE +PEREGRINATED +PEREGRINATES +PEREGRINATING +PEREGRINATION +PEREGRINATIONS +PEREGRINE +PEREGRINES +PEREGRINS +PEREIA +PEREION +PEREIONS +PEREIOPOD +PEREIOPODS +PEREMPTORILY +PEREMPTORINESS +PEREMPTORY +PERENNATE +PERENNATED +PERENNATES +PERENNATING +PERENNATION +PERENNATIONS +PERENNIAL +PERENNIALLY +PERENNIALS +PEREON +PEREONS +PEREOPOD +PEREOPODS +PERES +PERESTROIKA +PERESTROIKAS +PERFECT +PERFECTA +PERFECTAS +PERFECTED +PERFECTER +PERFECTERS +PERFECTEST +PERFECTIBILITY +PERFECTIBLE +PERFECTING +PERFECTION +PERFECTIONISM +PERFECTIONISMS +PERFECTIONIST +PERFECTIONISTIC +PERFECTIONISTS +PERFECTIONS +PERFECTIVE +PERFECTIVELY +PERFECTIVENESS +PERFECTIVES +PERFECTIVITIES +PERFECTIVITY +PERFECTLY +PERFECTNESS +PERFECTNESSES +PERFECTO +PERFECTOS +PERFECTS +PERFERVID +PERFIDIES +PERFIDIOUS +PERFIDIOUSLY +PERFIDIOUSNESS +PERFIDY +PERFOLIATE +PERFORATE +PERFORATED +PERFORATES +PERFORATING +PERFORATION +PERFORATIONS +PERFORATOR +PERFORATORS +PERFORCE +PERFORM +PERFORMABILITY +PERFORMABLE +PERFORMANCE +PERFORMANCES +PERFORMATIVE +PERFORMATIVES +PERFORMATORY +PERFORMED +PERFORMER +PERFORMERS +PERFORMING +PERFORMS +PERFUME +PERFUMED +PERFUMER +PERFUMERIES +PERFUMERS +PERFUMERY +PERFUMES +PERFUMING +PERFUMY +PERFUNCTORILY +PERFUNCTORINESS +PERFUNCTORY +PERFUSATE +PERFUSATES +PERFUSE +PERFUSED +PERFUSES +PERFUSING +PERFUSION +PERFUSIONIST +PERFUSIONISTS +PERFUSIONS +PERFUSIVE +PERGOLA +PERGOLAS +PERHAPS +PERHAPSES +PERI +PERIANTH +PERIANTHS +PERIAPSES +PERIAPSIS +PERIAPT +PERIAPTS +PERIBLEM +PERIBLEMS +PERICARDIA +PERICARDIAL +PERICARDITIS +PERICARDITISES +PERICARDIUM +PERICARP +PERICARPS +PERICHONDRAL +PERICHONDRIA +PERICHONDRIUM +PERICOPAE +PERICOPAL +PERICOPE +PERICOPES +PERICOPIC +PERICRANIA +PERICRANIAL +PERICRANIUM +PERICYCLE +PERICYCLES +PERICYCLIC +PERIDERM +PERIDERMS +PERIDIA +PERIDIAL +PERIDIUM +PERIDOT +PERIDOTIC +PERIDOTITE +PERIDOTITES +PERIDOTITIC +PERIDOTS +PERIGEAL +PERIGEAN +PERIGEE +PERIGEES +PERIGON +PERIGONS +PERIGYNIES +PERIGYNOUS +PERIGYNY +PERIHELIA +PERIHELIAL +PERIHELION +PERIKARYA +PERIKARYAL +PERIKARYON +PERIL +PERILED +PERILING +PERILLA +PERILLAS +PERILLED +PERILLING +PERILOUS +PERILOUSLY +PERILOUSNESS +PERILOUSNESSES +PERILS +PERILUNE +PERILUNES +PERILYMPH +PERILYMPHS +PERIMETER +PERIMETERS +PERIMETRIES +PERIMETRY +PERIMORPH +PERIMORPHS +PERIMYSIA +PERIMYSIUM +PERINATAL +PERINATALLY +PERINEA +PERINEAL +PERINEUM +PERINEURIA +PERINEURIUM +PERIOD +PERIODATE +PERIODATES +PERIODIC +PERIODICAL +PERIODICALLY +PERIODICALS +PERIODICITIES +PERIODICITY +PERIODID +PERIODIDS +PERIODIZATION +PERIODIZATIONS +PERIODONTAL +PERIODONTALLY +PERIODONTICS +PERIODONTIST +PERIODONTISTS +PERIODONTOLOGY +PERIODS +PERIONYCHIA +PERIONYCHIUM +PERIOSTEA +PERIOSTEAL +PERIOSTEUM +PERIOSTITIS +PERIOSTITISES +PERIOTIC +PERIPATETIC +PERIPATETICALLY +PERIPATETICS +PERIPATUS +PERIPATUSES +PERIPETEIA +PERIPETEIAS +PERIPETIA +PERIPETIAS +PERIPETIES +PERIPETY +PERIPHERAL +PERIPHERALLY +PERIPHERALS +PERIPHERIES +PERIPHERY +PERIPHRASES +PERIPHRASIS +PERIPHRASTIC +PERIPHYTIC +PERIPHYTON +PERIPHYTONS +PERIPLASM +PERIPLASMS +PERIPLAST +PERIPLASTS +PERIPTER +PERIPTERS +PERIQUE +PERIQUES +PERIS +PERISARC +PERISARCS +PERISCOPE +PERISCOPES +PERISCOPIC +PERISH +PERISHABILITIES +PERISHABILITY +PERISHABLE +PERISHABLES +PERISHED +PERISHES +PERISHING +PERISSODACTYL +PERISSODACTYLS +PERISTALSES +PERISTALSIS +PERISTALTIC +PERISTOME +PERISTOMES +PERISTOMIAL +PERISTYLE +PERISTYLES +PERITHECIA +PERITHECIAL +PERITHECIUM +PERITI +PERITONEA +PERITONEAL +PERITONEALLY +PERITONEUM +PERITONEUMS +PERITONITIS +PERITONITISES +PERITRICH +PERITRICHA +PERITRICHOUS +PERITRICHOUSLY +PERITRICHS +PERITUS +PERIWIG +PERIWIGGED +PERIWIGS +PERIWINKLE +PERIWINKLES +PERJURE +PERJURED +PERJURER +PERJURERS +PERJURES +PERJURIES +PERJURING +PERJURIOUS +PERJURIOUSLY +PERJURY +PERK +PERKED +PERKIER +PERKIEST +PERKILY +PERKINESS +PERKINESSES +PERKING +PERKISH +PERKS +PERKY +PERLITE +PERLITES +PERLITIC +PERM +PERMAFROST +PERMAFROSTS +PERMALLOY +PERMALLOYS +PERMANENCE +PERMANENCES +PERMANENCIES +PERMANENCY +PERMANENT +PERMANENTLY +PERMANENTNESS +PERMANENTNESSES +PERMANENTS +PERMANGANATE +PERMANGANATES +PERMEABILITIES +PERMEABILITY +PERMEABLE +PERMEABLY +PERMEANCE +PERMEANCES +PERMEANT +PERMEASE +PERMEASES +PERMEATE +PERMEATED +PERMEATES +PERMEATING +PERMEATION +PERMEATIONS +PERMEATIVE +PERMEATOR +PERMEATORS +PERMED +PERMETHRIN +PERMETHRINS +PERMIAN +PERMILLAGE +PERMILLAGES +PERMING +PERMISSIBILITY +PERMISSIBLE +PERMISSIBLENESS +PERMISSIBLY +PERMISSION +PERMISSIONS +PERMISSIVE +PERMISSIVELY +PERMISSIVENESS +PERMIT +PERMITS +PERMITTED +PERMITTEE +PERMITTEES +PERMITTER +PERMITTERS +PERMITTING +PERMITTIVITIES +PERMITTIVITY +PERMS +PERMUTABLE +PERMUTATION +PERMUTATIONAL +PERMUTATIONS +PERMUTE +PERMUTED +PERMUTES +PERMUTING +PERNICIOUS +PERNICIOUSLY +PERNICIOUSNESS +PERNICKETY +PERNIO +PERNIONES +PERNOD +PERNODS +PERONEAL +PERORAL +PERORALLY +PERORATE +PERORATED +PERORATES +PERORATING +PERORATION +PERORATIONAL +PERORATIONS +PERORATOR +PERORATORS +PEROVSKITE +PEROVSKITES +PEROXID +PEROXIDASE +PEROXIDASES +PEROXIDE +PEROXIDED +PEROXIDES +PEROXIDIC +PEROXIDING +PEROXIDS +PEROXISOMAL +PEROXISOME +PEROXISOMES +PEROXY +PERP +PERPEND +PERPENDED +PERPENDICULAR +PERPENDICULARLY +PERPENDICULARS +PERPENDING +PERPENDS +PERPENT +PERPENTS +PERPETRATE +PERPETRATED +PERPETRATES +PERPETRATING +PERPETRATION +PERPETRATIONS +PERPETRATOR +PERPETRATORS +PERPETUAL +PERPETUALLY +PERPETUALS +PERPETUATE +PERPETUATED +PERPETUATES +PERPETUATING +PERPETUATION +PERPETUATIONS +PERPETUATOR +PERPETUATORS +PERPETUITIES +PERPETUITY +PERPHENAZINE +PERPHENAZINES +PERPLEX +PERPLEXED +PERPLEXEDLY +PERPLEXER +PERPLEXERS +PERPLEXES +PERPLEXING +PERPLEXITIES +PERPLEXITY +PERPS +PERQUISITE +PERQUISITES +PERRIES +PERRON +PERRONS +PERRY +PERSALT +PERSALTS +PERSE +PERSECUTE +PERSECUTED +PERSECUTEE +PERSECUTEES +PERSECUTES +PERSECUTING +PERSECUTION +PERSECUTIONS +PERSECUTIVE +PERSECUTOR +PERSECUTORS +PERSECUTORY +PERSES +PERSEVERANCE +PERSEVERANCES +PERSEVERATE +PERSEVERATED +PERSEVERATES +PERSEVERATING +PERSEVERATION +PERSEVERATIONS +PERSEVERATIVE +PERSEVERE +PERSEVERED +PERSEVERES +PERSEVERING +PERSEVERINGLY +PERSIFLAGE +PERSIFLAGES +PERSIMMON +PERSIMMONS +PERSIST +PERSISTED +PERSISTENCE +PERSISTENCES +PERSISTENCIES +PERSISTENCY +PERSISTENT +PERSISTENTLY +PERSISTER +PERSISTERS +PERSISTING +PERSISTS +PERSNICKETINESS +PERSNICKETY +PERSON +PERSONA +PERSONABLE +PERSONABLENESS +PERSONAE +PERSONAGE +PERSONAGES +PERSONAL +PERSONALISE +PERSONALISED +PERSONALISES +PERSONALISING +PERSONALISM +PERSONALISMS +PERSONALIST +PERSONALISTIC +PERSONALISTS +PERSONALITIES +PERSONALITY +PERSONALIZATION +PERSONALIZE +PERSONALIZED +PERSONALIZES +PERSONALIZING +PERSONALLY +PERSONALS +PERSONALTIES +PERSONALTY +PERSONAS +PERSONATE +PERSONATED +PERSONATES +PERSONATING +PERSONATION +PERSONATIONS +PERSONATIVE +PERSONATOR +PERSONATORS +PERSONHOOD +PERSONHOODS +PERSONIFICATION +PERSONIFIED +PERSONIFIER +PERSONIFIERS +PERSONIFIES +PERSONIFY +PERSONIFYING +PERSONNEL +PERSONNELS +PERSONS +PERSPECTIVAL +PERSPECTIVE +PERSPECTIVELY +PERSPECTIVES +PERSPEX +PERSPEXES +PERSPICACIOUS +PERSPICACIOUSLY +PERSPICACITIES +PERSPICACITY +PERSPICUITIES +PERSPICUITY +PERSPICUOUS +PERSPICUOUSLY +PERSPICUOUSNESS +PERSPIRATION +PERSPIRATIONS +PERSPIRATORY +PERSPIRE +PERSPIRED +PERSPIRES +PERSPIRING +PERSPIRY +PERSUADABLE +PERSUADE +PERSUADED +PERSUADER +PERSUADERS +PERSUADES +PERSUADING +PERSUASIBLE +PERSUASION +PERSUASIONS +PERSUASIVE +PERSUASIVELY +PERSUASIVENESS +PERT +PERTAIN +PERTAINED +PERTAINING +PERTAINS +PERTER +PERTEST +PERTINACIOUS +PERTINACIOUSLY +PERTINACITIES +PERTINACITY +PERTINENCE +PERTINENCES +PERTINENCIES +PERTINENCY +PERTINENT +PERTINENTLY +PERTLY +PERTNESS +PERTNESSES +PERTURB +PERTURBABLE +PERTURBATION +PERTURBATIONAL +PERTURBATIONS +PERTURBED +PERTURBER +PERTURBERS +PERTURBING +PERTURBS +PERTUSSAL +PERTUSSES +PERTUSSIS +PERTUSSISES +PERUKE +PERUKED +PERUKES +PERUSABLE +PERUSAL +PERUSALS +PERUSE +PERUSED +PERUSER +PERUSERS +PERUSES +PERUSING +PERV +PERVADE +PERVADED +PERVADER +PERVADERS +PERVADES +PERVADING +PERVASION +PERVASIONS +PERVASIVE +PERVASIVELY +PERVASIVENESS +PERVASIVENESSES +PERVERSE +PERVERSELY +PERVERSENESS +PERVERSENESSES +PERVERSION +PERVERSIONS +PERVERSITIES +PERVERSITY +PERVERSIVE +PERVERT +PERVERTED +PERVERTEDLY +PERVERTEDNESS +PERVERTEDNESSES +PERVERTER +PERVERTERS +PERVERTING +PERVERTS +PERVIOUS +PERVIOUSNESS +PERVIOUSNESSES +PERVS +PES +PESADE +PESADES +PESETA +PESETAS +PESEWA +PESEWAS +PESKIER +PESKIEST +PESKILY +PESKINESS +PESKINESSES +PESKY +PESO +PESOS +PESSARIES +PESSARY +PESSIMISM +PESSIMISMS +PESSIMIST +PESSIMISTIC +PESSIMISTICALLY +PESSIMISTS +PEST +PESTER +PESTERED +PESTERER +PESTERERS +PESTERING +PESTERS +PESTHOLE +PESTHOLES +PESTHOUSE +PESTHOUSES +PESTICIDE +PESTICIDES +PESTIER +PESTIEST +PESTIFEROUS +PESTIFEROUSLY +PESTIFEROUSNESS +PESTILENCE +PESTILENCES +PESTILENT +PESTILENTIAL +PESTILENTIALLY +PESTILENTLY +PESTLE +PESTLED +PESTLES +PESTLING +PESTO +PESTOS +PESTS +PESTY +PET +PETABYTE +PETABYTES +PETAHERTZ +PETAHERTZES +PETAL +PETALED +PETALINE +PETALLED +PETALLIKE +PETALODIES +PETALODY +PETALOID +PETALOUS +PETALS +PETARD +PETARDS +PETASOS +PETASOSES +PETASUS +PETASUSES +PETCOCK +PETCOCKS +PETECHIA +PETECHIAE +PETECHIAL +PETER +PETERED +PETERING +PETERS +PETIOLAR +PETIOLATE +PETIOLE +PETIOLED +PETIOLES +PETIOLULE +PETIOLULES +PETIT +PETITE +PETITENESS +PETITENESSES +PETITES +PETITION +PETITIONARY +PETITIONED +PETITIONER +PETITIONERS +PETITIONING +PETITIONS +PETNAP +PETNAPER +PETNAPERS +PETNAPING +PETNAPINGS +PETNAPPED +PETNAPPER +PETNAPPERS +PETNAPPING +PETNAPS +PETRALE +PETRALES +PETREL +PETRELS +PETRIFACTION +PETRIFACTIONS +PETRIFICATION +PETRIFICATIONS +PETRIFIED +PETRIFIER +PETRIFIERS +PETRIFIES +PETRIFY +PETRIFYING +PETROCHEMICAL +PETROCHEMICALS +PETROCHEMISTRY +PETRODOLLAR +PETRODOLLARS +PETROGENESES +PETROGENESIS +PETROGENETIC +PETROGENIES +PETROGENY +PETROGLYPH +PETROGLYPHS +PETROGRAPHER +PETROGRAPHERS +PETROGRAPHIC +PETROGRAPHICAL +PETROGRAPHIES +PETROGRAPHY +PETROL +PETROLATUM +PETROLATUMS +PETROLEUM +PETROLEUMS +PETROLIC +PETROLOGIC +PETROLOGICAL +PETROLOGICALLY +PETROLOGIES +PETROLOGIST +PETROLOGISTS +PETROLOGY +PETROLS +PETRONEL +PETRONELS +PETROSAL +PETROUS +PETS +PETSAI +PETSAIS +PETTABLE +PETTED +PETTEDLY +PETTER +PETTERS +PETTI +PETTICOAT +PETTICOATED +PETTICOATS +PETTIER +PETTIEST +PETTIFOG +PETTIFOGGED +PETTIFOGGER +PETTIFOGGERIES +PETTIFOGGERS +PETTIFOGGERY +PETTIFOGGING +PETTIFOGGINGS +PETTIFOGS +PETTILY +PETTINESS +PETTINESSES +PETTING +PETTINGS +PETTISH +PETTISHLY +PETTISHNESS +PETTISHNESSES +PETTITOES +PETTLE +PETTLED +PETTLES +PETTLING +PETTO +PETTY +PETULANCE +PETULANCES +PETULANCIES +PETULANCY +PETULANT +PETULANTLY +PETUNIA +PETUNIAS +PETUNTSE +PETUNTSES +PETUNTZE +PETUNTZES +PEW +PEWEE +PEWEES +PEWHOLDER +PEWHOLDERS +PEWIT +PEWITS +PEWS +PEWTER +PEWTERER +PEWTERERS +PEWTERS +PEYOTE +PEYOTES +PEYOTL +PEYOTLS +PEYTRAL +PEYTRALS +PEYTREL +PEYTRELS +PFENNIG +PFENNIGE +PFENNIGS +PFFT +PFUI +PHAETON +PHAETONS +PHAGE +PHAGEDENA +PHAGEDENAS +PHAGES +PHAGOCYTE +PHAGOCYTES +PHAGOCYTIC +PHAGOCYTIZE +PHAGOCYTIZED +PHAGOCYTIZES +PHAGOCYTIZING +PHAGOCYTOSE +PHAGOCYTOSED +PHAGOCYTOSES +PHAGOCYTOSING +PHAGOCYTOSIS +PHAGOCYTOTIC +PHAGOSOME +PHAGOSOMES +PHALANGAL +PHALANGE +PHALANGEAL +PHALANGER +PHALANGERS +PHALANGES +PHALANSTERIES +PHALANSTERY +PHALANX +PHALANXES +PHALAROPE +PHALAROPES +PHALLI +PHALLIC +PHALLICALLY +PHALLICISM +PHALLICISMS +PHALLISM +PHALLISMS +PHALLIST +PHALLISTS +PHALLOCENTRIC +PHALLUS +PHALLUSES +PHANEROGAM +PHANEROGAMS +PHANEROPHYTE +PHANEROPHYTES +PHANTASIED +PHANTASIES +PHANTASM +PHANTASMA +PHANTASMAGORIA +PHANTASMAGORIAS +PHANTASMAGORIC +PHANTASMAL +PHANTASMATA +PHANTASMIC +PHANTASMS +PHANTAST +PHANTASTS +PHANTASY +PHANTASYING +PHANTOM +PHANTOMLIKE +PHANTOMS +PHARAOH +PHARAOHS +PHARAONIC +PHARISAIC +PHARISAICAL +PHARISAICALLY +PHARISAICALNESS +PHARISAISM +PHARISAISMS +PHARISEE +PHARISEES +PHARMACEUTICAL +PHARMACEUTICALS +PHARMACIES +PHARMACIST +PHARMACISTS +PHARMACODYNAMIC +PHARMACOGNOSIES +PHARMACOGNOSTIC +PHARMACOGNOSY +PHARMACOKINETIC +PHARMACOLOGIC +PHARMACOLOGICAL +PHARMACOLOGIES +PHARMACOLOGIST +PHARMACOLOGISTS +PHARMACOLOGY +PHARMACOPEIA +PHARMACOPEIAL +PHARMACOPEIAS +PHARMACOPOEIA +PHARMACOPOEIAL +PHARMACOPOEIAS +PHARMACOTHERAPY +PHARMACY +PHARMING +PHARMINGS +PHAROS +PHAROSES +PHARYNGAL +PHARYNGALS +PHARYNGEAL +PHARYNGES +PHARYNGITIDES +PHARYNGITIS +PHARYNX +PHARYNXES +PHASE +PHASEAL +PHASED +PHASEDOWN +PHASEDOWNS +PHASEOUT +PHASEOUTS +PHASES +PHASIC +PHASING +PHASIS +PHASMID +PHASMIDS +PHAT +PHATIC +PHATICALLY +PHATTER +PHATTEST +PHEASANT +PHEASANTS +PHELLEM +PHELLEMS +PHELLODERM +PHELLODERMS +PHELLOGEN +PHELLOGENS +PHELONIA +PHELONION +PHELONIONS +PHENACAINE +PHENACAINES +PHENACETIN +PHENACETINS +PHENACITE +PHENACITES +PHENAKITE +PHENAKITES +PHENANTHRENE +PHENANTHRENES +PHENATE +PHENATES +PHENAZIN +PHENAZINE +PHENAZINES +PHENAZINS +PHENCYCLIDINE +PHENCYCLIDINES +PHENETIC +PHENETICIST +PHENETICISTS +PHENETICS +PHENETOL +PHENETOLE +PHENETOLES +PHENETOLS +PHENIX +PHENIXES +PHENMETRAZINE +PHENMETRAZINES +PHENOBARBITAL +PHENOBARBITALS +PHENOBARBITONE +PHENOBARBITONES +PHENOCOPIES +PHENOCOPY +PHENOCRYST +PHENOCRYSTIC +PHENOCRYSTS +PHENOL +PHENOLATE +PHENOLATED +PHENOLATES +PHENOLATING +PHENOLIC +PHENOLICS +PHENOLOGICAL +PHENOLOGICALLY +PHENOLOGIES +PHENOLOGY +PHENOLPHTHALEIN +PHENOLS +PHENOM +PHENOMENA +PHENOMENAL +PHENOMENALISM +PHENOMENALISMS +PHENOMENALIST +PHENOMENALISTIC +PHENOMENALISTS +PHENOMENALLY +PHENOMENAS +PHENOMENOLOGIES +PHENOMENOLOGIST +PHENOMENOLOGY +PHENOMENON +PHENOMENONS +PHENOMS +PHENOTHIAZINE +PHENOTHIAZINES +PHENOTYPE +PHENOTYPES +PHENOTYPIC +PHENOTYPICAL +PHENOTYPICALLY +PHENOXIDE +PHENOXIDES +PHENOXY +PHENTOLAMINE +PHENTOLAMINES +PHENYL +PHENYLALANINE +PHENYLALANINES +PHENYLBUTAZONE +PHENYLBUTAZONES +PHENYLENE +PHENYLENES +PHENYLEPHRINE +PHENYLEPHRINES +PHENYLIC +PHENYLKETONURIA +PHENYLKETONURIC +PHENYLS +PHENYLTHIOUREA +PHENYLTHIOUREAS +PHENYTOIN +PHENYTOINS +PHERESES +PHERESIS +PHEROMONAL +PHEROMONE +PHEROMONES +PHEW +PHI +PHIAL +PHIALS +PHILABEG +PHILABEGS +PHILADELPHUS +PHILADELPHUSES +PHILANDER +PHILANDERED +PHILANDERER +PHILANDERERS +PHILANDERING +PHILANDERS +PHILANTHROPIC +PHILANTHROPICAL +PHILANTHROPIES +PHILANTHROPIST +PHILANTHROPISTS +PHILANTHROPOID +PHILANTHROPOIDS +PHILANTHROPY +PHILATELIC +PHILATELICALLY +PHILATELIES +PHILATELIST +PHILATELISTS +PHILATELY +PHILHARMONIC +PHILHARMONICS +PHILHELLENE +PHILHELLENES +PHILHELLENIC +PHILHELLENISM +PHILHELLENISMS +PHILHELLENIST +PHILHELLENISTS +PHILIBEG +PHILIBEGS +PHILIPPIC +PHILIPPICS +PHILISTIA +PHILISTIAS +PHILISTINE +PHILISTINES +PHILISTINISM +PHILISTINISMS +PHILLUMENIST +PHILLUMENISTS +PHILODENDRA +PHILODENDRON +PHILODENDRONS +PHILOGYNIES +PHILOGYNY +PHILOLOGICAL +PHILOLOGICALLY +PHILOLOGIES +PHILOLOGIST +PHILOLOGISTS +PHILOLOGY +PHILOMEL +PHILOMELA +PHILOMELAS +PHILOMELS +PHILOSOPHE +PHILOSOPHER +PHILOSOPHERS +PHILOSOPHES +PHILOSOPHIC +PHILOSOPHICAL +PHILOSOPHICALLY +PHILOSOPHIES +PHILOSOPHISE +PHILOSOPHISED +PHILOSOPHISES +PHILOSOPHISING +PHILOSOPHIZE +PHILOSOPHIZED +PHILOSOPHIZER +PHILOSOPHIZERS +PHILOSOPHIZES +PHILOSOPHIZING +PHILOSOPHY +PHILTER +PHILTERED +PHILTERING +PHILTERS +PHILTRA +PHILTRE +PHILTRED +PHILTRES +PHILTRING +PHILTRUM +PHIMOSES +PHIMOSIS +PHIMOTIC +PHIS +PHIZ +PHIZES +PHLEBITIC +PHLEBITIDES +PHLEBITIS +PHLEBITISES +PHLEBOGRAM +PHLEBOGRAMS +PHLEBOGRAPHIC +PHLEBOGRAPHIES +PHLEBOGRAPHY +PHLEBOLOGIES +PHLEBOLOGY +PHLEBOTOMIES +PHLEBOTOMIST +PHLEBOTOMISTS +PHLEBOTOMY +PHLEGM +PHLEGMATIC +PHLEGMATICALLY +PHLEGMIER +PHLEGMIEST +PHLEGMS +PHLEGMY +PHLOEM +PHLOEMS +PHLOGISTIC +PHLOGISTON +PHLOGISTONS +PHLOGOPITE +PHLOGOPITES +PHLORIZIN +PHLORIZINS +PHLOX +PHLOXES +PHLYCTENA +PHLYCTENAE +PHOBIA +PHOBIAS +PHOBIC +PHOBICS +PHOCINE +PHOEBE +PHOEBES +PHOEBUS +PHOEBUSES +PHOENIX +PHOENIXES +PHOENIXLIKE +PHON +PHONAL +PHONATE +PHONATED +PHONATES +PHONATHON +PHONATHONS +PHONATING +PHONATION +PHONATIONS +PHONE +PHONED +PHONEMATIC +PHONEME +PHONEMES +PHONEMIC +PHONEMICALLY +PHONEMICIST +PHONEMICISTS +PHONEMICS +PHONES +PHONETIC +PHONETICALLY +PHONETICIAN +PHONETICIANS +PHONETICS +PHONETIST +PHONETISTS +PHONEY +PHONEYED +PHONEYING +PHONEYS +PHONIC +PHONICALLY +PHONICS +PHONIED +PHONIER +PHONIES +PHONIEST +PHONILY +PHONINESS +PHONINESSES +PHONING +PHONO +PHONOCARDIOGRAM +PHONOGRAM +PHONOGRAMIC +PHONOGRAMICALLY +PHONOGRAMMIC +PHONOGRAMS +PHONOGRAPH +PHONOGRAPHER +PHONOGRAPHERS +PHONOGRAPHIC +PHONOGRAPHIES +PHONOGRAPHS +PHONOGRAPHY +PHONOLITE +PHONOLITES +PHONOLOGIC +PHONOLOGICAL +PHONOLOGICALLY +PHONOLOGIES +PHONOLOGIST +PHONOLOGISTS +PHONOLOGY +PHONON +PHONONS +PHONOS +PHONOTACTIC +PHONOTACTICS +PHONOTYPE +PHONOTYPES +PHONOTYPIES +PHONOTYPY +PHONS +PHONY +PHONYING +PHOOEY +PHORATE +PHORATES +PHORESIES +PHORESY +PHORONID +PHORONIDS +PHOSGENE +PHOSGENES +PHOSPHATASE +PHOSPHATASES +PHOSPHATE +PHOSPHATES +PHOSPHATIC +PHOSPHATIDE +PHOSPHATIDES +PHOSPHATIDIC +PHOSPHATIDYL +PHOSPHATIDYLS +PHOSPHATIZATION +PHOSPHATIZE +PHOSPHATIZED +PHOSPHATIZES +PHOSPHATIZING +PHOSPHATURIA +PHOSPHATURIAS +PHOSPHENE +PHOSPHENES +PHOSPHID +PHOSPHIDE +PHOSPHIDES +PHOSPHIDS +PHOSPHIN +PHOSPHINE +PHOSPHINES +PHOSPHINS +PHOSPHITE +PHOSPHITES +PHOSPHOCREATINE +PHOSPHOKINASE +PHOSPHOKINASES +PHOSPHOLIPASE +PHOSPHOLIPASES +PHOSPHOLIPID +PHOSPHOLIPIDS +PHOSPHONIUM +PHOSPHONIUMS +PHOSPHOPROTEIN +PHOSPHOPROTEINS +PHOSPHOR +PHOSPHORE +PHOSPHORES +PHOSPHORESCE +PHOSPHORESCED +PHOSPHORESCENCE +PHOSPHORESCENT +PHOSPHORESCES +PHOSPHORESCING +PHOSPHORI +PHOSPHORIC +PHOSPHORITE +PHOSPHORITES +PHOSPHORITIC +PHOSPHOROLYSES +PHOSPHOROLYSIS +PHOSPHOROLYTIC +PHOSPHOROUS +PHOSPHORS +PHOSPHORUS +PHOSPHORUSES +PHOSPHORYL +PHOSPHORYLASE +PHOSPHORYLASES +PHOSPHORYLATE +PHOSPHORYLATED +PHOSPHORYLATES +PHOSPHORYLATING +PHOSPHORYLATION +PHOSPHORYLATIVE +PHOSPHORYLS +PHOT +PHOTIC +PHOTICALLY +PHOTICS +PHOTO +PHOTOAUTOTROPH +PHOTOAUTOTROPHS +PHOTOBIOLOGIC +PHOTOBIOLOGICAL +PHOTOBIOLOGIES +PHOTOBIOLOGIST +PHOTOBIOLOGISTS +PHOTOBIOLOGY +PHOTOCATHODE +PHOTOCATHODES +PHOTOCELL +PHOTOCELLS +PHOTOCHEMICAL +PHOTOCHEMICALLY +PHOTOCHEMIST +PHOTOCHEMISTRY +PHOTOCHEMISTS +PHOTOCHROMIC +PHOTOCHROMISM +PHOTOCHROMISMS +PHOTOCOMPOSE +PHOTOCOMPOSED +PHOTOCOMPOSER +PHOTOCOMPOSERS +PHOTOCOMPOSES +PHOTOCOMPOSING +PHOTOCONDUCTIVE +PHOTOCOPIED +PHOTOCOPIER +PHOTOCOPIERS +PHOTOCOPIES +PHOTOCOPY +PHOTOCOPYING +PHOTOCURRENT +PHOTOCURRENTS +PHOTODEGRADABLE +PHOTODETECTOR +PHOTODETECTORS +PHOTODIODE +PHOTODIODES +PHOTODISSOCIATE +PHOTODUPLICATE +PHOTODUPLICATED +PHOTODUPLICATES +PHOTODYNAMIC +PHOTOED +PHOTOELECTRIC +PHOTOELECTRON +PHOTOELECTRONIC +PHOTOELECTRONS +PHOTOEMISSION +PHOTOEMISSIONS +PHOTOEMISSIVE +PHOTOENGRAVE +PHOTOENGRAVED +PHOTOENGRAVER +PHOTOENGRAVERS +PHOTOENGRAVES +PHOTOENGRAVING +PHOTOENGRAVINGS +PHOTOEXCITATION +PHOTOEXCITED +PHOTOFINISHER +PHOTOFINISHERS +PHOTOFINISHING +PHOTOFINISHINGS +PHOTOFLASH +PHOTOFLASHES +PHOTOFLOOD +PHOTOFLOODS +PHOTOG +PHOTOGENE +PHOTOGENES +PHOTOGENIC +PHOTOGENICALLY +PHOTOGEOLOGIC +PHOTOGEOLOGICAL +PHOTOGEOLOGIES +PHOTOGEOLOGIST +PHOTOGEOLOGISTS +PHOTOGEOLOGY +PHOTOGRAM +PHOTOGRAMMETRIC +PHOTOGRAMMETRY +PHOTOGRAMS +PHOTOGRAPH +PHOTOGRAPHED +PHOTOGRAPHER +PHOTOGRAPHERS +PHOTOGRAPHIC +PHOTOGRAPHIES +PHOTOGRAPHING +PHOTOGRAPHS +PHOTOGRAPHY +PHOTOGRAVURE +PHOTOGRAVURES +PHOTOGS +PHOTOINDUCED +PHOTOINDUCTION +PHOTOINDUCTIONS +PHOTOINDUCTIVE +PHOTOING +PHOTOIONIZATION +PHOTOIONIZE +PHOTOIONIZED +PHOTOIONIZES +PHOTOIONIZING +PHOTOJOURNALISM +PHOTOJOURNALIST +PHOTOKINESES +PHOTOKINESIS +PHOTOKINETIC +PHOTOLITHOGRAPH +PHOTOLYSES +PHOTOLYSIS +PHOTOLYTIC +PHOTOLYTICALLY +PHOTOLYZABLE +PHOTOLYZE +PHOTOLYZED +PHOTOLYZES +PHOTOLYZING +PHOTOMAP +PHOTOMAPPED +PHOTOMAPPING +PHOTOMAPS +PHOTOMASK +PHOTOMASKS +PHOTOMECHANICAL +PHOTOMETER +PHOTOMETERS +PHOTOMETRIC +PHOTOMETRICALLY +PHOTOMETRIES +PHOTOMETRY +PHOTOMICROGRAPH +PHOTOMONTAGE +PHOTOMONTAGES +PHOTOMOSAIC +PHOTOMOSAICS +PHOTOMULTIPLIER +PHOTOMURAL +PHOTOMURALS +PHOTON +PHOTONEGATIVE +PHOTONIC +PHOTONICS +PHOTONS +PHOTONUCLEAR +PHOTOOXIDATION +PHOTOOXIDATIONS +PHOTOOXIDATIVE +PHOTOOXIDIZE +PHOTOOXIDIZED +PHOTOOXIDIZES +PHOTOOXIDIZING +PHOTOPERIOD +PHOTOPERIODIC +PHOTOPERIODISM +PHOTOPERIODISMS +PHOTOPERIODS +PHOTOPHASE +PHOTOPHASES +PHOTOPHOBIA +PHOTOPHOBIAS +PHOTOPHOBIC +PHOTOPHORE +PHOTOPHORES +PHOTOPIA +PHOTOPIAS +PHOTOPIC +PHOTOPLAY +PHOTOPLAYS +PHOTOPOLYMER +PHOTOPOLYMERS +PHOTOPOSITIVE +PHOTOPRODUCT +PHOTOPRODUCTION +PHOTOPRODUCTS +PHOTOREACTION +PHOTOREACTIONS +PHOTORECEPTION +PHOTORECEPTIONS +PHOTORECEPTIVE +PHOTORECEPTOR +PHOTORECEPTORS +PHOTOREDUCE +PHOTOREDUCED +PHOTOREDUCES +PHOTOREDUCING +PHOTOREDUCTION +PHOTOREDUCTIONS +PHOTORESIST +PHOTORESISTS +PHOTOS +PHOTOSCAN +PHOTOSCANNED +PHOTOSCANNING +PHOTOSCANS +PHOTOSENSITIVE +PHOTOSENSITIZE +PHOTOSENSITIZED +PHOTOSENSITIZER +PHOTOSENSITIZES +PHOTOSET +PHOTOSETS +PHOTOSETTER +PHOTOSETTERS +PHOTOSETTING +PHOTOSPHERE +PHOTOSPHERES +PHOTOSPHERIC +PHOTOSTAT +PHOTOSTATED +PHOTOSTATIC +PHOTOSTATING +PHOTOSTATS +PHOTOSTATTED +PHOTOSTATTING +PHOTOSYNTHATE +PHOTOSYNTHATES +PHOTOSYNTHESES +PHOTOSYNTHESIS +PHOTOSYNTHESIZE +PHOTOSYNTHETIC +PHOTOSYSTEM +PHOTOSYSTEMS +PHOTOTACTIC +PHOTOTACTICALLY +PHOTOTAXES +PHOTOTAXIES +PHOTOTAXIS +PHOTOTAXY +PHOTOTELEGRAPHY +PHOTOTOXIC +PHOTOTOXICITIES +PHOTOTOXICITY +PHOTOTROPIC +PHOTOTROPICALLY +PHOTOTROPISM +PHOTOTROPISMS +PHOTOTUBE +PHOTOTUBES +PHOTOTYPE +PHOTOTYPES +PHOTOTYPESETTER +PHOTOVOLTAIC +PHOTOVOLTAICS +PHOTS +PHPHT +PHRAGMOPLAST +PHRAGMOPLASTS +PHRASAL +PHRASALLY +PHRASE +PHRASED +PHRASEMAKER +PHRASEMAKERS +PHRASEMAKING +PHRASEMAKINGS +PHRASEMONGER +PHRASEMONGERING +PHRASEMONGERS +PHRASEOLOGICAL +PHRASEOLOGIES +PHRASEOLOGIST +PHRASEOLOGISTS +PHRASEOLOGY +PHRASES +PHRASING +PHRASINGS +PHRATRAL +PHRATRIC +PHRATRIES +PHRATRY +PHREAK +PHREAKED +PHREAKER +PHREAKERS +PHREAKING +PHREAKINGS +PHREAKS +PHREATIC +PHREATOPHYTE +PHREATOPHYTES +PHREATOPHYTIC +PHRENETIC +PHRENIC +PHRENITIDES +PHRENITIS +PHRENITISES +PHRENOLOGICAL +PHRENOLOGIES +PHRENOLOGIST +PHRENOLOGISTS +PHRENOLOGY +PHRENSIED +PHRENSIES +PHRENSY +PHRENSYING +PHT +PHTHALATE +PHTHALATES +PHTHALEIN +PHTHALEINS +PHTHALIC +PHTHALIN +PHTHALINS +PHTHALOCYANINE +PHTHALOCYANINES +PHTHISES +PHTHISIC +PHTHISICAL +PHTHISICS +PHTHISIS +PHUT +PHUTS +PHYCOCYANIN +PHYCOCYANINS +PHYCOERYTHRIN +PHYCOERYTHRINS +PHYCOLOGICAL +PHYCOLOGIES +PHYCOLOGIST +PHYCOLOGISTS +PHYCOLOGY +PHYCOMYCETE +PHYCOMYCETES +PHYCOMYCETOUS +PHYLA +PHYLACTERIES +PHYLACTERY +PHYLAE +PHYLAR +PHYLAXIS +PHYLAXISES +PHYLE +PHYLESES +PHYLESIS +PHYLESISES +PHYLETIC +PHYLETICALLY +PHYLETICS +PHYLIC +PHYLLARIES +PHYLLARY +PHYLLITE +PHYLLITES +PHYLLITIC +PHYLLO +PHYLLOCLADE +PHYLLOCLADES +PHYLLODE +PHYLLODES +PHYLLODIA +PHYLLODIUM +PHYLLOID +PHYLLOIDS +PHYLLOME +PHYLLOMES +PHYLLOMIC +PHYLLOPOD +PHYLLOPODS +PHYLLOS +PHYLLOTACTIC +PHYLLOTAXES +PHYLLOTAXIES +PHYLLOTAXIS +PHYLLOTAXY +PHYLLOXERA +PHYLLOXERAS +PHYLOGENETIC +PHYLOGENIES +PHYLOGENY +PHYLON +PHYLUM +PHYSED +PHYSEDS +PHYSES +PHYSIATRIES +PHYSIATRIST +PHYSIATRISTS +PHYSIATRY +PHYSIC +PHYSICAL +PHYSICALISM +PHYSICALISMS +PHYSICALIST +PHYSICALISTIC +PHYSICALISTS +PHYSICALITIES +PHYSICALITY +PHYSICALLY +PHYSICALNESS +PHYSICALNESSES +PHYSICALS +PHYSICIAN +PHYSICIANS +PHYSICIST +PHYSICISTS +PHYSICKED +PHYSICKING +PHYSICOCHEMICAL +PHYSICS +PHYSIOCRATIC +PHYSIOGNOMIC +PHYSIOGNOMICAL +PHYSIOGNOMIES +PHYSIOGNOMY +PHYSIOGRAPHER +PHYSIOGRAPHERS +PHYSIOGRAPHIC +PHYSIOGRAPHICAL +PHYSIOGRAPHIES +PHYSIOGRAPHY +PHYSIOLOGIC +PHYSIOLOGICAL +PHYSIOLOGICALLY +PHYSIOLOGIES +PHYSIOLOGIST +PHYSIOLOGISTS +PHYSIOLOGY +PHYSIOPATHOLOGY +PHYSIOTHERAPIES +PHYSIOTHERAPIST +PHYSIOTHERAPY +PHYSIQUE +PHYSIQUED +PHYSIQUES +PHYSIS +PHYSOSTIGMINE +PHYSOSTIGMINES +PHYTANE +PHYTANES +PHYTIN +PHYTINS +PHYTOALEXIN +PHYTOALEXINS +PHYTOCHEMICAL +PHYTOCHEMICALLY +PHYTOCHEMIST +PHYTOCHEMISTRY +PHYTOCHEMISTS +PHYTOCHROME +PHYTOCHROMES +PHYTOFLAGELLATE +PHYTOGENIES +PHYTOGENY +PHYTOGEOGRAPHER +PHYTOGEOGRAPHIC +PHYTOGEOGRAPHY +PHYTOHORMONE +PHYTOHORMONES +PHYTOID +PHYTOL +PHYTOLITH +PHYTOLITHS +PHYTOLOGIES +PHYTOLOGY +PHYTOLS +PHYTON +PHYTONIC +PHYTONS +PHYTOPATHOGEN +PHYTOPATHOGENIC +PHYTOPATHOGENS +PHYTOPATHOLOGY +PHYTOPHAGOUS +PHYTOPLANKTER +PHYTOPLANKTERS +PHYTOPLANKTON +PHYTOPLANKTONIC +PHYTOPLANKTONS +PHYTOSOCIOLOGY +PHYTOSTEROL +PHYTOSTEROLS +PHYTOTOXIC +PHYTOTOXICITIES +PHYTOTOXICITY +PHYTOTRON +PHYTOTRONS +PI +PIA +PIACULAR +PIAFFE +PIAFFED +PIAFFER +PIAFFERS +PIAFFES +PIAFFING +PIAL +PIAN +PIANIC +PIANISM +PIANISMS +PIANISSIMI +PIANISSIMO +PIANISSIMOS +PIANIST +PIANISTIC +PIANISTICALLY +PIANISTS +PIANO +PIANOFORTE +PIANOFORTES +PIANOS +PIANS +PIAS +PIASABA +PIASABAS +PIASAVA +PIASAVAS +PIASSABA +PIASSABAS +PIASSAVA +PIASSAVAS +PIASTER +PIASTERS +PIASTRE +PIASTRES +PIAZZA +PIAZZAS +PIAZZE +PIBAL +PIBALS +PIBROCH +PIBROCHS +PIC +PICA +PICACHO +PICACHOS +PICADILLO +PICADILLOS +PICADOR +PICADORES +PICADORS +PICAL +PICANINNIES +PICANINNY +PICANTE +PICARA +PICARAS +PICARESQUE +PICARESQUES +PICARO +PICAROON +PICAROONED +PICAROONING +PICAROONS +PICAROS +PICAS +PICAYUNE +PICAYUNES +PICAYUNISH +PICCALILLI +PICCALILLIS +PICCATA +PICCOLO +PICCOLOIST +PICCOLOISTS +PICCOLOS +PICE +PICEOUS +PICHOLINE +PICHOLINES +PICIFORM +PICK +PICKABACK +PICKABACKED +PICKABACKING +PICKABACKS +PICKADIL +PICKADILS +PICKANINNIES +PICKANINNY +PICKAROON +PICKAROONS +PICKAX +PICKAXE +PICKAXED +PICKAXES +PICKAXING +PICKED +PICKEER +PICKEERED +PICKEERING +PICKEERS +PICKER +PICKEREL +PICKERELS +PICKERELWEED +PICKERELWEEDS +PICKERS +PICKET +PICKETBOAT +PICKETBOATS +PICKETED +PICKETER +PICKETERS +PICKETING +PICKETS +PICKIER +PICKIEST +PICKINESS +PICKINESSES +PICKING +PICKINGS +PICKLE +PICKLED +PICKLES +PICKLING +PICKLOCK +PICKLOCKS +PICKOFF +PICKOFFS +PICKPOCKET +PICKPOCKETS +PICKPROOF +PICKS +PICKTHANK +PICKTHANKS +PICKUP +PICKUPS +PICKWICK +PICKWICKS +PICKY +PICLORAM +PICLORAMS +PICNIC +PICNICKED +PICNICKER +PICNICKERS +PICNICKING +PICNICKY +PICNICS +PICOFARAD +PICOFARADS +PICOGRAM +PICOGRAMS +PICOLIN +PICOLINE +PICOLINES +PICOLINS +PICOMETER +PICOMETERS +PICOMETRE +PICOMETRES +PICOMOLE +PICOMOLES +PICORNAVIRUS +PICORNAVIRUSES +PICOSECOND +PICOSECONDS +PICOT +PICOTED +PICOTEE +PICOTEES +PICOTING +PICOTS +PICOWAVE +PICOWAVED +PICOWAVES +PICOWAVING +PICQUET +PICQUETS +PICRATE +PICRATED +PICRATES +PICRIC +PICRITE +PICRITES +PICRITIC +PICROTOXIN +PICROTOXINS +PICS +PICTOGRAM +PICTOGRAMS +PICTOGRAPH +PICTOGRAPHIC +PICTOGRAPHIES +PICTOGRAPHS +PICTOGRAPHY +PICTORIAL +PICTORIALISM +PICTORIALISMS +PICTORIALIST +PICTORIALISTS +PICTORIALIZE +PICTORIALIZED +PICTORIALIZES +PICTORIALIZING +PICTORIALLY +PICTORIALNESS +PICTORIALNESSES +PICTORIALS +PICTURE +PICTURED +PICTUREPHONE +PICTUREPHONES +PICTURES +PICTURESQUE +PICTURESQUELY +PICTURESQUENESS +PICTURING +PICTURIZATION +PICTURIZATIONS +PICTURIZE +PICTURIZED +PICTURIZES +PICTURIZING +PICUL +PICULS +PIDDLE +PIDDLED +PIDDLER +PIDDLERS +PIDDLES +PIDDLING +PIDDLY +PIDDOCK +PIDDOCKS +PIDGIN +PIDGINIZATION +PIDGINIZATIONS +PIDGINIZE +PIDGINIZED +PIDGINIZES +PIDGINIZING +PIDGINS +PIE +PIEBALD +PIEBALDS +PIECE +PIECED +PIECEMEAL +PIECER +PIECERS +PIECES +PIECEWISE +PIECEWORK +PIECEWORKER +PIECEWORKERS +PIECEWORKS +PIECING +PIECINGS +PIECRUST +PIECRUSTS +PIED +PIEDFORT +PIEDFORTS +PIEDMONT +PIEDMONTS +PIEFORT +PIEFORTS +PIEHOLE +PIEHOLES +PIEING +PIEPLANT +PIEPLANTS +PIER +PIERCE +PIERCED +PIERCER +PIERCERS +PIERCES +PIERCING +PIERCINGLY +PIERCINGS +PIERIDINE +PIEROGI +PIEROGIES +PIERROT +PIERROTS +PIERS +PIES +PIETA +PIETAS +PIETIES +PIETISM +PIETISMS +PIETIST +PIETISTIC +PIETISTICALLY +PIETISTS +PIETY +PIEZOELECTRIC +PIEZOMETER +PIEZOMETERS +PIEZOMETRIC +PIFFLE +PIFFLED +PIFFLES +PIFFLING +PIG +PIGBOAT +PIGBOATS +PIGEON +PIGEONHOLE +PIGEONHOLED +PIGEONHOLER +PIGEONHOLERS +PIGEONHOLES +PIGEONHOLING +PIGEONITE +PIGEONITES +PIGEONS +PIGEONWING +PIGEONWINGS +PIGFISH +PIGFISHES +PIGGED +PIGGERIES +PIGGERY +PIGGIE +PIGGIER +PIGGIES +PIGGIEST +PIGGIN +PIGGINESS +PIGGINESSES +PIGGING +PIGGINS +PIGGISH +PIGGISHLY +PIGGISHNESS +PIGGISHNESSES +PIGGY +PIGGYBACK +PIGGYBACKED +PIGGYBACKING +PIGGYBACKS +PIGHEADED +PIGHEADEDLY +PIGHEADEDNESS +PIGHEADEDNESSES +PIGLET +PIGLETS +PIGLIKE +PIGMENT +PIGMENTARY +PIGMENTATION +PIGMENTATIONS +PIGMENTED +PIGMENTING +PIGMENTS +PIGMIES +PIGMY +PIGNOLI +PIGNOLIA +PIGNOLIAS +PIGNOLIS +PIGNORA +PIGNUS +PIGNUT +PIGNUTS +PIGOUT +PIGOUTS +PIGPEN +PIGPENS +PIGS +PIGSKIN +PIGSKINS +PIGSNEY +PIGSNEYS +PIGSTICK +PIGSTICKED +PIGSTICKER +PIGSTICKERS +PIGSTICKING +PIGSTICKS +PIGSTIES +PIGSTY +PIGTAIL +PIGTAILED +PIGTAILS +PIGWEED +PIGWEEDS +PIING +PIKA +PIKAKE +PIKAKES +PIKAS +PIKE +PIKED +PIKEMAN +PIKEMEN +PIKEPERCH +PIKEPERCHES +PIKER +PIKERS +PIKES +PIKESTAFF +PIKESTAFFS +PIKESTAVES +PIKI +PIKING +PIKIS +PILAF +PILAFF +PILAFFS +PILAFS +PILAR +PILASTER +PILASTERS +PILAU +PILAUS +PILAW +PILAWS +PILCHARD +PILCHARDS +PILE +PILEA +PILEATE +PILEATED +PILED +PILEI +PILELESS +PILEOUS +PILES +PILEUM +PILEUP +PILEUPS +PILEUS +PILEWORT +PILEWORTS +PILFER +PILFERABLE +PILFERAGE +PILFERAGES +PILFERED +PILFERER +PILFERERS +PILFERING +PILFERPROOF +PILFERS +PILGARLIC +PILGARLICS +PILGRIM +PILGRIMAGE +PILGRIMAGED +PILGRIMAGES +PILGRIMAGING +PILGRIMS +PILI +PILIFORM +PILING +PILINGS +PILIS +PILL +PILLAGE +PILLAGED +PILLAGER +PILLAGERS +PILLAGES +PILLAGING +PILLAR +PILLARED +PILLARING +PILLARLESS +PILLARS +PILLBOX +PILLBOXES +PILLED +PILLING +PILLION +PILLIONS +PILLORIED +PILLORIES +PILLORY +PILLORYING +PILLOW +PILLOWCASE +PILLOWCASES +PILLOWED +PILLOWING +PILLOWS +PILLOWY +PILLS +PILOCARPINE +PILOCARPINES +PILONIDAL +PILOSE +PILOSITIES +PILOSITY +PILOT +PILOTAGE +PILOTAGES +PILOTED +PILOTFISH +PILOTFISHES +PILOTHOUSE +PILOTHOUSES +PILOTING +PILOTINGS +PILOTLESS +PILOTS +PILOUS +PILSENER +PILSENERS +PILSNER +PILSNERS +PILULAR +PILULE +PILULES +PILUS +PILY +PIMA +PIMAS +PIMENTO +PIMENTOS +PIMIENTO +PIMIENTOS +PIMP +PIMPED +PIMPERNEL +PIMPERNELS +PIMPING +PIMPLE +PIMPLED +PIMPLES +PIMPLIER +PIMPLIEST +PIMPLY +PIMPMOBILE +PIMPMOBILES +PIMPS +PIN +PINA +PINACEOUS +PINAFORE +PINAFORED +PINAFORES +PINANG +PINANGS +PINAS +PINASTER +PINASTERS +PINATA +PINATAS +PINBALL +PINBALLED +PINBALLING +PINBALLS +PINBONE +PINBONES +PINCER +PINCERLIKE +PINCERS +PINCH +PINCHBECK +PINCHBECKS +PINCHBUG +PINCHBUGS +PINCHCOCK +PINCHCOCKS +PINCHECK +PINCHECKS +PINCHED +PINCHER +PINCHERS +PINCHES +PINCHING +PINCHPENNY +PINCUSHION +PINCUSHIONS +PINDER +PINDERS +PINDLING +PINE +PINEAL +PINEALECTOMIES +PINEALECTOMIZE +PINEALECTOMIZED +PINEALECTOMIZES +PINEALECTOMY +PINEALS +PINEAPPLE +PINEAPPLES +PINECONE +PINECONES +PINED +PINEDROPS +PINELAND +PINELANDS +PINELIKE +PINENE +PINENES +PINERIES +PINERY +PINES +PINESAP +PINESAPS +PINETA +PINETUM +PINEWOOD +PINEWOODS +PINEY +PINFEATHER +PINFEATHERS +PINFISH +PINFISHES +PINFOLD +PINFOLDED +PINFOLDING +PINFOLDS +PING +PINGED +PINGER +PINGERS +PINGING +PINGO +PINGOES +PINGOS +PINGRASS +PINGRASSES +PINGS +PINGUID +PINHEAD +PINHEADED +PINHEADEDNESS +PINHEADEDNESSES +PINHEADS +PINHOLE +PINHOLES +PINIER +PINIEST +PINING +PINION +PINIONED +PINIONING +PINIONS +PINITE +PINITES +PINITOL +PINITOLS +PINK +PINKED +PINKEN +PINKENED +PINKENING +PINKENS +PINKER +PINKERS +PINKEST +PINKEY +PINKEYE +PINKEYES +PINKEYS +PINKIE +PINKIES +PINKING +PINKINGS +PINKISH +PINKISHNESS +PINKISHNESSES +PINKLY +PINKNESS +PINKNESSES +PINKO +PINKOES +PINKOS +PINKROOT +PINKROOTS +PINKS +PINKY +PINNA +PINNACE +PINNACES +PINNACLE +PINNACLED +PINNACLES +PINNACLING +PINNAE +PINNAL +PINNAS +PINNATE +PINNATED +PINNATELY +PINNATIFID +PINNATION +PINNATIONS +PINNED +PINNER +PINNERS +PINNIES +PINNING +PINNIPED +PINNIPEDS +PINNULA +PINNULAE +PINNULAR +PINNULATE +PINNULE +PINNULES +PINNY +PINOCHLE +PINOCHLES +PINOCLE +PINOCLES +PINOCYTIC +PINOCYTOSES +PINOCYTOSIS +PINOCYTOTIC +PINOCYTOTICALLY +PINOLE +PINOLES +PINON +PINONES +PINONS +PINOT +PINOTS +PINPOINT +PINPOINTED +PINPOINTING +PINPOINTS +PINPRICK +PINPRICKED +PINPRICKING +PINPRICKS +PINS +PINSCHER +PINSCHERS +PINSETTER +PINSETTERS +PINSPOTTER +PINSPOTTERS +PINSTRIPE +PINSTRIPES +PINT +PINTA +PINTADA +PINTADAS +PINTADO +PINTADOES +PINTADOS +PINTAIL +PINTAILED +PINTAILS +PINTANO +PINTANOS +PINTAS +PINTLE +PINTLES +PINTO +PINTOES +PINTOS +PINTS +PINTSIZE +PINTSIZED +PINUP +PINUPS +PINWALE +PINWALES +PINWEED +PINWEEDS +PINWHEEL +PINWHEELED +PINWHEELING +PINWHEELS +PINWORK +PINWORKS +PINWORM +PINWORMS +PINWRENCH +PINWRENCHES +PINY +PINYIN +PINYON +PINYONS +PIOLET +PIOLETS +PION +PIONEER +PIONEERED +PIONEERING +PIONEERS +PIONIC +PIONS +PIOSITIES +PIOSITY +PIOUS +PIOUSLY +PIOUSNESS +PIOUSNESSES +PIP +PIPAGE +PIPAGES +PIPAL +PIPALS +PIPE +PIPEAGE +PIPEAGES +PIPED +PIPEFISH +PIPEFISHES +PIPEFUL +PIPEFULS +PIPELESS +PIPELIKE +PIPELINE +PIPELINED +PIPELINES +PIPELINING +PIPER +PIPERAZINE +PIPERAZINES +PIPERIDINE +PIPERIDINES +PIPERINE +PIPERINES +PIPERONAL +PIPERONALS +PIPERS +PIPES +PIPESTEM +PIPESTEMS +PIPESTONE +PIPESTONES +PIPET +PIPETS +PIPETTE +PIPETTED +PIPETTES +PIPETTING +PIPIER +PIPIEST +PIPINESS +PIPINESSES +PIPING +PIPINGLY +PIPINGS +PIPISTREL +PIPISTRELS +PIPIT +PIPITS +PIPKIN +PIPKINS +PIPPED +PIPPIN +PIPPING +PIPPINS +PIPS +PIPSISSEWA +PIPSISSEWAS +PIPSQUEAK +PIPSQUEAKS +PIPY +PIQUANCE +PIQUANCES +PIQUANCIES +PIQUANCY +PIQUANT +PIQUANTLY +PIQUANTNESS +PIQUANTNESSES +PIQUE +PIQUED +PIQUES +PIQUET +PIQUETS +PIQUING +PIRACETAM +PIRACETAMS +PIRACIES +PIRACY +PIRAGUA +PIRAGUAS +PIRANA +PIRANAS +PIRANHA +PIRANHAS +PIRARUCU +PIRARUCUS +PIRATE +PIRATED +PIRATES +PIRATIC +PIRATICAL +PIRATICALLY +PIRATING +PIRAYA +PIRAYAS +PIRIFORM +PIRN +PIRNS +PIROG +PIROGEN +PIROGHI +PIROGI +PIROGIES +PIROGUE +PIROGUES +PIROJKI +PIROPLASM +PIROPLASMA +PIROPLASMATA +PIROPLASMS +PIROQUE +PIROQUES +PIROSHKI +PIROUETTE +PIROUETTED +PIROUETTES +PIROUETTING +PIROZHKI +PIROZHOK +PIS +PISCARIES +PISCARY +PISCATOR +PISCATORIAL +PISCATORS +PISCATORY +PISCICULTURE +PISCICULTURES +PISCIFORM +PISCINA +PISCINAE +PISCINAL +PISCINAS +PISCINE +PISCIVORE +PISCIVORES +PISCIVOROUS +PISCO +PISCOS +PISH +PISHED +PISHER +PISHERS +PISHES +PISHING +PISHOGE +PISHOGES +PISHOGUE +PISHOGUES +PISIFORM +PISIFORMS +PISMIRE +PISMIRES +PISO +PISOLITE +PISOLITES +PISOLITH +PISOLITHS +PISOLITIC +PISOS +PISS +PISSANT +PISSANTS +PISSED +PISSER +PISSERS +PISSES +PISSING +PISSOIR +PISSOIRS +PISTACHE +PISTACHES +PISTACHIO +PISTACHIOS +PISTAREEN +PISTAREENS +PISTE +PISTES +PISTIL +PISTILLATE +PISTILS +PISTOL +PISTOLE +PISTOLED +PISTOLEER +PISTOLEERS +PISTOLERO +PISTOLEROS +PISTOLES +PISTOLIER +PISTOLIERS +PISTOLING +PISTOLLED +PISTOLLING +PISTOLS +PISTON +PISTONS +PISTOU +PISTOUS +PIT +PITA +PITAHAYA +PITAHAYAS +PITAPAT +PITAPATS +PITAPATTED +PITAPATTING +PITAS +PITAYA +PITAYAS +PITCH +PITCHBLENDE +PITCHBLENDES +PITCHED +PITCHER +PITCHERFUL +PITCHERFULS +PITCHERS +PITCHERSFUL +PITCHES +PITCHFORK +PITCHFORKED +PITCHFORKING +PITCHFORKS +PITCHIER +PITCHIEST +PITCHILY +PITCHING +PITCHMAN +PITCHMEN +PITCHOUT +PITCHOUTS +PITCHPOLE +PITCHPOLED +PITCHPOLES +PITCHPOLING +PITCHWOMAN +PITCHWOMEN +PITCHY +PITEOUS +PITEOUSLY +PITEOUSNESS +PITEOUSNESSES +PITFALL +PITFALLS +PITH +PITHEAD +PITHEADS +PITHECANTHROPI +PITHECANTHROPUS +PITHECOID +PITHED +PITHIER +PITHIEST +PITHILY +PITHINESS +PITHINESSES +PITHING +PITHLESS +PITHS +PITHY +PITIABLE +PITIABLENESS +PITIABLENESSES +PITIABLY +PITIED +PITIER +PITIERS +PITIES +PITIFUL +PITIFULLER +PITIFULLEST +PITIFULLY +PITIFULNESS +PITIFULNESSES +PITILESS +PITILESSLY +PITILESSNESS +PITILESSNESSES +PITMAN +PITMANS +PITMEN +PITON +PITONS +PITS +PITSAW +PITSAWS +PITTA +PITTANCE +PITTANCES +PITTAS +PITTED +PITTING +PITTINGS +PITTOSPORUM +PITTOSPORUMS +PITUITARIES +PITUITARY +PITY +PITYING +PITYINGLY +PITYRIASES +PITYRIASIS +PIU +PIVOT +PIVOTABLE +PIVOTAL +PIVOTALLY +PIVOTED +PIVOTING +PIVOTMAN +PIVOTMEN +PIVOTS +PIX +PIXEL +PIXELS +PIXES +PIXIE +PIXIEISH +PIXIES +PIXILATED +PIXILATION +PIXILATIONS +PIXILLATED +PIXINESS +PIXINESSES +PIXY +PIXYISH +PIZAZZ +PIZAZZES +PIZAZZY +PIZZA +PIZZALIKE +PIZZAS +PIZZAZ +PIZZAZES +PIZZAZZ +PIZZAZZES +PIZZAZZY +PIZZELLE +PIZZELLES +PIZZERIA +PIZZERIAS +PIZZICATI +PIZZICATO +PIZZLE +PIZZLES +PLACABILITIES +PLACABILITY +PLACABLE +PLACABLY +PLACARD +PLACARDED +PLACARDING +PLACARDS +PLACATE +PLACATED +PLACATER +PLACATERS +PLACATES +PLACATING +PLACATINGLY +PLACATION +PLACATIONS +PLACATIVE +PLACATORY +PLACE +PLACEABLE +PLACEBO +PLACEBOES +PLACEBOS +PLACED +PLACEHOLDER +PLACEHOLDERS +PLACEKICK +PLACEKICKED +PLACEKICKER +PLACEKICKERS +PLACEKICKING +PLACEKICKS +PLACELESS +PLACELESSLY +PLACEMAN +PLACEMEN +PLACEMENT +PLACEMENTS +PLACENTA +PLACENTAE +PLACENTAL +PLACENTALS +PLACENTAS +PLACENTATION +PLACENTATIONS +PLACER +PLACERS +PLACES +PLACET +PLACETS +PLACID +PLACIDITIES +PLACIDITY +PLACIDLY +PLACIDNESS +PLACIDNESSES +PLACING +PLACK +PLACKET +PLACKETS +PLACKS +PLACODERM +PLACODERMS +PLACOID +PLACOIDS +PLAFOND +PLAFONDS +PLAGAL +PLAGE +PLAGES +PLAGIARIES +PLAGIARISE +PLAGIARISED +PLAGIARISES +PLAGIARISING +PLAGIARISM +PLAGIARISMS +PLAGIARIST +PLAGIARISTIC +PLAGIARISTS +PLAGIARIZE +PLAGIARIZED +PLAGIARIZER +PLAGIARIZERS +PLAGIARIZES +PLAGIARIZING +PLAGIARY +PLAGIOCLASE +PLAGIOCLASES +PLAGIOTROPIC +PLAGUE +PLAGUED +PLAGUER +PLAGUERS +PLAGUES +PLAGUEY +PLAGUILY +PLAGUING +PLAGUY +PLAICE +PLAICES +PLAID +PLAIDED +PLAIDS +PLAIN +PLAINCHANT +PLAINCHANTS +PLAINCLOTHES +PLAINCLOTHESMAN +PLAINCLOTHESMEN +PLAINED +PLAINER +PLAINEST +PLAINING +PLAINLY +PLAINNESS +PLAINNESSES +PLAINS +PLAINSMAN +PLAINSMEN +PLAINSONG +PLAINSONGS +PLAINSPOKEN +PLAINSPOKENNESS +PLAINT +PLAINTEXT +PLAINTEXTS +PLAINTFUL +PLAINTIFF +PLAINTIFFS +PLAINTIVE +PLAINTIVELY +PLAINTIVENESS +PLAINTIVENESSES +PLAINTS +PLAISTER +PLAISTERED +PLAISTERING +PLAISTERS +PLAIT +PLAITED +PLAITER +PLAITERS +PLAITING +PLAITINGS +PLAITS +PLAN +PLANAR +PLANARIA +PLANARIAN +PLANARIANS +PLANARIAS +PLANARITIES +PLANARITY +PLANATE +PLANATION +PLANATIONS +PLANCH +PLANCHE +PLANCHES +PLANCHET +PLANCHETS +PLANCHETTE +PLANCHETTES +PLANE +PLANED +PLANELOAD +PLANELOADS +PLANENESS +PLANENESSES +PLANER +PLANERS +PLANES +PLANESIDE +PLANESIDES +PLANET +PLANETARIA +PLANETARIES +PLANETARIUM +PLANETARIUMS +PLANETARY +PLANETESIMAL +PLANETESIMALS +PLANETLIKE +PLANETOID +PLANETOIDAL +PLANETOIDS +PLANETOLOGICAL +PLANETOLOGIES +PLANETOLOGIST +PLANETOLOGISTS +PLANETOLOGY +PLANETS +PLANETWIDE +PLANFORM +PLANFORMS +PLANGENCIES +PLANGENCY +PLANGENT +PLANGENTLY +PLANIMETER +PLANIMETERS +PLANIMETRIC +PLANIMETRICALLY +PLANING +PLANISH +PLANISHED +PLANISHER +PLANISHERS +PLANISHES +PLANISHING +PLANISPHERE +PLANISPHERES +PLANISPHERIC +PLANK +PLANKED +PLANKING +PLANKINGS +PLANKS +PLANKTER +PLANKTERS +PLANKTON +PLANKTONIC +PLANKTONS +PLANLESS +PLANLESSLY +PLANLESSNESS +PLANLESSNESSES +PLANNED +PLANNER +PLANNERS +PLANNING +PLANNINGS +PLANOGRAPHIC +PLANOGRAPHIES +PLANOGRAPHY +PLANOSOL +PLANOSOLS +PLANS +PLANT +PLANTABLE +PLANTAIN +PLANTAINS +PLANTAR +PLANTATION +PLANTATIONS +PLANTED +PLANTER +PLANTERS +PLANTIGRADE +PLANTIGRADES +PLANTING +PLANTINGS +PLANTLET +PLANTLETS +PLANTLIKE +PLANTOCRACIES +PLANTOCRACY +PLANTS +PLANTSMAN +PLANTSMEN +PLANULA +PLANULAE +PLANULAR +PLANULATE +PLANULOID +PLAQUE +PLAQUES +PLASH +PLASHED +PLASHER +PLASHERS +PLASHES +PLASHIER +PLASHIEST +PLASHING +PLASHY +PLASM +PLASMA +PLASMAGEL +PLASMAGELS +PLASMAGENE +PLASMAGENES +PLASMALEMMA +PLASMALEMMAS +PLASMAPHERESES +PLASMAPHERESIS +PLASMAS +PLASMASOL +PLASMASOLS +PLASMATIC +PLASMIC +PLASMID +PLASMIDS +PLASMIN +PLASMINOGEN +PLASMINOGENS +PLASMINS +PLASMODESM +PLASMODESMA +PLASMODESMAS +PLASMODESMATA +PLASMODIA +PLASMODIUM +PLASMOGAMIES +PLASMOGAMY +PLASMOID +PLASMOIDS +PLASMOLYSES +PLASMOLYSIS +PLASMOLYTIC +PLASMOLYZE +PLASMOLYZED +PLASMOLYZES +PLASMOLYZING +PLASMON +PLASMONS +PLASMS +PLASTER +PLASTERBOARD +PLASTERBOARDS +PLASTERED +PLASTERER +PLASTERERS +PLASTERING +PLASTERINGS +PLASTERS +PLASTERWORK +PLASTERWORKS +PLASTERY +PLASTIC +PLASTICALLY +PLASTICENE +PLASTICENES +PLASTICINE +PLASTICINES +PLASTICITIES +PLASTICITY +PLASTICIZATION +PLASTICIZATIONS +PLASTICIZE +PLASTICIZED +PLASTICIZER +PLASTICIZERS +PLASTICIZES +PLASTICIZING +PLASTICKY +PLASTICLY +PLASTICS +PLASTID +PLASTIDIAL +PLASTIDS +PLASTIQUE +PLASTIQUES +PLASTISOL +PLASTISOLS +PLASTOCYANIN +PLASTOCYANINS +PLASTOQUINONE +PLASTOQUINONES +PLASTRAL +PLASTRON +PLASTRONS +PLASTRUM +PLASTRUMS +PLAT +PLATAN +PLATANE +PLATANES +PLATANS +PLATE +PLATEAU +PLATEAUED +PLATEAUING +PLATEAUS +PLATEAUX +PLATED +PLATEFUL +PLATEFULS +PLATEGLASS +PLATELET +PLATELETS +PLATELIKE +PLATEMAKER +PLATEMAKERS +PLATEMAKING +PLATEMAKINGS +PLATEN +PLATENS +PLATER +PLATERESQUE +PLATERS +PLATES +PLATESFUL +PLATFORM +PLATFORMS +PLATIER +PLATIES +PLATIEST +PLATINA +PLATINAS +PLATING +PLATINGS +PLATINIC +PLATINIZE +PLATINIZED +PLATINIZES +PLATINIZING +PLATINOCYANIDE +PLATINOCYANIDES +PLATINOID +PLATINOIDS +PLATINOUS +PLATINUM +PLATINUMS +PLATITUDE +PLATITUDES +PLATITUDINAL +PLATITUDINARIAN +PLATITUDINIZE +PLATITUDINIZED +PLATITUDINIZES +PLATITUDINIZING +PLATITUDINOUS +PLATITUDINOUSLY +PLATONIC +PLATONICALLY +PLATONISM +PLATONISMS +PLATOON +PLATOONED +PLATOONING +PLATOONS +PLATS +PLATTED +PLATTER +PLATTERFUL +PLATTERFULS +PLATTERS +PLATTERSFUL +PLATTING +PLATY +PLATYFISH +PLATYFISHES +PLATYHELMINTH +PLATYHELMINTHIC +PLATYHELMINTHS +PLATYPI +PLATYPUS +PLATYPUSES +PLATYRRHINE +PLATYRRHINES +PLATYS +PLAUDIT +PLAUDITS +PLAUSIBILITIES +PLAUSIBILITY +PLAUSIBLE +PLAUSIBLENESS +PLAUSIBLENESSES +PLAUSIBLY +PLAUSIVE +PLAY +PLAYA +PLAYABILITIES +PLAYABILITY +PLAYABLE +PLAYACT +PLAYACTED +PLAYACTING +PLAYACTINGS +PLAYACTOR +PLAYACTORS +PLAYACTS +PLAYAS +PLAYBACK +PLAYBACKS +PLAYBILL +PLAYBILLS +PLAYBOOK +PLAYBOOKS +PLAYBOY +PLAYBOYS +PLAYDATE +PLAYDATES +PLAYDAY +PLAYDAYS +PLAYDOWN +PLAYDOWNS +PLAYED +PLAYER +PLAYERS +PLAYFELLOW +PLAYFELLOWS +PLAYFIELD +PLAYFIELDS +PLAYFUL +PLAYFULLY +PLAYFULNESS +PLAYFULNESSES +PLAYGIRL +PLAYGIRLS +PLAYGOER +PLAYGOERS +PLAYGOING +PLAYGOINGS +PLAYGROUND +PLAYGROUNDS +PLAYGROUP +PLAYGROUPS +PLAYHOUSE +PLAYHOUSES +PLAYING +PLAYLAND +PLAYLANDS +PLAYLESS +PLAYLET +PLAYLETS +PLAYLIKE +PLAYLIST +PLAYLISTS +PLAYMAKER +PLAYMAKERS +PLAYMAKING +PLAYMAKINGS +PLAYMATE +PLAYMATES +PLAYOFF +PLAYOFFS +PLAYPEN +PLAYPENS +PLAYROOM +PLAYROOMS +PLAYS +PLAYSUIT +PLAYSUITS +PLAYTHING +PLAYTHINGS +PLAYTIME +PLAYTIMES +PLAYWEAR +PLAYWRIGHT +PLAYWRIGHTING +PLAYWRIGHTINGS +PLAYWRIGHTS +PLAYWRITING +PLAYWRITINGS +PLAZA +PLAZAS +PLEA +PLEACH +PLEACHED +PLEACHES +PLEACHING +PLEAD +PLEADABLE +PLEADED +PLEADER +PLEADERS +PLEADING +PLEADINGLY +PLEADINGS +PLEADS +PLEAS +PLEASANCE +PLEASANCES +PLEASANT +PLEASANTER +PLEASANTEST +PLEASANTLY +PLEASANTNESS +PLEASANTNESSES +PLEASANTRIES +PLEASANTRY +PLEASE +PLEASED +PLEASER +PLEASERS +PLEASES +PLEASING +PLEASINGLY +PLEASINGNESS +PLEASINGNESSES +PLEASURABILITY +PLEASURABLE +PLEASURABLENESS +PLEASURABLY +PLEASURE +PLEASURED +PLEASURELESS +PLEASURES +PLEASURING +PLEAT +PLEATED +PLEATER +PLEATERS +PLEATHER +PLEATHERS +PLEATING +PLEATLESS +PLEATS +PLEB +PLEBE +PLEBEIAN +PLEBEIANISM +PLEBEIANISMS +PLEBEIANLY +PLEBEIANS +PLEBES +PLEBISCITARY +PLEBISCITE +PLEBISCITES +PLEBS +PLECOPTERAN +PLECOPTERANS +PLECTRA +PLECTRON +PLECTRONS +PLECTRUM +PLECTRUMS +PLED +PLEDGE +PLEDGED +PLEDGEE +PLEDGEES +PLEDGEOR +PLEDGEORS +PLEDGER +PLEDGERS +PLEDGES +PLEDGET +PLEDGETS +PLEDGING +PLEDGOR +PLEDGORS +PLEIAD +PLEIADES +PLEIADS +PLEINAIRISM +PLEINAIRISMS +PLEINAIRIST +PLEINAIRISTS +PLEIOCENE +PLEIOTAXIES +PLEIOTAXY +PLEIOTROPIC +PLEIOTROPIES +PLEIOTROPY +PLENA +PLENARIES +PLENARILY +PLENARY +PLENCH +PLENCHES +PLENIPOTENT +PLENIPOTENTIARY +PLENISH +PLENISHED +PLENISHES +PLENISHING +PLENISM +PLENISMS +PLENIST +PLENISTS +PLENITUDE +PLENITUDES +PLENITUDINOUS +PLENTEOUS +PLENTEOUSLY +PLENTEOUSNESS +PLENTEOUSNESSES +PLENTIES +PLENTIFUL +PLENTIFULLY +PLENTIFULNESS +PLENTIFULNESSES +PLENTITUDE +PLENTITUDES +PLENTY +PLENUM +PLENUMS +PLEOCHROIC +PLEOCHROISM +PLEOCHROISMS +PLEOMORPHIC +PLEOMORPHISM +PLEOMORPHISMS +PLEON +PLEONAL +PLEONASM +PLEONASMS +PLEONASTIC +PLEONASTICALLY +PLEONIC +PLEONS +PLEOPOD +PLEOPODS +PLEROCERCOID +PLEROCERCOIDS +PLESIOSAUR +PLESIOSAURS +PLESSOR +PLESSORS +PLETHORA +PLETHORAS +PLETHORIC +PLETHYSMOGRAM +PLETHYSMOGRAMS +PLETHYSMOGRAPH +PLETHYSMOGRAPHS +PLETHYSMOGRAPHY +PLEURA +PLEURAE +PLEURAL +PLEURAS +PLEURISIES +PLEURISY +PLEURITIC +PLEURON +PLEUROPNEUMONIA +PLEUSTON +PLEUSTONIC +PLEUSTONS +PLEW +PLEWS +PLEX +PLEXAL +PLEXES +PLEXIFORM +PLEXOR +PLEXORS +PLEXUS +PLEXUSES +PLIABILITIES +PLIABILITY +PLIABLE +PLIABLENESS +PLIABLENESSES +PLIABLY +PLIANCIES +PLIANCY +PLIANT +PLIANTLY +PLIANTNESS +PLIANTNESSES +PLICA +PLICAE +PLICAL +PLICATE +PLICATED +PLICATELY +PLICATION +PLICATIONS +PLICATURE +PLICATURES +PLIE +PLIED +PLIER +PLIERS +PLIES +PLIGHT +PLIGHTED +PLIGHTER +PLIGHTERS +PLIGHTING +PLIGHTS +PLIMSOL +PLIMSOLE +PLIMSOLES +PLIMSOLL +PLIMSOLLS +PLIMSOLS +PLINK +PLINKED +PLINKER +PLINKERS +PLINKING +PLINKS +PLINTH +PLINTHS +PLIOCENE +PLIOFILM +PLIOFILMS +PLIOTRON +PLIOTRONS +PLISKIE +PLISKIES +PLISKY +PLISSE +PLISSES +PLOD +PLODDED +PLODDER +PLODDERS +PLODDING +PLODDINGLY +PLODS +PLOIDIES +PLOIDY +PLONK +PLONKED +PLONKING +PLONKS +PLOP +PLOPPED +PLOPPING +PLOPS +PLOSION +PLOSIONS +PLOSIVE +PLOSIVES +PLOT +PLOTLESS +PLOTLESSNESS +PLOTLESSNESSES +PLOTLINE +PLOTLINES +PLOTS +PLOTTAGE +PLOTTAGES +PLOTTED +PLOTTER +PLOTTERS +PLOTTIER +PLOTTIES +PLOTTIEST +PLOTTING +PLOTTY +PLOTZ +PLOTZED +PLOTZES +PLOTZING +PLOUGH +PLOUGHED +PLOUGHER +PLOUGHERS +PLOUGHING +PLOUGHS +PLOVER +PLOVERS +PLOW +PLOWABLE +PLOWBACK +PLOWBACKS +PLOWBOY +PLOWBOYS +PLOWED +PLOWER +PLOWERS +PLOWHEAD +PLOWHEADS +PLOWING +PLOWLAND +PLOWLANDS +PLOWMAN +PLOWMEN +PLOWS +PLOWSHARE +PLOWSHARES +PLOY +PLOYED +PLOYING +PLOYS +PLUCK +PLUCKED +PLUCKER +PLUCKERS +PLUCKIER +PLUCKIEST +PLUCKILY +PLUCKINESS +PLUCKINESSES +PLUCKING +PLUCKS +PLUCKY +PLUG +PLUGGED +PLUGGER +PLUGGERS +PLUGGING +PLUGLESS +PLUGOLA +PLUGOLAS +PLUGS +PLUGUGLIES +PLUGUGLY +PLUM +PLUMAGE +PLUMAGED +PLUMAGES +PLUMATE +PLUMB +PLUMBABLE +PLUMBAGO +PLUMBAGOS +PLUMBED +PLUMBEOUS +PLUMBER +PLUMBERIES +PLUMBERS +PLUMBERY +PLUMBIC +PLUMBING +PLUMBINGS +PLUMBISM +PLUMBISMS +PLUMBNESS +PLUMBNESSES +PLUMBOUS +PLUMBS +PLUMBUM +PLUMBUMS +PLUME +PLUMED +PLUMELET +PLUMELETS +PLUMERIA +PLUMERIAS +PLUMES +PLUMIER +PLUMIEST +PLUMING +PLUMIPED +PLUMIPEDS +PLUMLIKE +PLUMMER +PLUMMEST +PLUMMET +PLUMMETED +PLUMMETING +PLUMMETS +PLUMMIER +PLUMMIEST +PLUMMY +PLUMOSE +PLUMOSELY +PLUMOSITIES +PLUMOSITY +PLUMP +PLUMPED +PLUMPEN +PLUMPENED +PLUMPENING +PLUMPENS +PLUMPER +PLUMPERS +PLUMPEST +PLUMPING +PLUMPISH +PLUMPLY +PLUMPNESS +PLUMPNESSES +PLUMPS +PLUMS +PLUMULAR +PLUMULE +PLUMULES +PLUMULOSE +PLUMY +PLUNDER +PLUNDERED +PLUNDERER +PLUNDERERS +PLUNDERING +PLUNDEROUS +PLUNDERS +PLUNGE +PLUNGED +PLUNGER +PLUNGERS +PLUNGES +PLUNGING +PLUNK +PLUNKED +PLUNKER +PLUNKERS +PLUNKIER +PLUNKIEST +PLUNKING +PLUNKS +PLUNKY +PLUPERFECT +PLUPERFECTS +PLURAL +PLURALISM +PLURALISMS +PLURALIST +PLURALISTIC +PLURALISTICALLY +PLURALISTS +PLURALITIES +PLURALITY +PLURALIZATION +PLURALIZATIONS +PLURALIZE +PLURALIZED +PLURALIZES +PLURALIZING +PLURALLY +PLURALS +PLURIPOTENT +PLUS +PLUSES +PLUSH +PLUSHER +PLUSHES +PLUSHEST +PLUSHIER +PLUSHIEST +PLUSHILY +PLUSHINESS +PLUSHINESSES +PLUSHLY +PLUSHNESS +PLUSHNESSES +PLUSHY +PLUSSAGE +PLUSSAGES +PLUSSES +PLUTEI +PLUTEUS +PLUTOCRACIES +PLUTOCRACY +PLUTOCRAT +PLUTOCRATIC +PLUTOCRATICALLY +PLUTOCRATS +PLUTON +PLUTONIAN +PLUTONIC +PLUTONISM +PLUTONISMS +PLUTONIUM +PLUTONIUMS +PLUTONS +PLUVIAL +PLUVIALS +PLUVIAN +PLUVIOSE +PLUVIOUS +PLY +PLYER +PLYERS +PLYING +PLYINGLY +PLYOMETRIC +PLYOMETRICS +PLYWOOD +PLYWOODS +PNEUMA +PNEUMAS +PNEUMATIC +PNEUMATICALLY +PNEUMATICITIES +PNEUMATICITY +PNEUMATICS +PNEUMATOLOGIES +PNEUMATOLOGY +PNEUMATOLYTIC +PNEUMATOPHORE +PNEUMATOPHORES +PNEUMOCOCCAL +PNEUMOCOCCI +PNEUMOCOCCUS +PNEUMOCONIOSES +PNEUMOCONIOSIS +PNEUMOGRAPH +PNEUMOGRAPHS +PNEUMONECTOMIES +PNEUMONECTOMY +PNEUMONIA +PNEUMONIAS +PNEUMONIC +PNEUMONITIS +PNEUMONITISES +PNEUMOTHORACES +PNEUMOTHORAX +PNEUMOTHORAXES +POACEOUS +POACH +POACHABLE +POACHED +POACHER +POACHERS +POACHES +POACHIER +POACHIEST +POACHING +POACHY +POBLANO +POBLANOS +POBOY +POBOYS +POCHARD +POCHARDS +POCK +POCKED +POCKET +POCKETABLE +POCKETBOOK +POCKETBOOKS +POCKETED +POCKETER +POCKETERS +POCKETFUL +POCKETFULS +POCKETING +POCKETKNIFE +POCKETKNIVES +POCKETS +POCKETSFUL +POCKIER +POCKIEST +POCKILY +POCKING +POCKMARK +POCKMARKED +POCKMARKING +POCKMARKS +POCKS +POCKY +POCO +POCOCURANTE +POCOCURANTISM +POCOCURANTISMS +POCOSEN +POCOSENS +POCOSIN +POCOSINS +POCOSON +POCOSONS +POD +PODAGRA +PODAGRAL +PODAGRAS +PODAGRIC +PODAGROUS +PODDED +PODDING +PODESTA +PODESTAS +PODGIER +PODGIEST +PODGILY +PODGY +PODIA +PODIATRIC +PODIATRIES +PODIATRIST +PODIATRISTS +PODIATRY +PODITE +PODITES +PODITIC +PODIUM +PODIUMS +PODLIKE +PODOCARP +PODOMERE +PODOMERES +PODOPHYLLI +PODOPHYLLIN +PODOPHYLLINS +PODOPHYLLUM +PODOPHYLLUMS +PODS +PODSOL +PODSOLIC +PODSOLIZATION +PODSOLIZATIONS +PODSOLS +PODZOL +PODZOLIC +PODZOLIZATION +PODZOLIZATIONS +PODZOLIZE +PODZOLIZED +PODZOLIZES +PODZOLIZING +PODZOLS +POECHORE +POECHORES +POEM +POEMS +POENOLOGIES +POENOLOGY +POESIES +POESY +POET +POETASTER +POETASTERS +POETESS +POETESSES +POETIC +POETICAL +POETICALLY +POETICALNESS +POETICALNESSES +POETICISM +POETICISMS +POETICIZE +POETICIZED +POETICIZES +POETICIZING +POETICS +POETISE +POETISED +POETISER +POETISERS +POETISES +POETISING +POETIZE +POETIZED +POETIZER +POETIZERS +POETIZES +POETIZING +POETLESS +POETLIKE +POETRIES +POETRY +POETS +POGEY +POGEYS +POGIES +POGONIA +POGONIAS +POGONIP +POGONIPS +POGONOPHORAN +POGONOPHORANS +POGROM +POGROMED +POGROMING +POGROMIST +POGROMISTS +POGROMS +POGY +POH +POI +POIGNANCE +POIGNANCES +POIGNANCIES +POIGNANCY +POIGNANT +POIGNANTLY +POIKILOTHERM +POIKILOTHERMIC +POIKILOTHERMS +POILU +POILUS +POINCIANA +POINCIANAS +POIND +POINDED +POINDING +POINDS +POINSETTIA +POINSETTIAS +POINT +POINTABLE +POINTE +POINTED +POINTEDLY +POINTEDNESS +POINTEDNESSES +POINTELLE +POINTELLES +POINTER +POINTERS +POINTES +POINTIER +POINTIEST +POINTILLISM +POINTILLISMS +POINTILLIST +POINTILLISTIC +POINTILLISTS +POINTING +POINTLESS +POINTLESSLY +POINTLESSNESS +POINTLESSNESSES +POINTMAN +POINTMEN +POINTS +POINTY +POIS +POISE +POISED +POISER +POISERS +POISES +POISHA +POISING +POISON +POISONED +POISONER +POISONERS +POISONING +POISONOUS +POISONOUSLY +POISONS +POISONWOOD +POISONWOODS +POITREL +POITRELS +POKABLE +POKE +POKEBERRIES +POKEBERRY +POKED +POKER +POKEROOT +POKEROOTS +POKERS +POKES +POKEWEED +POKEWEEDS +POKEY +POKEYS +POKIER +POKIES +POKIEST +POKILY +POKINESS +POKINESSES +POKING +POKY +POL +POLAR +POLARIMETER +POLARIMETERS +POLARIMETRIC +POLARIMETRIES +POLARIMETRY +POLARISCOPE +POLARISCOPES +POLARISCOPIC +POLARISE +POLARISED +POLARISES +POLARISING +POLARITIES +POLARITY +POLARIZABILITY +POLARIZABLE +POLARIZATION +POLARIZATIONS +POLARIZE +POLARIZED +POLARIZER +POLARIZERS +POLARIZES +POLARIZING +POLAROGRAPHIC +POLAROGRAPHIES +POLAROGRAPHY +POLARON +POLARONS +POLARS +POLDER +POLDERS +POLE +POLEAX +POLEAXE +POLEAXED +POLEAXES +POLEAXING +POLECAT +POLECATS +POLED +POLEIS +POLELESS +POLEMIC +POLEMICAL +POLEMICALLY +POLEMICIST +POLEMICISTS +POLEMICIZE +POLEMICIZED +POLEMICIZES +POLEMICIZING +POLEMICS +POLEMIST +POLEMISTS +POLEMIZE +POLEMIZED +POLEMIZES +POLEMIZING +POLEMONIUM +POLEMONIUMS +POLENTA +POLENTAS +POLER +POLERS +POLES +POLESTAR +POLESTARS +POLEWARD +POLEYN +POLEYNS +POLICE +POLICED +POLICEMAN +POLICEMEN +POLICER +POLICERS +POLICES +POLICEWOMAN +POLICEWOMEN +POLICIES +POLICING +POLICY +POLICYHOLDER +POLICYHOLDERS +POLIES +POLING +POLIO +POLIOMYELITIDES +POLIOMYELITIS +POLIOS +POLIOVIRUS +POLIOVIRUSES +POLIS +POLISH +POLISHED +POLISHER +POLISHERS +POLISHES +POLISHING +POLITBURO +POLITBUROS +POLITE +POLITELY +POLITENESS +POLITENESSES +POLITER +POLITESSE +POLITESSES +POLITEST +POLITIC +POLITICAL +POLITICALIZE +POLITICALIZED +POLITICALIZES +POLITICALIZING +POLITICALLY +POLITICIAN +POLITICIANS +POLITICISE +POLITICISED +POLITICISES +POLITICISING +POLITICIZATION +POLITICIZATIONS +POLITICIZE +POLITICIZED +POLITICIZES +POLITICIZING +POLITICK +POLITICKED +POLITICKER +POLITICKERS +POLITICKING +POLITICKS +POLITICLY +POLITICO +POLITICOES +POLITICOS +POLITICS +POLITIES +POLITY +POLKA +POLKAED +POLKAING +POLKAS +POLL +POLLACK +POLLACKS +POLLARD +POLLARDED +POLLARDING +POLLARDS +POLLED +POLLEE +POLLEES +POLLEN +POLLENATE +POLLENATED +POLLENATES +POLLENATING +POLLENED +POLLENING +POLLENIZER +POLLENIZERS +POLLENOSES +POLLENOSIS +POLLENS +POLLER +POLLERS +POLLEX +POLLICAL +POLLICES +POLLINATE +POLLINATED +POLLINATES +POLLINATING +POLLINATION +POLLINATIONS +POLLINATOR +POLLINATORS +POLLING +POLLINIA +POLLINIC +POLLINIUM +POLLINIZE +POLLINIZED +POLLINIZER +POLLINIZERS +POLLINIZES +POLLINIZING +POLLINOSES +POLLINOSIS +POLLIST +POLLISTS +POLLIWOG +POLLIWOGS +POLLOCK +POLLOCKS +POLLS +POLLSTER +POLLSTERS +POLLTAKER +POLLTAKERS +POLLUTANT +POLLUTANTS +POLLUTE +POLLUTED +POLLUTER +POLLUTERS +POLLUTES +POLLUTING +POLLUTION +POLLUTIONS +POLLUTIVE +POLLYWOG +POLLYWOGS +POLO +POLOIST +POLOISTS +POLONAISE +POLONAISES +POLONIUM +POLONIUMS +POLOS +POLS +POLTERGEIST +POLTERGEISTS +POLTROON +POLTROONERIES +POLTROONERY +POLTROONS +POLY +POLYACRYLAMIDE +POLYACRYLAMIDES +POLYALCOHOL +POLYALCOHOLS +POLYAMIDE +POLYAMIDES +POLYAMINE +POLYAMINES +POLYANDRIES +POLYANDROUS +POLYANDRY +POLYANTHA +POLYANTHAS +POLYANTHI +POLYANTHUS +POLYANTHUSES +POLYATOMIC +POLYBASIC +POLYBRID +POLYBRIDS +POLYBUTADIENE +POLYBUTADIENES +POLYCARBONATE +POLYCARBONATES +POLYCARPIES +POLYCARPY +POLYCENTRIC +POLYCENTRISM +POLYCENTRISMS +POLYCHAETE +POLYCHAETES +POLYCHETE +POLYCHETES +POLYCHOTOMIES +POLYCHOTOMOUS +POLYCHOTOMY +POLYCHROMATIC +POLYCHROME +POLYCHROMED +POLYCHROMES +POLYCHROMIES +POLYCHROMING +POLYCHROMY +POLYCISTRONIC +POLYCLINIC +POLYCLINICS +POLYCLONAL +POLYCOT +POLYCOTS +POLYCRYSTAL +POLYCRYSTALLINE +POLYCRYSTALS +POLYCYCLIC +POLYCYSTIC +POLYCYTHEMIA +POLYCYTHEMIAS +POLYCYTHEMIC +POLYDACTYL +POLYDACTYLIES +POLYDACTYLY +POLYDIPSIA +POLYDIPSIAS +POLYDIPSIC +POLYDISPERSE +POLYDISPERSITY +POLYELECTROLYTE +POLYEMBRYONIC +POLYEMBRYONIES +POLYEMBRYONY +POLYENE +POLYENES +POLYENIC +POLYESTER +POLYESTERS +POLYESTROUS +POLYETHYLENE +POLYETHYLENES +POLYGALA +POLYGALAS +POLYGAMIC +POLYGAMIES +POLYGAMIST +POLYGAMISTS +POLYGAMIZE +POLYGAMIZED +POLYGAMIZES +POLYGAMIZING +POLYGAMOUS +POLYGAMY +POLYGENE +POLYGENES +POLYGENESES +POLYGENESIS +POLYGENETIC +POLYGENIC +POLYGLOT +POLYGLOTISM +POLYGLOTISMS +POLYGLOTS +POLYGLOTTISM +POLYGLOTTISMS +POLYGON +POLYGONAL +POLYGONALLY +POLYGONIES +POLYGONS +POLYGONUM +POLYGONUMS +POLYGONY +POLYGRAPH +POLYGRAPHED +POLYGRAPHER +POLYGRAPHERS +POLYGRAPHIC +POLYGRAPHING +POLYGRAPHIST +POLYGRAPHISTS +POLYGRAPHS +POLYGYNIES +POLYGYNOUS +POLYGYNY +POLYHEDRA +POLYHEDRAL +POLYHEDRON +POLYHEDRONS +POLYHEDROSES +POLYHEDROSIS +POLYHISTOR +POLYHISTORIC +POLYHISTORS +POLYHYDROXY +POLYIMIDE +POLYIMIDES +POLYLYSINE +POLYLYSINES +POLYMATH +POLYMATHIC +POLYMATHIES +POLYMATHS +POLYMATHY +POLYMER +POLYMERASE +POLYMERASES +POLYMERIC +POLYMERISATION +POLYMERISATIONS +POLYMERISE +POLYMERISED +POLYMERISES +POLYMERISING +POLYMERISM +POLYMERISMS +POLYMERIZATION +POLYMERIZATIONS +POLYMERIZE +POLYMERIZED +POLYMERIZES +POLYMERIZING +POLYMERS +POLYMORPH +POLYMORPHIC +POLYMORPHICALLY +POLYMORPHISM +POLYMORPHISMS +POLYMORPHOUS +POLYMORPHOUSLY +POLYMORPHS +POLYMYXIN +POLYMYXINS +POLYNEURITIS +POLYNEURITISES +POLYNOMIAL +POLYNOMIALS +POLYNUCLEAR +POLYNUCLEOTIDE +POLYNUCLEOTIDES +POLYNYA +POLYNYAS +POLYNYI +POLYOL +POLYOLEFIN +POLYOLEFINS +POLYOLS +POLYOMA +POLYOMAS +POLYONYMIES +POLYONYMOUS +POLYONYMY +POLYP +POLYPARIA +POLYPARIES +POLYPARIUM +POLYPARY +POLYPED +POLYPEDS +POLYPEPTIDE +POLYPEPTIDES +POLYPEPTIDIC +POLYPETALOUS +POLYPHAGIA +POLYPHAGIAS +POLYPHAGIES +POLYPHAGOUS +POLYPHAGY +POLYPHASE +POLYPHASIC +POLYPHENOL +POLYPHENOLIC +POLYPHENOLS +POLYPHONE +POLYPHONES +POLYPHONIC +POLYPHONICALLY +POLYPHONIES +POLYPHONOUS +POLYPHONOUSLY +POLYPHONY +POLYPHYLETIC +POLYPI +POLYPIDE +POLYPIDES +POLYPLOID +POLYPLOIDIES +POLYPLOIDS +POLYPLOIDY +POLYPNEA +POLYPNEAS +POLYPNEIC +POLYPOD +POLYPODIES +POLYPODS +POLYPODY +POLYPOID +POLYPORE +POLYPORES +POLYPOUS +POLYPROPYLENE +POLYPROPYLENES +POLYPS +POLYPTYCH +POLYPTYCHS +POLYPUS +POLYPUSES +POLYRHYTHM +POLYRHYTHMIC +POLYRHYTHMS +POLYRIBOSOMAL +POLYRIBOSOME +POLYRIBOSOMES +POLYS +POLYSACCHARIDE +POLYSACCHARIDES +POLYSEMIC +POLYSEMIES +POLYSEMOUS +POLYSEMY +POLYSOME +POLYSOMES +POLYSOMIC +POLYSOMICS +POLYSORBATE +POLYSORBATES +POLYSTICHOUS +POLYSTYRENE +POLYSTYRENES +POLYSULFIDE +POLYSULFIDES +POLYSYLLABIC +POLYSYLLABLE +POLYSYLLABLES +POLYSYNAPTIC +POLYSYNDETON +POLYSYNDETONS +POLYTECHNIC +POLYTECHNICS +POLYTENE +POLYTENIES +POLYTENY +POLYTHEISM +POLYTHEISMS +POLYTHEIST +POLYTHEISTIC +POLYTHEISTICAL +POLYTHEISTS +POLYTHENE +POLYTHENES +POLYTONAL +POLYTONALITIES +POLYTONALITY +POLYTONALLY +POLYTYPE +POLYTYPES +POLYTYPIC +POLYUNSATURATED +POLYURETHANE +POLYURETHANES +POLYURIA +POLYURIAS +POLYURIC +POLYVALENCE +POLYVALENCES +POLYVALENT +POLYVINYL +POLYWATER +POLYWATERS +POLYZOAN +POLYZOANS +POLYZOARIES +POLYZOARY +POLYZOIC +POM +POMACE +POMACEOUS +POMACES +POMADE +POMADED +POMADES +POMADING +POMANDER +POMANDERS +POMATUM +POMATUMS +POME +POMEGRANATE +POMEGRANATES +POMELO +POMELOS +POMES +POMFRET +POMFRETS +POMMEE +POMMEL +POMMELED +POMMELING +POMMELLED +POMMELLING +POMMELS +POMMIE +POMMIES +POMMY +POMO +POMOLOGICAL +POMOLOGIES +POMOLOGIST +POMOLOGISTS +POMOLOGY +POMOS +POMP +POMPADOUR +POMPADOURED +POMPADOURS +POMPANO +POMPANOS +POMPOM +POMPOMS +POMPON +POMPONS +POMPOSITIES +POMPOSITY +POMPOUS +POMPOUSLY +POMPOUSNESS +POMPOUSNESSES +POMPS +POMS +PONCE +PONCED +PONCES +PONCHO +PONCHOED +PONCHOS +PONCING +POND +PONDED +PONDER +PONDERABLE +PONDERED +PONDERER +PONDERERS +PONDERING +PONDEROSA +PONDEROSAS +PONDEROUS +PONDEROUSLY +PONDEROUSNESS +PONDEROUSNESSES +PONDERS +PONDING +PONDS +PONDWEED +PONDWEEDS +PONE +PONENT +PONES +PONG +PONGED +PONGEE +PONGEES +PONGID +PONGIDS +PONGING +PONGS +PONIARD +PONIARDED +PONIARDING +PONIARDS +PONIED +PONIES +PONS +PONTES +PONTIFEX +PONTIFF +PONTIFFS +PONTIFIC +PONTIFICAL +PONTIFICALLY +PONTIFICALS +PONTIFICATE +PONTIFICATED +PONTIFICATES +PONTIFICATING +PONTIFICATION +PONTIFICATIONS +PONTIFICATOR +PONTIFICATORS +PONTIFICES +PONTIL +PONTILS +PONTINE +PONTON +PONTONIER +PONTONIERS +PONTONS +PONTOON +PONTOONS +PONY +PONYING +PONYTAIL +PONYTAILED +PONYTAILS +POO +POOCH +POOCHED +POOCHES +POOCHING +POOD +POODLE +POODLES +POODS +POOED +POOF +POOFS +POOFTAH +POOFTAHS +POOFTER +POOFTERS +POOFY +POOH +POOHED +POOHING +POOHS +POOING +POOL +POOLED +POOLER +POOLERS +POOLHALL +POOLHALLS +POOLING +POOLROOM +POOLROOMS +POOLS +POOLSIDE +POOLSIDES +POON +POONS +POONTANG +POONTANGS +POOP +POOPED +POOPING +POOPS +POOR +POORER +POOREST +POORHOUSE +POORHOUSES +POORI +POORIS +POORISH +POORLY +POORMOUTH +POORMOUTHED +POORMOUTHING +POORMOUTHS +POORNESS +POORNESSES +POORTITH +POORTITHS +POOS +POOVE +POOVES +POP +POPCORN +POPCORNS +POPE +POPEDOM +POPEDOMS +POPELESS +POPELIKE +POPERIES +POPERY +POPES +POPEYED +POPGUN +POPGUNS +POPINJAY +POPINJAYS +POPISH +POPISHLY +POPLAR +POPLARS +POPLIN +POPLINS +POPLITEAL +POPLITEI +POPLITEUS +POPLITIC +POPOVER +POPOVERS +POPPA +POPPADOM +POPPADOMS +POPPADUM +POPPADUMS +POPPAS +POPPED +POPPER +POPPERS +POPPET +POPPETS +POPPIED +POPPIES +POPPING +POPPLE +POPPLED +POPPLES +POPPLING +POPPY +POPPYCOCK +POPPYCOCKS +POPPYHEAD +POPPYHEADS +POPS +POPSICLE +POPSICLES +POPSIE +POPSIES +POPSY +POPULACE +POPULACES +POPULAR +POPULARISE +POPULARISED +POPULARISES +POPULARISING +POPULARITIES +POPULARITY +POPULARIZATION +POPULARIZATIONS +POPULARIZE +POPULARIZED +POPULARIZER +POPULARIZERS +POPULARIZES +POPULARIZING +POPULARLY +POPULATE +POPULATED +POPULATES +POPULATING +POPULATION +POPULATIONAL +POPULATIONS +POPULISM +POPULISMS +POPULIST +POPULISTIC +POPULISTS +POPULOUS +POPULOUSLY +POPULOUSNESS +POPULOUSNESSES +PORBEAGLE +PORBEAGLES +PORCELAIN +PORCELAINIZE +PORCELAINIZED +PORCELAINIZES +PORCELAINIZING +PORCELAINLIKE +PORCELAINS +PORCELANEOUS +PORCELLANEOUS +PORCH +PORCHES +PORCINE +PORCINI +PORCINIS +PORCINO +PORCUPINE +PORCUPINES +PORE +PORED +PORES +PORGIES +PORGY +PORIFERAL +PORIFERAN +PORIFERANS +PORING +PORISM +PORISMS +PORK +PORKED +PORKER +PORKERS +PORKIER +PORKIES +PORKIEST +PORKINESS +PORKINESSES +PORKING +PORKPIE +PORKPIES +PORKS +PORKWOOD +PORKWOODS +PORKY +PORN +PORNIER +PORNIEST +PORNO +PORNOGRAPHER +PORNOGRAPHERS +PORNOGRAPHIC +PORNOGRAPHIES +PORNOGRAPHY +PORNOS +PORNS +PORNY +POROMERIC +POROMERICS +POROSE +POROSITIES +POROSITY +POROUS +POROUSLY +POROUSNESS +POROUSNESSES +PORPHYRIA +PORPHYRIAS +PORPHYRIC +PORPHYRIES +PORPHYRIN +PORPHYRINS +PORPHYRITIC +PORPHYROPSIN +PORPHYROPSINS +PORPHYRY +PORPOISE +PORPOISED +PORPOISES +PORPOISING +PORRECT +PORRIDGE +PORRIDGES +PORRIDGY +PORRINGER +PORRINGERS +PORT +PORTABELLA +PORTABELLAS +PORTABELLO +PORTABELLOS +PORTABILITIES +PORTABILITY +PORTABLE +PORTABLES +PORTABLY +PORTAGE +PORTAGED +PORTAGES +PORTAGING +PORTAL +PORTALED +PORTALS +PORTAMENTI +PORTAMENTO +PORTANCE +PORTANCES +PORTAPACK +PORTAPACKS +PORTAPAK +PORTAPAKS +PORTATIVE +PORTCULLIS +PORTCULLISES +PORTED +PORTEND +PORTENDED +PORTENDING +PORTENDS +PORTENT +PORTENTOUS +PORTENTOUSLY +PORTENTOUSNESS +PORTENTS +PORTER +PORTERAGE +PORTERAGES +PORTERED +PORTERESS +PORTERESSES +PORTERHOUSE +PORTERHOUSES +PORTERING +PORTERS +PORTFOLIO +PORTFOLIOS +PORTHOLE +PORTHOLES +PORTICO +PORTICOED +PORTICOES +PORTICOS +PORTIERE +PORTIERES +PORTING +PORTION +PORTIONED +PORTIONER +PORTIONERS +PORTIONING +PORTIONLESS +PORTIONS +PORTLESS +PORTLIER +PORTLIEST +PORTLINESS +PORTLINESSES +PORTLY +PORTMANTEAU +PORTMANTEAUS +PORTMANTEAUX +PORTOBELLO +PORTOBELLOS +PORTRAIT +PORTRAITIST +PORTRAITISTS +PORTRAITS +PORTRAITURE +PORTRAITURES +PORTRAY +PORTRAYAL +PORTRAYALS +PORTRAYED +PORTRAYER +PORTRAYERS +PORTRAYING +PORTRAYS +PORTRESS +PORTRESSES +PORTS +PORTSIDE +PORTULACA +PORTULACAS +POSABLE +POSADA +POSADAS +POSE +POSED +POSER +POSERS +POSES +POSEUR +POSEURS +POSH +POSHER +POSHEST +POSHLY +POSHNESS +POSHNESSES +POSIES +POSING +POSINGLY +POSIT +POSITED +POSITING +POSITION +POSITIONAL +POSITIONALLY +POSITIONED +POSITIONING +POSITIONS +POSITIVE +POSITIVELY +POSITIVENESS +POSITIVENESSES +POSITIVER +POSITIVES +POSITIVEST +POSITIVISM +POSITIVISMS +POSITIVIST +POSITIVISTIC +POSITIVISTS +POSITIVITIES +POSITIVITY +POSITRON +POSITRONIUM +POSITRONIUMS +POSITRONS +POSITS +POSOLE +POSOLES +POSOLOGIC +POSOLOGIES +POSOLOGY +POSSE +POSSES +POSSESS +POSSESSED +POSSESSEDLY +POSSESSEDNESS +POSSESSEDNESSES +POSSESSES +POSSESSING +POSSESSION +POSSESSIONAL +POSSESSIONLESS +POSSESSIONS +POSSESSIVE +POSSESSIVELY +POSSESSIVENESS +POSSESSIVES +POSSESSOR +POSSESSORS +POSSESSORY +POSSET +POSSETS +POSSIBILITIES +POSSIBILITY +POSSIBLE +POSSIBLER +POSSIBLEST +POSSIBLY +POSSUM +POSSUMS +POST +POSTABORTION +POSTACCIDENT +POSTADOLESCENT +POSTAGE +POSTAGES +POSTAL +POSTALLY +POSTALS +POSTAMPUTATION +POSTANAL +POSTAPOCALYPTIC +POSTARREST +POSTATOMIC +POSTATTACK +POSTAXIAL +POSTBAG +POSTBAGS +POSTBASE +POSTBELLUM +POSTBIBLICAL +POSTBOURGEOIS +POSTBOX +POSTBOXES +POSTBOY +POSTBOYS +POSTBURN +POSTCAPITALIST +POSTCARD +POSTCARDLIKE +POSTCARDS +POSTCAVA +POSTCAVAE +POSTCAVAL +POSTCAVAS +POSTCLASSIC +POSTCLASSICAL +POSTCODE +POSTCODES +POSTCOITAL +POSTCOLLEGE +POSTCOLLEGIATE +POSTCOLONIAL +POSTCONCEPTION +POSTCONCERT +POSTCONQUEST +POSTCONSONANTAL +POSTCONVENTION +POSTCOPULATORY +POSTCORONARY +POSTCOUP +POSTCRANIAL +POSTCRANIALLY +POSTCRASH +POSTCRISIS +POSTDATE +POSTDATED +POSTDATES +POSTDATING +POSTDEADLINE +POSTDEBATE +POSTDEBUTANTE +POSTDELIVERY +POSTDEPRESSION +POSTDEVALUATION +POSTDILUVIAN +POSTDILUVIANS +POSTDIVE +POSTDIVESTITURE +POSTDIVORCE +POSTDOC +POSTDOCS +POSTDOCTORAL +POSTDOCTORATE +POSTDRUG +POSTED +POSTEDITING +POSTEEN +POSTEENS +POSTELECTION +POSTEMBRYONAL +POSTEMBRYONIC +POSTEMERGENCE +POSTEMERGENCY +POSTEPILEPTIC +POSTER +POSTERIOR +POSTERIORITIES +POSTERIORITY +POSTERIORLY +POSTERIORS +POSTERITIES +POSTERITY +POSTERN +POSTERNS +POSTEROLATERAL +POSTERS +POSTERUPTIVE +POSTEXERCISE +POSTEXILIC +POSTEXPERIENCE +POSTEXPOSURE +POSTFACE +POSTFACES +POSTFAULT +POSTFEMINIST +POSTFIRE +POSTFIX +POSTFIXAL +POSTFIXED +POSTFIXES +POSTFIXING +POSTFLIGHT +POSTFORM +POSTFORMED +POSTFORMING +POSTFORMS +POSTFRACTURE +POSTFREEZE +POSTGAME +POSTGANGLIONIC +POSTGLACIAL +POSTGRAD +POSTGRADS +POSTGRADUATE +POSTGRADUATES +POSTGRADUATION +POSTHARVEST +POSTHASTE +POSTHASTES +POSTHEAT +POSTHEATS +POSTHEMORRHAGIC +POSTHOLE +POSTHOLES +POSTHOLIDAY +POSTHOLOCAUST +POSTHOSPITAL +POSTHUMOUS +POSTHUMOUSLY +POSTHUMOUSNESS +POSTHYPNOTIC +POSTICHE +POSTICHES +POSTIE +POSTIES +POSTILION +POSTILIONS +POSTILLION +POSTILLIONS +POSTIMPACT +POSTIMPERIAL +POSTIN +POSTINAUGURAL +POSTINDUSTRIAL +POSTINFECTION +POSTING +POSTINGS +POSTINJECTION +POSTINOCULATION +POSTINS +POSTIQUE +POSTIQUES +POSTIRRADIATION +POSTISCHEMIC +POSTISOLATION +POSTLANDING +POSTLAPSARIAN +POSTLAUNCH +POSTLIBERATION +POSTLITERATE +POSTLUDE +POSTLUDES +POSTMAN +POSTMARITAL +POSTMARK +POSTMARKED +POSTMARKING +POSTMARKS +POSTMASTECTOMY +POSTMASTER +POSTMASTERS +POSTMASTERSHIP +POSTMASTERSHIPS +POSTMATING +POSTMEDIEVAL +POSTMEN +POSTMENOPAUSAL +POSTMIDNIGHT +POSTMILLENARIAN +POSTMILLENNIAL +POSTMISTRESS +POSTMISTRESSES +POSTMODERN +POSTMODERNISM +POSTMODERNISMS +POSTMODERNIST +POSTMODERNISTS +POSTMORTEM +POSTMORTEMS +POSTNASAL +POSTNATAL +POSTNATALLY +POSTNEONATAL +POSTNUPTIAL +POSTOP +POSTOPERATIVE +POSTOPERATIVELY +POSTOPS +POSTORAL +POSTORBITAL +POSTORGASMIC +POSTPAID +POSTPARTUM +POSTPOLLINATION +POSTPONABLE +POSTPONE +POSTPONED +POSTPONEMENT +POSTPONEMENTS +POSTPONER +POSTPONERS +POSTPONES +POSTPONING +POSTPOSE +POSTPOSED +POSTPOSES +POSTPOSING +POSTPOSITION +POSTPOSITIONAL +POSTPOSITIONS +POSTPOSITIVE +POSTPOSITIVELY +POSTPRANDIAL +POSTPRIMARY +POSTPRISON +POSTPRODUCTION +POSTPRODUCTIONS +POSTPUBERTY +POSTPUBESCENT +POSTPUNK +POSTRACE +POSTRECESSION +POSTRETIREMENT +POSTRIDER +POSTRIDERS +POSTRIOT +POSTROMANTIC +POSTS +POSTSCRIPT +POSTSCRIPTS +POSTSEASON +POSTSEASONS +POSTSECONDARY +POSTSHOW +POSTSTIMULATION +POSTSTIMULATORY +POSTSTIMULUS +POSTSTRIKE +POSTSURGICAL +POSTSYNAPTIC +POSTSYNC +POSTSYNCED +POSTSYNCING +POSTSYNCS +POSTTAX +POSTTEEN +POSTTEENS +POSTTENSION +POSTTENSIONED +POSTTENSIONING +POSTTENSIONS +POSTTEST +POSTTESTS +POSTTRANSFUSION +POSTTRAUMATIC +POSTTREATMENT +POSTTRIAL +POSTULANCIES +POSTULANCY +POSTULANT +POSTULANTS +POSTULATE +POSTULATED +POSTULATES +POSTULATING +POSTULATION +POSTULATIONAL +POSTULATIONS +POSTULATOR +POSTULATORS +POSTURAL +POSTURE +POSTURED +POSTURER +POSTURERS +POSTURES +POSTURING +POSTURIST +POSTURISTS +POSTVACCINAL +POSTVACCINATION +POSTVAGOTOMY +POSTVASECTOMY +POSTVOCALIC +POSTWAR +POSTWEANING +POSTWORKSHOP +POSY +POT +POTABILITIES +POTABILITY +POTABLE +POTABLENESS +POTABLENESSES +POTABLES +POTAGE +POTAGES +POTAMIC +POTASH +POTASHES +POTASSIC +POTASSIUM +POTASSIUMS +POTATION +POTATIONS +POTATO +POTATOBUG +POTATOBUGS +POTATOES +POTATORY +POTBELLIED +POTBELLIES +POTBELLY +POTBOIL +POTBOILED +POTBOILER +POTBOILERS +POTBOILING +POTBOILS +POTBOUND +POTBOY +POTBOYS +POTEEN +POTEENS +POTENCE +POTENCES +POTENCIES +POTENCY +POTENT +POTENTATE +POTENTATES +POTENTIAL +POTENTIALITIES +POTENTIALITY +POTENTIALLY +POTENTIALS +POTENTIATE +POTENTIATED +POTENTIATES +POTENTIATING +POTENTIATION +POTENTIATIONS +POTENTIATOR +POTENTIATORS +POTENTILLA +POTENTILLAS +POTENTIOMETER +POTENTIOMETERS +POTENTIOMETRIC +POTENTLY +POTFUL +POTFULS +POTHEAD +POTHEADS +POTHEEN +POTHEENS +POTHER +POTHERB +POTHERBS +POTHERED +POTHERING +POTHERS +POTHOLDER +POTHOLDERS +POTHOLE +POTHOLED +POTHOLES +POTHOOK +POTHOOKS +POTHOS +POTHOUSE +POTHOUSES +POTHUNTER +POTHUNTERS +POTHUNTING +POTHUNTINGS +POTICHE +POTICHES +POTION +POTIONS +POTLACH +POTLACHE +POTLACHES +POTLATCH +POTLATCHED +POTLATCHES +POTLATCHING +POTLIKE +POTLINE +POTLINES +POTLUCK +POTLUCKS +POTMAN +POTMEN +POTOMETER +POTOMETERS +POTPIE +POTPIES +POTPOURRI +POTPOURRIS +POTS +POTSHARD +POTSHARDS +POTSHERD +POTSHERDS +POTSHOT +POTSHOTS +POTSHOTTING +POTSIE +POTSIES +POTSTONE +POTSTONES +POTSY +POTTAGE +POTTAGES +POTTED +POTTEEN +POTTEENS +POTTER +POTTERED +POTTERER +POTTERERS +POTTERIES +POTTERING +POTTERINGLY +POTTERS +POTTERY +POTTIER +POTTIES +POTTIEST +POTTINESS +POTTINESSES +POTTING +POTTLE +POTTLES +POTTO +POTTOS +POTTY +POTZER +POTZERS +POUCH +POUCHED +POUCHES +POUCHIER +POUCHIEST +POUCHING +POUCHY +POUF +POUFED +POUFF +POUFFE +POUFFED +POUFFES +POUFFS +POUFFY +POUFS +POULARD +POULARDE +POULARDES +POULARDS +POULT +POULTER +POULTERER +POULTERERS +POULTERS +POULTICE +POULTICED +POULTICES +POULTICING +POULTRIES +POULTRY +POULTRYMAN +POULTRYMEN +POULTS +POUNCE +POUNCED +POUNCER +POUNCERS +POUNCES +POUNCING +POUND +POUNDAGE +POUNDAGES +POUNDAL +POUNDALS +POUNDCAKE +POUNDCAKES +POUNDED +POUNDER +POUNDERS +POUNDING +POUNDS +POUR +POURABLE +POURBOIRE +POURBOIRES +POURED +POURER +POURERS +POURING +POURINGLY +POURPARLER +POURPARLERS +POURPOINT +POURPOINTS +POURS +POUSSETTE +POUSSETTED +POUSSETTES +POUSSETTING +POUSSIE +POUSSIES +POUT +POUTED +POUTER +POUTERS +POUTFUL +POUTIER +POUTIEST +POUTINE +POUTINES +POUTING +POUTINGLY +POUTS +POUTY +POVERTIES +POVERTY +POW +POWDER +POWDERED +POWDERER +POWDERERS +POWDERING +POWDERLESS +POWDERLIKE +POWDERS +POWDERY +POWER +POWERBOAT +POWERBOATS +POWERED +POWERFUL +POWERFULLY +POWERHOUSE +POWERHOUSES +POWERING +POWERLESS +POWERLESSLY +POWERLESSNESS +POWERLESSNESSES +POWERS +POWS +POWTER +POWTERS +POWWOW +POWWOWED +POWWOWING +POWWOWS +POX +POXED +POXES +POXIER +POXIEST +POXING +POXVIRUS +POXVIRUSES +POXY +POYOU +POYOUS +POZOLE +POZOLES +POZZOLAN +POZZOLANA +POZZOLANAS +POZZOLANIC +POZZOLANS +PRAAM +PRAAMS +PRACTIC +PRACTICABILITY +PRACTICABLE +PRACTICABLENESS +PRACTICABLY +PRACTICAL +PRACTICALITIES +PRACTICALITY +PRACTICALLY +PRACTICALNESS +PRACTICALNESSES +PRACTICALS +PRACTICE +PRACTICED +PRACTICER +PRACTICERS +PRACTICES +PRACTICING +PRACTICUM +PRACTICUMS +PRACTISE +PRACTISED +PRACTISES +PRACTISING +PRACTITIONER +PRACTITIONERS +PRAECIPE +PRAECIPES +PRAEDIAL +PRAEFECT +PRAEFECTS +PRAELECT +PRAELECTED +PRAELECTING +PRAELECTS +PRAEMUNIRE +PRAEMUNIRES +PRAENOMEN +PRAENOMENS +PRAENOMINA +PRAESIDIA +PRAESIDIUM +PRAESIDIUMS +PRAETOR +PRAETORIAL +PRAETORIAN +PRAETORIANS +PRAETORS +PRAETORSHIP +PRAETORSHIPS +PRAGMATIC +PRAGMATICAL +PRAGMATICALLY +PRAGMATICISM +PRAGMATICISMS +PRAGMATICIST +PRAGMATICISTS +PRAGMATICS +PRAGMATISM +PRAGMATISMS +PRAGMATIST +PRAGMATISTIC +PRAGMATISTS +PRAHU +PRAHUS +PRAIRIE +PRAIRIES +PRAISE +PRAISED +PRAISER +PRAISERS +PRAISES +PRAISEWORTHILY +PRAISEWORTHY +PRAISING +PRAJNA +PRAJNAS +PRALINE +PRALINES +PRALLTRILLER +PRALLTRILLERS +PRAM +PRAMS +PRANCE +PRANCED +PRANCER +PRANCERS +PRANCES +PRANCING +PRANDIAL +PRANG +PRANGED +PRANGING +PRANGS +PRANK +PRANKED +PRANKING +PRANKISH +PRANKISHLY +PRANKISHNESS +PRANKISHNESSES +PRANKS +PRANKSTER +PRANKSTERS +PRAO +PRAOS +PRASE +PRASEODYMIUM +PRASEODYMIUMS +PRASES +PRAT +PRATE +PRATED +PRATER +PRATERS +PRATES +PRATFALL +PRATFALLS +PRATINCOLE +PRATINCOLES +PRATING +PRATINGLY +PRATIQUE +PRATIQUES +PRATS +PRATTLE +PRATTLED +PRATTLER +PRATTLERS +PRATTLES +PRATTLING +PRATTLINGLY +PRAU +PRAUS +PRAWN +PRAWNED +PRAWNER +PRAWNERS +PRAWNING +PRAWNS +PRAXEOLOGICAL +PRAXEOLOGIES +PRAXEOLOGY +PRAXES +PRAXIS +PRAXISES +PRAY +PRAYED +PRAYER +PRAYERFUL +PRAYERFULLY +PRAYERFULNESS +PRAYERFULNESSES +PRAYERS +PRAYING +PRAYS +PREABSORB +PREABSORBED +PREABSORBING +PREABSORBS +PREACCUSE +PREACCUSED +PREACCUSES +PREACCUSING +PREACH +PREACHED +PREACHER +PREACHERS +PREACHES +PREACHIER +PREACHIEST +PREACHIFIED +PREACHIFIES +PREACHIFY +PREACHIFYING +PREACHILY +PREACHINESS +PREACHINESSES +PREACHING +PREACHINGLY +PREACHMENT +PREACHMENTS +PREACHY +PREACT +PREACTED +PREACTING +PREACTS +PREADAPT +PREADAPTATION +PREADAPTATIONS +PREADAPTED +PREADAPTING +PREADAPTIVE +PREADAPTS +PREADJUST +PREADJUSTED +PREADJUSTING +PREADJUSTS +PREADMISSION +PREADMISSIONS +PREADMIT +PREADMITS +PREADMITTED +PREADMITTING +PREADOLESCENCE +PREADOLESCENCES +PREADOLESCENT +PREADOLESCENTS +PREADOPT +PREADOPTED +PREADOPTING +PREADOPTS +PREADULT +PREADULTS +PREAGED +PREAGRICULTURAL +PREALLOT +PREALLOTS +PREALLOTTED +PREALLOTTING +PREALTER +PREALTERED +PREALTERING +PREALTERS +PREAMBLE +PREAMBLED +PREAMBLES +PREAMP +PREAMPLIFIER +PREAMPLIFIERS +PREAMPS +PREANAL +PREANESTHETIC +PREANNOUNCE +PREANNOUNCED +PREANNOUNCES +PREANNOUNCING +PREAPPLIED +PREAPPLIES +PREAPPLY +PREAPPLYING +PREAPPROVE +PREAPPROVED +PREAPPROVES +PREAPPROVING +PREARM +PREARMED +PREARMING +PREARMS +PREARRANGE +PREARRANGED +PREARRANGEMENT +PREARRANGEMENTS +PREARRANGES +PREARRANGING +PREASSEMBLED +PREASSIGN +PREASSIGNED +PREASSIGNING +PREASSIGNS +PREASSURE +PREASSURED +PREASSURES +PREASSURING +PREATOMIC +PREATTUNE +PREATTUNED +PREATTUNES +PREATTUNING +PREAUDIT +PREAUDITS +PREAVER +PREAVERRED +PREAVERRING +PREAVERS +PREAXIAL +PREBADE +PREBAKE +PREBAKED +PREBAKES +PREBAKING +PREBASAL +PREBATTLE +PREBEND +PREBENDAL +PREBENDARIES +PREBENDARY +PREBENDS +PREBIBLICAL +PREBID +PREBIDDEN +PREBIDDING +PREBIDS +PREBILL +PREBILLED +PREBILLING +PREBILLS +PREBIND +PREBINDING +PREBINDS +PREBIOLOGIC +PREBIOLOGICAL +PREBIOTIC +PREBIRTH +PREBIRTHS +PREBLESS +PREBLESSED +PREBLESSES +PREBLESSING +PREBOARD +PREBOARDED +PREBOARDING +PREBOARDS +PREBOIL +PREBOILED +PREBOILING +PREBOILS +PREBOOK +PREBOOKED +PREBOOKING +PREBOOKS +PREBOOM +PREBOUGHT +PREBOUND +PREBREAKFAST +PREBUDGET +PREBUDGETS +PREBUILD +PREBUILDING +PREBUILDS +PREBUILT +PREBUY +PREBUYING +PREBUYS +PRECALCULI +PRECALCULUS +PRECALCULUSES +PRECANCEL +PRECANCELED +PRECANCELING +PRECANCELLATION +PRECANCELLED +PRECANCELLING +PRECANCELS +PRECANCER +PRECANCEROUS +PRECANCERS +PRECAPITALIST +PRECARIOUS +PRECARIOUSLY +PRECARIOUSNESS +PRECAST +PRECASTING +PRECASTS +PRECATIVE +PRECATORY +PRECAUDAL +PRECAUTION +PRECAUTIONARY +PRECAUTIONS +PRECAVA +PRECAVAE +PRECAVAL +PRECEDE +PRECEDED +PRECEDENCE +PRECEDENCES +PRECEDENCIES +PRECEDENCY +PRECEDENT +PRECEDENTS +PRECEDES +PRECEDING +PRECENSOR +PRECENSORED +PRECENSORING +PRECENSORS +PRECENT +PRECENTED +PRECENTING +PRECENTOR +PRECENTORIAL +PRECENTORS +PRECENTORSHIP +PRECENTORSHIPS +PRECENTS +PRECEPT +PRECEPTIVE +PRECEPTOR +PRECEPTORIAL +PRECEPTORIALS +PRECEPTORIES +PRECEPTORS +PRECEPTORSHIP +PRECEPTORSHIPS +PRECEPTORY +PRECEPTS +PRECESS +PRECESSED +PRECESSES +PRECESSING +PRECESSION +PRECESSIONAL +PRECESSIONS +PRECHARGE +PRECHARGED +PRECHARGES +PRECHARGING +PRECHECK +PRECHECKED +PRECHECKING +PRECHECKS +PRECHILL +PRECHILLED +PRECHILLING +PRECHILLS +PRECHOOSE +PRECHOOSES +PRECHOOSING +PRECHOSE +PRECHOSEN +PRECIEUSE +PRECIEUX +PRECINCT +PRECINCTS +PRECIOSITIES +PRECIOSITY +PRECIOUS +PRECIOUSES +PRECIOUSLY +PRECIOUSNESS +PRECIOUSNESSES +PRECIPE +PRECIPES +PRECIPICE +PRECIPICES +PRECIPITABLE +PRECIPITANCE +PRECIPITANCES +PRECIPITANCIES +PRECIPITANCY +PRECIPITANT +PRECIPITANTLY +PRECIPITANTNESS +PRECIPITANTS +PRECIPITATE +PRECIPITATED +PRECIPITATELY +PRECIPITATENESS +PRECIPITATES +PRECIPITATING +PRECIPITATION +PRECIPITATIONS +PRECIPITATIVE +PRECIPITATOR +PRECIPITATORS +PRECIPITIN +PRECIPITINOGEN +PRECIPITINOGENS +PRECIPITINS +PRECIPITOUS +PRECIPITOUSLY +PRECIPITOUSNESS +PRECIS +PRECISE +PRECISED +PRECISELY +PRECISENESS +PRECISENESSES +PRECISER +PRECISES +PRECISEST +PRECISIAN +PRECISIANS +PRECISING +PRECISION +PRECISIONIST +PRECISIONISTS +PRECISIONS +PRECITED +PRECLEAN +PRECLEANED +PRECLEANING +PRECLEANS +PRECLEAR +PRECLEARANCE +PRECLEARANCES +PRECLEARED +PRECLEARING +PRECLEARS +PRECLINICAL +PRECLUDE +PRECLUDED +PRECLUDES +PRECLUDING +PRECLUSION +PRECLUSIONS +PRECLUSIVE +PRECLUSIVELY +PRECOCIAL +PRECOCIOUS +PRECOCIOUSLY +PRECOCIOUSNESS +PRECOCITIES +PRECOCITY +PRECODE +PRECODED +PRECODES +PRECODING +PRECOGNITION +PRECOGNITIONS +PRECOGNITIVE +PRECOITAL +PRECOLLEGE +PRECOLLEGIATE +PRECOLONIAL +PRECOMBUSTION +PRECOMBUSTIONS +PRECOMMITMENT +PRECOMMITMENTS +PRECOMPUTE +PRECOMPUTED +PRECOMPUTER +PRECOMPUTES +PRECOMPUTING +PRECONCEIVE +PRECONCEIVED +PRECONCEIVES +PRECONCEIVING +PRECONCEPTION +PRECONCEPTIONS +PRECONCERT +PRECONCERTED +PRECONCERTING +PRECONCERTS +PRECONCILIAR +PRECONDITION +PRECONDITIONED +PRECONDITIONING +PRECONDITIONS +PRECONIZE +PRECONIZED +PRECONIZES +PRECONIZING +PRECONQUEST +PRECONSCIOUS +PRECONSCIOUSES +PRECONSCIOUSLY +PRECONSONANTAL +PRECONSTRUCTED +PRECONTACT +PRECONVENTION +PRECONVICTION +PRECONVICTIONS +PRECOOK +PRECOOKED +PRECOOKER +PRECOOKERS +PRECOOKING +PRECOOKS +PRECOOL +PRECOOLED +PRECOOLING +PRECOOLS +PRECOPULATORY +PRECOUP +PRECRASH +PRECREASE +PRECREASED +PRECREASES +PRECREASING +PRECRISIS +PRECRITICAL +PRECURE +PRECURED +PRECURES +PRECURING +PRECURSOR +PRECURSORS +PRECURSORY +PRECUT +PRECUTS +PRECUTTING +PREDACEOUS +PREDACEOUSNESS +PREDACIOUS +PREDACITIES +PREDACITY +PREDATE +PREDATED +PREDATES +PREDATING +PREDATION +PREDATIONS +PREDATISM +PREDATISMS +PREDATOR +PREDATORS +PREDATORY +PREDAWN +PREDAWNS +PREDEATH +PREDEATHS +PREDEBATE +PREDECEASE +PREDECEASED +PREDECEASES +PREDECEASING +PREDECESSOR +PREDECESSORS +PREDEDUCT +PREDEDUCTED +PREDEDUCTING +PREDEDUCTS +PREDEFINE +PREDEFINED +PREDEFINES +PREDEFINING +PREDELIVERY +PREDELLA +PREDELLAS +PREDEPARTURE +PREDESIGNATE +PREDESIGNATED +PREDESIGNATES +PREDESIGNATING +PREDESTINARIAN +PREDESTINARIANS +PREDESTINATE +PREDESTINATED +PREDESTINATES +PREDESTINATING +PREDESTINATION +PREDESTINATIONS +PREDESTINATOR +PREDESTINATORS +PREDESTINE +PREDESTINED +PREDESTINES +PREDESTINING +PREDETERMINE +PREDETERMINED +PREDETERMINER +PREDETERMINERS +PREDETERMINES +PREDETERMINING +PREDEVALUATION +PREDEVELOPMENT +PREDIABETES +PREDIABETESES +PREDIABETIC +PREDIABETICS +PREDIAL +PREDICABLE +PREDICABLES +PREDICAMENT +PREDICAMENTS +PREDICANT +PREDICANTS +PREDICATE +PREDICATED +PREDICATES +PREDICATING +PREDICATION +PREDICATIONS +PREDICATIVE +PREDICATIVELY +PREDICATORY +PREDICT +PREDICTABILITY +PREDICTABLE +PREDICTABLY +PREDICTED +PREDICTING +PREDICTION +PREDICTIONS +PREDICTIVE +PREDICTIVELY +PREDICTOR +PREDICTORS +PREDICTS +PREDIGEST +PREDIGESTED +PREDIGESTING +PREDIGESTION +PREDIGESTIONS +PREDIGESTS +PREDILECTION +PREDILECTIONS +PREDINNER +PREDINNERS +PREDISCHARGE +PREDISCOVERIES +PREDISCOVERY +PREDISPOSE +PREDISPOSED +PREDISPOSES +PREDISPOSING +PREDISPOSITION +PREDISPOSITIONS +PREDIVE +PREDNISOLONE +PREDNISOLONES +PREDNISONE +PREDNISONES +PREDOCTORAL +PREDOMINANCE +PREDOMINANCES +PREDOMINANCIES +PREDOMINANCY +PREDOMINANT +PREDOMINANTLY +PREDOMINATE +PREDOMINATED +PREDOMINATELY +PREDOMINATES +PREDOMINATING +PREDOMINATION +PREDOMINATIONS +PREDRAFT +PREDRIED +PREDRIES +PREDRILL +PREDRILLED +PREDRILLING +PREDRILLS +PREDRY +PREDRYING +PREDUSK +PREDUSKS +PREDYNASTIC +PREE +PREECLAMPSIA +PREECLAMPSIAS +PREECLAMPTIC +PREED +PREEDIT +PREEDITED +PREEDITING +PREEDITS +PREEING +PREELECT +PREELECTED +PREELECTING +PREELECTION +PREELECTRIC +PREELECTS +PREEMBARGO +PREEMERGENCE +PREEMERGENT +PREEMIE +PREEMIES +PREEMINENCE +PREEMINENCES +PREEMINENT +PREEMINENTLY +PREEMPLOYMENT +PREEMPT +PREEMPTED +PREEMPTING +PREEMPTION +PREEMPTIONS +PREEMPTIVE +PREEMPTIVELY +PREEMPTOR +PREEMPTORS +PREEMPTS +PREEN +PREENACT +PREENACTED +PREENACTING +PREENACTS +PREENED +PREENER +PREENERS +PREENING +PREENROLLMENT +PREENS +PREERECT +PREERECTED +PREERECTING +PREERECTS +PREES +PREESTABLISH +PREESTABLISHED +PREESTABLISHES +PREESTABLISHING +PREETHICAL +PREEXCITE +PREEXCITED +PREEXCITES +PREEXCITING +PREEXEMPT +PREEXEMPTED +PREEXEMPTING +PREEXEMPTS +PREEXILIC +PREEXIST +PREEXISTED +PREEXISTENCE +PREEXISTENCES +PREEXISTENT +PREEXISTING +PREEXISTS +PREEXPERIMENT +PREEXPOSE +PREEXPOSED +PREEXPOSES +PREEXPOSING +PREFAB +PREFABBED +PREFABBING +PREFABRICATE +PREFABRICATED +PREFABRICATES +PREFABRICATING +PREFABRICATION +PREFABRICATIONS +PREFABS +PREFACE +PREFACED +PREFACER +PREFACERS +PREFACES +PREFACING +PREFADE +PREFADED +PREFADES +PREFADING +PREFASCIST +PREFATORY +PREFECT +PREFECTS +PREFECTURAL +PREFECTURE +PREFECTURES +PREFER +PREFERABILITIES +PREFERABILITY +PREFERABLE +PREFERABLY +PREFERENCE +PREFERENCES +PREFERENTIAL +PREFERENTIALLY +PREFERMENT +PREFERMENTS +PREFERRED +PREFERRER +PREFERRERS +PREFERRING +PREFERS +PREFEUDAL +PREFIGHT +PREFIGURATION +PREFIGURATIONS +PREFIGURATIVE +PREFIGURATIVELY +PREFIGURE +PREFIGURED +PREFIGUREMENT +PREFIGUREMENTS +PREFIGURES +PREFIGURING +PREFILE +PREFILED +PREFILES +PREFILING +PREFILLED +PREFINANCE +PREFINANCED +PREFINANCES +PREFINANCING +PREFIRE +PREFIRED +PREFIRES +PREFIRING +PREFIX +PREFIXAL +PREFIXED +PREFIXES +PREFIXING +PREFIXION +PREFIXIONS +PREFLAME +PREFLIGHT +PREFLIGHTED +PREFLIGHTING +PREFLIGHTS +PREFOCUS +PREFOCUSED +PREFOCUSES +PREFOCUSING +PREFOCUSSED +PREFOCUSSES +PREFOCUSSING +PREFORM +PREFORMAT +PREFORMATION +PREFORMATIONIST +PREFORMATIONS +PREFORMATS +PREFORMATTED +PREFORMATTING +PREFORMED +PREFORMING +PREFORMS +PREFORMULATE +PREFORMULATED +PREFORMULATES +PREFORMULATING +PREFRANK +PREFRANKED +PREFRANKING +PREFRANKS +PREFREEZE +PREFREEZES +PREFREEZING +PREFRESHMAN +PREFRONTAL +PREFRONTALS +PREFROZE +PREFROZEN +PREFUND +PREFUNDED +PREFUNDING +PREFUNDS +PREGAME +PREGAMES +PREGANGLIONIC +PREGENITAL +PREGGERS +PREGNABILITIES +PREGNABILITY +PREGNABLE +PREGNANCIES +PREGNANCY +PREGNANT +PREGNANTLY +PREGNENOLONE +PREGNENOLONES +PREGROWTH +PREGROWTHS +PREGUIDE +PREGUIDED +PREGUIDES +PREGUIDING +PREHANDLE +PREHANDLED +PREHANDLES +PREHANDLING +PREHARDEN +PREHARDENED +PREHARDENING +PREHARDENS +PREHARVEST +PREHEADACHE +PREHEAT +PREHEATED +PREHEATER +PREHEATERS +PREHEATING +PREHEATS +PREHENSILE +PREHENSILITIES +PREHENSILITY +PREHENSION +PREHENSIONS +PREHIRING +PREHISTORIAN +PREHISTORIANS +PREHISTORIC +PREHISTORICAL +PREHISTORICALLY +PREHISTORIES +PREHISTORY +PREHOLIDAY +PREHOMINID +PREHOMINIDS +PREHUMAN +PREHUMANS +PREIGNITION +PREIGNITIONS +PREIMPLANTATION +PREIMPOSE +PREIMPOSED +PREIMPOSES +PREIMPOSING +PREINAUGURAL +PREINDUCTION +PREINDUSTRIAL +PREINFORM +PREINFORMED +PREINFORMING +PREINFORMS +PREINSERT +PREINSERTED +PREINSERTING +PREINSERTS +PREINTERVIEW +PREINTERVIEWED +PREINTERVIEWING +PREINTERVIEWS +PREINVASION +PREINVITE +PREINVITED +PREINVITES +PREINVITING +PREJUDGE +PREJUDGED +PREJUDGER +PREJUDGERS +PREJUDGES +PREJUDGING +PREJUDGMENT +PREJUDGMENTS +PREJUDICE +PREJUDICED +PREJUDICES +PREJUDICIAL +PREJUDICIALLY +PREJUDICIALNESS +PREJUDICING +PREKINDERGARTEN +PRELACIES +PRELACY +PRELAPSARIAN +PRELATE +PRELATES +PRELATIC +PRELATISM +PRELATISMS +PRELATURE +PRELATURES +PRELAUNCH +PRELAUNCHED +PRELAUNCHES +PRELAUNCHING +PRELAW +PRELECT +PRELECTED +PRELECTING +PRELECTION +PRELECTIONS +PRELECTOR +PRELECTORS +PRELECTS +PRELEGAL +PRELIBATION +PRELIBATIONS +PRELIFE +PRELIM +PRELIMINARIES +PRELIMINARILY +PRELIMINARY +PRELIMIT +PRELIMITED +PRELIMITING +PRELIMITS +PRELIMS +PRELITERARY +PRELITERATE +PRELITERATES +PRELIVES +PRELOAD +PRELOADED +PRELOADING +PRELOADS +PRELOCATE +PRELOCATED +PRELOCATES +PRELOCATING +PRELOGICAL +PRELUDE +PRELUDED +PRELUDER +PRELUDERS +PRELUDES +PRELUDIAL +PRELUDING +PRELUNCH +PRELUNCHEON +PRELUSION +PRELUSIONS +PRELUSIVE +PRELUSIVELY +PRELUSORY +PREMADE +PREMALIGNANT +PREMAN +PREMANUFACTURE +PREMANUFACTURED +PREMANUFACTURES +PREMARITAL +PREMARITALLY +PREMARKET +PREMARKETED +PREMARKETING +PREMARKETS +PREMARRIAGE +PREMATURE +PREMATURELY +PREMATURENESS +PREMATURENESSES +PREMATURES +PREMATURITIES +PREMATURITY +PREMAXILLA +PREMAXILLAE +PREMAXILLARIES +PREMAXILLARY +PREMAXILLAS +PREMEAL +PREMEASURE +PREMEASURED +PREMEASURES +PREMEASURING +PREMED +PREMEDIC +PREMEDICAL +PREMEDICS +PREMEDIEVAL +PREMEDITATE +PREMEDITATED +PREMEDITATEDLY +PREMEDITATES +PREMEDITATING +PREMEDITATION +PREMEDITATIONS +PREMEDITATIVE +PREMEDITATOR +PREMEDITATORS +PREMEDS +PREMEET +PREMEIOTIC +PREMEN +PREMENOPAUSAL +PREMENSTRUAL +PREMENSTRUALLY +PREMERGER +PREMIE +PREMIER +PREMIERE +PREMIERED +PREMIERES +PREMIERING +PREMIERS +PREMIERSHIP +PREMIERSHIPS +PREMIES +PREMIGRATION +PREMILLENARIAN +PREMILLENARIANS +PREMILLENNIAL +PREMILLENNIALLY +PREMISE +PREMISED +PREMISES +PREMISING +PREMISS +PREMISSES +PREMIUM +PREMIUMS +PREMIX +PREMIXED +PREMIXES +PREMIXING +PREMIXT +PREMODERN +PREMODIFICATION +PREMODIFIED +PREMODIFIES +PREMODIFY +PREMODIFYING +PREMOISTEN +PREMOISTENED +PREMOISTENING +PREMOISTENS +PREMOLAR +PREMOLARS +PREMOLD +PREMOLDED +PREMOLDING +PREMOLDS +PREMOLT +PREMONISH +PREMONISHED +PREMONISHES +PREMONISHING +PREMONITION +PREMONITIONS +PREMONITORILY +PREMONITORY +PREMORAL +PREMORSE +PREMUNE +PREMUNITION +PREMUNITIONS +PREMYCOTIC +PRENAME +PRENAMES +PRENATAL +PRENATALLY +PRENOMEN +PRENOMENS +PRENOMINA +PRENOMINATE +PRENOMINATED +PRENOMINATES +PRENOMINATING +PRENOMINATION +PRENOMINATIONS +PRENOON +PRENOTIFICATION +PRENOTIFIED +PRENOTIFIES +PRENOTIFY +PRENOTIFYING +PRENOTION +PRENOTIONS +PRENTICE +PRENTICED +PRENTICES +PRENTICING +PRENUMBER +PRENUMBERED +PRENUMBERING +PRENUMBERS +PRENUPTIAL +PREOBTAIN +PREOBTAINED +PREOBTAINING +PREOBTAINS +PREOCCUPANCIES +PREOCCUPANCY +PREOCCUPATION +PREOCCUPATIONS +PREOCCUPIED +PREOCCUPIES +PREOCCUPY +PREOCCUPYING +PREOP +PREOPENING +PREOPERATIONAL +PREOPERATIVE +PREOPERATIVELY +PREOPS +PREOPTION +PREOPTIONS +PREORAL +PREORDAIN +PREORDAINED +PREORDAINING +PREORDAINMENT +PREORDAINMENTS +PREORDAINS +PREORDER +PREORDERED +PREORDERING +PREORDERS +PREORDINATION +PREORDINATIONS +PREOVULATORY +PREOWNED +PREP +PREPACK +PREPACKAGE +PREPACKAGED +PREPACKAGES +PREPACKAGING +PREPACKED +PREPACKING +PREPACKS +PREPAID +PREPARATION +PREPARATIONS +PREPARATIVE +PREPARATIVELY +PREPARATIVES +PREPARATOR +PREPARATORILY +PREPARATORS +PREPARATORY +PREPARE +PREPARED +PREPAREDLY +PREPAREDNESS +PREPAREDNESSES +PREPARER +PREPARERS +PREPARES +PREPARING +PREPASTE +PREPASTED +PREPASTES +PREPASTING +PREPAVE +PREPAVED +PREPAVES +PREPAVING +PREPAY +PREPAYING +PREPAYMENT +PREPAYMENTS +PREPAYS +PREPENSE +PREPENSELY +PREPERFORMANCE +PREPILL +PREPLACE +PREPLACED +PREPLACES +PREPLACING +PREPLAN +PREPLANNED +PREPLANNING +PREPLANS +PREPLANT +PREPLANTING +PREPONDERANCE +PREPONDERANCES +PREPONDERANCIES +PREPONDERANCY +PREPONDERANT +PREPONDERANTLY +PREPONDERATE +PREPONDERATED +PREPONDERATELY +PREPONDERATES +PREPONDERATING +PREPONDERATION +PREPONDERATIONS +PREPORTION +PREPORTIONED +PREPORTIONING +PREPORTIONS +PREPOSITION +PREPOSITIONAL +PREPOSITIONALLY +PREPOSITIONS +PREPOSITIVE +PREPOSITIVELY +PREPOSSESS +PREPOSSESSED +PREPOSSESSES +PREPOSSESSING +PREPOSSESSION +PREPOSSESSIONS +PREPOSTEROUS +PREPOSTEROUSLY +PREPOTENCIES +PREPOTENCY +PREPOTENT +PREPOTENTLY +PREPPED +PREPPIE +PREPPIER +PREPPIES +PREPPIEST +PREPPILY +PREPPINESS +PREPPINESSES +PREPPING +PREPPY +PREPRANDIAL +PREPREG +PREPREGS +PREPREPARED +PREPRESIDENTIAL +PREPRESS +PREPRICE +PREPRICED +PREPRICES +PREPRICING +PREPRIMARIES +PREPRIMARY +PREPRINT +PREPRINTED +PREPRINTING +PREPRINTS +PREPROCESS +PREPROCESSED +PREPROCESSES +PREPROCESSING +PREPROCESSOR +PREPROCESSORS +PREPRODUCTION +PREPRODUCTIONS +PREPROFESSIONAL +PREPROGRAM +PREPROGRAMED +PREPROGRAMING +PREPROGRAMMED +PREPROGRAMMING +PREPROGRAMS +PREPS +PREPSYCHEDELIC +PREPUBERAL +PREPUBERTAL +PREPUBERTIES +PREPUBERTY +PREPUBES +PREPUBESCENCE +PREPUBESCENCES +PREPUBESCENT +PREPUBESCENTS +PREPUBIS +PREPUBLICATION +PREPUBLICATIONS +PREPUCE +PREPUCES +PREPUEBLO +PREPUNCH +PREPUNCHED +PREPUNCHES +PREPUNCHING +PREPUPA +PREPUPAE +PREPUPAL +PREPUPAS +PREPURCHASE +PREPURCHASED +PREPURCHASES +PREPURCHASING +PREPUTIAL +PREQUALIFIED +PREQUALIFIES +PREQUALIFY +PREQUALIFYING +PREQUEL +PREQUELS +PRERACE +PRERADIO +PRERECESSION +PRERECORD +PRERECORDED +PRERECORDING +PRERECORDS +PRERECTAL +PREREFORM +PREREGISTER +PREREGISTERED +PREREGISTERING +PREREGISTERS +PREREGISTRATION +PREREHEARSAL +PRERELEASE +PRERELEASED +PRERELEASES +PRERELEASING +PRERENAL +PREREQUIRE +PREREQUIRED +PREREQUIRES +PREREQUIRING +PREREQUISITE +PREREQUISITES +PRERETIREMENT +PRERETURN +PREREVIEW +PREREVISIONIST +PREREVOLUTION +PRERINSE +PRERINSED +PRERINSES +PRERINSING +PRERIOT +PREROCK +PREROGATIVE +PREROGATIVED +PREROGATIVES +PREROMANTIC +PRESA +PRESAGE +PRESAGED +PRESAGEFUL +PRESAGER +PRESAGERS +PRESAGES +PRESAGING +PRESALE +PRESALES +PRESANCTIFIED +PRESBYOPE +PRESBYOPES +PRESBYOPIA +PRESBYOPIAS +PRESBYOPIC +PRESBYOPICS +PRESBYTER +PRESBYTERATE +PRESBYTERATES +PRESBYTERIAL +PRESBYTERIALLY +PRESBYTERIALS +PRESBYTERIAN +PRESBYTERIES +PRESBYTERS +PRESBYTERY +PRESCHEDULE +PRESCHEDULED +PRESCHEDULES +PRESCHEDULING +PRESCHOOL +PRESCHOOLER +PRESCHOOLERS +PRESCHOOLS +PRESCIENCE +PRESCIENCES +PRESCIENT +PRESCIENTIFIC +PRESCIENTLY +PRESCIND +PRESCINDED +PRESCINDING +PRESCINDS +PRESCORE +PRESCORED +PRESCORES +PRESCORING +PRESCREEN +PRESCREENED +PRESCREENING +PRESCREENS +PRESCRIBE +PRESCRIBED +PRESCRIBER +PRESCRIBERS +PRESCRIBES +PRESCRIBING +PRESCRIPT +PRESCRIPTION +PRESCRIPTIONS +PRESCRIPTIVE +PRESCRIPTIVELY +PRESCRIPTS +PRESE +PRESEASON +PRESEASONS +PRESELECT +PRESELECTED +PRESELECTING +PRESELECTION +PRESELECTIONS +PRESELECTS +PRESELL +PRESELLING +PRESELLS +PRESENCE +PRESENCES +PRESENT +PRESENTABILITY +PRESENTABLE +PRESENTABLENESS +PRESENTABLY +PRESENTATION +PRESENTATIONAL +PRESENTATIONS +PRESENTATIVE +PRESENTED +PRESENTEE +PRESENTEES +PRESENTENCE +PRESENTENCED +PRESENTENCES +PRESENTENCING +PRESENTER +PRESENTERS +PRESENTIENT +PRESENTIMENT +PRESENTIMENTAL +PRESENTIMENTS +PRESENTING +PRESENTISM +PRESENTISMS +PRESENTIST +PRESENTLY +PRESENTMENT +PRESENTMENTS +PRESENTNESS +PRESENTNESSES +PRESENTS +PRESERVABILITY +PRESERVABLE +PRESERVATION +PRESERVATIONIST +PRESERVATIONS +PRESERVATIVE +PRESERVATIVES +PRESERVE +PRESERVED +PRESERVER +PRESERVERS +PRESERVES +PRESERVICE +PRESERVING +PRESET +PRESETS +PRESETTING +PRESETTLE +PRESETTLED +PRESETTLEMENT +PRESETTLES +PRESETTLING +PRESHAPE +PRESHAPED +PRESHAPES +PRESHAPING +PRESHIP +PRESHIPPED +PRESHIPPING +PRESHIPS +PRESHOW +PRESHOWED +PRESHOWING +PRESHOWN +PRESHOWS +PRESHRANK +PRESHRINK +PRESHRINKING +PRESHRINKS +PRESHRUNK +PRESHRUNKEN +PRESIDE +PRESIDED +PRESIDENCIES +PRESIDENCY +PRESIDENT +PRESIDENTIAL +PRESIDENTIALLY +PRESIDENTS +PRESIDENTSHIP +PRESIDENTSHIPS +PRESIDER +PRESIDERS +PRESIDES +PRESIDIA +PRESIDIAL +PRESIDIARY +PRESIDING +PRESIDIO +PRESIDIOS +PRESIDIUM +PRESIDIUMS +PRESIFT +PRESIFTED +PRESIFTING +PRESIFTS +PRESIGNAL +PRESIGNALED +PRESIGNALING +PRESIGNALLED +PRESIGNALLING +PRESIGNALS +PRESIGNIFIED +PRESIGNIFIES +PRESIGNIFY +PRESIGNIFYING +PRESLAUGHTER +PRESLEEP +PRESLICE +PRESLICED +PRESLICES +PRESLICING +PRESOAK +PRESOAKED +PRESOAKING +PRESOAKS +PRESOLD +PRESOLVE +PRESOLVED +PRESOLVES +PRESOLVING +PRESONG +PRESORT +PRESORTED +PRESORTING +PRESORTS +PRESPECIFIED +PRESPECIFIES +PRESPECIFY +PRESPECIFYING +PRESPLIT +PRESS +PRESSBOARD +PRESSBOARDS +PRESSED +PRESSER +PRESSERS +PRESSES +PRESSGANG +PRESSGANGS +PRESSING +PRESSINGLY +PRESSINGS +PRESSMAN +PRESSMARK +PRESSMARKS +PRESSMEN +PRESSOR +PRESSORS +PRESSROOM +PRESSROOMS +PRESSRUN +PRESSRUNS +PRESSURE +PRESSURED +PRESSURELESS +PRESSURES +PRESSURING +PRESSURISE +PRESSURISED +PRESSURISES +PRESSURISING +PRESSURIZATION +PRESSURIZATIONS +PRESSURIZE +PRESSURIZED +PRESSURIZER +PRESSURIZERS +PRESSURIZES +PRESSURIZING +PRESSWORK +PRESSWORKS +PREST +PRESTAMP +PRESTAMPED +PRESTAMPING +PRESTAMPS +PRESTER +PRESTERILIZE +PRESTERILIZED +PRESTERILIZES +PRESTERILIZING +PRESTERNA +PRESTERNUM +PRESTERS +PRESTIDIGITATOR +PRESTIGE +PRESTIGEFUL +PRESTIGES +PRESTIGIOUS +PRESTIGIOUSLY +PRESTIGIOUSNESS +PRESTISSIMO +PRESTO +PRESTORAGE +PRESTORE +PRESTORED +PRESTORES +PRESTORING +PRESTOS +PRESTRESS +PRESTRESSED +PRESTRESSES +PRESTRESSING +PRESTRIKE +PRESTRUCTURE +PRESTRUCTURED +PRESTRUCTURES +PRESTRUCTURING +PRESTS +PRESUMABLE +PRESUMABLY +PRESUME +PRESUMED +PRESUMEDLY +PRESUMER +PRESUMERS +PRESUMES +PRESUMING +PRESUMINGLY +PRESUMMIT +PRESUMMITS +PRESUMPTION +PRESUMPTIONS +PRESUMPTIVE +PRESUMPTIVELY +PRESUMPTUOUS +PRESUMPTUOUSLY +PRESUPPOSE +PRESUPPOSED +PRESUPPOSES +PRESUPPOSING +PRESUPPOSITION +PRESUPPOSITIONS +PRESURGERY +PRESURVEY +PRESURVEYED +PRESURVEYING +PRESURVEYS +PRESWEETEN +PRESWEETENED +PRESWEETENING +PRESWEETENS +PRESYMPTOMATIC +PRESYNAPTIC +PRESYNAPTICALLY +PRETAPE +PRETAPED +PRETAPES +PRETAPING +PRETASTE +PRETASTED +PRETASTES +PRETASTING +PRETAX +PRETEEN +PRETEENS +PRETELEVISION +PRETELL +PRETELLING +PRETELLS +PRETENCE +PRETENCES +PRETEND +PRETENDED +PRETENDEDLY +PRETENDER +PRETENDERS +PRETENDING +PRETENDS +PRETENSE +PRETENSES +PRETENSION +PRETENSIONED +PRETENSIONING +PRETENSIONLESS +PRETENSIONS +PRETENTIOUS +PRETENTIOUSLY +PRETENTIOUSNESS +PRETERIT +PRETERITE +PRETERITES +PRETERITS +PRETERM +PRETERMINAL +PRETERMINATION +PRETERMINATIONS +PRETERMISSION +PRETERMISSIONS +PRETERMIT +PRETERMITS +PRETERMITTED +PRETERMITTING +PRETERMS +PRETERNATURAL +PRETERNATURALLY +PRETEST +PRETESTED +PRETESTING +PRETESTS +PRETEXT +PRETEXTED +PRETEXTING +PRETEXTS +PRETHEATER +PRETOLD +PRETOR +PRETORIAL +PRETORIAN +PRETORIANS +PRETORS +PRETOURNAMENT +PRETRAIN +PRETRAINED +PRETRAINING +PRETRAINS +PRETRAVEL +PRETREAT +PRETREATED +PRETREATING +PRETREATMENT +PRETREATMENTS +PRETREATS +PRETRIAL +PRETRIALS +PRETRIM +PRETRIMMED +PRETRIMMING +PRETRIMS +PRETTIED +PRETTIER +PRETTIES +PRETTIEST +PRETTIFICATION +PRETTIFICATIONS +PRETTIFIED +PRETTIFIER +PRETTIFIERS +PRETTIFIES +PRETTIFY +PRETTIFYING +PRETTILY +PRETTINESS +PRETTINESSES +PRETTY +PRETTYING +PRETTYISH +PRETYPE +PRETYPED +PRETYPES +PRETYPING +PRETZEL +PRETZELS +PREUNIFICATION +PREUNION +PREUNIONS +PREUNITE +PREUNITED +PREUNITES +PREUNITING +PREUNIVERSITY +PREVAIL +PREVAILED +PREVAILER +PREVAILERS +PREVAILING +PREVAILS +PREVALENCE +PREVALENCES +PREVALENT +PREVALENTLY +PREVALENTS +PREVALUE +PREVALUED +PREVALUES +PREVALUING +PREVARICATE +PREVARICATED +PREVARICATES +PREVARICATING +PREVARICATION +PREVARICATIONS +PREVARICATOR +PREVARICATORS +PREVENIENT +PREVENIENTLY +PREVENT +PREVENTABILITY +PREVENTABLE +PREVENTATIVE +PREVENTATIVES +PREVENTED +PREVENTER +PREVENTERS +PREVENTIBLE +PREVENTING +PREVENTION +PREVENTIONS +PREVENTIVE +PREVENTIVELY +PREVENTIVENESS +PREVENTIVES +PREVENTS +PREVERB +PREVERBAL +PREVERBS +PREVIABLE +PREVIEW +PREVIEWED +PREVIEWER +PREVIEWERS +PREVIEWING +PREVIEWS +PREVIOUS +PREVIOUSLY +PREVIOUSNESS +PREVIOUSNESSES +PREVISE +PREVISED +PREVISES +PREVISING +PREVISION +PREVISIONAL +PREVISIONARY +PREVISIONED +PREVISIONING +PREVISIONS +PREVISIT +PREVISITED +PREVISITING +PREVISITS +PREVISOR +PREVISORS +PREVOCALIC +PREVOCATIONAL +PREVUE +PREVUED +PREVUES +PREVUING +PREWAR +PREWARM +PREWARMED +PREWARMING +PREWARMS +PREWARN +PREWARNED +PREWARNING +PREWARNS +PREWASH +PREWASHED +PREWASHES +PREWASHING +PREWEANING +PREWEIGH +PREWEIGHED +PREWEIGHING +PREWEIGHS +PREWIRE +PREWIRED +PREWIRES +PREWIRING +PREWORK +PREWORKED +PREWORKING +PREWORKS +PREWORN +PREWRAP +PREWRAPPED +PREWRAPPING +PREWRAPS +PREWRITING +PREWRITINGS +PREX +PREXES +PREXIES +PREXY +PREY +PREYED +PREYER +PREYERS +PREYING +PREYS +PREZ +PREZES +PRIAPEAN +PRIAPI +PRIAPIC +PRIAPISM +PRIAPISMS +PRIAPUS +PRIAPUSES +PRICE +PRICEABLE +PRICED +PRICELESS +PRICELESSLY +PRICER +PRICERS +PRICES +PRICEY +PRICIER +PRICIEST +PRICILY +PRICING +PRICK +PRICKED +PRICKER +PRICKERS +PRICKET +PRICKETS +PRICKIER +PRICKIEST +PRICKING +PRICKINGS +PRICKLE +PRICKLED +PRICKLES +PRICKLIER +PRICKLIEST +PRICKLINESS +PRICKLINESSES +PRICKLING +PRICKLY +PRICKS +PRICKY +PRICY +PRIDE +PRIDED +PRIDEFUL +PRIDEFULLY +PRIDEFULNESS +PRIDEFULNESSES +PRIDES +PRIDING +PRIED +PRIEDIEU +PRIEDIEUS +PRIEDIEUX +PRIER +PRIERS +PRIES +PRIEST +PRIESTED +PRIESTESS +PRIESTESSES +PRIESTHOOD +PRIESTHOODS +PRIESTING +PRIESTLIER +PRIESTLIEST +PRIESTLINESS +PRIESTLINESSES +PRIESTLY +PRIESTS +PRIG +PRIGGED +PRIGGERIES +PRIGGERY +PRIGGING +PRIGGISH +PRIGGISHLY +PRIGGISHNESS +PRIGGISHNESSES +PRIGGISM +PRIGGISMS +PRIGS +PRILL +PRILLED +PRILLING +PRILLS +PRIM +PRIMA +PRIMACIES +PRIMACY +PRIMAGE +PRIMAGES +PRIMAL +PRIMALITIES +PRIMALITY +PRIMARIES +PRIMARILY +PRIMARY +PRIMAS +PRIMATAL +PRIMATALS +PRIMATE +PRIMATES +PRIMATESHIP +PRIMATESHIPS +PRIMATIAL +PRIMATIALS +PRIMATOLOGICAL +PRIMATOLOGIES +PRIMATOLOGIST +PRIMATOLOGISTS +PRIMATOLOGY +PRIMAVERA +PRIMAVERAS +PRIME +PRIMED +PRIMELY +PRIMENESS +PRIMENESSES +PRIMER +PRIMERO +PRIMEROS +PRIMERS +PRIMES +PRIMEVAL +PRIMEVALLY +PRIMI +PRIMINE +PRIMINES +PRIMING +PRIMINGS +PRIMIPARA +PRIMIPARAE +PRIMIPARAS +PRIMIPAROUS +PRIMITIVE +PRIMITIVELY +PRIMITIVENESS +PRIMITIVENESSES +PRIMITIVES +PRIMITIVISM +PRIMITIVISMS +PRIMITIVIST +PRIMITIVISTIC +PRIMITIVISTS +PRIMITIVITIES +PRIMITIVITY +PRIMLY +PRIMMED +PRIMMER +PRIMMEST +PRIMMING +PRIMNESS +PRIMNESSES +PRIMO +PRIMOGENITOR +PRIMOGENITORS +PRIMOGENITURE +PRIMOGENITURES +PRIMORDIA +PRIMORDIAL +PRIMORDIALLY +PRIMORDIUM +PRIMOS +PRIMP +PRIMPED +PRIMPING +PRIMPS +PRIMROSE +PRIMROSES +PRIMS +PRIMSIE +PRIMULA +PRIMULAS +PRIMUS +PRIMUSES +PRINCE +PRINCEDOM +PRINCEDOMS +PRINCEKIN +PRINCEKINS +PRINCELET +PRINCELETS +PRINCELIER +PRINCELIEST +PRINCELINESS +PRINCELINESSES +PRINCELING +PRINCELINGS +PRINCELY +PRINCES +PRINCESHIP +PRINCESHIPS +PRINCESS +PRINCESSE +PRINCESSES +PRINCIPAL +PRINCIPALITIES +PRINCIPALITY +PRINCIPALLY +PRINCIPALS +PRINCIPALSHIP +PRINCIPALSHIPS +PRINCIPE +PRINCIPI +PRINCIPIA +PRINCIPIUM +PRINCIPLE +PRINCIPLED +PRINCIPLES +PRINCOCK +PRINCOCKS +PRINCOX +PRINCOXES +PRINK +PRINKED +PRINKER +PRINKERS +PRINKING +PRINKS +PRINT +PRINTABILITIES +PRINTABILITY +PRINTABLE +PRINTED +PRINTER +PRINTERIES +PRINTERS +PRINTERY +PRINTHEAD +PRINTHEADS +PRINTING +PRINTINGS +PRINTLESS +PRINTMAKER +PRINTMAKERS +PRINTMAKING +PRINTMAKINGS +PRINTOUT +PRINTOUTS +PRINTS +PRION +PRIONS +PRIOR +PRIORATE +PRIORATES +PRIORESS +PRIORESSES +PRIORIES +PRIORITIES +PRIORITIZATION +PRIORITIZATIONS +PRIORITIZE +PRIORITIZED +PRIORITIZES +PRIORITIZING +PRIORITY +PRIORLY +PRIORS +PRIORSHIP +PRIORSHIPS +PRIORY +PRISE +PRISED +PRISERE +PRISERES +PRISES +PRISING +PRISM +PRISMATIC +PRISMATICALLY +PRISMATOID +PRISMATOIDS +PRISMOID +PRISMOIDAL +PRISMOIDS +PRISMS +PRISON +PRISONED +PRISONER +PRISONERS +PRISONING +PRISONS +PRISS +PRISSED +PRISSES +PRISSIER +PRISSIES +PRISSIEST +PRISSILY +PRISSINESS +PRISSINESSES +PRISSING +PRISSY +PRISTANE +PRISTANES +PRISTINE +PRISTINELY +PRITHEE +PRIVACIES +PRIVACY +PRIVATDOCENT +PRIVATDOCENTS +PRIVATDOZENT +PRIVATDOZENTS +PRIVATE +PRIVATEER +PRIVATEERED +PRIVATEERING +PRIVATEERS +PRIVATELY +PRIVATENESS +PRIVATENESSES +PRIVATER +PRIVATES +PRIVATEST +PRIVATION +PRIVATIONS +PRIVATISE +PRIVATISED +PRIVATISES +PRIVATISING +PRIVATISM +PRIVATISMS +PRIVATIST +PRIVATISTS +PRIVATIVE +PRIVATIVELY +PRIVATIVES +PRIVATIZATION +PRIVATIZATIONS +PRIVATIZE +PRIVATIZED +PRIVATIZES +PRIVATIZING +PRIVET +PRIVETS +PRIVIER +PRIVIES +PRIVIEST +PRIVILEGE +PRIVILEGED +PRIVILEGES +PRIVILEGING +PRIVILY +PRIVITIES +PRIVITY +PRIVY +PRIZE +PRIZED +PRIZEFIGHT +PRIZEFIGHTER +PRIZEFIGHTERS +PRIZEFIGHTING +PRIZEFIGHTINGS +PRIZEFIGHTS +PRIZER +PRIZERS +PRIZES +PRIZEWINNER +PRIZEWINNERS +PRIZEWINNING +PRIZING +PRO +PROA +PROABORTION +PROACTION +PROACTIONS +PROACTIVE +PROAS +PROBABILISM +PROBABILISMS +PROBABILIST +PROBABILISTIC +PROBABILISTS +PROBABILITIES +PROBABILITY +PROBABLE +PROBABLES +PROBABLY +PROBAND +PROBANDS +PROBANG +PROBANGS +PROBATE +PROBATED +PROBATES +PROBATING +PROBATION +PROBATIONAL +PROBATIONALLY +PROBATIONARY +PROBATIONER +PROBATIONERS +PROBATIONS +PROBATIVE +PROBATORY +PROBE +PROBED +PROBENECID +PROBENECIDS +PROBER +PROBERS +PROBES +PROBING +PROBINGLY +PROBIOTIC +PROBIOTICS +PROBIT +PROBITIES +PROBITS +PROBITY +PROBLEM +PROBLEMATIC +PROBLEMATICAL +PROBLEMATICALLY +PROBLEMATICS +PROBLEMS +PROBOSCIDEAN +PROBOSCIDEANS +PROBOSCIDES +PROBOSCIDIAN +PROBOSCIDIANS +PROBOSCIS +PROBOSCISES +PROCAINE +PROCAINES +PROCAMBIA +PROCAMBIAL +PROCAMBIUM +PROCAMBIUMS +PROCARBAZINE +PROCARBAZINES +PROCARP +PROCARPS +PROCARYOTE +PROCARYOTES +PROCATHEDRAL +PROCATHEDRALS +PROCEDURAL +PROCEDURALLY +PROCEDURALS +PROCEDURE +PROCEDURES +PROCEED +PROCEEDED +PROCEEDER +PROCEEDERS +PROCEEDING +PROCEEDINGS +PROCEEDS +PROCEPHALIC +PROCERCOID +PROCERCOIDS +PROCESS +PROCESSABILITY +PROCESSABLE +PROCESSED +PROCESSER +PROCESSERS +PROCESSES +PROCESSIBILITY +PROCESSIBLE +PROCESSING +PROCESSION +PROCESSIONAL +PROCESSIONALLY +PROCESSIONALS +PROCESSIONED +PROCESSIONING +PROCESSIONS +PROCESSOR +PROCESSORS +PROCHAIN +PROCHEIN +PROCHOICE +PROCHURCH +PROCLAIM +PROCLAIMED +PROCLAIMER +PROCLAIMERS +PROCLAIMING +PROCLAIMS +PROCLAMATION +PROCLAMATIONS +PROCLISES +PROCLISIS +PROCLITIC +PROCLITICS +PROCLIVITIES +PROCLIVITY +PROCONSUL +PROCONSULAR +PROCONSULATE +PROCONSULATES +PROCONSULS +PROCONSULSHIP +PROCONSULSHIPS +PROCRASTINATE +PROCRASTINATED +PROCRASTINATES +PROCRASTINATING +PROCRASTINATION +PROCRASTINATOR +PROCRASTINATORS +PROCREANT +PROCREATE +PROCREATED +PROCREATES +PROCREATING +PROCREATION +PROCREATIONS +PROCREATIVE +PROCREATOR +PROCREATORS +PROCRUSTEAN +PROCRYPTIC +PROCTITIDES +PROCTITIS +PROCTITISES +PROCTODAEA +PROCTODAEUM +PROCTODAEUMS +PROCTODEA +PROCTODEUM +PROCTODEUMS +PROCTOLOGIC +PROCTOLOGICAL +PROCTOLOGIES +PROCTOLOGIST +PROCTOLOGISTS +PROCTOLOGY +PROCTOR +PROCTORED +PROCTORIAL +PROCTORING +PROCTORS +PROCTORSHIP +PROCTORSHIPS +PROCUMBENT +PROCURABLE +PROCURAL +PROCURALS +PROCURATION +PROCURATIONS +PROCURATOR +PROCURATORIAL +PROCURATORS +PROCURE +PROCURED +PROCUREMENT +PROCUREMENTS +PROCURER +PROCURERS +PROCURES +PROCURESS +PROCURESSES +PROCURING +PROD +PRODDED +PRODDER +PRODDERS +PRODDING +PRODIGAL +PRODIGALITIES +PRODIGALITY +PRODIGALLY +PRODIGALS +PRODIGIES +PRODIGIOUS +PRODIGIOUSLY +PRODIGIOUSNESS +PRODIGY +PRODROMAL +PRODROMATA +PRODROME +PRODROMES +PRODROMIC +PRODRUG +PRODRUGS +PRODS +PRODUCE +PRODUCED +PRODUCER +PRODUCERS +PRODUCES +PRODUCIBLE +PRODUCING +PRODUCT +PRODUCTION +PRODUCTIONAL +PRODUCTIONS +PRODUCTIVE +PRODUCTIVELY +PRODUCTIVENESS +PRODUCTIVITIES +PRODUCTIVITY +PRODUCTS +PROEM +PROEMIAL +PROEMS +PROENZYME +PROENZYMES +PROESTRUS +PROESTRUSES +PROETTE +PROETTES +PROF +PROFAMILY +PROFANATION +PROFANATIONS +PROFANATORY +PROFANE +PROFANED +PROFANELY +PROFANENESS +PROFANENESSES +PROFANER +PROFANERS +PROFANES +PROFANING +PROFANITIES +PROFANITY +PROFESS +PROFESSED +PROFESSEDLY +PROFESSES +PROFESSING +PROFESSION +PROFESSIONAL +PROFESSIONALISM +PROFESSIONALIZE +PROFESSIONALLY +PROFESSIONALS +PROFESSIONS +PROFESSOR +PROFESSORATE +PROFESSORATES +PROFESSORIAL +PROFESSORIALLY +PROFESSORIAT +PROFESSORIATE +PROFESSORIATES +PROFESSORIATS +PROFESSORS +PROFESSORSHIP +PROFESSORSHIPS +PROFFER +PROFFERED +PROFFERER +PROFFERERS +PROFFERING +PROFFERS +PROFICIENCIES +PROFICIENCY +PROFICIENT +PROFICIENTLY +PROFICIENTS +PROFILE +PROFILED +PROFILER +PROFILERS +PROFILES +PROFILING +PROFILINGS +PROFIT +PROFITABILITIES +PROFITABILITY +PROFITABLE +PROFITABLENESS +PROFITABLY +PROFITED +PROFITEER +PROFITEERED +PROFITEERING +PROFITEERS +PROFITER +PROFITEROLE +PROFITEROLES +PROFITERS +PROFITING +PROFITLESS +PROFITS +PROFITWISE +PROFLIGACIES +PROFLIGACY +PROFLIGATE +PROFLIGATELY +PROFLIGATES +PROFLUENT +PROFORMA +PROFOUND +PROFOUNDER +PROFOUNDEST +PROFOUNDLY +PROFOUNDNESS +PROFOUNDNESSES +PROFOUNDS +PROFS +PROFUNDITIES +PROFUNDITY +PROFUSE +PROFUSELY +PROFUSENESS +PROFUSENESSES +PROFUSION +PROFUSIONS +PROFUSIVE +PROG +PROGENIES +PROGENITOR +PROGENITORS +PROGENY +PROGERIA +PROGERIAS +PROGESTATIONAL +PROGESTERONE +PROGESTERONES +PROGESTIN +PROGESTINS +PROGESTOGEN +PROGESTOGENIC +PROGESTOGENS +PROGGED +PROGGER +PROGGERS +PROGGING +PROGLOTTID +PROGLOTTIDES +PROGLOTTIDS +PROGLOTTIS +PROGNATHISM +PROGNATHISMS +PROGNATHOUS +PROGNOSE +PROGNOSED +PROGNOSES +PROGNOSING +PROGNOSIS +PROGNOSTIC +PROGNOSTICATE +PROGNOSTICATED +PROGNOSTICATES +PROGNOSTICATING +PROGNOSTICATION +PROGNOSTICATIVE +PROGNOSTICATOR +PROGNOSTICATORS +PROGNOSTICS +PROGRADE +PROGRAM +PROGRAMED +PROGRAMER +PROGRAMERS +PROGRAMING +PROGRAMINGS +PROGRAMMABILITY +PROGRAMMABLE +PROGRAMMABLES +PROGRAMMATIC +PROGRAMME +PROGRAMMED +PROGRAMMER +PROGRAMMERS +PROGRAMMES +PROGRAMMING +PROGRAMMINGS +PROGRAMS +PROGRESS +PROGRESSED +PROGRESSES +PROGRESSING +PROGRESSION +PROGRESSIONAL +PROGRESSIONS +PROGRESSIVE +PROGRESSIVELY +PROGRESSIVENESS +PROGRESSIVES +PROGRESSIVISM +PROGRESSIVISMS +PROGRESSIVIST +PROGRESSIVISTIC +PROGRESSIVISTS +PROGRESSIVITIES +PROGRESSIVITY +PROGS +PROGUN +PROHIBIT +PROHIBITED +PROHIBITING +PROHIBITION +PROHIBITIONIST +PROHIBITIONISTS +PROHIBITIONS +PROHIBITIVE +PROHIBITIVELY +PROHIBITIVENESS +PROHIBITORY +PROHIBITS +PROINSULIN +PROINSULINS +PROJECT +PROJECTABLE +PROJECTED +PROJECTILE +PROJECTILES +PROJECTING +PROJECTION +PROJECTIONAL +PROJECTIONIST +PROJECTIONISTS +PROJECTIONS +PROJECTIVE +PROJECTIVELY +PROJECTOR +PROJECTORS +PROJECTS +PROJET +PROJETS +PROKARYOTE +PROKARYOTES +PROKARYOTIC +PROLABOR +PROLACTIN +PROLACTINS +PROLAMIN +PROLAMINE +PROLAMINES +PROLAMINS +PROLAN +PROLANS +PROLAPSE +PROLAPSED +PROLAPSES +PROLAPSING +PROLAPSUS +PROLATE +PROLATELY +PROLE +PROLEG +PROLEGOMENA +PROLEGOMENON +PROLEGOMENOUS +PROLEGS +PROLEPSES +PROLEPSIS +PROLEPTIC +PROLEPTICALLY +PROLES +PROLETARIAN +PROLETARIANISE +PROLETARIANISED +PROLETARIANISES +PROLETARIANIZE +PROLETARIANIZED +PROLETARIANIZES +PROLETARIANS +PROLETARIAT +PROLETARIATS +PROLETARIES +PROLETARY +PROLIFERATE +PROLIFERATED +PROLIFERATES +PROLIFERATING +PROLIFERATION +PROLIFERATIONS +PROLIFERATIVE +PROLIFIC +PROLIFICACIES +PROLIFICACY +PROLIFICALLY +PROLIFICITIES +PROLIFICITY +PROLIFICNESS +PROLIFICNESSES +PROLINE +PROLINES +PROLIX +PROLIXITIES +PROLIXITY +PROLIXLY +PROLOCUTOR +PROLOCUTORS +PROLOG +PROLOGED +PROLOGING +PROLOGIST +PROLOGISTS +PROLOGIZE +PROLOGIZED +PROLOGIZES +PROLOGIZING +PROLOGS +PROLOGUE +PROLOGUED +PROLOGUES +PROLOGUING +PROLOGUIZE +PROLOGUIZED +PROLOGUIZES +PROLOGUIZING +PROLONG +PROLONGATION +PROLONGATIONS +PROLONGE +PROLONGED +PROLONGER +PROLONGERS +PROLONGES +PROLONGING +PROLONGS +PROLUSION +PROLUSIONS +PROLUSORY +PROM +PROMENADE +PROMENADED +PROMENADER +PROMENADERS +PROMENADES +PROMENADING +PROMETHIUM +PROMETHIUMS +PROMETRIC +PROMINE +PROMINENCE +PROMINENCES +PROMINENT +PROMINENTLY +PROMINES +PROMISCUITIES +PROMISCUITY +PROMISCUOUS +PROMISCUOUSLY +PROMISCUOUSNESS +PROMISE +PROMISED +PROMISEE +PROMISEES +PROMISER +PROMISERS +PROMISES +PROMISING +PROMISINGLY +PROMISOR +PROMISORS +PROMISSORY +PROMO +PROMODERN +PROMOED +PROMOING +PROMONTORIES +PROMONTORY +PROMOS +PROMOTABILITIES +PROMOTABILITY +PROMOTABLE +PROMOTE +PROMOTED +PROMOTER +PROMOTERS +PROMOTES +PROMOTING +PROMOTION +PROMOTIONAL +PROMOTIONS +PROMOTIVE +PROMOTIVENESS +PROMOTIVENESSES +PROMPT +PROMPTBOOK +PROMPTBOOKS +PROMPTED +PROMPTER +PROMPTERS +PROMPTEST +PROMPTING +PROMPTITUDE +PROMPTITUDES +PROMPTLY +PROMPTNESS +PROMPTNESSES +PROMPTS +PROMS +PROMULGATE +PROMULGATED +PROMULGATES +PROMULGATING +PROMULGATION +PROMULGATIONS +PROMULGATOR +PROMULGATORS +PROMULGE +PROMULGED +PROMULGES +PROMULGING +PRONATE +PRONATED +PRONATES +PRONATING +PRONATION +PRONATIONS +PRONATOR +PRONATORES +PRONATORS +PRONE +PRONELY +PRONENESS +PRONENESSES +PRONEPHRA +PRONEPHRIC +PRONEPHROI +PRONEPHROS +PRONEPHROSES +PRONG +PRONGED +PRONGHORN +PRONGHORNS +PRONGING +PRONGS +PRONOMINAL +PRONOMINALLY +PRONOTA +PRONOTUM +PRONOUN +PRONOUNCE +PRONOUNCEABLE +PRONOUNCED +PRONOUNCEDLY +PRONOUNCEMENT +PRONOUNCEMENTS +PRONOUNCER +PRONOUNCERS +PRONOUNCES +PRONOUNCING +PRONOUNS +PRONTO +PRONUCLEAR +PRONUCLEI +PRONUCLEUS +PRONUCLEUSES +PRONUNCIAMENTO +PRONUNCIAMENTOS +PRONUNCIATION +PRONUNCIATIONAL +PRONUNCIATIONS +PROOF +PROOFED +PROOFER +PROOFERS +PROOFING +PROOFREAD +PROOFREADER +PROOFREADERS +PROOFREADING +PROOFREADS +PROOFROOM +PROOFROOMS +PROOFS +PROP +PROPAEDEUTIC +PROPAEDEUTICS +PROPAGABLE +PROPAGANDA +PROPAGANDAS +PROPAGANDIST +PROPAGANDISTIC +PROPAGANDISTS +PROPAGANDIZE +PROPAGANDIZED +PROPAGANDIZER +PROPAGANDIZERS +PROPAGANDIZES +PROPAGANDIZING +PROPAGATE +PROPAGATED +PROPAGATES +PROPAGATING +PROPAGATION +PROPAGATIONS +PROPAGATIVE +PROPAGATOR +PROPAGATORS +PROPAGULE +PROPAGULES +PROPANE +PROPANES +PROPEL +PROPELLANT +PROPELLANTS +PROPELLED +PROPELLENT +PROPELLENTS +PROPELLER +PROPELLERS +PROPELLING +PROPELLOR +PROPELLORS +PROPELS +PROPEND +PROPENDED +PROPENDING +PROPENDS +PROPENE +PROPENES +PROPENOL +PROPENOLS +PROPENSE +PROPENSITIES +PROPENSITY +PROPENYL +PROPER +PROPERDIN +PROPERDINS +PROPERER +PROPEREST +PROPERLY +PROPERNESS +PROPERNESSES +PROPERS +PROPERTIED +PROPERTIES +PROPERTY +PROPERTYLESS +PROPHAGE +PROPHAGES +PROPHASE +PROPHASES +PROPHASIC +PROPHECIES +PROPHECY +PROPHESIED +PROPHESIER +PROPHESIERS +PROPHESIES +PROPHESY +PROPHESYING +PROPHET +PROPHETESS +PROPHETESSES +PROPHETHOOD +PROPHETHOODS +PROPHETIC +PROPHETICAL +PROPHETICALLY +PROPHETS +PROPHYLACTIC +PROPHYLACTICS +PROPHYLAXES +PROPHYLAXIS +PROPINE +PROPINED +PROPINES +PROPINING +PROPINQUITIES +PROPINQUITY +PROPIONATE +PROPIONATES +PROPITIATE +PROPITIATED +PROPITIATES +PROPITIATING +PROPITIATION +PROPITIATIONS +PROPITIATOR +PROPITIATORS +PROPITIATORY +PROPITIOUS +PROPITIOUSLY +PROPITIOUSNESS +PROPJET +PROPJETS +PROPLASTID +PROPLASTIDS +PROPMAN +PROPMEN +PROPOLIS +PROPOLISES +PROPONE +PROPONED +PROPONENT +PROPONENTS +PROPONES +PROPONING +PROPORTION +PROPORTIONABLE +PROPORTIONABLY +PROPORTIONAL +PROPORTIONALITY +PROPORTIONALLY +PROPORTIONALS +PROPORTIONATE +PROPORTIONATED +PROPORTIONATELY +PROPORTIONATES +PROPORTIONATING +PROPORTIONED +PROPORTIONING +PROPORTIONS +PROPOSAL +PROPOSALS +PROPOSE +PROPOSED +PROPOSER +PROPOSERS +PROPOSES +PROPOSING +PROPOSITI +PROPOSITION +PROPOSITIONAL +PROPOSITIONED +PROPOSITIONING +PROPOSITIONS +PROPOSITUS +PROPOUND +PROPOUNDED +PROPOUNDER +PROPOUNDERS +PROPOUNDING +PROPOUNDS +PROPOXYPHENE +PROPOXYPHENES +PROPPED +PROPPING +PROPRAETOR +PROPRAETORS +PROPRANOLOL +PROPRANOLOLS +PROPRETOR +PROPRETORS +PROPRIA +PROPRIETARIES +PROPRIETARY +PROPRIETIES +PROPRIETOR +PROPRIETORIAL +PROPRIETORS +PROPRIETORSHIP +PROPRIETORSHIPS +PROPRIETRESS +PROPRIETRESSES +PROPRIETY +PROPRIOCEPTION +PROPRIOCEPTIONS +PROPRIOCEPTIVE +PROPRIOCEPTOR +PROPRIOCEPTORS +PROPRIUM +PROPS +PROPTOSES +PROPTOSIS +PROPULSION +PROPULSIONS +PROPULSIVE +PROPYL +PROPYLA +PROPYLAEA +PROPYLAEUM +PROPYLENE +PROPYLENES +PROPYLIC +PROPYLITE +PROPYLITES +PROPYLON +PROPYLS +PRORATE +PRORATED +PRORATES +PRORATING +PRORATION +PRORATIONS +PROREFORM +PROROGATE +PROROGATED +PROROGATES +PROROGATING +PROROGATION +PROROGATIONS +PROROGUE +PROROGUED +PROROGUES +PROROGUING +PROS +PROSAIC +PROSAICAL +PROSAICALLY +PROSAISM +PROSAISMS +PROSAIST +PROSAISTS +PROSATEUR +PROSATEURS +PROSAUROPOD +PROSAUROPODS +PROSCENIA +PROSCENIUM +PROSCENIUMS +PROSCIUTTI +PROSCIUTTO +PROSCIUTTOS +PROSCRIBE +PROSCRIBED +PROSCRIBER +PROSCRIBERS +PROSCRIBES +PROSCRIBING +PROSCRIPTION +PROSCRIPTIONS +PROSCRIPTIVE +PROSCRIPTIVELY +PROSE +PROSECT +PROSECTED +PROSECTING +PROSECTOR +PROSECTORS +PROSECTS +PROSECUTABLE +PROSECUTE +PROSECUTED +PROSECUTES +PROSECUTING +PROSECUTION +PROSECUTIONS +PROSECUTOR +PROSECUTORIAL +PROSECUTORS +PROSED +PROSELYTE +PROSELYTED +PROSELYTES +PROSELYTING +PROSELYTISE +PROSELYTISED +PROSELYTISES +PROSELYTISING +PROSELYTISM +PROSELYTISMS +PROSELYTIZATION +PROSELYTIZE +PROSELYTIZED +PROSELYTIZER +PROSELYTIZERS +PROSELYTIZES +PROSELYTIZING +PROSEMINAR +PROSEMINARS +PROSENCEPHALA +PROSENCEPHALIC +PROSENCEPHALON +PROSER +PROSERS +PROSES +PROSIER +PROSIEST +PROSILY +PROSIMIAN +PROSIMIANS +PROSINESS +PROSINESSES +PROSING +PROSIT +PROSO +PROSOBRANCH +PROSOBRANCHS +PROSODIC +PROSODICAL +PROSODICALLY +PROSODIES +PROSODIST +PROSODISTS +PROSODY +PROSOMA +PROSOMAL +PROSOMAS +PROSOMATA +PROSOPOGRAPHIES +PROSOPOGRAPHY +PROSOPOPOEIA +PROSOPOPOEIAS +PROSOS +PROSPECT +PROSPECTED +PROSPECTING +PROSPECTIVE +PROSPECTIVELY +PROSPECTOR +PROSPECTORS +PROSPECTS +PROSPECTUS +PROSPECTUSES +PROSPER +PROSPERED +PROSPERING +PROSPERITIES +PROSPERITY +PROSPEROUS +PROSPEROUSLY +PROSPEROUSNESS +PROSPERS +PROSS +PROSSES +PROSSIE +PROSSIES +PROST +PROSTACYCLIN +PROSTACYCLINS +PROSTAGLANDIN +PROSTAGLANDINS +PROSTATE +PROSTATECTOMIES +PROSTATECTOMY +PROSTATES +PROSTATIC +PROSTATISM +PROSTATISMS +PROSTATITIS +PROSTATITISES +PROSTHESES +PROSTHESIS +PROSTHETIC +PROSTHETICALLY +PROSTHETICS +PROSTHETIST +PROSTHETISTS +PROSTHODONTICS +PROSTHODONTIST +PROSTHODONTISTS +PROSTIE +PROSTIES +PROSTITUTE +PROSTITUTED +PROSTITUTES +PROSTITUTING +PROSTITUTION +PROSTITUTIONS +PROSTITUTOR +PROSTITUTORS +PROSTOMIA +PROSTOMIAL +PROSTOMIUM +PROSTRATE +PROSTRATED +PROSTRATES +PROSTRATING +PROSTRATION +PROSTRATIONS +PROSTYLE +PROSTYLES +PROSY +PROTACTINIUM +PROTACTINIUMS +PROTAGONIST +PROTAGONISTS +PROTAMIN +PROTAMINE +PROTAMINES +PROTAMINS +PROTASES +PROTASIS +PROTATIC +PROTEA +PROTEAN +PROTEANS +PROTEAS +PROTEASE +PROTEASES +PROTECT +PROTECTANT +PROTECTANTS +PROTECTED +PROTECTER +PROTECTERS +PROTECTING +PROTECTION +PROTECTIONISM +PROTECTIONISMS +PROTECTIONIST +PROTECTIONISTS +PROTECTIONS +PROTECTIVE +PROTECTIVELY +PROTECTIVENESS +PROTECTOR +PROTECTORAL +PROTECTORATE +PROTECTORATES +PROTECTORIES +PROTECTORS +PROTECTORSHIP +PROTECTORSHIPS +PROTECTORY +PROTECTRESS +PROTECTRESSES +PROTECTS +PROTEGE +PROTEGEE +PROTEGEES +PROTEGES +PROTEI +PROTEID +PROTEIDE +PROTEIDES +PROTEIDS +PROTEIN +PROTEINACEOUS +PROTEINASE +PROTEINASES +PROTEINIC +PROTEINS +PROTEINURIA +PROTEINURIAS +PROTEND +PROTENDED +PROTENDING +PROTENDS +PROTENSIVE +PROTENSIVELY +PROTEOGLYCAN +PROTEOGLYCANS +PROTEOLYSES +PROTEOLYSIS +PROTEOLYTIC +PROTEOLYTICALLY +PROTEOME +PROTEOMES +PROTEOMIC +PROTEOSE +PROTEOSES +PROTEST +PROTESTANT +PROTESTANTS +PROTESTATION +PROTESTATIONS +PROTESTED +PROTESTER +PROTESTERS +PROTESTING +PROTESTOR +PROTESTORS +PROTESTS +PROTEUS +PROTEUSES +PROTHALAMIA +PROTHALAMION +PROTHALAMIUM +PROTHALLI +PROTHALLIA +PROTHALLIUM +PROTHALLUS +PROTHALLUSES +PROTHESES +PROTHESIS +PROTHETIC +PROTHONOTARIAL +PROTHONOTARIES +PROTHONOTARY +PROTHORACES +PROTHORACIC +PROTHORAX +PROTHORAXES +PROTHROMBIN +PROTHROMBINS +PROTIST +PROTISTAN +PROTISTANS +PROTISTIC +PROTISTS +PROTIUM +PROTIUMS +PROTOCOL +PROTOCOLED +PROTOCOLING +PROTOCOLLED +PROTOCOLLING +PROTOCOLS +PROTODERM +PROTODERMS +PROTOGALAXIES +PROTOGALAXY +PROTOHISTORIAN +PROTOHISTORIANS +PROTOHISTORIC +PROTOHISTORIES +PROTOHISTORY +PROTOHUMAN +PROTOHUMANS +PROTOLANGUAGE +PROTOLANGUAGES +PROTOMARTYR +PROTOMARTYRS +PROTON +PROTONATE +PROTONATED +PROTONATES +PROTONATING +PROTONATION +PROTONATIONS +PROTONEMA +PROTONEMAL +PROTONEMATA +PROTONEMATAL +PROTONIC +PROTONOTARIES +PROTONOTARY +PROTONS +PROTOPATHIC +PROTOPHLOEM +PROTOPHLOEMS +PROTOPLANET +PROTOPLANETARY +PROTOPLANETS +PROTOPLASM +PROTOPLASMIC +PROTOPLASMS +PROTOPLAST +PROTOPLASTS +PROTOPOD +PROTOPODS +PROTOPORPHYRIN +PROTOPORPHYRINS +PROTOSTAR +PROTOSTARS +PROTOSTELE +PROTOSTELES +PROTOSTELIC +PROTOSTOME +PROTOSTOMES +PROTOTROPH +PROTOTROPHIC +PROTOTROPHIES +PROTOTROPHS +PROTOTROPHY +PROTOTYPAL +PROTOTYPE +PROTOTYPED +PROTOTYPES +PROTOTYPIC +PROTOTYPICAL +PROTOTYPICALLY +PROTOTYPING +PROTOXID +PROTOXIDE +PROTOXIDES +PROTOXIDS +PROTOXYLEM +PROTOXYLEMS +PROTOZOA +PROTOZOAL +PROTOZOAN +PROTOZOANS +PROTOZOIC +PROTOZOOLOGIES +PROTOZOOLOGIST +PROTOZOOLOGISTS +PROTOZOOLOGY +PROTOZOON +PROTOZOONS +PROTRACT +PROTRACTED +PROTRACTILE +PROTRACTING +PROTRACTION +PROTRACTIONS +PROTRACTIVE +PROTRACTOR +PROTRACTORS +PROTRACTS +PROTRADE +PROTREPTIC +PROTREPTICS +PROTRUDE +PROTRUDED +PROTRUDES +PROTRUDING +PROTRUSIBLE +PROTRUSION +PROTRUSIONS +PROTRUSIVE +PROTRUSIVELY +PROTRUSIVENESS +PROTUBERANCE +PROTUBERANCES +PROTUBERANT +PROTUBERANTLY +PROTYL +PROTYLE +PROTYLES +PROTYLS +PROUD +PROUDER +PROUDEST +PROUDFUL +PROUDHEARTED +PROUDLY +PROUDNESS +PROUDNESSES +PROUNION +PROUSTITE +PROUSTITES +PROVABLE +PROVABLENESS +PROVABLENESSES +PROVABLY +PROVASCULAR +PROVE +PROVED +PROVEN +PROVENANCE +PROVENANCES +PROVENDER +PROVENDERS +PROVENIENCE +PROVENIENCES +PROVENLY +PROVENTRICULI +PROVENTRICULUS +PROVER +PROVERB +PROVERBED +PROVERBIAL +PROVERBIALLY +PROVERBING +PROVERBS +PROVERS +PROVES +PROVIDE +PROVIDED +PROVIDENCE +PROVIDENCES +PROVIDENT +PROVIDENTIAL +PROVIDENTIALLY +PROVIDENTLY +PROVIDER +PROVIDERS +PROVIDES +PROVIDING +PROVINCE +PROVINCES +PROVINCIAL +PROVINCIALISM +PROVINCIALISMS +PROVINCIALIST +PROVINCIALISTS +PROVINCIALITIES +PROVINCIALITY +PROVINCIALIZE +PROVINCIALIZED +PROVINCIALIZES +PROVINCIALIZING +PROVINCIALLY +PROVINCIALS +PROVING +PROVIRAL +PROVIRUS +PROVIRUSES +PROVISION +PROVISIONAL +PROVISIONALLY +PROVISIONALS +PROVISIONARY +PROVISIONED +PROVISIONER +PROVISIONERS +PROVISIONING +PROVISIONS +PROVISO +PROVISOES +PROVISORY +PROVISOS +PROVITAMIN +PROVITAMINS +PROVOCATEUR +PROVOCATEURS +PROVOCATION +PROVOCATIONS +PROVOCATIVE +PROVOCATIVELY +PROVOCATIVENESS +PROVOCATIVES +PROVOKE +PROVOKED +PROVOKER +PROVOKERS +PROVOKES +PROVOKING +PROVOKINGLY +PROVOLONE +PROVOLONES +PROVOST +PROVOSTS +PROW +PROWAR +PROWER +PROWESS +PROWESSES +PROWEST +PROWL +PROWLED +PROWLER +PROWLERS +PROWLING +PROWLS +PROWS +PROXEMIC +PROXEMICS +PROXIES +PROXIMAL +PROXIMALLY +PROXIMATE +PROXIMATELY +PROXIMATENESS +PROXIMATENESSES +PROXIMITIES +PROXIMITY +PROXIMO +PROXY +PRUDE +PRUDENCE +PRUDENCES +PRUDENT +PRUDENTIAL +PRUDENTIALLY +PRUDENTLY +PRUDERIES +PRUDERY +PRUDES +PRUDISH +PRUDISHLY +PRUDISHNESS +PRUDISHNESSES +PRUINOSE +PRUNABLE +PRUNE +PRUNED +PRUNELLA +PRUNELLAS +PRUNELLE +PRUNELLES +PRUNELLO +PRUNELLOS +PRUNER +PRUNERS +PRUNES +PRUNING +PRUNUS +PRUNUSES +PRURIENCE +PRURIENCES +PRURIENCIES +PRURIENCY +PRURIENT +PRURIENTLY +PRURIGO +PRURIGOS +PRURITIC +PRURITUS +PRURITUSES +PRUSSIANISE +PRUSSIANISED +PRUSSIANISES +PRUSSIANISING +PRUSSIANIZATION +PRUSSIANIZE +PRUSSIANIZED +PRUSSIANIZES +PRUSSIANIZING +PRUSSIATE +PRUSSIATES +PRUSSIC +PRUTA +PRUTAH +PRUTOT +PRUTOTH +PRY +PRYER +PRYERS +PRYING +PRYINGLY +PRYTHEE +PSALM +PSALMBOOK +PSALMBOOKS +PSALMED +PSALMIC +PSALMING +PSALMIST +PSALMISTS +PSALMODIC +PSALMODIES +PSALMODY +PSALMS +PSALTER +PSALTERIA +PSALTERIES +PSALTERIUM +PSALTERS +PSALTERY +PSALTRIES +PSALTRY +PSAMMITE +PSAMMITES +PSAMMITIC +PSAMMON +PSAMMONS +PSCHENT +PSCHENTS +PSEPHITE +PSEPHITES +PSEPHITIC +PSEPHOLOGICAL +PSEPHOLOGIES +PSEPHOLOGIST +PSEPHOLOGISTS +PSEPHOLOGY +PSEUD +PSEUDEPIGRAPH +PSEUDEPIGRAPHA +PSEUDEPIGRAPHON +PSEUDEPIGRAPHS +PSEUDEPIGRAPHY +PSEUDO +PSEUDOALLELE +PSEUDOALLELES +PSEUDOCLASSIC +PSEUDOCLASSICS +PSEUDOCOEL +PSEUDOCOELOMATE +PSEUDOCOELS +PSEUDOCYESES +PSEUDOCYESIS +PSEUDOMONAD +PSEUDOMONADES +PSEUDOMONADS +PSEUDOMONAS +PSEUDOMORPH +PSEUDOMORPHIC +PSEUDOMORPHISM +PSEUDOMORPHISMS +PSEUDOMORPHOUS +PSEUDOMORPHS +PSEUDONYM +PSEUDONYMITIES +PSEUDONYMITY +PSEUDONYMOUS +PSEUDONYMOUSLY +PSEUDONYMS +PSEUDOPOD +PSEUDOPODAL +PSEUDOPODIA +PSEUDOPODIAL +PSEUDOPODIUM +PSEUDOPODS +PSEUDOPREGNANCY +PSEUDOPREGNANT +PSEUDORANDOM +PSEUDOS +PSEUDOSCIENCE +PSEUDOSCIENCES +PSEUDOSCIENTIST +PSEUDOSCORPION +PSEUDOSCORPIONS +PSEUDS +PSHAW +PSHAWED +PSHAWING +PSHAWS +PSI +PSILOCIN +PSILOCINS +PSILOCYBIN +PSILOCYBINS +PSILOPHYTE +PSILOPHYTES +PSILOPHYTIC +PSILOSES +PSILOSIS +PSILOTIC +PSIS +PSITTACINE +PSITTACINES +PSITTACOSES +PSITTACOSIS +PSITTACOTIC +PSOAE +PSOAI +PSOAS +PSOATIC +PSOCID +PSOCIDS +PSORALEA +PSORALEAS +PSORALEN +PSORALENS +PSORIASES +PSORIASIS +PSORIATIC +PSORIATICS +PSST +PST +PSYCH +PSYCHASTHENIA +PSYCHASTHENIAS +PSYCHASTHENIC +PSYCHASTHENICS +PSYCHE +PSYCHED +PSYCHEDELIA +PSYCHEDELIAS +PSYCHEDELIC +PSYCHEDELICALLY +PSYCHEDELICS +PSYCHES +PSYCHIATRIC +PSYCHIATRICALLY +PSYCHIATRIES +PSYCHIATRIST +PSYCHIATRISTS +PSYCHIATRY +PSYCHIC +PSYCHICAL +PSYCHICALLY +PSYCHICS +PSYCHING +PSYCHO +PSYCHOACOUSTIC +PSYCHOACOUSTICS +PSYCHOACTIVE +PSYCHOANALYSES +PSYCHOANALYSIS +PSYCHOANALYST +PSYCHOANALYSTS +PSYCHOANALYTIC +PSYCHOANALYZE +PSYCHOANALYZED +PSYCHOANALYZES +PSYCHOANALYZING +PSYCHOBABBLE +PSYCHOBABBLER +PSYCHOBABBLERS +PSYCHOBABBLES +PSYCHOBIOGRAPHY +PSYCHOBIOLOGIC +PSYCHOBIOLOGIES +PSYCHOBIOLOGIST +PSYCHOBIOLOGY +PSYCHOCHEMICAL +PSYCHOCHEMICALS +PSYCHODRAMA +PSYCHODRAMAS +PSYCHODRAMATIC +PSYCHODYNAMIC +PSYCHODYNAMICS +PSYCHOGENESES +PSYCHOGENESIS +PSYCHOGENETIC +PSYCHOGENIC +PSYCHOGENICALLY +PSYCHOGRAPH +PSYCHOGRAPHS +PSYCHOHISTORIAN +PSYCHOHISTORIES +PSYCHOHISTORY +PSYCHOKINESES +PSYCHOKINESIS +PSYCHOKINETIC +PSYCHOLINGUIST +PSYCHOLINGUISTS +PSYCHOLOGIC +PSYCHOLOGICAL +PSYCHOLOGICALLY +PSYCHOLOGIES +PSYCHOLOGISE +PSYCHOLOGISED +PSYCHOLOGISES +PSYCHOLOGISING +PSYCHOLOGISM +PSYCHOLOGISMS +PSYCHOLOGIST +PSYCHOLOGISTS +PSYCHOLOGIZE +PSYCHOLOGIZED +PSYCHOLOGIZES +PSYCHOLOGIZING +PSYCHOLOGY +PSYCHOMETRIC +PSYCHOMETRICIAN +PSYCHOMETRICS +PSYCHOMETRIES +PSYCHOMETRY +PSYCHOMOTOR +PSYCHONEUROSES +PSYCHONEUROSIS +PSYCHONEUROTIC +PSYCHONEUROTICS +PSYCHOPATH +PSYCHOPATHIC +PSYCHOPATHICS +PSYCHOPATHIES +PSYCHOPATHOLOGY +PSYCHOPATHS +PSYCHOPATHY +PSYCHOPHYSICAL +PSYCHOPHYSICIST +PSYCHOPHYSICS +PSYCHOS +PSYCHOSES +PSYCHOSEXUAL +PSYCHOSEXUALITY +PSYCHOSEXUALLY +PSYCHOSIS +PSYCHOSOCIAL +PSYCHOSOCIALLY +PSYCHOSOMATIC +PSYCHOSOMATICS +PSYCHOSURGEON +PSYCHOSURGEONS +PSYCHOSURGERIES +PSYCHOSURGERY +PSYCHOSURGICAL +PSYCHOSYNTHESES +PSYCHOSYNTHESIS +PSYCHOTHERAPIES +PSYCHOTHERAPIST +PSYCHOTHERAPY +PSYCHOTIC +PSYCHOTICALLY +PSYCHOTICS +PSYCHOTOMIMETIC +PSYCHOTROPIC +PSYCHOTROPICS +PSYCHROMETER +PSYCHROMETERS +PSYCHROMETRIC +PSYCHROMETRIES +PSYCHROMETRY +PSYCHROPHILIC +PSYCHS +PSYLLA +PSYLLAS +PSYLLID +PSYLLIDS +PSYLLIUM +PSYLLIUMS +PSYOPS +PSYWAR +PSYWARS +PTARMIGAN +PTARMIGANS +PTERANODON +PTERANODONS +PTERIDINE +PTERIDINES +PTERIDOLOGICAL +PTERIDOLOGIES +PTERIDOLOGIST +PTERIDOLOGISTS +PTERIDOLOGY +PTERIDOPHYTE +PTERIDOPHYTES +PTERIDOSPERM +PTERIDOSPERMS +PTERIN +PTERINS +PTERODACTYL +PTERODACTYLS +PTEROPOD +PTEROPODS +PTEROSAUR +PTEROSAURS +PTERYGIA +PTERYGIAL +PTERYGIUM +PTERYGIUMS +PTERYGOID +PTERYGOIDS +PTERYLA +PTERYLAE +PTISAN +PTISANS +PTOMAIN +PTOMAINE +PTOMAINES +PTOMAINIC +PTOMAINS +PTOOEY +PTOSES +PTOSIS +PTOTIC +PTUI +PTYALIN +PTYALINS +PTYALISM +PTYALISMS +PUB +PUBERAL +PUBERTAL +PUBERTIES +PUBERTY +PUBERULENT +PUBES +PUBESCENCE +PUBESCENCES +PUBESCENT +PUBIC +PUBIS +PUBLIC +PUBLICALLY +PUBLICAN +PUBLICANS +PUBLICATION +PUBLICATIONS +PUBLICISE +PUBLICISED +PUBLICISES +PUBLICISING +PUBLICIST +PUBLICISTS +PUBLICITIES +PUBLICITY +PUBLICIZE +PUBLICIZED +PUBLICIZES +PUBLICIZING +PUBLICLY +PUBLICNESS +PUBLICNESSES +PUBLICS +PUBLISH +PUBLISHABLE +PUBLISHED +PUBLISHER +PUBLISHERS +PUBLISHES +PUBLISHING +PUBLISHINGS +PUBS +PUCCOON +PUCCOONS +PUCE +PUCES +PUCK +PUCKA +PUCKER +PUCKERED +PUCKERER +PUCKERERS +PUCKERIER +PUCKERIEST +PUCKERING +PUCKERS +PUCKERY +PUCKISH +PUCKISHLY +PUCKISHNESS +PUCKISHNESSES +PUCKS +PUD +PUDDING +PUDDINGS +PUDDLE +PUDDLED +PUDDLER +PUDDLERS +PUDDLES +PUDDLIER +PUDDLIEST +PUDDLING +PUDDLINGS +PUDDLY +PUDENCIES +PUDENCY +PUDENDA +PUDENDAL +PUDENDUM +PUDGIER +PUDGIEST +PUDGILY +PUDGINESS +PUDGINESSES +PUDGY +PUDIBUND +PUDIC +PUDS +PUEBLO +PUEBLOS +PUERILE +PUERILELY +PUERILISM +PUERILISMS +PUERILITIES +PUERILITY +PUERPERA +PUERPERAE +PUERPERAL +PUERPERIA +PUERPERIUM +PUFF +PUFFBALL +PUFFBALLS +PUFFED +PUFFER +PUFFERIES +PUFFERS +PUFFERY +PUFFIER +PUFFIEST +PUFFILY +PUFFIN +PUFFINESS +PUFFINESSES +PUFFING +PUFFINS +PUFFS +PUFFY +PUG +PUGAREE +PUGAREES +PUGGAREE +PUGGAREES +PUGGED +PUGGIER +PUGGIEST +PUGGINESS +PUGGINESSES +PUGGING +PUGGISH +PUGGREE +PUGGREES +PUGGRIES +PUGGRY +PUGGY +PUGH +PUGILISM +PUGILISMS +PUGILIST +PUGILISTIC +PUGILISTS +PUGMARK +PUGMARKS +PUGNACIOUS +PUGNACIOUSLY +PUGNACIOUSNESS +PUGNACITIES +PUGNACITY +PUGREE +PUGREES +PUGS +PUISNE +PUISNES +PUISSANCE +PUISSANCES +PUISSANT +PUJA +PUJAH +PUJAHS +PUJAS +PUKE +PUKED +PUKES +PUKING +PUKKA +PUL +PULA +PULCHRITUDE +PULCHRITUDES +PULCHRITUDINOUS +PULE +PULED +PULER +PULERS +PULES +PULI +PULICENE +PULICIDE +PULICIDES +PULIK +PULING +PULINGLY +PULINGS +PULIS +PULL +PULLBACK +PULLBACKS +PULLED +PULLER +PULLERS +PULLET +PULLETS +PULLEY +PULLEYS +PULLING +PULLMAN +PULLMANS +PULLOUT +PULLOUTS +PULLOVER +PULLOVERS +PULLS +PULLULATE +PULLULATED +PULLULATES +PULLULATING +PULLULATION +PULLULATIONS +PULLUP +PULLUPS +PULMONARY +PULMONATE +PULMONATES +PULMONIC +PULMOTOR +PULMOTORS +PULP +PULPAL +PULPALLY +PULPED +PULPER +PULPERS +PULPIER +PULPIEST +PULPILY +PULPINESS +PULPINESSES +PULPING +PULPIT +PULPITAL +PULPITS +PULPLESS +PULPOUS +PULPS +PULPWOOD +PULPWOODS +PULPY +PULQUE +PULQUES +PULS +PULSANT +PULSAR +PULSARS +PULSATE +PULSATED +PULSATES +PULSATILE +PULSATING +PULSATION +PULSATIONS +PULSATIVE +PULSATOR +PULSATORS +PULSATORY +PULSE +PULSED +PULSEJET +PULSEJETS +PULSER +PULSERS +PULSES +PULSING +PULSION +PULSIONS +PULSOJET +PULSOJETS +PULVERABLE +PULVERISE +PULVERISED +PULVERISES +PULVERISING +PULVERIZABLE +PULVERIZATION +PULVERIZATIONS +PULVERIZE +PULVERIZED +PULVERIZER +PULVERIZERS +PULVERIZES +PULVERIZING +PULVERULENT +PULVILLAR +PULVILLI +PULVILLUS +PULVINAR +PULVINATE +PULVINI +PULVINUS +PUMA +PUMAS +PUMELO +PUMELOS +PUMICE +PUMICED +PUMICEOUS +PUMICER +PUMICERS +PUMICES +PUMICING +PUMICITE +PUMICITES +PUMMEL +PUMMELED +PUMMELING +PUMMELLED +PUMMELLING +PUMMELO +PUMMELOS +PUMMELS +PUMP +PUMPED +PUMPER +PUMPERNICKEL +PUMPERNICKELS +PUMPERS +PUMPING +PUMPKIN +PUMPKINS +PUMPKINSEED +PUMPKINSEEDS +PUMPLESS +PUMPLIKE +PUMPS +PUN +PUNA +PUNAS +PUNCH +PUNCHBALL +PUNCHBALLS +PUNCHBOARD +PUNCHBOARDS +PUNCHED +PUNCHEON +PUNCHEONS +PUNCHER +PUNCHERS +PUNCHES +PUNCHIER +PUNCHIEST +PUNCHILY +PUNCHINELLO +PUNCHINELLOS +PUNCHING +PUNCHLESS +PUNCHY +PUNCTATE +PUNCTATED +PUNCTATION +PUNCTATIONS +PUNCTILIO +PUNCTILIOS +PUNCTILIOUS +PUNCTILIOUSLY +PUNCTILIOUSNESS +PUNCTUAL +PUNCTUALITIES +PUNCTUALITY +PUNCTUALLY +PUNCTUATE +PUNCTUATED +PUNCTUATES +PUNCTUATING +PUNCTUATION +PUNCTUATIONS +PUNCTUATOR +PUNCTUATORS +PUNCTURE +PUNCTURED +PUNCTURES +PUNCTURING +PUNDIT +PUNDITIC +PUNDITRIES +PUNDITRY +PUNDITS +PUNG +PUNGENCIES +PUNGENCY +PUNGENT +PUNGENTLY +PUNGLE +PUNGLED +PUNGLES +PUNGLING +PUNGS +PUNIER +PUNIEST +PUNILY +PUNINESS +PUNINESSES +PUNISH +PUNISHABILITIES +PUNISHABILITY +PUNISHABLE +PUNISHED +PUNISHER +PUNISHERS +PUNISHES +PUNISHING +PUNISHMENT +PUNISHMENTS +PUNITION +PUNITIONS +PUNITIVE +PUNITIVELY +PUNITIVENESS +PUNITIVENESSES +PUNITORY +PUNJI +PUNJIS +PUNK +PUNKA +PUNKAH +PUNKAHS +PUNKAS +PUNKER +PUNKERS +PUNKEST +PUNKEY +PUNKEYS +PUNKIE +PUNKIER +PUNKIES +PUNKIEST +PUNKIN +PUNKINESS +PUNKINESSES +PUNKINS +PUNKISH +PUNKS +PUNKY +PUNNED +PUNNER +PUNNERS +PUNNET +PUNNETS +PUNNIER +PUNNIEST +PUNNING +PUNNINGLY +PUNNY +PUNS +PUNSTER +PUNSTERS +PUNT +PUNTED +PUNTER +PUNTERS +PUNTIES +PUNTING +PUNTO +PUNTOS +PUNTS +PUNTY +PUNY +PUP +PUPA +PUPAE +PUPAL +PUPARIA +PUPARIAL +PUPARIUM +PUPAS +PUPATE +PUPATED +PUPATES +PUPATING +PUPATION +PUPATIONS +PUPFISH +PUPFISHES +PUPIL +PUPILAGE +PUPILAGES +PUPILAR +PUPILARY +PUPILLAGE +PUPILLAGES +PUPILLARY +PUPILS +PUPPED +PUPPET +PUPPETEER +PUPPETEERED +PUPPETEERING +PUPPETEERS +PUPPETLIKE +PUPPETRIES +PUPPETRY +PUPPETS +PUPPIES +PUPPING +PUPPY +PUPPYDOM +PUPPYDOMS +PUPPYHOOD +PUPPYHOODS +PUPPYISH +PUPPYLIKE +PUPS +PUPU +PUPUS +PUR +PURANA +PURANAS +PURANIC +PURBLIND +PURBLINDLY +PURBLINDNESS +PURBLINDNESSES +PURCHASABLE +PURCHASE +PURCHASED +PURCHASER +PURCHASERS +PURCHASES +PURCHASING +PURDA +PURDAH +PURDAHS +PURDAS +PURE +PUREBLOOD +PUREBLOODS +PUREBRED +PUREBREDS +PUREE +PUREED +PUREEING +PUREES +PURELY +PURENESS +PURENESSES +PURER +PUREST +PURFLE +PURFLED +PURFLER +PURFLERS +PURFLES +PURFLING +PURFLINGS +PURGATION +PURGATIONS +PURGATIVE +PURGATIVES +PURGATORIAL +PURGATORIES +PURGATORY +PURGE +PURGEABLE +PURGED +PURGER +PURGERS +PURGES +PURGING +PURGINGS +PURI +PURIFICATION +PURIFICATIONS +PURIFICATOR +PURIFICATORS +PURIFICATORY +PURIFIED +PURIFIER +PURIFIERS +PURIFIES +PURIFY +PURIFYING +PURIN +PURINE +PURINES +PURINS +PURIS +PURISM +PURISMS +PURIST +PURISTIC +PURISTICALLY +PURISTS +PURITAN +PURITANIC +PURITANICAL +PURITANICALLY +PURITANISM +PURITANISMS +PURITANS +PURITIES +PURITY +PURL +PURLED +PURLIEU +PURLIEUS +PURLIN +PURLINE +PURLINES +PURLING +PURLINGS +PURLINS +PURLOIN +PURLOINED +PURLOINER +PURLOINERS +PURLOINING +PURLOINS +PURLS +PUROMYCIN +PUROMYCINS +PURPLE +PURPLED +PURPLEHEART +PURPLEHEARTS +PURPLER +PURPLES +PURPLEST +PURPLING +PURPLISH +PURPLY +PURPORT +PURPORTED +PURPORTEDLY +PURPORTING +PURPORTS +PURPOSE +PURPOSED +PURPOSEFUL +PURPOSEFULLY +PURPOSEFULNESS +PURPOSELESS +PURPOSELESSLY +PURPOSELESSNESS +PURPOSELY +PURPOSES +PURPOSING +PURPOSIVE +PURPOSIVELY +PURPOSIVENESS +PURPOSIVENESSES +PURPURA +PURPURAS +PURPURE +PURPURES +PURPURIC +PURPURIN +PURPURINS +PURR +PURRED +PURRING +PURRINGLY +PURRS +PURS +PURSE +PURSED +PURSELIKE +PURSER +PURSERS +PURSES +PURSIER +PURSIEST +PURSILY +PURSINESS +PURSINESSES +PURSING +PURSLANE +PURSLANES +PURSUABLE +PURSUANCE +PURSUANCES +PURSUANT +PURSUE +PURSUED +PURSUER +PURSUERS +PURSUES +PURSUING +PURSUIT +PURSUITS +PURSUIVANT +PURSUIVANTS +PURSY +PURTENANCE +PURTENANCES +PURTIER +PURTIEST +PURTY +PURULENCE +PURULENCES +PURULENCIES +PURULENCY +PURULENT +PURVEY +PURVEYANCE +PURVEYANCES +PURVEYED +PURVEYING +PURVEYOR +PURVEYORS +PURVEYS +PURVIEW +PURVIEWS +PUS +PUSES +PUSH +PUSHBALL +PUSHBALLS +PUSHCART +PUSHCARTS +PUSHCHAIR +PUSHCHAIRS +PUSHDOWN +PUSHDOWNS +PUSHED +PUSHER +PUSHERS +PUSHES +PUSHFUL +PUSHFULNESS +PUSHFULNESSES +PUSHIER +PUSHIEST +PUSHILY +PUSHINESS +PUSHINESSES +PUSHING +PUSHINGLY +PUSHOVER +PUSHOVERS +PUSHPIN +PUSHPINS +PUSHROD +PUSHRODS +PUSHUP +PUSHUPS +PUSHY +PUSILLANIMITIES +PUSILLANIMITY +PUSILLANIMOUS +PUSILLANIMOUSLY +PUSLEY +PUSLEYS +PUSLIKE +PUSS +PUSSES +PUSSIER +PUSSIES +PUSSIEST +PUSSLEY +PUSSLEYS +PUSSLIES +PUSSLIKE +PUSSLY +PUSSY +PUSSYCAT +PUSSYCATS +PUSSYFOOT +PUSSYFOOTED +PUSSYFOOTER +PUSSYFOOTERS +PUSSYFOOTING +PUSSYFOOTS +PUSSYTOES +PUSTULANT +PUSTULANTS +PUSTULAR +PUSTULATE +PUSTULATED +PUSTULATES +PUSTULATING +PUSTULATION +PUSTULATIONS +PUSTULE +PUSTULED +PUSTULES +PUSTULOUS +PUT +PUTAMEN +PUTAMINA +PUTATIVE +PUTATIVELY +PUTDOWN +PUTDOWNS +PUTLOG +PUTLOGS +PUTOFF +PUTOFFS +PUTON +PUTONGHUA +PUTONGHUAS +PUTONS +PUTOUT +PUTOUTS +PUTREFACTION +PUTREFACTIONS +PUTREFACTIVE +PUTREFIED +PUTREFIER +PUTREFIERS +PUTREFIES +PUTREFY +PUTREFYING +PUTRESCENCE +PUTRESCENCES +PUTRESCENT +PUTRESCIBLE +PUTRESCINE +PUTRESCINES +PUTRID +PUTRIDITIES +PUTRIDITY +PUTRIDLY +PUTS +PUTSCH +PUTSCHES +PUTSCHIST +PUTSCHISTS +PUTT +PUTTED +PUTTEE +PUTTEES +PUTTER +PUTTERED +PUTTERER +PUTTERERS +PUTTERING +PUTTERS +PUTTI +PUTTIE +PUTTIED +PUTTIER +PUTTIERS +PUTTIES +PUTTING +PUTTO +PUTTS +PUTTY +PUTTYING +PUTTYLESS +PUTTYLIKE +PUTTYROOT +PUTTYROOTS +PUTZ +PUTZED +PUTZES +PUTZING +PUZZLE +PUZZLED +PUZZLEDLY +PUZZLEHEADED +PUZZLEMENT +PUZZLEMENTS +PUZZLER +PUZZLERS +PUZZLES +PUZZLING +PUZZLINGLY +PYA +PYAEMIA +PYAEMIAS +PYAEMIC +PYAS +PYCNIDIA +PYCNIDIAL +PYCNIDIUM +PYCNOGONID +PYCNOGONIDS +PYCNOMETER +PYCNOMETERS +PYCNOSES +PYCNOSIS +PYCNOTIC +PYE +PYELITIC +PYELITIS +PYELITISES +PYELOGRAM +PYELOGRAMS +PYELONEPHRITIC +PYELONEPHRITIS +PYEMIA +PYEMIAS +PYEMIC +PYES +PYGIDIA +PYGIDIAL +PYGIDIUM +PYGMAEAN +PYGMEAN +PYGMIES +PYGMOID +PYGMY +PYGMYISH +PYGMYISM +PYGMYISMS +PYIC +PYIN +PYINS +PYJAMA +PYJAMAS +PYKNIC +PYKNICS +PYKNOSES +PYKNOSIS +PYKNOTIC +PYLON +PYLONS +PYLORI +PYLORIC +PYLORUS +PYLORUSES +PYODERMA +PYODERMAS +PYODERMIC +PYOGENIC +PYOID +PYORRHEA +PYORRHEAL +PYORRHEAS +PYORRHOEA +PYORRHOEAS +PYOSES +PYOSIS +PYRACANTHA +PYRACANTHAS +PYRALID +PYRALIDID +PYRALIDIDS +PYRALIDS +PYRAMID +PYRAMIDAL +PYRAMIDALLY +PYRAMIDED +PYRAMIDIC +PYRAMIDICAL +PYRAMIDING +PYRAMIDS +PYRAN +PYRANOID +PYRANOSE +PYRANOSES +PYRANOSIDE +PYRANOSIDES +PYRANS +PYRARGYRITE +PYRARGYRITES +PYRE +PYRENE +PYRENES +PYRENOID +PYRENOIDS +PYRES +PYRETHRIN +PYRETHRINS +PYRETHROID +PYRETHROIDS +PYRETHRUM +PYRETHRUMS +PYRETIC +PYREX +PYREXES +PYREXIA +PYREXIAL +PYREXIAS +PYREXIC +PYRHELIOMETER +PYRHELIOMETERS +PYRHELIOMETRIC +PYRIC +PYRIDIC +PYRIDINE +PYRIDINES +PYRIDOXAL +PYRIDOXALS +PYRIDOXAMINE +PYRIDOXAMINES +PYRIDOXIN +PYRIDOXINE +PYRIDOXINES +PYRIDOXINS +PYRIFORM +PYRIMETHAMINE +PYRIMETHAMINES +PYRIMIDINE +PYRIMIDINES +PYRITE +PYRITES +PYRITIC +PYRITICAL +PYRITOUS +PYRO +PYROCATECHOL +PYROCATECHOLS +PYROCERAM +PYROCERAMS +PYROCLASTIC +PYROELECTRIC +PYROELECTRICITY +PYROGALLOL +PYROGALLOLS +PYROGEN +PYROGENIC +PYROGENICITIES +PYROGENICITY +PYROGENS +PYROLA +PYROLAS +PYROLIZE +PYROLIZED +PYROLIZES +PYROLIZING +PYROLOGIES +PYROLOGY +PYROLUSITE +PYROLUSITES +PYROLYSATE +PYROLYSATES +PYROLYSES +PYROLYSIS +PYROLYTIC +PYROLYTICALLY +PYROLYZABLE +PYROLYZATE +PYROLYZATES +PYROLYZE +PYROLYZED +PYROLYZER +PYROLYZERS +PYROLYZES +PYROLYZING +PYROMANCIES +PYROMANCY +PYROMANIA +PYROMANIAC +PYROMANIACAL +PYROMANIACS +PYROMANIAS +PYROMETALLURGY +PYROMETER +PYROMETERS +PYROMETRIC +PYROMETRICALLY +PYROMETRIES +PYROMETRY +PYROMORPHITE +PYROMORPHITES +PYRONE +PYRONES +PYRONINE +PYRONINES +PYRONINOPHILIC +PYROPE +PYROPES +PYROPHORIC +PYROPHOSPHATE +PYROPHOSPHATES +PYROPHYLLITE +PYROPHYLLITES +PYROS +PYROSIS +PYROSISES +PYROSTAT +PYROSTATS +PYROTECHNIC +PYROTECHNICAL +PYROTECHNICALLY +PYROTECHNICS +PYROTECHNIST +PYROTECHNISTS +PYROXENE +PYROXENES +PYROXENIC +PYROXENITE +PYROXENITES +PYROXENITIC +PYROXENOID +PYROXENOIDS +PYROXYLIN +PYROXYLINS +PYRRHIC +PYRRHICS +PYRRHOTITE +PYRRHOTITES +PYRROL +PYRROLE +PYRROLES +PYRROLIC +PYRROLS +PYRUVATE +PYRUVATES +PYTHON +PYTHONESS +PYTHONESSES +PYTHONIC +PYTHONS +PYURIA +PYURIAS +PYX +PYXES +PYXIDES +PYXIDIA +PYXIDIUM +PYXIE +PYXIES +PYXIS +QABALA +QABALAH +QABALAHS +QABALAS +QADI +QADIS +QAID +QAIDS +QANAT +QANATS +QAT +QATS +QI +QINDAR +QINDARKA +QINDARS +QINTAR +QINTARS +QIS +QIVIUT +QIVIUTS +QOPH +QOPHS +QUA +QUAALUDE +QUAALUDES +QUACK +QUACKED +QUACKERIES +QUACKERY +QUACKIER +QUACKIEST +QUACKING +QUACKISH +QUACKISM +QUACKISMS +QUACKS +QUACKSALVER +QUACKSALVERS +QUACKY +QUAD +QUADDED +QUADDING +QUADPLEX +QUADPLEXES +QUADRANGLE +QUADRANGLES +QUADRANGULAR +QUADRANS +QUADRANT +QUADRANTAL +QUADRANTES +QUADRANTS +QUADRAPHONIC +QUADRAPHONICS +QUADRAT +QUADRATE +QUADRATED +QUADRATES +QUADRATIC +QUADRATICALLY +QUADRATICS +QUADRATING +QUADRATS +QUADRATURE +QUADRATURES +QUADRENNIA +QUADRENNIAL +QUADRENNIALLY +QUADRENNIALS +QUADRENNIUM +QUADRENNIUMS +QUADRIC +QUADRICEP +QUADRICEPS +QUADRICEPSES +QUADRICS +QUADRIFID +QUADRIGA +QUADRIGAE +QUADRILATERAL +QUADRILATERALS +QUADRILLE +QUADRILLES +QUADRILLION +QUADRILLIONS +QUADRILLIONTH +QUADRILLIONTHS +QUADRIPARTITE +QUADRIPHONIC +QUADRIPHONICS +QUADRIPLEGIA +QUADRIPLEGIAS +QUADRIPLEGIC +QUADRIPLEGICS +QUADRIVALENT +QUADRIVALENTS +QUADRIVIA +QUADRIVIAL +QUADRIVIUM +QUADROON +QUADROONS +QUADRUMANOUS +QUADRUMVIR +QUADRUMVIRATE +QUADRUMVIRATES +QUADRUMVIRS +QUADRUPED +QUADRUPEDAL +QUADRUPEDS +QUADRUPLE +QUADRUPLED +QUADRUPLES +QUADRUPLET +QUADRUPLETS +QUADRUPLICATE +QUADRUPLICATED +QUADRUPLICATES +QUADRUPLICATING +QUADRUPLICATION +QUADRUPLICITIES +QUADRUPLICITY +QUADRUPLING +QUADRUPLY +QUADRUPOLE +QUADRUPOLES +QUADS +QUAERE +QUAERES +QUAESTOR +QUAESTORS +QUAFF +QUAFFED +QUAFFER +QUAFFERS +QUAFFING +QUAFFS +QUAG +QUAGGA +QUAGGAS +QUAGGIER +QUAGGIEST +QUAGGY +QUAGMIRE +QUAGMIRES +QUAGMIRIER +QUAGMIRIEST +QUAGMIRY +QUAGS +QUAHAUG +QUAHAUGS +QUAHOG +QUAHOGS +QUAI +QUAICH +QUAICHES +QUAICHS +QUAIGH +QUAIGHS +QUAIL +QUAILED +QUAILING +QUAILS +QUAINT +QUAINTER +QUAINTEST +QUAINTLY +QUAINTNESS +QUAINTNESSES +QUAIS +QUAKE +QUAKED +QUAKER +QUAKERS +QUAKES +QUAKIER +QUAKIEST +QUAKILY +QUAKINESS +QUAKINESSES +QUAKING +QUAKINGLY +QUAKY +QUALE +QUALIA +QUALIFIABLE +QUALIFICATION +QUALIFICATIONS +QUALIFIED +QUALIFIEDLY +QUALIFIER +QUALIFIERS +QUALIFIES +QUALIFY +QUALIFYING +QUALITATIVE +QUALITATIVELY +QUALITIES +QUALITY +QUALM +QUALMIER +QUALMIEST +QUALMISH +QUALMISHLY +QUALMISHNESS +QUALMISHNESSES +QUALMS +QUALMY +QUAMASH +QUAMASHES +QUANDANG +QUANDANGS +QUANDARIES +QUANDARY +QUANDONG +QUANDONGS +QUANGO +QUANGOS +QUANT +QUANTA +QUANTAL +QUANTALLY +QUANTED +QUANTIC +QUANTICS +QUANTIFIABLE +QUANTIFICATION +QUANTIFICATIONS +QUANTIFIED +QUANTIFIER +QUANTIFIERS +QUANTIFIES +QUANTIFY +QUANTIFYING +QUANTILE +QUANTILES +QUANTING +QUANTITATE +QUANTITATED +QUANTITATES +QUANTITATING +QUANTITATION +QUANTITATIONS +QUANTITATIVE +QUANTITATIVELY +QUANTITIES +QUANTITY +QUANTIZATION +QUANTIZATIONS +QUANTIZE +QUANTIZED +QUANTIZER +QUANTIZERS +QUANTIZES +QUANTIZING +QUANTONG +QUANTONGS +QUANTS +QUANTUM +QUARANTINE +QUARANTINED +QUARANTINES +QUARANTINING +QUARE +QUARK +QUARKS +QUARREL +QUARRELED +QUARRELER +QUARRELERS +QUARRELING +QUARRELLED +QUARRELLER +QUARRELLERS +QUARRELLING +QUARRELS +QUARRELSOME +QUARRELSOMELY +QUARRELSOMENESS +QUARRIED +QUARRIER +QUARRIERS +QUARRIES +QUARRY +QUARRYING +QUARRYINGS +QUARRYMAN +QUARRYMEN +QUART +QUARTAN +QUARTANS +QUARTE +QUARTER +QUARTERAGE +QUARTERAGES +QUARTERBACK +QUARTERBACKED +QUARTERBACKING +QUARTERBACKS +QUARTERDECK +QUARTERDECKS +QUARTERED +QUARTERER +QUARTERERS +QUARTERFINAL +QUARTERFINALIST +QUARTERFINALS +QUARTERING +QUARTERINGS +QUARTERLIES +QUARTERLY +QUARTERMASTER +QUARTERMASTERS +QUARTERN +QUARTERNS +QUARTERS +QUARTERSAWED +QUARTERSAWN +QUARTERSTAFF +QUARTERSTAVES +QUARTES +QUARTET +QUARTETS +QUARTETTE +QUARTETTES +QUARTIC +QUARTICS +QUARTIER +QUARTIERS +QUARTILE +QUARTILES +QUARTO +QUARTOS +QUARTS +QUARTZ +QUARTZES +QUARTZITE +QUARTZITES +QUARTZITIC +QUARTZOSE +QUARTZOUS +QUASAR +QUASARS +QUASH +QUASHED +QUASHER +QUASHERS +QUASHES +QUASHING +QUASI +QUASICRYSTAL +QUASICRYSTALS +QUASIPARTICLE +QUASIPARTICLES +QUASIPERIODIC +QUASS +QUASSES +QUASSIA +QUASSIAS +QUASSIN +QUASSINS +QUATE +QUATERCENTENARY +QUATERNARIES +QUATERNARY +QUATERNION +QUATERNIONS +QUATERNITIES +QUATERNITY +QUATORZE +QUATORZES +QUATRAIN +QUATRAINS +QUATRE +QUATREFOIL +QUATREFOILS +QUATRES +QUATTROCENTO +QUATTROCENTOS +QUAVER +QUAVERED +QUAVERER +QUAVERERS +QUAVERING +QUAVERINGLY +QUAVERS +QUAVERY +QUAY +QUAYAGE +QUAYAGES +QUAYLIKE +QUAYS +QUAYSIDE +QUAYSIDES +QUBIT +QUBITS +QUBYTE +QUBYTES +QUEAN +QUEANS +QUEASIER +QUEASIEST +QUEASILY +QUEASINESS +QUEASINESSES +QUEASY +QUEAZIER +QUEAZIEST +QUEAZY +QUEBRACHO +QUEBRACHOS +QUEEN +QUEENDOM +QUEENDOMS +QUEENED +QUEENING +QUEENLIER +QUEENLIEST +QUEENLINESS +QUEENLINESSES +QUEENLY +QUEENS +QUEENSHIP +QUEENSHIPS +QUEENSIDE +QUEENSIDES +QUEER +QUEERED +QUEERER +QUEEREST +QUEERING +QUEERISH +QUEERLY +QUEERNESS +QUEERNESSES +QUEERS +QUELEA +QUELEAS +QUELL +QUELLABLE +QUELLED +QUELLER +QUELLERS +QUELLING +QUELLS +QUENCH +QUENCHABLE +QUENCHED +QUENCHER +QUENCHERS +QUENCHES +QUENCHING +QUENCHLESS +QUENELLE +QUENELLES +QUERCETIC +QUERCETIN +QUERCETINS +QUERCINE +QUERCITRON +QUERCITRONS +QUERIDA +QUERIDAS +QUERIED +QUERIER +QUERIERS +QUERIES +QUERIST +QUERISTS +QUERN +QUERNS +QUERULOUS +QUERULOUSLY +QUERULOUSNESS +QUERULOUSNESSES +QUERY +QUERYING +QUESADILLA +QUESADILLAS +QUEST +QUESTED +QUESTER +QUESTERS +QUESTING +QUESTION +QUESTIONABLE +QUESTIONABLY +QUESTIONARIES +QUESTIONARY +QUESTIONED +QUESTIONER +QUESTIONERS +QUESTIONING +QUESTIONLESS +QUESTIONNAIRE +QUESTIONNAIRES +QUESTIONS +QUESTOR +QUESTORS +QUESTS +QUETZAL +QUETZALES +QUETZALS +QUEUE +QUEUED +QUEUEING +QUEUER +QUEUERS +QUEUES +QUEUING +QUEY +QUEYS +QUEZAL +QUEZALES +QUEZALS +QUIBBLE +QUIBBLED +QUIBBLER +QUIBBLERS +QUIBBLES +QUIBBLING +QUICHE +QUICHES +QUICK +QUICKEN +QUICKENED +QUICKENER +QUICKENERS +QUICKENING +QUICKENS +QUICKER +QUICKEST +QUICKIE +QUICKIES +QUICKLIME +QUICKLIMES +QUICKLY +QUICKNESS +QUICKNESSES +QUICKS +QUICKSAND +QUICKSANDS +QUICKSET +QUICKSETS +QUICKSILVER +QUICKSILVERS +QUICKSTEP +QUICKSTEPS +QUID +QUIDDITIES +QUIDDITY +QUIDNUNC +QUIDNUNCS +QUIDS +QUIESCENCE +QUIESCENCES +QUIESCENT +QUIESCENTLY +QUIET +QUIETED +QUIETEN +QUIETENED +QUIETENER +QUIETENERS +QUIETENING +QUIETENS +QUIETER +QUIETERS +QUIETEST +QUIETING +QUIETISM +QUIETISMS +QUIETIST +QUIETISTIC +QUIETISTS +QUIETLY +QUIETNESS +QUIETNESSES +QUIETS +QUIETUDE +QUIETUDES +QUIETUS +QUIETUSES +QUIFF +QUIFFS +QUILL +QUILLAI +QUILLAIA +QUILLAIAS +QUILLAIS +QUILLAJA +QUILLAJAS +QUILLBACK +QUILLBACKS +QUILLED +QUILLET +QUILLETS +QUILLING +QUILLINGS +QUILLS +QUILLWORK +QUILLWORKS +QUILLWORT +QUILLWORTS +QUILT +QUILTED +QUILTER +QUILTERS +QUILTING +QUILTINGS +QUILTS +QUIN +QUINACRINE +QUINACRINES +QUINARIES +QUINARY +QUINATE +QUINCE +QUINCENTENARIES +QUINCENTENARY +QUINCENTENNIAL +QUINCENTENNIALS +QUINCES +QUINCUNCIAL +QUINCUNX +QUINCUNXES +QUINCUNXIAL +QUINDECILLION +QUINDECILLIONS +QUINELA +QUINELAS +QUINELLA +QUINELLAS +QUINIC +QUINIDINE +QUINIDINES +QUINIELA +QUINIELAS +QUININ +QUININA +QUININAS +QUININE +QUININES +QUININS +QUINNAT +QUINNATS +QUINOA +QUINOAS +QUINOID +QUINOIDAL +QUINOIDS +QUINOL +QUINOLIN +QUINOLINE +QUINOLINES +QUINOLINS +QUINOLONE +QUINOLONES +QUINOLS +QUINONE +QUINONES +QUINONOID +QUINQUENNIA +QUINQUENNIAL +QUINQUENNIALLY +QUINQUENNIALS +QUINQUENNIUM +QUINQUENNIUMS +QUINS +QUINSIED +QUINSIES +QUINSY +QUINT +QUINTA +QUINTAIN +QUINTAINS +QUINTAL +QUINTALS +QUINTAN +QUINTANS +QUINTAR +QUINTARS +QUINTAS +QUINTE +QUINTES +QUINTESSENCE +QUINTESSENCES +QUINTESSENTIAL +QUINTET +QUINTETS +QUINTETTE +QUINTETTES +QUINTIC +QUINTICS +QUINTILE +QUINTILES +QUINTILLION +QUINTILLIONS +QUINTILLIONTH +QUINTILLIONTHS +QUINTIN +QUINTINS +QUINTS +QUINTUPLE +QUINTUPLED +QUINTUPLES +QUINTUPLET +QUINTUPLETS +QUINTUPLICATE +QUINTUPLICATED +QUINTUPLICATES +QUINTUPLICATING +QUINTUPLING +QUINTUPLY +QUIP +QUIPPED +QUIPPER +QUIPPERS +QUIPPIER +QUIPPIEST +QUIPPING +QUIPPISH +QUIPPU +QUIPPUS +QUIPPY +QUIPS +QUIPSTER +QUIPSTERS +QUIPU +QUIPUS +QUIRE +QUIRED +QUIRES +QUIRING +QUIRK +QUIRKED +QUIRKIER +QUIRKIEST +QUIRKILY +QUIRKINESS +QUIRKINESSES +QUIRKING +QUIRKISH +QUIRKS +QUIRKY +QUIRT +QUIRTED +QUIRTING +QUIRTS +QUISLING +QUISLINGISM +QUISLINGISMS +QUISLINGS +QUIT +QUITCH +QUITCHES +QUITCLAIM +QUITCLAIMED +QUITCLAIMING +QUITCLAIMS +QUITE +QUITRENT +QUITRENTS +QUITS +QUITTANCE +QUITTANCES +QUITTED +QUITTER +QUITTERS +QUITTING +QUITTOR +QUITTORS +QUIVER +QUIVERED +QUIVERER +QUIVERERS +QUIVERING +QUIVERINGLY +QUIVERS +QUIVERY +QUIXOTE +QUIXOTES +QUIXOTIC +QUIXOTICAL +QUIXOTICALLY +QUIXOTISM +QUIXOTISMS +QUIXOTRIES +QUIXOTRY +QUIZ +QUIZMASTER +QUIZMASTERS +QUIZZED +QUIZZER +QUIZZERS +QUIZZES +QUIZZICAL +QUIZZICALITIES +QUIZZICALITY +QUIZZICALLY +QUIZZING +QUOD +QUODLIBET +QUODLIBETS +QUODS +QUOHOG +QUOHOGS +QUOIN +QUOINED +QUOINING +QUOINS +QUOIT +QUOITED +QUOITING +QUOITS +QUOKKA +QUOKKAS +QUOLL +QUOLLS +QUOMODO +QUOMODOS +QUONDAM +QUORUM +QUORUMS +QUOTA +QUOTABILITIES +QUOTABILITY +QUOTABLE +QUOTABLY +QUOTAS +QUOTATION +QUOTATIONS +QUOTE +QUOTED +QUOTER +QUOTERS +QUOTES +QUOTH +QUOTHA +QUOTIDIAN +QUOTIDIANS +QUOTIENT +QUOTIENTS +QUOTING +QURSH +QURSHES +QURUSH +QURUSHES +QWERTY +QWERTYS +RABAT +RABATO +RABATOS +RABATS +RABBET +RABBETED +RABBETING +RABBETS +RABBI +RABBIES +RABBIN +RABBINATE +RABBINATES +RABBINIC +RABBINICAL +RABBINICALLY +RABBINISM +RABBINISMS +RABBINS +RABBIS +RABBIT +RABBITBRUSH +RABBITBRUSHES +RABBITED +RABBITER +RABBITERS +RABBITING +RABBITRIES +RABBITRY +RABBITS +RABBITY +RABBLE +RABBLED +RABBLEMENT +RABBLEMENTS +RABBLER +RABBLERS +RABBLES +RABBLING +RABBONI +RABBONIS +RABIC +RABID +RABIDITIES +RABIDITY +RABIDLY +RABIDNESS +RABIDNESSES +RABIES +RABIETIC +RACCOON +RACCOONS +RACE +RACECOURSE +RACECOURSES +RACED +RACEHORSE +RACEHORSES +RACEMATE +RACEMATES +RACEME +RACEMED +RACEMES +RACEMIC +RACEMISM +RACEMISMS +RACEMIZATION +RACEMIZATIONS +RACEMIZE +RACEMIZED +RACEMIZES +RACEMIZING +RACEMOID +RACEMOSE +RACEMOUS +RACER +RACERS +RACES +RACETRACK +RACETRACKER +RACETRACKERS +RACETRACKS +RACEWALK +RACEWALKED +RACEWALKER +RACEWALKERS +RACEWALKING +RACEWALKINGS +RACEWALKS +RACEWAY +RACEWAYS +RACHET +RACHETED +RACHETING +RACHETS +RACHIAL +RACHIDES +RACHILLA +RACHILLAE +RACHIS +RACHISES +RACHITIC +RACHITIDES +RACHITIS +RACIAL +RACIALISM +RACIALISMS +RACIALIST +RACIALISTIC +RACIALISTS +RACIALIZE +RACIALIZED +RACIALIZES +RACIALIZING +RACIALLY +RACIER +RACIEST +RACILY +RACINESS +RACINESSES +RACING +RACINGS +RACISM +RACISMS +RACIST +RACISTS +RACK +RACKED +RACKER +RACKERS +RACKET +RACKETED +RACKETEER +RACKETEERED +RACKETEERING +RACKETEERS +RACKETIER +RACKETIEST +RACKETING +RACKETS +RACKETY +RACKFUL +RACKFULS +RACKING +RACKINGLY +RACKLE +RACKS +RACKWORK +RACKWORKS +RACLETTE +RACLETTES +RACON +RACONS +RACONTEUR +RACONTEURS +RACOON +RACOONS +RACQUET +RACQUETBALL +RACQUETBALLS +RACQUETS +RACY +RAD +RADAR +RADARS +RADARSCOPE +RADARSCOPES +RADDED +RADDING +RADDLE +RADDLED +RADDLES +RADDLING +RADIABLE +RADIAL +RADIALE +RADIALIA +RADIALLY +RADIALS +RADIAN +RADIANCE +RADIANCES +RADIANCIES +RADIANCY +RADIANS +RADIANT +RADIANTLY +RADIANTS +RADIATE +RADIATED +RADIATELY +RADIATES +RADIATING +RADIATION +RADIATIONAL +RADIATIONLESS +RADIATIONS +RADIATIVE +RADIATOR +RADIATORS +RADICAL +RADICALISE +RADICALISED +RADICALISES +RADICALISING +RADICALISM +RADICALISMS +RADICALIZATION +RADICALIZATIONS +RADICALIZE +RADICALIZED +RADICALIZES +RADICALIZING +RADICALLY +RADICALNESS +RADICALNESSES +RADICALS +RADICAND +RADICANDS +RADICATE +RADICATED +RADICATES +RADICATING +RADICCHIO +RADICCHIOS +RADICEL +RADICELS +RADICES +RADICLE +RADICLES +RADICULAR +RADII +RADIO +RADIOACTIVE +RADIOACTIVELY +RADIOACTIVITIES +RADIOACTIVITY +RADIOAUTOGRAPH +RADIOAUTOGRAPHS +RADIOAUTOGRAPHY +RADIOBIOLOGIC +RADIOBIOLOGICAL +RADIOBIOLOGIES +RADIOBIOLOGIST +RADIOBIOLOGISTS +RADIOBIOLOGY +RADIOCARBON +RADIOCARBONS +RADIOCHEMICAL +RADIOCHEMICALLY +RADIOCHEMIST +RADIOCHEMISTRY +RADIOCHEMISTS +RADIOECOLOGIES +RADIOECOLOGY +RADIOED +RADIOELEMENT +RADIOELEMENTS +RADIOGENIC +RADIOGRAM +RADIOGRAMS +RADIOGRAPH +RADIOGRAPHED +RADIOGRAPHIC +RADIOGRAPHIES +RADIOGRAPHING +RADIOGRAPHS +RADIOGRAPHY +RADIOING +RADIOISOTOPE +RADIOISOTOPES +RADIOISOTOPIC +RADIOLABEL +RADIOLABELED +RADIOLABELING +RADIOLABELLED +RADIOLABELLING +RADIOLABELS +RADIOLARIAN +RADIOLARIANS +RADIOLOGIC +RADIOLOGICAL +RADIOLOGICALLY +RADIOLOGIES +RADIOLOGIST +RADIOLOGISTS +RADIOLOGY +RADIOLUCENCIES +RADIOLUCENCY +RADIOLUCENT +RADIOLYSES +RADIOLYSIS +RADIOLYTIC +RADIOMAN +RADIOMEN +RADIOMETER +RADIOMETERS +RADIOMETRIC +RADIOMETRICALLY +RADIOMETRIES +RADIOMETRY +RADIOMIMETIC +RADIONICS +RADIONUCLIDE +RADIONUCLIDES +RADIOPAQUE +RADIOPHONE +RADIOPHONES +RADIOPHOTO +RADIOPHOTOS +RADIOPROTECTION +RADIOPROTECTIVE +RADIOS +RADIOSENSITIVE +RADIOSONDE +RADIOSONDES +RADIOSTRONTIUM +RADIOSTRONTIUMS +RADIOTELEGRAPH +RADIOTELEGRAPHS +RADIOTELEGRAPHY +RADIOTELEMETRIC +RADIOTELEMETRY +RADIOTELEPHONE +RADIOTELEPHONES +RADIOTELEPHONY +RADIOTHERAPIES +RADIOTHERAPIST +RADIOTHERAPISTS +RADIOTHERAPY +RADIOTHORIUM +RADIOTHORIUMS +RADIOTRACER +RADIOTRACERS +RADISH +RADISHES +RADIUM +RADIUMS +RADIUS +RADIUSES +RADIX +RADIXES +RADOME +RADOMES +RADON +RADONS +RADS +RADULA +RADULAE +RADULAR +RADULAS +RADWASTE +RADWASTES +RAFF +RAFFIA +RAFFIAS +RAFFINATE +RAFFINATES +RAFFINOSE +RAFFINOSES +RAFFISH +RAFFISHLY +RAFFISHNESS +RAFFISHNESSES +RAFFLE +RAFFLED +RAFFLER +RAFFLERS +RAFFLES +RAFFLESIA +RAFFLESIAS +RAFFLING +RAFFS +RAFT +RAFTED +RAFTER +RAFTERED +RAFTERS +RAFTING +RAFTS +RAFTSMAN +RAFTSMEN +RAG +RAGA +RAGAMUFFIN +RAGAMUFFINS +RAGAS +RAGBAG +RAGBAGS +RAGE +RAGED +RAGEE +RAGEES +RAGES +RAGG +RAGGED +RAGGEDER +RAGGEDEST +RAGGEDIER +RAGGEDIEST +RAGGEDLY +RAGGEDNESS +RAGGEDNESSES +RAGGEDY +RAGGEE +RAGGEES +RAGGIES +RAGGING +RAGGLE +RAGGLES +RAGGS +RAGGY +RAGI +RAGING +RAGINGLY +RAGIS +RAGLAN +RAGLANS +RAGMAN +RAGMEN +RAGOUT +RAGOUTED +RAGOUTING +RAGOUTS +RAGPICKER +RAGPICKERS +RAGS +RAGTAG +RAGTAGS +RAGTIME +RAGTIMES +RAGTOP +RAGTOPS +RAGWEED +RAGWEEDS +RAGWORT +RAGWORTS +RAH +RAI +RAIA +RAIAS +RAID +RAIDED +RAIDER +RAIDERS +RAIDING +RAIDS +RAIL +RAILBIRD +RAILBIRDS +RAILBUS +RAILBUSES +RAILBUSSES +RAILCAR +RAILCARS +RAILED +RAILER +RAILERS +RAILHEAD +RAILHEADS +RAILING +RAILINGS +RAILLERIES +RAILLERY +RAILROAD +RAILROADED +RAILROADER +RAILROADERS +RAILROADING +RAILROADINGS +RAILROADS +RAILS +RAILWAY +RAILWAYS +RAIMENT +RAIMENTS +RAIN +RAINBAND +RAINBANDS +RAINBIRD +RAINBIRDS +RAINBOW +RAINBOWLIKE +RAINBOWS +RAINCHECK +RAINCHECKS +RAINCOAT +RAINCOATS +RAINDROP +RAINDROPS +RAINED +RAINFALL +RAINFALLS +RAINIER +RAINIEST +RAINILY +RAININESS +RAININESSES +RAINING +RAINLESS +RAINMAKER +RAINMAKERS +RAINMAKING +RAINMAKINGS +RAINOUT +RAINOUTS +RAINPROOF +RAINPROOFED +RAINPROOFING +RAINPROOFS +RAINS +RAINSPOUT +RAINSPOUTS +RAINSQUALL +RAINSQUALLS +RAINSTORM +RAINSTORMS +RAINWASH +RAINWASHED +RAINWASHES +RAINWASHING +RAINWATER +RAINWATERS +RAINWEAR +RAINY +RAIS +RAISABLE +RAISE +RAISEABLE +RAISED +RAISER +RAISERS +RAISES +RAISIN +RAISING +RAISINGS +RAISINS +RAISINY +RAISONNE +RAITA +RAITAS +RAJ +RAJA +RAJAH +RAJAHS +RAJAS +RAJES +RAKE +RAKED +RAKEE +RAKEES +RAKEHELL +RAKEHELLS +RAKEHELLY +RAKEOFF +RAKEOFFS +RAKER +RAKERS +RAKES +RAKI +RAKING +RAKIS +RAKISH +RAKISHLY +RAKISHNESS +RAKISHNESSES +RAKU +RAKUS +RALE +RALES +RALLENTANDO +RALLIED +RALLIER +RALLIERS +RALLIES +RALLIFORM +RALLINE +RALLY +RALLYE +RALLYES +RALLYING +RALLYINGS +RALLYIST +RALLYISTS +RALPH +RALPHED +RALPHING +RALPHS +RAM +RAMADA +RAMADAS +RAMAL +RAMATE +RAMBLA +RAMBLAS +RAMBLE +RAMBLED +RAMBLER +RAMBLERS +RAMBLES +RAMBLING +RAMBLINGLY +RAMBOUILLET +RAMBOUILLETS +RAMBUNCTIOUS +RAMBUNCTIOUSLY +RAMBUTAN +RAMBUTANS +RAMEE +RAMEES +RAMEKIN +RAMEKINS +RAMEN +RAMENTA +RAMENTUM +RAMEQUIN +RAMEQUINS +RAMET +RAMETS +RAMI +RAMIE +RAMIES +RAMIFICATION +RAMIFICATIONS +RAMIFIED +RAMIFIES +RAMIFORM +RAMIFY +RAMIFYING +RAMILIE +RAMILIES +RAMILLIE +RAMILLIES +RAMJET +RAMJETS +RAMMED +RAMMER +RAMMERS +RAMMIER +RAMMIEST +RAMMING +RAMMISH +RAMMY +RAMONA +RAMONAS +RAMOSE +RAMOSELY +RAMOSITIES +RAMOSITY +RAMOUS +RAMP +RAMPAGE +RAMPAGED +RAMPAGEOUS +RAMPAGEOUSLY +RAMPAGEOUSNESS +RAMPAGER +RAMPAGERS +RAMPAGES +RAMPAGING +RAMPANCIES +RAMPANCY +RAMPANT +RAMPANTLY +RAMPART +RAMPARTED +RAMPARTING +RAMPARTS +RAMPED +RAMPIKE +RAMPIKES +RAMPING +RAMPION +RAMPIONS +RAMPOLE +RAMPOLES +RAMPS +RAMROD +RAMRODDED +RAMRODDING +RAMRODS +RAMS +RAMSHACKLE +RAMSHORN +RAMSHORNS +RAMSON +RAMSONS +RAMTIL +RAMTILLA +RAMTILLAS +RAMTILS +RAMULOSE +RAMULOUS +RAMUS +RAN +RANCE +RANCES +RANCH +RANCHED +RANCHER +RANCHERIA +RANCHERIAS +RANCHERO +RANCHEROS +RANCHERS +RANCHES +RANCHING +RANCHLESS +RANCHLIKE +RANCHMAN +RANCHMEN +RANCHO +RANCHOS +RANCID +RANCIDITIES +RANCIDITY +RANCIDLY +RANCIDNESS +RANCIDNESSES +RANCOR +RANCORED +RANCOROUS +RANCOROUSLY +RANCORS +RANCOUR +RANCOURED +RANCOURS +RAND +RANDAN +RANDANS +RANDIER +RANDIES +RANDIEST +RANDINESS +RANDINESSES +RANDOM +RANDOMIZATION +RANDOMIZATIONS +RANDOMIZE +RANDOMIZED +RANDOMIZER +RANDOMIZERS +RANDOMIZES +RANDOMIZING +RANDOMLY +RANDOMNESS +RANDOMNESSES +RANDOMS +RANDS +RANDY +RANEE +RANEES +RANG +RANGE +RANGED +RANGELAND +RANGELANDS +RANGER +RANGERS +RANGES +RANGIER +RANGIEST +RANGINESS +RANGINESSES +RANGING +RANGY +RANI +RANID +RANIDS +RANIS +RANK +RANKED +RANKER +RANKERS +RANKEST +RANKING +RANKINGS +RANKISH +RANKLE +RANKLED +RANKLES +RANKLESS +RANKLING +RANKLY +RANKNESS +RANKNESSES +RANKS +RANPIKE +RANPIKES +RANSACK +RANSACKED +RANSACKER +RANSACKERS +RANSACKING +RANSACKS +RANSOM +RANSOMED +RANSOMER +RANSOMERS +RANSOMING +RANSOMS +RANT +RANTED +RANTER +RANTERS +RANTING +RANTINGLY +RANTS +RANULA +RANULAR +RANULAS +RANUNCULI +RANUNCULUS +RANUNCULUSES +RAP +RAPACIOUS +RAPACIOUSLY +RAPACIOUSNESS +RAPACIOUSNESSES +RAPACITIES +RAPACITY +RAPE +RAPED +RAPER +RAPERS +RAPES +RAPESEED +RAPESEEDS +RAPHAE +RAPHE +RAPHES +RAPHIA +RAPHIAS +RAPHIDE +RAPHIDES +RAPHIS +RAPID +RAPIDER +RAPIDEST +RAPIDITIES +RAPIDITY +RAPIDLY +RAPIDNESS +RAPIDNESSES +RAPIDS +RAPIER +RAPIERED +RAPIERS +RAPINE +RAPINES +RAPING +RAPINI +RAPIST +RAPISTS +RAPPAREE +RAPPAREES +RAPPED +RAPPEE +RAPPEES +RAPPEL +RAPPELED +RAPPELING +RAPPELLED +RAPPELLING +RAPPELS +RAPPEN +RAPPER +RAPPERS +RAPPING +RAPPINI +RAPPORT +RAPPORTEUR +RAPPORTEURS +RAPPORTS +RAPPROCHEMENT +RAPPROCHEMENTS +RAPS +RAPSCALLION +RAPSCALLIONS +RAPT +RAPTLY +RAPTNESS +RAPTNESSES +RAPTOR +RAPTORIAL +RAPTORS +RAPTURE +RAPTURED +RAPTURES +RAPTURING +RAPTUROUS +RAPTUROUSLY +RAPTUROUSNESS +RAPTUROUSNESSES +RARE +RAREBIT +RAREBITS +RARED +RAREFACTION +RAREFACTIONAL +RAREFACTIONS +RAREFIED +RAREFIER +RAREFIERS +RAREFIES +RAREFY +RAREFYING +RARELY +RARENESS +RARENESSES +RARER +RARERIPE +RARERIPES +RARES +RAREST +RARIFIED +RARIFIES +RARIFY +RARIFYING +RARING +RARITIES +RARITY +RAS +RASBORA +RASBORAS +RASCAL +RASCALITIES +RASCALITY +RASCALLY +RASCALS +RASE +RASED +RASER +RASERS +RASES +RASH +RASHER +RASHERS +RASHES +RASHEST +RASHLIKE +RASHLY +RASHNESS +RASHNESSES +RASING +RASORIAL +RASP +RASPBERRIES +RASPBERRY +RASPED +RASPER +RASPERS +RASPIER +RASPIEST +RASPINESS +RASPINESSES +RASPING +RASPINGLY +RASPINGS +RASPISH +RASPS +RASPY +RASSLE +RASSLED +RASSLES +RASSLING +RASTER +RASTERS +RASURE +RASURES +RAT +RATABLE +RATABLES +RATABLY +RATAFEE +RATAFEES +RATAFIA +RATAFIAS +RATAL +RATALS +RATAN +RATANIES +RATANS +RATANY +RATAPLAN +RATAPLANNED +RATAPLANNING +RATAPLANS +RATATAT +RATATATS +RATATOUILLE +RATATOUILLES +RATBAG +RATBAGS +RATCH +RATCHES +RATCHET +RATCHETED +RATCHETING +RATCHETS +RATE +RATEABLE +RATEABLY +RATED +RATEL +RATELS +RATEMETER +RATEMETERS +RATEPAYER +RATEPAYERS +RATER +RATERS +RATES +RATFINK +RATFINKS +RATFISH +RATFISHES +RATH +RATHE +RATHER +RATHOLE +RATHOLES +RATHSKELLER +RATHSKELLERS +RATICIDE +RATICIDES +RATIFICATION +RATIFICATIONS +RATIFIED +RATIFIER +RATIFIERS +RATIFIES +RATIFY +RATIFYING +RATINE +RATINES +RATING +RATINGS +RATIO +RATIOCINATE +RATIOCINATED +RATIOCINATES +RATIOCINATING +RATIOCINATION +RATIOCINATIONS +RATIOCINATIVE +RATIOCINATOR +RATIOCINATORS +RATION +RATIONAL +RATIONALE +RATIONALES +RATIONALISE +RATIONALISED +RATIONALISES +RATIONALISING +RATIONALISM +RATIONALISMS +RATIONALIST +RATIONALISTIC +RATIONALISTS +RATIONALITIES +RATIONALITY +RATIONALIZABLE +RATIONALIZATION +RATIONALIZE +RATIONALIZED +RATIONALIZER +RATIONALIZERS +RATIONALIZES +RATIONALIZING +RATIONALLY +RATIONALNESS +RATIONALNESSES +RATIONALS +RATIONED +RATIONING +RATIONS +RATIOS +RATITE +RATITES +RATLIKE +RATLIN +RATLINE +RATLINES +RATLINS +RATO +RATOON +RATOONED +RATOONER +RATOONERS +RATOONING +RATOONS +RATOS +RATS +RATSBANE +RATSBANES +RATTAIL +RATTAILED +RATTAILS +RATTAN +RATTANS +RATTED +RATTEEN +RATTEENS +RATTEN +RATTENED +RATTENER +RATTENERS +RATTENING +RATTENS +RATTER +RATTERS +RATTIER +RATTIEST +RATTING +RATTISH +RATTLE +RATTLEBOX +RATTLEBOXES +RATTLEBRAIN +RATTLEBRAINED +RATTLEBRAINS +RATTLED +RATTLER +RATTLERS +RATTLES +RATTLESNAKE +RATTLESNAKES +RATTLETRAP +RATTLETRAPS +RATTLING +RATTLINGLY +RATTLINGS +RATTLY +RATTON +RATTONS +RATTOON +RATTOONED +RATTOONING +RATTOONS +RATTRAP +RATTRAPS +RATTY +RAUCITIES +RAUCITY +RAUCOUS +RAUCOUSLY +RAUCOUSNESS +RAUCOUSNESSES +RAUNCH +RAUNCHES +RAUNCHIER +RAUNCHIEST +RAUNCHILY +RAUNCHINESS +RAUNCHINESSES +RAUNCHY +RAUWOLFIA +RAUWOLFIAS +RAVAGE +RAVAGED +RAVAGEMENT +RAVAGEMENTS +RAVAGER +RAVAGERS +RAVAGES +RAVAGING +RAVE +RAVED +RAVEL +RAVELED +RAVELER +RAVELERS +RAVELIN +RAVELING +RAVELINGS +RAVELINS +RAVELLED +RAVELLER +RAVELLERS +RAVELLING +RAVELLINGS +RAVELLY +RAVELMENT +RAVELMENTS +RAVELS +RAVEN +RAVENED +RAVENER +RAVENERS +RAVENING +RAVENINGS +RAVENLIKE +RAVENOUS +RAVENOUSLY +RAVENOUSNESS +RAVENOUSNESSES +RAVENS +RAVER +RAVERS +RAVES +RAVIGOTE +RAVIGOTES +RAVIGOTTE +RAVIGOTTES +RAVIN +RAVINE +RAVINED +RAVINES +RAVING +RAVINGLY +RAVINGS +RAVINING +RAVINS +RAVIOLI +RAVIOLIS +RAVISH +RAVISHED +RAVISHER +RAVISHERS +RAVISHES +RAVISHING +RAVISHINGLY +RAVISHMENT +RAVISHMENTS +RAW +RAWBONED +RAWER +RAWEST +RAWHIDE +RAWHIDED +RAWHIDES +RAWHIDING +RAWIN +RAWINS +RAWINSONDE +RAWINSONDES +RAWISH +RAWLY +RAWNESS +RAWNESSES +RAWS +RAX +RAXED +RAXES +RAXING +RAY +RAYA +RAYAH +RAYAHS +RAYAS +RAYED +RAYGRASS +RAYGRASSES +RAYING +RAYLESS +RAYLESSNESS +RAYLESSNESSES +RAYLIKE +RAYON +RAYONS +RAYS +RAZE +RAZED +RAZEE +RAZEED +RAZEEING +RAZEES +RAZER +RAZERS +RAZES +RAZING +RAZOR +RAZORBACK +RAZORBACKS +RAZORBILL +RAZORBILLS +RAZORED +RAZORING +RAZORS +RAZZ +RAZZAMATAZZ +RAZZAMATAZZES +RAZZBERRIES +RAZZBERRY +RAZZED +RAZZES +RAZZING +RAZZMATAZZ +RAZZMATAZZES +RE +REABSORB +REABSORBED +REABSORBING +REABSORBS +REACCEDE +REACCEDED +REACCEDES +REACCEDING +REACCELERATE +REACCELERATED +REACCELERATES +REACCELERATING +REACCENT +REACCENTED +REACCENTING +REACCENTS +REACCEPT +REACCEPTED +REACCEPTING +REACCEPTS +REACCESSION +REACCESSIONS +REACCLAIM +REACCLAIMED +REACCLAIMING +REACCLAIMS +REACCLIMATIZE +REACCLIMATIZED +REACCLIMATIZES +REACCLIMATIZING +REACCREDIT +REACCREDITATION +REACCREDITED +REACCREDITING +REACCREDITS +REACCUSE +REACCUSED +REACCUSES +REACCUSING +REACH +REACHABLE +REACHED +REACHER +REACHERS +REACHES +REACHING +REACQUAINT +REACQUAINTED +REACQUAINTING +REACQUAINTS +REACQUIRE +REACQUIRED +REACQUIRES +REACQUIRING +REACQUISITION +REACQUISITIONS +REACT +REACTANCE +REACTANCES +REACTANT +REACTANTS +REACTED +REACTING +REACTION +REACTIONARIES +REACTIONARY +REACTIONARYISM +REACTIONARYISMS +REACTIONS +REACTIVATE +REACTIVATED +REACTIVATES +REACTIVATING +REACTIVATION +REACTIVATIONS +REACTIVE +REACTIVELY +REACTIVENESS +REACTIVENESSES +REACTIVITIES +REACTIVITY +REACTOR +REACTORS +REACTS +READ +READABILITIES +READABILITY +READABLE +READABLENESS +READABLENESSES +READABLY +READAPT +READAPTED +READAPTING +READAPTS +READD +READDED +READDICT +READDICTED +READDICTING +READDICTS +READDING +READDRESS +READDRESSED +READDRESSES +READDRESSING +READDS +READER +READERLY +READERS +READERSHIP +READERSHIPS +READIED +READIER +READIES +READIEST +READILY +READINESS +READINESSES +READING +READINGS +READJUST +READJUSTED +READJUSTING +READJUSTMENT +READJUSTMENTS +READJUSTS +READMISSION +READMISSIONS +READMIT +READMITS +READMITTED +READMITTING +READOPT +READOPTED +READOPTING +READOPTS +READORN +READORNED +READORNING +READORNS +READOUT +READOUTS +READS +READY +READYING +READYMADE +READYMADES +REAFFIRM +REAFFIRMATION +REAFFIRMATIONS +REAFFIRMED +REAFFIRMING +REAFFIRMS +REAFFIX +REAFFIXED +REAFFIXES +REAFFIXING +REAFFOREST +REAFFORESTATION +REAFFORESTED +REAFFORESTING +REAFFORESTS +REAGENT +REAGENTS +REAGGREGATE +REAGGREGATED +REAGGREGATES +REAGGREGATING +REAGGREGATION +REAGGREGATIONS +REAGIN +REAGINIC +REAGINS +REAL +REALER +REALES +REALEST +REALGAR +REALGARS +REALIA +REALIGN +REALIGNED +REALIGNING +REALIGNMENT +REALIGNMENTS +REALIGNS +REALISE +REALISED +REALISER +REALISERS +REALISES +REALISING +REALISM +REALISMS +REALIST +REALISTIC +REALISTICALLY +REALISTS +REALITIES +REALITY +REALIZABLE +REALIZATION +REALIZATIONS +REALIZE +REALIZED +REALIZER +REALIZERS +REALIZES +REALIZING +REALLOCATE +REALLOCATED +REALLOCATES +REALLOCATING +REALLOCATION +REALLOCATIONS +REALLOT +REALLOTS +REALLOTTED +REALLOTTING +REALLY +REALM +REALMS +REALNESS +REALNESSES +REALPOLITIK +REALPOLITIKS +REALS +REALTER +REALTERED +REALTERING +REALTERS +REALTIES +REALTOR +REALTORS +REALTY +REAM +REAMED +REAMER +REAMERS +REAMING +REAMS +REANALYSES +REANALYSIS +REANALYZE +REANALYZED +REANALYZES +REANALYZING +REANIMATE +REANIMATED +REANIMATES +REANIMATING +REANIMATION +REANIMATIONS +REANNEX +REANNEXATION +REANNEXATIONS +REANNEXED +REANNEXES +REANNEXING +REANOINT +REANOINTED +REANOINTING +REANOINTS +REAP +REAPABLE +REAPED +REAPER +REAPERS +REAPHOOK +REAPHOOKS +REAPING +REAPPEAR +REAPPEARANCE +REAPPEARANCES +REAPPEARED +REAPPEARING +REAPPEARS +REAPPLICATION +REAPPLICATIONS +REAPPLIED +REAPPLIES +REAPPLY +REAPPLYING +REAPPOINT +REAPPOINTED +REAPPOINTING +REAPPOINTMENT +REAPPOINTMENTS +REAPPOINTS +REAPPORTION +REAPPORTIONED +REAPPORTIONING +REAPPORTIONMENT +REAPPORTIONS +REAPPRAISAL +REAPPRAISALS +REAPPRAISE +REAPPRAISED +REAPPRAISES +REAPPRAISING +REAPPROPRIATE +REAPPROPRIATED +REAPPROPRIATES +REAPPROPRIATING +REAPPROVE +REAPPROVED +REAPPROVES +REAPPROVING +REAPS +REAR +REARED +REARER +REARERS +REARGUARD +REARGUE +REARGUED +REARGUES +REARGUING +REARGUMENT +REARGUMENTS +REARING +REARM +REARMAMENT +REARMAMENTS +REARMED +REARMICE +REARMING +REARMOST +REARMOUSE +REARMS +REAROUSAL +REAROUSALS +REAROUSE +REAROUSED +REAROUSES +REAROUSING +REARRANGE +REARRANGED +REARRANGEMENT +REARRANGEMENTS +REARRANGES +REARRANGING +REARREST +REARRESTED +REARRESTING +REARRESTS +REARS +REARTICULATE +REARTICULATED +REARTICULATES +REARTICULATING +REARWARD +REARWARDS +REASCEND +REASCENDED +REASCENDING +REASCENDS +REASCENT +REASCENTS +REASON +REASONABILITIES +REASONABILITY +REASONABLE +REASONABLENESS +REASONABLY +REASONED +REASONER +REASONERS +REASONING +REASONINGS +REASONLESS +REASONLESSLY +REASONS +REASSAIL +REASSAILED +REASSAILING +REASSAILS +REASSEMBLAGE +REASSEMBLAGES +REASSEMBLE +REASSEMBLED +REASSEMBLES +REASSEMBLIES +REASSEMBLING +REASSEMBLY +REASSERT +REASSERTED +REASSERTING +REASSERTION +REASSERTIONS +REASSERTS +REASSESS +REASSESSED +REASSESSES +REASSESSING +REASSESSMENT +REASSESSMENTS +REASSIGN +REASSIGNED +REASSIGNING +REASSIGNMENT +REASSIGNMENTS +REASSIGNS +REASSORT +REASSORTED +REASSORTING +REASSORTS +REASSUME +REASSUMED +REASSUMES +REASSUMING +REASSURANCE +REASSURANCES +REASSURE +REASSURED +REASSURES +REASSURING +REASSURINGLY +REATA +REATAS +REATTACH +REATTACHED +REATTACHES +REATTACHING +REATTACHMENT +REATTACHMENTS +REATTACK +REATTACKED +REATTACKING +REATTACKS +REATTAIN +REATTAINED +REATTAINING +REATTAINS +REATTEMPT +REATTEMPTED +REATTEMPTING +REATTEMPTS +REATTRIBUTE +REATTRIBUTED +REATTRIBUTES +REATTRIBUTING +REATTRIBUTION +REATTRIBUTIONS +REAUTHORIZATION +REAUTHORIZE +REAUTHORIZED +REAUTHORIZES +REAUTHORIZING +REAVAIL +REAVAILED +REAVAILING +REAVAILS +REAVE +REAVED +REAVER +REAVERS +REAVES +REAVING +REAVOW +REAVOWED +REAVOWING +REAVOWS +REAWAKE +REAWAKED +REAWAKEN +REAWAKENED +REAWAKENING +REAWAKENS +REAWAKES +REAWAKING +REAWOKE +REAWOKEN +REB +REBAIT +REBAITED +REBAITING +REBAITS +REBALANCE +REBALANCED +REBALANCES +REBALANCING +REBAPTISM +REBAPTISMS +REBAPTIZE +REBAPTIZED +REBAPTIZES +REBAPTIZING +REBAR +REBARBATIVE +REBARBATIVELY +REBARS +REBATE +REBATED +REBATER +REBATERS +REBATES +REBATING +REBATO +REBATOS +REBBE +REBBES +REBBETZIN +REBBETZINS +REBEC +REBECK +REBECKS +REBECS +REBEGAN +REBEGIN +REBEGINNING +REBEGINS +REBEGUN +REBEL +REBELDOM +REBELDOMS +REBELLED +REBELLING +REBELLION +REBELLIONS +REBELLIOUS +REBELLIOUSLY +REBELLIOUSNESS +REBELS +REBID +REBIDDEN +REBIDDING +REBIDS +REBILL +REBILLED +REBILLING +REBILLS +REBIND +REBINDING +REBINDS +REBIRTH +REBIRTHS +REBLEND +REBLENDED +REBLENDING +REBLENDS +REBLENT +REBLOOM +REBLOOMED +REBLOOMING +REBLOOMS +REBOANT +REBOARD +REBOARDED +REBOARDING +REBOARDS +REBODIED +REBODIES +REBODY +REBODYING +REBOIL +REBOILED +REBOILING +REBOILS +REBOOK +REBOOKED +REBOOKING +REBOOKS +REBOOT +REBOOTED +REBOOTING +REBOOTS +REBOP +REBOPS +REBORE +REBORED +REBORES +REBORING +REBORN +REBOTTLE +REBOTTLED +REBOTTLES +REBOTTLING +REBOUGHT +REBOUND +REBOUNDED +REBOUNDER +REBOUNDERS +REBOUNDING +REBOUNDS +REBOZO +REBOZOS +REBRANCH +REBRANCHED +REBRANCHES +REBRANCHING +REBRED +REBREED +REBREEDING +REBREEDS +REBROADCAST +REBROADCASTING +REBROADCASTS +REBS +REBUFF +REBUFFED +REBUFFING +REBUFFS +REBUILD +REBUILDED +REBUILDING +REBUILDS +REBUILT +REBUKE +REBUKED +REBUKER +REBUKERS +REBUKES +REBUKING +REBURIAL +REBURIALS +REBURIED +REBURIES +REBURY +REBURYING +REBUS +REBUSES +REBUT +REBUTS +REBUTTABLE +REBUTTAL +REBUTTALS +REBUTTED +REBUTTER +REBUTTERS +REBUTTING +REBUTTON +REBUTTONED +REBUTTONING +REBUTTONS +REBUY +REBUYING +REBUYS +REC +RECALCITRANCE +RECALCITRANCES +RECALCITRANCIES +RECALCITRANCY +RECALCITRANT +RECALCITRANTS +RECALCULATE +RECALCULATED +RECALCULATES +RECALCULATING +RECALCULATION +RECALCULATIONS +RECALIBRATE +RECALIBRATED +RECALIBRATES +RECALIBRATING +RECALIBRATION +RECALIBRATIONS +RECALL +RECALLABILITIES +RECALLABILITY +RECALLABLE +RECALLED +RECALLER +RECALLERS +RECALLING +RECALLS +RECAMIER +RECAMIERS +RECANALIZATION +RECANALIZATIONS +RECANALIZE +RECANALIZED +RECANALIZES +RECANALIZING +RECANE +RECANED +RECANES +RECANING +RECANT +RECANTATION +RECANTATIONS +RECANTED +RECANTER +RECANTERS +RECANTING +RECANTS +RECAP +RECAPITALIZE +RECAPITALIZED +RECAPITALIZES +RECAPITALIZING +RECAPITULATE +RECAPITULATED +RECAPITULATES +RECAPITULATING +RECAPITULATION +RECAPITULATIONS +RECAPPABLE +RECAPPED +RECAPPING +RECAPS +RECAPTURE +RECAPTURED +RECAPTURES +RECAPTURING +RECARPET +RECARPETED +RECARPETING +RECARPETS +RECARRIED +RECARRIES +RECARRY +RECARRYING +RECAST +RECASTING +RECASTS +RECATALOG +RECATALOGED +RECATALOGING +RECATALOGS +RECAUTION +RECAUTIONED +RECAUTIONING +RECAUTIONS +RECCE +RECCES +RECEDE +RECEDED +RECEDES +RECEDING +RECEIPT +RECEIPTED +RECEIPTING +RECEIPTOR +RECEIPTORS +RECEIPTS +RECEIVABLE +RECEIVABLES +RECEIVE +RECEIVED +RECEIVER +RECEIVERS +RECEIVERSHIP +RECEIVERSHIPS +RECEIVES +RECEIVING +RECEMENT +RECEMENTED +RECEMENTING +RECEMENTS +RECENCIES +RECENCY +RECENSION +RECENSIONS +RECENSOR +RECENSORED +RECENSORING +RECENSORS +RECENT +RECENTER +RECENTEST +RECENTLY +RECENTNESS +RECENTNESSES +RECENTRIFUGE +RECENTRIFUGED +RECENTRIFUGES +RECENTRIFUGING +RECEPT +RECEPTACLE +RECEPTACLES +RECEPTION +RECEPTIONIST +RECEPTIONISTS +RECEPTIONS +RECEPTIVE +RECEPTIVELY +RECEPTIVENESS +RECEPTIVENESSES +RECEPTIVITIES +RECEPTIVITY +RECEPTOR +RECEPTORS +RECEPTS +RECERTIFICATION +RECERTIFIED +RECERTIFIES +RECERTIFY +RECERTIFYING +RECESS +RECESSED +RECESSES +RECESSING +RECESSION +RECESSIONAL +RECESSIONALS +RECESSIONARY +RECESSIONS +RECESSIVE +RECESSIVELY +RECESSIVENESS +RECESSIVENESSES +RECESSIVES +RECHALLENGE +RECHALLENGED +RECHALLENGES +RECHALLENGING +RECHANGE +RECHANGED +RECHANGES +RECHANGING +RECHANNEL +RECHANNELED +RECHANNELING +RECHANNELLED +RECHANNELLING +RECHANNELS +RECHARGE +RECHARGEABLE +RECHARGED +RECHARGER +RECHARGERS +RECHARGES +RECHARGING +RECHART +RECHARTED +RECHARTER +RECHARTERED +RECHARTERING +RECHARTERS +RECHARTING +RECHARTS +RECHAUFFE +RECHAUFFES +RECHEAT +RECHEATS +RECHECK +RECHECKED +RECHECKING +RECHECKS +RECHERCHE +RECHEW +RECHEWED +RECHEWING +RECHEWS +RECHOOSE +RECHOOSES +RECHOOSING +RECHOREOGRAPH +RECHOREOGRAPHED +RECHOREOGRAPHS +RECHOSE +RECHOSEN +RECHRISTEN +RECHRISTENED +RECHRISTENING +RECHRISTENS +RECHROMATOGRAPH +RECIDIVISM +RECIDIVISMS +RECIDIVIST +RECIDIVISTIC +RECIDIVISTS +RECIPE +RECIPES +RECIPIENT +RECIPIENTS +RECIPROCAL +RECIPROCALLY +RECIPROCALS +RECIPROCATE +RECIPROCATED +RECIPROCATES +RECIPROCATING +RECIPROCATION +RECIPROCATIONS +RECIPROCATIVE +RECIPROCATOR +RECIPROCATORS +RECIPROCITIES +RECIPROCITY +RECIRCLE +RECIRCLED +RECIRCLES +RECIRCLING +RECIRCULATE +RECIRCULATED +RECIRCULATES +RECIRCULATING +RECIRCULATION +RECIRCULATIONS +RECISION +RECISIONS +RECIT +RECITAL +RECITALIST +RECITALISTS +RECITALS +RECITATION +RECITATIONS +RECITATIVE +RECITATIVES +RECITATIVI +RECITATIVO +RECITATIVOS +RECITE +RECITED +RECITER +RECITERS +RECITES +RECITING +RECITS +RECK +RECKED +RECKING +RECKLESS +RECKLESSLY +RECKLESSNESS +RECKLESSNESSES +RECKON +RECKONED +RECKONER +RECKONERS +RECKONING +RECKONINGS +RECKONS +RECKS +RECLAD +RECLADDED +RECLADDING +RECLADS +RECLAIM +RECLAIMABLE +RECLAIMED +RECLAIMER +RECLAIMERS +RECLAIMING +RECLAIMS +RECLAMATION +RECLAMATIONS +RECLAME +RECLAMES +RECLASP +RECLASPED +RECLASPING +RECLASPS +RECLASSIFIED +RECLASSIFIES +RECLASSIFY +RECLASSIFYING +RECLEAN +RECLEANED +RECLEANING +RECLEANS +RECLINATE +RECLINE +RECLINED +RECLINER +RECLINERS +RECLINES +RECLINING +RECLOSABLE +RECLOTHE +RECLOTHED +RECLOTHES +RECLOTHING +RECLUSE +RECLUSES +RECLUSION +RECLUSIONS +RECLUSIVE +RECLUSIVELY +RECLUSIVENESS +RECLUSIVENESSES +RECOAL +RECOALED +RECOALING +RECOALS +RECOAT +RECOATED +RECOATING +RECOATS +RECOCK +RECOCKED +RECOCKING +RECOCKS +RECODE +RECODED +RECODES +RECODIFICATION +RECODIFICATIONS +RECODIFIED +RECODIFIES +RECODIFY +RECODIFYING +RECODING +RECOGNISE +RECOGNISED +RECOGNISES +RECOGNISING +RECOGNITION +RECOGNITIONS +RECOGNIZABILITY +RECOGNIZABLE +RECOGNIZABLY +RECOGNIZANCE +RECOGNIZANCES +RECOGNIZE +RECOGNIZED +RECOGNIZER +RECOGNIZERS +RECOGNIZES +RECOGNIZING +RECOIL +RECOILED +RECOILER +RECOILERS +RECOILING +RECOILLESS +RECOILS +RECOIN +RECOINAGE +RECOINAGES +RECOINED +RECOINING +RECOINS +RECOLLECT +RECOLLECTED +RECOLLECTING +RECOLLECTION +RECOLLECTIONS +RECOLLECTS +RECOLONIZATION +RECOLONIZATIONS +RECOLONIZE +RECOLONIZED +RECOLONIZES +RECOLONIZING +RECOLOR +RECOLORED +RECOLORING +RECOLORS +RECOMB +RECOMBED +RECOMBINANT +RECOMBINANTS +RECOMBINATION +RECOMBINATIONAL +RECOMBINATIONS +RECOMBINE +RECOMBINED +RECOMBINES +RECOMBING +RECOMBINING +RECOMBS +RECOMMENCE +RECOMMENCED +RECOMMENCEMENT +RECOMMENCEMENTS +RECOMMENCES +RECOMMENCING +RECOMMEND +RECOMMENDABLE +RECOMMENDATION +RECOMMENDATIONS +RECOMMENDATORY +RECOMMENDED +RECOMMENDER +RECOMMENDERS +RECOMMENDING +RECOMMENDS +RECOMMISSION +RECOMMISSIONED +RECOMMISSIONING +RECOMMISSIONS +RECOMMIT +RECOMMITMENT +RECOMMITMENTS +RECOMMITS +RECOMMITTAL +RECOMMITTALS +RECOMMITTED +RECOMMITTING +RECOMPENSE +RECOMPENSED +RECOMPENSES +RECOMPENSING +RECOMPILATION +RECOMPILATIONS +RECOMPILE +RECOMPILED +RECOMPILES +RECOMPILING +RECOMPOSE +RECOMPOSED +RECOMPOSES +RECOMPOSING +RECOMPOSITION +RECOMPOSITIONS +RECOMPUTATION +RECOMPUTATIONS +RECOMPUTE +RECOMPUTED +RECOMPUTES +RECOMPUTING +RECON +RECONCEIVE +RECONCEIVED +RECONCEIVES +RECONCEIVING +RECONCENTRATE +RECONCENTRATED +RECONCENTRATES +RECONCENTRATING +RECONCENTRATION +RECONCEPTION +RECONCEPTIONS +RECONCEPTUALIZE +RECONCILABILITY +RECONCILABLE +RECONCILE +RECONCILED +RECONCILEMENT +RECONCILEMENTS +RECONCILER +RECONCILERS +RECONCILES +RECONCILIATION +RECONCILIATIONS +RECONCILIATORY +RECONCILING +RECONDENSE +RECONDENSED +RECONDENSES +RECONDENSING +RECONDITE +RECONDITELY +RECONDITENESS +RECONDITENESSES +RECONDITION +RECONDITIONED +RECONDITIONING +RECONDITIONS +RECONDUCT +RECONDUCTED +RECONDUCTING +RECONDUCTS +RECONFER +RECONFERRED +RECONFERRING +RECONFERS +RECONFIGURATION +RECONFIGURE +RECONFIGURED +RECONFIGURES +RECONFIGURING +RECONFINE +RECONFINED +RECONFINES +RECONFINING +RECONFIRM +RECONFIRMATION +RECONFIRMATIONS +RECONFIRMED +RECONFIRMING +RECONFIRMS +RECONNAISSANCE +RECONNAISSANCES +RECONNECT +RECONNECTED +RECONNECTING +RECONNECTION +RECONNECTIONS +RECONNECTS +RECONNED +RECONNING +RECONNOITER +RECONNOITERED +RECONNOITERING +RECONNOITERS +RECONNOITRE +RECONNOITRED +RECONNOITRES +RECONNOITRING +RECONQUER +RECONQUERED +RECONQUERING +RECONQUERS +RECONQUEST +RECONQUESTS +RECONS +RECONSECRATE +RECONSECRATED +RECONSECRATES +RECONSECRATING +RECONSECRATION +RECONSECRATIONS +RECONSIDER +RECONSIDERATION +RECONSIDERED +RECONSIDERING +RECONSIDERS +RECONSIGN +RECONSIGNED +RECONSIGNING +RECONSIGNS +RECONSOLE +RECONSOLED +RECONSOLES +RECONSOLIDATE +RECONSOLIDATED +RECONSOLIDATES +RECONSOLIDATING +RECONSOLING +RECONSTITUTE +RECONSTITUTED +RECONSTITUTES +RECONSTITUTING +RECONSTITUTION +RECONSTITUTIONS +RECONSTRUCT +RECONSTRUCTED +RECONSTRUCTIBLE +RECONSTRUCTING +RECONSTRUCTION +RECONSTRUCTIONS +RECONSTRUCTIVE +RECONSTRUCTOR +RECONSTRUCTORS +RECONSTRUCTS +RECONSULT +RECONSULTED +RECONSULTING +RECONSULTS +RECONTACT +RECONTACTED +RECONTACTING +RECONTACTS +RECONTAMINATE +RECONTAMINATED +RECONTAMINATES +RECONTAMINATING +RECONTAMINATION +RECONTEXTUALIZE +RECONTOUR +RECONTOURED +RECONTOURING +RECONTOURS +RECONVENE +RECONVENED +RECONVENES +RECONVENING +RECONVERSION +RECONVERSIONS +RECONVERT +RECONVERTED +RECONVERTING +RECONVERTS +RECONVEY +RECONVEYANCE +RECONVEYANCES +RECONVEYED +RECONVEYING +RECONVEYS +RECONVICT +RECONVICTED +RECONVICTING +RECONVICTION +RECONVICTIONS +RECONVICTS +RECONVINCE +RECONVINCED +RECONVINCES +RECONVINCING +RECOOK +RECOOKED +RECOOKING +RECOOKS +RECOPIED +RECOPIES +RECOPY +RECOPYING +RECORD +RECORDABLE +RECORDATION +RECORDATIONS +RECORDED +RECORDER +RECORDERS +RECORDING +RECORDINGS +RECORDIST +RECORDISTS +RECORDS +RECORK +RECORKED +RECORKING +RECORKS +RECOUNT +RECOUNTAL +RECOUNTALS +RECOUNTED +RECOUNTER +RECOUNTERS +RECOUNTING +RECOUNTS +RECOUP +RECOUPABLE +RECOUPE +RECOUPED +RECOUPING +RECOUPLE +RECOUPLED +RECOUPLES +RECOUPLING +RECOUPMENT +RECOUPMENTS +RECOUPS +RECOURSE +RECOURSES +RECOVER +RECOVERABILITY +RECOVERABLE +RECOVERED +RECOVERER +RECOVERERS +RECOVERIES +RECOVERING +RECOVERS +RECOVERY +RECRATE +RECRATED +RECRATES +RECRATING +RECREANCE +RECREANCES +RECREANCIES +RECREANCY +RECREANT +RECREANTS +RECREATE +RECREATED +RECREATES +RECREATING +RECREATION +RECREATIONAL +RECREATIONIST +RECREATIONISTS +RECREATIONS +RECREATIVE +RECREMENT +RECREMENTS +RECRIMINATE +RECRIMINATED +RECRIMINATES +RECRIMINATING +RECRIMINATION +RECRIMINATIONS +RECRIMINATIVE +RECRIMINATORY +RECROSS +RECROSSED +RECROSSES +RECROSSING +RECROWN +RECROWNED +RECROWNING +RECROWNS +RECRUDESCE +RECRUDESCED +RECRUDESCENCE +RECRUDESCENCES +RECRUDESCENT +RECRUDESCES +RECRUDESCING +RECRUIT +RECRUITED +RECRUITER +RECRUITERS +RECRUITING +RECRUITMENT +RECRUITMENTS +RECRUITS +RECRYSTALLIZE +RECRYSTALLIZED +RECRYSTALLIZES +RECRYSTALLIZING +RECS +RECTA +RECTAL +RECTALLY +RECTANGLE +RECTANGLES +RECTANGULAR +RECTANGULARITY +RECTANGULARLY +RECTI +RECTIFIABILITY +RECTIFIABLE +RECTIFICATION +RECTIFICATIONS +RECTIFIED +RECTIFIER +RECTIFIERS +RECTIFIES +RECTIFY +RECTIFYING +RECTILINEAR +RECTILINEARLY +RECTITUDE +RECTITUDES +RECTITUDINOUS +RECTO +RECTOCELE +RECTOCELES +RECTOR +RECTORATE +RECTORATES +RECTORIAL +RECTORIES +RECTORS +RECTORSHIP +RECTORSHIPS +RECTORY +RECTOS +RECTRICES +RECTRIX +RECTUM +RECTUMS +RECTUS +RECULTIVATE +RECULTIVATED +RECULTIVATES +RECULTIVATING +RECUMBENCIES +RECUMBENCY +RECUMBENT +RECUPERATE +RECUPERATED +RECUPERATES +RECUPERATING +RECUPERATION +RECUPERATIONS +RECUPERATIVE +RECUR +RECURRED +RECURRENCE +RECURRENCES +RECURRENT +RECURRENTLY +RECURRING +RECURS +RECURSION +RECURSIONS +RECURSIVE +RECURSIVELY +RECURSIVENESS +RECURSIVENESSES +RECURVATE +RECURVE +RECURVED +RECURVES +RECURVING +RECUSAL +RECUSALS +RECUSANCIES +RECUSANCY +RECUSANT +RECUSANTS +RECUSE +RECUSED +RECUSES +RECUSING +RECUT +RECUTS +RECUTTING +RECYCLABLE +RECYCLABLES +RECYCLE +RECYCLED +RECYCLER +RECYCLERS +RECYCLES +RECYCLING +RED +REDACT +REDACTED +REDACTING +REDACTION +REDACTIONAL +REDACTIONS +REDACTOR +REDACTORS +REDACTS +REDAMAGE +REDAMAGED +REDAMAGES +REDAMAGING +REDAN +REDANS +REDARGUE +REDARGUED +REDARGUES +REDARGUING +REDATE +REDATED +REDATES +REDATING +REDBAIT +REDBAITED +REDBAITER +REDBAITERS +REDBAITING +REDBAITS +REDBAY +REDBAYS +REDBIRD +REDBIRDS +REDBONE +REDBONES +REDBREAST +REDBREASTS +REDBRICK +REDBRICKS +REDBUD +REDBUDS +REDBUG +REDBUGS +REDCAP +REDCAPS +REDCOAT +REDCOATS +REDD +REDDED +REDDEN +REDDENED +REDDENING +REDDENS +REDDER +REDDERS +REDDEST +REDDING +REDDISH +REDDISHNESS +REDDISHNESSES +REDDLE +REDDLED +REDDLES +REDDLING +REDDS +REDE +REDEAR +REDEARS +REDECIDE +REDECIDED +REDECIDES +REDECIDING +REDECORATE +REDECORATED +REDECORATES +REDECORATING +REDECORATION +REDECORATIONS +REDECORATOR +REDECORATORS +REDED +REDEDICATE +REDEDICATED +REDEDICATES +REDEDICATING +REDEDICATION +REDEDICATIONS +REDEEM +REDEEMABLE +REDEEMED +REDEEMER +REDEEMERS +REDEEMING +REDEEMS +REDEFEAT +REDEFEATED +REDEFEATING +REDEFEATS +REDEFECT +REDEFECTED +REDEFECTING +REDEFECTS +REDEFIED +REDEFIES +REDEFINE +REDEFINED +REDEFINES +REDEFINING +REDEFINITION +REDEFINITIONS +REDEFY +REDEFYING +REDELIVER +REDELIVERED +REDELIVERIES +REDELIVERING +REDELIVERS +REDELIVERY +REDEMAND +REDEMANDED +REDEMANDING +REDEMANDS +REDEMPTION +REDEMPTIONER +REDEMPTIONERS +REDEMPTIONS +REDEMPTIVE +REDEMPTORY +REDENIED +REDENIES +REDENY +REDENYING +REDEPLOY +REDEPLOYED +REDEPLOYING +REDEPLOYMENT +REDEPLOYMENTS +REDEPLOYS +REDEPOSIT +REDEPOSITED +REDEPOSITING +REDEPOSITS +REDES +REDESCEND +REDESCENDED +REDESCENDING +REDESCENDS +REDESCRIBE +REDESCRIBED +REDESCRIBES +REDESCRIBING +REDESCRIPTION +REDESCRIPTIONS +REDESIGN +REDESIGNED +REDESIGNING +REDESIGNS +REDETERMINATION +REDETERMINE +REDETERMINED +REDETERMINES +REDETERMINING +REDEVELOP +REDEVELOPED +REDEVELOPER +REDEVELOPERS +REDEVELOPING +REDEVELOPMENT +REDEVELOPMENTS +REDEVELOPS +REDEYE +REDEYES +REDFIN +REDFINS +REDFISH +REDFISHES +REDHEAD +REDHEADED +REDHEADS +REDHORSE +REDHORSES +REDIA +REDIAE +REDIAL +REDIALED +REDIALING +REDIALLED +REDIALLING +REDIALS +REDIAS +REDICTATE +REDICTATED +REDICTATES +REDICTATING +REDID +REDIGEST +REDIGESTED +REDIGESTING +REDIGESTION +REDIGESTIONS +REDIGESTS +REDIGRESS +REDIGRESSED +REDIGRESSES +REDIGRESSING +REDING +REDINGOTE +REDINGOTES +REDINTEGRATE +REDINTEGRATED +REDINTEGRATES +REDINTEGRATING +REDINTEGRATION +REDINTEGRATIONS +REDINTEGRATIVE +REDIP +REDIPPED +REDIPPING +REDIPS +REDIPT +REDIRECT +REDIRECTED +REDIRECTING +REDIRECTION +REDIRECTIONS +REDIRECTS +REDISCOUNT +REDISCOUNTABLE +REDISCOUNTED +REDISCOUNTING +REDISCOUNTS +REDISCOVER +REDISCOVERED +REDISCOVERIES +REDISCOVERING +REDISCOVERS +REDISCOVERY +REDISCUSS +REDISCUSSED +REDISCUSSES +REDISCUSSING +REDISPLAY +REDISPLAYED +REDISPLAYING +REDISPLAYS +REDISPOSE +REDISPOSED +REDISPOSES +REDISPOSING +REDISPOSITION +REDISPOSITIONS +REDISSOLVE +REDISSOLVED +REDISSOLVES +REDISSOLVING +REDISTILL +REDISTILLATION +REDISTILLATIONS +REDISTILLED +REDISTILLING +REDISTILLS +REDISTRIBUTE +REDISTRIBUTED +REDISTRIBUTES +REDISTRIBUTING +REDISTRIBUTION +REDISTRIBUTIONS +REDISTRIBUTIVE +REDISTRICT +REDISTRICTED +REDISTRICTING +REDISTRICTS +REDIVIDE +REDIVIDED +REDIVIDES +REDIVIDING +REDIVISION +REDIVISIONS +REDIVIVUS +REDIVORCE +REDIVORCED +REDIVORCES +REDIVORCING +REDLEG +REDLEGS +REDLINE +REDLINED +REDLINER +REDLINERS +REDLINES +REDLINING +REDLININGS +REDLY +REDNECK +REDNECKED +REDNECKS +REDNESS +REDNESSES +REDO +REDOCK +REDOCKED +REDOCKING +REDOCKS +REDOES +REDOING +REDOLENCE +REDOLENCES +REDOLENCIES +REDOLENCY +REDOLENT +REDOLENTLY +REDON +REDONE +REDONNED +REDONNING +REDONS +REDOS +REDOUBLE +REDOUBLED +REDOUBLER +REDOUBLERS +REDOUBLES +REDOUBLING +REDOUBT +REDOUBTABLE +REDOUBTABLY +REDOUBTS +REDOUND +REDOUNDED +REDOUNDING +REDOUNDS +REDOUT +REDOUTS +REDOWA +REDOWAS +REDOX +REDOXES +REDPOLL +REDPOLLS +REDRAFT +REDRAFTED +REDRAFTING +REDRAFTS +REDRAW +REDRAWER +REDRAWERS +REDRAWING +REDRAWN +REDRAWS +REDREAM +REDREAMED +REDREAMING +REDREAMS +REDREAMT +REDRESS +REDRESSED +REDRESSER +REDRESSERS +REDRESSES +REDRESSING +REDRESSOR +REDRESSORS +REDREW +REDRIED +REDRIES +REDRILL +REDRILLED +REDRILLING +REDRILLS +REDRIVE +REDRIVEN +REDRIVES +REDRIVING +REDROOT +REDROOTS +REDROVE +REDRY +REDRYING +REDS +REDSHANK +REDSHANKS +REDSHIFT +REDSHIFTED +REDSHIFTS +REDSHIRT +REDSHIRTED +REDSHIRTING +REDSHIRTS +REDSKIN +REDSKINS +REDSTART +REDSTARTS +REDTAIL +REDTAILS +REDTOP +REDTOPS +REDUB +REDUBBED +REDUBBING +REDUBS +REDUCE +REDUCED +REDUCER +REDUCERS +REDUCES +REDUCIBILITIES +REDUCIBILITY +REDUCIBLE +REDUCIBLY +REDUCING +REDUCTANT +REDUCTANTS +REDUCTASE +REDUCTASES +REDUCTION +REDUCTIONAL +REDUCTIONISM +REDUCTIONISMS +REDUCTIONIST +REDUCTIONISTIC +REDUCTIONISTS +REDUCTIONS +REDUCTIVE +REDUCTIVELY +REDUCTIVENESS +REDUCTIVENESSES +REDUCTOR +REDUCTORS +REDUNDANCIES +REDUNDANCY +REDUNDANT +REDUNDANTLY +REDUPLICATE +REDUPLICATED +REDUPLICATES +REDUPLICATING +REDUPLICATION +REDUPLICATIONS +REDUPLICATIVE +REDUPLICATIVELY +REDUVIID +REDUVIIDS +REDUX +REDWARE +REDWARES +REDWING +REDWINGS +REDWOOD +REDWOODS +REDYE +REDYED +REDYEING +REDYES +REE +REEARN +REEARNED +REEARNING +REEARNS +REECHIER +REECHIEST +REECHO +REECHOED +REECHOES +REECHOING +REECHY +REED +REEDBIRD +REEDBIRDS +REEDBUCK +REEDBUCKS +REEDED +REEDIER +REEDIEST +REEDIFIED +REEDIFIES +REEDIFY +REEDIFYING +REEDILY +REEDINESS +REEDINESSES +REEDING +REEDINGS +REEDIT +REEDITED +REEDITING +REEDITION +REEDITIONS +REEDITS +REEDLIKE +REEDLING +REEDLINGS +REEDMAN +REEDMEN +REEDS +REEDUCATE +REEDUCATED +REEDUCATES +REEDUCATING +REEDUCATION +REEDUCATIONS +REEDUCATIVE +REEDY +REEF +REEFABLE +REEFED +REEFER +REEFERS +REEFIER +REEFIEST +REEFING +REEFS +REEFY +REEJECT +REEJECTED +REEJECTING +REEJECTS +REEK +REEKED +REEKER +REEKERS +REEKIER +REEKIEST +REEKING +REEKS +REEKY +REEL +REELABLE +REELECT +REELECTED +REELECTING +REELECTION +REELECTIONS +REELECTS +REELED +REELER +REELERS +REELEVATE +REELEVATED +REELEVATES +REELEVATING +REELIGIBILITIES +REELIGIBILITY +REELIGIBLE +REELING +REELINGS +REELS +REEMBARK +REEMBARKED +REEMBARKING +REEMBARKS +REEMBODIED +REEMBODIES +REEMBODY +REEMBODYING +REEMBRACE +REEMBRACED +REEMBRACES +REEMBRACING +REEMBROIDER +REEMBROIDERED +REEMBROIDERING +REEMBROIDERS +REEMERGE +REEMERGED +REEMERGENCE +REEMERGENCES +REEMERGES +REEMERGING +REEMISSION +REEMISSIONS +REEMIT +REEMITS +REEMITTED +REEMITTING +REEMPHASES +REEMPHASIS +REEMPHASIZE +REEMPHASIZED +REEMPHASIZES +REEMPHASIZING +REEMPLOY +REEMPLOYED +REEMPLOYING +REEMPLOYMENT +REEMPLOYMENTS +REEMPLOYS +REENACT +REENACTED +REENACTING +REENACTMENT +REENACTMENTS +REENACTOR +REENACTORS +REENACTS +REENCOUNTER +REENCOUNTERED +REENCOUNTERING +REENCOUNTERS +REENDOW +REENDOWED +REENDOWING +REENDOWS +REENERGIZE +REENERGIZED +REENERGIZES +REENERGIZING +REENFORCE +REENFORCED +REENFORCES +REENFORCING +REENGAGE +REENGAGED +REENGAGEMENT +REENGAGEMENTS +REENGAGES +REENGAGING +REENGINEER +REENGINEERED +REENGINEERING +REENGINEERS +REENGRAVE +REENGRAVED +REENGRAVES +REENGRAVING +REENJOY +REENJOYED +REENJOYING +REENJOYS +REENLARGE +REENLARGED +REENLARGES +REENLARGING +REENLIST +REENLISTED +REENLISTING +REENLISTMENT +REENLISTMENTS +REENLISTS +REENROLL +REENROLLED +REENROLLING +REENROLLS +REENSLAVE +REENSLAVED +REENSLAVES +REENSLAVING +REENTER +REENTERED +REENTERING +REENTERS +REENTHRONE +REENTHRONED +REENTHRONES +REENTHRONING +REENTRANCE +REENTRANCES +REENTRANT +REENTRANTS +REENTRIES +REENTRY +REEQUIP +REEQUIPMENT +REEQUIPMENTS +REEQUIPPED +REEQUIPPING +REEQUIPS +REERECT +REERECTED +REERECTING +REERECTS +REES +REESCALATE +REESCALATED +REESCALATES +REESCALATING +REESCALATION +REESCALATIONS +REEST +REESTABLISH +REESTABLISHED +REESTABLISHES +REESTABLISHING +REESTABLISHMENT +REESTED +REESTIMATE +REESTIMATED +REESTIMATES +REESTIMATING +REESTING +REESTS +REEVALUATE +REEVALUATED +REEVALUATES +REEVALUATING +REEVALUATION +REEVALUATIONS +REEVE +REEVED +REEVES +REEVING +REEVOKE +REEVOKED +REEVOKES +REEVOKING +REEXAMINATION +REEXAMINATIONS +REEXAMINE +REEXAMINED +REEXAMINES +REEXAMINING +REEXECUTE +REEXECUTED +REEXECUTES +REEXECUTING +REEXHIBIT +REEXHIBITED +REEXHIBITING +REEXHIBITS +REEXPEL +REEXPELLED +REEXPELLING +REEXPELS +REEXPERIENCE +REEXPERIENCED +REEXPERIENCES +REEXPERIENCING +REEXPLAIN +REEXPLAINED +REEXPLAINING +REEXPLAINS +REEXPLORE +REEXPLORED +REEXPLORES +REEXPLORING +REEXPORT +REEXPORTATION +REEXPORTATIONS +REEXPORTED +REEXPORTING +REEXPORTS +REEXPOSE +REEXPOSED +REEXPOSES +REEXPOSING +REEXPOSURE +REEXPOSURES +REEXPRESS +REEXPRESSED +REEXPRESSES +REEXPRESSING +REF +REFACE +REFACED +REFACES +REFACING +REFALL +REFALLEN +REFALLING +REFALLS +REFASHION +REFASHIONED +REFASHIONING +REFASHIONS +REFASTEN +REFASTENED +REFASTENING +REFASTENS +REFECT +REFECTED +REFECTING +REFECTION +REFECTIONS +REFECTIVE +REFECTORIES +REFECTORY +REFECTS +REFED +REFEED +REFEEDING +REFEEDS +REFEEL +REFEELING +REFEELS +REFEL +REFELL +REFELLED +REFELLING +REFELS +REFELT +REFENCE +REFENCED +REFENCES +REFENCING +REFER +REFERABLE +REFEREE +REFEREED +REFEREEING +REFEREES +REFERENCE +REFERENCED +REFERENCES +REFERENCING +REFERENDA +REFERENDUM +REFERENDUMS +REFERENT +REFERENTIAL +REFERENTIALITY +REFERENTIALLY +REFERENTS +REFERRAL +REFERRALS +REFERRED +REFERRER +REFERRERS +REFERRING +REFERS +REFFED +REFFING +REFIGHT +REFIGHTING +REFIGHTS +REFIGURE +REFIGURED +REFIGURES +REFIGURING +REFILE +REFILED +REFILES +REFILING +REFILL +REFILLABLE +REFILLED +REFILLING +REFILLS +REFILM +REFILMED +REFILMING +REFILMS +REFILTER +REFILTERED +REFILTERING +REFILTERS +REFINABLE +REFINANCE +REFINANCED +REFINANCES +REFINANCING +REFIND +REFINDING +REFINDS +REFINE +REFINED +REFINEMENT +REFINEMENTS +REFINER +REFINERIES +REFINERS +REFINERY +REFINES +REFINING +REFINISH +REFINISHED +REFINISHER +REFINISHERS +REFINISHES +REFINISHING +REFIRE +REFIRED +REFIRES +REFIRING +REFIT +REFITS +REFITTED +REFITTING +REFIX +REFIXED +REFIXES +REFIXING +REFLAG +REFLAGGED +REFLAGGING +REFLAGS +REFLATE +REFLATED +REFLATES +REFLATING +REFLATION +REFLATIONARY +REFLATIONS +REFLECT +REFLECTANCE +REFLECTANCES +REFLECTED +REFLECTING +REFLECTION +REFLECTIONAL +REFLECTIONS +REFLECTIVE +REFLECTIVELY +REFLECTIVENESS +REFLECTIVITIES +REFLECTIVITY +REFLECTOMETER +REFLECTOMETERS +REFLECTOMETRIES +REFLECTOMETRY +REFLECTOR +REFLECTORIZE +REFLECTORIZED +REFLECTORIZES +REFLECTORIZING +REFLECTORS +REFLECTS +REFLET +REFLETS +REFLEW +REFLEX +REFLEXED +REFLEXES +REFLEXING +REFLEXION +REFLEXIONS +REFLEXIVE +REFLEXIVELY +REFLEXIVENESS +REFLEXIVENESSES +REFLEXIVES +REFLEXIVITIES +REFLEXIVITY +REFLEXLY +REFLEXOLOGIES +REFLEXOLOGY +REFLIES +REFLOAT +REFLOATED +REFLOATING +REFLOATS +REFLOOD +REFLOODED +REFLOODING +REFLOODS +REFLOW +REFLOWED +REFLOWER +REFLOWERED +REFLOWERING +REFLOWERS +REFLOWING +REFLOWN +REFLOWS +REFLUENCE +REFLUENCES +REFLUENT +REFLUX +REFLUXED +REFLUXES +REFLUXING +REFLY +REFLYING +REFOCUS +REFOCUSED +REFOCUSES +REFOCUSING +REFOCUSSED +REFOCUSSES +REFOCUSSING +REFOLD +REFOLDED +REFOLDING +REFOLDS +REFOREST +REFORESTATION +REFORESTATIONS +REFORESTED +REFORESTING +REFORESTS +REFORGE +REFORGED +REFORGES +REFORGING +REFORM +REFORMABILITIES +REFORMABILITY +REFORMABLE +REFORMAT +REFORMATE +REFORMATES +REFORMATION +REFORMATIONAL +REFORMATIONS +REFORMATIVE +REFORMATORIES +REFORMATORY +REFORMATS +REFORMATTED +REFORMATTING +REFORMED +REFORMER +REFORMERS +REFORMING +REFORMISM +REFORMISMS +REFORMIST +REFORMISTS +REFORMS +REFORMULATE +REFORMULATED +REFORMULATES +REFORMULATING +REFORMULATION +REFORMULATIONS +REFORTIFICATION +REFORTIFIED +REFORTIFIES +REFORTIFY +REFORTIFYING +REFOUGHT +REFOUND +REFOUNDATION +REFOUNDATIONS +REFOUNDED +REFOUNDING +REFOUNDS +REFRACT +REFRACTED +REFRACTILE +REFRACTING +REFRACTION +REFRACTIONS +REFRACTIVE +REFRACTIVELY +REFRACTIVENESS +REFRACTIVITIES +REFRACTIVITY +REFRACTOMETER +REFRACTOMETERS +REFRACTOMETRIC +REFRACTOMETRIES +REFRACTOMETRY +REFRACTOR +REFRACTORIES +REFRACTORILY +REFRACTORINESS +REFRACTORS +REFRACTORY +REFRACTS +REFRAIN +REFRAINED +REFRAINER +REFRAINERS +REFRAINING +REFRAINMENT +REFRAINMENTS +REFRAINS +REFRAME +REFRAMED +REFRAMES +REFRAMING +REFRANGIBILITY +REFRANGIBLE +REFRANGIBLENESS +REFREEZE +REFREEZES +REFREEZING +REFRESH +REFRESHED +REFRESHEN +REFRESHENED +REFRESHENING +REFRESHENS +REFRESHER +REFRESHERS +REFRESHES +REFRESHING +REFRESHINGLY +REFRESHMENT +REFRESHMENTS +REFRIED +REFRIES +REFRIGERANT +REFRIGERANTS +REFRIGERATE +REFRIGERATED +REFRIGERATES +REFRIGERATING +REFRIGERATION +REFRIGERATIONS +REFRIGERATOR +REFRIGERATORS +REFRONT +REFRONTED +REFRONTING +REFRONTS +REFROZE +REFROZEN +REFRY +REFRYING +REFS +REFT +REFUEL +REFUELED +REFUELING +REFUELLED +REFUELLING +REFUELS +REFUGE +REFUGED +REFUGEE +REFUGEEISM +REFUGEEISMS +REFUGEES +REFUGES +REFUGIA +REFUGING +REFUGIUM +REFULGENCE +REFULGENCES +REFULGENT +REFUND +REFUNDABILITIES +REFUNDABILITY +REFUNDABLE +REFUNDED +REFUNDER +REFUNDERS +REFUNDING +REFUNDS +REFURBISH +REFURBISHED +REFURBISHER +REFURBISHERS +REFURBISHES +REFURBISHING +REFURBISHMENT +REFURBISHMENTS +REFURNISH +REFURNISHED +REFURNISHES +REFURNISHING +REFUSABLE +REFUSAL +REFUSALS +REFUSE +REFUSED +REFUSENIK +REFUSENIKS +REFUSER +REFUSERS +REFUSES +REFUSING +REFUSNIK +REFUSNIKS +REFUTABLE +REFUTABLY +REFUTAL +REFUTALS +REFUTATION +REFUTATIONS +REFUTE +REFUTED +REFUTER +REFUTERS +REFUTES +REFUTING +REG +REGAIN +REGAINED +REGAINER +REGAINERS +REGAINING +REGAINS +REGAL +REGALE +REGALED +REGALER +REGALERS +REGALES +REGALIA +REGALING +REGALITIES +REGALITY +REGALLY +REGALNESS +REGALNESSES +REGARD +REGARDANT +REGARDED +REGARDFUL +REGARDFULLY +REGARDFULNESS +REGARDFULNESSES +REGARDING +REGARDLESS +REGARDLESSLY +REGARDLESSNESS +REGARDS +REGATHER +REGATHERED +REGATHERING +REGATHERS +REGATTA +REGATTAS +REGAUGE +REGAUGED +REGAUGES +REGAUGING +REGAVE +REGEAR +REGEARED +REGEARING +REGEARS +REGELATE +REGELATED +REGELATES +REGELATING +REGENCIES +REGENCY +REGENERABLE +REGENERACIES +REGENERACY +REGENERATE +REGENERATED +REGENERATELY +REGENERATENESS +REGENERATES +REGENERATING +REGENERATION +REGENERATIONS +REGENERATIVE +REGENERATOR +REGENERATORS +REGENT +REGENTAL +REGENTS +REGES +REGGAE +REGGAES +REGICIDAL +REGICIDE +REGICIDES +REGILD +REGILDED +REGILDING +REGILDS +REGILT +REGIME +REGIMEN +REGIMENS +REGIMENT +REGIMENTAL +REGIMENTALS +REGIMENTATION +REGIMENTATIONS +REGIMENTED +REGIMENTING +REGIMENTS +REGIMES +REGINA +REGINAE +REGINAL +REGINAS +REGION +REGIONAL +REGIONALISM +REGIONALISMS +REGIONALIST +REGIONALISTIC +REGIONALISTS +REGIONALIZATION +REGIONALIZE +REGIONALIZED +REGIONALIZES +REGIONALIZING +REGIONALLY +REGIONALS +REGIONS +REGISSEUR +REGISSEURS +REGISTER +REGISTERABLE +REGISTERED +REGISTERING +REGISTERS +REGISTRABLE +REGISTRANT +REGISTRANTS +REGISTRAR +REGISTRARS +REGISTRATION +REGISTRATIONS +REGISTRIES +REGISTRY +REGIUS +REGIVE +REGIVEN +REGIVES +REGIVING +REGLAZE +REGLAZED +REGLAZES +REGLAZING +REGLET +REGLETS +REGLORIFIED +REGLORIFIES +REGLORIFY +REGLORIFYING +REGLOSS +REGLOSSED +REGLOSSES +REGLOSSING +REGLOW +REGLOWED +REGLOWING +REGLOWS +REGLUE +REGLUED +REGLUES +REGLUING +REGMA +REGMATA +REGNA +REGNAL +REGNANCIES +REGNANCY +REGNANT +REGNUM +REGOLITH +REGOLITHS +REGORGE +REGORGED +REGORGES +REGORGING +REGOSOL +REGOSOLS +REGRADE +REGRADED +REGRADES +REGRADING +REGRAFT +REGRAFTED +REGRAFTING +REGRAFTS +REGRANT +REGRANTED +REGRANTING +REGRANTS +REGRATE +REGRATED +REGRATES +REGRATING +REGREEN +REGREENED +REGREENING +REGREENS +REGREET +REGREETED +REGREETING +REGREETS +REGRESS +REGRESSED +REGRESSES +REGRESSING +REGRESSION +REGRESSIONS +REGRESSIVE +REGRESSIVELY +REGRESSIVENESS +REGRESSIVITIES +REGRESSIVITY +REGRESSOR +REGRESSORS +REGRET +REGRETFUL +REGRETFULLY +REGRETFULNESS +REGRETFULNESSES +REGRETS +REGRETTABLE +REGRETTABLY +REGRETTED +REGRETTER +REGRETTERS +REGRETTING +REGREW +REGRIND +REGRINDING +REGRINDS +REGROOM +REGROOMED +REGROOMING +REGROOMS +REGROOVE +REGROOVED +REGROOVES +REGROOVING +REGROUND +REGROUP +REGROUPED +REGROUPING +REGROUPS +REGROW +REGROWING +REGROWN +REGROWS +REGROWTH +REGROWTHS +REGS +REGULABLE +REGULAR +REGULARITIES +REGULARITY +REGULARIZATION +REGULARIZATIONS +REGULARIZE +REGULARIZED +REGULARIZES +REGULARIZING +REGULARLY +REGULARS +REGULATE +REGULATED +REGULATES +REGULATING +REGULATION +REGULATIONS +REGULATIVE +REGULATOR +REGULATORS +REGULATORY +REGULI +REGULINE +REGULUS +REGULUSES +REGURGITATE +REGURGITATED +REGURGITATES +REGURGITATING +REGURGITATION +REGURGITATIONS +REHAB +REHABBED +REHABBER +REHABBERS +REHABBING +REHABILITANT +REHABILITANTS +REHABILITATE +REHABILITATED +REHABILITATES +REHABILITATING +REHABILITATION +REHABILITATIONS +REHABILITATIVE +REHABILITATOR +REHABILITATORS +REHABS +REHAMMER +REHAMMERED +REHAMMERING +REHAMMERS +REHANDLE +REHANDLED +REHANDLES +REHANDLING +REHANG +REHANGED +REHANGING +REHANGS +REHARDEN +REHARDENED +REHARDENING +REHARDENS +REHASH +REHASHED +REHASHES +REHASHING +REHEAR +REHEARD +REHEARING +REHEARINGS +REHEARS +REHEARSAL +REHEARSALS +REHEARSE +REHEARSED +REHEARSER +REHEARSERS +REHEARSES +REHEARSING +REHEAT +REHEATED +REHEATER +REHEATERS +REHEATING +REHEATS +REHEEL +REHEELED +REHEELING +REHEELS +REHEM +REHEMMED +REHEMMING +REHEMS +REHINGE +REHINGED +REHINGES +REHINGING +REHIRE +REHIRED +REHIRES +REHIRING +REHOBOAM +REHOBOAMS +REHOSPITALIZE +REHOSPITALIZED +REHOSPITALIZES +REHOSPITALIZING +REHOUSE +REHOUSED +REHOUSES +REHOUSING +REHUMANIZE +REHUMANIZED +REHUMANIZES +REHUMANIZING +REHUNG +REHYDRATABLE +REHYDRATE +REHYDRATED +REHYDRATES +REHYDRATING +REHYDRATION +REHYDRATIONS +REHYPNOTIZE +REHYPNOTIZED +REHYPNOTIZES +REHYPNOTIZING +REI +REICHSMARK +REICHSMARKS +REIDENTIFIED +REIDENTIFIES +REIDENTIFY +REIDENTIFYING +REIF +REIFICATION +REIFICATIONS +REIFIED +REIFIER +REIFIERS +REIFIES +REIFS +REIFY +REIFYING +REIGN +REIGNED +REIGNING +REIGNITE +REIGNITED +REIGNITES +REIGNITING +REIGNITION +REIGNITIONS +REIGNS +REIMAGE +REIMAGED +REIMAGES +REIMAGINE +REIMAGINED +REIMAGINES +REIMAGING +REIMAGINING +REIMBURSABLE +REIMBURSE +REIMBURSED +REIMBURSEMENT +REIMBURSEMENTS +REIMBURSES +REIMBURSING +REIMMERSE +REIMMERSED +REIMMERSES +REIMMERSING +REIMPLANT +REIMPLANTATION +REIMPLANTATIONS +REIMPLANTED +REIMPLANTING +REIMPLANTS +REIMPORT +REIMPORTATION +REIMPORTATIONS +REIMPORTED +REIMPORTING +REIMPORTS +REIMPOSE +REIMPOSED +REIMPOSES +REIMPOSING +REIMPOSITION +REIMPOSITIONS +REIMPRESSION +REIMPRESSIONS +REIN +REINCARNATE +REINCARNATED +REINCARNATES +REINCARNATING +REINCARNATION +REINCARNATIONS +REINCITE +REINCITED +REINCITES +REINCITING +REINCORPORATE +REINCORPORATED +REINCORPORATES +REINCORPORATING +REINCORPORATION +REINCUR +REINCURRED +REINCURRING +REINCURS +REINDEER +REINDEERS +REINDEX +REINDEXED +REINDEXES +REINDEXING +REINDICT +REINDICTED +REINDICTING +REINDICTMENT +REINDICTMENTS +REINDICTS +REINDUCE +REINDUCED +REINDUCES +REINDUCING +REINDUCT +REINDUCTED +REINDUCTING +REINDUCTS +REINDUSTRIALIZE +REINED +REINFECT +REINFECTED +REINFECTING +REINFECTION +REINFECTIONS +REINFECTS +REINFESTATION +REINFESTATIONS +REINFLAME +REINFLAMED +REINFLAMES +REINFLAMING +REINFLATE +REINFLATED +REINFLATES +REINFLATING +REINFLATION +REINFLATIONS +REINFORCE +REINFORCEABLE +REINFORCED +REINFORCEMENT +REINFORCEMENTS +REINFORCER +REINFORCERS +REINFORCES +REINFORCING +REINFORM +REINFORMED +REINFORMING +REINFORMS +REINFUSE +REINFUSED +REINFUSES +REINFUSING +REINHABIT +REINHABITED +REINHABITING +REINHABITS +REINING +REINITIATE +REINITIATED +REINITIATES +REINITIATING +REINJECT +REINJECTED +REINJECTING +REINJECTION +REINJECTIONS +REINJECTS +REINJURE +REINJURED +REINJURES +REINJURIES +REINJURING +REINJURY +REINK +REINKED +REINKING +REINKS +REINLESS +REINNERVATE +REINNERVATED +REINNERVATES +REINNERVATING +REINNERVATION +REINNERVATIONS +REINOCULATE +REINOCULATED +REINOCULATES +REINOCULATING +REINOCULATION +REINOCULATIONS +REINS +REINSERT +REINSERTED +REINSERTING +REINSERTION +REINSERTIONS +REINSERTS +REINSMAN +REINSMEN +REINSPECT +REINSPECTED +REINSPECTING +REINSPECTION +REINSPECTIONS +REINSPECTS +REINSPIRE +REINSPIRED +REINSPIRES +REINSPIRING +REINSTALL +REINSTALLATION +REINSTALLATIONS +REINSTALLED +REINSTALLING +REINSTALLS +REINSTATE +REINSTATED +REINSTATEMENT +REINSTATEMENTS +REINSTATES +REINSTATING +REINSTITUTE +REINSTITUTED +REINSTITUTES +REINSTITUTING +REINSURANCE +REINSURANCES +REINSURE +REINSURED +REINSURER +REINSURERS +REINSURES +REINSURING +REINTEGRATE +REINTEGRATED +REINTEGRATES +REINTEGRATING +REINTEGRATION +REINTEGRATIONS +REINTEGRATIVE +REINTER +REINTERPRET +REINTERPRETED +REINTERPRETING +REINTERPRETS +REINTERRED +REINTERRING +REINTERS +REINTERVIEW +REINTERVIEWED +REINTERVIEWING +REINTERVIEWS +REINTRODUCE +REINTRODUCED +REINTRODUCES +REINTRODUCING +REINTRODUCTION +REINTRODUCTIONS +REINVADE +REINVADED +REINVADES +REINVADING +REINVASION +REINVASIONS +REINVENT +REINVENTED +REINVENTING +REINVENTION +REINVENTIONS +REINVENTS +REINVEST +REINVESTED +REINVESTIGATE +REINVESTIGATED +REINVESTIGATES +REINVESTIGATING +REINVESTIGATION +REINVESTING +REINVESTMENT +REINVESTMENTS +REINVESTS +REINVIGORATE +REINVIGORATED +REINVIGORATES +REINVIGORATING +REINVIGORATION +REINVIGORATIONS +REINVIGORATOR +REINVIGORATORS +REINVITE +REINVITED +REINVITES +REINVITING +REINVOKE +REINVOKED +REINVOKES +REINVOKING +REINVOLVE +REINVOLVED +REINVOLVES +REINVOLVING +REIS +REISSUE +REISSUED +REISSUER +REISSUERS +REISSUES +REISSUING +REITBOK +REITBOKS +REITERATE +REITERATED +REITERATES +REITERATING +REITERATION +REITERATIONS +REITERATIVE +REITERATIVELY +REIVE +REIVED +REIVER +REIVERS +REIVES +REIVING +REJACKET +REJACKETED +REJACKETING +REJACKETS +REJECT +REJECTED +REJECTEE +REJECTEES +REJECTER +REJECTERS +REJECTING +REJECTINGLY +REJECTION +REJECTIONS +REJECTIVE +REJECTOR +REJECTORS +REJECTS +REJIG +REJIGGED +REJIGGER +REJIGGERED +REJIGGERING +REJIGGERS +REJIGGING +REJIGS +REJOICE +REJOICED +REJOICER +REJOICERS +REJOICES +REJOICING +REJOICINGLY +REJOICINGS +REJOIN +REJOINDER +REJOINDERS +REJOINED +REJOINING +REJOINS +REJUDGE +REJUDGED +REJUDGES +REJUDGING +REJUGGLE +REJUGGLED +REJUGGLES +REJUGGLING +REJUSTIFIED +REJUSTIFIES +REJUSTIFY +REJUSTIFYING +REJUVENATE +REJUVENATED +REJUVENATES +REJUVENATING +REJUVENATION +REJUVENATIONS +REJUVENATOR +REJUVENATORS +REJUVENESCENCE +REJUVENESCENCES +REJUVENESCENT +REKEY +REKEYBOARD +REKEYBOARDED +REKEYBOARDING +REKEYBOARDS +REKEYED +REKEYING +REKEYS +REKINDLE +REKINDLED +REKINDLES +REKINDLING +REKNIT +REKNITS +REKNITTED +REKNITTING +REKNOT +REKNOTS +REKNOTTED +REKNOTTING +RELABEL +RELABELED +RELABELING +RELABELLED +RELABELLING +RELABELS +RELACE +RELACED +RELACES +RELACING +RELACQUER +RELACQUERED +RELACQUERING +RELACQUERS +RELAID +RELAND +RELANDED +RELANDING +RELANDS +RELANDSCAPE +RELANDSCAPED +RELANDSCAPES +RELANDSCAPING +RELAPSE +RELAPSED +RELAPSER +RELAPSERS +RELAPSES +RELAPSING +RELATABLE +RELATE +RELATED +RELATEDLY +RELATEDNESS +RELATEDNESSES +RELATER +RELATERS +RELATES +RELATING +RELATION +RELATIONAL +RELATIONALLY +RELATIONS +RELATIONSHIP +RELATIONSHIPS +RELATIVE +RELATIVELY +RELATIVES +RELATIVISM +RELATIVISMS +RELATIVIST +RELATIVISTIC +RELATIVISTS +RELATIVITIES +RELATIVITY +RELATIVIZE +RELATIVIZED +RELATIVIZES +RELATIVIZING +RELATOR +RELATORS +RELAUNCH +RELAUNCHED +RELAUNCHES +RELAUNCHING +RELAUNDER +RELAUNDERED +RELAUNDERING +RELAUNDERS +RELAX +RELAXABLE +RELAXANT +RELAXANTS +RELAXATION +RELAXATIONS +RELAXED +RELAXEDLY +RELAXEDNESS +RELAXEDNESSES +RELAXER +RELAXERS +RELAXES +RELAXIN +RELAXING +RELAXINS +RELAY +RELAYED +RELAYING +RELAYS +RELEARN +RELEARNED +RELEARNING +RELEARNS +RELEARNT +RELEASABLE +RELEASE +RELEASED +RELEASER +RELEASERS +RELEASES +RELEASING +RELEGABLE +RELEGATE +RELEGATED +RELEGATES +RELEGATING +RELEGATION +RELEGATIONS +RELEND +RELENDING +RELENDS +RELENT +RELENTED +RELENTING +RELENTLESS +RELENTLESSLY +RELENTLESSNESS +RELENTS +RELET +RELETS +RELETTER +RELETTERED +RELETTERING +RELETTERS +RELETTING +RELEVANCE +RELEVANCES +RELEVANCIES +RELEVANCY +RELEVANT +RELEVANTLY +RELEVE +RELEVES +RELIABILITIES +RELIABILITY +RELIABLE +RELIABLENESS +RELIABLENESSES +RELIABLES +RELIABLY +RELIANCE +RELIANCES +RELIANT +RELIANTLY +RELIC +RELICENSE +RELICENSED +RELICENSES +RELICENSING +RELICENSURE +RELICENSURES +RELICS +RELICT +RELICTION +RELICTIONS +RELICTS +RELIED +RELIEF +RELIEFS +RELIER +RELIERS +RELIES +RELIEVABLE +RELIEVE +RELIEVED +RELIEVEDLY +RELIEVER +RELIEVERS +RELIEVES +RELIEVING +RELIEVO +RELIEVOS +RELIGHT +RELIGHTED +RELIGHTING +RELIGHTS +RELIGION +RELIGIONIST +RELIGIONISTS +RELIGIONLESS +RELIGIONS +RELIGIOSE +RELIGIOSITIES +RELIGIOSITY +RELIGIOUS +RELIGIOUSLY +RELIGIOUSNESS +RELIGIOUSNESSES +RELINE +RELINED +RELINES +RELINING +RELINK +RELINKED +RELINKING +RELINKS +RELINQUISH +RELINQUISHED +RELINQUISHES +RELINQUISHING +RELINQUISHMENT +RELINQUISHMENTS +RELIQUARIES +RELIQUARY +RELIQUE +RELIQUEFIED +RELIQUEFIES +RELIQUEFY +RELIQUEFYING +RELIQUES +RELIQUIAE +RELISH +RELISHABLE +RELISHED +RELISHES +RELISHING +RELIST +RELISTED +RELISTING +RELISTS +RELIT +RELIVABLE +RELIVE +RELIVED +RELIVES +RELIVING +RELLENO +RELLENOS +RELOAD +RELOADED +RELOADER +RELOADERS +RELOADING +RELOADS +RELOAN +RELOANED +RELOANING +RELOANS +RELOCATABLE +RELOCATE +RELOCATED +RELOCATEE +RELOCATEES +RELOCATES +RELOCATING +RELOCATION +RELOCATIONS +RELOCK +RELOCKED +RELOCKING +RELOCKS +RELOOK +RELOOKED +RELOOKING +RELOOKS +RELUBRICATE +RELUBRICATED +RELUBRICATES +RELUBRICATING +RELUBRICATION +RELUBRICATIONS +RELUCENT +RELUCT +RELUCTANCE +RELUCTANCES +RELUCTANCIES +RELUCTANCY +RELUCTANT +RELUCTANTLY +RELUCTATE +RELUCTATED +RELUCTATES +RELUCTATING +RELUCTATION +RELUCTATIONS +RELUCTED +RELUCTING +RELUCTS +RELUME +RELUMED +RELUMES +RELUMINE +RELUMINED +RELUMINES +RELUMING +RELUMINING +RELY +RELYING +REM +REMADE +REMAIL +REMAILED +REMAILING +REMAILS +REMAIN +REMAINDER +REMAINDERED +REMAINDERING +REMAINDERS +REMAINED +REMAINING +REMAINS +REMAKE +REMAKER +REMAKERS +REMAKES +REMAKING +REMAN +REMAND +REMANDED +REMANDING +REMANDS +REMANENCE +REMANENCES +REMANENT +REMANNED +REMANNING +REMANS +REMANUFACTURE +REMANUFACTURED +REMANUFACTURER +REMANUFACTURERS +REMANUFACTURES +REMANUFACTURING +REMAP +REMAPPED +REMAPPING +REMAPS +REMARK +REMARKABLE +REMARKABLENESS +REMARKABLY +REMARKED +REMARKER +REMARKERS +REMARKET +REMARKETED +REMARKETING +REMARKETS +REMARKING +REMARKS +REMARQUE +REMARQUES +REMARRIAGE +REMARRIAGES +REMARRIED +REMARRIES +REMARRY +REMARRYING +REMASTER +REMASTERED +REMASTERING +REMASTERS +REMATCH +REMATCHED +REMATCHES +REMATCHING +REMATE +REMATED +REMATERIALIZE +REMATERIALIZED +REMATERIALIZES +REMATERIALIZING +REMATES +REMATING +REMEASURE +REMEASURED +REMEASUREMENT +REMEASUREMENTS +REMEASURES +REMEASURING +REMEDIABILITIES +REMEDIABILITY +REMEDIABLE +REMEDIAL +REMEDIALLY +REMEDIATE +REMEDIATED +REMEDIATES +REMEDIATING +REMEDIATION +REMEDIATIONS +REMEDIED +REMEDIES +REMEDILESS +REMEDY +REMEDYING +REMEET +REMEETING +REMEETS +REMELT +REMELTED +REMELTING +REMELTS +REMEMBER +REMEMBERABILITY +REMEMBERABLE +REMEMBERED +REMEMBERER +REMEMBERERS +REMEMBERING +REMEMBERS +REMEMBRANCE +REMEMBRANCER +REMEMBRANCERS +REMEMBRANCES +REMEND +REMENDED +REMENDING +REMENDS +REMERGE +REMERGED +REMERGES +REMERGING +REMET +REMEX +REMIGES +REMIGIAL +REMIGRATE +REMIGRATED +REMIGRATES +REMIGRATING +REMIGRATION +REMIGRATIONS +REMILITARIZE +REMILITARIZED +REMILITARIZES +REMILITARIZING +REMIND +REMINDED +REMINDER +REMINDERS +REMINDFUL +REMINDING +REMINDS +REMINISCE +REMINISCED +REMINISCENCE +REMINISCENCES +REMINISCENT +REMINISCENTIAL +REMINISCENTLY +REMINISCER +REMINISCERS +REMINISCES +REMINISCING +REMINT +REMINTED +REMINTING +REMINTS +REMISE +REMISED +REMISES +REMISING +REMISS +REMISSIBLE +REMISSIBLY +REMISSION +REMISSIONS +REMISSIVE +REMISSLY +REMISSNESS +REMISSNESSES +REMIT +REMITMENT +REMITMENTS +REMITS +REMITTABLE +REMITTAL +REMITTALS +REMITTANCE +REMITTANCES +REMITTED +REMITTENT +REMITTER +REMITTERS +REMITTING +REMITTOR +REMITTORS +REMIX +REMIXED +REMIXES +REMIXING +REMIXT +REMIXTURE +REMIXTURES +REMNANT +REMNANTAL +REMNANTS +REMOBILIZATION +REMOBILIZATIONS +REMOBILIZE +REMOBILIZED +REMOBILIZES +REMOBILIZING +REMODEL +REMODELED +REMODELER +REMODELERS +REMODELING +REMODELLED +REMODELLING +REMODELS +REMODIFIED +REMODIFIES +REMODIFY +REMODIFYING +REMOISTEN +REMOISTENED +REMOISTENING +REMOISTENS +REMOLADE +REMOLADES +REMOLD +REMOLDED +REMOLDING +REMOLDS +REMONETIZATION +REMONETIZATIONS +REMONETIZE +REMONETIZED +REMONETIZES +REMONETIZING +REMONSTRANCE +REMONSTRANCES +REMONSTRANT +REMONSTRANTLY +REMONSTRANTS +REMONSTRATE +REMONSTRATED +REMONSTRATES +REMONSTRATING +REMONSTRATION +REMONSTRATIONS +REMONSTRATIVE +REMONSTRATIVELY +REMONSTRATOR +REMONSTRATORS +REMONTANT +REMONTANTS +REMORA +REMORAS +REMORID +REMORSE +REMORSEFUL +REMORSEFULLY +REMORSEFULNESS +REMORSELESS +REMORSELESSLY +REMORSELESSNESS +REMORSES +REMOTE +REMOTELY +REMOTENESS +REMOTENESSES +REMOTER +REMOTES +REMOTEST +REMOTION +REMOTIONS +REMOTIVATE +REMOTIVATED +REMOTIVATES +REMOTIVATING +REMOTIVATION +REMOTIVATIONS +REMOULADE +REMOULADES +REMOUNT +REMOUNTED +REMOUNTING +REMOUNTS +REMOVABILITIES +REMOVABILITY +REMOVABLE +REMOVABLENESS +REMOVABLENESSES +REMOVABLY +REMOVAL +REMOVALS +REMOVE +REMOVEABLE +REMOVED +REMOVEDLY +REMOVER +REMOVERS +REMOVES +REMOVING +REMS +REMUDA +REMUDAS +REMUNERATE +REMUNERATED +REMUNERATES +REMUNERATING +REMUNERATION +REMUNERATIONS +REMUNERATIVE +REMUNERATIVELY +REMUNERATOR +REMUNERATORS +REMUNERATORY +REMYTHOLOGIZE +REMYTHOLOGIZED +REMYTHOLOGIZES +REMYTHOLOGIZING +RENAIL +RENAILED +RENAILING +RENAILS +RENAISSANCE +RENAISSANCES +RENAL +RENAME +RENAMED +RENAMES +RENAMING +RENASCENCE +RENASCENCES +RENASCENT +RENATIONALIZE +RENATIONALIZED +RENATIONALIZES +RENATIONALIZING +RENATURATION +RENATURATIONS +RENATURE +RENATURED +RENATURES +RENATURING +RENCONTRE +RENCONTRES +RENCOUNTER +RENCOUNTERED +RENCOUNTERING +RENCOUNTERS +REND +RENDED +RENDER +RENDERABLE +RENDERED +RENDERER +RENDERERS +RENDERING +RENDERINGS +RENDERS +RENDEZVOUS +RENDEZVOUSED +RENDEZVOUSES +RENDEZVOUSING +RENDIBLE +RENDING +RENDITION +RENDITIONS +RENDS +RENDZINA +RENDZINAS +RENEGADE +RENEGADED +RENEGADES +RENEGADING +RENEGADO +RENEGADOES +RENEGADOS +RENEGE +RENEGED +RENEGER +RENEGERS +RENEGES +RENEGING +RENEGOTIABLE +RENEGOTIATE +RENEGOTIATED +RENEGOTIATES +RENEGOTIATING +RENEGOTIATION +RENEGOTIATIONS +RENEST +RENESTED +RENESTING +RENESTS +RENEW +RENEWABILITIES +RENEWABILITY +RENEWABLE +RENEWABLES +RENEWABLY +RENEWAL +RENEWALS +RENEWED +RENEWEDLY +RENEWER +RENEWERS +RENEWING +RENEWS +RENIFORM +RENIG +RENIGGED +RENIGGING +RENIGS +RENIN +RENINS +RENITENCE +RENITENCES +RENITENCIES +RENITENCY +RENITENT +RENMINBI +RENNASE +RENNASES +RENNET +RENNETS +RENNIN +RENNINS +RENOGRAM +RENOGRAMS +RENOGRAPHIC +RENOGRAPHIES +RENOGRAPHY +RENOMINATE +RENOMINATED +RENOMINATES +RENOMINATING +RENOMINATION +RENOMINATIONS +RENOTIFIED +RENOTIFIES +RENOTIFY +RENOTIFYING +RENOUNCE +RENOUNCED +RENOUNCEMENT +RENOUNCEMENTS +RENOUNCER +RENOUNCERS +RENOUNCES +RENOUNCING +RENOVASCULAR +RENOVATE +RENOVATED +RENOVATES +RENOVATING +RENOVATION +RENOVATIONS +RENOVATIVE +RENOVATOR +RENOVATORS +RENOWN +RENOWNED +RENOWNING +RENOWNS +RENT +RENTABILITIES +RENTABILITY +RENTABLE +RENTAL +RENTALS +RENTE +RENTED +RENTER +RENTERS +RENTES +RENTIER +RENTIERS +RENTING +RENTS +RENUMBER +RENUMBERED +RENUMBERING +RENUMBERS +RENUNCIATION +RENUNCIATIONS +RENUNCIATIVE +RENUNCIATORY +RENVOI +RENVOIS +REOBJECT +REOBJECTED +REOBJECTING +REOBJECTS +REOBSERVE +REOBSERVED +REOBSERVES +REOBSERVING +REOBTAIN +REOBTAINED +REOBTAINING +REOBTAINS +REOCCUPATION +REOCCUPATIONS +REOCCUPIED +REOCCUPIES +REOCCUPY +REOCCUPYING +REOCCUR +REOCCURRED +REOCCURRENCE +REOCCURRENCES +REOCCURRING +REOCCURS +REOFFER +REOFFERED +REOFFERING +REOFFERS +REOIL +REOILED +REOILING +REOILS +REOPEN +REOPENED +REOPENING +REOPENS +REOPERATE +REOPERATED +REOPERATES +REOPERATING +REOPERATION +REOPERATIONS +REOPPOSE +REOPPOSED +REOPPOSES +REOPPOSING +REORCHESTRATE +REORCHESTRATED +REORCHESTRATES +REORCHESTRATING +REORCHESTRATION +REORDAIN +REORDAINED +REORDAINING +REORDAINS +REORDER +REORDERED +REORDERING +REORDERS +REORGANIZATION +REORGANIZATIONS +REORGANIZE +REORGANIZED +REORGANIZER +REORGANIZERS +REORGANIZES +REORGANIZING +REORIENT +REORIENTATE +REORIENTATED +REORIENTATES +REORIENTATING +REORIENTATION +REORIENTATIONS +REORIENTED +REORIENTING +REORIENTS +REOUTFIT +REOUTFITS +REOUTFITTED +REOUTFITTING +REOVIRUS +REOVIRUSES +REOXIDATION +REOXIDATIONS +REOXIDIZE +REOXIDIZED +REOXIDIZES +REOXIDIZING +REP +REPACIFIED +REPACIFIES +REPACIFY +REPACIFYING +REPACK +REPACKAGE +REPACKAGED +REPACKAGER +REPACKAGERS +REPACKAGES +REPACKAGING +REPACKED +REPACKING +REPACKS +REPAID +REPAINT +REPAINTED +REPAINTING +REPAINTS +REPAIR +REPAIRABILITIES +REPAIRABILITY +REPAIRABLE +REPAIRED +REPAIRER +REPAIRERS +REPAIRING +REPAIRMAN +REPAIRMEN +REPAIRS +REPAND +REPANDLY +REPANEL +REPANELED +REPANELING +REPANELLED +REPANELLING +REPANELS +REPAPER +REPAPERED +REPAPERING +REPAPERS +REPARABLE +REPARABLY +REPARATION +REPARATIONS +REPARATIVE +REPARK +REPARKED +REPARKING +REPARKS +REPARTEE +REPARTEES +REPARTITION +REPARTITIONS +REPASS +REPASSAGE +REPASSAGES +REPASSED +REPASSES +REPASSING +REPAST +REPASTED +REPASTING +REPASTS +REPATCH +REPATCHED +REPATCHES +REPATCHING +REPATRIATE +REPATRIATED +REPATRIATES +REPATRIATING +REPATRIATION +REPATRIATIONS +REPATTERN +REPATTERNED +REPATTERNING +REPATTERNS +REPAVE +REPAVED +REPAVES +REPAVING +REPAY +REPAYABLE +REPAYING +REPAYMENT +REPAYMENTS +REPAYS +REPEAL +REPEALABLE +REPEALED +REPEALER +REPEALERS +REPEALING +REPEALS +REPEAT +REPEATABILITIES +REPEATABILITY +REPEATABLE +REPEATED +REPEATEDLY +REPEATER +REPEATERS +REPEATING +REPEATS +REPECHAGE +REPECHAGES +REPEG +REPEGGED +REPEGGING +REPEGS +REPEL +REPELLANT +REPELLANTS +REPELLED +REPELLENCIES +REPELLENCY +REPELLENT +REPELLENTLY +REPELLENTS +REPELLER +REPELLERS +REPELLING +REPELS +REPENT +REPENTANCE +REPENTANCES +REPENTANT +REPENTANTLY +REPENTED +REPENTER +REPENTERS +REPENTING +REPENTS +REPEOPLE +REPEOPLED +REPEOPLES +REPEOPLING +REPERCUSSION +REPERCUSSIONS +REPERCUSSIVE +REPERK +REPERKED +REPERKING +REPERKS +REPERTOIRE +REPERTOIRES +REPERTORIES +REPERTORY +REPETEND +REPETENDS +REPETITION +REPETITIONAL +REPETITIONS +REPETITIOUS +REPETITIOUSLY +REPETITIOUSNESS +REPETITIVE +REPETITIVELY +REPETITIVENESS +REPHOTOGRAPH +REPHOTOGRAPHED +REPHOTOGRAPHING +REPHOTOGRAPHS +REPHRASE +REPHRASED +REPHRASES +REPHRASING +REPIGMENT +REPIGMENTED +REPIGMENTING +REPIGMENTS +REPIN +REPINE +REPINED +REPINER +REPINERS +REPINES +REPINING +REPINNED +REPINNING +REPINS +REPLACE +REPLACEABLE +REPLACED +REPLACEMENT +REPLACEMENTS +REPLACER +REPLACERS +REPLACES +REPLACING +REPLAN +REPLANNED +REPLANNING +REPLANS +REPLANT +REPLANTATION +REPLANTATIONS +REPLANTED +REPLANTING +REPLANTS +REPLASTER +REPLASTERED +REPLASTERING +REPLASTERS +REPLATE +REPLATED +REPLATES +REPLATING +REPLAY +REPLAYED +REPLAYING +REPLAYS +REPLEAD +REPLEADED +REPLEADER +REPLEADERS +REPLEADING +REPLEADS +REPLED +REPLEDGE +REPLEDGED +REPLEDGES +REPLEDGING +REPLENISH +REPLENISHABLE +REPLENISHED +REPLENISHER +REPLENISHERS +REPLENISHES +REPLENISHING +REPLENISHMENT +REPLENISHMENTS +REPLETE +REPLETELY +REPLETENESS +REPLETENESSES +REPLETES +REPLETION +REPLETIONS +REPLEVIABLE +REPLEVIED +REPLEVIES +REPLEVIN +REPLEVINED +REPLEVINING +REPLEVINS +REPLEVY +REPLEVYING +REPLICA +REPLICABILITIES +REPLICABILITY +REPLICABLE +REPLICAS +REPLICASE +REPLICASES +REPLICATE +REPLICATED +REPLICATES +REPLICATING +REPLICATION +REPLICATIONS +REPLICATIVE +REPLICON +REPLICONS +REPLIED +REPLIER +REPLIERS +REPLIES +REPLOT +REPLOTS +REPLOTTED +REPLOTTING +REPLOW +REPLOWED +REPLOWING +REPLOWS +REPLUMB +REPLUMBED +REPLUMBING +REPLUMBS +REPLUNGE +REPLUNGED +REPLUNGES +REPLUNGING +REPLY +REPLYING +REPO +REPOLARIZATION +REPOLARIZATIONS +REPOLARIZE +REPOLARIZED +REPOLARIZES +REPOLARIZING +REPOLISH +REPOLISHED +REPOLISHES +REPOLISHING +REPOLL +REPOLLED +REPOLLING +REPOLLS +REPOPULARIZE +REPOPULARIZED +REPOPULARIZES +REPOPULARIZING +REPOPULATE +REPOPULATED +REPOPULATES +REPOPULATING +REPOPULATION +REPOPULATIONS +REPORT +REPORTABLE +REPORTAGE +REPORTAGES +REPORTED +REPORTEDLY +REPORTER +REPORTERS +REPORTING +REPORTORIAL +REPORTORIALLY +REPORTS +REPOS +REPOSAL +REPOSALS +REPOSE +REPOSED +REPOSEDLY +REPOSEFUL +REPOSEFULLY +REPOSEFULNESS +REPOSEFULNESSES +REPOSER +REPOSERS +REPOSES +REPOSING +REPOSIT +REPOSITED +REPOSITING +REPOSITION +REPOSITIONED +REPOSITIONING +REPOSITIONS +REPOSITORIES +REPOSITORY +REPOSITS +REPOSSESS +REPOSSESSED +REPOSSESSES +REPOSSESSING +REPOSSESSION +REPOSSESSIONS +REPOSSESSOR +REPOSSESSORS +REPOT +REPOTS +REPOTTED +REPOTTING +REPOUR +REPOURED +REPOURING +REPOURS +REPOUSSE +REPOUSSES +REPOWER +REPOWERED +REPOWERING +REPOWERS +REPP +REPPED +REPPING +REPPS +REPREHEND +REPREHENDED +REPREHENDING +REPREHENDS +REPREHENSIBLE +REPREHENSIBLY +REPREHENSION +REPREHENSIONS +REPREHENSIVE +REPRESENT +REPRESENTABLE +REPRESENTATION +REPRESENTATIONS +REPRESENTATIVE +REPRESENTATIVES +REPRESENTED +REPRESENTER +REPRESENTERS +REPRESENTING +REPRESENTS +REPRESS +REPRESSED +REPRESSER +REPRESSERS +REPRESSES +REPRESSIBILITY +REPRESSIBLE +REPRESSING +REPRESSION +REPRESSIONIST +REPRESSIONS +REPRESSIVE +REPRESSIVELY +REPRESSIVENESS +REPRESSOR +REPRESSORS +REPRESSURIZE +REPRESSURIZED +REPRESSURIZES +REPRESSURIZING +REPRICE +REPRICED +REPRICES +REPRICING +REPRIEVAL +REPRIEVALS +REPRIEVE +REPRIEVED +REPRIEVES +REPRIEVING +REPRIMAND +REPRIMANDED +REPRIMANDING +REPRIMANDS +REPRINT +REPRINTED +REPRINTER +REPRINTERS +REPRINTING +REPRINTS +REPRISAL +REPRISALS +REPRISE +REPRISED +REPRISES +REPRISING +REPRISTINATE +REPRISTINATED +REPRISTINATES +REPRISTINATING +REPRISTINATION +REPRISTINATIONS +REPRIVATIZATION +REPRIVATIZE +REPRIVATIZED +REPRIVATIZES +REPRIVATIZING +REPRO +REPROACH +REPROACHABLE +REPROACHED +REPROACHER +REPROACHERS +REPROACHES +REPROACHFUL +REPROACHFULLY +REPROACHFULNESS +REPROACHING +REPROACHINGLY +REPROBANCE +REPROBANCES +REPROBATE +REPROBATED +REPROBATES +REPROBATING +REPROBATION +REPROBATIONS +REPROBATIVE +REPROBATORY +REPROBE +REPROBED +REPROBES +REPROBING +REPROCESS +REPROCESSED +REPROCESSES +REPROCESSING +REPRODUCE +REPRODUCED +REPRODUCER +REPRODUCERS +REPRODUCES +REPRODUCIBILITY +REPRODUCIBLE +REPRODUCIBLES +REPRODUCIBLY +REPRODUCING +REPRODUCTION +REPRODUCTIONS +REPRODUCTIVE +REPRODUCTIVELY +REPRODUCTIVES +REPROGRAM +REPROGRAMED +REPROGRAMING +REPROGRAMMABLE +REPROGRAMMED +REPROGRAMMING +REPROGRAMS +REPROGRAPHER +REPROGRAPHERS +REPROGRAPHIC +REPROGRAPHICS +REPROGRAPHIES +REPROGRAPHY +REPROOF +REPROOFS +REPROS +REPROVAL +REPROVALS +REPROVE +REPROVED +REPROVER +REPROVERS +REPROVES +REPROVING +REPROVINGLY +REPROVISION +REPROVISIONED +REPROVISIONING +REPROVISIONS +REPS +REPTANT +REPTILE +REPTILES +REPTILIA +REPTILIAN +REPTILIANS +REPTILIUM +REPUBLIC +REPUBLICAN +REPUBLICANISM +REPUBLICANISMS +REPUBLICANIZE +REPUBLICANIZED +REPUBLICANIZES +REPUBLICANIZING +REPUBLICANS +REPUBLICATION +REPUBLICATIONS +REPUBLICS +REPUBLISH +REPUBLISHED +REPUBLISHER +REPUBLISHERS +REPUBLISHES +REPUBLISHING +REPUDIATE +REPUDIATED +REPUDIATES +REPUDIATING +REPUDIATION +REPUDIATIONIST +REPUDIATIONISTS +REPUDIATIONS +REPUDIATOR +REPUDIATORS +REPUGN +REPUGNANCE +REPUGNANCES +REPUGNANCIES +REPUGNANCY +REPUGNANT +REPUGNANTLY +REPUGNED +REPUGNING +REPUGNS +REPULSE +REPULSED +REPULSER +REPULSERS +REPULSES +REPULSING +REPULSION +REPULSIONS +REPULSIVE +REPULSIVELY +REPULSIVENESS +REPULSIVENESSES +REPUMP +REPUMPED +REPUMPING +REPUMPS +REPUNCTUATION +REPUNCTUATIONS +REPURCHASE +REPURCHASED +REPURCHASES +REPURCHASING +REPURIFIED +REPURIFIES +REPURIFY +REPURIFYING +REPURPOSE +REPURPOSED +REPURPOSES +REPURPOSING +REPURSUE +REPURSUED +REPURSUES +REPURSUING +REPUTABILITIES +REPUTABILITY +REPUTABLE +REPUTABLY +REPUTATION +REPUTATIONAL +REPUTATIONS +REPUTE +REPUTED +REPUTEDLY +REPUTES +REPUTING +REQUALIFIED +REQUALIFIES +REQUALIFY +REQUALIFYING +REQUEST +REQUESTED +REQUESTER +REQUESTERS +REQUESTING +REQUESTOR +REQUESTORS +REQUESTS +REQUIEM +REQUIEMS +REQUIESCAT +REQUIESCATS +REQUIN +REQUINS +REQUIRE +REQUIRED +REQUIREMENT +REQUIREMENTS +REQUIRER +REQUIRERS +REQUIRES +REQUIRING +REQUISITE +REQUISITENESS +REQUISITENESSES +REQUISITES +REQUISITION +REQUISITIONED +REQUISITIONING +REQUISITIONS +REQUITAL +REQUITALS +REQUITE +REQUITED +REQUITER +REQUITERS +REQUITES +REQUITING +RERACK +RERACKED +RERACKING +RERACKS +RERADIATE +RERADIATED +RERADIATES +RERADIATING +RERADIATION +RERADIATIONS +RERAISE +RERAISED +RERAISES +RERAISING +RERAN +REREAD +REREADING +REREADINGS +REREADS +REREBRACE +REREBRACES +RERECORD +RERECORDED +RERECORDING +RERECORDS +REREDOS +REREDOSES +REREGISTER +REREGISTERED +REREGISTERING +REREGISTERS +REREGISTRATION +REREGISTRATIONS +REREGULATE +REREGULATED +REREGULATES +REREGULATING +REREGULATION +REREGULATIONS +RERELEASE +RERELEASED +RERELEASES +RERELEASING +REREMICE +REREMIND +REREMINDED +REREMINDING +REREMINDS +REREMOUSE +RERENT +RERENTED +RERENTING +RERENTS +REREPEAT +REREPEATED +REREPEATING +REREPEATS +REREVIEW +REREVIEWED +REREVIEWING +REREVIEWS +REREWARD +REREWARDS +RERIG +RERIGGED +RERIGGING +RERIGS +RERISE +RERISEN +RERISES +RERISING +REROLL +REROLLED +REROLLER +REROLLERS +REROLLING +REROLLS +REROOF +REROOFED +REROOFING +REROOFS +REROSE +REROUTE +REROUTED +REROUTES +REROUTING +RERUN +RERUNNING +RERUNS +RES +RESADDLE +RESADDLED +RESADDLES +RESADDLING +RESAID +RESAIL +RESAILED +RESAILING +RESAILS +RESALABLE +RESALE +RESALES +RESALUTE +RESALUTED +RESALUTES +RESALUTING +RESAMPLE +RESAMPLED +RESAMPLES +RESAMPLING +RESAT +RESAW +RESAWED +RESAWING +RESAWN +RESAWS +RESAY +RESAYING +RESAYS +RESCALE +RESCALED +RESCALES +RESCALING +RESCHEDULE +RESCHEDULED +RESCHEDULES +RESCHEDULING +RESCHOOL +RESCHOOLED +RESCHOOLING +RESCHOOLS +RESCIND +RESCINDED +RESCINDER +RESCINDERS +RESCINDING +RESCINDMENT +RESCINDMENTS +RESCINDS +RESCISSION +RESCISSIONS +RESCISSORY +RESCORE +RESCORED +RESCORES +RESCORING +RESCREEN +RESCREENED +RESCREENING +RESCREENS +RESCRIPT +RESCRIPTS +RESCUABLE +RESCUE +RESCUED +RESCUER +RESCUERS +RESCUES +RESCUING +RESCULPT +RESCULPTED +RESCULPTING +RESCULPTS +RESEAL +RESEALABLE +RESEALED +RESEALING +RESEALS +RESEARCH +RESEARCHABLE +RESEARCHED +RESEARCHER +RESEARCHERS +RESEARCHES +RESEARCHING +RESEARCHIST +RESEARCHISTS +RESEASON +RESEASONED +RESEASONING +RESEASONS +RESEAT +RESEATED +RESEATING +RESEATS +RESEAU +RESEAUS +RESEAUX +RESECT +RESECTABILITIES +RESECTABILITY +RESECTABLE +RESECTED +RESECTING +RESECTION +RESECTIONS +RESECTS +RESECURE +RESECURED +RESECURES +RESECURING +RESEDA +RESEDAS +RESEE +RESEED +RESEEDED +RESEEDING +RESEEDS +RESEEING +RESEEK +RESEEKING +RESEEKS +RESEEN +RESEES +RESEGREGATE +RESEGREGATED +RESEGREGATES +RESEGREGATING +RESEGREGATION +RESEGREGATIONS +RESEIZE +RESEIZED +RESEIZES +RESEIZING +RESEIZURE +RESEIZURES +RESELECT +RESELECTED +RESELECTING +RESELECTS +RESELL +RESELLER +RESELLERS +RESELLING +RESELLS +RESEMBLANCE +RESEMBLANCES +RESEMBLANT +RESEMBLE +RESEMBLED +RESEMBLER +RESEMBLERS +RESEMBLES +RESEMBLING +RESEND +RESENDING +RESENDS +RESENSITIZE +RESENSITIZED +RESENSITIZES +RESENSITIZING +RESENT +RESENTED +RESENTENCE +RESENTENCED +RESENTENCES +RESENTENCING +RESENTFUL +RESENTFULLY +RESENTFULNESS +RESENTFULNESSES +RESENTING +RESENTIVE +RESENTMENT +RESENTMENTS +RESENTS +RESERPINE +RESERPINES +RESERVABLE +RESERVATION +RESERVATIONIST +RESERVATIONISTS +RESERVATIONS +RESERVE +RESERVED +RESERVEDLY +RESERVEDNESS +RESERVEDNESSES +RESERVER +RESERVERS +RESERVES +RESERVICE +RESERVICED +RESERVICES +RESERVICING +RESERVING +RESERVIST +RESERVISTS +RESERVOIR +RESERVOIRS +RESET +RESETS +RESETTABLE +RESETTER +RESETTERS +RESETTING +RESETTLE +RESETTLED +RESETTLEMENT +RESETTLEMENTS +RESETTLES +RESETTLING +RESEW +RESEWED +RESEWING +RESEWN +RESEWS +RESH +RESHAPE +RESHAPED +RESHAPER +RESHAPERS +RESHAPES +RESHAPING +RESHARPEN +RESHARPENED +RESHARPENING +RESHARPENS +RESHAVE +RESHAVED +RESHAVEN +RESHAVES +RESHAVING +RESHES +RESHINE +RESHINED +RESHINES +RESHINGLE +RESHINGLED +RESHINGLES +RESHINGLING +RESHINING +RESHIP +RESHIPPED +RESHIPPER +RESHIPPERS +RESHIPPING +RESHIPS +RESHOD +RESHOE +RESHOED +RESHOEING +RESHOES +RESHONE +RESHOOT +RESHOOTING +RESHOOTS +RESHOT +RESHOW +RESHOWED +RESHOWER +RESHOWERED +RESHOWERING +RESHOWERS +RESHOWING +RESHOWN +RESHOWS +RESHUFFLE +RESHUFFLED +RESHUFFLES +RESHUFFLING +RESID +RESIDE +RESIDED +RESIDENCE +RESIDENCES +RESIDENCIES +RESIDENCY +RESIDENT +RESIDENTIAL +RESIDENTIALLY +RESIDENTS +RESIDER +RESIDERS +RESIDES +RESIDING +RESIDS +RESIDUA +RESIDUAL +RESIDUALLY +RESIDUALS +RESIDUARY +RESIDUE +RESIDUES +RESIDUUM +RESIDUUMS +RESIFT +RESIFTED +RESIFTING +RESIFTS +RESIGHT +RESIGHTED +RESIGHTING +RESIGHTS +RESIGN +RESIGNATION +RESIGNATIONS +RESIGNED +RESIGNEDLY +RESIGNEDNESS +RESIGNEDNESSES +RESIGNER +RESIGNERS +RESIGNING +RESIGNS +RESILE +RESILED +RESILES +RESILIENCE +RESILIENCES +RESILIENCIES +RESILIENCY +RESILIENT +RESILIENTLY +RESILIN +RESILING +RESILINS +RESILVER +RESILVERED +RESILVERING +RESILVERS +RESIN +RESINATE +RESINATED +RESINATES +RESINATING +RESINED +RESINIFIED +RESINIFIES +RESINIFY +RESINIFYING +RESINING +RESINLIKE +RESINOID +RESINOIDS +RESINOUS +RESINS +RESINY +RESIST +RESISTANCE +RESISTANCES +RESISTANT +RESISTANTS +RESISTED +RESISTER +RESISTERS +RESISTIBILITIES +RESISTIBILITY +RESISTIBLE +RESISTING +RESISTIVE +RESISTIVELY +RESISTIVENESS +RESISTIVENESSES +RESISTIVITIES +RESISTIVITY +RESISTLESS +RESISTLESSLY +RESISTLESSNESS +RESISTOR +RESISTORS +RESISTS +RESIT +RESITE +RESITED +RESITES +RESITING +RESITS +RESITTING +RESITTINGS +RESITUATE +RESITUATED +RESITUATES +RESITUATING +RESIZE +RESIZED +RESIZES +RESIZING +RESKETCH +RESKETCHED +RESKETCHES +RESKETCHING +RESLATE +RESLATED +RESLATES +RESLATING +RESMELT +RESMELTED +RESMELTING +RESMELTS +RESMOOTH +RESMOOTHED +RESMOOTHING +RESMOOTHS +RESOAK +RESOAKED +RESOAKING +RESOAKS +RESOCIALIZATION +RESOCIALIZE +RESOCIALIZED +RESOCIALIZES +RESOCIALIZING +RESOD +RESODDED +RESODDING +RESODS +RESOFTEN +RESOFTENED +RESOFTENING +RESOFTENS +RESOJET +RESOJETS +RESOLD +RESOLDER +RESOLDERED +RESOLDERING +RESOLDERS +RESOLE +RESOLED +RESOLES +RESOLIDIFIED +RESOLIDIFIES +RESOLIDIFY +RESOLIDIFYING +RESOLING +RESOLUBLE +RESOLUTE +RESOLUTELY +RESOLUTENESS +RESOLUTENESSES +RESOLUTER +RESOLUTES +RESOLUTEST +RESOLUTION +RESOLUTIONS +RESOLVABLE +RESOLVE +RESOLVED +RESOLVENT +RESOLVENTS +RESOLVER +RESOLVERS +RESOLVES +RESOLVING +RESONANCE +RESONANCES +RESONANT +RESONANTLY +RESONANTS +RESONATE +RESONATED +RESONATES +RESONATING +RESONATOR +RESONATORS +RESORB +RESORBED +RESORBING +RESORBS +RESORCIN +RESORCINOL +RESORCINOLS +RESORCINS +RESORPTION +RESORPTIONS +RESORPTIVE +RESORT +RESORTED +RESORTER +RESORTERS +RESORTING +RESORTS +RESOUGHT +RESOUND +RESOUNDED +RESOUNDING +RESOUNDINGLY +RESOUNDS +RESOURCE +RESOURCEFUL +RESOURCEFULLY +RESOURCEFULNESS +RESOURCES +RESOW +RESOWED +RESOWING +RESOWN +RESOWS +RESPACE +RESPACED +RESPACES +RESPACING +RESPADE +RESPADED +RESPADES +RESPADING +RESPEAK +RESPEAKING +RESPEAKS +RESPECIFIED +RESPECIFIES +RESPECIFY +RESPECIFYING +RESPECT +RESPECTABILITY +RESPECTABLE +RESPECTABLENESS +RESPECTABLES +RESPECTABLY +RESPECTED +RESPECTER +RESPECTERS +RESPECTFUL +RESPECTFULLY +RESPECTFULNESS +RESPECTING +RESPECTIVE +RESPECTIVELY +RESPECTIVENESS +RESPECTS +RESPELL +RESPELLED +RESPELLING +RESPELLINGS +RESPELLS +RESPELT +RESPIRABLE +RESPIRATION +RESPIRATIONS +RESPIRATOR +RESPIRATORS +RESPIRATORY +RESPIRE +RESPIRED +RESPIRES +RESPIRING +RESPIRITUALIZE +RESPIRITUALIZED +RESPIRITUALIZES +RESPIROMETER +RESPIROMETERS +RESPIROMETRIC +RESPIROMETRIES +RESPIROMETRY +RESPITE +RESPITED +RESPITES +RESPITING +RESPLENDENCE +RESPLENDENCES +RESPLENDENCIES +RESPLENDENCY +RESPLENDENT +RESPLENDENTLY +RESPLICE +RESPLICED +RESPLICES +RESPLICING +RESPLIT +RESPLITS +RESPLITTING +RESPOKE +RESPOKEN +RESPOND +RESPONDED +RESPONDENT +RESPONDENTS +RESPONDER +RESPONDERS +RESPONDING +RESPONDS +RESPONSA +RESPONSE +RESPONSES +RESPONSIBILITY +RESPONSIBLE +RESPONSIBLENESS +RESPONSIBLY +RESPONSIONS +RESPONSIVE +RESPONSIVELY +RESPONSIVENESS +RESPONSORIES +RESPONSORY +RESPONSUM +RESPOOL +RESPOOLED +RESPOOLING +RESPOOLS +RESPOT +RESPOTS +RESPOTTED +RESPOTTING +RESPRANG +RESPRAY +RESPRAYED +RESPRAYING +RESPRAYS +RESPREAD +RESPREADING +RESPREADS +RESPRING +RESPRINGING +RESPRINGS +RESPROUT +RESPROUTED +RESPROUTING +RESPROUTS +RESPRUNG +RESSENTIMENT +RESSENTIMENTS +REST +RESTABILIZE +RESTABILIZED +RESTABILIZES +RESTABILIZING +RESTABLE +RESTABLED +RESTABLES +RESTABLING +RESTACK +RESTACKED +RESTACKING +RESTACKS +RESTAFF +RESTAFFED +RESTAFFING +RESTAFFS +RESTAGE +RESTAGED +RESTAGES +RESTAGING +RESTAMP +RESTAMPED +RESTAMPING +RESTAMPS +RESTART +RESTARTABLE +RESTARTED +RESTARTING +RESTARTS +RESTATE +RESTATED +RESTATEMENT +RESTATEMENTS +RESTATES +RESTATING +RESTATION +RESTATIONED +RESTATIONING +RESTATIONS +RESTAURANT +RESTAURANTEUR +RESTAURANTEURS +RESTAURANTS +RESTAURATEUR +RESTAURATEURS +RESTED +RESTER +RESTERS +RESTFUL +RESTFULLER +RESTFULLEST +RESTFULLY +RESTFULNESS +RESTFULNESSES +RESTIFORM +RESTIMULATE +RESTIMULATED +RESTIMULATES +RESTIMULATING +RESTIMULATION +RESTIMULATIONS +RESTING +RESTITCH +RESTITCHED +RESTITCHES +RESTITCHING +RESTITUTE +RESTITUTED +RESTITUTES +RESTITUTING +RESTITUTION +RESTITUTIONS +RESTIVE +RESTIVELY +RESTIVENESS +RESTIVENESSES +RESTLESS +RESTLESSLY +RESTLESSNESS +RESTLESSNESSES +RESTOCK +RESTOCKED +RESTOCKING +RESTOCKS +RESTOKE +RESTOKED +RESTOKES +RESTOKING +RESTORABLE +RESTORAL +RESTORALS +RESTORATION +RESTORATIONS +RESTORATIVE +RESTORATIVES +RESTORE +RESTORED +RESTORER +RESTORERS +RESTORES +RESTORING +RESTRAIN +RESTRAINABLE +RESTRAINED +RESTRAINEDLY +RESTRAINER +RESTRAINERS +RESTRAINING +RESTRAINS +RESTRAINT +RESTRAINTS +RESTRENGTHEN +RESTRENGTHENED +RESTRENGTHENING +RESTRENGTHENS +RESTRESS +RESTRESSED +RESTRESSES +RESTRESSING +RESTRETCH +RESTRETCHED +RESTRETCHES +RESTRETCHING +RESTRICKEN +RESTRICT +RESTRICTED +RESTRICTEDLY +RESTRICTING +RESTRICTION +RESTRICTIONISM +RESTRICTIONISMS +RESTRICTIONIST +RESTRICTIONISTS +RESTRICTIONS +RESTRICTIVE +RESTRICTIVELY +RESTRICTIVENESS +RESTRICTIVES +RESTRICTS +RESTRIKE +RESTRIKES +RESTRIKING +RESTRING +RESTRINGING +RESTRINGS +RESTRIVE +RESTRIVEN +RESTRIVES +RESTRIVING +RESTROOM +RESTROOMS +RESTROVE +RESTRUCK +RESTRUCTURE +RESTRUCTURED +RESTRUCTURES +RESTRUCTURING +RESTRUNG +RESTS +RESTUDIED +RESTUDIES +RESTUDY +RESTUDYING +RESTUFF +RESTUFFED +RESTUFFING +RESTUFFS +RESTYLE +RESTYLED +RESTYLES +RESTYLING +RESUBJECT +RESUBJECTED +RESUBJECTING +RESUBJECTS +RESUBMISSION +RESUBMISSIONS +RESUBMIT +RESUBMITS +RESUBMITTED +RESUBMITTING +RESULT +RESULTANT +RESULTANTLY +RESULTANTS +RESULTED +RESULTFUL +RESULTING +RESULTLESS +RESULTS +RESUMABLE +RESUME +RESUMED +RESUMER +RESUMERS +RESUMES +RESUMING +RESUMMON +RESUMMONED +RESUMMONING +RESUMMONS +RESUMPTION +RESUMPTIONS +RESUPINATE +RESUPINE +RESUPPLIED +RESUPPLIES +RESUPPLY +RESUPPLYING +RESURFACE +RESURFACED +RESURFACER +RESURFACERS +RESURFACES +RESURFACING +RESURGE +RESURGED +RESURGENCE +RESURGENCES +RESURGENT +RESURGES +RESURGING +RESURRECT +RESURRECTED +RESURRECTING +RESURRECTION +RESURRECTIONAL +RESURRECTIONIST +RESURRECTIONS +RESURRECTS +RESURVEY +RESURVEYED +RESURVEYING +RESURVEYS +RESUSCITATE +RESUSCITATED +RESUSCITATES +RESUSCITATING +RESUSCITATION +RESUSCITATIONS +RESUSCITATIVE +RESUSCITATOR +RESUSCITATORS +RESUSPEND +RESUSPENDED +RESUSPENDING +RESUSPENDS +RESWALLOW +RESWALLOWED +RESWALLOWING +RESWALLOWS +RESYNTHESES +RESYNTHESIS +RESYNTHESIZE +RESYNTHESIZED +RESYNTHESIZES +RESYNTHESIZING +RESYSTEMATIZE +RESYSTEMATIZED +RESYSTEMATIZES +RESYSTEMATIZING +RET +RETABLE +RETABLES +RETACK +RETACKED +RETACKING +RETACKLE +RETACKLED +RETACKLES +RETACKLING +RETACKS +RETAG +RETAGGED +RETAGGING +RETAGS +RETAIL +RETAILED +RETAILER +RETAILERS +RETAILING +RETAILINGS +RETAILOR +RETAILORED +RETAILORING +RETAILORS +RETAILS +RETAIN +RETAINED +RETAINER +RETAINERS +RETAINING +RETAINS +RETAKE +RETAKEN +RETAKER +RETAKERS +RETAKES +RETAKING +RETALIATE +RETALIATED +RETALIATES +RETALIATING +RETALIATION +RETALIATIONS +RETALIATIVE +RETALIATORY +RETALLIED +RETALLIES +RETALLY +RETALLYING +RETAPE +RETAPED +RETAPES +RETAPING +RETARD +RETARDANT +RETARDANTS +RETARDATE +RETARDATES +RETARDATION +RETARDATIONS +RETARDED +RETARDER +RETARDERS +RETARDING +RETARDS +RETARGET +RETARGETED +RETARGETING +RETARGETS +RETASTE +RETASTED +RETASTES +RETASTING +RETAUGHT +RETAX +RETAXED +RETAXES +RETAXING +RETCH +RETCHED +RETCHES +RETCHING +RETE +RETEACH +RETEACHES +RETEACHING +RETEAM +RETEAMED +RETEAMING +RETEAMS +RETEAR +RETEARING +RETEARS +RETELL +RETELLING +RETELLINGS +RETELLS +RETEM +RETEMPER +RETEMPERED +RETEMPERING +RETEMPERS +RETEMS +RETENE +RETENES +RETENTION +RETENTIONS +RETENTIVE +RETENTIVELY +RETENTIVENESS +RETENTIVENESSES +RETENTIVITIES +RETENTIVITY +RETEST +RETESTED +RETESTIFIED +RETESTIFIES +RETESTIFY +RETESTIFYING +RETESTING +RETESTS +RETEXTURE +RETEXTURED +RETEXTURES +RETEXTURING +RETHINK +RETHINKER +RETHINKERS +RETHINKING +RETHINKS +RETHOUGHT +RETHREAD +RETHREADED +RETHREADING +RETHREADS +RETIA +RETIAL +RETIARII +RETIARIUS +RETIARY +RETICENCE +RETICENCES +RETICENCIES +RETICENCY +RETICENT +RETICENTLY +RETICLE +RETICLES +RETICULA +RETICULAR +RETICULATE +RETICULATED +RETICULATELY +RETICULATES +RETICULATING +RETICULATION +RETICULATIONS +RETICULE +RETICULES +RETICULOCYTE +RETICULOCYTES +RETICULUM +RETICULUMS +RETIE +RETIED +RETIEING +RETIES +RETIFORM +RETIGHTEN +RETIGHTENED +RETIGHTENING +RETIGHTENS +RETILE +RETILED +RETILES +RETILING +RETIME +RETIMED +RETIMES +RETIMING +RETINA +RETINACULA +RETINACULUM +RETINAE +RETINAL +RETINALS +RETINAS +RETINE +RETINENE +RETINENES +RETINES +RETINITE +RETINITES +RETINITIDES +RETINITIS +RETINITISES +RETINOBLASTOMA +RETINOBLASTOMAS +RETINOID +RETINOIDS +RETINOL +RETINOLS +RETINOPATHIES +RETINOPATHY +RETINOSCOPIES +RETINOSCOPY +RETINOTECTAL +RETINT +RETINTED +RETINTING +RETINTS +RETINUE +RETINUED +RETINUES +RETINULA +RETINULAE +RETINULAR +RETINULAS +RETIRANT +RETIRANTS +RETIRE +RETIRED +RETIREDLY +RETIREDNESS +RETIREDNESSES +RETIREE +RETIREES +RETIREMENT +RETIREMENTS +RETIRER +RETIRERS +RETIRES +RETIRING +RETIRINGLY +RETIRINGNESS +RETIRINGNESSES +RETITLE +RETITLED +RETITLES +RETITLING +RETOLD +RETOOK +RETOOL +RETOOLED +RETOOLING +RETOOLS +RETORE +RETORN +RETORSION +RETORSIONS +RETORT +RETORTED +RETORTER +RETORTERS +RETORTING +RETORTION +RETORTIONS +RETORTS +RETOTAL +RETOTALED +RETOTALING +RETOTALLED +RETOTALLING +RETOTALS +RETOUCH +RETOUCHED +RETOUCHER +RETOUCHERS +RETOUCHES +RETOUCHING +RETRACE +RETRACED +RETRACER +RETRACERS +RETRACES +RETRACING +RETRACK +RETRACKED +RETRACKING +RETRACKS +RETRACT +RETRACTABLE +RETRACTED +RETRACTILE +RETRACTILITIES +RETRACTILITY +RETRACTING +RETRACTION +RETRACTIONS +RETRACTOR +RETRACTORS +RETRACTS +RETRAIN +RETRAINABLE +RETRAINED +RETRAINEE +RETRAINEES +RETRAINING +RETRAINS +RETRAL +RETRALLY +RETRANSFER +RETRANSFERRED +RETRANSFERRING +RETRANSFERS +RETRANSFORM +RETRANSFORMED +RETRANSFORMING +RETRANSFORMS +RETRANSLATE +RETRANSLATED +RETRANSLATES +RETRANSLATING +RETRANSLATION +RETRANSLATIONS +RETRANSMISSION +RETRANSMISSIONS +RETRANSMIT +RETRANSMITS +RETRANSMITTED +RETRANSMITTING +RETREAD +RETREADED +RETREADING +RETREADS +RETREAT +RETREATANT +RETREATANTS +RETREATED +RETREATER +RETREATERS +RETREATING +RETREATS +RETRENCH +RETRENCHED +RETRENCHES +RETRENCHING +RETRENCHMENT +RETRENCHMENTS +RETRIAL +RETRIALS +RETRIBUTION +RETRIBUTIONS +RETRIBUTIVE +RETRIBUTIVELY +RETRIBUTORY +RETRIED +RETRIES +RETRIEVABILITY +RETRIEVABLE +RETRIEVAL +RETRIEVALS +RETRIEVE +RETRIEVED +RETRIEVER +RETRIEVERS +RETRIEVES +RETRIEVING +RETRIM +RETRIMMED +RETRIMMING +RETRIMS +RETRO +RETROACT +RETROACTED +RETROACTING +RETROACTION +RETROACTIONS +RETROACTIVE +RETROACTIVELY +RETROACTIVITIES +RETROACTIVITY +RETROACTS +RETROCEDE +RETROCEDED +RETROCEDES +RETROCEDING +RETROCESSION +RETROCESSIONS +RETRODICT +RETRODICTED +RETRODICTING +RETRODICTION +RETRODICTIONS +RETRODICTIVE +RETRODICTS +RETROFIRE +RETROFIRED +RETROFIRES +RETROFIRING +RETROFIT +RETROFITS +RETROFITTED +RETROFITTING +RETROFLECTION +RETROFLECTIONS +RETROFLEX +RETROFLEXES +RETROFLEXION +RETROFLEXIONS +RETROGRADATION +RETROGRADATIONS +RETROGRADE +RETROGRADED +RETROGRADELY +RETROGRADES +RETROGRADING +RETROGRESS +RETROGRESSED +RETROGRESSES +RETROGRESSING +RETROGRESSION +RETROGRESSIONS +RETROGRESSIVE +RETROGRESSIVELY +RETRONYM +RETRONYMS +RETROPACK +RETROPACKS +RETROPERITONEAL +RETROREFLECTION +RETROREFLECTIVE +RETROREFLECTOR +RETROREFLECTORS +RETRORSE +RETROS +RETROSPECT +RETROSPECTED +RETROSPECTING +RETROSPECTION +RETROSPECTIONS +RETROSPECTIVE +RETROSPECTIVELY +RETROSPECTIVES +RETROSPECTS +RETROUSSE +RETROVERSION +RETROVERSIONS +RETROVIRAL +RETROVIRUS +RETROVIRUSES +RETRY +RETRYING +RETS +RETSINA +RETSINAS +RETTED +RETTING +RETUNE +RETUNED +RETUNES +RETUNING +RETURN +RETURNABLE +RETURNABLES +RETURNED +RETURNEE +RETURNEES +RETURNER +RETURNERS +RETURNING +RETURNS +RETUSE +RETWIST +RETWISTED +RETWISTING +RETWISTS +RETYING +RETYPE +RETYPED +RETYPES +RETYPING +REUNIFICATION +REUNIFICATIONS +REUNIFIED +REUNIFIES +REUNIFY +REUNIFYING +REUNION +REUNIONIST +REUNIONISTIC +REUNIONISTS +REUNIONS +REUNITE +REUNITED +REUNITER +REUNITERS +REUNITES +REUNITING +REUPHOLSTER +REUPHOLSTERED +REUPHOLSTERING +REUPHOLSTERS +REUPTAKE +REUPTAKES +REUSABILITIES +REUSABILITY +REUSABLE +REUSABLES +REUSE +REUSED +REUSES +REUSING +REUTILIZATION +REUTILIZATIONS +REUTILIZE +REUTILIZED +REUTILIZES +REUTILIZING +REUTTER +REUTTERED +REUTTERING +REUTTERS +REV +REVACCINATE +REVACCINATED +REVACCINATES +REVACCINATING +REVACCINATION +REVACCINATIONS +REVALIDATE +REVALIDATED +REVALIDATES +REVALIDATING +REVALIDATION +REVALIDATIONS +REVALORIZATION +REVALORIZATIONS +REVALORIZE +REVALORIZED +REVALORIZES +REVALORIZING +REVALUATE +REVALUATED +REVALUATES +REVALUATING +REVALUATION +REVALUATIONS +REVALUE +REVALUED +REVALUES +REVALUING +REVAMP +REVAMPED +REVAMPER +REVAMPERS +REVAMPING +REVAMPS +REVANCHE +REVANCHES +REVANCHISM +REVANCHISMS +REVANCHIST +REVANCHISTS +REVARNISH +REVARNISHED +REVARNISHES +REVARNISHING +REVEAL +REVEALABLE +REVEALED +REVEALER +REVEALERS +REVEALING +REVEALINGLY +REVEALMENT +REVEALMENTS +REVEALS +REVEGETATE +REVEGETATED +REVEGETATES +REVEGETATING +REVEGETATION +REVEGETATIONS +REVEHENT +REVEILLE +REVEILLES +REVEL +REVELATION +REVELATIONS +REVELATOR +REVELATORS +REVELATORY +REVELED +REVELER +REVELERS +REVELING +REVELLED +REVELLER +REVELLERS +REVELLING +REVELMENT +REVELMENTS +REVELRIES +REVELROUS +REVELRY +REVELS +REVENANT +REVENANTS +REVENGE +REVENGED +REVENGEFUL +REVENGEFULLY +REVENGEFULNESS +REVENGER +REVENGERS +REVENGES +REVENGING +REVENUAL +REVENUE +REVENUED +REVENUER +REVENUERS +REVENUES +REVERABLE +REVERB +REVERBED +REVERBERANT +REVERBERANTLY +REVERBERATE +REVERBERATED +REVERBERATES +REVERBERATING +REVERBERATION +REVERBERATIONS +REVERBERATIVE +REVERBERATORY +REVERBING +REVERBS +REVERE +REVERED +REVERENCE +REVERENCED +REVERENCER +REVERENCERS +REVERENCES +REVERENCING +REVEREND +REVERENDS +REVERENT +REVERENTIAL +REVERENTIALLY +REVERENTLY +REVERER +REVERERS +REVERES +REVERIE +REVERIES +REVERIFIED +REVERIFIES +REVERIFY +REVERIFYING +REVERING +REVERS +REVERSAL +REVERSALS +REVERSE +REVERSED +REVERSELY +REVERSER +REVERSERS +REVERSES +REVERSIBILITIES +REVERSIBILITY +REVERSIBLE +REVERSIBLES +REVERSIBLY +REVERSING +REVERSION +REVERSIONAL +REVERSIONARY +REVERSIONER +REVERSIONERS +REVERSIONS +REVERSO +REVERSOS +REVERT +REVERTANT +REVERTANTS +REVERTED +REVERTER +REVERTERS +REVERTIBLE +REVERTING +REVERTIVE +REVERTS +REVERY +REVEST +REVESTED +REVESTING +REVESTS +REVET +REVETMENT +REVETMENTS +REVETS +REVETTED +REVETTING +REVIBRATE +REVIBRATED +REVIBRATES +REVIBRATING +REVICTUAL +REVICTUALED +REVICTUALING +REVICTUALLED +REVICTUALLING +REVICTUALS +REVIEW +REVIEWABLE +REVIEWAL +REVIEWALS +REVIEWED +REVIEWER +REVIEWERS +REVIEWING +REVIEWS +REVILE +REVILED +REVILEMENT +REVILEMENTS +REVILER +REVILERS +REVILES +REVILING +REVIOLATE +REVIOLATED +REVIOLATES +REVIOLATING +REVISABLE +REVISAL +REVISALS +REVISE +REVISED +REVISER +REVISERS +REVISES +REVISING +REVISION +REVISIONARY +REVISIONISM +REVISIONISMS +REVISIONIST +REVISIONISTS +REVISIONS +REVISIT +REVISITED +REVISITING +REVISITS +REVISOR +REVISORS +REVISORY +REVISUALIZATION +REVITALISE +REVITALISED +REVITALISES +REVITALISING +REVITALIZATION +REVITALIZATIONS +REVITALIZE +REVITALIZED +REVITALIZES +REVITALIZING +REVIVABLE +REVIVAL +REVIVALISM +REVIVALISMS +REVIVALIST +REVIVALISTIC +REVIVALISTS +REVIVALS +REVIVE +REVIVED +REVIVER +REVIVERS +REVIVES +REVIVIFICATION +REVIVIFICATIONS +REVIVIFIED +REVIVIFIES +REVIVIFY +REVIVIFYING +REVIVING +REVIVISCENCE +REVIVISCENCES +REVIVISCENT +REVOCABLE +REVOCABLY +REVOCATION +REVOCATIONS +REVOICE +REVOICED +REVOICES +REVOICING +REVOKABLE +REVOKE +REVOKED +REVOKER +REVOKERS +REVOKES +REVOKING +REVOLT +REVOLTED +REVOLTER +REVOLTERS +REVOLTING +REVOLTINGLY +REVOLTS +REVOLUTE +REVOLUTION +REVOLUTIONARIES +REVOLUTIONARILY +REVOLUTIONARY +REVOLUTIONISE +REVOLUTIONISED +REVOLUTIONISES +REVOLUTIONISING +REVOLUTIONIST +REVOLUTIONISTS +REVOLUTIONIZE +REVOLUTIONIZED +REVOLUTIONIZER +REVOLUTIONIZERS +REVOLUTIONIZES +REVOLUTIONIZING +REVOLUTIONS +REVOLVABLE +REVOLVE +REVOLVED +REVOLVER +REVOLVERS +REVOLVES +REVOLVING +REVOTE +REVOTED +REVOTES +REVOTING +REVS +REVUE +REVUES +REVUIST +REVUISTS +REVULSED +REVULSION +REVULSIONS +REVULSIVE +REVVED +REVVING +REWAKE +REWAKED +REWAKEN +REWAKENED +REWAKENING +REWAKENS +REWAKES +REWAKING +REWAN +REWARD +REWARDABLE +REWARDED +REWARDER +REWARDERS +REWARDING +REWARDINGLY +REWARDS +REWARM +REWARMED +REWARMING +REWARMS +REWASH +REWASHED +REWASHES +REWASHING +REWAX +REWAXED +REWAXES +REWAXING +REWEAR +REWEARING +REWEARS +REWEAVE +REWEAVED +REWEAVES +REWEAVING +REWED +REWEDDED +REWEDDING +REWEDS +REWEIGH +REWEIGHED +REWEIGHING +REWEIGHS +REWELD +REWELDED +REWELDING +REWELDS +REWET +REWETS +REWETTED +REWETTING +REWIDEN +REWIDENED +REWIDENING +REWIDENS +REWIN +REWIND +REWINDED +REWINDER +REWINDERS +REWINDING +REWINDS +REWINNING +REWINS +REWIRE +REWIRED +REWIRES +REWIRING +REWOKE +REWOKEN +REWON +REWORD +REWORDED +REWORDING +REWORDS +REWORE +REWORK +REWORKED +REWORKING +REWORKS +REWORN +REWOUND +REWOVE +REWOVEN +REWRAP +REWRAPPED +REWRAPPING +REWRAPS +REWRAPT +REWRITE +REWRITER +REWRITERS +REWRITES +REWRITING +REWRITTEN +REWROTE +REWROUGHT +REX +REXES +REXINE +REXINES +REYNARD +REYNARDS +REZERO +REZEROED +REZEROES +REZEROING +REZEROS +REZONE +REZONED +REZONES +REZONING +RHABDOCOELE +RHABDOCOELES +RHABDOM +RHABDOMAL +RHABDOMANCER +RHABDOMANCERS +RHABDOMANCIES +RHABDOMANCY +RHABDOME +RHABDOMERE +RHABDOMERES +RHABDOMES +RHABDOMS +RHABDOVIRUS +RHABDOVIRUSES +RHACHIDES +RHACHIS +RHACHISES +RHADAMANTHINE +RHAMNOSE +RHAMNOSES +RHAMNUS +RHAMNUSES +RHAPHAE +RHAPHE +RHAPHES +RHAPSODE +RHAPSODES +RHAPSODIC +RHAPSODICAL +RHAPSODICALLY +RHAPSODIES +RHAPSODIST +RHAPSODISTS +RHAPSODIZE +RHAPSODIZED +RHAPSODIZES +RHAPSODIZING +RHAPSODY +RHATANIES +RHATANY +RHEA +RHEAS +RHEBOK +RHEBOKS +RHEMATIC +RHEME +RHEMES +RHENIUM +RHENIUMS +RHEOBASE +RHEOBASES +RHEOBASIC +RHEOLOGIC +RHEOLOGICAL +RHEOLOGICALLY +RHEOLOGIES +RHEOLOGIST +RHEOLOGISTS +RHEOLOGY +RHEOMETER +RHEOMETERS +RHEOPHIL +RHEOPHILE +RHEOPHILES +RHEOSTAT +RHEOSTATIC +RHEOSTATS +RHEOTAXES +RHEOTAXIS +RHESUS +RHESUSES +RHETOR +RHETORIC +RHETORICAL +RHETORICALLY +RHETORICIAN +RHETORICIANS +RHETORICS +RHETORS +RHEUM +RHEUMATIC +RHEUMATICALLY +RHEUMATICS +RHEUMATISM +RHEUMATISMS +RHEUMATIZ +RHEUMATIZES +RHEUMATOID +RHEUMATOLOGIES +RHEUMATOLOGIST +RHEUMATOLOGISTS +RHEUMATOLOGY +RHEUMIC +RHEUMIER +RHEUMIEST +RHEUMS +RHEUMY +RHIGOLENE +RHIGOLENES +RHINAL +RHINENCEPHALA +RHINENCEPHALIC +RHINENCEPHALON +RHINESTONE +RHINESTONED +RHINESTONES +RHINITIDES +RHINITIS +RHINO +RHINOCERI +RHINOCEROS +RHINOCEROSES +RHINOLOGIES +RHINOLOGY +RHINOPLASTIES +RHINOPLASTY +RHINOS +RHINOSCOPIES +RHINOSCOPY +RHINOVIRUS +RHINOVIRUSES +RHIZOBIA +RHIZOBIAL +RHIZOBIUM +RHIZOCTONIA +RHIZOCTONIAS +RHIZOID +RHIZOIDAL +RHIZOIDS +RHIZOMA +RHIZOMATA +RHIZOMATOUS +RHIZOME +RHIZOMES +RHIZOMIC +RHIZOPI +RHIZOPLANE +RHIZOPLANES +RHIZOPOD +RHIZOPODS +RHIZOPUS +RHIZOPUSES +RHIZOSPHERE +RHIZOSPHERES +RHIZOTOMIES +RHIZOTOMY +RHO +RHODAMIN +RHODAMINE +RHODAMINES +RHODAMINS +RHODIC +RHODIUM +RHODIUMS +RHODOCHROSITE +RHODOCHROSITES +RHODODENDRON +RHODODENDRONS +RHODOLITE +RHODOLITES +RHODOMONTADE +RHODOMONTADES +RHODONITE +RHODONITES +RHODOPSIN +RHODOPSINS +RHODORA +RHODORAS +RHOMB +RHOMBENCEPHALA +RHOMBENCEPHALON +RHOMBI +RHOMBIC +RHOMBICAL +RHOMBOHEDRA +RHOMBOHEDRAL +RHOMBOHEDRON +RHOMBOHEDRONS +RHOMBOID +RHOMBOIDAL +RHOMBOIDEI +RHOMBOIDEUS +RHOMBOIDS +RHOMBS +RHOMBUS +RHOMBUSES +RHONCHAL +RHONCHI +RHONCHIAL +RHONCHUS +RHOS +RHOTACISM +RHOTACISMS +RHOTIC +RHUBARB +RHUBARBS +RHUMB +RHUMBA +RHUMBAED +RHUMBAING +RHUMBAS +RHUMBS +RHUS +RHUSES +RHYME +RHYMED +RHYMELESS +RHYMER +RHYMERS +RHYMES +RHYMESTER +RHYMESTERS +RHYMING +RHYOLITE +RHYOLITES +RHYOLITIC +RHYTA +RHYTHM +RHYTHMIC +RHYTHMICAL +RHYTHMICALLY +RHYTHMICITIES +RHYTHMICITY +RHYTHMICS +RHYTHMIST +RHYTHMISTS +RHYTHMIZATION +RHYTHMIZATIONS +RHYTHMIZE +RHYTHMIZED +RHYTHMIZES +RHYTHMIZING +RHYTHMS +RHYTIDOME +RHYTIDOMES +RHYTON +RHYTONS +RIA +RIAL +RIALS +RIALTO +RIALTOS +RIANT +RIANTLY +RIAS +RIATA +RIATAS +RIB +RIBALD +RIBALDLY +RIBALDRIES +RIBALDRY +RIBALDS +RIBAND +RIBANDS +RIBAVIRIN +RIBAVIRINS +RIBBAND +RIBBANDS +RIBBED +RIBBER +RIBBERS +RIBBIER +RIBBIEST +RIBBING +RIBBINGS +RIBBON +RIBBONED +RIBBONFISH +RIBBONFISHES +RIBBONING +RIBBONLIKE +RIBBONS +RIBBONY +RIBBY +RIBES +RIBGRASS +RIBGRASSES +RIBIER +RIBIERS +RIBLESS +RIBLET +RIBLETS +RIBLIKE +RIBOFLAVIN +RIBOFLAVINS +RIBONUCLEASE +RIBONUCLEASES +RIBONUCLEOSIDE +RIBONUCLEOSIDES +RIBONUCLEOTIDE +RIBONUCLEOTIDES +RIBOSE +RIBOSES +RIBOSOMAL +RIBOSOME +RIBOSOMES +RIBOZYMAL +RIBOZYME +RIBOZYMES +RIBS +RIBWORT +RIBWORTS +RICE +RICEBIRD +RICEBIRDS +RICED +RICER +RICERCAR +RICERCARE +RICERCARI +RICERCARS +RICERS +RICES +RICH +RICHEN +RICHENED +RICHENING +RICHENS +RICHER +RICHES +RICHEST +RICHLY +RICHNESS +RICHNESSES +RICHWEED +RICHWEEDS +RICIN +RICING +RICINS +RICINUS +RICINUSES +RICK +RICKED +RICKETIER +RICKETIEST +RICKETS +RICKETTSIA +RICKETTSIAE +RICKETTSIAL +RICKETTSIAS +RICKETY +RICKEY +RICKEYS +RICKING +RICKRACK +RICKRACKS +RICKS +RICKSHA +RICKSHAS +RICKSHAW +RICKSHAWS +RICOCHET +RICOCHETED +RICOCHETING +RICOCHETS +RICOCHETTED +RICOCHETTING +RICOTTA +RICOTTAS +RICRAC +RICRACS +RICTAL +RICTUS +RICTUSES +RID +RIDABLE +RIDDANCE +RIDDANCES +RIDDED +RIDDEN +RIDDER +RIDDERS +RIDDING +RIDDLE +RIDDLED +RIDDLER +RIDDLERS +RIDDLES +RIDDLING +RIDE +RIDEABLE +RIDENT +RIDER +RIDERLESS +RIDERS +RIDERSHIP +RIDERSHIPS +RIDES +RIDGE +RIDGEBACK +RIDGEBACKS +RIDGED +RIDGEL +RIDGELINE +RIDGELINES +RIDGELING +RIDGELINGS +RIDGELS +RIDGEPOLE +RIDGEPOLES +RIDGES +RIDGETOP +RIDGETOPS +RIDGIER +RIDGIEST +RIDGIL +RIDGILS +RIDGING +RIDGLING +RIDGLINGS +RIDGY +RIDICULE +RIDICULED +RIDICULER +RIDICULERS +RIDICULES +RIDICULING +RIDICULOUS +RIDICULOUSLY +RIDICULOUSNESS +RIDING +RIDINGS +RIDLEY +RIDLEYS +RIDOTTO +RIDOTTOS +RIDS +RIEL +RIELS +RIESLING +RIESLINGS +RIEVER +RIEVERS +RIF +RIFAMPICIN +RIFAMPICINS +RIFAMPIN +RIFAMPINS +RIFAMYCIN +RIFAMYCINS +RIFE +RIFELY +RIFENESS +RIFENESSES +RIFER +RIFEST +RIFF +RIFFED +RIFFING +RIFFLE +RIFFLED +RIFFLER +RIFFLERS +RIFFLES +RIFFLING +RIFFRAFF +RIFFRAFFS +RIFFS +RIFLE +RIFLEBIRD +RIFLEBIRDS +RIFLED +RIFLEMAN +RIFLEMEN +RIFLER +RIFLERIES +RIFLERS +RIFLERY +RIFLES +RIFLING +RIFLINGS +RIFLIP +RIFLIPS +RIFS +RIFT +RIFTED +RIFTING +RIFTLESS +RIFTS +RIG +RIGADOON +RIGADOONS +RIGAMAROLE +RIGAMAROLES +RIGATONI +RIGATONIS +RIGAUDON +RIGAUDONS +RIGGED +RIGGER +RIGGERS +RIGGING +RIGGINGS +RIGHT +RIGHTED +RIGHTEOUS +RIGHTEOUSLY +RIGHTEOUSNESS +RIGHTEOUSNESSES +RIGHTER +RIGHTERS +RIGHTEST +RIGHTFUL +RIGHTFULLY +RIGHTFULNESS +RIGHTFULNESSES +RIGHTIES +RIGHTING +RIGHTISM +RIGHTISMS +RIGHTIST +RIGHTISTS +RIGHTLY +RIGHTMOST +RIGHTNESS +RIGHTNESSES +RIGHTO +RIGHTS +RIGHTSIZE +RIGHTSIZED +RIGHTSIZES +RIGHTSIZING +RIGHTWARD +RIGHTY +RIGID +RIGIDIFICATION +RIGIDIFICATIONS +RIGIDIFIED +RIGIDIFIES +RIGIDIFY +RIGIDIFYING +RIGIDITIES +RIGIDITY +RIGIDLY +RIGIDNESS +RIGIDNESSES +RIGMAROLE +RIGMAROLES +RIGOR +RIGORISM +RIGORISMS +RIGORIST +RIGORISTIC +RIGORISTS +RIGOROUS +RIGOROUSLY +RIGOROUSNESS +RIGOROUSNESSES +RIGORS +RIGOUR +RIGOURS +RIGS +RIJSTAFEL +RIJSTAFELS +RIJSTTAFEL +RIJSTTAFELS +RIKISHA +RIKISHAS +RIKSHAW +RIKSHAWS +RILE +RILED +RILES +RILEY +RILIEVI +RILIEVO +RILING +RILL +RILLE +RILLED +RILLES +RILLET +RILLETS +RILLETTES +RILLING +RILLS +RIM +RIME +RIMED +RIMER +RIMERS +RIMES +RIMESTER +RIMESTERS +RIMFIRE +RIMFIRES +RIMIER +RIMIEST +RIMINESS +RIMINESSES +RIMING +RIMLAND +RIMLANDS +RIMLESS +RIMMED +RIMMER +RIMMERS +RIMMING +RIMOSE +RIMOSELY +RIMOSITIES +RIMOSITY +RIMOUS +RIMPLE +RIMPLED +RIMPLES +RIMPLING +RIMROCK +RIMROCKS +RIMS +RIMSHOT +RIMSHOTS +RIMY +RIN +RIND +RINDED +RINDERPEST +RINDERPESTS +RINDLESS +RINDS +RINDY +RING +RINGBARK +RINGBARKED +RINGBARKING +RINGBARKS +RINGBOLT +RINGBOLTS +RINGBONE +RINGBONES +RINGDOVE +RINGDOVES +RINGED +RINGENT +RINGER +RINGERS +RINGGIT +RINGGITS +RINGHALS +RINGHALSES +RINGING +RINGINGLY +RINGLEADER +RINGLEADERS +RINGLET +RINGLETED +RINGLETS +RINGLIKE +RINGMASTER +RINGMASTERS +RINGNECK +RINGNECKS +RINGS +RINGSIDE +RINGSIDES +RINGSTRAKED +RINGTAIL +RINGTAILS +RINGTAW +RINGTAWS +RINGTOSS +RINGTOSSES +RINGWORM +RINGWORMS +RINK +RINKS +RINNING +RINS +RINSABLE +RINSE +RINSED +RINSER +RINSERS +RINSES +RINSIBLE +RINSING +RINSINGS +RIOJA +RIOJAS +RIOT +RIOTED +RIOTER +RIOTERS +RIOTING +RIOTOUS +RIOTOUSLY +RIOTOUSNESS +RIOTOUSNESSES +RIOTS +RIP +RIPARIAN +RIPCORD +RIPCORDS +RIPE +RIPED +RIPELY +RIPEN +RIPENED +RIPENER +RIPENERS +RIPENESS +RIPENESSES +RIPENING +RIPENS +RIPER +RIPES +RIPEST +RIPIENI +RIPIENO +RIPIENOS +RIPING +RIPOFF +RIPOFFS +RIPOST +RIPOSTE +RIPOSTED +RIPOSTES +RIPOSTING +RIPOSTS +RIPPABLE +RIPPED +RIPPER +RIPPERS +RIPPING +RIPPINGLY +RIPPLE +RIPPLED +RIPPLER +RIPPLERS +RIPPLES +RIPPLET +RIPPLETS +RIPPLIER +RIPPLIEST +RIPPLING +RIPPLY +RIPRAP +RIPRAPPED +RIPRAPPING +RIPRAPS +RIPS +RIPSAW +RIPSAWED +RIPSAWING +RIPSAWN +RIPSAWS +RIPSNORTER +RIPSNORTERS +RIPSNORTING +RIPSTOP +RIPSTOPS +RIPTIDE +RIPTIDES +RISE +RISEN +RISER +RISERS +RISES +RISHI +RISHIS +RISIBILITIES +RISIBILITY +RISIBLE +RISIBLES +RISIBLY +RISING +RISINGS +RISK +RISKED +RISKER +RISKERS +RISKIER +RISKIEST +RISKILY +RISKINESS +RISKINESSES +RISKING +RISKLESS +RISKS +RISKY +RISORGIMENTO +RISORGIMENTOS +RISOTTO +RISOTTOS +RISQUE +RISSOLE +RISSOLES +RISTRA +RISTRAS +RISUS +RISUSES +RITARD +RITARDANDO +RITARDANDOS +RITARDS +RITE +RITES +RITONAVIR +RITONAVIRS +RITORNELLI +RITORNELLO +RITORNELLOS +RITTER +RITTERS +RITUAL +RITUALISM +RITUALISMS +RITUALIST +RITUALISTIC +RITUALISTICALLY +RITUALISTS +RITUALIZATION +RITUALIZATIONS +RITUALIZE +RITUALIZED +RITUALIZES +RITUALIZING +RITUALLY +RITUALS +RITZ +RITZES +RITZIER +RITZIEST +RITZILY +RITZINESS +RITZINESSES +RITZY +RIVAGE +RIVAGES +RIVAL +RIVALED +RIVALING +RIVALLED +RIVALLING +RIVALRIES +RIVALROUS +RIVALRY +RIVALS +RIVE +RIVED +RIVEN +RIVER +RIVERBANK +RIVERBANKS +RIVERBED +RIVERBEDS +RIVERBOAT +RIVERBOATS +RIVERFRONT +RIVERFRONTS +RIVERHEAD +RIVERHEADS +RIVERINE +RIVERLESS +RIVERLIKE +RIVERS +RIVERSIDE +RIVERSIDES +RIVERWARD +RIVERWARDS +RIVERWEED +RIVERWEEDS +RIVES +RIVET +RIVETED +RIVETER +RIVETERS +RIVETING +RIVETINGLY +RIVETS +RIVETTED +RIVETTING +RIVIERA +RIVIERAS +RIVIERE +RIVIERES +RIVING +RIVULET +RIVULETS +RIVULOSE +RIYAL +RIYALS +ROACH +ROACHED +ROACHES +ROACHING +ROAD +ROADABILITIES +ROADABILITY +ROADBED +ROADBEDS +ROADBLOCK +ROADBLOCKED +ROADBLOCKING +ROADBLOCKS +ROADEO +ROADEOS +ROADHOLDING +ROADHOLDINGS +ROADHOUSE +ROADHOUSES +ROADIE +ROADIES +ROADKILL +ROADKILLS +ROADLESS +ROADRUNNER +ROADRUNNERS +ROADS +ROADSHOW +ROADSHOWS +ROADSIDE +ROADSIDES +ROADSTEAD +ROADSTEADS +ROADSTER +ROADSTERS +ROADWAY +ROADWAYS +ROADWORK +ROADWORKS +ROADWORTHINESS +ROADWORTHY +ROAM +ROAMED +ROAMER +ROAMERS +ROAMING +ROAMS +ROAN +ROANS +ROAR +ROARED +ROARER +ROARERS +ROARING +ROARINGLY +ROARINGS +ROARS +ROAST +ROASTED +ROASTER +ROASTERS +ROASTING +ROASTS +ROB +ROBALO +ROBALOS +ROBAND +ROBANDS +ROBBED +ROBBER +ROBBERIES +ROBBERS +ROBBERY +ROBBIN +ROBBING +ROBBINS +ROBE +ROBED +ROBES +ROBIN +ROBING +ROBINS +ROBLE +ROBLES +ROBORANT +ROBORANTS +ROBOT +ROBOTIC +ROBOTICALLY +ROBOTICS +ROBOTISM +ROBOTISMS +ROBOTIZATION +ROBOTIZATIONS +ROBOTIZE +ROBOTIZED +ROBOTIZES +ROBOTIZING +ROBOTRIES +ROBOTRY +ROBOTS +ROBS +ROBUST +ROBUSTA +ROBUSTAS +ROBUSTER +ROBUSTEST +ROBUSTIOUS +ROBUSTIOUSLY +ROBUSTIOUSNESS +ROBUSTLY +ROBUSTNESS +ROBUSTNESSES +ROC +ROCAILLE +ROCAILLES +ROCAMBOLE +ROCAMBOLES +ROCHET +ROCHETS +ROCK +ROCKABIES +ROCKABILLIES +ROCKABILLY +ROCKABLE +ROCKABY +ROCKABYE +ROCKABYES +ROCKAWAY +ROCKAWAYS +ROCKBOUND +ROCKED +ROCKER +ROCKERIES +ROCKERS +ROCKERY +ROCKET +ROCKETED +ROCKETEER +ROCKETEERS +ROCKETER +ROCKETERS +ROCKETING +ROCKETRIES +ROCKETRY +ROCKETS +ROCKFALL +ROCKFALLS +ROCKFISH +ROCKFISHES +ROCKHOPPER +ROCKHOPPERS +ROCKHOUND +ROCKHOUNDING +ROCKHOUNDINGS +ROCKHOUNDS +ROCKIER +ROCKIEST +ROCKINESS +ROCKINESSES +ROCKING +ROCKINGLY +ROCKLESS +ROCKLIKE +ROCKLING +ROCKLINGS +ROCKOON +ROCKOONS +ROCKROSE +ROCKROSES +ROCKS +ROCKSHAFT +ROCKSHAFTS +ROCKSLIDE +ROCKSLIDES +ROCKWEED +ROCKWEEDS +ROCKWORK +ROCKWORKS +ROCKY +ROCOCO +ROCOCOS +ROCS +ROD +RODDED +RODDING +RODE +RODENT +RODENTICIDE +RODENTICIDES +RODENTS +RODEO +RODEOED +RODEOING +RODEOS +RODES +RODLESS +RODLIKE +RODMAN +RODMEN +RODOMONTADE +RODOMONTADES +RODS +RODSMAN +RODSMEN +ROE +ROEBUCK +ROEBUCKS +ROENTGEN +ROENTGENOGRAM +ROENTGENOGRAMS +ROENTGENOGRAPHY +ROENTGENOLOGIC +ROENTGENOLOGIES +ROENTGENOLOGIST +ROENTGENOLOGY +ROENTGENS +ROES +ROGATION +ROGATIONS +ROGATORY +ROGER +ROGERED +ROGERING +ROGERS +ROGUE +ROGUED +ROGUEING +ROGUERIES +ROGUERY +ROGUES +ROGUING +ROGUISH +ROGUISHLY +ROGUISHNESS +ROGUISHNESSES +ROIL +ROILED +ROILIER +ROILIEST +ROILING +ROILS +ROILY +ROISTER +ROISTERED +ROISTERER +ROISTERERS +ROISTERING +ROISTEROUS +ROISTEROUSLY +ROISTERS +ROLAMITE +ROLAMITES +ROLE +ROLES +ROLF +ROLFED +ROLFER +ROLFERS +ROLFING +ROLFS +ROLL +ROLLAWAY +ROLLAWAYS +ROLLBACK +ROLLBACKS +ROLLED +ROLLER +ROLLERS +ROLLICK +ROLLICKED +ROLLICKING +ROLLICKS +ROLLICKY +ROLLING +ROLLINGS +ROLLMOP +ROLLMOPS +ROLLOUT +ROLLOUTS +ROLLOVER +ROLLOVERS +ROLLS +ROLLTOP +ROLLWAY +ROLLWAYS +ROM +ROMAINE +ROMAINES +ROMAJI +ROMAJIS +ROMAN +ROMANCE +ROMANCED +ROMANCER +ROMANCERS +ROMANCES +ROMANCING +ROMANISE +ROMANISED +ROMANISES +ROMANISING +ROMANIZATION +ROMANIZATIONS +ROMANIZE +ROMANIZED +ROMANIZES +ROMANIZING +ROMANO +ROMANOS +ROMANS +ROMANTIC +ROMANTICALLY +ROMANTICISE +ROMANTICISED +ROMANTICISES +ROMANTICISING +ROMANTICISM +ROMANTICISMS +ROMANTICIST +ROMANTICISTS +ROMANTICIZATION +ROMANTICIZE +ROMANTICIZED +ROMANTICIZES +ROMANTICIZING +ROMANTICS +ROMAUNT +ROMAUNTS +ROMELDALE +ROMELDALES +ROMEO +ROMEOS +ROMP +ROMPED +ROMPER +ROMPERS +ROMPING +ROMPINGLY +ROMPISH +ROMPS +ROMS +RONDEAU +RONDEAUX +RONDEL +RONDELET +RONDELETS +RONDELLE +RONDELLES +RONDELS +RONDO +RONDOS +RONDURE +RONDURES +RONION +RONIONS +RONNEL +RONNELS +RONTGEN +RONTGENS +RONYON +RONYONS +ROOD +ROODS +ROOF +ROOFED +ROOFER +ROOFERS +ROOFIE +ROOFIES +ROOFING +ROOFINGS +ROOFLESS +ROOFLIKE +ROOFLINE +ROOFLINES +ROOFS +ROOFTOP +ROOFTOPS +ROOFTREE +ROOFTREES +ROOK +ROOKED +ROOKERIES +ROOKERY +ROOKIE +ROOKIER +ROOKIES +ROOKIEST +ROOKING +ROOKS +ROOKY +ROOM +ROOMED +ROOMER +ROOMERS +ROOMETTE +ROOMETTES +ROOMFUL +ROOMFULS +ROOMIE +ROOMIER +ROOMIES +ROOMIEST +ROOMILY +ROOMINESS +ROOMINESSES +ROOMING +ROOMMATE +ROOMMATES +ROOMS +ROOMY +ROORBACH +ROORBACHS +ROORBACK +ROORBACKS +ROOSE +ROOSED +ROOSER +ROOSERS +ROOSES +ROOSING +ROOST +ROOSTED +ROOSTER +ROOSTERS +ROOSTING +ROOSTS +ROOT +ROOTAGE +ROOTAGES +ROOTCAP +ROOTCAPS +ROOTED +ROOTEDNESS +ROOTEDNESSES +ROOTER +ROOTERS +ROOTHOLD +ROOTHOLDS +ROOTIER +ROOTIEST +ROOTINESS +ROOTINESSES +ROOTING +ROOTLE +ROOTLED +ROOTLES +ROOTLESS +ROOTLESSNESS +ROOTLESSNESSES +ROOTLET +ROOTLETS +ROOTLIKE +ROOTLING +ROOTS +ROOTSTALK +ROOTSTALKS +ROOTSTOCK +ROOTSTOCKS +ROOTWORM +ROOTWORMS +ROOTY +ROPABLE +ROPE +ROPED +ROPEDANCER +ROPEDANCERS +ROPEDANCING +ROPEDANCINGS +ROPELIKE +ROPER +ROPERIES +ROPERS +ROPERY +ROPES +ROPEWALK +ROPEWALKER +ROPEWALKERS +ROPEWALKS +ROPEWAY +ROPEWAYS +ROPEY +ROPIER +ROPIEST +ROPILY +ROPINESS +ROPINESSES +ROPING +ROPY +ROQUE +ROQUELAURE +ROQUELAURES +ROQUES +ROQUET +ROQUETED +ROQUETING +ROQUETS +ROQUETTE +ROQUETTES +RORQUAL +RORQUALS +ROSACEA +ROSACEAS +ROSACEOUS +ROSANILIN +ROSANILINS +ROSARIA +ROSARIAN +ROSARIANS +ROSARIES +ROSARIUM +ROSARIUMS +ROSARY +ROSCOE +ROSCOES +ROSE +ROSEATE +ROSEATELY +ROSEBAY +ROSEBAYS +ROSEBUD +ROSEBUDS +ROSEBUSH +ROSEBUSHES +ROSED +ROSEFISH +ROSEFISHES +ROSEHIP +ROSEHIPS +ROSELIKE +ROSELLE +ROSELLES +ROSEMALING +ROSEMALINGS +ROSEMARIES +ROSEMARY +ROSEOLA +ROSEOLAR +ROSEOLAS +ROSERIES +ROSEROOT +ROSEROOTS +ROSERY +ROSES +ROSESLUG +ROSESLUGS +ROSET +ROSETS +ROSETTE +ROSETTES +ROSEWATER +ROSEWOOD +ROSEWOODS +ROSHI +ROSHIS +ROSIER +ROSIEST +ROSILY +ROSIN +ROSINED +ROSINESS +ROSINESSES +ROSING +ROSINING +ROSINOL +ROSINOLS +ROSINOUS +ROSINS +ROSINWEED +ROSINWEEDS +ROSINY +ROSOLIO +ROSOLIOS +ROSTELLA +ROSTELLAR +ROSTELLUM +ROSTELLUMS +ROSTER +ROSTERS +ROSTRA +ROSTRAL +ROSTRALLY +ROSTRATE +ROSTRUM +ROSTRUMS +ROSULATE +ROSY +ROT +ROTA +ROTAMETER +ROTAMETERS +ROTARIES +ROTARY +ROTAS +ROTATABLE +ROTATE +ROTATED +ROTATES +ROTATING +ROTATION +ROTATIONAL +ROTATIONS +ROTATIVE +ROTATIVELY +ROTATOR +ROTATORES +ROTATORS +ROTATORY +ROTAVIRUS +ROTAVIRUSES +ROTCH +ROTCHE +ROTCHES +ROTE +ROTENONE +ROTENONES +ROTES +ROTGUT +ROTGUTS +ROTI +ROTIFER +ROTIFERAL +ROTIFERAN +ROTIFERANS +ROTIFERS +ROTIFORM +ROTIS +ROTISSERIE +ROTISSERIES +ROTL +ROTLS +ROTO +ROTOGRAVURE +ROTOGRAVURES +ROTOR +ROTORCRAFT +ROTORS +ROTOS +ROTOTILL +ROTOTILLED +ROTOTILLER +ROTOTILLERS +ROTOTILLING +ROTOTILLS +ROTS +ROTTE +ROTTED +ROTTEN +ROTTENER +ROTTENEST +ROTTENLY +ROTTENNESS +ROTTENNESSES +ROTTENSTONE +ROTTENSTONES +ROTTER +ROTTERS +ROTTES +ROTTING +ROTTWEILER +ROTTWEILERS +ROTUND +ROTUNDA +ROTUNDAS +ROTUNDITIES +ROTUNDITY +ROTUNDLY +ROTUNDNESS +ROTUNDNESSES +ROTURIER +ROTURIERS +ROUBLE +ROUBLES +ROUCHE +ROUCHES +ROUE +ROUEN +ROUENS +ROUES +ROUGE +ROUGED +ROUGES +ROUGH +ROUGHAGE +ROUGHAGES +ROUGHBACK +ROUGHBACKS +ROUGHCAST +ROUGHCASTING +ROUGHCASTS +ROUGHDRIED +ROUGHDRIES +ROUGHDRY +ROUGHDRYING +ROUGHED +ROUGHEN +ROUGHENED +ROUGHENING +ROUGHENS +ROUGHER +ROUGHERS +ROUGHEST +ROUGHHEW +ROUGHHEWED +ROUGHHEWING +ROUGHHEWN +ROUGHHEWS +ROUGHHOUSE +ROUGHHOUSED +ROUGHHOUSES +ROUGHHOUSING +ROUGHIES +ROUGHING +ROUGHISH +ROUGHLEG +ROUGHLEGS +ROUGHLY +ROUGHNECK +ROUGHNECKED +ROUGHNECKING +ROUGHNECKS +ROUGHNESS +ROUGHNESSES +ROUGHRIDER +ROUGHRIDERS +ROUGHS +ROUGHSHOD +ROUGHY +ROUGING +ROUILLE +ROUILLES +ROULADE +ROULADES +ROULEAU +ROULEAUS +ROULEAUX +ROULETTE +ROULETTED +ROULETTES +ROULETTING +ROUND +ROUNDABOUT +ROUNDABOUTNESS +ROUNDABOUTS +ROUNDBALL +ROUNDBALLS +ROUNDED +ROUNDEDNESS +ROUNDEDNESSES +ROUNDEL +ROUNDELAY +ROUNDELAYS +ROUNDELS +ROUNDER +ROUNDERS +ROUNDEST +ROUNDHEADED +ROUNDHEADEDNESS +ROUNDHEEL +ROUNDHEELS +ROUNDHOUSE +ROUNDHOUSES +ROUNDING +ROUNDISH +ROUNDLET +ROUNDLETS +ROUNDLY +ROUNDNESS +ROUNDNESSES +ROUNDS +ROUNDSMAN +ROUNDSMEN +ROUNDTABLE +ROUNDTABLES +ROUNDTRIP +ROUNDTRIPS +ROUNDUP +ROUNDUPS +ROUNDWOOD +ROUNDWOODS +ROUNDWORM +ROUNDWORMS +ROUP +ROUPED +ROUPET +ROUPIER +ROUPIEST +ROUPILY +ROUPING +ROUPS +ROUPY +ROUSE +ROUSEABOUT +ROUSEABOUTS +ROUSED +ROUSEMENT +ROUSEMENTS +ROUSER +ROUSERS +ROUSES +ROUSING +ROUSINGLY +ROUSSEAU +ROUSSEAUS +ROUST +ROUSTABOUT +ROUSTABOUTS +ROUSTED +ROUSTER +ROUSTERS +ROUSTING +ROUSTS +ROUT +ROUTE +ROUTED +ROUTEMAN +ROUTEMEN +ROUTER +ROUTERS +ROUTES +ROUTEWAY +ROUTEWAYS +ROUTH +ROUTHS +ROUTINE +ROUTINELY +ROUTINES +ROUTING +ROUTINISM +ROUTINISMS +ROUTINIST +ROUTINISTS +ROUTINIZATION +ROUTINIZATIONS +ROUTINIZE +ROUTINIZED +ROUTINIZES +ROUTINIZING +ROUTS +ROUX +ROVE +ROVED +ROVEN +ROVER +ROVERS +ROVES +ROVING +ROVINGLY +ROVINGS +ROW +ROWABLE +ROWAN +ROWANBERRIES +ROWANBERRY +ROWANS +ROWBOAT +ROWBOATS +ROWDIER +ROWDIES +ROWDIEST +ROWDILY +ROWDINESS +ROWDINESSES +ROWDY +ROWDYISH +ROWDYISM +ROWDYISMS +ROWED +ROWEL +ROWELED +ROWELING +ROWELLED +ROWELLING +ROWELS +ROWEN +ROWENS +ROWER +ROWERS +ROWING +ROWINGS +ROWLOCK +ROWLOCKS +ROWS +ROWTH +ROWTHS +ROYAL +ROYALISM +ROYALISMS +ROYALIST +ROYALISTS +ROYALLY +ROYALMAST +ROYALMASTS +ROYALS +ROYALTIES +ROYALTY +ROYSTER +ROYSTERED +ROYSTERING +ROYSTERS +ROZZER +ROZZERS +RUANA +RUANAS +RUB +RUBABOO +RUBABOOS +RUBACE +RUBACES +RUBAIYAT +RUBASSE +RUBASSES +RUBATI +RUBATO +RUBATOS +RUBBABOO +RUBBABOOS +RUBBED +RUBBER +RUBBERED +RUBBERIER +RUBBERIEST +RUBBERING +RUBBERIZE +RUBBERIZED +RUBBERIZES +RUBBERIZING +RUBBERLIKE +RUBBERNECK +RUBBERNECKED +RUBBERNECKER +RUBBERNECKERS +RUBBERNECKING +RUBBERNECKS +RUBBERS +RUBBERY +RUBBIES +RUBBING +RUBBINGS +RUBBISH +RUBBISHES +RUBBISHY +RUBBLE +RUBBLED +RUBBLES +RUBBLIER +RUBBLIEST +RUBBLING +RUBBLY +RUBBOARD +RUBBOARDS +RUBBY +RUBDOWN +RUBDOWNS +RUBE +RUBEFACIENT +RUBEFACIENTS +RUBEL +RUBELLA +RUBELLAS +RUBELLITE +RUBELLITES +RUBELS +RUBEOLA +RUBEOLAR +RUBEOLAS +RUBES +RUBESCENT +RUBICUND +RUBICUNDITIES +RUBICUNDITY +RUBIDIC +RUBIDIUM +RUBIDIUMS +RUBIED +RUBIER +RUBIES +RUBIEST +RUBIGO +RUBIGOS +RUBIOUS +RUBLE +RUBLES +RUBOFF +RUBOFFS +RUBOUT +RUBOUTS +RUBRIC +RUBRICAL +RUBRICALLY +RUBRICATE +RUBRICATED +RUBRICATES +RUBRICATING +RUBRICATION +RUBRICATIONS +RUBRICATOR +RUBRICATORS +RUBRICIAN +RUBRICIANS +RUBRICS +RUBS +RUBUS +RUBY +RUBYING +RUBYLIKE +RUBYTHROAT +RUBYTHROATS +RUCHE +RUCHED +RUCHES +RUCHING +RUCHINGS +RUCK +RUCKED +RUCKING +RUCKLE +RUCKLED +RUCKLES +RUCKLING +RUCKS +RUCKSACK +RUCKSACKS +RUCKUS +RUCKUSES +RUCTION +RUCTIONS +RUCTIOUS +RUDBECKIA +RUDBECKIAS +RUDD +RUDDER +RUDDERLESS +RUDDERPOST +RUDDERPOSTS +RUDDERS +RUDDIER +RUDDIEST +RUDDILY +RUDDINESS +RUDDINESSES +RUDDLE +RUDDLED +RUDDLEMAN +RUDDLEMEN +RUDDLES +RUDDLING +RUDDOCK +RUDDOCKS +RUDDS +RUDDY +RUDE +RUDELY +RUDENESS +RUDENESSES +RUDER +RUDERAL +RUDERALS +RUDERIES +RUDERY +RUDESBIES +RUDESBY +RUDEST +RUDIMENT +RUDIMENTAL +RUDIMENTARILY +RUDIMENTARINESS +RUDIMENTARY +RUDIMENTS +RUE +RUED +RUEFUL +RUEFULLY +RUEFULNESS +RUEFULNESSES +RUER +RUERS +RUES +RUFESCENT +RUFF +RUFFE +RUFFED +RUFFES +RUFFIAN +RUFFIANISM +RUFFIANISMS +RUFFIANLY +RUFFIANS +RUFFING +RUFFLE +RUFFLED +RUFFLER +RUFFLERS +RUFFLES +RUFFLIER +RUFFLIEST +RUFFLIKE +RUFFLING +RUFFLY +RUFFS +RUFIYAA +RUFOUS +RUG +RUGA +RUGAE +RUGAL +RUGALACH +RUGATE +RUGBIES +RUGBY +RUGELACH +RUGGED +RUGGEDER +RUGGEDEST +RUGGEDIZATION +RUGGEDIZATIONS +RUGGEDIZE +RUGGEDIZED +RUGGEDIZES +RUGGEDIZING +RUGGEDLY +RUGGEDNESS +RUGGEDNESSES +RUGGER +RUGGERS +RUGGING +RUGLIKE +RUGOLA +RUGOLAS +RUGOSA +RUGOSAS +RUGOSE +RUGOSELY +RUGOSITIES +RUGOSITY +RUGOUS +RUGS +RUGULOSE +RUIN +RUINABLE +RUINATE +RUINATED +RUINATES +RUINATING +RUINATION +RUINATIONS +RUINED +RUINER +RUINERS +RUING +RUINING +RUINOUS +RUINOUSLY +RUINOUSNESS +RUINOUSNESSES +RUINS +RULABLE +RULE +RULED +RULELESS +RULER +RULERS +RULERSHIP +RULERSHIPS +RULES +RULIER +RULIEST +RULING +RULINGS +RULY +RUM +RUMAKI +RUMAKIS +RUMBA +RUMBAED +RUMBAING +RUMBAS +RUMBLE +RUMBLED +RUMBLER +RUMBLERS +RUMBLES +RUMBLING +RUMBLINGS +RUMBLY +RUMBUSTIOUS +RUMBUSTIOUSLY +RUMBUSTIOUSNESS +RUMEN +RUMENS +RUMINA +RUMINAL +RUMINANT +RUMINANTLY +RUMINANTS +RUMINATE +RUMINATED +RUMINATES +RUMINATING +RUMINATION +RUMINATIONS +RUMINATIVE +RUMINATIVELY +RUMINATOR +RUMINATORS +RUMMAGE +RUMMAGED +RUMMAGER +RUMMAGERS +RUMMAGES +RUMMAGING +RUMMER +RUMMERS +RUMMEST +RUMMIER +RUMMIES +RUMMIEST +RUMMY +RUMOR +RUMORED +RUMORING +RUMORMONGER +RUMORMONGERING +RUMORMONGERINGS +RUMORMONGERS +RUMORS +RUMOUR +RUMOURED +RUMOURING +RUMOURS +RUMP +RUMPLE +RUMPLED +RUMPLES +RUMPLESS +RUMPLIER +RUMPLIEST +RUMPLING +RUMPLY +RUMPS +RUMPUS +RUMPUSES +RUMRUNNER +RUMRUNNERS +RUMS +RUN +RUNABOUT +RUNABOUTS +RUNAGATE +RUNAGATES +RUNAROUND +RUNAROUNDS +RUNAWAY +RUNAWAYS +RUNBACK +RUNBACKS +RUNCINATE +RUNDLE +RUNDLES +RUNDLET +RUNDLETS +RUNDOWN +RUNDOWNS +RUNE +RUNELIKE +RUNES +RUNG +RUNGLESS +RUNGS +RUNIC +RUNKLE +RUNKLED +RUNKLES +RUNKLING +RUNLESS +RUNLET +RUNLETS +RUNNEL +RUNNELS +RUNNER +RUNNERS +RUNNIER +RUNNIEST +RUNNINESS +RUNNINESSES +RUNNING +RUNNINGS +RUNNY +RUNOFF +RUNOFFS +RUNOUT +RUNOUTS +RUNOVER +RUNOVERS +RUNROUND +RUNROUNDS +RUNS +RUNT +RUNTIER +RUNTIEST +RUNTINESS +RUNTINESSES +RUNTISH +RUNTISHLY +RUNTS +RUNTY +RUNWAY +RUNWAYS +RUPEE +RUPEES +RUPIAH +RUPIAHS +RUPTURE +RUPTURED +RUPTURES +RUPTURING +RURAL +RURALISE +RURALISED +RURALISES +RURALISING +RURALISM +RURALISMS +RURALIST +RURALISTS +RURALITE +RURALITES +RURALITIES +RURALITY +RURALIZE +RURALIZED +RURALIZES +RURALIZING +RURALLY +RURBAN +RUSE +RUSES +RUSH +RUSHED +RUSHEE +RUSHEES +RUSHER +RUSHERS +RUSHES +RUSHIER +RUSHIEST +RUSHING +RUSHINGS +RUSHLIGHT +RUSHLIGHTS +RUSHLIKE +RUSHY +RUSINE +RUSK +RUSKS +RUSSET +RUSSETING +RUSSETINGS +RUSSETS +RUSSETTING +RUSSETTINGS +RUSSETY +RUSSIFIED +RUSSIFIES +RUSSIFY +RUSSIFYING +RUST +RUSTABLE +RUSTED +RUSTIC +RUSTICAL +RUSTICALLY +RUSTICALS +RUSTICATE +RUSTICATED +RUSTICATES +RUSTICATING +RUSTICATION +RUSTICATIONS +RUSTICATOR +RUSTICATORS +RUSTICITIES +RUSTICITY +RUSTICLY +RUSTICS +RUSTIER +RUSTIEST +RUSTILY +RUSTINESS +RUSTINESSES +RUSTING +RUSTLE +RUSTLED +RUSTLER +RUSTLERS +RUSTLES +RUSTLESS +RUSTLING +RUSTPROOF +RUSTPROOFED +RUSTPROOFING +RUSTPROOFS +RUSTS +RUSTY +RUT +RUTABAGA +RUTABAGAS +RUTH +RUTHENIC +RUTHENIUM +RUTHENIUMS +RUTHERFORDIUM +RUTHERFORDIUMS +RUTHFUL +RUTHFULLY +RUTHFULNESS +RUTHFULNESSES +RUTHLESS +RUTHLESSLY +RUTHLESSNESS +RUTHLESSNESSES +RUTHS +RUTILANT +RUTILE +RUTILES +RUTIN +RUTINS +RUTS +RUTTED +RUTTIER +RUTTIEST +RUTTILY +RUTTINESS +RUTTINESSES +RUTTING +RUTTISH +RUTTISHLY +RUTTISHNESS +RUTTISHNESSES +RUTTY +RYA +RYAS +RYE +RYEGRASS +RYEGRASSES +RYES +RYKE +RYKED +RYKES +RYKING +RYND +RYNDS +RYOKAN +RYOKANS +RYOT +RYOTS +SAB +SABADILLA +SABADILLAS +SABAL +SABALS +SABATON +SABATONS +SABAYON +SABAYONS +SABBAT +SABBATH +SABBATHS +SABBATIC +SABBATICAL +SABBATICALS +SABBATICS +SABBATS +SABBED +SABBING +SABE +SABED +SABEING +SABER +SABERED +SABERING +SABERLIKE +SABERMETRICIAN +SABERMETRICIANS +SABERMETRICS +SABERS +SABES +SABIN +SABINE +SABINES +SABINS +SABIR +SABIRS +SABLE +SABLEFISH +SABLEFISHES +SABLES +SABOT +SABOTAGE +SABOTAGED +SABOTAGES +SABOTAGING +SABOTEUR +SABOTEURS +SABOTS +SABRA +SABRAS +SABRE +SABRED +SABRES +SABRING +SABS +SABULOSE +SABULOUS +SAC +SACAHUISTA +SACAHUISTAS +SACAHUISTE +SACAHUISTES +SACATON +SACATONS +SACBUT +SACBUTS +SACCADE +SACCADES +SACCADIC +SACCATE +SACCHARASE +SACCHARASES +SACCHARIC +SACCHARIDE +SACCHARIDES +SACCHARIFIED +SACCHARIFIES +SACCHARIFY +SACCHARIFYING +SACCHARIMETER +SACCHARIMETERS +SACCHARIN +SACCHARINE +SACCHARINITIES +SACCHARINITY +SACCHARINS +SACCHAROIDAL +SACCHAROMETER +SACCHAROMETERS +SACCHAROMYCES +SACCHAROMYCETES +SACCULAR +SACCULATE +SACCULATED +SACCULATION +SACCULATIONS +SACCULE +SACCULES +SACCULI +SACCULUS +SACERDOTAL +SACERDOTALISM +SACERDOTALISMS +SACERDOTALIST +SACERDOTALISTS +SACERDOTALLY +SACHEM +SACHEMIC +SACHEMS +SACHET +SACHETED +SACHETS +SACK +SACKBUT +SACKBUTS +SACKCLOTH +SACKCLOTHS +SACKED +SACKER +SACKERS +SACKFUL +SACKFULS +SACKING +SACKINGS +SACKLIKE +SACKS +SACKSFUL +SACLIKE +SACQUE +SACQUES +SACRA +SACRAL +SACRALIZE +SACRALIZED +SACRALIZES +SACRALIZING +SACRALS +SACRAMENT +SACRAMENTAL +SACRAMENTALISM +SACRAMENTALISMS +SACRAMENTALIST +SACRAMENTALISTS +SACRAMENTALLY +SACRAMENTALS +SACRAMENTS +SACRARIA +SACRARIAL +SACRARIUM +SACRED +SACREDLY +SACREDNESS +SACREDNESSES +SACRIFICE +SACRIFICED +SACRIFICER +SACRIFICERS +SACRIFICES +SACRIFICIAL +SACRIFICIALLY +SACRIFICING +SACRILEGE +SACRILEGES +SACRILEGIOUS +SACRILEGIOUSLY +SACRING +SACRINGS +SACRIST +SACRISTAN +SACRISTANS +SACRISTIES +SACRISTS +SACRISTY +SACROILIAC +SACROILIACS +SACROSANCT +SACROSANCTITIES +SACROSANCTITY +SACRUM +SACRUMS +SACS +SAD +SADDEN +SADDENED +SADDENING +SADDENS +SADDER +SADDEST +SADDHU +SADDHUS +SADDLE +SADDLEBAG +SADDLEBAGS +SADDLEBOW +SADDLEBOWS +SADDLEBRED +SADDLEBREDS +SADDLECLOTH +SADDLECLOTHS +SADDLED +SADDLELESS +SADDLER +SADDLERIES +SADDLERS +SADDLERY +SADDLES +SADDLETREE +SADDLETREES +SADDLING +SADE +SADES +SADHE +SADHES +SADHU +SADHUS +SADI +SADIRON +SADIRONS +SADIS +SADISM +SADISMS +SADIST +SADISTIC +SADISTICALLY +SADISTS +SADLY +SADNESS +SADNESSES +SADOMASOCHISM +SADOMASOCHISMS +SADOMASOCHIST +SADOMASOCHISTIC +SADOMASOCHISTS +SAE +SAFARI +SAFARIED +SAFARIING +SAFARIS +SAFE +SAFECRACKER +SAFECRACKERS +SAFECRACKING +SAFECRACKINGS +SAFEGUARD +SAFEGUARDED +SAFEGUARDING +SAFEGUARDS +SAFEKEEPING +SAFEKEEPINGS +SAFELIGHT +SAFELIGHTS +SAFELY +SAFENESS +SAFENESSES +SAFER +SAFES +SAFEST +SAFETIED +SAFETIES +SAFETY +SAFETYING +SAFETYMAN +SAFETYMEN +SAFFLOWER +SAFFLOWERS +SAFFRON +SAFFRONS +SAFRANIN +SAFRANINE +SAFRANINES +SAFRANINS +SAFROL +SAFROLE +SAFROLES +SAFROLS +SAG +SAGA +SAGACIOUS +SAGACIOUSLY +SAGACIOUSNESS +SAGACIOUSNESSES +SAGACITIES +SAGACITY +SAGAMAN +SAGAMEN +SAGAMORE +SAGAMORES +SAGANASH +SAGANASHES +SAGAS +SAGBUT +SAGBUTS +SAGE +SAGEBRUSH +SAGEBRUSHES +SAGELY +SAGENESS +SAGENESSES +SAGER +SAGES +SAGEST +SAGGAR +SAGGARD +SAGGARDS +SAGGARED +SAGGARING +SAGGARS +SAGGED +SAGGER +SAGGERED +SAGGERING +SAGGERS +SAGGIER +SAGGIEST +SAGGING +SAGGY +SAGIER +SAGIEST +SAGITTAL +SAGITTALLY +SAGITTARIES +SAGITTARY +SAGITTATE +SAGO +SAGOS +SAGS +SAGUARO +SAGUAROS +SAGUM +SAGY +SAHIB +SAHIBS +SAHIWAL +SAHIWALS +SAHUARO +SAHUAROS +SAICE +SAICES +SAID +SAIDS +SAIGA +SAIGAS +SAIL +SAILABLE +SAILBOARD +SAILBOARDED +SAILBOARDING +SAILBOARDINGS +SAILBOARDS +SAILBOAT +SAILBOATER +SAILBOATERS +SAILBOATING +SAILBOATINGS +SAILBOATS +SAILCLOTH +SAILCLOTHS +SAILED +SAILER +SAILERS +SAILFISH +SAILFISHES +SAILING +SAILINGS +SAILLESS +SAILMAKER +SAILMAKERS +SAILOR +SAILORLY +SAILORS +SAILPLANE +SAILPLANED +SAILPLANER +SAILPLANERS +SAILPLANES +SAILPLANING +SAILS +SAIMIN +SAIMINS +SAIN +SAINED +SAINFOIN +SAINFOINS +SAINING +SAINS +SAINT +SAINTDOM +SAINTDOMS +SAINTED +SAINTHOOD +SAINTHOODS +SAINTING +SAINTLIER +SAINTLIEST +SAINTLIKE +SAINTLINESS +SAINTLINESSES +SAINTLY +SAINTS +SAINTSHIP +SAINTSHIPS +SAITH +SAITHE +SAIYID +SAIYIDS +SAJOU +SAJOUS +SAKE +SAKER +SAKERS +SAKES +SAKI +SAKIS +SAL +SALAAM +SALAAMED +SALAAMING +SALAAMS +SALABILITIES +SALABILITY +SALABLE +SALABLY +SALACIOUS +SALACIOUSLY +SALACIOUSNESS +SALACIOUSNESSES +SALACITIES +SALACITY +SALAD +SALADANG +SALADANGS +SALADS +SALAL +SALALS +SALAMANDER +SALAMANDERS +SALAMANDRINE +SALAMI +SALAMIS +SALARIAT +SALARIATS +SALARIED +SALARIES +SALARY +SALARYING +SALARYMAN +SALARYMEN +SALCHOW +SALCHOWS +SALE +SALEABLE +SALEABLY +SALEP +SALEPS +SALERATUS +SALERATUSES +SALEROOM +SALEROOMS +SALES +SALESCLERK +SALESCLERKS +SALESGIRL +SALESGIRLS +SALESLADIES +SALESLADY +SALESMAN +SALESMANSHIP +SALESMANSHIPS +SALESMEN +SALESPEOPLE +SALESPERSON +SALESPERSONS +SALESROOM +SALESROOMS +SALESWOMAN +SALESWOMEN +SALIC +SALICIN +SALICINE +SALICINES +SALICINS +SALICYLATE +SALICYLATES +SALIENCE +SALIENCES +SALIENCIES +SALIENCY +SALIENT +SALIENTLY +SALIENTS +SALIFIED +SALIFIES +SALIFY +SALIFYING +SALIMETER +SALIMETERS +SALIMETRIES +SALIMETRY +SALINA +SALINAS +SALINE +SALINES +SALINITIES +SALINITY +SALINIZATION +SALINIZATIONS +SALINIZE +SALINIZED +SALINIZES +SALINIZING +SALINOMETER +SALINOMETERS +SALIVA +SALIVARY +SALIVAS +SALIVATE +SALIVATED +SALIVATES +SALIVATING +SALIVATION +SALIVATIONS +SALIVATOR +SALIVATORS +SALL +SALLET +SALLETS +SALLIED +SALLIER +SALLIERS +SALLIES +SALLOW +SALLOWED +SALLOWER +SALLOWEST +SALLOWING +SALLOWISH +SALLOWLY +SALLOWNESS +SALLOWNESSES +SALLOWS +SALLOWY +SALLY +SALLYING +SALMAGUNDI +SALMAGUNDIS +SALMI +SALMIS +SALMON +SALMONBERRIES +SALMONBERRY +SALMONELLA +SALMONELLAE +SALMONELLAS +SALMONELLOSES +SALMONELLOSIS +SALMONID +SALMONIDS +SALMONOID +SALMONOIDS +SALMONS +SALOL +SALOLS +SALOMETER +SALOMETERS +SALON +SALONS +SALOON +SALOONS +SALOOP +SALOOPS +SALP +SALPA +SALPAE +SALPAS +SALPIAN +SALPIANS +SALPID +SALPIDS +SALPIFORM +SALPIGLOSSES +SALPIGLOSSIS +SALPINGES +SALPINGITIS +SALPINGITISES +SALPINX +SALPS +SALS +SALSA +SALSAS +SALSIFIES +SALSIFY +SALSILLA +SALSILLAS +SALT +SALTANT +SALTARELLO +SALTARELLOS +SALTATION +SALTATIONS +SALTATORIAL +SALTATORY +SALTBOX +SALTBOXES +SALTBUSH +SALTBUSHES +SALTCELLAR +SALTCELLARS +SALTCHUCK +SALTCHUCKS +SALTED +SALTER +SALTERN +SALTERNS +SALTERS +SALTEST +SALTIE +SALTIER +SALTIERS +SALTIES +SALTIEST +SALTILY +SALTIMBOCCA +SALTIMBOCCAS +SALTINE +SALTINES +SALTINESS +SALTINESSES +SALTING +SALTINGS +SALTIRE +SALTIRES +SALTISH +SALTLESS +SALTLIKE +SALTNESS +SALTNESSES +SALTPAN +SALTPANS +SALTPETER +SALTPETERS +SALTPETRE +SALTPETRES +SALTS +SALTSHAKER +SALTSHAKERS +SALTWATER +SALTWORK +SALTWORKS +SALTWORT +SALTWORTS +SALTY +SALUBRIOUS +SALUBRIOUSLY +SALUBRIOUSNESS +SALUBRITIES +SALUBRITY +SALUKI +SALUKIS +SALURETIC +SALURETICS +SALUTARILY +SALUTARINESS +SALUTARINESSES +SALUTARY +SALUTATION +SALUTATIONAL +SALUTATIONS +SALUTATORIAN +SALUTATORIANS +SALUTATORIES +SALUTATORY +SALUTE +SALUTED +SALUTER +SALUTERS +SALUTES +SALUTIFEROUS +SALUTING +SALVABLE +SALVABLY +SALVAGE +SALVAGEABILITY +SALVAGEABLE +SALVAGED +SALVAGEE +SALVAGEES +SALVAGER +SALVAGERS +SALVAGES +SALVAGING +SALVARSAN +SALVARSANS +SALVATION +SALVATIONAL +SALVATIONISM +SALVATIONISMS +SALVATIONIST +SALVATIONISTS +SALVATIONS +SALVE +SALVED +SALVER +SALVERFORM +SALVERS +SALVES +SALVIA +SALVIAS +SALVIFIC +SALVING +SALVO +SALVOED +SALVOES +SALVOING +SALVOR +SALVORS +SALVOS +SAMADHI +SAMADHIS +SAMARA +SAMARAS +SAMARITAN +SAMARITANS +SAMARIUM +SAMARIUMS +SAMARSKITE +SAMARSKITES +SAMBA +SAMBAED +SAMBAING +SAMBAL +SAMBALS +SAMBAR +SAMBARS +SAMBAS +SAMBHAR +SAMBHARS +SAMBHUR +SAMBHURS +SAMBO +SAMBOS +SAMBUCA +SAMBUCAS +SAMBUKE +SAMBUKES +SAMBUR +SAMBURS +SAME +SAMECH +SAMECHS +SAMEK +SAMEKH +SAMEKHS +SAMEKS +SAMENESS +SAMENESSES +SAMIEL +SAMIELS +SAMISEN +SAMISENS +SAMITE +SAMITES +SAMIZDAT +SAMIZDATS +SAMLET +SAMLETS +SAMOSA +SAMOSAS +SAMOVAR +SAMOVARS +SAMOYED +SAMOYEDS +SAMP +SAMPAN +SAMPANS +SAMPHIRE +SAMPHIRES +SAMPLE +SAMPLED +SAMPLER +SAMPLERS +SAMPLES +SAMPLING +SAMPLINGS +SAMPS +SAMSARA +SAMSARAS +SAMSHU +SAMSHUS +SAMURAI +SAMURAIS +SANATIVE +SANATORIA +SANATORIUM +SANATORIUMS +SANBENITO +SANBENITOS +SANCTA +SANCTIFICATION +SANCTIFICATIONS +SANCTIFIED +SANCTIFIER +SANCTIFIERS +SANCTIFIES +SANCTIFY +SANCTIFYING +SANCTIMONIES +SANCTIMONIOUS +SANCTIMONIOUSLY +SANCTIMONY +SANCTION +SANCTIONABLE +SANCTIONED +SANCTIONING +SANCTIONS +SANCTITIES +SANCTITY +SANCTUARIES +SANCTUARY +SANCTUM +SANCTUMS +SAND +SANDABLE +SANDAL +SANDALED +SANDALING +SANDALLED +SANDALLING +SANDALS +SANDALWOOD +SANDALWOODS +SANDARAC +SANDARACS +SANDBAG +SANDBAGGED +SANDBAGGER +SANDBAGGERS +SANDBAGGING +SANDBAGS +SANDBANK +SANDBANKS +SANDBAR +SANDBARS +SANDBLAST +SANDBLASTED +SANDBLASTER +SANDBLASTERS +SANDBLASTING +SANDBLASTS +SANDBOX +SANDBOXES +SANDBUR +SANDBURR +SANDBURRS +SANDBURS +SANDCRACK +SANDCRACKS +SANDDAB +SANDDABS +SANDED +SANDER +SANDERLING +SANDERLINGS +SANDERS +SANDFISH +SANDFISHES +SANDFLIES +SANDFLY +SANDGLASS +SANDGLASSES +SANDGROUSE +SANDGROUSES +SANDHI +SANDHIS +SANDHOG +SANDHOGS +SANDIER +SANDIEST +SANDINESS +SANDINESSES +SANDING +SANDLESS +SANDLIKE +SANDLING +SANDLINGS +SANDLOT +SANDLOTS +SANDLOTTER +SANDLOTTERS +SANDMAN +SANDMEN +SANDPAINTING +SANDPAINTINGS +SANDPAPER +SANDPAPERED +SANDPAPERING +SANDPAPERS +SANDPAPERY +SANDPEEP +SANDPEEPS +SANDPILE +SANDPILES +SANDPIPER +SANDPIPERS +SANDPIT +SANDPITS +SANDS +SANDSHOE +SANDSHOES +SANDSOAP +SANDSOAPS +SANDSPUR +SANDSPURS +SANDSTONE +SANDSTONES +SANDSTORM +SANDSTORMS +SANDWICH +SANDWICHED +SANDWICHES +SANDWICHING +SANDWORM +SANDWORMS +SANDWORT +SANDWORTS +SANDY +SANE +SANED +SANELY +SANENESS +SANENESSES +SANER +SANES +SANEST +SANG +SANGA +SANGAR +SANGAREE +SANGAREES +SANGARS +SANGAS +SANGER +SANGERS +SANGFROID +SANGFROIDS +SANGH +SANGHS +SANGRIA +SANGRIAS +SANGUINARIA +SANGUINARIAS +SANGUINARILY +SANGUINARY +SANGUINE +SANGUINELY +SANGUINENESS +SANGUINENESSES +SANGUINEOUS +SANGUINES +SANGUINITIES +SANGUINITY +SANICLE +SANICLES +SANIDINE +SANIDINES +SANIES +SANING +SANIOUS +SANITARIA +SANITARIAN +SANITARIANS +SANITARIES +SANITARILY +SANITARIUM +SANITARIUMS +SANITARY +SANITATE +SANITATED +SANITATES +SANITATING +SANITATION +SANITATIONS +SANITIES +SANITISE +SANITISED +SANITISES +SANITISING +SANITIZATION +SANITIZATIONS +SANITIZE +SANITIZED +SANITIZER +SANITIZERS +SANITIZES +SANITIZING +SANITORIA +SANITORIUM +SANITORIUMS +SANITY +SANJAK +SANJAKS +SANK +SANNOP +SANNOPS +SANNUP +SANNUPS +SANNYASI +SANNYASIN +SANNYASINS +SANNYASIS +SANS +SANSAR +SANSARS +SANSCULOTTE +SANSCULOTTES +SANSCULOTTIC +SANSCULOTTISH +SANSCULOTTISM +SANSCULOTTISMS +SANSEI +SANSEIS +SANSERIF +SANSERIFS +SANSEVIERIA +SANSEVIERIAS +SANTALIC +SANTALOL +SANTALOLS +SANTERA +SANTERAS +SANTERIA +SANTERIAS +SANTERO +SANTEROS +SANTIMI +SANTIMS +SANTIMU +SANTIR +SANTIRS +SANTO +SANTOL +SANTOLINA +SANTOLINAS +SANTOLS +SANTONICA +SANTONICAS +SANTONIN +SANTONINS +SANTOOR +SANTOORS +SANTOS +SANTOUR +SANTOURS +SANTUR +SANTURS +SAP +SAPAJOU +SAPAJOUS +SAPANWOOD +SAPANWOODS +SAPHEAD +SAPHEADED +SAPHEADS +SAPHENA +SAPHENAE +SAPHENAS +SAPHENOUS +SAPID +SAPIDITIES +SAPIDITY +SAPIENCE +SAPIENCES +SAPIENCIES +SAPIENCY +SAPIENS +SAPIENT +SAPIENTLY +SAPIENTS +SAPLESS +SAPLESSNESS +SAPLESSNESSES +SAPLING +SAPLINGS +SAPODILLA +SAPODILLAS +SAPOGENIN +SAPOGENINS +SAPONACEOUS +SAPONACEOUSNESS +SAPONATED +SAPONIFIABLE +SAPONIFICATION +SAPONIFICATIONS +SAPONIFIED +SAPONIFIER +SAPONIFIERS +SAPONIFIES +SAPONIFY +SAPONIFYING +SAPONIN +SAPONINE +SAPONINES +SAPONINS +SAPONITE +SAPONITES +SAPOR +SAPORIFIC +SAPOROUS +SAPORS +SAPOTA +SAPOTAS +SAPOTE +SAPOTES +SAPOUR +SAPOURS +SAPPED +SAPPER +SAPPERS +SAPPHIC +SAPPHICS +SAPPHIRE +SAPPHIRES +SAPPHIRINE +SAPPHISM +SAPPHISMS +SAPPHIST +SAPPHISTS +SAPPIER +SAPPIEST +SAPPILY +SAPPINESS +SAPPINESSES +SAPPING +SAPPY +SAPRAEMIA +SAPRAEMIAS +SAPREMIA +SAPREMIAS +SAPREMIC +SAPROBE +SAPROBES +SAPROBIAL +SAPROBIC +SAPROGENIC +SAPROGENICITIES +SAPROGENICITY +SAPROLITE +SAPROLITES +SAPROPEL +SAPROPELS +SAPROPHAGOUS +SAPROPHYTE +SAPROPHYTES +SAPROPHYTIC +SAPROPHYTICALLY +SAPROZOIC +SAPS +SAPSAGO +SAPSAGOS +SAPSUCKER +SAPSUCKERS +SAPWOOD +SAPWOODS +SARABAND +SARABANDE +SARABANDES +SARABANDS +SARAN +SARANS +SARAPE +SARAPES +SARCASM +SARCASMS +SARCASTIC +SARCASTICALLY +SARCENET +SARCENETS +SARCINA +SARCINAE +SARCINAS +SARCOCARP +SARCOCARPS +SARCOID +SARCOIDOSES +SARCOIDOSIS +SARCOIDS +SARCOLEMMA +SARCOLEMMAL +SARCOLEMMAS +SARCOLOGIES +SARCOLOGY +SARCOMA +SARCOMAS +SARCOMATA +SARCOMATOSES +SARCOMATOSIS +SARCOMATOUS +SARCOMERE +SARCOMERES +SARCOPHAGI +SARCOPHAGUS +SARCOPHAGUSES +SARCOPLASM +SARCOPLASMIC +SARCOPLASMS +SARCOSOMAL +SARCOSOME +SARCOSOMES +SARCOUS +SARD +SARDANA +SARDANAS +SARDAR +SARDARS +SARDINE +SARDINED +SARDINES +SARDINING +SARDIUS +SARDIUSES +SARDONIC +SARDONICALLY +SARDONICISM +SARDONICISMS +SARDONYX +SARDONYXES +SARDS +SAREE +SAREES +SARGASSO +SARGASSOS +SARGASSUM +SARGASSUMS +SARGE +SARGES +SARGO +SARGOS +SARI +SARIN +SARINS +SARIS +SARK +SARKIER +SARKIEST +SARKS +SARKY +SARMENT +SARMENTA +SARMENTS +SARMENTUM +SAROD +SARODE +SARODES +SARODIST +SARODISTS +SARODS +SARONG +SARONGS +SAROS +SAROSES +SARRACENIA +SARRACENIAS +SARSAPARILLA +SARSAPARILLAS +SARSAR +SARSARS +SARSEN +SARSENET +SARSENETS +SARSENS +SARSNET +SARSNETS +SARTOR +SARTORIAL +SARTORIALLY +SARTORII +SARTORIUS +SARTORS +SASH +SASHAY +SASHAYED +SASHAYING +SASHAYS +SASHED +SASHES +SASHIMI +SASHIMIS +SASHING +SASHLESS +SASIN +SASINS +SASKATOON +SASKATOONS +SASQUATCH +SASQUATCHES +SASS +SASSABIES +SASSABY +SASSAFRAS +SASSAFRASES +SASSED +SASSES +SASSIER +SASSIES +SASSIEST +SASSILY +SASSINESS +SASSINESSES +SASSING +SASSWOOD +SASSWOODS +SASSY +SASSYWOOD +SASSYWOODS +SASTRUGA +SASTRUGI +SAT +SATANG +SATANGS +SATANIC +SATANICAL +SATANICALLY +SATANISM +SATANISMS +SATANIST +SATANISTS +SATARA +SATARAS +SATAY +SATAYS +SATCHEL +SATCHELED +SATCHELFUL +SATCHELFULS +SATCHELS +SATCHELSFUL +SATE +SATED +SATEEN +SATEENS +SATELLITE +SATELLITES +SATEM +SATES +SATI +SATIABLE +SATIABLY +SATIATE +SATIATED +SATIATES +SATIATING +SATIATION +SATIATIONS +SATIETIES +SATIETY +SATIN +SATINET +SATINETS +SATINETTE +SATINETTES +SATING +SATINPOD +SATINPODS +SATINS +SATINWOOD +SATINWOODS +SATINY +SATIRE +SATIRES +SATIRIC +SATIRICAL +SATIRICALLY +SATIRISE +SATIRISED +SATIRISES +SATIRISING +SATIRIST +SATIRISTS +SATIRIZABLE +SATIRIZE +SATIRIZED +SATIRIZER +SATIRIZERS +SATIRIZES +SATIRIZING +SATIS +SATISFACTION +SATISFACTIONS +SATISFACTORILY +SATISFACTORY +SATISFIABLE +SATISFICE +SATISFICED +SATISFICES +SATISFICING +SATISFIED +SATISFIER +SATISFIERS +SATISFIES +SATISFY +SATISFYING +SATISFYINGLY +SATORI +SATORIS +SATRAP +SATRAPIES +SATRAPS +SATRAPY +SATSUMA +SATSUMAS +SATURABLE +SATURANT +SATURANTS +SATURATE +SATURATED +SATURATER +SATURATERS +SATURATES +SATURATING +SATURATION +SATURATIONS +SATURATOR +SATURATORS +SATURNALIA +SATURNALIAN +SATURNALIANLY +SATURNALIAS +SATURNIID +SATURNIIDS +SATURNINE +SATURNISM +SATURNISMS +SATYAGRAHA +SATYAGRAHAS +SATYR +SATYRIASES +SATYRIASIS +SATYRIC +SATYRICAL +SATYRID +SATYRIDS +SATYRLIKE +SATYRS +SAU +SAUCE +SAUCEBOAT +SAUCEBOATS +SAUCEBOX +SAUCEBOXES +SAUCED +SAUCEPAN +SAUCEPANS +SAUCEPOT +SAUCEPOTS +SAUCER +SAUCERLIKE +SAUCERS +SAUCES +SAUCH +SAUCHS +SAUCIER +SAUCIERS +SAUCIEST +SAUCILY +SAUCINESS +SAUCINESSES +SAUCING +SAUCY +SAUERBRATEN +SAUERBRATENS +SAUERKRAUT +SAUERKRAUTS +SAUGER +SAUGERS +SAUGH +SAUGHS +SAUGHY +SAUL +SAULS +SAULT +SAULTS +SAUNA +SAUNAED +SAUNAING +SAUNAS +SAUNTER +SAUNTERED +SAUNTERER +SAUNTERERS +SAUNTERING +SAUNTERS +SAUREL +SAURELS +SAURIAN +SAURIANS +SAURIES +SAURISCHIAN +SAURISCHIANS +SAUROPOD +SAUROPODS +SAURY +SAUSAGE +SAUSAGES +SAUTE +SAUTED +SAUTEED +SAUTEING +SAUTERNE +SAUTERNES +SAUTES +SAUTOIR +SAUTOIRE +SAUTOIRES +SAUTOIRS +SAVABLE +SAVAGE +SAVAGED +SAVAGELY +SAVAGENESS +SAVAGENESSES +SAVAGER +SAVAGERIES +SAVAGERY +SAVAGES +SAVAGEST +SAVAGING +SAVAGISM +SAVAGISMS +SAVANNA +SAVANNAH +SAVANNAHS +SAVANNAS +SAVANT +SAVANTS +SAVARIN +SAVARINS +SAVATE +SAVATES +SAVE +SAVEABLE +SAVED +SAVELOY +SAVELOYS +SAVER +SAVERS +SAVES +SAVIN +SAVINE +SAVINES +SAVING +SAVINGLY +SAVINGS +SAVINS +SAVIOR +SAVIORS +SAVIOUR +SAVIOURS +SAVOR +SAVORED +SAVORER +SAVORERS +SAVORIER +SAVORIES +SAVORIEST +SAVORILY +SAVORINESS +SAVORINESSES +SAVORING +SAVORLESS +SAVOROUS +SAVORS +SAVORY +SAVOUR +SAVOURED +SAVOURER +SAVOURERS +SAVOURIER +SAVOURIES +SAVOURIEST +SAVOURING +SAVOURS +SAVOURY +SAVOY +SAVOYS +SAVVIED +SAVVIER +SAVVIES +SAVVIEST +SAVVILY +SAVVINESS +SAVVINESSES +SAVVY +SAVVYING +SAW +SAWBILL +SAWBILLS +SAWBONES +SAWBONESES +SAWBUCK +SAWBUCKS +SAWDUST +SAWDUSTS +SAWDUSTY +SAWED +SAWER +SAWERS +SAWFISH +SAWFISHES +SAWFLIES +SAWFLY +SAWHORSE +SAWHORSES +SAWING +SAWLIKE +SAWLOG +SAWLOGS +SAWMILL +SAWMILLS +SAWN +SAWNEY +SAWNEYS +SAWS +SAWTEETH +SAWTIMBER +SAWTIMBERS +SAWTOOTH +SAWYER +SAWYERS +SAX +SAXATILE +SAXES +SAXHORN +SAXHORNS +SAXICOLOUS +SAXIFRAGE +SAXIFRAGES +SAXITOXIN +SAXITOXINS +SAXONIES +SAXONY +SAXOPHONE +SAXOPHONES +SAXOPHONIC +SAXOPHONIST +SAXOPHONISTS +SAXTUBA +SAXTUBAS +SAY +SAYABLE +SAYED +SAYEDS +SAYER +SAYERS +SAYEST +SAYID +SAYIDS +SAYING +SAYINGS +SAYONARA +SAYONARAS +SAYS +SAYST +SAYYID +SAYYIDS +SCAB +SCABBARD +SCABBARDED +SCABBARDING +SCABBARDS +SCABBED +SCABBIER +SCABBIEST +SCABBILY +SCABBING +SCABBLE +SCABBLED +SCABBLES +SCABBLING +SCABBY +SCABIES +SCABIETIC +SCABIOSA +SCABIOSAS +SCABIOUS +SCABIOUSES +SCABLAND +SCABLANDS +SCABLIKE +SCABROUS +SCABROUSLY +SCABROUSNESS +SCABROUSNESSES +SCABS +SCAD +SCADS +SCAFFOLD +SCAFFOLDED +SCAFFOLDING +SCAFFOLDINGS +SCAFFOLDS +SCAG +SCAGLIOLA +SCAGLIOLAS +SCAGS +SCALABLE +SCALABLY +SCALADE +SCALADES +SCALADO +SCALADOS +SCALAGE +SCALAGES +SCALAR +SCALARE +SCALARES +SCALARIFORM +SCALARIFORMLY +SCALARS +SCALATION +SCALATIONS +SCALAWAG +SCALAWAGS +SCALD +SCALDED +SCALDIC +SCALDING +SCALDS +SCALE +SCALED +SCALELESS +SCALELIKE +SCALENE +SCALENI +SCALENUS +SCALEPAN +SCALEPANS +SCALER +SCALERS +SCALES +SCALETAIL +SCALETAILS +SCALEUP +SCALEUPS +SCALIER +SCALIEST +SCALINESS +SCALINESSES +SCALING +SCALL +SCALLAWAG +SCALLAWAGS +SCALLION +SCALLIONS +SCALLOP +SCALLOPED +SCALLOPER +SCALLOPERS +SCALLOPING +SCALLOPINI +SCALLOPINIS +SCALLOPS +SCALLS +SCALLYWAG +SCALLYWAGS +SCALOGRAM +SCALOGRAMS +SCALOPPINE +SCALOPPINES +SCALP +SCALPED +SCALPEL +SCALPELS +SCALPER +SCALPERS +SCALPING +SCALPS +SCALY +SCAM +SCAMMED +SCAMMER +SCAMMERS +SCAMMING +SCAMMONIES +SCAMMONY +SCAMP +SCAMPED +SCAMPER +SCAMPERED +SCAMPERER +SCAMPERERS +SCAMPERING +SCAMPERS +SCAMPI +SCAMPIES +SCAMPING +SCAMPISH +SCAMPS +SCAMS +SCAMSTER +SCAMSTERS +SCAN +SCANDAL +SCANDALED +SCANDALING +SCANDALISE +SCANDALISED +SCANDALISES +SCANDALISING +SCANDALIZE +SCANDALIZED +SCANDALIZES +SCANDALIZING +SCANDALLED +SCANDALLING +SCANDALMONGER +SCANDALMONGERS +SCANDALOUS +SCANDALOUSLY +SCANDALOUSNESS +SCANDALS +SCANDENT +SCANDIA +SCANDIAS +SCANDIC +SCANDIUM +SCANDIUMS +SCANNABLE +SCANNED +SCANNER +SCANNERS +SCANNING +SCANNINGS +SCANS +SCANSION +SCANSIONS +SCANT +SCANTED +SCANTER +SCANTEST +SCANTIER +SCANTIES +SCANTIEST +SCANTILY +SCANTINESS +SCANTINESSES +SCANTING +SCANTLING +SCANTLINGS +SCANTLY +SCANTNESS +SCANTNESSES +SCANTS +SCANTY +SCAPE +SCAPED +SCAPEGOAT +SCAPEGOATED +SCAPEGOATING +SCAPEGOATISM +SCAPEGOATISMS +SCAPEGOATS +SCAPEGRACE +SCAPEGRACES +SCAPES +SCAPHOID +SCAPHOIDS +SCAPHOPOD +SCAPHOPODS +SCAPING +SCAPOLITE +SCAPOLITES +SCAPOSE +SCAPULA +SCAPULAE +SCAPULAR +SCAPULARS +SCAPULARY +SCAPULAS +SCAR +SCARAB +SCARABAEI +SCARABAEUS +SCARABAEUSES +SCARABOID +SCARABS +SCARAMOUCH +SCARAMOUCHE +SCARAMOUCHES +SCARCE +SCARCELY +SCARCENESS +SCARCENESSES +SCARCER +SCARCEST +SCARCITIES +SCARCITY +SCARE +SCARECROW +SCARECROWS +SCARED +SCAREDER +SCAREDEST +SCAREHEAD +SCAREHEADS +SCAREMONGER +SCAREMONGERS +SCARER +SCARERS +SCARES +SCAREY +SCARF +SCARFED +SCARFER +SCARFERS +SCARFING +SCARFPIN +SCARFPINS +SCARFS +SCARFSKIN +SCARFSKINS +SCARIER +SCARIEST +SCARIFICATION +SCARIFICATIONS +SCARIFIED +SCARIFIER +SCARIFIERS +SCARIFIES +SCARIFY +SCARIFYING +SCARIFYINGLY +SCARILY +SCARINESS +SCARINESSES +SCARING +SCARIOSE +SCARIOUS +SCARLATINA +SCARLATINAL +SCARLATINAS +SCARLESS +SCARLET +SCARLETS +SCARP +SCARPED +SCARPER +SCARPERED +SCARPERING +SCARPERS +SCARPH +SCARPHED +SCARPHING +SCARPHS +SCARPING +SCARPS +SCARRED +SCARRIER +SCARRIEST +SCARRING +SCARRY +SCARS +SCART +SCARTED +SCARTING +SCARTS +SCARVES +SCARY +SCAT +SCATBACK +SCATBACKS +SCATHE +SCATHED +SCATHELESS +SCATHES +SCATHING +SCATHINGLY +SCATOLOGICAL +SCATOLOGIES +SCATOLOGY +SCATS +SCATT +SCATTED +SCATTER +SCATTERATION +SCATTERATIONS +SCATTERBRAIN +SCATTERBRAINED +SCATTERBRAINS +SCATTERED +SCATTERER +SCATTERERS +SCATTERGOOD +SCATTERGOODS +SCATTERGRAM +SCATTERGRAMS +SCATTERGUN +SCATTERGUNS +SCATTERING +SCATTERINGLY +SCATTERINGS +SCATTERS +SCATTERSHOT +SCATTIER +SCATTIEST +SCATTING +SCATTS +SCATTY +SCAUP +SCAUPER +SCAUPERS +SCAUPS +SCAUR +SCAURS +SCAVENGE +SCAVENGED +SCAVENGER +SCAVENGERS +SCAVENGES +SCAVENGING +SCENA +SCENARIO +SCENARIOS +SCENARIST +SCENARISTS +SCENAS +SCEND +SCENDED +SCENDING +SCENDS +SCENE +SCENERIES +SCENERY +SCENES +SCENESHIFTER +SCENESHIFTERS +SCENIC +SCENICAL +SCENICALLY +SCENICS +SCENOGRAPHER +SCENOGRAPHERS +SCENOGRAPHIC +SCENOGRAPHIES +SCENOGRAPHY +SCENT +SCENTED +SCENTING +SCENTLESS +SCENTS +SCEPTER +SCEPTERED +SCEPTERING +SCEPTERS +SCEPTIC +SCEPTICAL +SCEPTICISM +SCEPTICISMS +SCEPTICS +SCEPTRAL +SCEPTRE +SCEPTRED +SCEPTRES +SCEPTRING +SCHADENFREUDE +SCHADENFREUDES +SCHAPPE +SCHAPPES +SCHATCHEN +SCHATCHENS +SCHAV +SCHAVS +SCHEDULAR +SCHEDULE +SCHEDULED +SCHEDULER +SCHEDULERS +SCHEDULES +SCHEDULING +SCHEELITE +SCHEELITES +SCHEMA +SCHEMAS +SCHEMATA +SCHEMATIC +SCHEMATICALLY +SCHEMATICS +SCHEMATISM +SCHEMATISMS +SCHEMATIZATION +SCHEMATIZATIONS +SCHEMATIZE +SCHEMATIZED +SCHEMATIZES +SCHEMATIZING +SCHEME +SCHEMED +SCHEMER +SCHEMERS +SCHEMES +SCHEMING +SCHERZANDO +SCHERZANDOS +SCHERZI +SCHERZO +SCHERZOS +SCHILLER +SCHILLERS +SCHILLING +SCHILLINGS +SCHIPPERKE +SCHIPPERKES +SCHISM +SCHISMATIC +SCHISMATICAL +SCHISMATICALLY +SCHISMATICS +SCHISMATIZE +SCHISMATIZED +SCHISMATIZES +SCHISMATIZING +SCHISMS +SCHIST +SCHISTOSE +SCHISTOSITIES +SCHISTOSITY +SCHISTOSOMAL +SCHISTOSOME +SCHISTOSOMES +SCHISTOSOMIASES +SCHISTOSOMIASIS +SCHISTOUS +SCHISTS +SCHIZIER +SCHIZIEST +SCHIZO +SCHIZOCARP +SCHIZOCARPS +SCHIZOGONIC +SCHIZOGONIES +SCHIZOGONOUS +SCHIZOGONY +SCHIZOID +SCHIZOIDS +SCHIZONT +SCHIZONTS +SCHIZOPHRENE +SCHIZOPHRENES +SCHIZOPHRENIA +SCHIZOPHRENIAS +SCHIZOPHRENIC +SCHIZOPHRENICS +SCHIZOPOD +SCHIZOPODS +SCHIZOS +SCHIZY +SCHIZZIER +SCHIZZIEST +SCHIZZY +SCHLEMIEL +SCHLEMIELS +SCHLEMIHL +SCHLEMIHLS +SCHLEP +SCHLEPP +SCHLEPPED +SCHLEPPING +SCHLEPPS +SCHLEPS +SCHLIERE +SCHLIEREN +SCHLIERIC +SCHLOCK +SCHLOCKIER +SCHLOCKIEST +SCHLOCKS +SCHLOCKY +SCHLUB +SCHLUBS +SCHLUMP +SCHLUMPED +SCHLUMPIER +SCHLUMPIEST +SCHLUMPING +SCHLUMPS +SCHLUMPY +SCHMALTZ +SCHMALTZES +SCHMALTZIER +SCHMALTZIEST +SCHMALTZY +SCHMALZ +SCHMALZES +SCHMALZIER +SCHMALZIEST +SCHMALZY +SCHMATTE +SCHMATTES +SCHMEAR +SCHMEARED +SCHMEARING +SCHMEARS +SCHMEER +SCHMEERED +SCHMEERING +SCHMEERS +SCHMELZE +SCHMELZES +SCHMO +SCHMOE +SCHMOES +SCHMOOS +SCHMOOSE +SCHMOOSED +SCHMOOSES +SCHMOOSING +SCHMOOZE +SCHMOOZED +SCHMOOZER +SCHMOOZERS +SCHMOOZES +SCHMOOZIER +SCHMOOZIEST +SCHMOOZING +SCHMOOZY +SCHMOS +SCHMUCK +SCHMUCKS +SCHNAPPER +SCHNAPPERS +SCHNAPPS +SCHNAPS +SCHNAUZER +SCHNAUZERS +SCHNECKE +SCHNECKEN +SCHNITZEL +SCHNITZELS +SCHNOOK +SCHNOOKS +SCHNORKEL +SCHNORKELED +SCHNORKELING +SCHNORKELS +SCHNORRER +SCHNORRERS +SCHNOZ +SCHNOZES +SCHNOZZ +SCHNOZZES +SCHNOZZLE +SCHNOZZLES +SCHOLAR +SCHOLARLY +SCHOLARS +SCHOLARSHIP +SCHOLARSHIPS +SCHOLASTIC +SCHOLASTICALLY +SCHOLASTICATE +SCHOLASTICATES +SCHOLASTICISM +SCHOLASTICISMS +SCHOLASTICS +SCHOLIA +SCHOLIAST +SCHOLIASTIC +SCHOLIASTS +SCHOLIUM +SCHOLIUMS +SCHOOL +SCHOOLBAG +SCHOOLBAGS +SCHOOLBOOK +SCHOOLBOOKS +SCHOOLBOY +SCHOOLBOYISH +SCHOOLBOYS +SCHOOLCHILD +SCHOOLCHILDREN +SCHOOLED +SCHOOLFELLOW +SCHOOLFELLOWS +SCHOOLGIRL +SCHOOLGIRLS +SCHOOLHOUSE +SCHOOLHOUSES +SCHOOLING +SCHOOLINGS +SCHOOLKID +SCHOOLKIDS +SCHOOLMAN +SCHOOLMARM +SCHOOLMARMISH +SCHOOLMARMS +SCHOOLMASTER +SCHOOLMASTERISH +SCHOOLMASTERLY +SCHOOLMASTERS +SCHOOLMATE +SCHOOLMATES +SCHOOLMEN +SCHOOLMISTRESS +SCHOOLROOM +SCHOOLROOMS +SCHOOLS +SCHOOLTEACHER +SCHOOLTEACHERS +SCHOOLTIME +SCHOOLTIMES +SCHOOLWORK +SCHOOLWORKS +SCHOONER +SCHOONERS +SCHORL +SCHORLS +SCHOTTISCHE +SCHOTTISCHES +SCHRIK +SCHRIKS +SCHROD +SCHRODS +SCHTICK +SCHTICKS +SCHTIK +SCHTIKS +SCHUIT +SCHUITS +SCHUL +SCHULN +SCHULS +SCHUSS +SCHUSSBOOMER +SCHUSSBOOMERS +SCHUSSED +SCHUSSER +SCHUSSERS +SCHUSSES +SCHUSSING +SCHVARTZE +SCHVARTZES +SCHWA +SCHWARMEREI +SCHWARMEREIS +SCHWARTZE +SCHWARTZES +SCHWAS +SCIAENID +SCIAENIDS +SCIAENOID +SCIAENOIDS +SCIAMACHIES +SCIAMACHY +SCIATIC +SCIATICA +SCIATICAS +SCIATICS +SCIENCE +SCIENCES +SCIENTIAL +SCIENTIFIC +SCIENTIFICALLY +SCIENTISM +SCIENTISMS +SCIENTIST +SCIENTISTS +SCIENTIZE +SCIENTIZED +SCIENTIZES +SCIENTIZING +SCILICET +SCILLA +SCILLAS +SCIMETAR +SCIMETARS +SCIMITAR +SCIMITARS +SCIMITER +SCIMITERS +SCINCOID +SCINCOIDS +SCINTIGRAPHIC +SCINTIGRAPHIES +SCINTIGRAPHY +SCINTILLA +SCINTILLAE +SCINTILLANT +SCINTILLANTLY +SCINTILLAS +SCINTILLATE +SCINTILLATED +SCINTILLATES +SCINTILLATING +SCINTILLATION +SCINTILLATIONS +SCINTILLATOR +SCINTILLATORS +SCINTILLOMETER +SCINTILLOMETERS +SCIOLISM +SCIOLISMS +SCIOLIST +SCIOLISTIC +SCIOLISTS +SCION +SCIONS +SCIROCCO +SCIROCCOS +SCIRRHI +SCIRRHOID +SCIRRHOUS +SCIRRHUS +SCIRRHUSES +SCISSILE +SCISSION +SCISSIONS +SCISSOR +SCISSORED +SCISSORING +SCISSORS +SCISSORTAIL +SCISSORTAILS +SCISSURE +SCISSURES +SCIURID +SCIURIDS +SCIURINE +SCIURINES +SCIUROID +SCLAFF +SCLAFFED +SCLAFFER +SCLAFFERS +SCLAFFING +SCLAFFS +SCLERA +SCLERAE +SCLERAL +SCLERAS +SCLEREID +SCLEREIDS +SCLERENCHYMA +SCLERENCHYMAS +SCLERITE +SCLERITES +SCLERITIC +SCLERITIS +SCLERITISES +SCLERODERMA +SCLERODERMAS +SCLERODERMATA +SCLEROID +SCLEROMA +SCLEROMAS +SCLEROMATA +SCLEROMETER +SCLEROMETERS +SCLEROPROTEIN +SCLEROPROTEINS +SCLEROSAL +SCLEROSE +SCLEROSED +SCLEROSES +SCLEROSING +SCLEROSIS +SCLEROTIA +SCLEROTIAL +SCLEROTIC +SCLEROTICS +SCLEROTIN +SCLEROTINS +SCLEROTIUM +SCLEROTIZATION +SCLEROTIZATIONS +SCLEROTIZED +SCLEROUS +SCOFF +SCOFFED +SCOFFER +SCOFFERS +SCOFFING +SCOFFLAW +SCOFFLAWS +SCOFFS +SCOLD +SCOLDED +SCOLDER +SCOLDERS +SCOLDING +SCOLDINGS +SCOLDS +SCOLECES +SCOLECITE +SCOLECITES +SCOLEX +SCOLICES +SCOLIOMA +SCOLIOMAS +SCOLIOSES +SCOLIOSIS +SCOLIOTIC +SCOLLOP +SCOLLOPED +SCOLLOPING +SCOLLOPS +SCOLOPENDRA +SCOLOPENDRAS +SCOMBRID +SCOMBRIDS +SCOMBROID +SCOMBROIDS +SCONCE +SCONCED +SCONCES +SCONCHEON +SCONCHEONS +SCONCING +SCONE +SCONES +SCOOCH +SCOOCHED +SCOOCHES +SCOOCHING +SCOOP +SCOOPABLE +SCOOPED +SCOOPER +SCOOPERS +SCOOPFUL +SCOOPFULS +SCOOPING +SCOOPS +SCOOPSFUL +SCOOT +SCOOTCH +SCOOTCHED +SCOOTCHES +SCOOTCHING +SCOOTED +SCOOTER +SCOOTERS +SCOOTING +SCOOTS +SCOP +SCOPE +SCOPED +SCOPES +SCOPING +SCOPOLAMINE +SCOPOLAMINES +SCOPS +SCOPULA +SCOPULAE +SCOPULAS +SCOPULATE +SCORBUTIC +SCORCH +SCORCHED +SCORCHER +SCORCHERS +SCORCHES +SCORCHING +SCORCHINGLY +SCORE +SCOREBOARD +SCOREBOARDS +SCORECARD +SCORECARDS +SCORED +SCOREKEEPER +SCOREKEEPERS +SCORELESS +SCOREPAD +SCOREPADS +SCORER +SCORERS +SCORES +SCORIA +SCORIACEOUS +SCORIAE +SCORIFIED +SCORIFIER +SCORIFIERS +SCORIFIES +SCORIFY +SCORIFYING +SCORING +SCORN +SCORNED +SCORNER +SCORNERS +SCORNFUL +SCORNFULLY +SCORNFULNESS +SCORNFULNESSES +SCORNING +SCORNS +SCORPAENID +SCORPAENIDS +SCORPIOID +SCORPION +SCORPIONS +SCOT +SCOTCH +SCOTCHED +SCOTCHES +SCOTCHING +SCOTER +SCOTERS +SCOTIA +SCOTIAS +SCOTOMA +SCOTOMAS +SCOTOMATA +SCOTOPHIL +SCOTOPIA +SCOTOPIAS +SCOTOPIC +SCOTS +SCOTTIE +SCOTTIES +SCOUNDREL +SCOUNDRELLY +SCOUNDRELS +SCOUR +SCOURED +SCOURER +SCOURERS +SCOURGE +SCOURGED +SCOURGER +SCOURGERS +SCOURGES +SCOURGING +SCOURING +SCOURINGS +SCOURS +SCOUSE +SCOUSES +SCOUT +SCOUTCRAFT +SCOUTCRAFTS +SCOUTED +SCOUTER +SCOUTERS +SCOUTH +SCOUTHER +SCOUTHERED +SCOUTHERING +SCOUTHERS +SCOUTHS +SCOUTING +SCOUTINGS +SCOUTMASTER +SCOUTMASTERS +SCOUTS +SCOW +SCOWDER +SCOWDERED +SCOWDERING +SCOWDERS +SCOWED +SCOWING +SCOWL +SCOWLED +SCOWLER +SCOWLERS +SCOWLING +SCOWLINGLY +SCOWLS +SCOWS +SCRABBLE +SCRABBLED +SCRABBLER +SCRABBLERS +SCRABBLES +SCRABBLIER +SCRABBLIEST +SCRABBLING +SCRABBLY +SCRAG +SCRAGGED +SCRAGGIER +SCRAGGIEST +SCRAGGILY +SCRAGGING +SCRAGGLIER +SCRAGGLIEST +SCRAGGLY +SCRAGGY +SCRAGS +SCRAICH +SCRAICHED +SCRAICHING +SCRAICHS +SCRAIGH +SCRAIGHED +SCRAIGHING +SCRAIGHS +SCRAM +SCRAMBLE +SCRAMBLED +SCRAMBLER +SCRAMBLERS +SCRAMBLES +SCRAMBLING +SCRAMJET +SCRAMJETS +SCRAMMED +SCRAMMING +SCRAMS +SCRANNEL +SCRANNELS +SCRAP +SCRAPBOOK +SCRAPBOOKS +SCRAPE +SCRAPED +SCRAPER +SCRAPERS +SCRAPES +SCRAPHEAP +SCRAPHEAPS +SCRAPIE +SCRAPIES +SCRAPING +SCRAPINGS +SCRAPPAGE +SCRAPPAGES +SCRAPPED +SCRAPPER +SCRAPPERS +SCRAPPIER +SCRAPPIEST +SCRAPPILY +SCRAPPINESS +SCRAPPINESSES +SCRAPPING +SCRAPPLE +SCRAPPLES +SCRAPPY +SCRAPS +SCRATCH +SCRATCHBOARD +SCRATCHBOARDS +SCRATCHED +SCRATCHER +SCRATCHERS +SCRATCHES +SCRATCHIER +SCRATCHIEST +SCRATCHILY +SCRATCHINESS +SCRATCHINESSES +SCRATCHING +SCRATCHY +SCRAWL +SCRAWLED +SCRAWLER +SCRAWLERS +SCRAWLIER +SCRAWLIEST +SCRAWLING +SCRAWLS +SCRAWLY +SCRAWNIER +SCRAWNIEST +SCRAWNINESS +SCRAWNINESSES +SCRAWNY +SCREAK +SCREAKED +SCREAKING +SCREAKS +SCREAKY +SCREAM +SCREAMED +SCREAMER +SCREAMERS +SCREAMING +SCREAMINGLY +SCREAMS +SCREE +SCREECH +SCREECHED +SCREECHER +SCREECHERS +SCREECHES +SCREECHIER +SCREECHIEST +SCREECHING +SCREECHY +SCREED +SCREEDED +SCREEDING +SCREEDS +SCREEN +SCREENABLE +SCREENED +SCREENER +SCREENERS +SCREENFUL +SCREENFULS +SCREENING +SCREENINGS +SCREENLAND +SCREENLANDS +SCREENPLAY +SCREENPLAYS +SCREENS +SCREENWRITER +SCREENWRITERS +SCREES +SCREW +SCREWABLE +SCREWBALL +SCREWBALLS +SCREWBEAN +SCREWBEANS +SCREWDRIVER +SCREWDRIVERS +SCREWED +SCREWER +SCREWERS +SCREWIER +SCREWIEST +SCREWINESS +SCREWINESSES +SCREWING +SCREWLIKE +SCREWS +SCREWUP +SCREWUPS +SCREWWORM +SCREWWORMS +SCREWY +SCRIBAL +SCRIBBLE +SCRIBBLED +SCRIBBLER +SCRIBBLERS +SCRIBBLES +SCRIBBLING +SCRIBBLY +SCRIBE +SCRIBED +SCRIBER +SCRIBERS +SCRIBES +SCRIBING +SCRIED +SCRIES +SCRIEVE +SCRIEVED +SCRIEVES +SCRIEVING +SCRIM +SCRIMMAGE +SCRIMMAGED +SCRIMMAGER +SCRIMMAGERS +SCRIMMAGES +SCRIMMAGING +SCRIMP +SCRIMPED +SCRIMPER +SCRIMPERS +SCRIMPIER +SCRIMPIEST +SCRIMPILY +SCRIMPING +SCRIMPIT +SCRIMPS +SCRIMPY +SCRIMS +SCRIMSHANDER +SCRIMSHANDERS +SCRIMSHAW +SCRIMSHAWED +SCRIMSHAWING +SCRIMSHAWS +SCRIP +SCRIPS +SCRIPT +SCRIPTED +SCRIPTER +SCRIPTERS +SCRIPTING +SCRIPTORIA +SCRIPTORIUM +SCRIPTS +SCRIPTURAL +SCRIPTURALLY +SCRIPTURE +SCRIPTURES +SCRIPTWRITER +SCRIPTWRITERS +SCRIVE +SCRIVED +SCRIVENER +SCRIVENERS +SCRIVES +SCRIVING +SCROD +SCRODS +SCROFULA +SCROFULAS +SCROFULOUS +SCROGGIER +SCROGGIEST +SCROGGY +SCROLL +SCROLLED +SCROLLING +SCROLLS +SCROLLWORK +SCROLLWORKS +SCROOCH +SCROOCHED +SCROOCHES +SCROOCHING +SCROOGE +SCROOGES +SCROOP +SCROOPED +SCROOPING +SCROOPS +SCROOTCH +SCROOTCHED +SCROOTCHES +SCROOTCHING +SCROTA +SCROTAL +SCROTUM +SCROTUMS +SCROUGE +SCROUGED +SCROUGES +SCROUGING +SCROUNGE +SCROUNGED +SCROUNGER +SCROUNGERS +SCROUNGES +SCROUNGIER +SCROUNGIEST +SCROUNGING +SCROUNGY +SCRUB +SCRUBBABLE +SCRUBBED +SCRUBBER +SCRUBBERS +SCRUBBIER +SCRUBBIEST +SCRUBBILY +SCRUBBING +SCRUBBY +SCRUBLAND +SCRUBLANDS +SCRUBS +SCRUBWOMAN +SCRUBWOMEN +SCRUFF +SCRUFFIER +SCRUFFIEST +SCRUFFILY +SCRUFFINESS +SCRUFFINESSES +SCRUFFS +SCRUFFY +SCRUM +SCRUMMAGE +SCRUMMAGED +SCRUMMAGES +SCRUMMAGING +SCRUMMED +SCRUMMING +SCRUMPTIOUS +SCRUMPTIOUSLY +SCRUMS +SCRUNCH +SCRUNCHED +SCRUNCHES +SCRUNCHIE +SCRUNCHIES +SCRUNCHING +SCRUNCHY +SCRUPLE +SCRUPLED +SCRUPLES +SCRUPLING +SCRUPULOSITIES +SCRUPULOSITY +SCRUPULOUS +SCRUPULOUSLY +SCRUPULOUSNESS +SCRUTABLE +SCRUTINEER +SCRUTINEERS +SCRUTINIES +SCRUTINISE +SCRUTINISED +SCRUTINISES +SCRUTINISING +SCRUTINIZE +SCRUTINIZED +SCRUTINIZER +SCRUTINIZERS +SCRUTINIZES +SCRUTINIZING +SCRUTINY +SCRY +SCRYING +SCUBA +SCUBAED +SCUBAING +SCUBAS +SCUD +SCUDDED +SCUDDING +SCUDI +SCUDO +SCUDS +SCUFF +SCUFFED +SCUFFER +SCUFFERS +SCUFFING +SCUFFLE +SCUFFLED +SCUFFLER +SCUFFLERS +SCUFFLES +SCUFFLING +SCUFFS +SCULCH +SCULCHES +SCULK +SCULKED +SCULKER +SCULKERS +SCULKING +SCULKS +SCULL +SCULLED +SCULLER +SCULLERIES +SCULLERS +SCULLERY +SCULLING +SCULLION +SCULLIONS +SCULLS +SCULP +SCULPED +SCULPIN +SCULPING +SCULPINS +SCULPS +SCULPT +SCULPTED +SCULPTING +SCULPTOR +SCULPTORS +SCULPTRESS +SCULPTRESSES +SCULPTS +SCULPTURAL +SCULPTURALLY +SCULPTURE +SCULPTURED +SCULPTURES +SCULPTURESQUE +SCULPTURESQUELY +SCULPTURING +SCULTCH +SCULTCHES +SCUM +SCUMBAG +SCUMBAGS +SCUMBLE +SCUMBLED +SCUMBLES +SCUMBLING +SCUMLESS +SCUMLIKE +SCUMMED +SCUMMER +SCUMMERS +SCUMMIER +SCUMMIEST +SCUMMILY +SCUMMING +SCUMMY +SCUMS +SCUNCHEON +SCUNCHEONS +SCUNGILLI +SCUNGILLIS +SCUNNER +SCUNNERED +SCUNNERING +SCUNNERS +SCUP +SCUPPAUG +SCUPPAUGS +SCUPPER +SCUPPERED +SCUPPERING +SCUPPERNONG +SCUPPERNONGS +SCUPPERS +SCUPS +SCURF +SCURFIER +SCURFIEST +SCURFS +SCURFY +SCURRIED +SCURRIES +SCURRIL +SCURRILE +SCURRILITIES +SCURRILITY +SCURRILOUS +SCURRILOUSLY +SCURRILOUSNESS +SCURRY +SCURRYING +SCURVIER +SCURVIES +SCURVIEST +SCURVILY +SCURVINESS +SCURVINESSES +SCURVY +SCUT +SCUTA +SCUTAGE +SCUTAGES +SCUTATE +SCUTCH +SCUTCHED +SCUTCHEON +SCUTCHEONS +SCUTCHER +SCUTCHERS +SCUTCHES +SCUTCHING +SCUTE +SCUTELLA +SCUTELLAR +SCUTELLATE +SCUTELLATED +SCUTELLUM +SCUTES +SCUTIFORM +SCUTS +SCUTTER +SCUTTERED +SCUTTERING +SCUTTERS +SCUTTLE +SCUTTLEBUTT +SCUTTLEBUTTS +SCUTTLED +SCUTTLES +SCUTTLING +SCUTUM +SCUTWORK +SCUTWORKS +SCUZZ +SCUZZBALL +SCUZZBALLS +SCUZZES +SCUZZIER +SCUZZIEST +SCUZZY +SCYPHATE +SCYPHI +SCYPHISTOMA +SCYPHISTOMAE +SCYPHISTOMAS +SCYPHOZOAN +SCYPHOZOANS +SCYPHUS +SCYTHE +SCYTHED +SCYTHES +SCYTHING +SEA +SEABAG +SEABAGS +SEABEACH +SEABEACHES +SEABED +SEABEDS +SEABIRD +SEABIRDS +SEABOARD +SEABOARDS +SEABOOT +SEABOOTS +SEABORGIUM +SEABORGIUMS +SEABORNE +SEACOAST +SEACOASTS +SEACOCK +SEACOCKS +SEACRAFT +SEACRAFTS +SEADOG +SEADOGS +SEADROME +SEADROMES +SEAFARER +SEAFARERS +SEAFARING +SEAFARINGS +SEAFLOOR +SEAFLOORS +SEAFOOD +SEAFOODS +SEAFOWL +SEAFOWLS +SEAFRONT +SEAFRONTS +SEAGIRT +SEAGOING +SEAGULL +SEAGULLS +SEAHORSE +SEAHORSES +SEAL +SEALABLE +SEALANT +SEALANTS +SEALED +SEALER +SEALERIES +SEALERS +SEALERY +SEALIFT +SEALIFTED +SEALIFTING +SEALIFTS +SEALING +SEALLIKE +SEALS +SEALSKIN +SEALSKINS +SEAM +SEAMAN +SEAMANLIKE +SEAMANLY +SEAMANSHIP +SEAMANSHIPS +SEAMARK +SEAMARKS +SEAMED +SEAMEN +SEAMER +SEAMERS +SEAMIER +SEAMIEST +SEAMINESS +SEAMINESSES +SEAMING +SEAMLESS +SEAMLESSLY +SEAMLESSNESS +SEAMLESSNESSES +SEAMLIKE +SEAMOUNT +SEAMOUNTS +SEAMS +SEAMSTER +SEAMSTERS +SEAMSTRESS +SEAMSTRESSES +SEAMY +SEANCE +SEANCES +SEAPIECE +SEAPIECES +SEAPLANE +SEAPLANES +SEAPORT +SEAPORTS +SEAQUAKE +SEAQUAKES +SEAR +SEARCH +SEARCHABLE +SEARCHED +SEARCHER +SEARCHERS +SEARCHES +SEARCHING +SEARCHINGLY +SEARCHLESS +SEARCHLIGHT +SEARCHLIGHTS +SEARED +SEARER +SEAREST +SEARING +SEARINGLY +SEAROBIN +SEAROBINS +SEARS +SEAS +SEASCAPE +SEASCAPES +SEASCOUT +SEASCOUTS +SEASHELL +SEASHELLS +SEASHORE +SEASHORES +SEASICK +SEASICKNESS +SEASICKNESSES +SEASIDE +SEASIDES +SEASON +SEASONABLE +SEASONABLENESS +SEASONABLY +SEASONAL +SEASONALITIES +SEASONALITY +SEASONALLY +SEASONALS +SEASONED +SEASONER +SEASONERS +SEASONING +SEASONINGS +SEASONLESS +SEASONS +SEASTRAND +SEASTRANDS +SEAT +SEATBACK +SEATBACKS +SEATBELT +SEATBELTS +SEATED +SEATER +SEATERS +SEATING +SEATINGS +SEATLESS +SEATMATE +SEATMATES +SEATRAIN +SEATRAINS +SEATROUT +SEATROUTS +SEATS +SEATWORK +SEATWORKS +SEAWALL +SEAWALLS +SEAWAN +SEAWANS +SEAWANT +SEAWANTS +SEAWARD +SEAWARDS +SEAWARE +SEAWARES +SEAWATER +SEAWATERS +SEAWAY +SEAWAYS +SEAWEED +SEAWEEDS +SEAWORTHIER +SEAWORTHIEST +SEAWORTHINESS +SEAWORTHINESSES +SEAWORTHY +SEBACEOUS +SEBACIC +SEBASIC +SEBORRHEA +SEBORRHEAS +SEBORRHEIC +SEBUM +SEBUMS +SEC +SECALOSE +SECALOSES +SECANT +SECANTLY +SECANTS +SECATEUR +SECATEURS +SECCO +SECCOS +SECEDE +SECEDED +SECEDER +SECEDERS +SECEDES +SECEDING +SECERN +SECERNED +SECERNING +SECERNS +SECESSION +SECESSIONISM +SECESSIONISMS +SECESSIONIST +SECESSIONISTS +SECESSIONS +SECLUDE +SECLUDED +SECLUDEDLY +SECLUDEDNESS +SECLUDEDNESSES +SECLUDES +SECLUDING +SECLUSION +SECLUSIONS +SECLUSIVE +SECLUSIVELY +SECLUSIVENESS +SECLUSIVENESSES +SECOBARBITAL +SECOBARBITALS +SECONAL +SECONALS +SECOND +SECONDARIES +SECONDARILY +SECONDARINESS +SECONDARINESSES +SECONDARY +SECONDE +SECONDED +SECONDER +SECONDERS +SECONDES +SECONDHAND +SECONDI +SECONDING +SECONDLY +SECONDO +SECONDS +SECPAR +SECPARS +SECRECIES +SECRECY +SECRET +SECRETAGOGUE +SECRETAGOGUES +SECRETARIAL +SECRETARIAT +SECRETARIATS +SECRETARIES +SECRETARY +SECRETARYSHIP +SECRETARYSHIPS +SECRETE +SECRETED +SECRETER +SECRETES +SECRETEST +SECRETIN +SECRETING +SECRETINS +SECRETION +SECRETIONARY +SECRETIONS +SECRETIVE +SECRETIVELY +SECRETIVENESS +SECRETIVENESSES +SECRETLY +SECRETOR +SECRETORIES +SECRETORS +SECRETORY +SECRETS +SECS +SECT +SECTARIAN +SECTARIANISM +SECTARIANISMS +SECTARIANIZE +SECTARIANIZED +SECTARIANIZES +SECTARIANIZING +SECTARIANS +SECTARIES +SECTARY +SECTILE +SECTILITIES +SECTILITY +SECTION +SECTIONAL +SECTIONALISM +SECTIONALISMS +SECTIONALLY +SECTIONALS +SECTIONED +SECTIONING +SECTIONS +SECTOR +SECTORAL +SECTORED +SECTORIAL +SECTORIALS +SECTORING +SECTORS +SECTS +SECULAR +SECULARISE +SECULARISED +SECULARISES +SECULARISING +SECULARISM +SECULARISMS +SECULARIST +SECULARISTIC +SECULARISTS +SECULARITIES +SECULARITY +SECULARIZATION +SECULARIZATIONS +SECULARIZE +SECULARIZED +SECULARIZER +SECULARIZERS +SECULARIZES +SECULARIZING +SECULARLY +SECULARS +SECUND +SECUNDLY +SECUNDUM +SECURABLE +SECURANCE +SECURANCES +SECURE +SECURED +SECURELY +SECUREMENT +SECUREMENTS +SECURENESS +SECURENESSES +SECURER +SECURERS +SECURES +SECUREST +SECURING +SECURITIES +SECURITIZATION +SECURITIZATIONS +SECURITIZE +SECURITIZED +SECURITIZES +SECURITIZING +SECURITY +SEDAN +SEDANS +SEDARIM +SEDATE +SEDATED +SEDATELY +SEDATENESS +SEDATENESSES +SEDATER +SEDATES +SEDATEST +SEDATING +SEDATION +SEDATIONS +SEDATIVE +SEDATIVES +SEDENTARY +SEDER +SEDERS +SEDERUNT +SEDERUNTS +SEDGE +SEDGES +SEDGIER +SEDGIEST +SEDGY +SEDILE +SEDILIA +SEDILIUM +SEDIMENT +SEDIMENTABLE +SEDIMENTARY +SEDIMENTATION +SEDIMENTATIONS +SEDIMENTED +SEDIMENTING +SEDIMENTOLOGIC +SEDIMENTOLOGIES +SEDIMENTOLOGIST +SEDIMENTOLOGY +SEDIMENTS +SEDITION +SEDITIONS +SEDITIOUS +SEDITIOUSLY +SEDITIOUSNESS +SEDITIOUSNESSES +SEDUCE +SEDUCED +SEDUCEMENT +SEDUCEMENTS +SEDUCER +SEDUCERS +SEDUCES +SEDUCIBLE +SEDUCING +SEDUCIVE +SEDUCTION +SEDUCTIONS +SEDUCTIVE +SEDUCTIVELY +SEDUCTIVENESS +SEDUCTIVENESSES +SEDUCTRESS +SEDUCTRESSES +SEDULITIES +SEDULITY +SEDULOUS +SEDULOUSLY +SEDULOUSNESS +SEDULOUSNESSES +SEDUM +SEDUMS +SEE +SEEABLE +SEECATCH +SEECATCHIE +SEED +SEEDBED +SEEDBEDS +SEEDCAKE +SEEDCAKES +SEEDCASE +SEEDCASES +SEEDEATER +SEEDEATERS +SEEDED +SEEDER +SEEDERS +SEEDIER +SEEDIEST +SEEDILY +SEEDINESS +SEEDINESSES +SEEDING +SEEDLESS +SEEDLIKE +SEEDLING +SEEDLINGS +SEEDMAN +SEEDMEN +SEEDPOD +SEEDPODS +SEEDS +SEEDSMAN +SEEDSMEN +SEEDSTOCK +SEEDSTOCKS +SEEDTIME +SEEDTIMES +SEEDY +SEEING +SEEINGS +SEEK +SEEKER +SEEKERS +SEEKING +SEEKS +SEEL +SEELED +SEELING +SEELS +SEELY +SEEM +SEEMED +SEEMER +SEEMERS +SEEMING +SEEMINGLY +SEEMINGS +SEEMLIER +SEEMLIEST +SEEMLINESS +SEEMLINESSES +SEEMLY +SEEMS +SEEN +SEEP +SEEPAGE +SEEPAGES +SEEPED +SEEPIER +SEEPIEST +SEEPING +SEEPS +SEEPY +SEER +SEERESS +SEERESSES +SEERS +SEERSUCKER +SEERSUCKERS +SEES +SEESAW +SEESAWED +SEESAWING +SEESAWS +SEETHE +SEETHED +SEETHES +SEETHING +SEG +SEGETAL +SEGGAR +SEGGARS +SEGMENT +SEGMENTAL +SEGMENTALLY +SEGMENTARY +SEGMENTATION +SEGMENTATIONS +SEGMENTED +SEGMENTING +SEGMENTS +SEGNI +SEGNO +SEGNOS +SEGO +SEGOS +SEGREGANT +SEGREGANTS +SEGREGATE +SEGREGATED +SEGREGATES +SEGREGATING +SEGREGATION +SEGREGATIONIST +SEGREGATIONISTS +SEGREGATIONS +SEGREGATIVE +SEGS +SEGUE +SEGUED +SEGUEING +SEGUES +SEGUIDILLA +SEGUIDILLAS +SEI +SEICENTO +SEICENTOS +SEICHE +SEICHES +SEIDEL +SEIDELS +SEIF +SEIFS +SEIGNEUR +SEIGNEURIAL +SEIGNEURIES +SEIGNEURS +SEIGNEURY +SEIGNIOR +SEIGNIORAGE +SEIGNIORAGES +SEIGNIORIES +SEIGNIORS +SEIGNIORY +SEIGNORAGE +SEIGNORAGES +SEIGNORIAL +SEIGNORIES +SEIGNORY +SEINE +SEINED +SEINER +SEINERS +SEINES +SEINING +SEIS +SEISABLE +SEISE +SEISED +SEISER +SEISERS +SEISES +SEISIN +SEISING +SEISINGS +SEISINS +SEISM +SEISMAL +SEISMIC +SEISMICAL +SEISMICALLY +SEISMICITIES +SEISMICITY +SEISMISM +SEISMISMS +SEISMOGRAM +SEISMOGRAMS +SEISMOGRAPH +SEISMOGRAPHER +SEISMOGRAPHERS +SEISMOGRAPHIC +SEISMOGRAPHIES +SEISMOGRAPHS +SEISMOGRAPHY +SEISMOLOGICAL +SEISMOLOGIES +SEISMOLOGIST +SEISMOLOGISTS +SEISMOLOGY +SEISMOMETER +SEISMOMETERS +SEISMOMETRIC +SEISMOMETRIES +SEISMOMETRY +SEISMS +SEISOR +SEISORS +SEISURE +SEISURES +SEITAN +SEITANS +SEIZABLE +SEIZE +SEIZED +SEIZER +SEIZERS +SEIZES +SEIZIN +SEIZING +SEIZINGS +SEIZINS +SEIZOR +SEIZORS +SEIZURE +SEIZURES +SEJANT +SEJEANT +SEL +SELACHIAN +SELACHIANS +SELADANG +SELADANGS +SELAGINELLA +SELAGINELLAS +SELAH +SELAHS +SELAMLIK +SELAMLIKS +SELCOUTH +SELDOM +SELDOMLY +SELECT +SELECTABLE +SELECTED +SELECTEE +SELECTEES +SELECTING +SELECTION +SELECTIONIST +SELECTIONISTS +SELECTIONS +SELECTIVE +SELECTIVELY +SELECTIVENESS +SELECTIVENESSES +SELECTIVITIES +SELECTIVITY +SELECTLY +SELECTMAN +SELECTMEN +SELECTNESS +SELECTNESSES +SELECTOR +SELECTORS +SELECTS +SELENATE +SELENATES +SELENIC +SELENIDE +SELENIDES +SELENIFEROUS +SELENIOUS +SELENITE +SELENITES +SELENITIC +SELENIUM +SELENIUMS +SELENOCENTRIC +SELENOLOGICAL +SELENOLOGIES +SELENOLOGIST +SELENOLOGISTS +SELENOLOGY +SELENOSES +SELENOSIS +SELENOUS +SELF +SELFDOM +SELFDOMS +SELFED +SELFHEAL +SELFHEALS +SELFHOOD +SELFHOODS +SELFING +SELFISH +SELFISHLY +SELFISHNESS +SELFISHNESSES +SELFLESS +SELFLESSLY +SELFLESSNESS +SELFLESSNESSES +SELFNESS +SELFNESSES +SELFS +SELFSAME +SELFSAMENESS +SELFSAMENESSES +SELFWARD +SELFWARDS +SELKIE +SELKIES +SELL +SELLABLE +SELLE +SELLER +SELLERS +SELLES +SELLING +SELLOFF +SELLOFFS +SELLOTAPE +SELLOTAPED +SELLOTAPES +SELLOTAPING +SELLOUT +SELLOUTS +SELLS +SELS +SELSYN +SELSYNS +SELTZER +SELTZERS +SELVA +SELVAGE +SELVAGED +SELVAGES +SELVAS +SELVEDGE +SELVEDGED +SELVEDGES +SELVES +SEMAINIER +SEMAINIERS +SEMANTEME +SEMANTEMES +SEMANTIC +SEMANTICAL +SEMANTICALLY +SEMANTICIST +SEMANTICISTS +SEMANTICS +SEMAPHORE +SEMAPHORED +SEMAPHORES +SEMAPHORING +SEMASIOLOGICAL +SEMASIOLOGIES +SEMASIOLOGY +SEMATIC +SEMBLABLE +SEMBLABLES +SEMBLABLY +SEMBLANCE +SEMBLANCES +SEME +SEMEIOLOGIES +SEMEIOLOGY +SEMEIOTIC +SEMEIOTICS +SEMEME +SEMEMES +SEMEMIC +SEMEN +SEMENS +SEMES +SEMESTER +SEMESTERS +SEMESTRAL +SEMESTRIAL +SEMI +SEMIABSTRACT +SEMIABSTRACTION +SEMIANGLE +SEMIANGLES +SEMIANNUAL +SEMIANNUALLY +SEMIAQUATIC +SEMIARBOREAL +SEMIARID +SEMIARIDITIES +SEMIARIDITY +SEMIAUTOMATIC +SEMIAUTOMATICS +SEMIAUTONOMOUS +SEMIBALD +SEMIBREVE +SEMIBREVES +SEMICENTENNIAL +SEMICENTENNIALS +SEMICIRCLE +SEMICIRCLES +SEMICIRCULAR +SEMICIVILIZED +SEMICLASSIC +SEMICLASSICAL +SEMICLASSICS +SEMICOLON +SEMICOLONIAL +SEMICOLONIALISM +SEMICOLONIES +SEMICOLONS +SEMICOLONY +SEMICOMA +SEMICOMAS +SEMICOMMERCIAL +SEMICONDUCTING +SEMICONDUCTOR +SEMICONDUCTORS +SEMICONSCIOUS +SEMICRYSTALLINE +SEMICURED +SEMICYLINDRICAL +SEMIDARKNESS +SEMIDARKNESSES +SEMIDEAF +SEMIDEIFIED +SEMIDEIFIES +SEMIDEIFY +SEMIDEIFYING +SEMIDESERT +SEMIDESERTS +SEMIDETACHED +SEMIDIAMETER +SEMIDIAMETERS +SEMIDIURNAL +SEMIDIVINE +SEMIDOCUMENTARY +SEMIDOME +SEMIDOMED +SEMIDOMES +SEMIDOMINANT +SEMIDRY +SEMIDRYING +SEMIDWARF +SEMIDWARFS +SEMIDWARVES +SEMIEMPIRICAL +SEMIERECT +SEMIEVERGREEN +SEMIFEUDAL +SEMIFINAL +SEMIFINALIST +SEMIFINALISTS +SEMIFINALS +SEMIFINISHED +SEMIFIT +SEMIFITTED +SEMIFLEXIBLE +SEMIFLUID +SEMIFLUIDS +SEMIFORMAL +SEMIGALA +SEMIGLOSS +SEMIGLOSSES +SEMIGROUP +SEMIGROUPS +SEMIHARD +SEMIHIGH +SEMIHOBO +SEMIHOBOES +SEMIHOBOS +SEMILEGENDARY +SEMILETHAL +SEMILETHALS +SEMILIQUID +SEMILIQUIDS +SEMILITERATE +SEMILITERATES +SEMILLON +SEMILLONS +SEMILOG +SEMILOGARITHMIC +SEMILUNAR +SEMILUSTROUS +SEMIMAT +SEMIMATT +SEMIMATTE +SEMIMETAL +SEMIMETALLIC +SEMIMETALS +SEMIMICRO +SEMIMILD +SEMIMOIST +SEMIMONASTIC +SEMIMONTHLIES +SEMIMONTHLY +SEMIMUTE +SEMIMYSTICAL +SEMINA +SEMINAL +SEMINALLY +SEMINAR +SEMINARIAN +SEMINARIANS +SEMINARIES +SEMINARIST +SEMINARISTS +SEMINARS +SEMINARY +SEMINATURAL +SEMINIFEROUS +SEMINOMA +SEMINOMAD +SEMINOMADIC +SEMINOMADS +SEMINOMAS +SEMINOMATA +SEMINUDE +SEMINUDITIES +SEMINUDITY +SEMIOFFICIAL +SEMIOFFICIALLY +SEMIOLOGICAL +SEMIOLOGICALLY +SEMIOLOGIES +SEMIOLOGIST +SEMIOLOGISTS +SEMIOLOGY +SEMIOPAQUE +SEMIOPEN +SEMIOSES +SEMIOSIS +SEMIOTIC +SEMIOTICIAN +SEMIOTICIANS +SEMIOTICIST +SEMIOTICISTS +SEMIOTICS +SEMIOVAL +SEMIPALMATED +SEMIPARASITE +SEMIPARASITES +SEMIPARASITIC +SEMIPERMANENT +SEMIPERMEABLE +SEMIPIOUS +SEMIPOLITICAL +SEMIPOPULAR +SEMIPORCELAIN +SEMIPORCELAINS +SEMIPORNOGRAPHY +SEMIPOSTAL +SEMIPOSTALS +SEMIPRECIOUS +SEMIPRIVATE +SEMIPRO +SEMIPROS +SEMIPUBLIC +SEMIQUAVER +SEMIQUAVERS +SEMIRAW +SEMIRELIGIOUS +SEMIRETIRED +SEMIRETIREMENT +SEMIRETIREMENTS +SEMIRIGID +SEMIROUND +SEMIROUNDS +SEMIRURAL +SEMIS +SEMISACRED +SEMISECRET +SEMISEDENTARY +SEMISES +SEMISHRUBBY +SEMISKILLED +SEMISOFT +SEMISOLID +SEMISOLIDS +SEMISTIFF +SEMISUBMERSIBLE +SEMISWEET +SEMISYNTHETIC +SEMITERRESTRIAL +SEMITIST +SEMITISTS +SEMITONAL +SEMITONALLY +SEMITONE +SEMITONES +SEMITONIC +SEMITONICALLY +SEMITRAILER +SEMITRAILERS +SEMITRANSLUCENT +SEMITRANSPARENT +SEMITROPIC +SEMITROPICAL +SEMITROPICS +SEMITRUCK +SEMITRUCKS +SEMIURBAN +SEMIVOWEL +SEMIVOWELS +SEMIWEEKLIES +SEMIWEEKLY +SEMIWILD +SEMIWORKS +SEMIYEARLY +SEMOLINA +SEMOLINAS +SEMPERVIVUM +SEMPERVIVUMS +SEMPITERNAL +SEMPITERNALLY +SEMPITERNITIES +SEMPITERNITY +SEMPLE +SEMPLICE +SEMPRE +SEMPSTRESS +SEMPSTRESSES +SEN +SENARII +SENARIUS +SENARY +SENATE +SENATES +SENATOR +SENATORIAL +SENATORIAN +SENATORS +SENATORSHIP +SENATORSHIPS +SEND +SENDABLE +SENDAL +SENDALS +SENDED +SENDER +SENDERS +SENDING +SENDOFF +SENDOFFS +SENDS +SENDUP +SENDUPS +SENE +SENECA +SENECAS +SENECIO +SENECIOS +SENECTITUDE +SENECTITUDES +SENEGA +SENEGAS +SENESCENCE +SENESCENCES +SENESCENT +SENESCHAL +SENESCHALS +SENGI +SENHOR +SENHORA +SENHORAS +SENHORES +SENHORITA +SENHORITAS +SENHORS +SENILE +SENILELY +SENILES +SENILITIES +SENILITY +SENIOR +SENIORITIES +SENIORITY +SENIORS +SENITI +SENNA +SENNACHIE +SENNACHIES +SENNAS +SENNET +SENNETS +SENNIGHT +SENNIGHTS +SENNIT +SENNITS +SENOPIA +SENOPIAS +SENOR +SENORA +SENORAS +SENORES +SENORITA +SENORITAS +SENORS +SENRYU +SENSA +SENSATE +SENSATED +SENSATELY +SENSATES +SENSATING +SENSATION +SENSATIONAL +SENSATIONALISE +SENSATIONALISED +SENSATIONALISES +SENSATIONALISM +SENSATIONALISMS +SENSATIONALIST +SENSATIONALISTS +SENSATIONALIZE +SENSATIONALIZED +SENSATIONALIZES +SENSATIONALLY +SENSATIONS +SENSE +SENSED +SENSEFUL +SENSEI +SENSEIS +SENSELESS +SENSELESSLY +SENSELESSNESS +SENSELESSNESSES +SENSES +SENSIBILIA +SENSIBILITIES +SENSIBILITY +SENSIBLE +SENSIBLENESS +SENSIBLENESSES +SENSIBLER +SENSIBLES +SENSIBLEST +SENSIBLY +SENSILLA +SENSILLAE +SENSILLUM +SENSING +SENSITISATION +SENSITISATIONS +SENSITISE +SENSITISED +SENSITISES +SENSITISING +SENSITIVE +SENSITIVELY +SENSITIVENESS +SENSITIVENESSES +SENSITIVES +SENSITIVITIES +SENSITIVITY +SENSITIZATION +SENSITIZATIONS +SENSITIZE +SENSITIZED +SENSITIZER +SENSITIZERS +SENSITIZES +SENSITIZING +SENSITOMETER +SENSITOMETERS +SENSITOMETRIC +SENSITOMETRIES +SENSITOMETRY +SENSOR +SENSORIA +SENSORIAL +SENSORIALLY +SENSORIMOTOR +SENSORINEURAL +SENSORIUM +SENSORIUMS +SENSORS +SENSORY +SENSUAL +SENSUALISM +SENSUALISMS +SENSUALIST +SENSUALISTIC +SENSUALISTS +SENSUALITIES +SENSUALITY +SENSUALIZATION +SENSUALIZATIONS +SENSUALIZE +SENSUALIZED +SENSUALIZES +SENSUALIZING +SENSUALLY +SENSUM +SENSUOSITIES +SENSUOSITY +SENSUOUS +SENSUOUSLY +SENSUOUSNESS +SENSUOUSNESSES +SENT +SENTE +SENTENCE +SENTENCED +SENTENCER +SENTENCERS +SENTENCES +SENTENCING +SENTENTIA +SENTENTIAE +SENTENTIAL +SENTENTIOUS +SENTENTIOUSLY +SENTENTIOUSNESS +SENTI +SENTIENCE +SENTIENCES +SENTIENCIES +SENTIENCY +SENTIENT +SENTIENTLY +SENTIENTS +SENTIMENT +SENTIMENTAL +SENTIMENTALISE +SENTIMENTALISED +SENTIMENTALISES +SENTIMENTALISM +SENTIMENTALISMS +SENTIMENTALIST +SENTIMENTALISTS +SENTIMENTALITY +SENTIMENTALIZE +SENTIMENTALIZED +SENTIMENTALIZES +SENTIMENTALLY +SENTIMENTS +SENTIMO +SENTIMOS +SENTINEL +SENTINELED +SENTINELING +SENTINELLED +SENTINELLING +SENTINELS +SENTRIES +SENTRY +SEPAL +SEPALED +SEPALINE +SEPALLED +SEPALOID +SEPALOUS +SEPALS +SEPARABILITIES +SEPARABILITY +SEPARABLE +SEPARABLENESS +SEPARABLENESSES +SEPARABLY +SEPARATE +SEPARATED +SEPARATELY +SEPARATENESS +SEPARATENESSES +SEPARATES +SEPARATING +SEPARATION +SEPARATIONIST +SEPARATIONISTS +SEPARATIONS +SEPARATISM +SEPARATISMS +SEPARATIST +SEPARATISTIC +SEPARATISTS +SEPARATIVE +SEPARATOR +SEPARATORS +SEPIA +SEPIAS +SEPIC +SEPIOLITE +SEPIOLITES +SEPOY +SEPOYS +SEPPUKU +SEPPUKUS +SEPSES +SEPSIS +SEPT +SEPTA +SEPTAGE +SEPTAGES +SEPTAL +SEPTARIA +SEPTARIAN +SEPTARIUM +SEPTATE +SEPTENARIES +SEPTENARII +SEPTENARIUS +SEPTENARY +SEPTENDECILLION +SEPTENNIAL +SEPTENNIALLY +SEPTENTRION +SEPTENTRIONAL +SEPTENTRIONS +SEPTET +SEPTETS +SEPTETTE +SEPTETTES +SEPTIC +SEPTICAL +SEPTICEMIA +SEPTICEMIAS +SEPTICEMIC +SEPTICIDAL +SEPTICITIES +SEPTICITY +SEPTICS +SEPTILLION +SEPTILLIONS +SEPTIME +SEPTIMES +SEPTS +SEPTUAGENARIAN +SEPTUAGENARIANS +SEPTUM +SEPTUMS +SEPTUPLE +SEPTUPLED +SEPTUPLES +SEPTUPLET +SEPTUPLETS +SEPTUPLING +SEPULCHER +SEPULCHERED +SEPULCHERING +SEPULCHERS +SEPULCHRAL +SEPULCHRALLY +SEPULCHRE +SEPULCHRED +SEPULCHRES +SEPULCHRING +SEPULTURE +SEPULTURES +SEQUACIOUS +SEQUACIOUSLY +SEQUACITIES +SEQUACITY +SEQUEL +SEQUELA +SEQUELAE +SEQUELIZE +SEQUELIZED +SEQUELIZES +SEQUELIZING +SEQUELS +SEQUENCE +SEQUENCED +SEQUENCER +SEQUENCERS +SEQUENCES +SEQUENCIES +SEQUENCING +SEQUENCY +SEQUENT +SEQUENTIAL +SEQUENTIALLY +SEQUENTS +SEQUESTER +SEQUESTERED +SEQUESTERING +SEQUESTERS +SEQUESTRA +SEQUESTRATE +SEQUESTRATED +SEQUESTRATES +SEQUESTRATING +SEQUESTRATION +SEQUESTRATIONS +SEQUESTRUM +SEQUESTRUMS +SEQUIN +SEQUINED +SEQUINING +SEQUINNED +SEQUINS +SEQUITUR +SEQUITURS +SEQUOIA +SEQUOIAS +SER +SERA +SERAC +SERACS +SERAGLIO +SERAGLIOS +SERAI +SERAIL +SERAILS +SERAIS +SERAL +SERAPE +SERAPES +SERAPH +SERAPHIC +SERAPHICALLY +SERAPHIM +SERAPHIMS +SERAPHIN +SERAPHS +SERDAB +SERDABS +SERE +SERED +SEREIN +SEREINS +SERENADE +SERENADED +SERENADER +SERENADERS +SERENADES +SERENADING +SERENATA +SERENATAS +SERENATE +SERENDIPITIES +SERENDIPITOUS +SERENDIPITOUSLY +SERENDIPITY +SERENE +SERENELY +SERENENESS +SERENENESSES +SERENER +SERENES +SERENEST +SERENITIES +SERENITY +SERER +SERES +SEREST +SERF +SERFAGE +SERFAGES +SERFDOM +SERFDOMS +SERFHOOD +SERFHOODS +SERFISH +SERFLIKE +SERFS +SERGE +SERGEANCIES +SERGEANCY +SERGEANT +SERGEANTIES +SERGEANTS +SERGEANTY +SERGED +SERGER +SERGERS +SERGES +SERGING +SERGINGS +SERIAL +SERIALISE +SERIALISED +SERIALISES +SERIALISING +SERIALISM +SERIALISMS +SERIALIST +SERIALISTS +SERIALIZATION +SERIALIZATIONS +SERIALIZE +SERIALIZED +SERIALIZES +SERIALIZING +SERIALLY +SERIALS +SERIATE +SERIATED +SERIATELY +SERIATES +SERIATIM +SERIATING +SERIATION +SERIATIONS +SERICEOUS +SERICIN +SERICINS +SERICULTURAL +SERICULTURE +SERICULTURES +SERICULTURIST +SERICULTURISTS +SERIEMA +SERIEMAS +SERIES +SERIF +SERIFED +SERIFFED +SERIFS +SERIGRAPH +SERIGRAPHER +SERIGRAPHERS +SERIGRAPHIES +SERIGRAPHS +SERIGRAPHY +SERIN +SERINE +SERINES +SERING +SERINGA +SERINGAS +SERINS +SERIOCOMIC +SERIOCOMICALLY +SERIOUS +SERIOUSLY +SERIOUSNESS +SERIOUSNESSES +SERJEANT +SERJEANTIES +SERJEANTS +SERJEANTY +SERMON +SERMONETTE +SERMONETTES +SERMONIC +SERMONIZE +SERMONIZED +SERMONIZER +SERMONIZERS +SERMONIZES +SERMONIZING +SERMONS +SEROCONVERSION +SEROCONVERSIONS +SERODIAGNOSES +SERODIAGNOSIS +SERODIAGNOSTIC +SEROLOGIC +SEROLOGICAL +SEROLOGICALLY +SEROLOGIES +SEROLOGIST +SEROLOGISTS +SEROLOGY +SERONEGATIVE +SERONEGATIVITY +SEROPOSITIVE +SEROPOSITIVITY +SEROPURULENT +SEROSA +SEROSAE +SEROSAL +SEROSAS +SEROSITIES +SEROSITY +SEROTINAL +SEROTINE +SEROTINES +SEROTINIES +SEROTINOUS +SEROTINY +SEROTONERGIC +SEROTONIN +SEROTONINERGIC +SEROTONINS +SEROTYPE +SEROTYPED +SEROTYPES +SEROTYPING +SEROUS +SEROVAR +SEROVARS +SEROW +SEROWS +SERPENT +SERPENTINE +SERPENTINELY +SERPENTINES +SERPENTS +SERPIGINES +SERPIGINOUS +SERPIGINOUSLY +SERPIGO +SERPIGOES +SERPIGOS +SERRANID +SERRANIDS +SERRANO +SERRANOID +SERRANOS +SERRATE +SERRATED +SERRATES +SERRATING +SERRATION +SERRATIONS +SERRATURE +SERRATURES +SERRIED +SERRIEDLY +SERRIEDNESS +SERRIEDNESSES +SERRIES +SERRULATE +SERRY +SERRYING +SERS +SERUM +SERUMAL +SERUMS +SERVABLE +SERVAL +SERVALS +SERVANT +SERVANTHOOD +SERVANTHOODS +SERVANTLESS +SERVANTS +SERVE +SERVED +SERVER +SERVERS +SERVES +SERVICE +SERVICEABILITY +SERVICEABLE +SERVICEABLENESS +SERVICEABLY +SERVICEBERRIES +SERVICEBERRY +SERVICED +SERVICEMAN +SERVICEMEN +SERVICER +SERVICERS +SERVICES +SERVICEWOMAN +SERVICEWOMEN +SERVICING +SERVIETTE +SERVIETTES +SERVILE +SERVILELY +SERVILENESS +SERVILENESSES +SERVILITIES +SERVILITY +SERVING +SERVINGS +SERVITOR +SERVITORS +SERVITUDE +SERVITUDES +SERVO +SERVOMECHANISM +SERVOMECHANISMS +SERVOMOTOR +SERVOMOTORS +SERVOS +SESAME +SESAMES +SESAMOID +SESAMOIDS +SESQUICARBONATE +SESQUICENTENARY +SESQUIPEDALIAN +SESQUITERPENE +SESQUITERPENES +SESSILE +SESSILITIES +SESSILITY +SESSION +SESSIONAL +SESSIONS +SESSPOOL +SESSPOOLS +SESTERCE +SESTERCES +SESTERTIA +SESTERTIUM +SESTET +SESTETS +SESTINA +SESTINAS +SESTINE +SESTINES +SET +SETA +SETACEOUS +SETAE +SETAL +SETBACK +SETBACKS +SETENANT +SETENANTS +SETIFORM +SETLINE +SETLINES +SETOFF +SETOFFS +SETON +SETONS +SETOSE +SETOUS +SETOUT +SETOUTS +SETS +SETSCREW +SETSCREWS +SETT +SETTEE +SETTEES +SETTER +SETTERS +SETTING +SETTINGS +SETTLE +SETTLEABLE +SETTLED +SETTLEMENT +SETTLEMENTS +SETTLER +SETTLERS +SETTLES +SETTLING +SETTLINGS +SETTLOR +SETTLORS +SETTS +SETULOSE +SETULOUS +SETUP +SETUPS +SEVEN +SEVENFOLD +SEVENS +SEVENTEEN +SEVENTEENS +SEVENTEENTH +SEVENTEENTHS +SEVENTH +SEVENTHLY +SEVENTHS +SEVENTIES +SEVENTIETH +SEVENTIETHS +SEVENTY +SEVER +SEVERABILITIES +SEVERABILITY +SEVERABLE +SEVERAL +SEVERALFOLD +SEVERALLY +SEVERALS +SEVERALTIES +SEVERALTY +SEVERANCE +SEVERANCES +SEVERE +SEVERED +SEVERELY +SEVERENESS +SEVERENESSES +SEVERER +SEVEREST +SEVERING +SEVERITIES +SEVERITY +SEVERS +SEVICHE +SEVICHES +SEVRUGA +SEVRUGAS +SEW +SEWABILITIES +SEWABILITY +SEWABLE +SEWAGE +SEWAGES +SEWAN +SEWANS +SEWAR +SEWARS +SEWED +SEWER +SEWERAGE +SEWERAGES +SEWERED +SEWERING +SEWERLESS +SEWERLIKE +SEWERS +SEWING +SEWINGS +SEWN +SEWS +SEX +SEXAGENARIAN +SEXAGENARIANS +SEXAGESIMAL +SEXAGESIMALS +SEXDECILLION +SEXDECILLIONS +SEXED +SEXENNIAL +SEXENNIALS +SEXES +SEXIER +SEXIEST +SEXILY +SEXINESS +SEXINESSES +SEXING +SEXISM +SEXISMS +SEXIST +SEXISTS +SEXLESS +SEXLESSLY +SEXLESSNESS +SEXLESSNESSES +SEXOLOGIC +SEXOLOGIES +SEXOLOGIST +SEXOLOGISTS +SEXOLOGY +SEXPLOITATION +SEXPLOITATIONS +SEXPOT +SEXPOTS +SEXT +SEXTAIN +SEXTAINS +SEXTAN +SEXTANS +SEXTANT +SEXTANTS +SEXTARII +SEXTARIUS +SEXTET +SEXTETS +SEXTETTE +SEXTETTES +SEXTILE +SEXTILES +SEXTILLION +SEXTILLIONS +SEXTO +SEXTODECIMO +SEXTODECIMOS +SEXTON +SEXTONS +SEXTOS +SEXTS +SEXTUPLE +SEXTUPLED +SEXTUPLES +SEXTUPLET +SEXTUPLETS +SEXTUPLICATE +SEXTUPLICATED +SEXTUPLICATES +SEXTUPLICATING +SEXTUPLING +SEXTUPLY +SEXUAL +SEXUALITIES +SEXUALITY +SEXUALIZE +SEXUALIZED +SEXUALIZES +SEXUALIZING +SEXUALLY +SEXY +SFERICS +SFORZANDI +SFORZANDO +SFORZANDOS +SFORZATO +SFORZATOS +SFUMATO +SFUMATOS +SGRAFFITI +SGRAFFITO +SH +SHA +SHABBATOT +SHABBIER +SHABBIEST +SHABBILY +SHABBINESS +SHABBINESSES +SHABBY +SHACK +SHACKED +SHACKING +SHACKLE +SHACKLEBONE +SHACKLEBONES +SHACKLED +SHACKLER +SHACKLERS +SHACKLES +SHACKLING +SHACKO +SHACKOES +SHACKOS +SHACKS +SHAD +SHADBERRIES +SHADBERRY +SHADBLOW +SHADBLOWS +SHADBUSH +SHADBUSHES +SHADCHAN +SHADCHANIM +SHADCHANS +SHADDOCK +SHADDOCKS +SHADE +SHADED +SHADELESS +SHADER +SHADERS +SHADES +SHADFLIES +SHADFLY +SHADIER +SHADIEST +SHADILY +SHADINESS +SHADINESSES +SHADING +SHADINGS +SHADKHAN +SHADKHANIM +SHADKHANS +SHADOOF +SHADOOFS +SHADOW +SHADOWBOX +SHADOWBOXED +SHADOWBOXES +SHADOWBOXING +SHADOWED +SHADOWER +SHADOWERS +SHADOWGRAPH +SHADOWGRAPHIES +SHADOWGRAPHS +SHADOWGRAPHY +SHADOWIER +SHADOWIEST +SHADOWILY +SHADOWINESS +SHADOWINESSES +SHADOWING +SHADOWLESS +SHADOWLIKE +SHADOWS +SHADOWY +SHADRACH +SHADRACHS +SHADS +SHADUF +SHADUFS +SHADY +SHAFT +SHAFTED +SHAFTING +SHAFTINGS +SHAFTS +SHAG +SHAGBARK +SHAGBARKS +SHAGGED +SHAGGIER +SHAGGIEST +SHAGGILY +SHAGGINESS +SHAGGINESSES +SHAGGING +SHAGGY +SHAGGYMANE +SHAGGYMANES +SHAGREEN +SHAGREENS +SHAGS +SHAH +SHAHDOM +SHAHDOMS +SHAHS +SHAIRD +SHAIRDS +SHAIRN +SHAIRNS +SHAITAN +SHAITANS +SHAKABLE +SHAKE +SHAKEABLE +SHAKEDOWN +SHAKEDOWNS +SHAKEN +SHAKEOUT +SHAKEOUTS +SHAKER +SHAKERS +SHAKES +SHAKEUP +SHAKEUPS +SHAKIER +SHAKIEST +SHAKILY +SHAKINESS +SHAKINESSES +SHAKING +SHAKO +SHAKOES +SHAKOS +SHAKY +SHALE +SHALED +SHALELIKE +SHALES +SHALEY +SHALIER +SHALIEST +SHALL +SHALLOON +SHALLOONS +SHALLOP +SHALLOPS +SHALLOT +SHALLOTS +SHALLOW +SHALLOWED +SHALLOWER +SHALLOWEST +SHALLOWING +SHALLOWLY +SHALLOWNESS +SHALLOWNESSES +SHALLOWS +SHALOM +SHALOMS +SHALT +SHALY +SHAM +SHAMABLE +SHAMABLY +SHAMAN +SHAMANIC +SHAMANISM +SHAMANISMS +SHAMANIST +SHAMANISTIC +SHAMANISTS +SHAMANS +SHAMAS +SHAMBLE +SHAMBLED +SHAMBLES +SHAMBLING +SHAMBOLIC +SHAME +SHAMEABLE +SHAMEABLY +SHAMED +SHAMEFACED +SHAMEFACEDLY +SHAMEFACEDNESS +SHAMEFAST +SHAMEFUL +SHAMEFULLY +SHAMEFULNESS +SHAMEFULNESSES +SHAMELESS +SHAMELESSLY +SHAMELESSNESS +SHAMELESSNESSES +SHAMES +SHAMING +SHAMISEN +SHAMISENS +SHAMMAS +SHAMMASH +SHAMMASHIM +SHAMMASIM +SHAMMED +SHAMMER +SHAMMERS +SHAMMES +SHAMMIED +SHAMMIES +SHAMMING +SHAMMOS +SHAMMOSIM +SHAMMY +SHAMMYING +SHAMOIS +SHAMOS +SHAMOSIM +SHAMOY +SHAMOYED +SHAMOYING +SHAMOYS +SHAMPOO +SHAMPOOED +SHAMPOOER +SHAMPOOERS +SHAMPOOING +SHAMPOOS +SHAMROCK +SHAMROCKS +SHAMS +SHAMUS +SHAMUSES +SHANACHIE +SHANACHIES +SHANDIES +SHANDY +SHANDYGAFF +SHANDYGAFFS +SHANGHAI +SHANGHAIED +SHANGHAIER +SHANGHAIERS +SHANGHAIING +SHANGHAIS +SHANK +SHANKED +SHANKING +SHANKPIECE +SHANKPIECES +SHANKS +SHANNIES +SHANNY +SHANTEY +SHANTEYS +SHANTI +SHANTIES +SHANTIH +SHANTIHS +SHANTIS +SHANTUNG +SHANTUNGS +SHANTY +SHANTYMAN +SHANTYMEN +SHANTYTOWN +SHANTYTOWNS +SHAPABLE +SHAPE +SHAPEABLE +SHAPED +SHAPELESS +SHAPELESSLY +SHAPELESSNESS +SHAPELESSNESSES +SHAPELIER +SHAPELIEST +SHAPELINESS +SHAPELINESSES +SHAPELY +SHAPEN +SHAPER +SHAPERS +SHAPES +SHAPEUP +SHAPEUPS +SHAPEWEAR +SHAPING +SHARABLE +SHARD +SHARDS +SHARE +SHAREABILITIES +SHAREABILITY +SHAREABLE +SHARECROP +SHARECROPPED +SHARECROPPER +SHARECROPPERS +SHARECROPPING +SHARECROPS +SHARED +SHAREHOLDER +SHAREHOLDERS +SHARER +SHARERS +SHARES +SHAREWARE +SHAREWARES +SHARIA +SHARIAH +SHARIAHS +SHARIAS +SHARIF +SHARIFIAN +SHARIFS +SHARING +SHARK +SHARKED +SHARKER +SHARKERS +SHARKING +SHARKLIKE +SHARKS +SHARKSKIN +SHARKSKINS +SHARN +SHARNS +SHARNY +SHARP +SHARPED +SHARPEN +SHARPENED +SHARPENER +SHARPENERS +SHARPENING +SHARPENS +SHARPER +SHARPERS +SHARPEST +SHARPIE +SHARPIES +SHARPING +SHARPLY +SHARPNESS +SHARPNESSES +SHARPS +SHARPSHOOTER +SHARPSHOOTERS +SHARPSHOOTING +SHARPSHOOTINGS +SHARPY +SHASHLICK +SHASHLICKS +SHASHLIK +SHASHLIKS +SHASLIK +SHASLIKS +SHAT +SHATTER +SHATTERED +SHATTERER +SHATTERERS +SHATTERING +SHATTERINGLY +SHATTERPROOF +SHATTERS +SHAUGH +SHAUGHS +SHAUL +SHAULED +SHAULING +SHAULS +SHAVABLE +SHAVE +SHAVED +SHAVELING +SHAVELINGS +SHAVEN +SHAVER +SHAVERS +SHAVES +SHAVETAIL +SHAVETAILS +SHAVIE +SHAVIES +SHAVING +SHAVINGS +SHAW +SHAWED +SHAWING +SHAWL +SHAWLED +SHAWLING +SHAWLS +SHAWM +SHAWMS +SHAWN +SHAWS +SHAY +SHAYS +SHAZAM +SHE +SHEA +SHEAF +SHEAFED +SHEAFING +SHEAFLIKE +SHEAFS +SHEAL +SHEALING +SHEALINGS +SHEALS +SHEAR +SHEARED +SHEARER +SHEARERS +SHEARING +SHEARINGS +SHEARLEGS +SHEARLING +SHEARLINGS +SHEARS +SHEARWATER +SHEARWATERS +SHEAS +SHEATFISH +SHEATFISHES +SHEATH +SHEATHBILL +SHEATHBILLS +SHEATHE +SHEATHED +SHEATHER +SHEATHERS +SHEATHES +SHEATHING +SHEATHINGS +SHEATHS +SHEAVE +SHEAVED +SHEAVES +SHEAVING +SHEBANG +SHEBANGS +SHEBEAN +SHEBEANS +SHEBEEN +SHEBEENS +SHED +SHEDABLE +SHEDDABLE +SHEDDED +SHEDDER +SHEDDERS +SHEDDING +SHEDLIKE +SHEDS +SHEEN +SHEENED +SHEENEY +SHEENEYS +SHEENFUL +SHEENIE +SHEENIER +SHEENIES +SHEENIEST +SHEENING +SHEENS +SHEENY +SHEEP +SHEEPBERRIES +SHEEPBERRY +SHEEPCOT +SHEEPCOTE +SHEEPCOTES +SHEEPCOTS +SHEEPDOG +SHEEPDOGS +SHEEPFOLD +SHEEPFOLDS +SHEEPHEAD +SHEEPHEADS +SHEEPHERDER +SHEEPHERDERS +SHEEPHERDING +SHEEPHERDINGS +SHEEPISH +SHEEPISHLY +SHEEPISHNESS +SHEEPISHNESSES +SHEEPMAN +SHEEPMEN +SHEEPSHANK +SHEEPSHANKS +SHEEPSHEAD +SHEEPSHEADS +SHEEPSHEARER +SHEEPSHEARERS +SHEEPSHEARING +SHEEPSHEARINGS +SHEEPSKIN +SHEEPSKINS +SHEEPWALK +SHEEPWALKS +SHEER +SHEERED +SHEERER +SHEEREST +SHEERING +SHEERLEGS +SHEERLY +SHEERNESS +SHEERNESSES +SHEERS +SHEESH +SHEET +SHEETED +SHEETER +SHEETERS +SHEETFED +SHEETING +SHEETINGS +SHEETLESS +SHEETLIKE +SHEETROCK +SHEETROCKED +SHEETROCKING +SHEETROCKS +SHEETS +SHEEVE +SHEEVES +SHEGETZ +SHEIK +SHEIKDOM +SHEIKDOMS +SHEIKH +SHEIKHDOM +SHEIKHDOMS +SHEIKHS +SHEIKS +SHEILA +SHEILAS +SHEITAN +SHEITANS +SHEKALIM +SHEKEL +SHEKELIM +SHEKELS +SHELDRAKE +SHELDRAKES +SHELDUCK +SHELDUCKS +SHELF +SHELFFUL +SHELFFULS +SHELFLIKE +SHELL +SHELLAC +SHELLACK +SHELLACKED +SHELLACKING +SHELLACKINGS +SHELLACKS +SHELLACS +SHELLBACK +SHELLBACKS +SHELLBARK +SHELLBARKS +SHELLCRACKER +SHELLCRACKERS +SHELLED +SHELLER +SHELLERS +SHELLFIRE +SHELLFIRES +SHELLFISH +SHELLFISHERIES +SHELLFISHERY +SHELLFISHES +SHELLIER +SHELLIEST +SHELLING +SHELLPROOF +SHELLS +SHELLWORK +SHELLWORKS +SHELLY +SHELTA +SHELTAS +SHELTER +SHELTERBELT +SHELTERBELTS +SHELTERED +SHELTERER +SHELTERERS +SHELTERING +SHELTERLESS +SHELTERS +SHELTIE +SHELTIES +SHELTY +SHELVE +SHELVED +SHELVER +SHELVERS +SHELVES +SHELVIER +SHELVIEST +SHELVING +SHELVINGS +SHELVY +SHENANIGAN +SHENANIGANS +SHEND +SHENDING +SHENDS +SHENT +SHEOL +SHEOLS +SHEPHERD +SHEPHERDED +SHEPHERDESS +SHEPHERDESSES +SHEPHERDING +SHEPHERDS +SHEQALIM +SHEQEL +SHEQELS +SHERBERT +SHERBERTS +SHERBET +SHERBETS +SHERD +SHERDS +SHEREEF +SHEREEFS +SHERGOTTITE +SHERGOTTITES +SHERIF +SHERIFF +SHERIFFDOM +SHERIFFDOMS +SHERIFFS +SHERIFS +SHERLOCK +SHERLOCKS +SHEROOT +SHEROOTS +SHERPA +SHERPAS +SHERRIES +SHERRIS +SHERRISES +SHERRY +SHES +SHETLAND +SHETLANDS +SHEUCH +SHEUCHS +SHEUGH +SHEUGHS +SHEW +SHEWBREAD +SHEWBREADS +SHEWED +SHEWER +SHEWERS +SHEWING +SHEWN +SHEWS +SHH +SHIATSU +SHIATSUS +SHIATZU +SHIATZUS +SHIBAH +SHIBAHS +SHIBBOLETH +SHIBBOLETHS +SHICKER +SHICKERED +SHICKERS +SHICKSA +SHICKSAS +SHIED +SHIEL +SHIELD +SHIELDED +SHIELDER +SHIELDERS +SHIELDING +SHIELDS +SHIELING +SHIELINGS +SHIELS +SHIER +SHIERS +SHIES +SHIEST +SHIFT +SHIFTABLE +SHIFTED +SHIFTER +SHIFTERS +SHIFTIER +SHIFTIEST +SHIFTILY +SHIFTINESS +SHIFTINESSES +SHIFTING +SHIFTLESS +SHIFTLESSLY +SHIFTLESSNESS +SHIFTLESSNESSES +SHIFTS +SHIFTY +SHIGELLA +SHIGELLAE +SHIGELLAS +SHIGELLOSES +SHIGELLOSIS +SHIITAKE +SHIITAKES +SHIKAR +SHIKAREE +SHIKAREES +SHIKARI +SHIKARIS +SHIKARRED +SHIKARRING +SHIKARS +SHIKKER +SHIKKERS +SHIKSA +SHIKSAS +SHIKSE +SHIKSEH +SHIKSEHS +SHIKSES +SHILINGI +SHILL +SHILLALA +SHILLALAH +SHILLALAHS +SHILLALAS +SHILLED +SHILLELAGH +SHILLELAGHS +SHILLELAH +SHILLELAHS +SHILLING +SHILLINGS +SHILLS +SHILPIT +SHILY +SHIM +SHIMMED +SHIMMER +SHIMMERED +SHIMMERING +SHIMMERS +SHIMMERY +SHIMMIED +SHIMMIES +SHIMMING +SHIMMY +SHIMMYING +SHIMS +SHIN +SHINBONE +SHINBONES +SHINDIES +SHINDIG +SHINDIGS +SHINDY +SHINDYS +SHINE +SHINED +SHINER +SHINERS +SHINES +SHINGLE +SHINGLED +SHINGLER +SHINGLERS +SHINGLES +SHINGLING +SHINGLY +SHINGUARD +SHINGUARDS +SHINIER +SHINIEST +SHINILY +SHININESS +SHININESSES +SHINING +SHININGLY +SHINLEAF +SHINLEAFS +SHINLEAVES +SHINNED +SHINNERIES +SHINNERY +SHINNEY +SHINNEYED +SHINNEYING +SHINNEYS +SHINNIED +SHINNIES +SHINNING +SHINNY +SHINNYING +SHINPLASTER +SHINPLASTERS +SHINS +SHINSPLINTS +SHINY +SHIP +SHIPBOARD +SHIPBOARDS +SHIPBORNE +SHIPBUILDER +SHIPBUILDERS +SHIPBUILDING +SHIPBUILDINGS +SHIPFITTER +SHIPFITTERS +SHIPLAP +SHIPLAPS +SHIPLESS +SHIPLOAD +SHIPLOADS +SHIPMAN +SHIPMASTER +SHIPMASTERS +SHIPMATE +SHIPMATES +SHIPMEN +SHIPMENT +SHIPMENTS +SHIPOWNER +SHIPOWNERS +SHIPPABLE +SHIPPED +SHIPPEN +SHIPPENS +SHIPPER +SHIPPERS +SHIPPING +SHIPPINGS +SHIPPON +SHIPPONS +SHIPS +SHIPSHAPE +SHIPSIDE +SHIPSIDES +SHIPWAY +SHIPWAYS +SHIPWORM +SHIPWORMS +SHIPWRECK +SHIPWRECKED +SHIPWRECKING +SHIPWRECKS +SHIPWRIGHT +SHIPWRIGHTS +SHIPYARD +SHIPYARDS +SHIRE +SHIRES +SHIRK +SHIRKED +SHIRKER +SHIRKERS +SHIRKING +SHIRKS +SHIRR +SHIRRED +SHIRRING +SHIRRINGS +SHIRRS +SHIRT +SHIRTDRESS +SHIRTDRESSES +SHIRTFRONT +SHIRTFRONTS +SHIRTIER +SHIRTIEST +SHIRTING +SHIRTINGS +SHIRTLESS +SHIRTMAKER +SHIRTMAKERS +SHIRTS +SHIRTSLEEVE +SHIRTSLEEVED +SHIRTSLEEVES +SHIRTTAIL +SHIRTTAILED +SHIRTTAILING +SHIRTTAILS +SHIRTWAIST +SHIRTWAISTS +SHIRTY +SHIST +SHISTS +SHIT +SHITAKE +SHITAKES +SHITFACED +SHITHEAD +SHITHEADS +SHITLESS +SHITLIST +SHITLISTS +SHITLOAD +SHITLOADS +SHITS +SHITTAH +SHITTAHS +SHITTED +SHITTIER +SHITTIEST +SHITTIM +SHITTIMS +SHITTIMWOOD +SHITTIMWOODS +SHITTING +SHITTY +SHIV +SHIVA +SHIVAH +SHIVAHS +SHIVAREE +SHIVAREED +SHIVAREEING +SHIVAREES +SHIVAS +SHIVE +SHIVER +SHIVERED +SHIVERER +SHIVERERS +SHIVERING +SHIVERS +SHIVERY +SHIVES +SHIVITI +SHIVITIS +SHIVS +SHKOTZIM +SHLEMIEHL +SHLEMIEHLS +SHLEMIEL +SHLEMIELS +SHLEP +SHLEPP +SHLEPPED +SHLEPPING +SHLEPPS +SHLEPS +SHLIMAZEL +SHLIMAZELS +SHLOCK +SHLOCKIER +SHLOCKIEST +SHLOCKS +SHLOCKY +SHLUB +SHLUBS +SHLUMP +SHLUMPED +SHLUMPING +SHLUMPS +SHLUMPY +SHMALTZ +SHMALTZES +SHMALTZIER +SHMALTZIEST +SHMALTZY +SHMEAR +SHMEARS +SHMO +SHMOES +SHMOOZE +SHMOOZED +SHMOOZES +SHMOOZING +SHMUCK +SHMUCKS +SHNAPPS +SHNAPS +SHNOOK +SHNOOKS +SHNORRER +SHNORRERS +SHOAL +SHOALED +SHOALER +SHOALEST +SHOALIER +SHOALIEST +SHOALING +SHOALS +SHOALY +SHOAT +SHOATS +SHOCK +SHOCKABLE +SHOCKED +SHOCKER +SHOCKERS +SHOCKING +SHOCKINGLY +SHOCKPROOF +SHOCKS +SHOD +SHODDEN +SHODDIER +SHODDIES +SHODDIEST +SHODDILY +SHODDINESS +SHODDINESSES +SHODDY +SHOE +SHOEBILL +SHOEBILLS +SHOEBLACK +SHOEBLACKS +SHOEBOX +SHOEBOXES +SHOED +SHOEHORN +SHOEHORNED +SHOEHORNING +SHOEHORNS +SHOEING +SHOELACE +SHOELACES +SHOELESS +SHOEMAKER +SHOEMAKERS +SHOEPAC +SHOEPACK +SHOEPACKS +SHOEPACS +SHOER +SHOERS +SHOES +SHOESHINE +SHOESHINES +SHOESTRING +SHOESTRINGS +SHOETREE +SHOETREES +SHOFAR +SHOFARS +SHOFROTH +SHOG +SHOGGED +SHOGGING +SHOGI +SHOGIS +SHOGS +SHOGUN +SHOGUNAL +SHOGUNATE +SHOGUNATES +SHOGUNS +SHOJI +SHOJIS +SHOLOM +SHOLOMS +SHONE +SHOO +SHOOED +SHOOFLIES +SHOOFLY +SHOOING +SHOOK +SHOOKS +SHOOL +SHOOLED +SHOOLING +SHOOLS +SHOON +SHOOS +SHOOT +SHOOTDOWN +SHOOTDOWNS +SHOOTER +SHOOTERS +SHOOTING +SHOOTINGS +SHOOTOUT +SHOOTOUTS +SHOOTS +SHOP +SHOPBOY +SHOPBOYS +SHOPGIRL +SHOPGIRLS +SHOPHAR +SHOPHARS +SHOPHROTH +SHOPKEEPER +SHOPKEEPERS +SHOPLIFT +SHOPLIFTED +SHOPLIFTER +SHOPLIFTERS +SHOPLIFTING +SHOPLIFTS +SHOPMAN +SHOPMEN +SHOPPE +SHOPPED +SHOPPER +SHOPPERS +SHOPPES +SHOPPING +SHOPPINGS +SHOPS +SHOPTALK +SHOPTALKS +SHOPWINDOW +SHOPWINDOWS +SHOPWORN +SHORAN +SHORANS +SHORE +SHOREBIRD +SHOREBIRDS +SHORED +SHOREFRONT +SHOREFRONTS +SHORELESS +SHORELINE +SHORELINES +SHORES +SHORESIDE +SHOREWARD +SHOREWARDS +SHORING +SHORINGS +SHORL +SHORLS +SHORN +SHORT +SHORTAGE +SHORTAGES +SHORTBREAD +SHORTBREADS +SHORTCAKE +SHORTCAKES +SHORTCHANGE +SHORTCHANGED +SHORTCHANGER +SHORTCHANGERS +SHORTCHANGES +SHORTCHANGING +SHORTCOMING +SHORTCOMINGS +SHORTCUT +SHORTCUTS +SHORTCUTTING +SHORTED +SHORTEN +SHORTENED +SHORTENER +SHORTENERS +SHORTENING +SHORTENINGS +SHORTENS +SHORTER +SHORTEST +SHORTFALL +SHORTFALLS +SHORTHAIR +SHORTHAIRED +SHORTHAIRS +SHORTHAND +SHORTHANDED +SHORTHANDS +SHORTHEAD +SHORTHEADS +SHORTHORN +SHORTHORNS +SHORTIA +SHORTIAS +SHORTIE +SHORTIES +SHORTING +SHORTISH +SHORTLIST +SHORTLISTED +SHORTLISTING +SHORTLISTS +SHORTLY +SHORTNESS +SHORTNESSES +SHORTS +SHORTSIGHTED +SHORTSIGHTEDLY +SHORTSTOP +SHORTSTOPS +SHORTWAVE +SHORTWAVED +SHORTWAVES +SHORTWAVING +SHORTY +SHOT +SHOTE +SHOTES +SHOTGUN +SHOTGUNNED +SHOTGUNNER +SHOTGUNNERS +SHOTGUNNING +SHOTGUNS +SHOTHOLE +SHOTHOLES +SHOTS +SHOTT +SHOTTED +SHOTTEN +SHOTTING +SHOTTS +SHOULD +SHOULDER +SHOULDERED +SHOULDERING +SHOULDERS +SHOULDEST +SHOULDST +SHOUT +SHOUTED +SHOUTER +SHOUTERS +SHOUTING +SHOUTS +SHOVE +SHOVED +SHOVEL +SHOVELED +SHOVELER +SHOVELERS +SHOVELFUL +SHOVELFULS +SHOVELING +SHOVELLED +SHOVELLER +SHOVELLERS +SHOVELLING +SHOVELNOSE +SHOVELNOSES +SHOVELS +SHOVELSFUL +SHOVER +SHOVERS +SHOVES +SHOVING +SHOW +SHOWABLE +SHOWBIZ +SHOWBIZZES +SHOWBIZZY +SHOWBOAT +SHOWBOATED +SHOWBOATING +SHOWBOATS +SHOWBREAD +SHOWBREADS +SHOWCASE +SHOWCASED +SHOWCASES +SHOWCASING +SHOWDOWN +SHOWDOWNS +SHOWED +SHOWER +SHOWERED +SHOWERER +SHOWERERS +SHOWERHEAD +SHOWERHEADS +SHOWERING +SHOWERLESS +SHOWERS +SHOWERY +SHOWGIRL +SHOWGIRLS +SHOWIER +SHOWIEST +SHOWILY +SHOWINESS +SHOWINESSES +SHOWING +SHOWINGS +SHOWMAN +SHOWMANLY +SHOWMANSHIP +SHOWMANSHIPS +SHOWMEN +SHOWN +SHOWOFF +SHOWOFFS +SHOWPIECE +SHOWPIECES +SHOWPLACE +SHOWPLACES +SHOWRING +SHOWRINGS +SHOWROOM +SHOWROOMS +SHOWS +SHOWSTOPPER +SHOWSTOPPERS +SHOWSTOPPING +SHOWTIME +SHOWTIMES +SHOWY +SHOYU +SHOYUS +SHRANK +SHRAPNEL +SHRED +SHREDDED +SHREDDER +SHREDDERS +SHREDDING +SHREDS +SHREW +SHREWD +SHREWDER +SHREWDEST +SHREWDIE +SHREWDIES +SHREWDLY +SHREWDNESS +SHREWDNESSES +SHREWED +SHREWING +SHREWISH +SHREWISHLY +SHREWISHNESS +SHREWISHNESSES +SHREWLIKE +SHREWMICE +SHREWMOUSE +SHREWS +SHRI +SHRIEK +SHRIEKED +SHRIEKER +SHRIEKERS +SHRIEKIER +SHRIEKIEST +SHRIEKING +SHRIEKS +SHRIEKY +SHRIEVAL +SHRIEVALTIES +SHRIEVALTY +SHRIEVE +SHRIEVED +SHRIEVES +SHRIEVING +SHRIFT +SHRIFTS +SHRIKE +SHRIKES +SHRILL +SHRILLED +SHRILLER +SHRILLEST +SHRILLING +SHRILLNESS +SHRILLNESSES +SHRILLS +SHRILLY +SHRIMP +SHRIMPED +SHRIMPER +SHRIMPERS +SHRIMPIER +SHRIMPIEST +SHRIMPING +SHRIMPLIKE +SHRIMPS +SHRIMPY +SHRINE +SHRINED +SHRINES +SHRINING +SHRINK +SHRINKABLE +SHRINKAGE +SHRINKAGES +SHRINKER +SHRINKERS +SHRINKING +SHRINKS +SHRIS +SHRIVE +SHRIVED +SHRIVEL +SHRIVELED +SHRIVELING +SHRIVELLED +SHRIVELLING +SHRIVELS +SHRIVEN +SHRIVER +SHRIVERS +SHRIVES +SHRIVING +SHROFF +SHROFFED +SHROFFING +SHROFFS +SHROUD +SHROUDED +SHROUDING +SHROUDS +SHROVE +SHRUB +SHRUBBERIES +SHRUBBERY +SHRUBBIER +SHRUBBIEST +SHRUBBY +SHRUBLAND +SHRUBLANDS +SHRUBLIKE +SHRUBS +SHRUG +SHRUGGED +SHRUGGING +SHRUGS +SHRUNK +SHRUNKEN +SHTETEL +SHTETELS +SHTETL +SHTETLACH +SHTETLS +SHTICK +SHTICKIER +SHTICKIEST +SHTICKS +SHTICKY +SHTIK +SHTIKS +SHUCK +SHUCKED +SHUCKER +SHUCKERS +SHUCKING +SHUCKINGS +SHUCKS +SHUDDER +SHUDDERED +SHUDDERING +SHUDDERS +SHUDDERY +SHUFFLE +SHUFFLEBOARD +SHUFFLEBOARDS +SHUFFLED +SHUFFLER +SHUFFLERS +SHUFFLES +SHUFFLING +SHUL +SHULN +SHULS +SHUN +SHUNNABLE +SHUNNED +SHUNNER +SHUNNERS +SHUNNING +SHUNPIKE +SHUNPIKED +SHUNPIKER +SHUNPIKERS +SHUNPIKES +SHUNPIKING +SHUNPIKINGS +SHUNS +SHUNT +SHUNTED +SHUNTER +SHUNTERS +SHUNTING +SHUNTS +SHUSH +SHUSHED +SHUSHER +SHUSHERS +SHUSHES +SHUSHING +SHUT +SHUTDOWN +SHUTDOWNS +SHUTE +SHUTED +SHUTES +SHUTEYE +SHUTEYES +SHUTING +SHUTOFF +SHUTOFFS +SHUTOUT +SHUTOUTS +SHUTS +SHUTTER +SHUTTERBUG +SHUTTERBUGS +SHUTTERED +SHUTTERING +SHUTTERLESS +SHUTTERS +SHUTTING +SHUTTLE +SHUTTLECOCK +SHUTTLECOCKED +SHUTTLECOCKING +SHUTTLECOCKS +SHUTTLED +SHUTTLELESS +SHUTTLER +SHUTTLERS +SHUTTLES +SHUTTLING +SHVARTZE +SHVARTZES +SHWA +SHWANPAN +SHWANPANS +SHWAS +SHY +SHYER +SHYERS +SHYEST +SHYING +SHYLOCK +SHYLOCKED +SHYLOCKING +SHYLOCKS +SHYLY +SHYNESS +SHYNESSES +SHYSTER +SHYSTERS +SI +SIAL +SIALAGOGUE +SIALAGOGUES +SIALIC +SIALID +SIALIDAN +SIALIDANS +SIALIDS +SIALOID +SIALS +SIAMANG +SIAMANGS +SIAMESE +SIAMESES +SIB +SIBB +SIBBS +SIBILANCE +SIBILANCES +SIBILANCIES +SIBILANCY +SIBILANT +SIBILANTLY +SIBILANTS +SIBILATE +SIBILATED +SIBILATES +SIBILATING +SIBILATION +SIBILATIONS +SIBILATOR +SIBILATORS +SIBLING +SIBLINGS +SIBS +SIBYL +SIBYLIC +SIBYLLIC +SIBYLLINE +SIBYLS +SIC +SICCAN +SICCATIVE +SICCATIVES +SICCED +SICCING +SICE +SICES +SICK +SICKBAY +SICKBAYS +SICKBED +SICKBEDS +SICKED +SICKEE +SICKEES +SICKEN +SICKENED +SICKENER +SICKENERS +SICKENING +SICKENINGLY +SICKENS +SICKER +SICKERLY +SICKEST +SICKIE +SICKIES +SICKING +SICKISH +SICKISHLY +SICKISHNESS +SICKISHNESSES +SICKLE +SICKLED +SICKLEMIA +SICKLEMIAS +SICKLEMIC +SICKLES +SICKLIED +SICKLIER +SICKLIES +SICKLIEST +SICKLILY +SICKLINESS +SICKLINESSES +SICKLING +SICKLY +SICKLYING +SICKNESS +SICKNESSES +SICKO +SICKOS +SICKOUT +SICKOUTS +SICKROOM +SICKROOMS +SICKS +SICS +SIDDUR +SIDDURIM +SIDDURS +SIDE +SIDEARM +SIDEARMS +SIDEBAND +SIDEBANDS +SIDEBAR +SIDEBARS +SIDEBOARD +SIDEBOARDS +SIDEBURNED +SIDEBURNS +SIDECAR +SIDECARS +SIDECHECK +SIDECHECKS +SIDED +SIDEDNESS +SIDEDNESSES +SIDEDRESS +SIDEDRESSES +SIDEHILL +SIDEHILLS +SIDEKICK +SIDEKICKS +SIDELIGHT +SIDELIGHTS +SIDELINE +SIDELINED +SIDELINER +SIDELINERS +SIDELINES +SIDELING +SIDELINING +SIDELONG +SIDEMAN +SIDEMEN +SIDEPIECE +SIDEPIECES +SIDEREAL +SIDERITE +SIDERITES +SIDERITIC +SIDEROLITE +SIDEROLITES +SIDEROSES +SIDEROSIS +SIDEROTIC +SIDES +SIDESADDLE +SIDESADDLES +SIDESHOW +SIDESHOWS +SIDESLIP +SIDESLIPPED +SIDESLIPPING +SIDESLIPS +SIDESPIN +SIDESPINS +SIDESPLITTING +SIDESPLITTINGLY +SIDESTEP +SIDESTEPPED +SIDESTEPPER +SIDESTEPPERS +SIDESTEPPING +SIDESTEPS +SIDESTREAM +SIDESTROKE +SIDESTROKES +SIDESWIPE +SIDESWIPED +SIDESWIPES +SIDESWIPING +SIDETRACK +SIDETRACKED +SIDETRACKING +SIDETRACKS +SIDEWALK +SIDEWALKS +SIDEWALL +SIDEWALLS +SIDEWARD +SIDEWARDS +SIDEWAY +SIDEWAYS +SIDEWINDER +SIDEWINDERS +SIDEWISE +SIDH +SIDHE +SIDING +SIDINGS +SIDLE +SIDLED +SIDLER +SIDLERS +SIDLES +SIDLING +SIDLINGLY +SIEGE +SIEGED +SIEGES +SIEGING +SIEMENS +SIENITE +SIENITES +SIENNA +SIENNAS +SIEROZEM +SIEROZEMS +SIERRA +SIERRAN +SIERRAS +SIESTA +SIESTAS +SIEUR +SIEURS +SIEVE +SIEVED +SIEVERT +SIEVERTS +SIEVES +SIEVING +SIFAKA +SIFAKAS +SIFFLEUR +SIFFLEURS +SIFT +SIFTED +SIFTER +SIFTERS +SIFTING +SIFTINGS +SIFTS +SIGANID +SIGANIDS +SIGH +SIGHED +SIGHER +SIGHERS +SIGHING +SIGHLESS +SIGHLIKE +SIGHS +SIGHT +SIGHTED +SIGHTER +SIGHTERS +SIGHTING +SIGHTINGS +SIGHTLESS +SIGHTLESSLY +SIGHTLESSNESS +SIGHTLESSNESSES +SIGHTLIER +SIGHTLIEST +SIGHTLINE +SIGHTLINES +SIGHTLINESS +SIGHTLINESSES +SIGHTLY +SIGHTS +SIGHTSAW +SIGHTSEE +SIGHTSEEING +SIGHTSEEN +SIGHTSEER +SIGHTSEERS +SIGHTSEES +SIGIL +SIGILS +SIGLA +SIGLOI +SIGLOS +SIGLUM +SIGMA +SIGMAS +SIGMATE +SIGMOID +SIGMOIDAL +SIGMOIDALLY +SIGMOIDOSCOPIES +SIGMOIDOSCOPY +SIGMOIDS +SIGN +SIGNA +SIGNAGE +SIGNAGES +SIGNAL +SIGNALED +SIGNALER +SIGNALERS +SIGNALING +SIGNALISE +SIGNALISED +SIGNALISES +SIGNALISING +SIGNALIZATION +SIGNALIZATIONS +SIGNALIZE +SIGNALIZED +SIGNALIZES +SIGNALIZING +SIGNALLED +SIGNALLER +SIGNALLERS +SIGNALLING +SIGNALLY +SIGNALMAN +SIGNALMEN +SIGNALMENT +SIGNALMENTS +SIGNALS +SIGNATORIES +SIGNATORY +SIGNATURE +SIGNATURES +SIGNBOARD +SIGNBOARDS +SIGNED +SIGNEE +SIGNEES +SIGNER +SIGNERS +SIGNET +SIGNETED +SIGNETING +SIGNETS +SIGNIFICANCE +SIGNIFICANCES +SIGNIFICANCIES +SIGNIFICANCY +SIGNIFICANT +SIGNIFICANTLY +SIGNIFICATION +SIGNIFICATIONS +SIGNIFICATIVE +SIGNIFICS +SIGNIFIED +SIGNIFIEDS +SIGNIFIER +SIGNIFIERS +SIGNIFIES +SIGNIFY +SIGNIFYING +SIGNIFYINGS +SIGNING +SIGNIOR +SIGNIORI +SIGNIORIES +SIGNIORS +SIGNIORY +SIGNOR +SIGNORA +SIGNORAS +SIGNORE +SIGNORI +SIGNORIES +SIGNORINA +SIGNORINAS +SIGNORINE +SIGNORS +SIGNORY +SIGNPOST +SIGNPOSTED +SIGNPOSTING +SIGNPOSTS +SIGNS +SIKA +SIKAS +SIKE +SIKER +SIKES +SILAGE +SILAGES +SILANE +SILANES +SILD +SILDS +SILENCE +SILENCED +SILENCER +SILENCERS +SILENCES +SILENCING +SILENI +SILENT +SILENTER +SILENTEST +SILENTLY +SILENTNESS +SILENTNESSES +SILENTS +SILENUS +SILESIA +SILESIAS +SILEX +SILEXES +SILHOUETTE +SILHOUETTED +SILHOUETTES +SILHOUETTING +SILHOUETTIST +SILHOUETTISTS +SILICA +SILICAS +SILICATE +SILICATES +SILICEOUS +SILICIC +SILICIDE +SILICIDES +SILICIFICATION +SILICIFICATIONS +SILICIFIED +SILICIFIES +SILICIFY +SILICIFYING +SILICIOUS +SILICIUM +SILICIUMS +SILICLE +SILICLES +SILICON +SILICONE +SILICONES +SILICONIZED +SILICONS +SILICOSES +SILICOSIS +SILICOTIC +SILICOTICS +SILICULA +SILICULAE +SILIQUA +SILIQUAE +SILIQUE +SILIQUES +SILIQUOSE +SILIQUOUS +SILK +SILKALINE +SILKALINES +SILKED +SILKEN +SILKIE +SILKIER +SILKIES +SILKIEST +SILKILY +SILKINESS +SILKINESSES +SILKING +SILKLIKE +SILKOLINE +SILKOLINES +SILKS +SILKWEED +SILKWEEDS +SILKWORM +SILKWORMS +SILKY +SILL +SILLABUB +SILLABUBS +SILLER +SILLERS +SILLIBUB +SILLIBUBS +SILLIER +SILLIES +SILLIEST +SILLILY +SILLIMANITE +SILLIMANITES +SILLINESS +SILLINESSES +SILLS +SILLY +SILO +SILOED +SILOING +SILOS +SILOXANE +SILOXANES +SILT +SILTATION +SILTATIONS +SILTED +SILTIER +SILTIEST +SILTING +SILTS +SILTSTONE +SILTSTONES +SILTY +SILURIAN +SILURID +SILURIDS +SILUROID +SILUROIDS +SILVA +SILVAE +SILVAN +SILVANS +SILVAS +SILVER +SILVERBACK +SILVERBACKS +SILVERBERRIES +SILVERBERRY +SILVERED +SILVERER +SILVERERS +SILVERFISH +SILVERFISHES +SILVERINESS +SILVERINESSES +SILVERING +SILVERINGS +SILVERLY +SILVERN +SILVERPOINT +SILVERPOINTS +SILVERS +SILVERSIDE +SILVERSIDES +SILVERSMITH +SILVERSMITHING +SILVERSMITHINGS +SILVERSMITHS +SILVERWARE +SILVERWARES +SILVERWEED +SILVERWEEDS +SILVERY +SILVEX +SILVEXES +SILVICAL +SILVICS +SILVICULTURAL +SILVICULTURALLY +SILVICULTURE +SILVICULTURES +SILVICULTURIST +SILVICULTURISTS +SIM +SIMA +SIMAR +SIMARS +SIMARUBA +SIMARUBAS +SIMAS +SIMAZINE +SIMAZINES +SIMIAN +SIMIANS +SIMILAR +SIMILARITIES +SIMILARITY +SIMILARLY +SIMILE +SIMILES +SIMILITUDE +SIMILITUDES +SIMIOID +SIMIOUS +SIMITAR +SIMITARS +SIMLIN +SIMLINS +SIMMER +SIMMERED +SIMMERING +SIMMERS +SIMNEL +SIMNELS +SIMOLEON +SIMOLEONS +SIMONIAC +SIMONIACAL +SIMONIACALLY +SIMONIACS +SIMONIES +SIMONIST +SIMONISTS +SIMONIZE +SIMONIZED +SIMONIZES +SIMONIZING +SIMONY +SIMOOM +SIMOOMS +SIMOON +SIMOONS +SIMP +SIMPATICO +SIMPER +SIMPERED +SIMPERER +SIMPERERS +SIMPERING +SIMPERS +SIMPLE +SIMPLEMINDED +SIMPLEMINDEDLY +SIMPLENESS +SIMPLENESSES +SIMPLER +SIMPLES +SIMPLEST +SIMPLETON +SIMPLETONS +SIMPLEX +SIMPLEXES +SIMPLICES +SIMPLICIA +SIMPLICIAL +SIMPLICIALLY +SIMPLICITIES +SIMPLICITY +SIMPLIFICATION +SIMPLIFICATIONS +SIMPLIFIED +SIMPLIFIER +SIMPLIFIERS +SIMPLIFIES +SIMPLIFY +SIMPLIFYING +SIMPLISM +SIMPLISMS +SIMPLIST +SIMPLISTIC +SIMPLISTICALLY +SIMPLISTS +SIMPLY +SIMPS +SIMS +SIMULACRA +SIMULACRE +SIMULACRES +SIMULACRUM +SIMULACRUMS +SIMULANT +SIMULANTS +SIMULAR +SIMULARS +SIMULATE +SIMULATED +SIMULATES +SIMULATING +SIMULATION +SIMULATIONS +SIMULATIVE +SIMULATOR +SIMULATORS +SIMULCAST +SIMULCASTED +SIMULCASTING +SIMULCASTS +SIMULTANEITIES +SIMULTANEITY +SIMULTANEOUS +SIMULTANEOUSLY +SIN +SINAPISM +SINAPISMS +SINCE +SINCERE +SINCERELY +SINCERENESS +SINCERENESSES +SINCERER +SINCEREST +SINCERITIES +SINCERITY +SINCIPITA +SINCIPITAL +SINCIPUT +SINCIPUTS +SINE +SINECURE +SINECURES +SINES +SINEW +SINEWED +SINEWING +SINEWLESS +SINEWS +SINEWY +SINFONIA +SINFONIAS +SINFONIE +SINFONIETTA +SINFONIETTAS +SINFUL +SINFULLY +SINFULNESS +SINFULNESSES +SING +SINGABLE +SINGALONG +SINGALONGS +SINGE +SINGED +SINGEING +SINGER +SINGERS +SINGES +SINGING +SINGLE +SINGLED +SINGLENESS +SINGLENESSES +SINGLES +SINGLESTICK +SINGLESTICKS +SINGLET +SINGLETON +SINGLETONS +SINGLETREE +SINGLETREES +SINGLETS +SINGLING +SINGLY +SINGS +SINGSONG +SINGSONGS +SINGSONGY +SINGSPIEL +SINGSPIELS +SINGULAR +SINGULARITIES +SINGULARITY +SINGULARIZE +SINGULARIZED +SINGULARIZES +SINGULARIZING +SINGULARLY +SINGULARS +SINH +SINHS +SINICIZE +SINICIZED +SINICIZES +SINICIZING +SINISTER +SINISTERLY +SINISTERNESS +SINISTERNESSES +SINISTRAL +SINISTROUS +SINK +SINKABLE +SINKAGE +SINKAGES +SINKER +SINKERS +SINKHOLE +SINKHOLES +SINKING +SINKS +SINLESS +SINLESSLY +SINLESSNESS +SINLESSNESSES +SINNED +SINNER +SINNERS +SINNING +SINOATRIAL +SINOLOGICAL +SINOLOGIES +SINOLOGIST +SINOLOGISTS +SINOLOGUE +SINOLOGUES +SINOLOGY +SINOPIA +SINOPIAS +SINOPIE +SINS +SINSEMILLA +SINSEMILLAS +SINSYNE +SINTER +SINTERABILITIES +SINTERABILITY +SINTERED +SINTERING +SINTERS +SINUATE +SINUATED +SINUATELY +SINUATES +SINUATING +SINUATION +SINUATIONS +SINUOSITIES +SINUOSITY +SINUOUS +SINUOUSLY +SINUOUSNESS +SINUOUSNESSES +SINUS +SINUSES +SINUSITIS +SINUSITISES +SINUSLIKE +SINUSOID +SINUSOIDAL +SINUSOIDALLY +SINUSOIDS +SIP +SIPE +SIPED +SIPES +SIPHON +SIPHONAGE +SIPHONAGES +SIPHONAL +SIPHONED +SIPHONIC +SIPHONING +SIPHONOPHORE +SIPHONOPHORES +SIPHONOSTELE +SIPHONOSTELES +SIPHONS +SIPING +SIPPED +SIPPER +SIPPERS +SIPPET +SIPPETS +SIPPING +SIPS +SIR +SIRDAR +SIRDARS +SIRE +SIRED +SIREE +SIREES +SIREN +SIRENIAN +SIRENIANS +SIRENS +SIRES +SIRING +SIRLOIN +SIRLOINS +SIROCCO +SIROCCOS +SIRRA +SIRRAH +SIRRAHS +SIRRAS +SIRREE +SIRREES +SIRS +SIRUP +SIRUPED +SIRUPIER +SIRUPIEST +SIRUPING +SIRUPS +SIRUPY +SIRVENTE +SIRVENTES +SIS +SISAL +SISALS +SISES +SISKIN +SISKINS +SISSES +SISSIER +SISSIES +SISSIEST +SISSIFIED +SISSINESS +SISSINESSES +SISSY +SISSYISH +SISSYNESS +SISSYNESSES +SISTER +SISTERED +SISTERHOOD +SISTERHOODS +SISTERING +SISTERLY +SISTERS +SISTRA +SISTROID +SISTRUM +SISTRUMS +SIT +SITAR +SITARIST +SITARISTS +SITARS +SITCOM +SITCOMS +SITE +SITED +SITES +SITH +SITHENCE +SITHENS +SITING +SITOLOGIES +SITOLOGY +SITOSTEROL +SITOSTEROLS +SITS +SITTEN +SITTER +SITTERS +SITTING +SITTINGS +SITUATE +SITUATED +SITUATES +SITUATING +SITUATION +SITUATIONAL +SITUATIONALLY +SITUATIONS +SITUP +SITUPS +SITUS +SITUSES +SITZMARK +SITZMARKS +SIVER +SIVERS +SIX +SIXES +SIXFOLD +SIXMO +SIXMOS +SIXPENCE +SIXPENCES +SIXPENNY +SIXTE +SIXTEEN +SIXTEENMO +SIXTEENMOS +SIXTEENS +SIXTEENTH +SIXTEENTHS +SIXTES +SIXTH +SIXTHLY +SIXTHS +SIXTIES +SIXTIETH +SIXTIETHS +SIXTY +SIXTYISH +SIZABLE +SIZABLENESS +SIZABLENESSES +SIZABLY +SIZAR +SIZARS +SIZARSHIP +SIZARSHIPS +SIZE +SIZEABLE +SIZEABLY +SIZED +SIZER +SIZERS +SIZES +SIZIER +SIZIEST +SIZINESS +SIZINESSES +SIZING +SIZINGS +SIZY +SIZZLE +SIZZLED +SIZZLER +SIZZLERS +SIZZLES +SIZZLING +SJAMBOK +SJAMBOKED +SJAMBOKING +SJAMBOKS +SKA +SKAG +SKAGS +SKALD +SKALDIC +SKALDS +SKALDSHIP +SKALDSHIPS +SKANK +SKANKED +SKANKER +SKANKERS +SKANKIER +SKANKIEST +SKANKING +SKANKS +SKANKY +SKAS +SKAT +SKATE +SKATEBOARD +SKATEBOARDER +SKATEBOARDERS +SKATEBOARDING +SKATEBOARDINGS +SKATEBOARDS +SKATED +SKATER +SKATERS +SKATES +SKATING +SKATINGS +SKATOL +SKATOLE +SKATOLES +SKATOLS +SKATS +SKEAN +SKEANE +SKEANES +SKEANS +SKEDADDLE +SKEDADDLED +SKEDADDLER +SKEDADDLERS +SKEDADDLES +SKEDADDLING +SKEE +SKEED +SKEEING +SKEEN +SKEENS +SKEES +SKEET +SKEETER +SKEETERS +SKEETS +SKEG +SKEGS +SKEIGH +SKEIN +SKEINED +SKEINING +SKEINS +SKELETAL +SKELETALLY +SKELETON +SKELETONIC +SKELETONISE +SKELETONISED +SKELETONISES +SKELETONISING +SKELETONIZE +SKELETONIZED +SKELETONIZER +SKELETONIZERS +SKELETONIZES +SKELETONIZING +SKELETONS +SKELL +SKELLS +SKELLUM +SKELLUMS +SKELM +SKELMS +SKELP +SKELPED +SKELPING +SKELPIT +SKELPS +SKELTER +SKELTERED +SKELTERING +SKELTERS +SKENE +SKENES +SKEP +SKEPS +SKEPSIS +SKEPSISES +SKEPTIC +SKEPTICAL +SKEPTICALLY +SKEPTICISM +SKEPTICISMS +SKEPTICS +SKERRIES +SKERRY +SKETCH +SKETCHBOOK +SKETCHBOOKS +SKETCHED +SKETCHER +SKETCHERS +SKETCHES +SKETCHIER +SKETCHIEST +SKETCHILY +SKETCHINESS +SKETCHINESSES +SKETCHING +SKETCHPAD +SKETCHPADS +SKETCHY +SKEW +SKEWBACK +SKEWBACKS +SKEWBALD +SKEWBALDS +SKEWED +SKEWER +SKEWERED +SKEWERING +SKEWERS +SKEWING +SKEWNESS +SKEWNESSES +SKEWS +SKI +SKIABLE +SKIAGRAM +SKIAGRAMS +SKIAGRAPH +SKIAGRAPHS +SKIASCOPE +SKIASCOPES +SKIASCOPIES +SKIASCOPY +SKIBOB +SKIBOBBER +SKIBOBBERS +SKIBOBBING +SKIBOBBINGS +SKIBOBS +SKID +SKIDDED +SKIDDER +SKIDDERS +SKIDDIER +SKIDDIEST +SKIDDING +SKIDDOO +SKIDDOOED +SKIDDOOING +SKIDDOOS +SKIDDY +SKIDOO +SKIDOOED +SKIDOOING +SKIDOOS +SKIDPROOF +SKIDS +SKIDWAY +SKIDWAYS +SKIED +SKIER +SKIERS +SKIES +SKIEY +SKIFF +SKIFFLE +SKIFFLED +SKIFFLES +SKIFFLESS +SKIFFLING +SKIFFS +SKIING +SKIINGS +SKIJORER +SKIJORERS +SKIJORING +SKIJORINGS +SKILFUL +SKILFULLY +SKILL +SKILLED +SKILLESS +SKILLESSNESS +SKILLESSNESSES +SKILLET +SKILLETS +SKILLFUL +SKILLFULLY +SKILLFULNESS +SKILLFULNESSES +SKILLING +SKILLINGS +SKILLS +SKIM +SKIMBOARD +SKIMBOARDS +SKIMMED +SKIMMER +SKIMMERS +SKIMMING +SKIMMINGS +SKIMO +SKIMOBILE +SKIMOBILED +SKIMOBILES +SKIMOBILING +SKIMOS +SKIMP +SKIMPED +SKIMPIER +SKIMPIEST +SKIMPILY +SKIMPINESS +SKIMPINESSES +SKIMPING +SKIMPS +SKIMPY +SKIMS +SKIN +SKINFLICK +SKINFLICKS +SKINFLINT +SKINFLINTS +SKINFUL +SKINFULS +SKINHEAD +SKINHEADS +SKINK +SKINKED +SKINKER +SKINKERS +SKINKING +SKINKS +SKINLESS +SKINLIKE +SKINNED +SKINNER +SKINNERS +SKINNIER +SKINNIEST +SKINNINESS +SKINNINESSES +SKINNING +SKINNY +SKINS +SKINT +SKINTIGHT +SKIORING +SKIORINGS +SKIP +SKIPJACK +SKIPJACKS +SKIPLANE +SKIPLANES +SKIPPABLE +SKIPPED +SKIPPER +SKIPPERED +SKIPPERING +SKIPPERS +SKIPPET +SKIPPETS +SKIPPING +SKIPS +SKIRL +SKIRLED +SKIRLING +SKIRLS +SKIRMISH +SKIRMISHED +SKIRMISHER +SKIRMISHERS +SKIRMISHES +SKIRMISHING +SKIRR +SKIRRED +SKIRRET +SKIRRETS +SKIRRING +SKIRRS +SKIRT +SKIRTED +SKIRTER +SKIRTERS +SKIRTING +SKIRTINGS +SKIRTLESS +SKIRTLIKE +SKIRTS +SKIS +SKIT +SKITE +SKITED +SKITES +SKITING +SKITS +SKITTER +SKITTERED +SKITTERIER +SKITTERIEST +SKITTERING +SKITTERS +SKITTERY +SKITTISH +SKITTISHLY +SKITTISHNESS +SKITTISHNESSES +SKITTLE +SKITTLES +SKIVE +SKIVED +SKIVER +SKIVERS +SKIVES +SKIVING +SKIVVIED +SKIVVIES +SKIVVY +SKIVVYING +SKIWEAR +SKLENT +SKLENTED +SKLENTING +SKLENTS +SKOAL +SKOALED +SKOALING +SKOALS +SKOOKUM +SKORT +SKORTS +SKOSH +SKOSHES +SKREEGH +SKREEGHED +SKREEGHING +SKREEGHS +SKREIGH +SKREIGHED +SKREIGHING +SKREIGHS +SKUA +SKUAS +SKULDUGGERIES +SKULDUGGERY +SKULK +SKULKED +SKULKER +SKULKERS +SKULKING +SKULKS +SKULL +SKULLCAP +SKULLCAPS +SKULLDUGGERIES +SKULLDUGGERY +SKULLED +SKULLING +SKULLS +SKUNK +SKUNKED +SKUNKIER +SKUNKIEST +SKUNKING +SKUNKS +SKUNKWEED +SKUNKWEEDS +SKUNKY +SKY +SKYBOARD +SKYBOARDS +SKYBORNE +SKYBOX +SKYBOXES +SKYBRIDGE +SKYBRIDGES +SKYCAP +SKYCAPS +SKYDIVE +SKYDIVED +SKYDIVER +SKYDIVERS +SKYDIVES +SKYDIVING +SKYDIVINGS +SKYDOVE +SKYED +SKYEY +SKYHOOK +SKYHOOKS +SKYING +SKYJACK +SKYJACKED +SKYJACKER +SKYJACKERS +SKYJACKING +SKYJACKINGS +SKYJACKS +SKYLARK +SKYLARKED +SKYLARKER +SKYLARKERS +SKYLARKING +SKYLARKS +SKYLIGHT +SKYLIGHTED +SKYLIGHTS +SKYLIKE +SKYLINE +SKYLINES +SKYLIT +SKYMAN +SKYMEN +SKYPHOI +SKYPHOS +SKYROCKET +SKYROCKETED +SKYROCKETING +SKYROCKETS +SKYSAIL +SKYSAILS +SKYSCRAPER +SKYSCRAPERS +SKYSURF +SKYSURFED +SKYSURFER +SKYSURFERS +SKYSURFING +SKYSURFS +SKYWALK +SKYWALKS +SKYWARD +SKYWARDS +SKYWAY +SKYWAYS +SKYWRITE +SKYWRITER +SKYWRITERS +SKYWRITES +SKYWRITING +SKYWRITINGS +SKYWRITTEN +SKYWROTE +SLAB +SLABBED +SLABBER +SLABBERED +SLABBERING +SLABBERS +SLABBERY +SLABBING +SLABLIKE +SLABS +SLACK +SLACKED +SLACKEN +SLACKENED +SLACKENER +SLACKENERS +SLACKENING +SLACKENS +SLACKER +SLACKERS +SLACKEST +SLACKING +SLACKLY +SLACKNESS +SLACKNESSES +SLACKS +SLAG +SLAGGED +SLAGGIER +SLAGGIEST +SLAGGING +SLAGGY +SLAGS +SLAIN +SLAINTE +SLAKABLE +SLAKE +SLAKED +SLAKER +SLAKERS +SLAKES +SLAKING +SLALOM +SLALOMED +SLALOMER +SLALOMERS +SLALOMING +SLALOMIST +SLALOMISTS +SLALOMS +SLAM +SLAMDANCE +SLAMDANCED +SLAMDANCES +SLAMDANCING +SLAMMED +SLAMMER +SLAMMERS +SLAMMING +SLAMMINGS +SLAMS +SLANDER +SLANDERED +SLANDERER +SLANDERERS +SLANDERING +SLANDEROUS +SLANDEROUSLY +SLANDEROUSNESS +SLANDERS +SLANG +SLANGED +SLANGIER +SLANGIEST +SLANGILY +SLANGINESS +SLANGINESSES +SLANGING +SLANGS +SLANGUAGE +SLANGUAGES +SLANGY +SLANK +SLANT +SLANTED +SLANTING +SLANTINGLY +SLANTLY +SLANTS +SLANTWAYS +SLANTWISE +SLANTY +SLAP +SLAPDASH +SLAPDASHES +SLAPHAPPIER +SLAPHAPPIEST +SLAPHAPPY +SLAPJACK +SLAPJACKS +SLAPPED +SLAPPER +SLAPPERS +SLAPPING +SLAPS +SLAPSTICK +SLAPSTICKS +SLASH +SLASHED +SLASHER +SLASHERS +SLASHES +SLASHING +SLASHINGLY +SLASHINGS +SLAT +SLATCH +SLATCHES +SLATE +SLATED +SLATELIKE +SLATER +SLATERS +SLATES +SLATEY +SLATHER +SLATHERED +SLATHERING +SLATHERS +SLATIER +SLATIEST +SLATINESS +SLATINESSES +SLATING +SLATINGS +SLATS +SLATTED +SLATTERN +SLATTERNLINESS +SLATTERNLY +SLATTERNS +SLATTING +SLATTINGS +SLATY +SLAUGHTER +SLAUGHTERED +SLAUGHTERER +SLAUGHTERERS +SLAUGHTERHOUSE +SLAUGHTERHOUSES +SLAUGHTERING +SLAUGHTEROUS +SLAUGHTEROUSLY +SLAUGHTERS +SLAVE +SLAVED +SLAVEHOLDER +SLAVEHOLDERS +SLAVEHOLDING +SLAVEHOLDINGS +SLAVER +SLAVERED +SLAVERER +SLAVERERS +SLAVERIES +SLAVERING +SLAVERS +SLAVERY +SLAVES +SLAVEY +SLAVEYS +SLAVING +SLAVISH +SLAVISHLY +SLAVISHNESS +SLAVISHNESSES +SLAVOCRACIES +SLAVOCRACY +SLAVOCRAT +SLAVOCRATS +SLAW +SLAWS +SLAY +SLAYABLE +SLAYED +SLAYER +SLAYERS +SLAYING +SLAYS +SLEAVE +SLEAVED +SLEAVES +SLEAVING +SLEAZE +SLEAZEBAG +SLEAZEBAGS +SLEAZEBALL +SLEAZEBALLS +SLEAZES +SLEAZIER +SLEAZIEST +SLEAZILY +SLEAZINESS +SLEAZINESSES +SLEAZO +SLEAZOID +SLEAZOIDS +SLEAZY +SLED +SLEDDED +SLEDDER +SLEDDERS +SLEDDING +SLEDDINGS +SLEDGE +SLEDGED +SLEDGEHAMMER +SLEDGEHAMMERED +SLEDGEHAMMERING +SLEDGEHAMMERS +SLEDGES +SLEDGING +SLEDS +SLEEK +SLEEKED +SLEEKEN +SLEEKENED +SLEEKENING +SLEEKENS +SLEEKER +SLEEKERS +SLEEKEST +SLEEKIER +SLEEKIEST +SLEEKING +SLEEKIT +SLEEKLY +SLEEKNESS +SLEEKNESSES +SLEEKS +SLEEKY +SLEEP +SLEEPAWAY +SLEEPER +SLEEPERS +SLEEPIER +SLEEPIEST +SLEEPILY +SLEEPINESS +SLEEPINESSES +SLEEPING +SLEEPINGS +SLEEPLESS +SLEEPLESSLY +SLEEPLESSNESS +SLEEPLESSNESSES +SLEEPLIKE +SLEEPOVER +SLEEPOVERS +SLEEPS +SLEEPWALK +SLEEPWALKED +SLEEPWALKER +SLEEPWALKERS +SLEEPWALKING +SLEEPWALKS +SLEEPWEAR +SLEEPY +SLEEPYHEAD +SLEEPYHEADS +SLEET +SLEETED +SLEETIER +SLEETIEST +SLEETING +SLEETS +SLEETY +SLEEVE +SLEEVED +SLEEVELESS +SLEEVELET +SLEEVELETS +SLEEVES +SLEEVING +SLEIGH +SLEIGHED +SLEIGHER +SLEIGHERS +SLEIGHING +SLEIGHS +SLEIGHT +SLEIGHTS +SLENDER +SLENDERER +SLENDEREST +SLENDERIZE +SLENDERIZED +SLENDERIZES +SLENDERIZING +SLENDERLY +SLENDERNESS +SLENDERNESSES +SLEPT +SLEUTH +SLEUTHED +SLEUTHHOUND +SLEUTHHOUNDS +SLEUTHING +SLEUTHS +SLEW +SLEWED +SLEWING +SLEWS +SLICE +SLICEABLE +SLICED +SLICER +SLICERS +SLICES +SLICING +SLICK +SLICKED +SLICKEN +SLICKENED +SLICKENER +SLICKENERS +SLICKENING +SLICKENS +SLICKENSIDE +SLICKENSIDES +SLICKER +SLICKERS +SLICKEST +SLICKING +SLICKLY +SLICKNESS +SLICKNESSES +SLICKROCK +SLICKROCKS +SLICKS +SLICKSTER +SLICKSTERS +SLID +SLIDABLE +SLIDDEN +SLIDE +SLIDER +SLIDERS +SLIDES +SLIDEWAY +SLIDEWAYS +SLIDING +SLIER +SLIEST +SLIEVE +SLIEVES +SLIGHT +SLIGHTED +SLIGHTER +SLIGHTERS +SLIGHTEST +SLIGHTING +SLIGHTINGLY +SLIGHTLY +SLIGHTNESS +SLIGHTNESSES +SLIGHTS +SLILY +SLIM +SLIME +SLIMEBALL +SLIMEBALLS +SLIMED +SLIMES +SLIMIER +SLIMIEST +SLIMILY +SLIMINESS +SLIMINESSES +SLIMING +SLIMLY +SLIMMED +SLIMMER +SLIMMERS +SLIMMEST +SLIMMING +SLIMNASTICS +SLIMNESS +SLIMNESSES +SLIMPSIER +SLIMPSIEST +SLIMPSY +SLIMS +SLIMSIER +SLIMSIEST +SLIMSY +SLIMY +SLING +SLINGBACK +SLINGBACKS +SLINGER +SLINGERS +SLINGING +SLINGS +SLINGSHOT +SLINGSHOTS +SLINK +SLINKED +SLINKIER +SLINKIEST +SLINKILY +SLINKINESS +SLINKINESSES +SLINKING +SLINKS +SLINKY +SLIP +SLIPCASE +SLIPCASED +SLIPCASES +SLIPCOVER +SLIPCOVERED +SLIPCOVERING +SLIPCOVERS +SLIPDRESS +SLIPDRESSES +SLIPE +SLIPED +SLIPES +SLIPFORM +SLIPFORMED +SLIPFORMING +SLIPFORMS +SLIPING +SLIPKNOT +SLIPKNOTS +SLIPLESS +SLIPOUT +SLIPOUTS +SLIPOVER +SLIPOVERS +SLIPPAGE +SLIPPAGES +SLIPPED +SLIPPER +SLIPPERED +SLIPPERIER +SLIPPERIEST +SLIPPERINESS +SLIPPERINESSES +SLIPPERS +SLIPPERY +SLIPPIER +SLIPPIEST +SLIPPILY +SLIPPING +SLIPPY +SLIPS +SLIPSHEET +SLIPSHEETED +SLIPSHEETING +SLIPSHEETS +SLIPSHOD +SLIPSLOP +SLIPSLOPS +SLIPSOLE +SLIPSOLES +SLIPSTREAM +SLIPSTREAMED +SLIPSTREAMING +SLIPSTREAMS +SLIPT +SLIPUP +SLIPUPS +SLIPWARE +SLIPWARES +SLIPWAY +SLIPWAYS +SLIT +SLITHER +SLITHERED +SLITHERING +SLITHERS +SLITHERY +SLITLESS +SLITLIKE +SLITS +SLITTED +SLITTER +SLITTERS +SLITTIER +SLITTIEST +SLITTING +SLITTY +SLIVER +SLIVERED +SLIVERER +SLIVERERS +SLIVERING +SLIVERS +SLIVOVIC +SLIVOVICES +SLIVOVITZ +SLIVOVITZES +SLOB +SLOBBER +SLOBBERED +SLOBBERER +SLOBBERERS +SLOBBERING +SLOBBERS +SLOBBERY +SLOBBIER +SLOBBIEST +SLOBBISH +SLOBBY +SLOBS +SLOE +SLOES +SLOG +SLOGAN +SLOGANEER +SLOGANEERED +SLOGANEERING +SLOGANEERS +SLOGANIZE +SLOGANIZED +SLOGANIZES +SLOGANIZING +SLOGANS +SLOGGED +SLOGGER +SLOGGERS +SLOGGING +SLOGS +SLOID +SLOIDS +SLOJD +SLOJDS +SLOOP +SLOOPS +SLOP +SLOPE +SLOPED +SLOPER +SLOPERS +SLOPES +SLOPING +SLOPINGLY +SLOPPED +SLOPPIER +SLOPPIEST +SLOPPILY +SLOPPINESS +SLOPPINESSES +SLOPPING +SLOPPY +SLOPS +SLOPWORK +SLOPWORKS +SLOSH +SLOSHED +SLOSHES +SLOSHIER +SLOSHIEST +SLOSHING +SLOSHY +SLOT +SLOTBACK +SLOTBACKS +SLOTH +SLOTHFUL +SLOTHFULLY +SLOTHFULNESS +SLOTHFULNESSES +SLOTHS +SLOTS +SLOTTED +SLOTTER +SLOTTERS +SLOTTING +SLOUCH +SLOUCHED +SLOUCHER +SLOUCHERS +SLOUCHES +SLOUCHIER +SLOUCHIEST +SLOUCHILY +SLOUCHINESS +SLOUCHINESSES +SLOUCHING +SLOUCHY +SLOUGH +SLOUGHED +SLOUGHIER +SLOUGHIEST +SLOUGHING +SLOUGHS +SLOUGHY +SLOVEN +SLOVENLIER +SLOVENLIEST +SLOVENLINESS +SLOVENLINESSES +SLOVENLY +SLOVENS +SLOW +SLOWDOWN +SLOWDOWNS +SLOWED +SLOWER +SLOWEST +SLOWING +SLOWISH +SLOWLY +SLOWNESS +SLOWNESSES +SLOWPOKE +SLOWPOKES +SLOWS +SLOWWORM +SLOWWORMS +SLOYD +SLOYDS +SLUB +SLUBBED +SLUBBER +SLUBBERED +SLUBBERING +SLUBBERS +SLUBBING +SLUBBINGS +SLUBS +SLUDGE +SLUDGED +SLUDGES +SLUDGIER +SLUDGIEST +SLUDGING +SLUDGY +SLUE +SLUED +SLUES +SLUFF +SLUFFED +SLUFFING +SLUFFS +SLUG +SLUGABED +SLUGABEDS +SLUGFEST +SLUGFESTS +SLUGGARD +SLUGGARDLY +SLUGGARDNESS +SLUGGARDNESSES +SLUGGARDS +SLUGGED +SLUGGER +SLUGGERS +SLUGGING +SLUGGISH +SLUGGISHLY +SLUGGISHNESS +SLUGGISHNESSES +SLUGS +SLUICE +SLUICED +SLUICES +SLUICEWAY +SLUICEWAYS +SLUICING +SLUICY +SLUING +SLUM +SLUMBER +SLUMBERED +SLUMBERER +SLUMBERERS +SLUMBERING +SLUMBEROUS +SLUMBERS +SLUMBERY +SLUMBROUS +SLUMGULLION +SLUMGULLIONS +SLUMGUM +SLUMGUMS +SLUMISM +SLUMISMS +SLUMLORD +SLUMLORDS +SLUMMED +SLUMMER +SLUMMERS +SLUMMIER +SLUMMIEST +SLUMMING +SLUMMY +SLUMP +SLUMPED +SLUMPFLATION +SLUMPFLATIONS +SLUMPING +SLUMPS +SLUMS +SLUNG +SLUNGSHOT +SLUNGSHOTS +SLUNK +SLUR +SLURB +SLURBAN +SLURBS +SLURP +SLURPED +SLURPING +SLURPS +SLURRED +SLURRIED +SLURRIES +SLURRING +SLURRY +SLURRYING +SLURS +SLUSH +SLUSHED +SLUSHES +SLUSHIER +SLUSHIEST +SLUSHILY +SLUSHINESS +SLUSHINESSES +SLUSHING +SLUSHY +SLUT +SLUTS +SLUTTIER +SLUTTIEST +SLUTTISH +SLUTTISHLY +SLUTTISHNESS +SLUTTISHNESSES +SLUTTY +SLY +SLYBOOTS +SLYER +SLYEST +SLYLY +SLYNESS +SLYNESSES +SLYPE +SLYPES +SMACK +SMACKED +SMACKER +SMACKERS +SMACKING +SMACKS +SMALL +SMALLAGE +SMALLAGES +SMALLCLOTHES +SMALLER +SMALLEST +SMALLHOLDER +SMALLHOLDERS +SMALLHOLDING +SMALLHOLDINGS +SMALLISH +SMALLMOUTH +SMALLMOUTHS +SMALLNESS +SMALLNESSES +SMALLPOX +SMALLPOXES +SMALLS +SMALLSWORD +SMALLSWORDS +SMALLTIME +SMALT +SMALTI +SMALTINE +SMALTINES +SMALTITE +SMALTITES +SMALTO +SMALTOS +SMALTS +SMARAGD +SMARAGDE +SMARAGDES +SMARAGDINE +SMARAGDITE +SMARAGDITES +SMARAGDS +SMARM +SMARMIER +SMARMIEST +SMARMILY +SMARMINESS +SMARMINESSES +SMARMS +SMARMY +SMART +SMARTASS +SMARTASSES +SMARTED +SMARTEN +SMARTENED +SMARTENING +SMARTENS +SMARTER +SMARTEST +SMARTIE +SMARTIES +SMARTING +SMARTLY +SMARTNESS +SMARTNESSES +SMARTS +SMARTWEED +SMARTWEEDS +SMARTY +SMASH +SMASHED +SMASHER +SMASHERS +SMASHES +SMASHING +SMASHINGLY +SMASHUP +SMASHUPS +SMATTER +SMATTERED +SMATTERER +SMATTERERS +SMATTERING +SMATTERINGS +SMATTERS +SMAZE +SMAZES +SMEAR +SMEARCASE +SMEARCASES +SMEARED +SMEARER +SMEARERS +SMEARIER +SMEARIEST +SMEARING +SMEARS +SMEARY +SMECTIC +SMECTITE +SMECTITES +SMECTITIC +SMEDDUM +SMEDDUMS +SMEEK +SMEEKED +SMEEKING +SMEEKS +SMEGMA +SMEGMAS +SMELL +SMELLED +SMELLER +SMELLERS +SMELLIER +SMELLIEST +SMELLING +SMELLS +SMELLY +SMELT +SMELTED +SMELTER +SMELTERIES +SMELTERS +SMELTERY +SMELTING +SMELTS +SMERK +SMERKED +SMERKING +SMERKS +SMEW +SMEWS +SMIDGE +SMIDGEN +SMIDGENS +SMIDGEON +SMIDGEONS +SMIDGES +SMIDGIN +SMIDGINS +SMIERCASE +SMIERCASES +SMILAX +SMILAXES +SMILE +SMILED +SMILELESS +SMILER +SMILERS +SMILES +SMILEY +SMILEYS +SMILING +SMILINGLY +SMIRCH +SMIRCHED +SMIRCHES +SMIRCHING +SMIRK +SMIRKED +SMIRKER +SMIRKERS +SMIRKIER +SMIRKIEST +SMIRKILY +SMIRKING +SMIRKS +SMIRKY +SMIT +SMITE +SMITER +SMITERS +SMITES +SMITH +SMITHEREENS +SMITHERIES +SMITHERS +SMITHERY +SMITHIES +SMITHS +SMITHSONITE +SMITHSONITES +SMITHY +SMITING +SMITTEN +SMOCK +SMOCKED +SMOCKING +SMOCKINGS +SMOCKS +SMOG +SMOGGIER +SMOGGIEST +SMOGGY +SMOGLESS +SMOGS +SMOKABLE +SMOKE +SMOKEABLE +SMOKED +SMOKEHOUSE +SMOKEHOUSES +SMOKEJACK +SMOKEJACKS +SMOKELESS +SMOKELIKE +SMOKEPOT +SMOKEPOTS +SMOKER +SMOKERS +SMOKES +SMOKESTACK +SMOKESTACKS +SMOKEY +SMOKIER +SMOKIEST +SMOKILY +SMOKINESS +SMOKINESSES +SMOKING +SMOKY +SMOLDER +SMOLDERED +SMOLDERING +SMOLDERS +SMOLT +SMOLTS +SMOOCH +SMOOCHED +SMOOCHER +SMOOCHERS +SMOOCHES +SMOOCHING +SMOOCHY +SMOOSH +SMOOSHED +SMOOSHES +SMOOSHING +SMOOTH +SMOOTHBORE +SMOOTHBORES +SMOOTHED +SMOOTHEN +SMOOTHENED +SMOOTHENING +SMOOTHENS +SMOOTHER +SMOOTHERS +SMOOTHES +SMOOTHEST +SMOOTHIE +SMOOTHIES +SMOOTHING +SMOOTHLY +SMOOTHNESS +SMOOTHNESSES +SMOOTHS +SMOOTHY +SMORGASBORD +SMORGASBORDS +SMOTE +SMOTHER +SMOTHERED +SMOTHERER +SMOTHERERS +SMOTHERING +SMOTHERS +SMOTHERY +SMOULDER +SMOULDERED +SMOULDERING +SMOULDERS +SMUDGE +SMUDGED +SMUDGES +SMUDGIER +SMUDGIEST +SMUDGILY +SMUDGINESS +SMUDGINESSES +SMUDGING +SMUDGY +SMUG +SMUGGER +SMUGGEST +SMUGGLE +SMUGGLED +SMUGGLER +SMUGGLERS +SMUGGLES +SMUGGLING +SMUGLY +SMUGNESS +SMUGNESSES +SMUSH +SMUSHED +SMUSHES +SMUSHING +SMUT +SMUTCH +SMUTCHED +SMUTCHES +SMUTCHIER +SMUTCHIEST +SMUTCHING +SMUTCHY +SMUTS +SMUTTED +SMUTTIER +SMUTTIEST +SMUTTILY +SMUTTINESS +SMUTTINESSES +SMUTTING +SMUTTY +SNACK +SNACKED +SNACKER +SNACKERS +SNACKING +SNACKS +SNAFFLE +SNAFFLED +SNAFFLES +SNAFFLING +SNAFU +SNAFUED +SNAFUING +SNAFUS +SNAG +SNAGGED +SNAGGIER +SNAGGIEST +SNAGGING +SNAGGLETEETH +SNAGGLETOOTH +SNAGGLETOOTHED +SNAGGY +SNAGLIKE +SNAGS +SNAIL +SNAILED +SNAILING +SNAILLIKE +SNAILS +SNAKE +SNAKEBIRD +SNAKEBIRDS +SNAKEBIT +SNAKEBITE +SNAKEBITES +SNAKEBITTEN +SNAKED +SNAKEFISH +SNAKEFISHES +SNAKEHEAD +SNAKEHEADS +SNAKELIKE +SNAKEPIT +SNAKEPITS +SNAKEROOT +SNAKEROOTS +SNAKES +SNAKESKIN +SNAKESKINS +SNAKEWEED +SNAKEWEEDS +SNAKEY +SNAKIER +SNAKIEST +SNAKILY +SNAKINESS +SNAKINESSES +SNAKING +SNAKY +SNAP +SNAPBACK +SNAPBACKS +SNAPDRAGON +SNAPDRAGONS +SNAPLESS +SNAPPED +SNAPPER +SNAPPERS +SNAPPIER +SNAPPIEST +SNAPPILY +SNAPPINESS +SNAPPINESSES +SNAPPING +SNAPPISH +SNAPPISHLY +SNAPPISHNESS +SNAPPISHNESSES +SNAPPY +SNAPS +SNAPSHOOTER +SNAPSHOOTERS +SNAPSHOT +SNAPSHOTS +SNAPSHOTTED +SNAPSHOTTING +SNAPWEED +SNAPWEEDS +SNARE +SNARED +SNARER +SNARERS +SNARES +SNARF +SNARFED +SNARFING +SNARFS +SNARING +SNARK +SNARKIER +SNARKIEST +SNARKILY +SNARKS +SNARKY +SNARL +SNARLED +SNARLER +SNARLERS +SNARLIER +SNARLIEST +SNARLING +SNARLS +SNARLY +SNASH +SNASHES +SNATCH +SNATCHED +SNATCHER +SNATCHERS +SNATCHES +SNATCHIER +SNATCHIEST +SNATCHING +SNATCHY +SNATH +SNATHE +SNATHES +SNATHS +SNAW +SNAWED +SNAWING +SNAWS +SNAZZIER +SNAZZIEST +SNAZZY +SNEAK +SNEAKED +SNEAKER +SNEAKERED +SNEAKERS +SNEAKIER +SNEAKIEST +SNEAKILY +SNEAKINESS +SNEAKINESSES +SNEAKING +SNEAKINGLY +SNEAKS +SNEAKY +SNEAP +SNEAPED +SNEAPING +SNEAPS +SNECK +SNECKS +SNED +SNEDDED +SNEDDING +SNEDS +SNEER +SNEERED +SNEERER +SNEERERS +SNEERFUL +SNEERIER +SNEERIEST +SNEERING +SNEERS +SNEERY +SNEESH +SNEESHES +SNEEZE +SNEEZED +SNEEZER +SNEEZERS +SNEEZES +SNEEZEWEED +SNEEZEWEEDS +SNEEZIER +SNEEZIEST +SNEEZING +SNEEZY +SNELL +SNELLED +SNELLER +SNELLEST +SNELLING +SNELLS +SNIB +SNIBBED +SNIBBING +SNIBS +SNICK +SNICKED +SNICKER +SNICKERED +SNICKERER +SNICKERERS +SNICKERING +SNICKERS +SNICKERSNEE +SNICKERSNEES +SNICKERY +SNICKING +SNICKS +SNIDE +SNIDELY +SNIDENESS +SNIDENESSES +SNIDER +SNIDEST +SNIFF +SNIFFABLE +SNIFFED +SNIFFER +SNIFFERS +SNIFFIER +SNIFFIEST +SNIFFILY +SNIFFINESS +SNIFFINESSES +SNIFFING +SNIFFISH +SNIFFISHLY +SNIFFISHNESS +SNIFFISHNESSES +SNIFFLE +SNIFFLED +SNIFFLER +SNIFFLERS +SNIFFLES +SNIFFLING +SNIFFLY +SNIFFS +SNIFFY +SNIFTER +SNIFTERS +SNIGGER +SNIGGERED +SNIGGERER +SNIGGERERS +SNIGGERING +SNIGGERS +SNIGGLE +SNIGGLED +SNIGGLER +SNIGGLERS +SNIGGLES +SNIGGLING +SNIGLET +SNIGLETS +SNIP +SNIPE +SNIPED +SNIPER +SNIPERS +SNIPERSCOPE +SNIPERSCOPES +SNIPES +SNIPING +SNIPPED +SNIPPER +SNIPPERS +SNIPPERSNAPPER +SNIPPERSNAPPERS +SNIPPET +SNIPPETIER +SNIPPETIEST +SNIPPETS +SNIPPETY +SNIPPIER +SNIPPIEST +SNIPPILY +SNIPPING +SNIPPY +SNIPS +SNIT +SNITCH +SNITCHED +SNITCHER +SNITCHERS +SNITCHES +SNITCHING +SNITS +SNIVEL +SNIVELED +SNIVELER +SNIVELERS +SNIVELING +SNIVELLED +SNIVELLER +SNIVELLERS +SNIVELLING +SNIVELS +SNOB +SNOBBERIES +SNOBBERY +SNOBBIER +SNOBBIEST +SNOBBILY +SNOBBISH +SNOBBISHLY +SNOBBISHNESS +SNOBBISHNESSES +SNOBBISM +SNOBBISMS +SNOBBY +SNOBS +SNOG +SNOGGED +SNOGGING +SNOGS +SNOLLYGOSTER +SNOLLYGOSTERS +SNOOD +SNOODED +SNOODING +SNOODS +SNOOK +SNOOKED +SNOOKER +SNOOKERED +SNOOKERING +SNOOKERS +SNOOKING +SNOOKS +SNOOL +SNOOLED +SNOOLING +SNOOLS +SNOOP +SNOOPED +SNOOPER +SNOOPERS +SNOOPIER +SNOOPIEST +SNOOPILY +SNOOPING +SNOOPS +SNOOPY +SNOOT +SNOOTED +SNOOTIER +SNOOTIEST +SNOOTILY +SNOOTINESS +SNOOTINESSES +SNOOTING +SNOOTS +SNOOTY +SNOOZE +SNOOZED +SNOOZER +SNOOZERS +SNOOZES +SNOOZIER +SNOOZIEST +SNOOZING +SNOOZLE +SNOOZLED +SNOOZLES +SNOOZLING +SNOOZY +SNORE +SNORED +SNORER +SNORERS +SNORES +SNORING +SNORKEL +SNORKELED +SNORKELER +SNORKELERS +SNORKELING +SNORKELS +SNORT +SNORTED +SNORTER +SNORTERS +SNORTING +SNORTS +SNOT +SNOTS +SNOTTIER +SNOTTIEST +SNOTTILY +SNOTTINESS +SNOTTINESSES +SNOTTY +SNOUT +SNOUTED +SNOUTIER +SNOUTIEST +SNOUTING +SNOUTISH +SNOUTS +SNOUTY +SNOW +SNOWBALL +SNOWBALLED +SNOWBALLING +SNOWBALLS +SNOWBANK +SNOWBANKS +SNOWBELL +SNOWBELLS +SNOWBELT +SNOWBELTS +SNOWBERRIES +SNOWBERRY +SNOWBIRD +SNOWBIRDS +SNOWBLINK +SNOWBLINKS +SNOWBLOWER +SNOWBLOWERS +SNOWBOARD +SNOWBOARDED +SNOWBOARDER +SNOWBOARDERS +SNOWBOARDING +SNOWBOARDINGS +SNOWBOARDS +SNOWBOUND +SNOWBRUSH +SNOWBRUSHES +SNOWBUSH +SNOWBUSHES +SNOWCAP +SNOWCAPPED +SNOWCAPS +SNOWCAT +SNOWCATS +SNOWDRIFT +SNOWDRIFTS +SNOWDROP +SNOWDROPS +SNOWED +SNOWFALL +SNOWFALLS +SNOWFIELD +SNOWFIELDS +SNOWFLAKE +SNOWFLAKES +SNOWIER +SNOWIEST +SNOWILY +SNOWINESS +SNOWINESSES +SNOWING +SNOWLAND +SNOWLANDS +SNOWLESS +SNOWLIKE +SNOWMAKER +SNOWMAKERS +SNOWMAKING +SNOWMAN +SNOWMELT +SNOWMELTS +SNOWMEN +SNOWMOBILE +SNOWMOBILER +SNOWMOBILERS +SNOWMOBILES +SNOWMOBILING +SNOWMOBILINGS +SNOWMOBILIST +SNOWMOBILISTS +SNOWMOLD +SNOWMOLDS +SNOWPACK +SNOWPACKS +SNOWPLOW +SNOWPLOWED +SNOWPLOWING +SNOWPLOWS +SNOWS +SNOWSCAPE +SNOWSCAPES +SNOWSHED +SNOWSHEDS +SNOWSHOE +SNOWSHOED +SNOWSHOEING +SNOWSHOER +SNOWSHOERS +SNOWSHOES +SNOWSLIDE +SNOWSLIDES +SNOWSTORM +SNOWSTORMS +SNOWSUIT +SNOWSUITS +SNOWY +SNUB +SNUBBED +SNUBBER +SNUBBERS +SNUBBIER +SNUBBIEST +SNUBBINESS +SNUBBINESSES +SNUBBING +SNUBBY +SNUBNESS +SNUBNESSES +SNUBS +SNUCK +SNUFF +SNUFFBOX +SNUFFBOXES +SNUFFED +SNUFFER +SNUFFERS +SNUFFIER +SNUFFIEST +SNUFFILY +SNUFFING +SNUFFLE +SNUFFLED +SNUFFLER +SNUFFLERS +SNUFFLES +SNUFFLIER +SNUFFLIEST +SNUFFLING +SNUFFLY +SNUFFS +SNUFFY +SNUG +SNUGGED +SNUGGER +SNUGGERIE +SNUGGERIES +SNUGGERY +SNUGGEST +SNUGGIES +SNUGGING +SNUGGLE +SNUGGLED +SNUGGLES +SNUGGLING +SNUGLY +SNUGNESS +SNUGNESSES +SNUGS +SNYE +SNYES +SO +SOAK +SOAKAGE +SOAKAGES +SOAKED +SOAKER +SOAKERS +SOAKING +SOAKS +SOAP +SOAPBARK +SOAPBARKS +SOAPBERRIES +SOAPBERRY +SOAPBOX +SOAPBOXED +SOAPBOXES +SOAPBOXING +SOAPED +SOAPER +SOAPERS +SOAPIER +SOAPIEST +SOAPILY +SOAPINESS +SOAPINESSES +SOAPING +SOAPLESS +SOAPLIKE +SOAPS +SOAPSTONE +SOAPSTONES +SOAPSUDS +SOAPSUDSY +SOAPWORT +SOAPWORTS +SOAPY +SOAR +SOARED +SOARER +SOARERS +SOARING +SOARINGLY +SOARINGS +SOARS +SOAVE +SOAVES +SOB +SOBA +SOBAS +SOBBED +SOBBER +SOBBERS +SOBBING +SOBBINGLY +SOBEIT +SOBER +SOBERED +SOBERER +SOBEREST +SOBERING +SOBERIZE +SOBERIZED +SOBERIZES +SOBERIZING +SOBERLY +SOBERNESS +SOBERNESSES +SOBERS +SOBERSIDED +SOBERSIDEDNESS +SOBERSIDES +SOBFUL +SOBRIETIES +SOBRIETY +SOBRIQUET +SOBRIQUETS +SOBS +SOCA +SOCAGE +SOCAGER +SOCAGERS +SOCAGES +SOCAS +SOCCAGE +SOCCAGES +SOCCER +SOCCERS +SOCIABILITIES +SOCIABILITY +SOCIABLE +SOCIABLENESS +SOCIABLENESSES +SOCIABLES +SOCIABLY +SOCIAL +SOCIALISE +SOCIALISED +SOCIALISES +SOCIALISING +SOCIALISM +SOCIALISMS +SOCIALIST +SOCIALISTIC +SOCIALISTICALLY +SOCIALISTS +SOCIALITE +SOCIALITES +SOCIALITIES +SOCIALITY +SOCIALIZATION +SOCIALIZATIONS +SOCIALIZE +SOCIALIZED +SOCIALIZER +SOCIALIZERS +SOCIALIZES +SOCIALIZING +SOCIALLY +SOCIALS +SOCIETAL +SOCIETALLY +SOCIETIES +SOCIETY +SOCIOBIOLOGICAL +SOCIOBIOLOGIES +SOCIOBIOLOGIST +SOCIOBIOLOGISTS +SOCIOBIOLOGY +SOCIOCULTURAL +SOCIOCULTURALLY +SOCIOECONOMIC +SOCIOGRAM +SOCIOGRAMS +SOCIOHISTORICAL +SOCIOLECT +SOCIOLECTS +SOCIOLINGUIST +SOCIOLINGUISTIC +SOCIOLINGUISTS +SOCIOLOGESE +SOCIOLOGESES +SOCIOLOGIC +SOCIOLOGICAL +SOCIOLOGICALLY +SOCIOLOGIES +SOCIOLOGIST +SOCIOLOGISTS +SOCIOLOGY +SOCIOMETRIC +SOCIOMETRIES +SOCIOMETRY +SOCIOPATH +SOCIOPATHIC +SOCIOPATHS +SOCIOPOLITICAL +SOCIORELIGIOUS +SOCIOSEXUAL +SOCK +SOCKDOLAGER +SOCKDOLAGERS +SOCKDOLOGER +SOCKDOLOGERS +SOCKED +SOCKET +SOCKETED +SOCKETING +SOCKETS +SOCKEYE +SOCKEYES +SOCKING +SOCKLESS +SOCKMAN +SOCKMEN +SOCKO +SOCKS +SOCLE +SOCLES +SOCMAN +SOCMEN +SOD +SODA +SODALESS +SODALIST +SODALISTS +SODALITE +SODALITES +SODALITIES +SODALITY +SODAMIDE +SODAMIDES +SODAS +SODBUSTER +SODBUSTERS +SODDED +SODDEN +SODDENED +SODDENING +SODDENLY +SODDENNESS +SODDENNESSES +SODDENS +SODDIES +SODDING +SODDY +SODIC +SODIUM +SODIUMS +SODOM +SODOMIES +SODOMIST +SODOMISTS +SODOMITE +SODOMITES +SODOMITIC +SODOMITICAL +SODOMIZE +SODOMIZED +SODOMIZES +SODOMIZING +SODOMS +SODOMY +SODS +SOEVER +SOFA +SOFABED +SOFABEDS +SOFAR +SOFARS +SOFAS +SOFFIT +SOFFITS +SOFT +SOFTA +SOFTAS +SOFTBACK +SOFTBACKS +SOFTBALL +SOFTBALLER +SOFTBALLERS +SOFTBALLS +SOFTBOUND +SOFTBOUNDS +SOFTCORE +SOFTCOVER +SOFTCOVERS +SOFTEN +SOFTENED +SOFTENER +SOFTENERS +SOFTENING +SOFTENS +SOFTER +SOFTEST +SOFTGOODS +SOFTHEAD +SOFTHEADED +SOFTHEADEDLY +SOFTHEADEDNESS +SOFTHEADS +SOFTHEARTED +SOFTHEARTEDLY +SOFTHEARTEDNESS +SOFTIE +SOFTIES +SOFTISH +SOFTLY +SOFTNESS +SOFTNESSES +SOFTS +SOFTSHELL +SOFTSHELLS +SOFTWARE +SOFTWARES +SOFTWOOD +SOFTWOODS +SOFTY +SOGGED +SOGGIER +SOGGIEST +SOGGILY +SOGGINESS +SOGGINESSES +SOGGY +SOIGNE +SOIGNEE +SOIL +SOILAGE +SOILAGES +SOILBORNE +SOILED +SOILING +SOILLESS +SOILS +SOILURE +SOILURES +SOIREE +SOIREES +SOJA +SOJAS +SOJOURN +SOJOURNED +SOJOURNER +SOJOURNERS +SOJOURNING +SOJOURNS +SOKE +SOKEMAN +SOKEMEN +SOKES +SOKOL +SOKOLS +SOL +SOLA +SOLACE +SOLACED +SOLACEMENT +SOLACEMENTS +SOLACER +SOLACERS +SOLACES +SOLACING +SOLAN +SOLANACEOUS +SOLAND +SOLANDER +SOLANDERS +SOLANDS +SOLANIN +SOLANINE +SOLANINES +SOLANINS +SOLANO +SOLANOS +SOLANS +SOLANUM +SOLANUMS +SOLAR +SOLARIA +SOLARISE +SOLARISED +SOLARISES +SOLARISING +SOLARISM +SOLARISMS +SOLARIUM +SOLARIUMS +SOLARIZATION +SOLARIZATIONS +SOLARIZE +SOLARIZED +SOLARIZES +SOLARIZING +SOLATE +SOLATED +SOLATES +SOLATIA +SOLATING +SOLATION +SOLATIONS +SOLATIUM +SOLD +SOLDAN +SOLDANS +SOLDER +SOLDERABILITIES +SOLDERABILITY +SOLDERED +SOLDERER +SOLDERERS +SOLDERING +SOLDERS +SOLDI +SOLDIER +SOLDIERED +SOLDIERIES +SOLDIERING +SOLDIERINGS +SOLDIERLY +SOLDIERS +SOLDIERSHIP +SOLDIERSHIPS +SOLDIERY +SOLDO +SOLE +SOLECISE +SOLECISED +SOLECISES +SOLECISING +SOLECISM +SOLECISMS +SOLECIST +SOLECISTIC +SOLECISTS +SOLECIZE +SOLECIZED +SOLECIZES +SOLECIZING +SOLED +SOLEI +SOLELESS +SOLELY +SOLEMN +SOLEMNER +SOLEMNEST +SOLEMNIFIED +SOLEMNIFIES +SOLEMNIFY +SOLEMNIFYING +SOLEMNITIES +SOLEMNITY +SOLEMNIZATION +SOLEMNIZATIONS +SOLEMNIZE +SOLEMNIZED +SOLEMNIZES +SOLEMNIZING +SOLEMNLY +SOLEMNNESS +SOLEMNNESSES +SOLENESS +SOLENESSES +SOLENODON +SOLENODONS +SOLENOID +SOLENOIDAL +SOLENOIDS +SOLEPLATE +SOLEPLATES +SOLEPRINT +SOLEPRINTS +SOLERET +SOLERETS +SOLES +SOLEUS +SOLEUSES +SOLFATARA +SOLFATARAS +SOLFEGE +SOLFEGES +SOLFEGGI +SOLFEGGIO +SOLFEGGIOS +SOLFERINO +SOLFERINOS +SOLGEL +SOLI +SOLICIT +SOLICITANT +SOLICITANTS +SOLICITATION +SOLICITATIONS +SOLICITED +SOLICITING +SOLICITOR +SOLICITORS +SOLICITORSHIP +SOLICITORSHIPS +SOLICITOUS +SOLICITOUSLY +SOLICITOUSNESS +SOLICITS +SOLICITUDE +SOLICITUDES +SOLID +SOLIDAGO +SOLIDAGOS +SOLIDARISM +SOLIDARISMS +SOLIDARIST +SOLIDARISTIC +SOLIDARISTS +SOLIDARITIES +SOLIDARITY +SOLIDARY +SOLIDER +SOLIDEST +SOLIDI +SOLIDIFICATION +SOLIDIFICATIONS +SOLIDIFIED +SOLIDIFIES +SOLIDIFY +SOLIDIFYING +SOLIDITIES +SOLIDITY +SOLIDLY +SOLIDNESS +SOLIDNESSES +SOLIDS +SOLIDUS +SOLIFLUCTION +SOLIFLUCTIONS +SOLILOQUIES +SOLILOQUISE +SOLILOQUISED +SOLILOQUISES +SOLILOQUISING +SOLILOQUIST +SOLILOQUISTS +SOLILOQUIZE +SOLILOQUIZED +SOLILOQUIZER +SOLILOQUIZERS +SOLILOQUIZES +SOLILOQUIZING +SOLILOQUY +SOLING +SOLION +SOLIONS +SOLIPSISM +SOLIPSISMS +SOLIPSIST +SOLIPSISTIC +SOLIPSISTICALLY +SOLIPSISTS +SOLIQUID +SOLIQUIDS +SOLITAIRE +SOLITAIRES +SOLITARIES +SOLITARILY +SOLITARINESS +SOLITARINESSES +SOLITARY +SOLITON +SOLITONS +SOLITUDE +SOLITUDES +SOLITUDINARIAN +SOLITUDINARIANS +SOLLERET +SOLLERETS +SOLMIZATION +SOLMIZATIONS +SOLO +SOLOED +SOLOING +SOLOIST +SOLOISTIC +SOLOISTS +SOLON +SOLONCHAK +SOLONCHAKS +SOLONETS +SOLONETSES +SOLONETZ +SOLONETZES +SOLONETZIC +SOLONS +SOLOS +SOLS +SOLSTICE +SOLSTICES +SOLSTITIAL +SOLUBILISE +SOLUBILISED +SOLUBILISES +SOLUBILISING +SOLUBILITIES +SOLUBILITY +SOLUBILIZATION +SOLUBILIZATIONS +SOLUBILIZE +SOLUBILIZED +SOLUBILIZES +SOLUBILIZING +SOLUBLE +SOLUBLES +SOLUBLY +SOLUM +SOLUMS +SOLUNAR +SOLUS +SOLUTE +SOLUTES +SOLUTION +SOLUTIONS +SOLVABILITIES +SOLVABILITY +SOLVABLE +SOLVATE +SOLVATED +SOLVATES +SOLVATING +SOLVATION +SOLVATIONS +SOLVE +SOLVED +SOLVENCIES +SOLVENCY +SOLVENT +SOLVENTLESS +SOLVENTLY +SOLVENTS +SOLVER +SOLVERS +SOLVES +SOLVING +SOLVOLYSES +SOLVOLYSIS +SOLVOLYTIC +SOM +SOMA +SOMAN +SOMANS +SOMAS +SOMATA +SOMATIC +SOMATICALLY +SOMATOLOGICAL +SOMATOLOGIES +SOMATOLOGY +SOMATOMEDIN +SOMATOMEDINS +SOMATOPLEURE +SOMATOPLEURES +SOMATOSENSORY +SOMATOSTATIN +SOMATOSTATINS +SOMATOTROPHIN +SOMATOTROPHINS +SOMATOTROPIN +SOMATOTROPINS +SOMATOTYPE +SOMATOTYPES +SOMBER +SOMBERLY +SOMBERNESS +SOMBERNESSES +SOMBRE +SOMBRELY +SOMBRERO +SOMBREROS +SOMBROUS +SOME +SOMEBODIES +SOMEBODY +SOMEDAY +SOMEDEAL +SOMEHOW +SOMEONE +SOMEONES +SOMEPLACE +SOMEPLACES +SOMERSAULT +SOMERSAULTED +SOMERSAULTING +SOMERSAULTS +SOMERSET +SOMERSETED +SOMERSETING +SOMERSETS +SOMERSETTED +SOMERSETTING +SOMETHING +SOMETHINGS +SOMETIME +SOMETIMES +SOMEWAY +SOMEWAYS +SOMEWHAT +SOMEWHATS +SOMEWHEN +SOMEWHERE +SOMEWHERES +SOMEWHITHER +SOMEWISE +SOMITAL +SOMITE +SOMITES +SOMITIC +SOMMELIER +SOMMELIERS +SOMNAMBULANT +SOMNAMBULATE +SOMNAMBULATED +SOMNAMBULATES +SOMNAMBULATING +SOMNAMBULATION +SOMNAMBULATIONS +SOMNAMBULISM +SOMNAMBULISMS +SOMNAMBULIST +SOMNAMBULISTIC +SOMNAMBULISTS +SOMNIFACIENT +SOMNIFACIENTS +SOMNIFEROUS +SOMNOLENCE +SOMNOLENCES +SOMNOLENT +SOMNOLENTLY +SOMONI +SOMS +SON +SONANCE +SONANCES +SONANT +SONANTAL +SONANTIC +SONANTS +SONAR +SONARMAN +SONARMEN +SONARS +SONATA +SONATAS +SONATINA +SONATINAS +SONATINE +SONDE +SONDER +SONDERS +SONDES +SONE +SONES +SONG +SONGBIRD +SONGBIRDS +SONGBOOK +SONGBOOKS +SONGFEST +SONGFESTS +SONGFUL +SONGFULLY +SONGFULNESS +SONGFULNESSES +SONGLESS +SONGLESSLY +SONGLIKE +SONGS +SONGSMITH +SONGSMITHS +SONGSTER +SONGSTERS +SONGSTRESS +SONGSTRESSES +SONGWRITER +SONGWRITERS +SONGWRITING +SONGWRITINGS +SONHOOD +SONHOODS +SONIC +SONICALLY +SONICATE +SONICATED +SONICATES +SONICATING +SONICATION +SONICATIONS +SONICATOR +SONICATORS +SONICS +SONLESS +SONLIKE +SONLY +SONNET +SONNETED +SONNETEER +SONNETEERING +SONNETEERINGS +SONNETEERS +SONNETING +SONNETIZE +SONNETIZED +SONNETIZES +SONNETIZING +SONNETS +SONNETTED +SONNETTING +SONNIES +SONNY +SONOBUOY +SONOBUOYS +SONOGRAM +SONOGRAMS +SONOGRAPHIES +SONOGRAPHY +SONORANT +SONORANTS +SONORITIES +SONORITY +SONOROUS +SONOROUSLY +SONOROUSNESS +SONOROUSNESSES +SONOVOX +SONOVOXES +SONS +SONSHIP +SONSHIPS +SONSIE +SONSIER +SONSIEST +SONSY +SOOCHONG +SOOCHONGS +SOOEY +SOOK +SOOKS +SOON +SOONER +SOONERS +SOONEST +SOOT +SOOTED +SOOTH +SOOTHE +SOOTHED +SOOTHER +SOOTHERS +SOOTHES +SOOTHEST +SOOTHFAST +SOOTHING +SOOTHINGLY +SOOTHINGNESS +SOOTHINGNESSES +SOOTHLY +SOOTHS +SOOTHSAID +SOOTHSAY +SOOTHSAYER +SOOTHSAYERS +SOOTHSAYING +SOOTHSAYINGS +SOOTHSAYS +SOOTIER +SOOTIEST +SOOTILY +SOOTINESS +SOOTINESSES +SOOTING +SOOTS +SOOTY +SOP +SOPAIPILLA +SOPAIPILLAS +SOPAPILLA +SOPAPILLAS +SOPH +SOPHIES +SOPHISM +SOPHISMS +SOPHIST +SOPHISTIC +SOPHISTICAL +SOPHISTICALLY +SOPHISTICATE +SOPHISTICATED +SOPHISTICATEDLY +SOPHISTICATES +SOPHISTICATING +SOPHISTICATION +SOPHISTICATIONS +SOPHISTRIES +SOPHISTRY +SOPHISTS +SOPHOMORE +SOPHOMORES +SOPHOMORIC +SOPHS +SOPHY +SOPITE +SOPITED +SOPITES +SOPITING +SOPOR +SOPORIFEROUS +SOPORIFIC +SOPORIFICS +SOPORS +SOPPED +SOPPIER +SOPPIEST +SOPPINESS +SOPPINESSES +SOPPING +SOPPY +SOPRANI +SOPRANINO +SOPRANINOS +SOPRANO +SOPRANOS +SOPS +SORA +SORAS +SORB +SORBABILITIES +SORBABILITY +SORBABLE +SORBATE +SORBATES +SORBED +SORBENT +SORBENTS +SORBET +SORBETS +SORBIC +SORBING +SORBITOL +SORBITOLS +SORBOSE +SORBOSES +SORBS +SORCERER +SORCERERS +SORCERESS +SORCERESSES +SORCERIES +SORCEROUS +SORCERY +SORD +SORDID +SORDIDLY +SORDIDNESS +SORDIDNESSES +SORDINE +SORDINES +SORDINI +SORDINO +SORDOR +SORDORS +SORDS +SORE +SORED +SOREHEAD +SOREHEADED +SOREHEADS +SOREL +SORELS +SORELY +SORENESS +SORENESSES +SORER +SORES +SOREST +SORGHO +SORGHOS +SORGHUM +SORGHUMS +SORGO +SORGOS +SORI +SORICINE +SORING +SORINGS +SORITES +SORITIC +SORN +SORNED +SORNER +SORNERS +SORNING +SORNS +SOROCHE +SOROCHES +SORORAL +SORORALLY +SORORATE +SORORATES +SORORITIES +SORORITY +SOROSES +SOROSIS +SOROSISES +SORPTION +SORPTIONS +SORPTIVE +SORREL +SORRELS +SORRIER +SORRIEST +SORRILY +SORRINESS +SORRINESSES +SORROW +SORROWED +SORROWER +SORROWERS +SORROWFUL +SORROWFULLY +SORROWFULNESS +SORROWFULNESSES +SORROWING +SORROWS +SORRY +SORT +SORTA +SORTABLE +SORTABLY +SORTED +SORTER +SORTERS +SORTIE +SORTIED +SORTIEING +SORTIES +SORTILEGE +SORTILEGES +SORTING +SORTITION +SORTITIONS +SORTS +SORUS +SOS +SOSTENUTI +SOSTENUTO +SOSTENUTOS +SOT +SOTERIOLOGICAL +SOTERIOLOGIES +SOTERIOLOGY +SOTH +SOTHS +SOTOL +SOTOLS +SOTS +SOTTED +SOTTEDLY +SOTTISH +SOTTISHLY +SOTTISHNESS +SOTTISHNESSES +SOU +SOUARI +SOUARIS +SOUBISE +SOUBISES +SOUBRETTE +SOUBRETTES +SOUBRIQUET +SOUBRIQUETS +SOUCAR +SOUCARS +SOUCHONG +SOUCHONGS +SOUDAN +SOUDANS +SOUFFLE +SOUFFLED +SOUFFLEED +SOUFFLES +SOUGH +SOUGHED +SOUGHING +SOUGHS +SOUGHT +SOUK +SOUKOUS +SOUKOUSES +SOUKS +SOUL +SOULED +SOULFUL +SOULFULLY +SOULFULNESS +SOULFULNESSES +SOULLESS +SOULLESSLY +SOULLESSNESS +SOULLESSNESSES +SOULLIKE +SOULMATE +SOULMATES +SOULS +SOUND +SOUNDABLE +SOUNDALIKE +SOUNDALIKES +SOUNDBOARD +SOUNDBOARDS +SOUNDBOX +SOUNDBOXES +SOUNDED +SOUNDER +SOUNDERS +SOUNDEST +SOUNDING +SOUNDINGLY +SOUNDINGS +SOUNDLESS +SOUNDLESSLY +SOUNDLY +SOUNDMAN +SOUNDMEN +SOUNDNESS +SOUNDNESSES +SOUNDPROOF +SOUNDPROOFED +SOUNDPROOFING +SOUNDPROOFS +SOUNDS +SOUNDSTAGE +SOUNDSTAGES +SOUP +SOUPCON +SOUPCONS +SOUPED +SOUPIER +SOUPIEST +SOUPING +SOUPLESS +SOUPLIKE +SOUPS +SOUPSPOON +SOUPSPOONS +SOUPY +SOUR +SOURBALL +SOURBALLS +SOURCE +SOURCEBOOK +SOURCEBOOKS +SOURCED +SOURCEFUL +SOURCELESS +SOURCES +SOURCING +SOURDINE +SOURDINES +SOURDOUGH +SOURDOUGHS +SOURED +SOURER +SOUREST +SOURING +SOURISH +SOURLY +SOURNESS +SOURNESSES +SOURPUSS +SOURPUSSES +SOURS +SOURSOP +SOURSOPS +SOURWOOD +SOURWOODS +SOUS +SOUSAPHONE +SOUSAPHONES +SOUSE +SOUSED +SOUSES +SOUSING +SOUSLIK +SOUSLIKS +SOUTACHE +SOUTACHES +SOUTANE +SOUTANES +SOUTER +SOUTERS +SOUTH +SOUTHBOUND +SOUTHEAST +SOUTHEASTER +SOUTHEASTERLY +SOUTHEASTERN +SOUTHEASTERS +SOUTHEASTS +SOUTHEASTWARD +SOUTHEASTWARDS +SOUTHED +SOUTHER +SOUTHERLIES +SOUTHERLY +SOUTHERN +SOUTHERNMOST +SOUTHERNNESS +SOUTHERNNESSES +SOUTHERNS +SOUTHERNWOOD +SOUTHERNWOODS +SOUTHERS +SOUTHING +SOUTHINGS +SOUTHLAND +SOUTHLANDS +SOUTHPAW +SOUTHPAWS +SOUTHRON +SOUTHRONS +SOUTHS +SOUTHWARD +SOUTHWARDS +SOUTHWEST +SOUTHWESTER +SOUTHWESTERLY +SOUTHWESTERN +SOUTHWESTERS +SOUTHWESTS +SOUTHWESTWARD +SOUTHWESTWARDS +SOUVENIR +SOUVENIRS +SOUVLAKI +SOUVLAKIA +SOUVLAKIAS +SOUVLAKIS +SOVEREIGN +SOVEREIGNLY +SOVEREIGNS +SOVEREIGNTIES +SOVEREIGNTY +SOVIET +SOVIETISM +SOVIETISMS +SOVIETIZATION +SOVIETIZATIONS +SOVIETIZE +SOVIETIZED +SOVIETIZES +SOVIETIZING +SOVIETS +SOVKHOZ +SOVKHOZES +SOVKHOZY +SOVRAN +SOVRANLY +SOVRANS +SOVRANTIES +SOVRANTY +SOW +SOWABLE +SOWANS +SOWAR +SOWARS +SOWBELLIES +SOWBELLY +SOWBREAD +SOWBREADS +SOWCAR +SOWCARS +SOWED +SOWENS +SOWER +SOWERS +SOWING +SOWN +SOWS +SOX +SOY +SOYA +SOYAS +SOYBEAN +SOYBEANS +SOYMILK +SOYMILKS +SOYS +SOYUZ +SOYUZES +SOZIN +SOZINE +SOZINES +SOZINS +SOZZLED +SPA +SPACE +SPACEBAND +SPACEBANDS +SPACECRAFT +SPACECRAFTS +SPACED +SPACEFLIGHT +SPACEFLIGHTS +SPACELESS +SPACEMAN +SPACEMEN +SPACEPORT +SPACEPORTS +SPACER +SPACERS +SPACES +SPACESHIP +SPACESHIPS +SPACESUIT +SPACESUITS +SPACEWALK +SPACEWALKED +SPACEWALKER +SPACEWALKERS +SPACEWALKING +SPACEWALKS +SPACEWARD +SPACEY +SPACIAL +SPACIALLY +SPACIER +SPACIEST +SPACINESS +SPACINESSES +SPACING +SPACINGS +SPACIOUS +SPACIOUSLY +SPACIOUSNESS +SPACIOUSNESSES +SPACKLE +SPACKLED +SPACKLES +SPACKLING +SPACY +SPADE +SPADED +SPADEFISH +SPADEFISHES +SPADEFUL +SPADEFULS +SPADER +SPADERS +SPADES +SPADEWORK +SPADEWORKS +SPADICES +SPADILLE +SPADILLES +SPADING +SPADIX +SPADIXES +SPADO +SPADONES +SPAE +SPAED +SPAEING +SPAEINGS +SPAES +SPAETZLE +SPAETZLES +SPAGHETTI +SPAGHETTILIKE +SPAGHETTINI +SPAGHETTINIS +SPAGHETTIS +SPAGYRIC +SPAGYRICS +SPAHEE +SPAHEES +SPAHI +SPAHIS +SPAIL +SPAILS +SPAIT +SPAITS +SPAKE +SPALDEEN +SPALDEENS +SPALE +SPALES +SPALL +SPALLABLE +SPALLATION +SPALLATIONS +SPALLED +SPALLER +SPALLERS +SPALLING +SPALLS +SPALPEEN +SPALPEENS +SPAM +SPAMBOT +SPAMBOTS +SPAMMED +SPAMMER +SPAMMERS +SPAMMING +SPAMS +SPAN +SPANAKOPITA +SPANAKOPITAS +SPANCEL +SPANCELED +SPANCELING +SPANCELLED +SPANCELLING +SPANCELS +SPANDEX +SPANDEXES +SPANDREL +SPANDRELS +SPANDRIL +SPANDRILS +SPANG +SPANGLE +SPANGLED +SPANGLES +SPANGLIER +SPANGLIEST +SPANGLING +SPANGLY +SPANIEL +SPANIELS +SPANK +SPANKED +SPANKER +SPANKERS +SPANKING +SPANKINGS +SPANKS +SPANLESS +SPANNED +SPANNER +SPANNERS +SPANNING +SPANOKOPITA +SPANOKOPITAS +SPANS +SPANSULE +SPANSULES +SPANWORM +SPANWORMS +SPAR +SPARABLE +SPARABLES +SPARE +SPAREABLE +SPARED +SPARELY +SPARENESS +SPARENESSES +SPARER +SPARERIB +SPARERIBS +SPARERS +SPARES +SPAREST +SPARGE +SPARGED +SPARGER +SPARGERS +SPARGES +SPARGING +SPARID +SPARIDS +SPARING +SPARINGLY +SPARK +SPARKED +SPARKER +SPARKERS +SPARKIER +SPARKIEST +SPARKILY +SPARKING +SPARKISH +SPARKLE +SPARKLED +SPARKLER +SPARKLERS +SPARKLES +SPARKLET +SPARKLETS +SPARKLIER +SPARKLIEST +SPARKLING +SPARKLY +SPARKPLUG +SPARKPLUGGED +SPARKPLUGGING +SPARKPLUGS +SPARKS +SPARKY +SPARLIKE +SPARLING +SPARLINGS +SPAROID +SPAROIDS +SPARRED +SPARRIER +SPARRIEST +SPARRING +SPARROW +SPARROWLIKE +SPARROWS +SPARRY +SPARS +SPARSE +SPARSELY +SPARSENESS +SPARSENESSES +SPARSER +SPARSEST +SPARSITIES +SPARSITY +SPARTAN +SPARTEINE +SPARTEINES +SPARTINA +SPARTINAS +SPAS +SPASM +SPASMED +SPASMING +SPASMODIC +SPASMODICALLY +SPASMOLYTIC +SPASMOLYTICS +SPASMS +SPASTIC +SPASTICALLY +SPASTICITIES +SPASTICITY +SPASTICS +SPAT +SPATE +SPATES +SPATHAL +SPATHE +SPATHED +SPATHES +SPATHIC +SPATHOSE +SPATHULATE +SPATIAL +SPATIALITIES +SPATIALITY +SPATIALLY +SPATIOTEMPORAL +SPATS +SPATTED +SPATTER +SPATTERDOCK +SPATTERDOCKS +SPATTERED +SPATTERING +SPATTERS +SPATTING +SPATULA +SPATULAR +SPATULAS +SPATULATE +SPATZLE +SPATZLES +SPAVIE +SPAVIES +SPAVIET +SPAVIN +SPAVINED +SPAVINS +SPAWN +SPAWNED +SPAWNER +SPAWNERS +SPAWNING +SPAWNS +SPAY +SPAYED +SPAYING +SPAYS +SPAZ +SPAZZ +SPAZZES +SPEAK +SPEAKABLE +SPEAKEASIES +SPEAKEASY +SPEAKER +SPEAKERPHONE +SPEAKERPHONES +SPEAKERS +SPEAKERSHIP +SPEAKERSHIPS +SPEAKING +SPEAKINGS +SPEAKS +SPEAN +SPEANED +SPEANING +SPEANS +SPEAR +SPEARED +SPEARER +SPEARERS +SPEARFISH +SPEARFISHED +SPEARFISHES +SPEARFISHING +SPEARGUN +SPEARGUNS +SPEARHEAD +SPEARHEADED +SPEARHEADING +SPEARHEADS +SPEARING +SPEARLIKE +SPEARMAN +SPEARMEN +SPEARMINT +SPEARMINTS +SPEARS +SPEARWORT +SPEARWORTS +SPEC +SPECCED +SPECCING +SPECIAL +SPECIALER +SPECIALEST +SPECIALISATION +SPECIALISATIONS +SPECIALISE +SPECIALISED +SPECIALISES +SPECIALISING +SPECIALISM +SPECIALISMS +SPECIALIST +SPECIALISTIC +SPECIALISTS +SPECIALITIES +SPECIALITY +SPECIALIZATION +SPECIALIZATIONS +SPECIALIZE +SPECIALIZED +SPECIALIZES +SPECIALIZING +SPECIALLY +SPECIALNESS +SPECIALNESSES +SPECIALS +SPECIALTIES +SPECIALTY +SPECIATE +SPECIATED +SPECIATES +SPECIATING +SPECIATION +SPECIATIONAL +SPECIATIONS +SPECIE +SPECIES +SPECIESISM +SPECIESISMS +SPECIFIABLE +SPECIFIC +SPECIFICALLY +SPECIFICATION +SPECIFICATIONS +SPECIFICITIES +SPECIFICITY +SPECIFICS +SPECIFIED +SPECIFIER +SPECIFIERS +SPECIFIES +SPECIFY +SPECIFYING +SPECIMEN +SPECIMENS +SPECIOSITIES +SPECIOSITY +SPECIOUS +SPECIOUSLY +SPECIOUSNESS +SPECIOUSNESSES +SPECK +SPECKED +SPECKING +SPECKLE +SPECKLED +SPECKLES +SPECKLING +SPECKS +SPECS +SPECTACLE +SPECTACLED +SPECTACLES +SPECTACULAR +SPECTACULARLY +SPECTACULARS +SPECTATE +SPECTATED +SPECTATES +SPECTATING +SPECTATOR +SPECTATORIAL +SPECTATORS +SPECTATORSHIP +SPECTATORSHIPS +SPECTER +SPECTERS +SPECTINOMYCIN +SPECTINOMYCINS +SPECTRA +SPECTRAL +SPECTRALLY +SPECTRE +SPECTRES +SPECTROGRAM +SPECTROGRAMS +SPECTROGRAPH +SPECTROGRAPHIC +SPECTROGRAPHIES +SPECTROGRAPHS +SPECTROGRAPHY +SPECTROMETER +SPECTROMETERS +SPECTROMETRIC +SPECTROMETRIES +SPECTROMETRY +SPECTROSCOPE +SPECTROSCOPES +SPECTROSCOPIC +SPECTROSCOPIES +SPECTROSCOPIST +SPECTROSCOPISTS +SPECTROSCOPY +SPECTRUM +SPECTRUMS +SPECULA +SPECULAR +SPECULARITIES +SPECULARITY +SPECULARLY +SPECULATE +SPECULATED +SPECULATES +SPECULATING +SPECULATION +SPECULATIONS +SPECULATIVE +SPECULATIVELY +SPECULATOR +SPECULATORS +SPECULUM +SPECULUMS +SPED +SPEECH +SPEECHES +SPEECHIFIED +SPEECHIFIES +SPEECHIFY +SPEECHIFYING +SPEECHLESS +SPEECHLESSLY +SPEECHLESSNESS +SPEECHWRITER +SPEECHWRITERS +SPEED +SPEEDBALL +SPEEDBALLED +SPEEDBALLING +SPEEDBALLS +SPEEDBOAT +SPEEDBOATING +SPEEDBOATINGS +SPEEDBOATS +SPEEDED +SPEEDER +SPEEDERS +SPEEDIER +SPEEDIEST +SPEEDILY +SPEEDINESS +SPEEDINESSES +SPEEDING +SPEEDINGS +SPEEDO +SPEEDOMETER +SPEEDOMETERS +SPEEDOS +SPEEDREAD +SPEEDREADING +SPEEDREADS +SPEEDS +SPEEDSTER +SPEEDSTERS +SPEEDUP +SPEEDUPS +SPEEDWAY +SPEEDWAYS +SPEEDWELL +SPEEDWELLS +SPEEDY +SPEEL +SPEELED +SPEELING +SPEELS +SPEER +SPEERED +SPEERING +SPEERINGS +SPEERS +SPEIL +SPEILED +SPEILING +SPEILS +SPEIR +SPEIRED +SPEIRING +SPEIRS +SPEISE +SPEISES +SPEISS +SPEISSES +SPELAEAN +SPELEAN +SPELEOLOGICAL +SPELEOLOGIES +SPELEOLOGIST +SPELEOLOGISTS +SPELEOLOGY +SPELL +SPELLBIND +SPELLBINDER +SPELLBINDERS +SPELLBINDING +SPELLBINDINGLY +SPELLBINDS +SPELLBOUND +SPELLDOWN +SPELLDOWNS +SPELLED +SPELLER +SPELLERS +SPELLING +SPELLINGS +SPELLS +SPELT +SPELTER +SPELTERS +SPELTS +SPELTZ +SPELTZES +SPELUNK +SPELUNKED +SPELUNKER +SPELUNKERS +SPELUNKING +SPELUNKINGS +SPELUNKS +SPENCE +SPENCER +SPENCERS +SPENCES +SPEND +SPENDABLE +SPENDER +SPENDERS +SPENDIER +SPENDIEST +SPENDING +SPENDS +SPENDTHRIFT +SPENDTHRIFTS +SPENDY +SPENSE +SPENSES +SPENT +SPERM +SPERMACETI +SPERMACETIS +SPERMAGONIA +SPERMAGONIUM +SPERMARIES +SPERMARY +SPERMATHECA +SPERMATHECAE +SPERMATIA +SPERMATIAL +SPERMATIC +SPERMATID +SPERMATIDS +SPERMATIUM +SPERMATOCYTE +SPERMATOCYTES +SPERMATOGENESES +SPERMATOGENESIS +SPERMATOGENIC +SPERMATOGONIA +SPERMATOGONIAL +SPERMATOGONIUM +SPERMATOPHORE +SPERMATOPHORES +SPERMATOPHYTE +SPERMATOPHYTES +SPERMATOPHYTIC +SPERMATOZOA +SPERMATOZOAL +SPERMATOZOAN +SPERMATOZOANS +SPERMATOZOID +SPERMATOZOIDS +SPERMATOZOON +SPERMIC +SPERMICIDAL +SPERMICIDE +SPERMICIDES +SPERMINE +SPERMINES +SPERMIOGENESES +SPERMIOGENESIS +SPERMOPHILE +SPERMOPHILES +SPERMOUS +SPERMS +SPERRYLITE +SPERRYLITES +SPESSARTINE +SPESSARTINES +SPESSARTITE +SPESSARTITES +SPEW +SPEWED +SPEWER +SPEWERS +SPEWING +SPEWS +SPHAGNOUS +SPHAGNUM +SPHAGNUMS +SPHALERITE +SPHALERITES +SPHENE +SPHENES +SPHENIC +SPHENODON +SPHENODONS +SPHENODONT +SPHENOID +SPHENOIDAL +SPHENOIDS +SPHENOPSID +SPHENOPSIDS +SPHERAL +SPHERE +SPHERED +SPHERES +SPHERIC +SPHERICAL +SPHERICALLY +SPHERICITIES +SPHERICITY +SPHERICS +SPHERIER +SPHERIEST +SPHERING +SPHEROID +SPHEROIDAL +SPHEROIDALLY +SPHEROIDS +SPHEROMETER +SPHEROMETERS +SPHEROPLAST +SPHEROPLASTS +SPHERULAR +SPHERULE +SPHERULES +SPHERULITE +SPHERULITES +SPHERULITIC +SPHERY +SPHINCTER +SPHINCTERIC +SPHINCTERS +SPHINGES +SPHINGID +SPHINGIDS +SPHINGOSINE +SPHINGOSINES +SPHINX +SPHINXES +SPHINXLIKE +SPHYGMIC +SPHYGMOGRAPH +SPHYGMOGRAPHS +SPHYGMUS +SPHYGMUSES +SPHYNX +SPHYNXES +SPIC +SPICA +SPICAE +SPICAS +SPICATE +SPICATED +SPICCATO +SPICCATOS +SPICE +SPICEBUSH +SPICEBUSHES +SPICED +SPICELESS +SPICER +SPICERIES +SPICERS +SPICERY +SPICES +SPICEY +SPICIER +SPICIEST +SPICILY +SPICINESS +SPICINESSES +SPICING +SPICK +SPICKS +SPICS +SPICULA +SPICULAE +SPICULAR +SPICULATE +SPICULATION +SPICULATIONS +SPICULE +SPICULES +SPICULUM +SPICY +SPIDER +SPIDERIER +SPIDERIEST +SPIDERISH +SPIDERLIKE +SPIDERS +SPIDERWEB +SPIDERWEBS +SPIDERWORT +SPIDERWORTS +SPIDERY +SPIED +SPIEGEL +SPIEGELEISEN +SPIEGELEISENS +SPIEGELS +SPIEL +SPIELED +SPIELER +SPIELERS +SPIELING +SPIELS +SPIER +SPIERED +SPIERING +SPIERS +SPIES +SPIFF +SPIFFED +SPIFFIED +SPIFFIER +SPIFFIES +SPIFFIEST +SPIFFILY +SPIFFINESS +SPIFFINESSES +SPIFFING +SPIFFS +SPIFFY +SPIFFYING +SPIGOT +SPIGOTS +SPIK +SPIKE +SPIKED +SPIKELET +SPIKELETS +SPIKELIKE +SPIKENARD +SPIKENARDS +SPIKER +SPIKERS +SPIKES +SPIKEY +SPIKIER +SPIKIEST +SPIKILY +SPIKINESS +SPIKINESSES +SPIKING +SPIKS +SPIKY +SPILE +SPILED +SPILES +SPILIKIN +SPILIKINS +SPILING +SPILINGS +SPILL +SPILLABLE +SPILLAGE +SPILLAGES +SPILLED +SPILLER +SPILLERS +SPILLIKIN +SPILLIKINS +SPILLING +SPILLOVER +SPILLOVERS +SPILLS +SPILLWAY +SPILLWAYS +SPILT +SPILTH +SPILTHS +SPIN +SPINACH +SPINACHES +SPINACHLIKE +SPINACHY +SPINAGE +SPINAGES +SPINAL +SPINALLY +SPINALS +SPINATE +SPINDLE +SPINDLED +SPINDLER +SPINDLERS +SPINDLES +SPINDLIER +SPINDLIEST +SPINDLING +SPINDLY +SPINDRIFT +SPINDRIFTS +SPINE +SPINED +SPINEL +SPINELESS +SPINELESSLY +SPINELESSNESS +SPINELESSNESSES +SPINELIKE +SPINELLE +SPINELLES +SPINELS +SPINES +SPINET +SPINETS +SPINIER +SPINIEST +SPINIFEX +SPINIFEXES +SPININESS +SPININESSES +SPINLESS +SPINNAKER +SPINNAKERS +SPINNER +SPINNERET +SPINNERETS +SPINNERETTE +SPINNERETTES +SPINNERIES +SPINNERS +SPINNERY +SPINNEY +SPINNEYS +SPINNIES +SPINNING +SPINNINGS +SPINNY +SPINOFF +SPINOFFS +SPINOR +SPINORS +SPINOSE +SPINOSELY +SPINOSITIES +SPINOSITY +SPINOUS +SPINOUT +SPINOUTS +SPINS +SPINSTER +SPINSTERHOOD +SPINSTERHOODS +SPINSTERISH +SPINSTERLY +SPINSTERS +SPINTHARISCOPE +SPINTHARISCOPES +SPINTO +SPINTOS +SPINULA +SPINULAE +SPINULE +SPINULES +SPINULOSE +SPINY +SPIRACLE +SPIRACLES +SPIRACULAR +SPIRAEA +SPIRAEAS +SPIRAL +SPIRALED +SPIRALING +SPIRALITIES +SPIRALITY +SPIRALLED +SPIRALLING +SPIRALLY +SPIRALS +SPIRANT +SPIRANTS +SPIRE +SPIREA +SPIREAS +SPIRED +SPIREM +SPIREME +SPIREMES +SPIREMS +SPIRES +SPIRIER +SPIRIEST +SPIRILLA +SPIRILLUM +SPIRING +SPIRIT +SPIRITED +SPIRITEDLY +SPIRITEDNESS +SPIRITEDNESSES +SPIRITING +SPIRITISM +SPIRITISMS +SPIRITIST +SPIRITISTIC +SPIRITISTS +SPIRITLESS +SPIRITLESSLY +SPIRITLESSNESS +SPIRITOSO +SPIRITOUS +SPIRITS +SPIRITUAL +SPIRITUALISM +SPIRITUALISMS +SPIRITUALIST +SPIRITUALISTIC +SPIRITUALISTS +SPIRITUALITIES +SPIRITUALITY +SPIRITUALIZE +SPIRITUALIZED +SPIRITUALIZES +SPIRITUALIZING +SPIRITUALLY +SPIRITUALNESS +SPIRITUALNESSES +SPIRITUALS +SPIRITUALTIES +SPIRITUALTY +SPIRITUEL +SPIRITUELLE +SPIRITUOUS +SPIROCHAETE +SPIROCHAETES +SPIROCHETAL +SPIROCHETE +SPIROCHETES +SPIROCHETOSES +SPIROCHETOSIS +SPIROGYRA +SPIROGYRAS +SPIROID +SPIROMETER +SPIROMETERS +SPIROMETRIC +SPIROMETRIES +SPIROMETRY +SPIRT +SPIRTED +SPIRTING +SPIRTS +SPIRULA +SPIRULAE +SPIRULAS +SPIRULINA +SPIRULINAS +SPIRY +SPIT +SPITAL +SPITALS +SPITBALL +SPITBALLS +SPITE +SPITED +SPITEFUL +SPITEFULLER +SPITEFULLEST +SPITEFULLY +SPITEFULNESS +SPITEFULNESSES +SPITES +SPITFIRE +SPITFIRES +SPITING +SPITS +SPITTED +SPITTER +SPITTERS +SPITTING +SPITTLE +SPITTLEBUG +SPITTLEBUGS +SPITTLES +SPITTOON +SPITTOONS +SPITZ +SPITZES +SPIV +SPIVS +SPIVVY +SPLAKE +SPLAKES +SPLANCHNIC +SPLASH +SPLASHBOARD +SPLASHBOARDS +SPLASHDOWN +SPLASHDOWNS +SPLASHED +SPLASHER +SPLASHERS +SPLASHES +SPLASHIER +SPLASHIEST +SPLASHILY +SPLASHINESS +SPLASHINESSES +SPLASHING +SPLASHY +SPLAT +SPLATS +SPLATTED +SPLATTER +SPLATTERED +SPLATTERING +SPLATTERS +SPLATTING +SPLAY +SPLAYED +SPLAYFEET +SPLAYFOOT +SPLAYFOOTED +SPLAYING +SPLAYS +SPLEEN +SPLEENFUL +SPLEENIER +SPLEENIEST +SPLEENISH +SPLEENS +SPLEENWORT +SPLEENWORTS +SPLEENY +SPLENDENT +SPLENDID +SPLENDIDER +SPLENDIDEST +SPLENDIDLY +SPLENDIDNESS +SPLENDIDNESSES +SPLENDIFEROUS +SPLENDIFEROUSLY +SPLENDOR +SPLENDOROUS +SPLENDORS +SPLENDOUR +SPLENDOURS +SPLENDROUS +SPLENECTOMIES +SPLENECTOMIZE +SPLENECTOMIZED +SPLENECTOMIZES +SPLENECTOMIZING +SPLENECTOMY +SPLENETIC +SPLENETICALLY +SPLENETICS +SPLENIA +SPLENIAL +SPLENIC +SPLENII +SPLENIUM +SPLENIUS +SPLENOMEGALIES +SPLENOMEGALY +SPLENT +SPLENTS +SPLEUCHAN +SPLEUCHANS +SPLICE +SPLICED +SPLICER +SPLICERS +SPLICES +SPLICING +SPLIFF +SPLIFFS +SPLINE +SPLINED +SPLINES +SPLINING +SPLINT +SPLINTED +SPLINTER +SPLINTERED +SPLINTERING +SPLINTERS +SPLINTERY +SPLINTING +SPLINTS +SPLIT +SPLITS +SPLITTER +SPLITTERS +SPLITTING +SPLODGE +SPLODGED +SPLODGES +SPLODGING +SPLORE +SPLORES +SPLOSH +SPLOSHED +SPLOSHES +SPLOSHING +SPLOTCH +SPLOTCHED +SPLOTCHES +SPLOTCHIER +SPLOTCHIEST +SPLOTCHING +SPLOTCHY +SPLURGE +SPLURGED +SPLURGER +SPLURGERS +SPLURGES +SPLURGIER +SPLURGIEST +SPLURGING +SPLURGY +SPLUTTER +SPLUTTERED +SPLUTTERER +SPLUTTERERS +SPLUTTERING +SPLUTTERS +SPLUTTERY +SPODE +SPODES +SPODOSOL +SPODOSOLS +SPODUMENE +SPODUMENES +SPOIL +SPOILABLE +SPOILAGE +SPOILAGES +SPOILED +SPOILER +SPOILERS +SPOILING +SPOILS +SPOILSMAN +SPOILSMEN +SPOILSPORT +SPOILSPORTS +SPOILT +SPOKE +SPOKED +SPOKEN +SPOKES +SPOKESHAVE +SPOKESHAVES +SPOKESMAN +SPOKESMANSHIP +SPOKESMANSHIPS +SPOKESMEN +SPOKESPEOPLE +SPOKESPERSON +SPOKESPERSONS +SPOKESWOMAN +SPOKESWOMEN +SPOKING +SPOLIATE +SPOLIATED +SPOLIATES +SPOLIATING +SPOLIATION +SPOLIATIONS +SPOLIATOR +SPOLIATORS +SPONDAIC +SPONDAICS +SPONDEE +SPONDEES +SPONDYLITIS +SPONDYLITISES +SPONGE +SPONGED +SPONGER +SPONGERS +SPONGES +SPONGEWARE +SPONGEWARES +SPONGIER +SPONGIEST +SPONGILY +SPONGIN +SPONGINESS +SPONGINESSES +SPONGING +SPONGINS +SPONGY +SPONSAL +SPONSION +SPONSIONS +SPONSON +SPONSONS +SPONSOR +SPONSORED +SPONSORIAL +SPONSORING +SPONSORS +SPONSORSHIP +SPONSORSHIPS +SPONTANEITIES +SPONTANEITY +SPONTANEOUS +SPONTANEOUSLY +SPONTANEOUSNESS +SPONTOON +SPONTOONS +SPOOF +SPOOFED +SPOOFER +SPOOFERIES +SPOOFERS +SPOOFERY +SPOOFING +SPOOFS +SPOOFY +SPOOK +SPOOKED +SPOOKERIES +SPOOKERY +SPOOKIER +SPOOKIEST +SPOOKILY +SPOOKINESS +SPOOKINESSES +SPOOKING +SPOOKISH +SPOOKS +SPOOKY +SPOOL +SPOOLED +SPOOLER +SPOOLERS +SPOOLING +SPOOLINGS +SPOOLS +SPOON +SPOONBILL +SPOONBILLS +SPOONED +SPOONERISM +SPOONERISMS +SPOONEY +SPOONEYS +SPOONFUL +SPOONFULS +SPOONIER +SPOONIES +SPOONIEST +SPOONILY +SPOONING +SPOONS +SPOONSFUL +SPOONY +SPOOR +SPOORED +SPOORING +SPOORS +SPORADIC +SPORADICALLY +SPORAL +SPORANGIA +SPORANGIAL +SPORANGIOPHORE +SPORANGIOPHORES +SPORANGIUM +SPORE +SPORED +SPORES +SPORICIDAL +SPORICIDE +SPORICIDES +SPORING +SPOROCARP +SPOROCARPS +SPOROCYST +SPOROCYSTS +SPOROGENESES +SPOROGENESIS +SPOROGENIC +SPOROGENOUS +SPOROGONIA +SPOROGONIC +SPOROGONIES +SPOROGONIUM +SPOROGONY +SPOROID +SPOROPHORE +SPOROPHORES +SPOROPHYL +SPOROPHYLL +SPOROPHYLLS +SPOROPHYLS +SPOROPHYTE +SPOROPHYTES +SPOROPHYTIC +SPOROPOLLENIN +SPOROPOLLENINS +SPOROTRICHOSES +SPOROTRICHOSIS +SPOROZOA +SPOROZOAL +SPOROZOAN +SPOROZOANS +SPOROZOIC +SPOROZOITE +SPOROZOITES +SPOROZOON +SPORRAN +SPORRANS +SPORT +SPORTED +SPORTER +SPORTERS +SPORTFISHERMAN +SPORTFISHERMEN +SPORTFISHING +SPORTFISHINGS +SPORTFUL +SPORTFULLY +SPORTFULNESS +SPORTFULNESSES +SPORTIER +SPORTIEST +SPORTIF +SPORTILY +SPORTINESS +SPORTINESSES +SPORTING +SPORTINGLY +SPORTIVE +SPORTIVELY +SPORTIVENESS +SPORTIVENESSES +SPORTS +SPORTSCAST +SPORTSCASTER +SPORTSCASTERS +SPORTSCASTS +SPORTSMAN +SPORTSMANLIKE +SPORTSMANLY +SPORTSMANSHIP +SPORTSMANSHIPS +SPORTSMEN +SPORTSWEAR +SPORTSWEARS +SPORTSWOMAN +SPORTSWOMEN +SPORTSWRITER +SPORTSWRITERS +SPORTSWRITING +SPORTSWRITINGS +SPORTY +SPORULAR +SPORULATE +SPORULATED +SPORULATES +SPORULATING +SPORULATION +SPORULATIONS +SPORULATIVE +SPORULE +SPORULES +SPOT +SPOTLESS +SPOTLESSLY +SPOTLESSNESS +SPOTLESSNESSES +SPOTLIGHT +SPOTLIGHTED +SPOTLIGHTING +SPOTLIGHTS +SPOTLIT +SPOTS +SPOTTABLE +SPOTTED +SPOTTER +SPOTTERS +SPOTTIER +SPOTTIEST +SPOTTILY +SPOTTINESS +SPOTTINESSES +SPOTTING +SPOTTY +SPOUSAL +SPOUSALLY +SPOUSALS +SPOUSE +SPOUSED +SPOUSES +SPOUSING +SPOUT +SPOUTED +SPOUTER +SPOUTERS +SPOUTING +SPOUTINGS +SPOUTLESS +SPOUTS +SPRACHGEFUHL +SPRACHGEFUHLS +SPRADDLE +SPRADDLED +SPRADDLES +SPRADDLING +SPRAG +SPRAGS +SPRAIN +SPRAINED +SPRAINING +SPRAINS +SPRANG +SPRANGS +SPRAT +SPRATS +SPRATTLE +SPRATTLED +SPRATTLES +SPRATTLING +SPRAWL +SPRAWLED +SPRAWLER +SPRAWLERS +SPRAWLIER +SPRAWLIEST +SPRAWLING +SPRAWLS +SPRAWLY +SPRAY +SPRAYED +SPRAYER +SPRAYERS +SPRAYING +SPRAYS +SPREAD +SPREADABILITIES +SPREADABILITY +SPREADABLE +SPREADER +SPREADERS +SPREADING +SPREADS +SPREADSHEET +SPREADSHEETS +SPREE +SPREES +SPRENT +SPRIER +SPRIEST +SPRIG +SPRIGGED +SPRIGGER +SPRIGGERS +SPRIGGIER +SPRIGGIEST +SPRIGGING +SPRIGGY +SPRIGHT +SPRIGHTFUL +SPRIGHTFULLY +SPRIGHTFULNESS +SPRIGHTLIER +SPRIGHTLIEST +SPRIGHTLINESS +SPRIGHTLINESSES +SPRIGHTLY +SPRIGHTS +SPRIGS +SPRIGTAIL +SPRIGTAILS +SPRING +SPRINGAL +SPRINGALD +SPRINGALDS +SPRINGALS +SPRINGBOARD +SPRINGBOARDS +SPRINGBOK +SPRINGBOKS +SPRINGE +SPRINGED +SPRINGEING +SPRINGER +SPRINGERS +SPRINGES +SPRINGHEAD +SPRINGHEADS +SPRINGHOUSE +SPRINGHOUSES +SPRINGIER +SPRINGIEST +SPRINGILY +SPRINGINESS +SPRINGINESSES +SPRINGING +SPRINGINGS +SPRINGLET +SPRINGLETS +SPRINGLIKE +SPRINGS +SPRINGTAIL +SPRINGTAILS +SPRINGTIDE +SPRINGTIDES +SPRINGTIME +SPRINGTIMES +SPRINGWATER +SPRINGWATERS +SPRINGWOOD +SPRINGWOODS +SPRINGY +SPRINKLE +SPRINKLED +SPRINKLER +SPRINKLERED +SPRINKLERING +SPRINKLERS +SPRINKLES +SPRINKLING +SPRINKLINGS +SPRINT +SPRINTED +SPRINTER +SPRINTERS +SPRINTING +SPRINTS +SPRIT +SPRITE +SPRITES +SPRITS +SPRITSAIL +SPRITSAILS +SPRITZ +SPRITZED +SPRITZER +SPRITZERS +SPRITZES +SPRITZING +SPROCKET +SPROCKETS +SPROUT +SPROUTED +SPROUTING +SPROUTS +SPRUCE +SPRUCED +SPRUCELY +SPRUCENESS +SPRUCENESSES +SPRUCER +SPRUCES +SPRUCEST +SPRUCIER +SPRUCIEST +SPRUCING +SPRUCY +SPRUE +SPRUES +SPRUG +SPRUGS +SPRUNG +SPRY +SPRYER +SPRYEST +SPRYLY +SPRYNESS +SPRYNESSES +SPUD +SPUDDED +SPUDDER +SPUDDERS +SPUDDING +SPUDS +SPUE +SPUED +SPUES +SPUING +SPUME +SPUMED +SPUMES +SPUMIER +SPUMIEST +SPUMING +SPUMONE +SPUMONES +SPUMONI +SPUMONIS +SPUMOUS +SPUMY +SPUN +SPUNBONDED +SPUNK +SPUNKED +SPUNKIE +SPUNKIER +SPUNKIES +SPUNKIEST +SPUNKILY +SPUNKINESS +SPUNKINESSES +SPUNKING +SPUNKS +SPUNKY +SPUR +SPURGALL +SPURGALLED +SPURGALLING +SPURGALLS +SPURGE +SPURGES +SPURIOUS +SPURIOUSLY +SPURIOUSNESS +SPURIOUSNESSES +SPURN +SPURNED +SPURNER +SPURNERS +SPURNING +SPURNS +SPURRED +SPURRER +SPURRERS +SPURREY +SPURREYS +SPURRIER +SPURRIERS +SPURRIES +SPURRING +SPURRY +SPURS +SPURT +SPURTED +SPURTER +SPURTERS +SPURTING +SPURTLE +SPURTLES +SPURTS +SPUTA +SPUTNIK +SPUTNIKS +SPUTTER +SPUTTERED +SPUTTERER +SPUTTERERS +SPUTTERING +SPUTTERS +SPUTTERY +SPUTUM +SPY +SPYGLASS +SPYGLASSES +SPYING +SPYMASTER +SPYMASTERS +SQUAB +SQUABBIER +SQUABBIEST +SQUABBLE +SQUABBLED +SQUABBLER +SQUABBLERS +SQUABBLES +SQUABBLING +SQUABBY +SQUABS +SQUAD +SQUADDED +SQUADDING +SQUADRON +SQUADRONED +SQUADRONING +SQUADRONS +SQUADS +SQUALENE +SQUALENES +SQUALID +SQUALIDER +SQUALIDEST +SQUALIDLY +SQUALIDNESS +SQUALIDNESSES +SQUALL +SQUALLED +SQUALLER +SQUALLERS +SQUALLIER +SQUALLIEST +SQUALLING +SQUALLISH +SQUALLS +SQUALLY +SQUALOR +SQUALORS +SQUAMA +SQUAMAE +SQUAMATE +SQUAMATES +SQUAMATION +SQUAMATIONS +SQUAMOSAL +SQUAMOSALS +SQUAMOSE +SQUAMOUS +SQUAMULOSE +SQUANDER +SQUANDERED +SQUANDERER +SQUANDERERS +SQUANDERING +SQUANDERS +SQUARE +SQUARED +SQUARELY +SQUARENESS +SQUARENESSES +SQUARER +SQUARERS +SQUARES +SQUAREST +SQUARING +SQUARISH +SQUARISHLY +SQUARISHNESS +SQUARISHNESSES +SQUARK +SQUARKS +SQUARROSE +SQUASH +SQUASHED +SQUASHER +SQUASHERS +SQUASHES +SQUASHIER +SQUASHIEST +SQUASHILY +SQUASHINESS +SQUASHINESSES +SQUASHING +SQUASHY +SQUAT +SQUATLY +SQUATNESS +SQUATNESSES +SQUATS +SQUATTED +SQUATTER +SQUATTERED +SQUATTERING +SQUATTERS +SQUATTEST +SQUATTIER +SQUATTIEST +SQUATTILY +SQUATTING +SQUATTY +SQUAW +SQUAWBUSH +SQUAWBUSHES +SQUAWFISH +SQUAWFISHES +SQUAWK +SQUAWKED +SQUAWKER +SQUAWKERS +SQUAWKING +SQUAWKS +SQUAWROOT +SQUAWROOTS +SQUAWS +SQUEAK +SQUEAKED +SQUEAKER +SQUEAKERS +SQUEAKIER +SQUEAKIEST +SQUEAKILY +SQUEAKING +SQUEAKS +SQUEAKY +SQUEAL +SQUEALED +SQUEALER +SQUEALERS +SQUEALING +SQUEALS +SQUEAMISH +SQUEAMISHLY +SQUEAMISHNESS +SQUEAMISHNESSES +SQUEEGEE +SQUEEGEED +SQUEEGEEING +SQUEEGEES +SQUEEZABILITIES +SQUEEZABILITY +SQUEEZABLE +SQUEEZE +SQUEEZED +SQUEEZER +SQUEEZERS +SQUEEZES +SQUEEZING +SQUEG +SQUEGGED +SQUEGGING +SQUEGS +SQUELCH +SQUELCHED +SQUELCHER +SQUELCHERS +SQUELCHES +SQUELCHIER +SQUELCHIEST +SQUELCHING +SQUELCHY +SQUETEAGUE +SQUIB +SQUIBBED +SQUIBBING +SQUIBS +SQUID +SQUIDDED +SQUIDDING +SQUIDS +SQUIFFED +SQUIFFIER +SQUIFFIEST +SQUIFFY +SQUIGGLE +SQUIGGLED +SQUIGGLES +SQUIGGLIER +SQUIGGLIEST +SQUIGGLING +SQUIGGLY +SQUILGEE +SQUILGEED +SQUILGEEING +SQUILGEES +SQUILL +SQUILLA +SQUILLAE +SQUILLAS +SQUILLS +SQUINCH +SQUINCHED +SQUINCHES +SQUINCHING +SQUINNIED +SQUINNIER +SQUINNIES +SQUINNIEST +SQUINNY +SQUINNYING +SQUINT +SQUINTED +SQUINTER +SQUINTERS +SQUINTEST +SQUINTIER +SQUINTIEST +SQUINTING +SQUINTINGLY +SQUINTS +SQUINTY +SQUIRARCHIES +SQUIRARCHY +SQUIRE +SQUIREARCHIES +SQUIREARCHY +SQUIRED +SQUIREEN +SQUIREENS +SQUIRES +SQUIRING +SQUIRISH +SQUIRM +SQUIRMED +SQUIRMER +SQUIRMERS +SQUIRMIER +SQUIRMIEST +SQUIRMING +SQUIRMS +SQUIRMY +SQUIRREL +SQUIRRELED +SQUIRRELING +SQUIRRELLED +SQUIRRELLING +SQUIRRELLY +SQUIRRELS +SQUIRRELY +SQUIRT +SQUIRTED +SQUIRTER +SQUIRTERS +SQUIRTING +SQUIRTS +SQUISH +SQUISHED +SQUISHES +SQUISHIER +SQUISHIEST +SQUISHINESS +SQUISHINESSES +SQUISHING +SQUISHY +SQUOOSH +SQUOOSHED +SQUOOSHES +SQUOOSHIER +SQUOOSHIEST +SQUOOSHING +SQUOOSHY +SQUUSH +SQUUSHED +SQUUSHES +SQUUSHING +SRADDHA +SRADDHAS +SRADHA +SRADHAS +SRI +SRIS +STAB +STABBED +STABBER +STABBERS +STABBING +STABILE +STABILES +STABILISE +STABILISED +STABILISES +STABILISING +STABILITIES +STABILITY +STABILIZATION +STABILIZATIONS +STABILIZE +STABILIZED +STABILIZER +STABILIZERS +STABILIZES +STABILIZING +STABLE +STABLEBOY +STABLEBOYS +STABLED +STABLEMAN +STABLEMATE +STABLEMATES +STABLEMEN +STABLENESS +STABLENESSES +STABLER +STABLERS +STABLES +STABLEST +STABLING +STABLINGS +STABLISH +STABLISHED +STABLISHES +STABLISHING +STABLISHMENT +STABLISHMENTS +STABLY +STABS +STACCATI +STACCATO +STACCATOS +STACK +STACKABLE +STACKED +STACKER +STACKERS +STACKING +STACKLESS +STACKS +STACKUP +STACKUPS +STACTE +STACTES +STADDLE +STADDLES +STADE +STADES +STADIA +STADIAS +STADIUM +STADIUMS +STADTHOLDER +STADTHOLDERATE +STADTHOLDERATES +STADTHOLDERS +STADTHOLDERSHIP +STAFF +STAFFED +STAFFER +STAFFERS +STAFFING +STAFFS +STAG +STAGE +STAGEABLE +STAGECOACH +STAGECOACHES +STAGECRAFT +STAGECRAFTS +STAGED +STAGEFUL +STAGEFULS +STAGEHAND +STAGEHANDS +STAGELIKE +STAGER +STAGERS +STAGES +STAGESTRUCK +STAGEY +STAGFLATION +STAGFLATIONARY +STAGFLATIONS +STAGGARD +STAGGARDS +STAGGART +STAGGARTS +STAGGED +STAGGER +STAGGERBUSH +STAGGERBUSHES +STAGGERED +STAGGERER +STAGGERERS +STAGGERING +STAGGERINGLY +STAGGERS +STAGGERY +STAGGIE +STAGGIER +STAGGIES +STAGGIEST +STAGGING +STAGGY +STAGHOUND +STAGHOUNDS +STAGIER +STAGIEST +STAGILY +STAGINESS +STAGINESSES +STAGING +STAGINGS +STAGNANCE +STAGNANCES +STAGNANCIES +STAGNANCY +STAGNANT +STAGNANTLY +STAGNATE +STAGNATED +STAGNATES +STAGNATING +STAGNATION +STAGNATIONS +STAGS +STAGY +STAID +STAIDER +STAIDEST +STAIDLY +STAIDNESS +STAIDNESSES +STAIG +STAIGS +STAIN +STAINABILITIES +STAINABILITY +STAINABLE +STAINED +STAINER +STAINERS +STAINING +STAINLESS +STAINLESSES +STAINLESSLY +STAINPROOF +STAINS +STAIR +STAIRCASE +STAIRCASES +STAIRHEAD +STAIRHEADS +STAIRLESS +STAIRLIKE +STAIRS +STAIRSTEP +STAIRSTEPPED +STAIRSTEPPING +STAIRSTEPS +STAIRWAY +STAIRWAYS +STAIRWELL +STAIRWELLS +STAITHE +STAITHES +STAKE +STAKED +STAKEHOLDER +STAKEHOLDERS +STAKEOUT +STAKEOUTS +STAKES +STAKING +STALACTITE +STALACTITES +STALACTITIC +STALAG +STALAGMITE +STALAGMITES +STALAGMITIC +STALAGS +STALE +STALED +STALELY +STALEMATE +STALEMATED +STALEMATES +STALEMATING +STALENESS +STALENESSES +STALER +STALES +STALEST +STALING +STALK +STALKED +STALKER +STALKERS +STALKIER +STALKIEST +STALKILY +STALKING +STALKINGS +STALKLESS +STALKLIKE +STALKS +STALKY +STALL +STALLED +STALLHOLDER +STALLHOLDERS +STALLING +STALLION +STALLIONS +STALLS +STALWART +STALWARTLY +STALWARTNESS +STALWARTNESSES +STALWARTS +STALWORTH +STALWORTHS +STAMEN +STAMENED +STAMENS +STAMINA +STAMINAL +STAMINAS +STAMINATE +STAMINEAL +STAMINODE +STAMINODES +STAMINODIA +STAMINODIES +STAMINODIUM +STAMINODY +STAMMEL +STAMMELS +STAMMER +STAMMERED +STAMMERER +STAMMERERS +STAMMERING +STAMMERS +STAMP +STAMPED +STAMPEDE +STAMPEDED +STAMPEDER +STAMPEDERS +STAMPEDES +STAMPEDING +STAMPER +STAMPERS +STAMPING +STAMPLESS +STAMPS +STANCE +STANCES +STANCH +STANCHED +STANCHER +STANCHERS +STANCHES +STANCHEST +STANCHING +STANCHION +STANCHIONED +STANCHIONING +STANCHIONS +STANCHLY +STAND +STANDARD +STANDARDBRED +STANDARDBREDS +STANDARDISE +STANDARDISED +STANDARDISES +STANDARDISING +STANDARDIZATION +STANDARDIZE +STANDARDIZED +STANDARDIZES +STANDARDIZING +STANDARDLESS +STANDARDLY +STANDARDS +STANDAWAY +STANDBY +STANDBYS +STANDDOWN +STANDDOWNS +STANDEE +STANDEES +STANDER +STANDERS +STANDFAST +STANDFASTS +STANDING +STANDINGS +STANDISH +STANDISHES +STANDOFF +STANDOFFISH +STANDOFFISHLY +STANDOFFISHNESS +STANDOFFS +STANDOUT +STANDOUTS +STANDPAT +STANDPATTER +STANDPATTERS +STANDPATTISM +STANDPATTISMS +STANDPIPE +STANDPIPES +STANDPOINT +STANDPOINTS +STANDS +STANDSTILL +STANDSTILLS +STANDUP +STANDUPS +STANE +STANED +STANES +STANG +STANGED +STANGING +STANGS +STANHOPE +STANHOPES +STANINE +STANINES +STANING +STANK +STANKS +STANNARIES +STANNARY +STANNIC +STANNITE +STANNITES +STANNOUS +STANNUM +STANNUMS +STANOL +STANOLS +STANZA +STANZAED +STANZAIC +STANZAS +STAPEDECTOMIES +STAPEDECTOMY +STAPEDES +STAPEDIAL +STAPELIA +STAPELIAS +STAPES +STAPH +STAPHS +STAPHYLINID +STAPHYLINIDS +STAPHYLOCOCCAL +STAPHYLOCOCCI +STAPHYLOCOCCIC +STAPHYLOCOCCUS +STAPLE +STAPLED +STAPLER +STAPLERS +STAPLES +STAPLING +STAR +STARBOARD +STARBOARDED +STARBOARDING +STARBOARDS +STARBURST +STARBURSTS +STARCH +STARCHED +STARCHES +STARCHIER +STARCHIEST +STARCHILY +STARCHINESS +STARCHINESSES +STARCHING +STARCHY +STARDOM +STARDOMS +STARDUST +STARDUSTS +STARE +STARED +STARER +STARERS +STARES +STARETS +STARFISH +STARFISHES +STARFLOWER +STARFLOWERS +STARFRUIT +STARFRUITS +STARGAZE +STARGAZED +STARGAZER +STARGAZERS +STARGAZES +STARGAZING +STARGAZINGS +STARING +STARINGLY +STARK +STARKER +STARKERS +STARKEST +STARKLY +STARKNESS +STARKNESSES +STARLESS +STARLET +STARLETS +STARLIGHT +STARLIGHTS +STARLIKE +STARLING +STARLINGS +STARLIT +STARNOSE +STARNOSES +STARRED +STARRIER +STARRIEST +STARRING +STARRY +STARS +STARSHIP +STARSHIPS +STARSTRUCK +START +STARTED +STARTER +STARTERS +STARTING +STARTLE +STARTLED +STARTLEMENT +STARTLEMENTS +STARTLER +STARTLERS +STARTLES +STARTLING +STARTLINGLY +STARTS +STARTSY +STARTUP +STARTUPS +STARVATION +STARVATIONS +STARVE +STARVED +STARVELING +STARVELINGS +STARVER +STARVERS +STARVES +STARVING +STARWORT +STARWORTS +STASES +STASH +STASHED +STASHES +STASHING +STASIMA +STASIMON +STASIS +STAT +STATABLE +STATAL +STATANT +STATE +STATEABLE +STATECRAFT +STATECRAFTS +STATED +STATEDLY +STATEHOOD +STATEHOODS +STATEHOUSE +STATEHOUSES +STATELESS +STATELESSNESS +STATELESSNESSES +STATELIER +STATELIEST +STATELINESS +STATELINESSES +STATELY +STATEMENT +STATEMENTS +STATER +STATEROOM +STATEROOMS +STATERS +STATES +STATESIDE +STATESMAN +STATESMANLIKE +STATESMANLY +STATESMANSHIP +STATESMANSHIPS +STATESMEN +STATEWIDE +STATIC +STATICAL +STATICALLY +STATICE +STATICES +STATICKY +STATICS +STATIN +STATING +STATINS +STATION +STATIONAL +STATIONARY +STATIONED +STATIONER +STATIONERIES +STATIONERS +STATIONERY +STATIONING +STATIONMASTER +STATIONMASTERS +STATIONS +STATISM +STATISMS +STATIST +STATISTIC +STATISTICAL +STATISTICALLY +STATISTICIAN +STATISTICIANS +STATISTICS +STATISTS +STATIVE +STATIVES +STATOBLAST +STATOBLASTS +STATOCYST +STATOCYSTS +STATOLITH +STATOLITHS +STATOR +STATORS +STATOSCOPE +STATOSCOPES +STATS +STATUARIES +STATUARY +STATUE +STATUED +STATUES +STATUESQUE +STATUESQUELY +STATUETTE +STATUETTES +STATURE +STATURES +STATUS +STATUSES +STATUSY +STATUTABLE +STATUTE +STATUTES +STATUTORILY +STATUTORY +STAUMREL +STAUMRELS +STAUNCH +STAUNCHED +STAUNCHER +STAUNCHES +STAUNCHEST +STAUNCHING +STAUNCHLY +STAUNCHNESS +STAUNCHNESSES +STAUROLITE +STAUROLITES +STAUROLITIC +STAVE +STAVED +STAVES +STAVESACRE +STAVESACRES +STAVING +STAVUDINE +STAVUDINES +STAW +STAY +STAYED +STAYER +STAYERS +STAYING +STAYS +STAYSAIL +STAYSAILS +STEAD +STEADED +STEADFAST +STEADFASTLY +STEADFASTNESS +STEADFASTNESSES +STEADIED +STEADIER +STEADIERS +STEADIES +STEADIEST +STEADILY +STEADINESS +STEADINESSES +STEADING +STEADINGS +STEADS +STEADY +STEADYING +STEAK +STEAKS +STEAL +STEALABLE +STEALAGE +STEALAGES +STEALER +STEALERS +STEALING +STEALINGS +STEALS +STEALTH +STEALTHIER +STEALTHIEST +STEALTHILY +STEALTHINESS +STEALTHINESSES +STEALTHS +STEALTHY +STEAM +STEAMBOAT +STEAMBOATS +STEAMED +STEAMER +STEAMERED +STEAMERING +STEAMERS +STEAMFITTER +STEAMFITTERS +STEAMIER +STEAMIEST +STEAMILY +STEAMINESS +STEAMINESSES +STEAMING +STEAMROLL +STEAMROLLED +STEAMROLLER +STEAMROLLERED +STEAMROLLERING +STEAMROLLERS +STEAMROLLING +STEAMROLLS +STEAMS +STEAMSHIP +STEAMSHIPS +STEAMY +STEAPSIN +STEAPSINS +STEARATE +STEARATES +STEARIC +STEARIN +STEARINE +STEARINES +STEARINS +STEATITE +STEATITES +STEATITIC +STEATOPYGIA +STEATOPYGIAS +STEATOPYGIC +STEATOPYGOUS +STEATORRHEA +STEATORRHEAS +STEDFAST +STEED +STEEDLIKE +STEEDS +STEEK +STEEKED +STEEKING +STEEKS +STEEL +STEELED +STEELHEAD +STEELHEADS +STEELIE +STEELIER +STEELIES +STEELIEST +STEELINESS +STEELINESSES +STEELING +STEELMAKER +STEELMAKERS +STEELMAKING +STEELMAKINGS +STEELS +STEELWORK +STEELWORKER +STEELWORKERS +STEELWORKS +STEELY +STEELYARD +STEELYARDS +STEENBOK +STEENBOKS +STEENBUCK +STEENBUCKS +STEEP +STEEPED +STEEPEN +STEEPENED +STEEPENING +STEEPENS +STEEPER +STEEPERS +STEEPEST +STEEPING +STEEPISH +STEEPLE +STEEPLEBUSH +STEEPLEBUSHES +STEEPLECHASE +STEEPLECHASER +STEEPLECHASERS +STEEPLECHASES +STEEPLECHASING +STEEPLECHASINGS +STEEPLED +STEEPLEJACK +STEEPLEJACKS +STEEPLES +STEEPLY +STEEPNESS +STEEPNESSES +STEEPS +STEER +STEERABLE +STEERAGE +STEERAGES +STEERAGEWAY +STEERAGEWAYS +STEERED +STEERER +STEERERS +STEERING +STEERS +STEERSMAN +STEERSMEN +STEEVE +STEEVED +STEEVES +STEEVING +STEEVINGS +STEGODON +STEGODONS +STEGOSAUR +STEGOSAURS +STEGOSAURUS +STEGOSAURUSES +STEIN +STEINBOK +STEINBOKS +STEINS +STELA +STELAE +STELAI +STELAR +STELE +STELENE +STELES +STELIC +STELLA +STELLAR +STELLAS +STELLATE +STELLATED +STELLIFIED +STELLIFIES +STELLIFY +STELLIFYING +STELLITE +STELLITES +STELLULAR +STEM +STEMLESS +STEMLIKE +STEMMA +STEMMAS +STEMMATA +STEMMATIC +STEMMED +STEMMER +STEMMERIES +STEMMERS +STEMMERY +STEMMIER +STEMMIEST +STEMMING +STEMMY +STEMS +STEMSON +STEMSONS +STEMWARE +STEMWARES +STENCH +STENCHES +STENCHFUL +STENCHIER +STENCHIEST +STENCHY +STENCIL +STENCILED +STENCILER +STENCILERS +STENCILING +STENCILLED +STENCILLER +STENCILLERS +STENCILLING +STENCILS +STENGAH +STENGAHS +STENO +STENOBATH +STENOBATHIC +STENOBATHS +STENOGRAPHER +STENOGRAPHERS +STENOGRAPHIC +STENOGRAPHIES +STENOGRAPHY +STENOHALINE +STENOKIES +STENOKOUS +STENOKY +STENOS +STENOSED +STENOSES +STENOSIS +STENOTHERM +STENOTHERMAL +STENOTHERMS +STENOTIC +STENOTOPIC +STENOTYPE +STENOTYPED +STENOTYPES +STENOTYPIES +STENOTYPING +STENOTYPIST +STENOTYPISTS +STENOTYPY +STENT +STENTOR +STENTORIAN +STENTORS +STENTS +STEP +STEPBROTHER +STEPBROTHERS +STEPCHILD +STEPCHILDREN +STEPDAME +STEPDAMES +STEPDAUGHTER +STEPDAUGHTERS +STEPFAMILIES +STEPFAMILY +STEPFATHER +STEPFATHERS +STEPHANOTIS +STEPHANOTISES +STEPLADDER +STEPLADDERS +STEPLIKE +STEPMOTHER +STEPMOTHERS +STEPPARENT +STEPPARENTING +STEPPARENTINGS +STEPPARENTS +STEPPE +STEPPED +STEPPER +STEPPERS +STEPPES +STEPPING +STEPS +STEPSISTER +STEPSISTERS +STEPSON +STEPSONS +STEPSTOOL +STEPSTOOLS +STEPWISE +STERADIAN +STERADIANS +STERCORACEOUS +STERCULIA +STERE +STEREO +STEREOCHEMICAL +STEREOCHEMISTRY +STEREOED +STEREOGRAM +STEREOGRAMS +STEREOGRAPH +STEREOGRAPHED +STEREOGRAPHIC +STEREOGRAPHIES +STEREOGRAPHING +STEREOGRAPHS +STEREOGRAPHY +STEREOING +STEREOISOMER +STEREOISOMERIC +STEREOISOMERISM +STEREOISOMERS +STEREOLOGICAL +STEREOLOGICALLY +STEREOLOGIES +STEREOLOGY +STEREOPHONIC +STEREOPHONIES +STEREOPHONY +STEREOPSES +STEREOPSIS +STEREOPTICON +STEREOPTICONS +STEREOREGULAR +STEREOS +STEREOSCOPE +STEREOSCOPES +STEREOSCOPIC +STEREOSCOPIES +STEREOSCOPY +STEREOSPECIFIC +STEREOTACTIC +STEREOTAXIC +STEREOTAXICALLY +STEREOTYPE +STEREOTYPED +STEREOTYPER +STEREOTYPERS +STEREOTYPES +STEREOTYPIC +STEREOTYPICAL +STEREOTYPICALLY +STEREOTYPIES +STEREOTYPING +STEREOTYPY +STERES +STERIC +STERICAL +STERICALLY +STERIGMA +STERIGMAS +STERIGMATA +STERILANT +STERILANTS +STERILE +STERILELY +STERILISE +STERILISED +STERILISES +STERILISING +STERILITIES +STERILITY +STERILIZATION +STERILIZATIONS +STERILIZE +STERILIZED +STERILIZER +STERILIZERS +STERILIZES +STERILIZING +STERLET +STERLETS +STERLING +STERLINGLY +STERLINGNESS +STERLINGNESSES +STERLINGS +STERN +STERNA +STERNAL +STERNER +STERNEST +STERNFOREMOST +STERNITE +STERNITES +STERNLY +STERNMOST +STERNNESS +STERNNESSES +STERNOCOSTAL +STERNPOST +STERNPOSTS +STERNS +STERNSON +STERNSONS +STERNUM +STERNUMS +STERNUTATION +STERNUTATIONS +STERNUTATOR +STERNUTATORS +STERNWARD +STERNWARDS +STERNWAY +STERNWAYS +STEROID +STEROIDAL +STEROIDOGENESES +STEROIDOGENESIS +STEROIDOGENIC +STEROIDS +STEROL +STEROLS +STERTOR +STERTOROUS +STERTOROUSLY +STERTORS +STET +STETHOSCOPE +STETHOSCOPES +STETHOSCOPIC +STETS +STETSON +STETSONS +STETTED +STETTING +STEVEDORE +STEVEDORED +STEVEDORES +STEVEDORING +STEW +STEWABLE +STEWARD +STEWARDED +STEWARDESS +STEWARDESSES +STEWARDING +STEWARDS +STEWARDSHIP +STEWARDSHIPS +STEWBUM +STEWBUMS +STEWED +STEWING +STEWPAN +STEWPANS +STEWS +STEWY +STEY +STHENIA +STHENIAS +STHENIC +STIBIAL +STIBINE +STIBINES +STIBIUM +STIBIUMS +STIBNITE +STIBNITES +STICH +STICHIC +STICHOMYTHIA +STICHOMYTHIAS +STICHOMYTHIC +STICHOMYTHIES +STICHOMYTHY +STICHS +STICK +STICKABLE +STICKBALL +STICKBALLS +STICKED +STICKER +STICKERS +STICKFUL +STICKFULS +STICKHANDLE +STICKHANDLED +STICKHANDLER +STICKHANDLERS +STICKHANDLES +STICKHANDLING +STICKIER +STICKIES +STICKIEST +STICKILY +STICKINESS +STICKINESSES +STICKING +STICKIT +STICKLE +STICKLEBACK +STICKLEBACKS +STICKLED +STICKLER +STICKLERS +STICKLES +STICKLIKE +STICKLING +STICKMAN +STICKMEN +STICKOUT +STICKOUTS +STICKPIN +STICKPINS +STICKS +STICKSEED +STICKSEEDS +STICKTIGHT +STICKTIGHTS +STICKUM +STICKUMS +STICKUP +STICKUPS +STICKWEED +STICKWEEDS +STICKWORK +STICKWORKS +STICKY +STICTION +STICTIONS +STIED +STIES +STIFF +STIFFED +STIFFEN +STIFFENED +STIFFENER +STIFFENERS +STIFFENING +STIFFENS +STIFFER +STIFFEST +STIFFIE +STIFFIES +STIFFING +STIFFISH +STIFFLY +STIFFNESS +STIFFNESSES +STIFFS +STIFLE +STIFLED +STIFLER +STIFLERS +STIFLES +STIFLING +STIFLINGLY +STIGMA +STIGMAL +STIGMAS +STIGMASTEROL +STIGMASTEROLS +STIGMATA +STIGMATIC +STIGMATICALLY +STIGMATICS +STIGMATIST +STIGMATISTS +STIGMATIZATION +STIGMATIZATIONS +STIGMATIZE +STIGMATIZED +STIGMATIZES +STIGMATIZING +STILBENE +STILBENES +STILBESTROL +STILBESTROLS +STILBITE +STILBITES +STILE +STILES +STILETTO +STILETTOED +STILETTOES +STILETTOING +STILETTOS +STILL +STILLBIRTH +STILLBIRTHS +STILLBORN +STILLBORNS +STILLED +STILLER +STILLEST +STILLIER +STILLIEST +STILLING +STILLMAN +STILLMEN +STILLNESS +STILLNESSES +STILLROOM +STILLROOMS +STILLS +STILLY +STILT +STILTED +STILTEDLY +STILTEDNESS +STILTEDNESSES +STILTING +STILTS +STIME +STIMES +STIMIED +STIMIES +STIMULANT +STIMULANTS +STIMULATE +STIMULATED +STIMULATES +STIMULATING +STIMULATION +STIMULATIONS +STIMULATIVE +STIMULATOR +STIMULATORS +STIMULATORY +STIMULI +STIMULUS +STIMY +STIMYING +STING +STINGAREE +STINGAREES +STINGER +STINGERS +STINGIER +STINGIEST +STINGILY +STINGINESS +STINGINESSES +STINGING +STINGINGLY +STINGLESS +STINGO +STINGOS +STINGRAY +STINGRAYS +STINGS +STINGY +STINK +STINKARD +STINKARDS +STINKBUG +STINKBUGS +STINKER +STINKEROO +STINKEROOS +STINKERS +STINKHORN +STINKHORNS +STINKIER +STINKIEST +STINKING +STINKINGLY +STINKO +STINKPOT +STINKPOTS +STINKS +STINKWEED +STINKWEEDS +STINKWOOD +STINKWOODS +STINKY +STINT +STINTED +STINTER +STINTERS +STINTING +STINTS +STIPE +STIPED +STIPEL +STIPELS +STIPEND +STIPENDIARIES +STIPENDIARY +STIPENDS +STIPES +STIPIFORM +STIPITATE +STIPITES +STIPPLE +STIPPLED +STIPPLER +STIPPLERS +STIPPLES +STIPPLING +STIPPLINGS +STIPULAR +STIPULATE +STIPULATED +STIPULATES +STIPULATING +STIPULATION +STIPULATIONS +STIPULATOR +STIPULATORS +STIPULATORY +STIPULE +STIPULED +STIPULES +STIR +STIRABOUT +STIRABOUTS +STIRK +STIRKS +STIRP +STIRPES +STIRPS +STIRRED +STIRRER +STIRRERS +STIRRING +STIRRINGS +STIRRUP +STIRRUPS +STIRS +STITCH +STITCHED +STITCHER +STITCHERIES +STITCHERS +STITCHERY +STITCHES +STITCHING +STITCHWORT +STITCHWORTS +STITHIED +STITHIES +STITHY +STITHYING +STIVER +STIVERS +STOA +STOAE +STOAI +STOAS +STOAT +STOATS +STOB +STOBBED +STOBBING +STOBS +STOCCADO +STOCCADOS +STOCCATA +STOCCATAS +STOCHASTIC +STOCHASTICALLY +STOCK +STOCKADE +STOCKADED +STOCKADES +STOCKADING +STOCKAGE +STOCKAGES +STOCKBREEDER +STOCKBREEDERS +STOCKBROKER +STOCKBROKERAGE +STOCKBROKERAGES +STOCKBROKERS +STOCKBROKING +STOCKBROKINGS +STOCKCAR +STOCKCARS +STOCKED +STOCKER +STOCKERS +STOCKFISH +STOCKFISHES +STOCKHOLDER +STOCKHOLDERS +STOCKIER +STOCKIEST +STOCKILY +STOCKINESS +STOCKINESSES +STOCKINET +STOCKINETS +STOCKINETTE +STOCKINETTES +STOCKING +STOCKINGED +STOCKINGS +STOCKISH +STOCKIST +STOCKISTS +STOCKJOBBER +STOCKJOBBERS +STOCKJOBBING +STOCKJOBBINGS +STOCKKEEPER +STOCKKEEPERS +STOCKMAN +STOCKMEN +STOCKPILE +STOCKPILED +STOCKPILER +STOCKPILERS +STOCKPILES +STOCKPILING +STOCKPOT +STOCKPOTS +STOCKROOM +STOCKROOMS +STOCKS +STOCKTAKING +STOCKTAKINGS +STOCKY +STOCKYARD +STOCKYARDS +STODGE +STODGED +STODGES +STODGIER +STODGIEST +STODGILY +STODGINESS +STODGINESSES +STODGING +STODGY +STOGEY +STOGEYS +STOGIE +STOGIES +STOGY +STOIC +STOICAL +STOICALLY +STOICHIOMETRIC +STOICHIOMETRIES +STOICHIOMETRY +STOICISM +STOICISMS +STOICS +STOKE +STOKED +STOKEHOLD +STOKEHOLDS +STOKEHOLE +STOKEHOLES +STOKER +STOKERS +STOKES +STOKESIA +STOKESIAS +STOKING +STOLE +STOLED +STOLEN +STOLES +STOLID +STOLIDER +STOLIDEST +STOLIDITIES +STOLIDITY +STOLIDLY +STOLLEN +STOLLENS +STOLON +STOLONATE +STOLONIC +STOLONIFEROUS +STOLONS +STOLPORT +STOLPORTS +STOMA +STOMACH +STOMACHACHE +STOMACHACHES +STOMACHED +STOMACHER +STOMACHERS +STOMACHIC +STOMACHICS +STOMACHING +STOMACHS +STOMACHY +STOMAL +STOMAS +STOMATA +STOMATAL +STOMATE +STOMATES +STOMATIC +STOMATITIDES +STOMATITIS +STOMATITISES +STOMATOPOD +STOMATOPODS +STOMATOUS +STOMODAEA +STOMODAEAL +STOMODAEUM +STOMODAEUMS +STOMODEA +STOMODEAL +STOMODEUM +STOMODEUMS +STOMP +STOMPED +STOMPER +STOMPERS +STOMPING +STOMPS +STONABLE +STONE +STONEBOAT +STONEBOATS +STONECHAT +STONECHATS +STONECROP +STONECROPS +STONECUTTER +STONECUTTERS +STONECUTTING +STONECUTTINGS +STONED +STONEFISH +STONEFISHES +STONEFLIES +STONEFLY +STONEMASON +STONEMASONRIES +STONEMASONRY +STONEMASONS +STONER +STONERS +STONES +STONEWALL +STONEWALLED +STONEWALLER +STONEWALLERS +STONEWALLING +STONEWALLS +STONEWARE +STONEWARES +STONEWASH +STONEWASHED +STONEWASHES +STONEWASHING +STONEWORK +STONEWORKS +STONEWORT +STONEWORTS +STONEY +STONIER +STONIEST +STONILY +STONINESS +STONINESSES +STONING +STONISH +STONISHED +STONISHES +STONISHING +STONY +STONYHEARTED +STOOD +STOOGE +STOOGED +STOOGES +STOOGING +STOOK +STOOKED +STOOKER +STOOKERS +STOOKING +STOOKS +STOOL +STOOLED +STOOLIE +STOOLIES +STOOLING +STOOLS +STOOP +STOOPBALL +STOOPBALLS +STOOPED +STOOPER +STOOPERS +STOOPING +STOOPS +STOP +STOPBANK +STOPBANKS +STOPCOCK +STOPCOCKS +STOPE +STOPED +STOPER +STOPERS +STOPES +STOPGAP +STOPGAPS +STOPING +STOPLIGHT +STOPLIGHTS +STOPOFF +STOPOFFS +STOPOVER +STOPOVERS +STOPPABLE +STOPPAGE +STOPPAGES +STOPPED +STOPPER +STOPPERED +STOPPERING +STOPPERS +STOPPING +STOPPLE +STOPPLED +STOPPLES +STOPPLING +STOPS +STOPT +STOPWATCH +STOPWATCHES +STOPWORD +STOPWORDS +STORABLE +STORABLES +STORAGE +STORAGES +STORAX +STORAXES +STORE +STORED +STOREFRONT +STOREFRONTS +STOREHOUSE +STOREHOUSES +STOREKEEPER +STOREKEEPERS +STORER +STOREROOM +STOREROOMS +STORERS +STORES +STORESHIP +STORESHIPS +STOREWIDE +STOREY +STOREYED +STOREYS +STORIED +STORIES +STORING +STORK +STORKS +STORKSBILL +STORKSBILLS +STORM +STORMBOUND +STORMED +STORMIER +STORMIEST +STORMILY +STORMINESS +STORMINESSES +STORMING +STORMS +STORMY +STORY +STORYBOARD +STORYBOARDED +STORYBOARDING +STORYBOARDS +STORYBOOK +STORYBOOKS +STORYING +STORYTELLER +STORYTELLERS +STORYTELLING +STORYTELLINGS +STOSS +STOT +STOTIN +STOTINKA +STOTINKI +STOTINOV +STOTINS +STOTS +STOTT +STOTTED +STOTTING +STOTTS +STOUND +STOUNDED +STOUNDING +STOUNDS +STOUP +STOUPS +STOUR +STOURE +STOURES +STOURIE +STOURS +STOURY +STOUT +STOUTEN +STOUTENED +STOUTENING +STOUTENS +STOUTER +STOUTEST +STOUTHEARTED +STOUTHEARTEDLY +STOUTISH +STOUTLY +STOUTNESS +STOUTNESSES +STOUTS +STOVE +STOVEPIPE +STOVEPIPES +STOVER +STOVERS +STOVES +STOW +STOWABLE +STOWAGE +STOWAGES +STOWAWAY +STOWAWAYS +STOWED +STOWING +STOWP +STOWPS +STOWS +STRABISMIC +STRABISMUS +STRABISMUSES +STRADDLE +STRADDLED +STRADDLER +STRADDLERS +STRADDLES +STRADDLING +STRAFE +STRAFED +STRAFER +STRAFERS +STRAFES +STRAFING +STRAGGLE +STRAGGLED +STRAGGLER +STRAGGLERS +STRAGGLES +STRAGGLIER +STRAGGLIEST +STRAGGLING +STRAGGLY +STRAIGHT +STRAIGHTAWAY +STRAIGHTAWAYS +STRAIGHTBRED +STRAIGHTBREDS +STRAIGHTED +STRAIGHTEDGE +STRAIGHTEDGES +STRAIGHTEN +STRAIGHTENED +STRAIGHTENER +STRAIGHTENERS +STRAIGHTENING +STRAIGHTENS +STRAIGHTER +STRAIGHTEST +STRAIGHTFORWARD +STRAIGHTING +STRAIGHTISH +STRAIGHTJACKET +STRAIGHTJACKETS +STRAIGHTLACED +STRAIGHTLY +STRAIGHTNESS +STRAIGHTNESSES +STRAIGHTS +STRAIGHTWAY +STRAIN +STRAINED +STRAINER +STRAINERS +STRAINING +STRAINS +STRAIT +STRAITEN +STRAITENED +STRAITENING +STRAITENS +STRAITER +STRAITEST +STRAITJACKET +STRAITJACKETED +STRAITJACKETING +STRAITJACKETS +STRAITLACED +STRAITLACEDLY +STRAITLACEDNESS +STRAITLY +STRAITNESS +STRAITNESSES +STRAITS +STRAKE +STRAKED +STRAKES +STRAMASH +STRAMASHES +STRAMONIES +STRAMONIUM +STRAMONIUMS +STRAMONY +STRAND +STRANDED +STRANDEDNESS +STRANDEDNESSES +STRANDER +STRANDERS +STRANDING +STRANDLINE +STRANDLINES +STRANDS +STRANG +STRANGE +STRANGELY +STRANGENESS +STRANGENESSES +STRANGER +STRANGERED +STRANGERING +STRANGERS +STRANGES +STRANGEST +STRANGLE +STRANGLED +STRANGLEHOLD +STRANGLEHOLDS +STRANGLER +STRANGLERS +STRANGLES +STRANGLING +STRANGULATE +STRANGULATED +STRANGULATES +STRANGULATING +STRANGULATION +STRANGULATIONS +STRANGURIES +STRANGURY +STRAP +STRAPHANG +STRAPHANGED +STRAPHANGER +STRAPHANGERS +STRAPHANGING +STRAPHANGS +STRAPHUNG +STRAPLESS +STRAPLESSES +STRAPPADO +STRAPPADOES +STRAPPADOS +STRAPPED +STRAPPER +STRAPPERS +STRAPPIER +STRAPPIEST +STRAPPING +STRAPPINGS +STRAPPY +STRAPS +STRASS +STRASSES +STRATA +STRATAGEM +STRATAGEMS +STRATAL +STRATAS +STRATEGIC +STRATEGICAL +STRATEGICALLY +STRATEGIES +STRATEGIST +STRATEGISTS +STRATEGIZE +STRATEGIZED +STRATEGIZES +STRATEGIZING +STRATEGY +STRATH +STRATHS +STRATHSPEY +STRATHSPEYS +STRATI +STRATIFICATION +STRATIFICATIONS +STRATIFIED +STRATIFIES +STRATIFORM +STRATIFY +STRATIFYING +STRATIGRAPHIC +STRATIGRAPHIES +STRATIGRAPHY +STRATOCRACIES +STRATOCRACY +STRATOCUMULI +STRATOCUMULUS +STRATOSPHERE +STRATOSPHERES +STRATOSPHERIC +STRATOUS +STRATOVOLCANO +STRATOVOLCANOES +STRATOVOLCANOS +STRATUM +STRATUMS +STRATUS +STRAVAGE +STRAVAGED +STRAVAGES +STRAVAGING +STRAVAIG +STRAVAIGED +STRAVAIGING +STRAVAIGS +STRAW +STRAWBERRIES +STRAWBERRY +STRAWED +STRAWFLOWER +STRAWFLOWERS +STRAWHAT +STRAWIER +STRAWIEST +STRAWING +STRAWS +STRAWWORM +STRAWWORMS +STRAWY +STRAY +STRAYED +STRAYER +STRAYERS +STRAYING +STRAYS +STREAK +STREAKED +STREAKER +STREAKERS +STREAKIER +STREAKIEST +STREAKILY +STREAKINESS +STREAKINESSES +STREAKING +STREAKINGS +STREAKS +STREAKY +STREAM +STREAMBED +STREAMBEDS +STREAMED +STREAMER +STREAMERS +STREAMIER +STREAMIEST +STREAMING +STREAMINGS +STREAMLET +STREAMLETS +STREAMLINE +STREAMLINED +STREAMLINER +STREAMLINERS +STREAMLINES +STREAMLINING +STREAMS +STREAMSIDE +STREAMSIDES +STREAMY +STREEK +STREEKED +STREEKER +STREEKERS +STREEKING +STREEKS +STREEL +STREELED +STREELING +STREELS +STREET +STREETCAR +STREETCARS +STREETLAMP +STREETLAMPS +STREETLIGHT +STREETLIGHTS +STREETS +STREETSCAPE +STREETSCAPES +STREETWALKER +STREETWALKERS +STREETWALKING +STREETWALKINGS +STREETWISE +STRENGTH +STRENGTHEN +STRENGTHENED +STRENGTHENER +STRENGTHENERS +STRENGTHENING +STRENGTHENS +STRENGTHS +STRENUOSITIES +STRENUOSITY +STRENUOUS +STRENUOUSLY +STRENUOUSNESS +STRENUOUSNESSES +STREP +STREPS +STREPTOBACILLI +STREPTOBACILLUS +STREPTOCOCCAL +STREPTOCOCCI +STREPTOCOCCIC +STREPTOCOCCUS +STREPTOKINASE +STREPTOKINASES +STREPTOLYSIN +STREPTOLYSINS +STREPTOMYCES +STREPTOMYCETE +STREPTOMYCETES +STREPTOMYCIN +STREPTOMYCINS +STREPTOTHRICIN +STREPTOTHRICINS +STRESS +STRESSED +STRESSES +STRESSFUL +STRESSFULLY +STRESSING +STRESSLESS +STRESSLESSNESS +STRESSOR +STRESSORS +STRETCH +STRETCHABILITY +STRETCHABLE +STRETCHED +STRETCHER +STRETCHERED +STRETCHERING +STRETCHERS +STRETCHES +STRETCHIER +STRETCHIEST +STRETCHING +STRETCHY +STRETTA +STRETTAS +STRETTE +STRETTI +STRETTO +STRETTOS +STREUSEL +STREUSELS +STREW +STREWED +STREWER +STREWERS +STREWING +STREWMENT +STREWMENTS +STREWN +STREWS +STRIA +STRIAE +STRIATA +STRIATE +STRIATED +STRIATES +STRIATING +STRIATION +STRIATIONS +STRIATUM +STRICK +STRICKEN +STRICKLE +STRICKLED +STRICKLES +STRICKLING +STRICKS +STRICT +STRICTER +STRICTEST +STRICTION +STRICTIONS +STRICTLY +STRICTNESS +STRICTNESSES +STRICTURE +STRICTURES +STRIDDEN +STRIDE +STRIDENCE +STRIDENCES +STRIDENCIES +STRIDENCY +STRIDENT +STRIDENTLY +STRIDER +STRIDERS +STRIDES +STRIDING +STRIDOR +STRIDORS +STRIDULATE +STRIDULATED +STRIDULATES +STRIDULATING +STRIDULATION +STRIDULATIONS +STRIDULATORY +STRIDULOUS +STRIDULOUSLY +STRIFE +STRIFEFUL +STRIFELESS +STRIFES +STRIGIL +STRIGILS +STRIGOSE +STRIKE +STRIKEBOUND +STRIKEBREAKER +STRIKEBREAKERS +STRIKEBREAKING +STRIKEBREAKINGS +STRIKEOUT +STRIKEOUTS +STRIKEOVER +STRIKEOVERS +STRIKER +STRIKERS +STRIKES +STRIKING +STRIKINGLY +STRING +STRINGCOURSE +STRINGCOURSES +STRINGED +STRINGENCIES +STRINGENCY +STRINGENDO +STRINGENT +STRINGENTLY +STRINGER +STRINGERS +STRINGHALT +STRINGHALTED +STRINGHALTS +STRINGIER +STRINGIEST +STRINGILY +STRINGINESS +STRINGINESSES +STRINGING +STRINGINGS +STRINGLESS +STRINGPIECE +STRINGPIECES +STRINGS +STRINGY +STRINGYBARK +STRINGYBARKS +STRIP +STRIPE +STRIPED +STRIPELESS +STRIPER +STRIPERS +STRIPES +STRIPIER +STRIPIEST +STRIPING +STRIPINGS +STRIPLING +STRIPLINGS +STRIPPABLE +STRIPPED +STRIPPER +STRIPPERS +STRIPPING +STRIPS +STRIPT +STRIPTEASE +STRIPTEASER +STRIPTEASERS +STRIPTEASES +STRIPY +STRIVE +STRIVED +STRIVEN +STRIVER +STRIVERS +STRIVES +STRIVING +STROBE +STROBES +STROBIC +STROBIL +STROBILA +STROBILAE +STROBILAR +STROBILATION +STROBILATIONS +STROBILE +STROBILES +STROBILI +STROBILS +STROBILUS +STROBOSCOPE +STROBOSCOPES +STROBOSCOPIC +STROBOTRON +STROBOTRONS +STRODE +STROKE +STROKED +STROKER +STROKERS +STROKES +STROKING +STROLL +STROLLED +STROLLER +STROLLERS +STROLLING +STROLLS +STROMA +STROMAL +STROMATA +STROMATIC +STROMATOLITE +STROMATOLITES +STROMATOLITIC +STRONG +STRONGBOX +STRONGBOXES +STRONGER +STRONGEST +STRONGHOLD +STRONGHOLDS +STRONGISH +STRONGLY +STRONGMAN +STRONGMEN +STRONGYL +STRONGYLE +STRONGYLES +STRONGYLOIDOSES +STRONGYLOIDOSIS +STRONGYLS +STRONTIA +STRONTIAN +STRONTIANITE +STRONTIANITES +STRONTIANS +STRONTIAS +STRONTIC +STRONTIUM +STRONTIUMS +STROOK +STROP +STROPHANTHIN +STROPHANTHINS +STROPHE +STROPHES +STROPHIC +STROPHOID +STROPHOIDS +STROPHULI +STROPHULUS +STROPPED +STROPPER +STROPPERS +STROPPIER +STROPPIEST +STROPPING +STROPPY +STROPS +STROUD +STROUDING +STROUDINGS +STROUDS +STROVE +STROW +STROWED +STROWING +STROWN +STROWS +STROY +STROYED +STROYER +STROYERS +STROYING +STROYS +STRUCK +STRUCKEN +STRUCTURAL +STRUCTURALISM +STRUCTURALISMS +STRUCTURALIST +STRUCTURALISTS +STRUCTURALIZE +STRUCTURALIZED +STRUCTURALIZES +STRUCTURALIZING +STRUCTURALLY +STRUCTURATION +STRUCTURATIONS +STRUCTURE +STRUCTURED +STRUCTURELESS +STRUCTURES +STRUCTURING +STRUDEL +STRUDELS +STRUGGLE +STRUGGLED +STRUGGLER +STRUGGLERS +STRUGGLES +STRUGGLING +STRUM +STRUMA +STRUMAE +STRUMAS +STRUMATIC +STRUMMED +STRUMMER +STRUMMERS +STRUMMING +STRUMOSE +STRUMOUS +STRUMPET +STRUMPETS +STRUMS +STRUNG +STRUNT +STRUNTED +STRUNTING +STRUNTS +STRUT +STRUTHIOUS +STRUTS +STRUTTED +STRUTTER +STRUTTERS +STRUTTING +STRYCHNIC +STRYCHNINE +STRYCHNINES +STUB +STUBBED +STUBBIER +STUBBIEST +STUBBILY +STUBBING +STUBBLE +STUBBLED +STUBBLES +STUBBLIER +STUBBLIEST +STUBBLY +STUBBORN +STUBBORNER +STUBBORNEST +STUBBORNLY +STUBBORNNESS +STUBBORNNESSES +STUBBY +STUBS +STUCCO +STUCCOED +STUCCOER +STUCCOERS +STUCCOES +STUCCOING +STUCCOS +STUCCOWORK +STUCCOWORKS +STUCK +STUD +STUDBOOK +STUDBOOKS +STUDDED +STUDDIE +STUDDIES +STUDDING +STUDDINGS +STUDENT +STUDENTS +STUDENTSHIP +STUDENTSHIPS +STUDFISH +STUDFISHES +STUDHORSE +STUDHORSES +STUDIED +STUDIEDLY +STUDIEDNESS +STUDIEDNESSES +STUDIER +STUDIERS +STUDIES +STUDIO +STUDIOS +STUDIOUS +STUDIOUSLY +STUDIOUSNESS +STUDIOUSNESSES +STUDLIER +STUDLIEST +STUDLY +STUDS +STUDWORK +STUDWORKS +STUDY +STUDYING +STUFF +STUFFED +STUFFER +STUFFERS +STUFFIER +STUFFIEST +STUFFILY +STUFFINESS +STUFFINESSES +STUFFING +STUFFINGS +STUFFLESS +STUFFS +STUFFY +STUIVER +STUIVERS +STULL +STULLS +STULTIFICATION +STULTIFICATIONS +STULTIFIED +STULTIFIES +STULTIFY +STULTIFYING +STUM +STUMBLE +STUMBLEBUM +STUMBLEBUMS +STUMBLED +STUMBLER +STUMBLERS +STUMBLES +STUMBLING +STUMBLINGLY +STUMMED +STUMMING +STUMP +STUMPAGE +STUMPAGES +STUMPED +STUMPER +STUMPERS +STUMPIER +STUMPIEST +STUMPING +STUMPS +STUMPY +STUMS +STUN +STUNG +STUNK +STUNNED +STUNNER +STUNNERS +STUNNING +STUNNINGLY +STUNS +STUNSAIL +STUNSAILS +STUNT +STUNTED +STUNTEDNESS +STUNTEDNESSES +STUNTING +STUNTMAN +STUNTMEN +STUNTS +STUNTWOMAN +STUNTWOMEN +STUPA +STUPAS +STUPE +STUPEFACTION +STUPEFACTIONS +STUPEFIED +STUPEFIER +STUPEFIERS +STUPEFIES +STUPEFY +STUPEFYING +STUPEFYINGLY +STUPENDOUS +STUPENDOUSLY +STUPENDOUSNESS +STUPES +STUPID +STUPIDER +STUPIDEST +STUPIDITIES +STUPIDITY +STUPIDLY +STUPIDNESS +STUPIDNESSES +STUPIDS +STUPOR +STUPOROUS +STUPORS +STURDIED +STURDIER +STURDIES +STURDIEST +STURDILY +STURDINESS +STURDINESSES +STURDY +STURGEON +STURGEONS +STURT +STURTS +STUTTER +STUTTERED +STUTTERER +STUTTERERS +STUTTERING +STUTTERS +STY +STYE +STYED +STYES +STYGIAN +STYING +STYLAR +STYLATE +STYLE +STYLEBOOK +STYLEBOOKS +STYLED +STYLELESS +STYLELESSNESS +STYLELESSNESSES +STYLER +STYLERS +STYLES +STYLET +STYLETS +STYLI +STYLIFORM +STYLING +STYLINGS +STYLISE +STYLISED +STYLISER +STYLISERS +STYLISES +STYLISH +STYLISHLY +STYLISHNESS +STYLISHNESSES +STYLISING +STYLIST +STYLISTIC +STYLISTICALLY +STYLISTICS +STYLISTS +STYLITE +STYLITES +STYLITIC +STYLITISM +STYLITISMS +STYLIZATION +STYLIZATIONS +STYLIZE +STYLIZED +STYLIZER +STYLIZERS +STYLIZES +STYLIZING +STYLOBATE +STYLOBATES +STYLOGRAPHIES +STYLOGRAPHY +STYLOID +STYLOLITE +STYLOLITES +STYLOPODIA +STYLOPODIUM +STYLUS +STYLUSES +STYMIE +STYMIED +STYMIEING +STYMIES +STYMY +STYMYING +STYPSIS +STYPSISES +STYPTIC +STYPTICAL +STYPTICS +STYRAX +STYRAXES +STYRENE +STYRENES +STYROFOAM +STYROFOAMS +SUABILITIES +SUABILITY +SUABLE +SUABLY +SUASION +SUASIONS +SUASIVE +SUASIVELY +SUASIVENESS +SUASIVENESSES +SUASORY +SUAVE +SUAVELY +SUAVENESS +SUAVENESSES +SUAVER +SUAVEST +SUAVITIES +SUAVITY +SUB +SUBA +SUBABBOT +SUBABBOTS +SUBACID +SUBACIDLY +SUBACIDNESS +SUBACIDNESSES +SUBACRID +SUBACUTE +SUBACUTELY +SUBADAR +SUBADARS +SUBADOLESCENT +SUBADOLESCENTS +SUBADULT +SUBADULTS +SUBAERIAL +SUBAERIALLY +SUBAGENCIES +SUBAGENCY +SUBAGENT +SUBAGENTS +SUBAH +SUBAHDAR +SUBAHDARS +SUBAHS +SUBALAR +SUBALLOCATION +SUBALLOCATIONS +SUBALPINE +SUBALTERN +SUBALTERNS +SUBANTARCTIC +SUBAPICAL +SUBAQUATIC +SUBAQUEOUS +SUBARACHNOID +SUBARACHNOIDAL +SUBARCTIC +SUBARCTICS +SUBAREA +SUBAREAS +SUBARID +SUBAS +SUBASSEMBLIES +SUBASSEMBLY +SUBASTRAL +SUBATMOSPHERIC +SUBATOM +SUBATOMIC +SUBATOMS +SUBAUDIBLE +SUBAUDITION +SUBAUDITIONS +SUBAURAL +SUBAVERAGE +SUBAXIAL +SUBBASE +SUBBASEMENT +SUBBASEMENTS +SUBBASES +SUBBASIN +SUBBASINS +SUBBASS +SUBBASSES +SUBBED +SUBBING +SUBBINGS +SUBBITUMINOUS +SUBBLOCK +SUBBLOCKS +SUBBRANCH +SUBBRANCHES +SUBBREED +SUBBREEDS +SUBBUREAU +SUBBUREAUS +SUBBUREAUX +SUBCABINET +SUBCAPSULAR +SUBCASTE +SUBCASTES +SUBCATEGORIES +SUBCATEGORIZE +SUBCATEGORIZED +SUBCATEGORIZES +SUBCATEGORIZING +SUBCATEGORY +SUBCAUSE +SUBCAUSES +SUBCAVITIES +SUBCAVITY +SUBCEILING +SUBCEILINGS +SUBCELL +SUBCELLAR +SUBCELLARS +SUBCELLS +SUBCELLULAR +SUBCENTER +SUBCENTERS +SUBCENTRAL +SUBCENTRALLY +SUBCHAPTER +SUBCHAPTERS +SUBCHASER +SUBCHASERS +SUBCHIEF +SUBCHIEFS +SUBCLAIM +SUBCLAIMS +SUBCLAN +SUBCLANS +SUBCLASS +SUBCLASSED +SUBCLASSES +SUBCLASSIFIED +SUBCLASSIFIES +SUBCLASSIFY +SUBCLASSIFYING +SUBCLASSING +SUBCLAUSE +SUBCLAUSES +SUBCLAVIAN +SUBCLAVIANS +SUBCLERK +SUBCLERKS +SUBCLIMAX +SUBCLIMAXES +SUBCLINICAL +SUBCLINICALLY +SUBCLUSTER +SUBCLUSTERED +SUBCLUSTERING +SUBCLUSTERS +SUBCODE +SUBCODES +SUBCOLLECTION +SUBCOLLECTIONS +SUBCOLLEGE +SUBCOLLEGIATE +SUBCOLONIES +SUBCOLONY +SUBCOMMISSION +SUBCOMMISSIONED +SUBCOMMISSIONS +SUBCOMMITTEE +SUBCOMMITTEES +SUBCOMMUNITIES +SUBCOMMUNITY +SUBCOMPACT +SUBCOMPACTS +SUBCOMPONENT +SUBCOMPONENTS +SUBCONSCIOUS +SUBCONSCIOUSES +SUBCONSCIOUSLY +SUBCONSUL +SUBCONSULS +SUBCONTINENT +SUBCONTINENTAL +SUBCONTINENTS +SUBCONTRACT +SUBCONTRACTED +SUBCONTRACTING +SUBCONTRACTOR +SUBCONTRACTORS +SUBCONTRACTS +SUBCONTRAOCTAVE +SUBCONTRARIES +SUBCONTRARY +SUBCOOL +SUBCOOLED +SUBCOOLING +SUBCOOLS +SUBCORDATE +SUBCORIACEOUS +SUBCORTEX +SUBCORTEXES +SUBCORTICAL +SUBCORTICES +SUBCOSTAL +SUBCOSTALS +SUBCOUNTIES +SUBCOUNTY +SUBCRITICAL +SUBCRUSTAL +SUBCULT +SUBCULTS +SUBCULTURAL +SUBCULTURALLY +SUBCULTURE +SUBCULTURED +SUBCULTURES +SUBCULTURING +SUBCURATIVE +SUBCUTANEOUS +SUBCUTANEOUSLY +SUBCUTES +SUBCUTIS +SUBCUTISES +SUBDEACON +SUBDEACONS +SUBDEALER +SUBDEALERS +SUBDEAN +SUBDEANS +SUBDEB +SUBDEBS +SUBDEBUTANTE +SUBDEBUTANTES +SUBDECISION +SUBDECISIONS +SUBDEPARTMENT +SUBDEPARTMENTS +SUBDEPOT +SUBDEPOTS +SUBDEPUTIES +SUBDEPUTY +SUBDERMAL +SUBDERMALLY +SUBDEVELOPMENT +SUBDEVELOPMENTS +SUBDIALECT +SUBDIALECTS +SUBDIRECTOR +SUBDIRECTORS +SUBDISCIPLINE +SUBDISCIPLINES +SUBDISTRICT +SUBDISTRICTS +SUBDIVIDABLE +SUBDIVIDE +SUBDIVIDED +SUBDIVIDER +SUBDIVIDERS +SUBDIVIDES +SUBDIVIDING +SUBDIVISION +SUBDIVISIONS +SUBDOMINANT +SUBDOMINANTS +SUBDUABLE +SUBDUABLY +SUBDUAL +SUBDUALS +SUBDUCE +SUBDUCED +SUBDUCES +SUBDUCING +SUBDUCT +SUBDUCTED +SUBDUCTING +SUBDUCTION +SUBDUCTIONS +SUBDUCTS +SUBDUE +SUBDUED +SUBDUEDLY +SUBDUER +SUBDUERS +SUBDUES +SUBDUING +SUBDURAL +SUBDWARF +SUBDWARFS +SUBECHO +SUBECHOES +SUBECONOMIES +SUBECONOMY +SUBEDIT +SUBEDITED +SUBEDITING +SUBEDITOR +SUBEDITORIAL +SUBEDITORS +SUBEDITS +SUBEMPLOYED +SUBEMPLOYMENT +SUBEMPLOYMENTS +SUBENTRIES +SUBENTRY +SUBEPIDERMAL +SUBEPOCH +SUBEPOCHS +SUBER +SUBERECT +SUBERIC +SUBERIN +SUBERINS +SUBERISE +SUBERISED +SUBERISES +SUBERISING +SUBERIZATION +SUBERIZATIONS +SUBERIZE +SUBERIZED +SUBERIZES +SUBERIZING +SUBEROSE +SUBEROUS +SUBERS +SUBFAMILIES +SUBFAMILY +SUBFIELD +SUBFIELDS +SUBFILE +SUBFILES +SUBFIX +SUBFIXES +SUBFLOOR +SUBFLOORS +SUBFLUID +SUBFOSSIL +SUBFOSSILS +SUBFRAME +SUBFRAMES +SUBFREEZING +SUBFUSC +SUBFUSCS +SUBGENERA +SUBGENERATION +SUBGENERATIONS +SUBGENRE +SUBGENRES +SUBGENUS +SUBGENUSES +SUBGLACIAL +SUBGLACIALLY +SUBGOAL +SUBGOALS +SUBGOVERNMENT +SUBGOVERNMENTS +SUBGRADE +SUBGRADES +SUBGRAPH +SUBGRAPHS +SUBGROUP +SUBGROUPED +SUBGROUPING +SUBGROUPS +SUBGUM +SUBGUMS +SUBHEAD +SUBHEADING +SUBHEADINGS +SUBHEADS +SUBHUMAN +SUBHUMANS +SUBHUMID +SUBIDEA +SUBIDEAS +SUBINDEX +SUBINDEXES +SUBINDICES +SUBINDUSTRIES +SUBINDUSTRY +SUBINFEUD +SUBINFEUDATE +SUBINFEUDATED +SUBINFEUDATES +SUBINFEUDATING +SUBINFEUDATION +SUBINFEUDATIONS +SUBINFEUDED +SUBINFEUDING +SUBINFEUDS +SUBINHIBITORY +SUBINTERVAL +SUBINTERVALS +SUBIRRIGATE +SUBIRRIGATED +SUBIRRIGATES +SUBIRRIGATING +SUBIRRIGATION +SUBIRRIGATIONS +SUBITEM +SUBITEMS +SUBITO +SUBJACENCIES +SUBJACENCY +SUBJACENT +SUBJACENTLY +SUBJECT +SUBJECTED +SUBJECTING +SUBJECTION +SUBJECTIONS +SUBJECTIVE +SUBJECTIVELY +SUBJECTIVENESS +SUBJECTIVES +SUBJECTIVISE +SUBJECTIVISED +SUBJECTIVISES +SUBJECTIVISING +SUBJECTIVISM +SUBJECTIVISMS +SUBJECTIVIST +SUBJECTIVISTIC +SUBJECTIVISTS +SUBJECTIVITIES +SUBJECTIVITY +SUBJECTIVIZE +SUBJECTIVIZED +SUBJECTIVIZES +SUBJECTIVIZING +SUBJECTLESS +SUBJECTS +SUBJOIN +SUBJOINED +SUBJOINING +SUBJOINS +SUBJUGATE +SUBJUGATED +SUBJUGATES +SUBJUGATING +SUBJUGATION +SUBJUGATIONS +SUBJUGATOR +SUBJUGATORS +SUBJUNCTION +SUBJUNCTIONS +SUBJUNCTIVE +SUBJUNCTIVES +SUBKINGDOM +SUBKINGDOMS +SUBLANGUAGE +SUBLANGUAGES +SUBLATE +SUBLATED +SUBLATES +SUBLATING +SUBLATION +SUBLATIONS +SUBLEASE +SUBLEASED +SUBLEASES +SUBLEASING +SUBLESSEE +SUBLESSEES +SUBLESSOR +SUBLESSORS +SUBLET +SUBLETHAL +SUBLETHALLY +SUBLETS +SUBLETTING +SUBLEVEL +SUBLEVELS +SUBLIBRARIAN +SUBLIBRARIANS +SUBLICENSE +SUBLICENSED +SUBLICENSES +SUBLICENSING +SUBLIEUTENANT +SUBLIEUTENANTS +SUBLIMABLE +SUBLIMATE +SUBLIMATED +SUBLIMATES +SUBLIMATING +SUBLIMATION +SUBLIMATIONS +SUBLIME +SUBLIMED +SUBLIMELY +SUBLIMENESS +SUBLIMENESSES +SUBLIMER +SUBLIMERS +SUBLIMES +SUBLIMEST +SUBLIMINAL +SUBLIMINALLY +SUBLIMING +SUBLIMIT +SUBLIMITIES +SUBLIMITS +SUBLIMITY +SUBLINE +SUBLINES +SUBLINGUAL +SUBLITERACIES +SUBLITERACY +SUBLITERARY +SUBLITERATE +SUBLITERATES +SUBLITERATURE +SUBLITERATURES +SUBLITTORAL +SUBLITTORALS +SUBLOT +SUBLOTS +SUBLUNAR +SUBLUNARY +SUBLUXATION +SUBLUXATIONS +SUBMANAGER +SUBMANAGERS +SUBMANDIBULAR +SUBMANDIBULARS +SUBMARGINAL +SUBMARINE +SUBMARINED +SUBMARINER +SUBMARINERS +SUBMARINES +SUBMARINING +SUBMARKET +SUBMARKETS +SUBMAXILLARIES +SUBMAXILLARY +SUBMAXIMAL +SUBMEDIANT +SUBMEDIANTS +SUBMENU +SUBMENUS +SUBMERGE +SUBMERGED +SUBMERGENCE +SUBMERGENCES +SUBMERGES +SUBMERGIBLE +SUBMERGING +SUBMERSE +SUBMERSED +SUBMERSES +SUBMERSIBLE +SUBMERSIBLES +SUBMERSING +SUBMERSION +SUBMERSIONS +SUBMETACENTRIC +SUBMETACENTRICS +SUBMICROGRAM +SUBMICRON +SUBMICROSCOPIC +SUBMILLIMETER +SUBMINIATURE +SUBMINIMAL +SUBMINISTER +SUBMINISTERS +SUBMISS +SUBMISSION +SUBMISSIONS +SUBMISSIVE +SUBMISSIVELY +SUBMISSIVENESS +SUBMIT +SUBMITS +SUBMITTAL +SUBMITTALS +SUBMITTED +SUBMITTER +SUBMITTERS +SUBMITTING +SUBMUCOSA +SUBMUCOSAE +SUBMUCOSAL +SUBMUCOSAS +SUBMULTIPLE +SUBMULTIPLES +SUBMUNITION +SUBMUNITIONS +SUBNASAL +SUBNATIONAL +SUBNET +SUBNETS +SUBNETWORK +SUBNETWORKED +SUBNETWORKING +SUBNETWORKS +SUBNICHE +SUBNICHES +SUBNODAL +SUBNORMAL +SUBNORMALITIES +SUBNORMALITY +SUBNORMALLY +SUBNORMALS +SUBNUCLEAR +SUBNUCLEI +SUBNUCLEUS +SUBNUCLEUSES +SUBOCEAN +SUBOCEANIC +SUBOPTIC +SUBOPTIMAL +SUBOPTIMIZATION +SUBOPTIMIZE +SUBOPTIMIZED +SUBOPTIMIZES +SUBOPTIMIZING +SUBOPTIMUM +SUBORAL +SUBORBICULAR +SUBORBITAL +SUBORDER +SUBORDERS +SUBORDINATE +SUBORDINATED +SUBORDINATELY +SUBORDINATENESS +SUBORDINATES +SUBORDINATING +SUBORDINATION +SUBORDINATIONS +SUBORDINATIVE +SUBORDINATOR +SUBORDINATORS +SUBORGANIZATION +SUBORN +SUBORNATION +SUBORNATIONS +SUBORNED +SUBORNER +SUBORNERS +SUBORNING +SUBORNS +SUBOSCINE +SUBOSCINES +SUBOVAL +SUBOVATE +SUBOXIDE +SUBOXIDES +SUBPANEL +SUBPANELS +SUBPAR +SUBPARAGRAPH +SUBPARAGRAPHS +SUBPARALLEL +SUBPART +SUBPARTS +SUBPENA +SUBPENAED +SUBPENAING +SUBPENAS +SUBPERIOD +SUBPERIODS +SUBPHASE +SUBPHASES +SUBPHYLA +SUBPHYLAR +SUBPHYLUM +SUBPLOT +SUBPLOTS +SUBPOENA +SUBPOENAED +SUBPOENAING +SUBPOENAS +SUBPOLAR +SUBPOPULATION +SUBPOPULATIONS +SUBPOTENCIES +SUBPOTENCY +SUBPOTENT +SUBPRIMATE +SUBPRIMATES +SUBPRINCIPAL +SUBPRINCIPALS +SUBPROBLEM +SUBPROBLEMS +SUBPROCESS +SUBPROCESSES +SUBPRODUCT +SUBPRODUCTS +SUBPROFESSIONAL +SUBPROGRAM +SUBPROGRAMS +SUBPROJECT +SUBPROJECTS +SUBPROLETARIAT +SUBPROLETARIATS +SUBPUBIC +SUBRACE +SUBRACES +SUBRATIONAL +SUBREGION +SUBREGIONAL +SUBREGIONS +SUBRENT +SUBRENTS +SUBREPTION +SUBREPTIONS +SUBREPTITIOUS +SUBREPTITIOUSLY +SUBRING +SUBRINGS +SUBROGATE +SUBROGATED +SUBROGATES +SUBROGATING +SUBROGATION +SUBROGATIONS +SUBROUTINE +SUBROUTINES +SUBRULE +SUBRULES +SUBS +SUBSALE +SUBSALES +SUBSAMPLE +SUBSAMPLED +SUBSAMPLES +SUBSAMPLING +SUBSATELLITE +SUBSATELLITES +SUBSATURATED +SUBSATURATION +SUBSATURATIONS +SUBSCALE +SUBSCALES +SUBSCIENCE +SUBSCIENCES +SUBSCRIBE +SUBSCRIBED +SUBSCRIBER +SUBSCRIBERS +SUBSCRIBES +SUBSCRIBING +SUBSCRIPT +SUBSCRIPTION +SUBSCRIPTIONS +SUBSCRIPTS +SUBSEA +SUBSECRETARIES +SUBSECRETARY +SUBSECT +SUBSECTION +SUBSECTIONS +SUBSECTOR +SUBSECTORS +SUBSECTS +SUBSEGMENT +SUBSEGMENTS +SUBSEIZURE +SUBSEIZURES +SUBSENSE +SUBSENSES +SUBSENTENCE +SUBSENTENCES +SUBSEQUENCE +SUBSEQUENCES +SUBSEQUENT +SUBSEQUENTLY +SUBSEQUENTS +SUBSERE +SUBSERES +SUBSERIES +SUBSERVE +SUBSERVED +SUBSERVES +SUBSERVIENCE +SUBSERVIENCES +SUBSERVIENCIES +SUBSERVIENCY +SUBSERVIENT +SUBSERVIENTLY +SUBSERVING +SUBSET +SUBSETS +SUBSHAFT +SUBSHAFTS +SUBSHELL +SUBSHELLS +SUBSHRUB +SUBSHRUBS +SUBSIDE +SUBSIDED +SUBSIDENCE +SUBSIDENCES +SUBSIDER +SUBSIDERS +SUBSIDES +SUBSIDIARIES +SUBSIDIARILY +SUBSIDIARITIES +SUBSIDIARITY +SUBSIDIARY +SUBSIDIES +SUBSIDING +SUBSIDISE +SUBSIDISED +SUBSIDISES +SUBSIDISING +SUBSIDIZATION +SUBSIDIZATIONS +SUBSIDIZE +SUBSIDIZED +SUBSIDIZER +SUBSIDIZERS +SUBSIDIZES +SUBSIDIZING +SUBSIDY +SUBSIST +SUBSISTED +SUBSISTENCE +SUBSISTENCES +SUBSISTENT +SUBSISTER +SUBSISTERS +SUBSISTING +SUBSISTS +SUBSITE +SUBSITES +SUBSKILL +SUBSKILLS +SUBSOCIAL +SUBSOCIETIES +SUBSOCIETY +SUBSOIL +SUBSOILED +SUBSOILER +SUBSOILERS +SUBSOILING +SUBSOILS +SUBSOLAR +SUBSONIC +SUBSONICALLY +SUBSPACE +SUBSPACES +SUBSPECIALIST +SUBSPECIALISTS +SUBSPECIALIZE +SUBSPECIALIZED +SUBSPECIALIZES +SUBSPECIALIZING +SUBSPECIALTIES +SUBSPECIALTY +SUBSPECIES +SUBSPECIFIC +SUBSTAGE +SUBSTAGES +SUBSTANCE +SUBSTANCELESS +SUBSTANCES +SUBSTANDARD +SUBSTANTIAL +SUBSTANTIALITY +SUBSTANTIALLY +SUBSTANTIALNESS +SUBSTANTIALS +SUBSTANTIATE +SUBSTANTIATED +SUBSTANTIATES +SUBSTANTIATING +SUBSTANTIATION +SUBSTANTIATIONS +SUBSTANTIATIVE +SUBSTANTIVAL +SUBSTANTIVALLY +SUBSTANTIVE +SUBSTANTIVELY +SUBSTANTIVENESS +SUBSTANTIVES +SUBSTANTIVIZE +SUBSTANTIVIZED +SUBSTANTIVIZES +SUBSTANTIVIZING +SUBSTATE +SUBSTATES +SUBSTATION +SUBSTATIONS +SUBSTITUENT +SUBSTITUENTS +SUBSTITUTABLE +SUBSTITUTE +SUBSTITUTED +SUBSTITUTES +SUBSTITUTING +SUBSTITUTION +SUBSTITUTIONAL +SUBSTITUTIONARY +SUBSTITUTIONS +SUBSTITUTIVE +SUBSTITUTIVELY +SUBSTRATA +SUBSTRATE +SUBSTRATES +SUBSTRATUM +SUBSTRATUMS +SUBSTRUCTURAL +SUBSTRUCTURE +SUBSTRUCTURES +SUBSUMABLE +SUBSUME +SUBSUMED +SUBSUMES +SUBSUMING +SUBSUMPTION +SUBSUMPTIONS +SUBSURFACE +SUBSURFACES +SUBSYSTEM +SUBSYSTEMS +SUBTASK +SUBTASKS +SUBTAXA +SUBTAXON +SUBTAXONS +SUBTEEN +SUBTEENS +SUBTEMPERATE +SUBTENANCIES +SUBTENANCY +SUBTENANT +SUBTENANTS +SUBTEND +SUBTENDED +SUBTENDING +SUBTENDS +SUBTERFUGE +SUBTERFUGES +SUBTERMINAL +SUBTERRANEAN +SUBTERRANEANLY +SUBTERRANEOUS +SUBTERRANEOUSLY +SUBTEST +SUBTESTS +SUBTEXT +SUBTEXTS +SUBTEXTUAL +SUBTHEME +SUBTHEMES +SUBTHERAPEUTIC +SUBTHRESHOLD +SUBTILE +SUBTILELY +SUBTILENESS +SUBTILENESSES +SUBTILER +SUBTILEST +SUBTILIN +SUBTILINS +SUBTILISIN +SUBTILISINS +SUBTILITIES +SUBTILITY +SUBTILIZATION +SUBTILIZATIONS +SUBTILIZE +SUBTILIZED +SUBTILIZES +SUBTILIZING +SUBTILTIES +SUBTILTY +SUBTITLE +SUBTITLED +SUBTITLES +SUBTITLING +SUBTLE +SUBTLENESS +SUBTLENESSES +SUBTLER +SUBTLEST +SUBTLETIES +SUBTLETY +SUBTLY +SUBTONE +SUBTONES +SUBTONIC +SUBTONICS +SUBTOPIA +SUBTOPIAS +SUBTOPIC +SUBTOPICS +SUBTORRID +SUBTOTAL +SUBTOTALED +SUBTOTALING +SUBTOTALLED +SUBTOTALLING +SUBTOTALLY +SUBTOTALS +SUBTRACT +SUBTRACTED +SUBTRACTER +SUBTRACTERS +SUBTRACTING +SUBTRACTION +SUBTRACTIONS +SUBTRACTIVE +SUBTRACTS +SUBTRAHEND +SUBTRAHENDS +SUBTREASURIES +SUBTREASURY +SUBTREND +SUBTRENDS +SUBTRIBE +SUBTRIBES +SUBTROPIC +SUBTROPICAL +SUBTROPICS +SUBTUNIC +SUBTUNICS +SUBTYPE +SUBTYPES +SUBULATE +SUBUMBRELLA +SUBUMBRELLAS +SUBUNIT +SUBUNITS +SUBURB +SUBURBAN +SUBURBANISE +SUBURBANISED +SUBURBANISES +SUBURBANISING +SUBURBANITE +SUBURBANITES +SUBURBANIZATION +SUBURBANIZE +SUBURBANIZED +SUBURBANIZES +SUBURBANIZING +SUBURBANS +SUBURBED +SUBURBIA +SUBURBIAS +SUBURBS +SUBVARIETIES +SUBVARIETY +SUBVASSAL +SUBVASSALS +SUBVENE +SUBVENED +SUBVENES +SUBVENING +SUBVENTION +SUBVENTIONARY +SUBVENTIONS +SUBVERSION +SUBVERSIONARY +SUBVERSIONS +SUBVERSIVE +SUBVERSIVELY +SUBVERSIVENESS +SUBVERSIVES +SUBVERT +SUBVERTED +SUBVERTER +SUBVERTERS +SUBVERTING +SUBVERTS +SUBVICAR +SUBVICARS +SUBVIRAL +SUBVIRUS +SUBVIRUSES +SUBVISIBLE +SUBVISUAL +SUBVOCAL +SUBVOCALIZATION +SUBVOCALIZE +SUBVOCALIZED +SUBVOCALIZES +SUBVOCALIZING +SUBVOCALLY +SUBWAY +SUBWAYED +SUBWAYING +SUBWAYS +SUBWOOFER +SUBWOOFERS +SUBWORLD +SUBWORLDS +SUBWRITER +SUBWRITERS +SUBZERO +SUBZONE +SUBZONES +SUCCAH +SUCCAHS +SUCCEDANEA +SUCCEDANEOUS +SUCCEDANEUM +SUCCEDANEUMS +SUCCEDENT +SUCCEED +SUCCEEDED +SUCCEEDER +SUCCEEDERS +SUCCEEDING +SUCCEEDS +SUCCESS +SUCCESSES +SUCCESSFUL +SUCCESSFULLY +SUCCESSFULNESS +SUCCESSION +SUCCESSIONAL +SUCCESSIONALLY +SUCCESSIONS +SUCCESSIVE +SUCCESSIVELY +SUCCESSIVENESS +SUCCESSOR +SUCCESSORS +SUCCINATE +SUCCINATES +SUCCINCT +SUCCINCTER +SUCCINCTEST +SUCCINCTLY +SUCCINCTNESS +SUCCINCTNESSES +SUCCINIC +SUCCINYL +SUCCINYLCHOLINE +SUCCINYLS +SUCCOR +SUCCORED +SUCCORER +SUCCORERS +SUCCORIES +SUCCORING +SUCCORS +SUCCORY +SUCCOTASH +SUCCOTASHES +SUCCOTH +SUCCOUR +SUCCOURED +SUCCOURING +SUCCOURS +SUCCUBA +SUCCUBAE +SUCCUBAS +SUCCUBI +SUCCUBUS +SUCCUBUSES +SUCCULENCE +SUCCULENCES +SUCCULENT +SUCCULENTLY +SUCCULENTS +SUCCUMB +SUCCUMBED +SUCCUMBING +SUCCUMBS +SUCCUSS +SUCCUSSED +SUCCUSSES +SUCCUSSING +SUCH +SUCHLIKE +SUCHNESS +SUCHNESSES +SUCK +SUCKED +SUCKER +SUCKERED +SUCKERING +SUCKERS +SUCKFISH +SUCKFISHES +SUCKIER +SUCKIEST +SUCKING +SUCKLE +SUCKLED +SUCKLER +SUCKLERS +SUCKLES +SUCKLESS +SUCKLING +SUCKLINGS +SUCKS +SUCKY +SUCRALOSE +SUCRALOSES +SUCRASE +SUCRASES +SUCRE +SUCRES +SUCROSE +SUCROSES +SUCTION +SUCTIONAL +SUCTIONED +SUCTIONING +SUCTIONS +SUCTORIAL +SUCTORIAN +SUCTORIANS +SUDARIA +SUDARIES +SUDARIUM +SUDARY +SUDATION +SUDATIONS +SUDATORIA +SUDATORIES +SUDATORIUM +SUDATORIUMS +SUDATORY +SUDD +SUDDEN +SUDDENLY +SUDDENNESS +SUDDENNESSES +SUDDENS +SUDDS +SUDOR +SUDORAL +SUDORIFEROUS +SUDORIFIC +SUDORIFICS +SUDORS +SUDS +SUDSED +SUDSER +SUDSERS +SUDSES +SUDSIER +SUDSIEST +SUDSING +SUDSLESS +SUDSY +SUE +SUED +SUEDE +SUEDED +SUEDES +SUEDING +SUER +SUERS +SUES +SUET +SUETS +SUETY +SUFFARI +SUFFARIS +SUFFER +SUFFERABLE +SUFFERABLENESS +SUFFERABLY +SUFFERANCE +SUFFERANCES +SUFFERED +SUFFERER +SUFFERERS +SUFFERING +SUFFERINGS +SUFFERS +SUFFICE +SUFFICED +SUFFICER +SUFFICERS +SUFFICES +SUFFICIENCIES +SUFFICIENCY +SUFFICIENT +SUFFICIENTLY +SUFFICING +SUFFIX +SUFFIXAL +SUFFIXATION +SUFFIXATIONS +SUFFIXED +SUFFIXES +SUFFIXING +SUFFIXION +SUFFIXIONS +SUFFLATE +SUFFLATED +SUFFLATES +SUFFLATING +SUFFOCATE +SUFFOCATED +SUFFOCATES +SUFFOCATING +SUFFOCATINGLY +SUFFOCATION +SUFFOCATIONS +SUFFOCATIVE +SUFFRAGAN +SUFFRAGANS +SUFFRAGE +SUFFRAGES +SUFFRAGETTE +SUFFRAGETTES +SUFFRAGIST +SUFFRAGISTS +SUFFUSE +SUFFUSED +SUFFUSES +SUFFUSING +SUFFUSION +SUFFUSIONS +SUFFUSIVE +SUGAR +SUGARBERRIES +SUGARBERRY +SUGARBUSH +SUGARBUSHES +SUGARCANE +SUGARCANES +SUGARCOAT +SUGARCOATED +SUGARCOATING +SUGARCOATS +SUGARED +SUGARER +SUGARERS +SUGARHOUSE +SUGARHOUSES +SUGARIER +SUGARIEST +SUGARING +SUGARLESS +SUGARLIKE +SUGARLOAF +SUGARLOAVES +SUGARPLUM +SUGARPLUMS +SUGARS +SUGARY +SUGGEST +SUGGESTED +SUGGESTER +SUGGESTERS +SUGGESTIBILITY +SUGGESTIBLE +SUGGESTING +SUGGESTION +SUGGESTIONS +SUGGESTIVE +SUGGESTIVELY +SUGGESTIVENESS +SUGGESTS +SUGH +SUGHED +SUGHING +SUGHS +SUICIDAL +SUICIDALLY +SUICIDE +SUICIDED +SUICIDES +SUICIDING +SUING +SUINT +SUINTS +SUIT +SUITABILITIES +SUITABILITY +SUITABLE +SUITABLENESS +SUITABLENESSES +SUITABLY +SUITCASE +SUITCASES +SUITE +SUITED +SUITER +SUITERS +SUITES +SUITING +SUITINGS +SUITLIKE +SUITOR +SUITORS +SUITS +SUK +SUKIYAKI +SUKIYAKIS +SUKKAH +SUKKAHS +SUKKOT +SUKKOTH +SUKS +SULCAL +SULCATE +SULCATED +SULCATION +SULCATIONS +SULCI +SULCUS +SULDAN +SULDANS +SULFA +SULFADIAZINE +SULFADIAZINES +SULFANILAMIDE +SULFANILAMIDES +SULFAS +SULFATASE +SULFATASES +SULFATE +SULFATED +SULFATES +SULFATING +SULFATION +SULFATIONS +SULFHYDRYL +SULFHYDRYLS +SULFID +SULFIDE +SULFIDES +SULFIDS +SULFINPYRAZONE +SULFINPYRAZONES +SULFINYL +SULFINYLS +SULFITE +SULFITES +SULFITIC +SULFO +SULFONAMIDE +SULFONAMIDES +SULFONATE +SULFONATED +SULFONATES +SULFONATING +SULFONATION +SULFONATIONS +SULFONE +SULFONES +SULFONIC +SULFONIUM +SULFONIUMS +SULFONYL +SULFONYLS +SULFONYLUREA +SULFONYLUREAS +SULFOXIDE +SULFOXIDES +SULFUR +SULFURATE +SULFURATED +SULFURATES +SULFURATING +SULFURED +SULFURET +SULFURETED +SULFURETING +SULFURETS +SULFURETTED +SULFURETTING +SULFURIC +SULFURING +SULFURIZE +SULFURIZED +SULFURIZES +SULFURIZING +SULFUROUS +SULFUROUSLY +SULFUROUSNESS +SULFUROUSNESSES +SULFURS +SULFURY +SULFURYL +SULFURYLS +SULK +SULKED +SULKER +SULKERS +SULKIER +SULKIES +SULKIEST +SULKILY +SULKINESS +SULKINESSES +SULKING +SULKS +SULKY +SULLAGE +SULLAGES +SULLEN +SULLENER +SULLENEST +SULLENLY +SULLENNESS +SULLENNESSES +SULLIABLE +SULLIED +SULLIES +SULLY +SULLYING +SULPHA +SULPHAS +SULPHATE +SULPHATED +SULPHATES +SULPHATING +SULPHID +SULPHIDE +SULPHIDES +SULPHIDS +SULPHITE +SULPHITES +SULPHONE +SULPHONES +SULPHUR +SULPHURED +SULPHUREOUS +SULPHURING +SULPHURISE +SULPHURISED +SULPHURISES +SULPHURISING +SULPHUROUS +SULPHURS +SULPHURY +SULTAN +SULTANA +SULTANAS +SULTANATE +SULTANATES +SULTANESS +SULTANESSES +SULTANIC +SULTANS +SULTRIER +SULTRIEST +SULTRILY +SULTRINESS +SULTRINESSES +SULTRY +SULU +SULUS +SUM +SUMAC +SUMACH +SUMACHS +SUMACS +SUMLESS +SUMMA +SUMMABILITIES +SUMMABILITY +SUMMABLE +SUMMAE +SUMMAND +SUMMANDS +SUMMARIES +SUMMARILY +SUMMARISE +SUMMARISED +SUMMARISES +SUMMARISING +SUMMARIST +SUMMARISTS +SUMMARIZABLE +SUMMARIZATION +SUMMARIZATIONS +SUMMARIZE +SUMMARIZED +SUMMARIZER +SUMMARIZERS +SUMMARIZES +SUMMARIZING +SUMMARY +SUMMAS +SUMMATE +SUMMATED +SUMMATES +SUMMATING +SUMMATION +SUMMATIONAL +SUMMATIONS +SUMMATIVE +SUMMED +SUMMER +SUMMERED +SUMMERHOUSE +SUMMERHOUSES +SUMMERIER +SUMMERIEST +SUMMERING +SUMMERLIKE +SUMMERLONG +SUMMERLY +SUMMERS +SUMMERSAULT +SUMMERSAULTED +SUMMERSAULTING +SUMMERSAULTS +SUMMERSET +SUMMERSETS +SUMMERSETTED +SUMMERSETTING +SUMMERTIME +SUMMERTIMES +SUMMERWOOD +SUMMERWOODS +SUMMERY +SUMMING +SUMMIT +SUMMITAL +SUMMITED +SUMMITEER +SUMMITEERS +SUMMITING +SUMMITRIES +SUMMITRY +SUMMITS +SUMMON +SUMMONABLE +SUMMONED +SUMMONER +SUMMONERS +SUMMONING +SUMMONS +SUMMONSED +SUMMONSES +SUMMONSING +SUMO +SUMOIST +SUMOISTS +SUMOS +SUMP +SUMPS +SUMPTER +SUMPTERS +SUMPTUARY +SUMPTUOUS +SUMPTUOUSLY +SUMPTUOUSNESS +SUMPTUOUSNESSES +SUMPWEED +SUMPWEEDS +SUMS +SUN +SUNBACK +SUNBAKED +SUNBATH +SUNBATHE +SUNBATHED +SUNBATHER +SUNBATHERS +SUNBATHES +SUNBATHING +SUNBATHS +SUNBEAM +SUNBEAMS +SUNBEAMY +SUNBELT +SUNBELTS +SUNBIRD +SUNBIRDS +SUNBLOCK +SUNBLOCKS +SUNBONNET +SUNBONNETS +SUNBOW +SUNBOWS +SUNBURN +SUNBURNED +SUNBURNING +SUNBURNS +SUNBURNT +SUNBURST +SUNBURSTS +SUNCHOKE +SUNCHOKES +SUNDAE +SUNDAES +SUNDECK +SUNDECKS +SUNDER +SUNDERED +SUNDERER +SUNDERERS +SUNDERING +SUNDERS +SUNDEW +SUNDEWS +SUNDIAL +SUNDIALS +SUNDOG +SUNDOGS +SUNDOWN +SUNDOWNED +SUNDOWNER +SUNDOWNERS +SUNDOWNING +SUNDOWNS +SUNDRESS +SUNDRESSES +SUNDRIES +SUNDRILY +SUNDROPS +SUNDRY +SUNFAST +SUNFISH +SUNFISHES +SUNFLOWER +SUNFLOWERS +SUNG +SUNGLASS +SUNGLASSES +SUNGLOW +SUNGLOWS +SUNK +SUNKEN +SUNKET +SUNKETS +SUNLAMP +SUNLAMPS +SUNLAND +SUNLANDS +SUNLESS +SUNLIGHT +SUNLIGHTS +SUNLIKE +SUNLIT +SUNN +SUNNA +SUNNAH +SUNNAHS +SUNNAS +SUNNED +SUNNIER +SUNNIEST +SUNNILY +SUNNINESS +SUNNINESSES +SUNNING +SUNNS +SUNNY +SUNPORCH +SUNPORCHES +SUNPROOF +SUNRAY +SUNRAYS +SUNRISE +SUNRISES +SUNROOF +SUNROOFS +SUNROOM +SUNROOMS +SUNS +SUNSCALD +SUNSCALDS +SUNSCREEN +SUNSCREENING +SUNSCREENS +SUNSEEKER +SUNSEEKERS +SUNSET +SUNSETS +SUNSHADE +SUNSHADES +SUNSHINE +SUNSHINES +SUNSHINY +SUNSPOT +SUNSPOTS +SUNSTONE +SUNSTONES +SUNSTROKE +SUNSTROKES +SUNSTRUCK +SUNSUIT +SUNSUITS +SUNTAN +SUNTANNED +SUNTANNING +SUNTANS +SUNUP +SUNUPS +SUNWARD +SUNWARDS +SUNWISE +SUP +SUPE +SUPER +SUPERABLE +SUPERABLENESS +SUPERABLENESSES +SUPERABLY +SUPERABOUND +SUPERABOUNDED +SUPERABOUNDING +SUPERABOUNDS +SUPERABSORBENT +SUPERABSORBENTS +SUPERABUNDANCE +SUPERABUNDANCES +SUPERABUNDANT +SUPERABUNDANTLY +SUPERACHIEVER +SUPERACHIEVERS +SUPERACTIVITIES +SUPERACTIVITY +SUPERADD +SUPERADDED +SUPERADDING +SUPERADDITION +SUPERADDITIONS +SUPERADDS +SUPERAGENCIES +SUPERAGENCY +SUPERAGENT +SUPERAGENTS +SUPERALLOY +SUPERALLOYS +SUPERALTERN +SUPERALTERNS +SUPERAMBITIOUS +SUPERANNUATE +SUPERANNUATED +SUPERANNUATES +SUPERANNUATING +SUPERANNUATION +SUPERANNUATIONS +SUPERATHLETE +SUPERATHLETES +SUPERATOM +SUPERATOMS +SUPERB +SUPERBAD +SUPERBANK +SUPERBANKS +SUPERBER +SUPERBEST +SUPERBITCH +SUPERBITCHES +SUPERBLOCK +SUPERBLOCKS +SUPERBLY +SUPERBNESS +SUPERBNESSES +SUPERBOARD +SUPERBOARDS +SUPERBOMB +SUPERBOMBER +SUPERBOMBERS +SUPERBOMBS +SUPERBRIGHT +SUPERBUG +SUPERBUGS +SUPERBUREAUCRAT +SUPERCABINET +SUPERCABINETS +SUPERCALENDER +SUPERCALENDERED +SUPERCALENDERS +SUPERCAR +SUPERCARGO +SUPERCARGOES +SUPERCARGOS +SUPERCARRIER +SUPERCARRIERS +SUPERCARS +SUPERCAUTIOUS +SUPERCEDE +SUPERCEDED +SUPERCEDES +SUPERCEDING +SUPERCENTER +SUPERCENTERS +SUPERCHARGE +SUPERCHARGED +SUPERCHARGER +SUPERCHARGERS +SUPERCHARGES +SUPERCHARGING +SUPERCHIC +SUPERCHURCH +SUPERCHURCHES +SUPERCILIARY +SUPERCILIOUS +SUPERCILIOUSLY +SUPERCITIES +SUPERCITY +SUPERCIVILIZED +SUPERCLASS +SUPERCLASSES +SUPERCLEAN +SUPERCLUB +SUPERCLUBS +SUPERCLUSTER +SUPERCLUSTERS +SUPERCOIL +SUPERCOILED +SUPERCOILING +SUPERCOILS +SUPERCOLLIDER +SUPERCOLLIDERS +SUPERCOLOSSAL +SUPERCOMPUTER +SUPERCOMPUTERS +SUPERCONDUCT +SUPERCONDUCTED +SUPERCONDUCTING +SUPERCONDUCTIVE +SUPERCONDUCTOR +SUPERCONDUCTORS +SUPERCONDUCTS +SUPERCONFIDENT +SUPERCONTINENT +SUPERCONTINENTS +SUPERCONVENIENT +SUPERCOOL +SUPERCOOLED +SUPERCOOLING +SUPERCOOLS +SUPERCOP +SUPERCOPS +SUPERCRIMINAL +SUPERCRIMINALS +SUPERCRITICAL +SUPERCURRENT +SUPERCURRENTS +SUPERCUTE +SUPERDELUXE +SUPERDIPLOMAT +SUPERDIPLOMATS +SUPERED +SUPEREFFECTIVE +SUPEREFFICIENCY +SUPEREFFICIENT +SUPEREGO +SUPEREGOIST +SUPEREGOISTS +SUPEREGOS +SUPERELEVATE +SUPERELEVATED +SUPERELEVATES +SUPERELEVATING +SUPERELEVATION +SUPERELEVATIONS +SUPERELITE +SUPEREMINENCE +SUPEREMINENCES +SUPEREMINENT +SUPEREMINENTLY +SUPEREROGATION +SUPEREROGATIONS +SUPEREROGATORY +SUPERETTE +SUPERETTES +SUPEREXPENSIVE +SUPEREXPRESS +SUPEREXPRESSES +SUPERFAMILIES +SUPERFAMILY +SUPERFAN +SUPERFANS +SUPERFARM +SUPERFARMS +SUPERFAST +SUPERFATTED +SUPERFETATION +SUPERFETATIONS +SUPERFICIAL +SUPERFICIALITY +SUPERFICIALLY +SUPERFICIES +SUPERFINE +SUPERFIRM +SUPERFIRMS +SUPERFIX +SUPERFIXES +SUPERFLACK +SUPERFLACKS +SUPERFLUID +SUPERFLUIDITIES +SUPERFLUIDITY +SUPERFLUIDS +SUPERFLUITIES +SUPERFLUITY +SUPERFLUOUS +SUPERFLUOUSLY +SUPERFLUOUSNESS +SUPERFUND +SUPERFUNDS +SUPERGENE +SUPERGENES +SUPERGIANT +SUPERGIANTS +SUPERGLUE +SUPERGLUED +SUPERGLUES +SUPERGLUING +SUPERGOOD +SUPERGOVERNMENT +SUPERGRAPHICS +SUPERGRAVITIES +SUPERGRAVITY +SUPERGROUP +SUPERGROUPS +SUPERGROWTH +SUPERGROWTHS +SUPERHARDEN +SUPERHARDENED +SUPERHARDENING +SUPERHARDENS +SUPERHEAT +SUPERHEATED +SUPERHEATER +SUPERHEATERS +SUPERHEATING +SUPERHEATS +SUPERHEAVIES +SUPERHEAVY +SUPERHELICAL +SUPERHELICES +SUPERHELIX +SUPERHELIXES +SUPERHERO +SUPERHEROES +SUPERHEROINE +SUPERHEROINES +SUPERHETERODYNE +SUPERHIGHWAY +SUPERHIGHWAYS +SUPERHIT +SUPERHITS +SUPERHOT +SUPERHUMAN +SUPERHUMANITIES +SUPERHUMANITY +SUPERHUMANLY +SUPERHUMANNESS +SUPERHYPE +SUPERHYPED +SUPERHYPES +SUPERHYPING +SUPERIMPOSABLE +SUPERIMPOSE +SUPERIMPOSED +SUPERIMPOSES +SUPERIMPOSING +SUPERIMPOSITION +SUPERINCUMBENT +SUPERINDIVIDUAL +SUPERINDUCE +SUPERINDUCED +SUPERINDUCES +SUPERINDUCING +SUPERINDUCTION +SUPERINDUCTIONS +SUPERINFECT +SUPERINFECTED +SUPERINFECTING +SUPERINFECTION +SUPERINFECTIONS +SUPERINFECTS +SUPERING +SUPERINSULATED +SUPERINTEND +SUPERINTENDED +SUPERINTENDENCE +SUPERINTENDENCY +SUPERINTENDENT +SUPERINTENDENTS +SUPERINTENDING +SUPERINTENDS +SUPERINTENSITY +SUPERIOR +SUPERIORITIES +SUPERIORITY +SUPERIORLY +SUPERIORS +SUPERJACENT +SUPERJET +SUPERJETS +SUPERJOCK +SUPERJOCKS +SUPERJUMBO +SUPERJUMBOS +SUPERLAIN +SUPERLARGE +SUPERLATIVE +SUPERLATIVELY +SUPERLATIVENESS +SUPERLATIVES +SUPERLAWYER +SUPERLAWYERS +SUPERLAY +SUPERLIE +SUPERLIES +SUPERLIGHT +SUPERLINER +SUPERLINERS +SUPERLOBBYIST +SUPERLOBBYISTS +SUPERLONG +SUPERLOYALIST +SUPERLOYALISTS +SUPERLUNAR +SUPERLUNARY +SUPERLUXURIOUS +SUPERLUXURY +SUPERLYING +SUPERMACHO +SUPERMAJORITIES +SUPERMAJORITY +SUPERMALE +SUPERMALES +SUPERMAN +SUPERMARKET +SUPERMARKETS +SUPERMASCULINE +SUPERMASSIVE +SUPERMEN +SUPERMICRO +SUPERMICROS +SUPERMILITANT +SUPERMILITANTS +SUPERMIND +SUPERMINDS +SUPERMINI +SUPERMINIS +SUPERMINISTER +SUPERMINISTERS +SUPERMODEL +SUPERMODELS +SUPERMODERN +SUPERMOM +SUPERMOMS +SUPERNAL +SUPERNALLY +SUPERNATANT +SUPERNATANTS +SUPERNATE +SUPERNATES +SUPERNATION +SUPERNATIONAL +SUPERNATIONS +SUPERNATURAL +SUPERNATURALISM +SUPERNATURALIST +SUPERNATURALLY +SUPERNATURALS +SUPERNATURE +SUPERNATURES +SUPERNORMAL +SUPERNORMALITY +SUPERNORMALLY +SUPERNOVA +SUPERNOVAE +SUPERNOVAS +SUPERNUMERARIES +SUPERNUMERARY +SUPERNUTRITION +SUPERNUTRITIONS +SUPERORDER +SUPERORDERS +SUPERORDINATE +SUPERORGANIC +SUPERORGANISM +SUPERORGANISMS +SUPERORGASM +SUPERORGASMS +SUPEROVULATE +SUPEROVULATED +SUPEROVULATES +SUPEROVULATING +SUPEROVULATION +SUPEROVULATIONS +SUPEROXIDE +SUPEROXIDES +SUPERPARASITISM +SUPERPATRIOT +SUPERPATRIOTIC +SUPERPATRIOTISM +SUPERPATRIOTS +SUPERPERSON +SUPERPERSONAL +SUPERPERSONS +SUPERPHENOMENA +SUPERPHENOMENON +SUPERPHOSPHATE +SUPERPHOSPHATES +SUPERPHYSICAL +SUPERPIMP +SUPERPIMPS +SUPERPLANE +SUPERPLANES +SUPERPLASTIC +SUPERPLASTICITY +SUPERPLAYER +SUPERPLAYERS +SUPERPOLITE +SUPERPORT +SUPERPORTS +SUPERPOSABLE +SUPERPOSE +SUPERPOSED +SUPERPOSES +SUPERPOSING +SUPERPOSITION +SUPERPOSITIONS +SUPERPOWER +SUPERPOWERED +SUPERPOWERFUL +SUPERPOWERS +SUPERPREMIUM +SUPERPREMIUMS +SUPERPRO +SUPERPROFIT +SUPERPROFITS +SUPERPROS +SUPERQUALITY +SUPERRACE +SUPERRACES +SUPERREAL +SUPERREALISM +SUPERREALISMS +SUPERREGIONAL +SUPERREGIONALS +SUPERRICH +SUPERROAD +SUPERROADS +SUPERROMANTIC +SUPERS +SUPERSAFE +SUPERSALE +SUPERSALES +SUPERSALESMAN +SUPERSALESMEN +SUPERSATURATE +SUPERSATURATED +SUPERSATURATES +SUPERSATURATING +SUPERSATURATION +SUPERSAUR +SUPERSAURS +SUPERSCALE +SUPERSCHOOL +SUPERSCHOOLS +SUPERSCOUT +SUPERSCOUTS +SUPERSCRIBE +SUPERSCRIBED +SUPERSCRIBES +SUPERSCRIBING +SUPERSCRIPT +SUPERSCRIPTION +SUPERSCRIPTIONS +SUPERSCRIPTS +SUPERSECRECIES +SUPERSECRECY +SUPERSECRET +SUPERSEDE +SUPERSEDEAS +SUPERSEDED +SUPERSEDER +SUPERSEDERS +SUPERSEDES +SUPERSEDING +SUPERSEDURE +SUPERSEDURES +SUPERSELL +SUPERSELLER +SUPERSELLERS +SUPERSELLING +SUPERSELLS +SUPERSENSIBLE +SUPERSENSITIVE +SUPERSENSORY +SUPERSESSION +SUPERSESSIONS +SUPERSEX +SUPERSEXES +SUPERSEXUALITY +SUPERSHARP +SUPERSHOW +SUPERSHOWS +SUPERSINGER +SUPERSINGERS +SUPERSIZE +SUPERSIZED +SUPERSIZES +SUPERSIZING +SUPERSLEUTH +SUPERSLEUTHS +SUPERSLICK +SUPERSMART +SUPERSMOOTH +SUPERSOFT +SUPERSOLD +SUPERSONIC +SUPERSONICALLY +SUPERSONICS +SUPERSPECIAL +SUPERSPECIALIST +SUPERSPECIALS +SUPERSPECTACLE +SUPERSPECTACLES +SUPERSPIES +SUPERSPY +SUPERSTAR +SUPERSTARDOM +SUPERSTARDOMS +SUPERSTARS +SUPERSTATE +SUPERSTATES +SUPERSTATION +SUPERSTATIONS +SUPERSTIMULATE +SUPERSTIMULATED +SUPERSTIMULATES +SUPERSTITION +SUPERSTITIONS +SUPERSTITIOUS +SUPERSTITIOUSLY +SUPERSTOCK +SUPERSTOCKS +SUPERSTORE +SUPERSTORES +SUPERSTRATA +SUPERSTRATUM +SUPERSTRENGTH +SUPERSTRENGTHS +SUPERSTRIKE +SUPERSTRIKES +SUPERSTRING +SUPERSTRINGS +SUPERSTRONG +SUPERSTRUCTURAL +SUPERSTRUCTURE +SUPERSTRUCTURES +SUPERSTUD +SUPERSTUDS +SUPERSUBTLE +SUPERSUBTLETIES +SUPERSUBTLETY +SUPERSURGEON +SUPERSURGEONS +SUPERSWEET +SUPERSYMMETRIC +SUPERSYMMETRIES +SUPERSYMMETRY +SUPERSYSTEM +SUPERSYSTEMS +SUPERTANKER +SUPERTANKERS +SUPERTAX +SUPERTAXES +SUPERTERRIFIC +SUPERTHICK +SUPERTHIN +SUPERTHRILLER +SUPERTHRILLERS +SUPERTIGHT +SUPERTONIC +SUPERTONICS +SUPERVENE +SUPERVENED +SUPERVENES +SUPERVENIENT +SUPERVENING +SUPERVENTION +SUPERVENTIONS +SUPERVIRILE +SUPERVIRTUOSI +SUPERVIRTUOSO +SUPERVIRTUOSOS +SUPERVISE +SUPERVISED +SUPERVISES +SUPERVISING +SUPERVISION +SUPERVISIONS +SUPERVISOR +SUPERVISORS +SUPERVISORY +SUPERWAVE +SUPERWAVES +SUPERWEAPON +SUPERWEAPONS +SUPERWIDE +SUPERWIDES +SUPERWIFE +SUPERWIVES +SUPERWOMAN +SUPERWOMEN +SUPES +SUPINATE +SUPINATED +SUPINATES +SUPINATING +SUPINATION +SUPINATIONS +SUPINATOR +SUPINATORS +SUPINE +SUPINELY +SUPINENESS +SUPINENESSES +SUPINES +SUPPED +SUPPER +SUPPERS +SUPPING +SUPPLANT +SUPPLANTATION +SUPPLANTATIONS +SUPPLANTED +SUPPLANTER +SUPPLANTERS +SUPPLANTING +SUPPLANTS +SUPPLE +SUPPLED +SUPPLEJACK +SUPPLEJACKS +SUPPLELY +SUPPLEMENT +SUPPLEMENTAL +SUPPLEMENTALS +SUPPLEMENTARY +SUPPLEMENTATION +SUPPLEMENTED +SUPPLEMENTER +SUPPLEMENTERS +SUPPLEMENTING +SUPPLEMENTS +SUPPLENESS +SUPPLENESSES +SUPPLER +SUPPLES +SUPPLEST +SUPPLETION +SUPPLETIONS +SUPPLETIVE +SUPPLETORY +SUPPLIANCE +SUPPLIANCES +SUPPLIANT +SUPPLIANTLY +SUPPLIANTS +SUPPLICANT +SUPPLICANTS +SUPPLICATE +SUPPLICATED +SUPPLICATES +SUPPLICATING +SUPPLICATION +SUPPLICATIONS +SUPPLICATORY +SUPPLIED +SUPPLIER +SUPPLIERS +SUPPLIES +SUPPLING +SUPPLY +SUPPLYING +SUPPORT +SUPPORTABILITY +SUPPORTABLE +SUPPORTED +SUPPORTER +SUPPORTERS +SUPPORTING +SUPPORTIVE +SUPPORTIVENESS +SUPPORTS +SUPPOSABLE +SUPPOSABLY +SUPPOSAL +SUPPOSALS +SUPPOSE +SUPPOSED +SUPPOSEDLY +SUPPOSER +SUPPOSERS +SUPPOSES +SUPPOSING +SUPPOSITION +SUPPOSITIONAL +SUPPOSITIONS +SUPPOSITIOUS +SUPPOSITITIOUS +SUPPOSITORIES +SUPPOSITORY +SUPPRESS +SUPPRESSANT +SUPPRESSANTS +SUPPRESSED +SUPPRESSES +SUPPRESSIBILITY +SUPPRESSIBLE +SUPPRESSING +SUPPRESSION +SUPPRESSIONS +SUPPRESSIVE +SUPPRESSIVENESS +SUPPRESSOR +SUPPRESSORS +SUPPURATE +SUPPURATED +SUPPURATES +SUPPURATING +SUPPURATION +SUPPURATIONS +SUPPURATIVE +SUPRA +SUPRALIMINAL +SUPRAMOLECULAR +SUPRANATIONAL +SUPRAOPTIC +SUPRAORBITAL +SUPRARATIONAL +SUPRARENAL +SUPRARENALS +SUPRASEGMENTAL +SUPRAVITAL +SUPRAVITALLY +SUPREMACIES +SUPREMACIST +SUPREMACISTS +SUPREMACY +SUPREMATISM +SUPREMATISMS +SUPREMATIST +SUPREMATISTS +SUPREME +SUPREMELY +SUPREMENESS +SUPREMENESSES +SUPREMER +SUPREMES +SUPREMEST +SUPREMO +SUPREMOS +SUPS +SUQ +SUQS +SURA +SURAH +SURAHS +SURAL +SURAS +SURBASE +SURBASED +SURBASES +SURCEASE +SURCEASED +SURCEASES +SURCEASING +SURCHARGE +SURCHARGED +SURCHARGES +SURCHARGING +SURCINGLE +SURCINGLED +SURCINGLES +SURCINGLING +SURCOAT +SURCOATS +SURCULOSE +SURD +SURDS +SURE +SUREFIRE +SUREFOOTED +SUREFOOTEDLY +SUREFOOTEDNESS +SURELY +SURENESS +SURENESSES +SURER +SUREST +SURETIES +SURETY +SURETYSHIP +SURETYSHIPS +SURF +SURFABLE +SURFACE +SURFACED +SURFACER +SURFACERS +SURFACES +SURFACING +SURFACINGS +SURFACTANT +SURFACTANTS +SURFBIRD +SURFBIRDS +SURFBOARD +SURFBOARDED +SURFBOARDER +SURFBOARDERS +SURFBOARDING +SURFBOARDS +SURFBOAT +SURFBOATS +SURFED +SURFEIT +SURFEITED +SURFEITER +SURFEITERS +SURFEITING +SURFEITS +SURFER +SURFERS +SURFFISH +SURFFISHES +SURFICIAL +SURFIER +SURFIEST +SURFING +SURFINGS +SURFLIKE +SURFMAN +SURFMEN +SURFPERCH +SURFPERCHES +SURFS +SURFSIDE +SURFY +SURGE +SURGED +SURGEON +SURGEONFISH +SURGEONFISHES +SURGEONS +SURGER +SURGERIES +SURGERS +SURGERY +SURGES +SURGICAL +SURGICALLY +SURGING +SURGY +SURICATE +SURICATES +SURIMI +SURIMIS +SURJECTION +SURJECTIONS +SURJECTIVE +SURLIER +SURLIEST +SURLILY +SURLINESS +SURLINESSES +SURLY +SURMISE +SURMISED +SURMISER +SURMISERS +SURMISES +SURMISING +SURMOUNT +SURMOUNTABLE +SURMOUNTED +SURMOUNTING +SURMOUNTS +SURMULLET +SURMULLETS +SURNAME +SURNAMED +SURNAMER +SURNAMERS +SURNAMES +SURNAMING +SURPASS +SURPASSABLE +SURPASSED +SURPASSER +SURPASSERS +SURPASSES +SURPASSING +SURPASSINGLY +SURPLICE +SURPLICED +SURPLICES +SURPLUS +SURPLUSAGE +SURPLUSAGES +SURPLUSED +SURPLUSES +SURPLUSING +SURPLUSSED +SURPLUSSES +SURPLUSSING +SURPRINT +SURPRINTED +SURPRINTING +SURPRINTS +SURPRISAL +SURPRISALS +SURPRISE +SURPRISED +SURPRISER +SURPRISERS +SURPRISES +SURPRISING +SURPRISINGLY +SURPRIZE +SURPRIZED +SURPRIZES +SURPRIZING +SURRA +SURRAS +SURREAL +SURREALISM +SURREALISMS +SURREALIST +SURREALISTIC +SURREALISTS +SURREALLY +SURREBUTTER +SURREBUTTERS +SURREJOINDER +SURREJOINDERS +SURRENDER +SURRENDERED +SURRENDERING +SURRENDERS +SURREPTITIOUS +SURREPTITIOUSLY +SURREY +SURREYS +SURROGACIES +SURROGACY +SURROGATE +SURROGATED +SURROGATES +SURROGATING +SURROUND +SURROUNDED +SURROUNDING +SURROUNDINGS +SURROUNDS +SURROYAL +SURROYALS +SURTAX +SURTAXED +SURTAXES +SURTAXING +SURTITLE +SURTITLES +SURTOUT +SURTOUTS +SURVEIL +SURVEILLANCE +SURVEILLANCES +SURVEILLANT +SURVEILLANTS +SURVEILLED +SURVEILLING +SURVEILS +SURVEY +SURVEYED +SURVEYING +SURVEYINGS +SURVEYOR +SURVEYORS +SURVEYS +SURVIVABILITIES +SURVIVABILITY +SURVIVABLE +SURVIVAL +SURVIVALIST +SURVIVALISTS +SURVIVALS +SURVIVANCE +SURVIVANCES +SURVIVE +SURVIVED +SURVIVER +SURVIVERS +SURVIVES +SURVIVING +SURVIVOR +SURVIVORS +SURVIVORSHIP +SURVIVORSHIPS +SUSCEPTIBILITY +SUSCEPTIBLE +SUSCEPTIBLENESS +SUSCEPTIBLY +SUSCEPTIVE +SUSCEPTIVENESS +SUSCEPTIVITIES +SUSCEPTIVITY +SUSHI +SUSHIS +SUSLIK +SUSLIKS +SUSPECT +SUSPECTED +SUSPECTING +SUSPECTS +SUSPEND +SUSPENDED +SUSPENDER +SUSPENDERED +SUSPENDERS +SUSPENDING +SUSPENDS +SUSPENSE +SUSPENSEFUL +SUSPENSEFULLY +SUSPENSEFULNESS +SUSPENSELESS +SUSPENSER +SUSPENSERS +SUSPENSES +SUSPENSION +SUSPENSIONS +SUSPENSIVE +SUSPENSIVELY +SUSPENSOR +SUSPENSORIES +SUSPENSORS +SUSPENSORY +SUSPICION +SUSPICIONED +SUSPICIONING +SUSPICIONS +SUSPICIOUS +SUSPICIOUSLY +SUSPICIOUSNESS +SUSPIRATION +SUSPIRATIONS +SUSPIRE +SUSPIRED +SUSPIRES +SUSPIRING +SUSS +SUSSED +SUSSES +SUSSING +SUSTAIN +SUSTAINABILITY +SUSTAINABLE +SUSTAINED +SUSTAINEDLY +SUSTAINER +SUSTAINERS +SUSTAINING +SUSTAINS +SUSTENANCE +SUSTENANCES +SUSTENTATION +SUSTENTATIONS +SUSTENTATIVE +SUSURRANT +SUSURRATE +SUSURRATED +SUSURRATES +SUSURRATING +SUSURRATION +SUSURRATIONS +SUSURROUS +SUSURRUS +SUSURRUSES +SUTLER +SUTLERS +SUTRA +SUTRAS +SUTTA +SUTTAS +SUTTEE +SUTTEES +SUTURAL +SUTURALLY +SUTURE +SUTURED +SUTURES +SUTURING +SUZERAIN +SUZERAINS +SUZERAINTIES +SUZERAINTY +SVARAJ +SVARAJES +SVEDBERG +SVEDBERGS +SVELTE +SVELTELY +SVELTENESS +SVELTENESSES +SVELTER +SVELTEST +SWAB +SWABBED +SWABBER +SWABBERS +SWABBIE +SWABBIES +SWABBING +SWABBY +SWABS +SWACKED +SWADDLE +SWADDLED +SWADDLES +SWADDLING +SWAG +SWAGE +SWAGED +SWAGER +SWAGERS +SWAGES +SWAGGED +SWAGGER +SWAGGERED +SWAGGERER +SWAGGERERS +SWAGGERING +SWAGGERINGLY +SWAGGERS +SWAGGIE +SWAGGIES +SWAGGING +SWAGING +SWAGMAN +SWAGMEN +SWAGS +SWAIL +SWAILS +SWAIN +SWAINISH +SWAINISHNESS +SWAINISHNESSES +SWAINS +SWALE +SWALES +SWALLOW +SWALLOWABLE +SWALLOWED +SWALLOWER +SWALLOWERS +SWALLOWING +SWALLOWS +SWALLOWTAIL +SWALLOWTAILS +SWAM +SWAMI +SWAMIES +SWAMIS +SWAMP +SWAMPED +SWAMPER +SWAMPERS +SWAMPIER +SWAMPIEST +SWAMPINESS +SWAMPINESSES +SWAMPING +SWAMPISH +SWAMPLAND +SWAMPLANDS +SWAMPS +SWAMPY +SWAMY +SWAN +SWANG +SWANHERD +SWANHERDS +SWANK +SWANKED +SWANKER +SWANKEST +SWANKIER +SWANKIEST +SWANKILY +SWANKINESS +SWANKINESSES +SWANKING +SWANKS +SWANKY +SWANLIKE +SWANNED +SWANNERIES +SWANNERY +SWANNING +SWANNY +SWANPAN +SWANPANS +SWANS +SWANSDOWN +SWANSDOWNS +SWANSKIN +SWANSKINS +SWAP +SWAPPED +SWAPPER +SWAPPERS +SWAPPING +SWAPS +SWARAJ +SWARAJES +SWARAJISM +SWARAJISMS +SWARAJIST +SWARAJISTS +SWARD +SWARDED +SWARDING +SWARDS +SWARE +SWARF +SWARFS +SWARM +SWARMED +SWARMER +SWARMERS +SWARMING +SWARMS +SWART +SWARTH +SWARTHIER +SWARTHIEST +SWARTHILY +SWARTHINESS +SWARTHINESSES +SWARTHS +SWARTHY +SWARTNESS +SWARTNESSES +SWARTY +SWASH +SWASHBUCKLE +SWASHBUCKLED +SWASHBUCKLER +SWASHBUCKLERS +SWASHBUCKLES +SWASHBUCKLING +SWASHED +SWASHER +SWASHERS +SWASHES +SWASHING +SWASTICA +SWASTICAS +SWASTIKA +SWASTIKAS +SWAT +SWATCH +SWATCHES +SWATH +SWATHE +SWATHED +SWATHER +SWATHERS +SWATHES +SWATHING +SWATHS +SWATS +SWATTED +SWATTER +SWATTERS +SWATTING +SWAY +SWAYABLE +SWAYBACK +SWAYBACKED +SWAYBACKS +SWAYED +SWAYER +SWAYERS +SWAYFUL +SWAYING +SWAYS +SWEAR +SWEARER +SWEARERS +SWEARING +SWEARS +SWEARWORD +SWEARWORDS +SWEAT +SWEATBAND +SWEATBANDS +SWEATBOX +SWEATBOXES +SWEATED +SWEATER +SWEATERDRESS +SWEATERDRESSES +SWEATERS +SWEATIER +SWEATIEST +SWEATILY +SWEATINESS +SWEATINESSES +SWEATING +SWEATPANTS +SWEATS +SWEATSHIRT +SWEATSHIRTS +SWEATSHOP +SWEATSHOPS +SWEATSUIT +SWEATSUITS +SWEATY +SWEDE +SWEDES +SWEENEY +SWEENEYS +SWEENIES +SWEENY +SWEEP +SWEEPBACK +SWEEPBACKS +SWEEPER +SWEEPERS +SWEEPIER +SWEEPIEST +SWEEPING +SWEEPINGLY +SWEEPINGNESS +SWEEPINGNESSES +SWEEPINGS +SWEEPS +SWEEPSTAKES +SWEEPY +SWEER +SWEET +SWEETBREAD +SWEETBREADS +SWEETBRIAR +SWEETBRIARS +SWEETBRIER +SWEETBRIERS +SWEETEN +SWEETENED +SWEETENER +SWEETENERS +SWEETENING +SWEETENINGS +SWEETENS +SWEETER +SWEETEST +SWEETHEART +SWEETHEARTS +SWEETIE +SWEETIES +SWEETING +SWEETINGS +SWEETISH +SWEETISHLY +SWEETLY +SWEETMEAT +SWEETMEATS +SWEETNESS +SWEETNESSES +SWEETS +SWEETSHOP +SWEETSHOPS +SWEETSOP +SWEETSOPS +SWELL +SWELLED +SWELLER +SWELLEST +SWELLFISH +SWELLFISHES +SWELLHEAD +SWELLHEADED +SWELLHEADEDNESS +SWELLHEADS +SWELLING +SWELLINGS +SWELLS +SWELTER +SWELTERED +SWELTERING +SWELTERINGLY +SWELTERS +SWELTRIER +SWELTRIEST +SWELTRY +SWEPT +SWEPTBACK +SWEPTWING +SWEPTWINGS +SWERVE +SWERVED +SWERVER +SWERVERS +SWERVES +SWERVING +SWEVEN +SWEVENS +SWIDDEN +SWIDDENS +SWIFT +SWIFTER +SWIFTERS +SWIFTEST +SWIFTLET +SWIFTLETS +SWIFTLY +SWIFTNESS +SWIFTNESSES +SWIFTS +SWIG +SWIGGED +SWIGGER +SWIGGERS +SWIGGING +SWIGS +SWILL +SWILLED +SWILLER +SWILLERS +SWILLING +SWILLS +SWIM +SWIMMABLE +SWIMMER +SWIMMERET +SWIMMERETS +SWIMMERS +SWIMMIER +SWIMMIEST +SWIMMILY +SWIMMING +SWIMMINGLY +SWIMMINGS +SWIMMY +SWIMS +SWIMSUIT +SWIMSUITS +SWIMWEAR +SWINDLE +SWINDLED +SWINDLER +SWINDLERS +SWINDLES +SWINDLING +SWINE +SWINEHERD +SWINEHERDS +SWINEPOX +SWINEPOXES +SWING +SWINGBY +SWINGBYS +SWINGE +SWINGED +SWINGEING +SWINGER +SWINGERS +SWINGES +SWINGIER +SWINGIEST +SWINGING +SWINGINGEST +SWINGINGLY +SWINGINGS +SWINGLE +SWINGLED +SWINGLES +SWINGLETREE +SWINGLETREES +SWINGLING +SWINGMAN +SWINGMEN +SWINGS +SWINGY +SWINISH +SWINISHLY +SWINISHNESS +SWINISHNESSES +SWINK +SWINKED +SWINKING +SWINKS +SWINNEY +SWINNEYS +SWIPE +SWIPED +SWIPES +SWIPING +SWIPLE +SWIPLES +SWIPPLE +SWIPPLES +SWIRL +SWIRLED +SWIRLIER +SWIRLIEST +SWIRLING +SWIRLINGLY +SWIRLS +SWIRLY +SWISH +SWISHED +SWISHER +SWISHERS +SWISHES +SWISHIER +SWISHIEST +SWISHING +SWISHINGLY +SWISHY +SWISS +SWISSES +SWITCH +SWITCHABLE +SWITCHBACK +SWITCHBACKED +SWITCHBACKING +SWITCHBACKS +SWITCHBLADE +SWITCHBLADES +SWITCHBOARD +SWITCHBOARDS +SWITCHED +SWITCHER +SWITCHEROO +SWITCHEROOS +SWITCHERS +SWITCHES +SWITCHGRASS +SWITCHGRASSES +SWITCHING +SWITCHMAN +SWITCHMEN +SWITCHYARD +SWITCHYARDS +SWITH +SWITHE +SWITHER +SWITHERED +SWITHERING +SWITHERS +SWITHLY +SWIVE +SWIVED +SWIVEL +SWIVELED +SWIVELING +SWIVELLED +SWIVELLING +SWIVELS +SWIVES +SWIVET +SWIVETS +SWIVING +SWIZZLE +SWIZZLED +SWIZZLER +SWIZZLERS +SWIZZLES +SWIZZLING +SWOB +SWOBBED +SWOBBER +SWOBBERS +SWOBBING +SWOBS +SWOLLEN +SWOON +SWOONED +SWOONER +SWOONERS +SWOONIER +SWOONIEST +SWOONING +SWOONINGLY +SWOONS +SWOONY +SWOOP +SWOOPED +SWOOPER +SWOOPERS +SWOOPIER +SWOOPIEST +SWOOPING +SWOOPS +SWOOPSTAKE +SWOOPY +SWOOSH +SWOOSHED +SWOOSHES +SWOOSHING +SWOP +SWOPPED +SWOPPING +SWOPS +SWORD +SWORDFISH +SWORDFISHES +SWORDLIKE +SWORDMAN +SWORDMEN +SWORDPLAY +SWORDPLAYER +SWORDPLAYERS +SWORDPLAYS +SWORDS +SWORDSMAN +SWORDSMANSHIP +SWORDSMANSHIPS +SWORDSMEN +SWORDTAIL +SWORDTAILS +SWORE +SWORN +SWOT +SWOTS +SWOTTED +SWOTTER +SWOTTERS +SWOTTING +SWOUN +SWOUND +SWOUNDED +SWOUNDING +SWOUNDS +SWOUNED +SWOUNING +SWOUNS +SWUM +SWUNG +SYBARITE +SYBARITES +SYBARITIC +SYBARITICALLY +SYBARITISM +SYBARITISMS +SYBO +SYBOES +SYCAMINE +SYCAMINES +SYCAMORE +SYCAMORES +SYCE +SYCEE +SYCEES +SYCES +SYCOMORE +SYCOMORES +SYCONIA +SYCONIUM +SYCOPHANCIES +SYCOPHANCY +SYCOPHANT +SYCOPHANTIC +SYCOPHANTICALLY +SYCOPHANTISH +SYCOPHANTISHLY +SYCOPHANTISM +SYCOPHANTISMS +SYCOPHANTLY +SYCOPHANTS +SYCOSES +SYCOSIS +SYENITE +SYENITES +SYENITIC +SYKE +SYKES +SYLI +SYLIS +SYLLABARIES +SYLLABARY +SYLLABI +SYLLABIC +SYLLABICALLY +SYLLABICATE +SYLLABICATED +SYLLABICATES +SYLLABICATING +SYLLABICATION +SYLLABICATIONS +SYLLABICITIES +SYLLABICITY +SYLLABICS +SYLLABIFICATION +SYLLABIFIED +SYLLABIFIES +SYLLABIFY +SYLLABIFYING +SYLLABISM +SYLLABISMS +SYLLABIZE +SYLLABIZED +SYLLABIZES +SYLLABIZING +SYLLABLE +SYLLABLED +SYLLABLES +SYLLABLING +SYLLABUB +SYLLABUBS +SYLLABUS +SYLLABUSES +SYLLEPSES +SYLLEPSIS +SYLLEPTIC +SYLLOGISM +SYLLOGISMS +SYLLOGIST +SYLLOGISTIC +SYLLOGISTICALLY +SYLLOGISTS +SYLLOGIZE +SYLLOGIZED +SYLLOGIZES +SYLLOGIZING +SYLPH +SYLPHIC +SYLPHID +SYLPHIDS +SYLPHISH +SYLPHLIKE +SYLPHS +SYLPHY +SYLVA +SYLVAE +SYLVAN +SYLVANITE +SYLVANITES +SYLVANS +SYLVAS +SYLVATIC +SYLVICULTURE +SYLVICULTURES +SYLVIN +SYLVINE +SYLVINES +SYLVINITE +SYLVINITES +SYLVINS +SYLVITE +SYLVITES +SYMBION +SYMBIONS +SYMBIONT +SYMBIONTS +SYMBIOSES +SYMBIOSIS +SYMBIOT +SYMBIOTE +SYMBIOTES +SYMBIOTIC +SYMBIOTICALLY +SYMBIOTS +SYMBOL +SYMBOLED +SYMBOLIC +SYMBOLICAL +SYMBOLICALLY +SYMBOLING +SYMBOLISE +SYMBOLISED +SYMBOLISES +SYMBOLISING +SYMBOLISM +SYMBOLISMS +SYMBOLIST +SYMBOLISTIC +SYMBOLISTS +SYMBOLIZATION +SYMBOLIZATIONS +SYMBOLIZE +SYMBOLIZED +SYMBOLIZER +SYMBOLIZERS +SYMBOLIZES +SYMBOLIZING +SYMBOLLED +SYMBOLLING +SYMBOLOGIES +SYMBOLOGY +SYMBOLS +SYMMETALLISM +SYMMETALLISMS +SYMMETRIC +SYMMETRICAL +SYMMETRICALLY +SYMMETRICALNESS +SYMMETRIES +SYMMETRIZATION +SYMMETRIZATIONS +SYMMETRIZE +SYMMETRIZED +SYMMETRIZES +SYMMETRIZING +SYMMETRY +SYMPATHECTOMIES +SYMPATHECTOMY +SYMPATHETIC +SYMPATHETICALLY +SYMPATHETICS +SYMPATHIES +SYMPATHIN +SYMPATHINS +SYMPATHISE +SYMPATHISED +SYMPATHISES +SYMPATHISING +SYMPATHIZE +SYMPATHIZED +SYMPATHIZER +SYMPATHIZERS +SYMPATHIZES +SYMPATHIZING +SYMPATHOLYTIC +SYMPATHOLYTICS +SYMPATHOMIMETIC +SYMPATHY +SYMPATICO +SYMPATRIC +SYMPATRICALLY +SYMPATRIES +SYMPATRY +SYMPETALIES +SYMPETALOUS +SYMPETALY +SYMPHONIC +SYMPHONICALLY +SYMPHONIES +SYMPHONIOUS +SYMPHONIOUSLY +SYMPHONIST +SYMPHONISTS +SYMPHONY +SYMPHYSEAL +SYMPHYSES +SYMPHYSIAL +SYMPHYSIS +SYMPODIA +SYMPODIAL +SYMPODIUM +SYMPOSIA +SYMPOSIAC +SYMPOSIACS +SYMPOSIARCH +SYMPOSIARCHS +SYMPOSIAST +SYMPOSIASTS +SYMPOSIUM +SYMPOSIUMS +SYMPTOM +SYMPTOMATIC +SYMPTOMATICALLY +SYMPTOMATOLOGIC +SYMPTOMATOLOGY +SYMPTOMLESS +SYMPTOMS +SYN +SYNAERESES +SYNAERESIS +SYNAESTHESES +SYNAESTHESIA +SYNAESTHESIAS +SYNAESTHESIS +SYNAGOG +SYNAGOGAL +SYNAGOGS +SYNAGOGUE +SYNAGOGUES +SYNALEPHA +SYNALEPHAS +SYNALOEPHA +SYNALOEPHAS +SYNANON +SYNANONS +SYNAPSE +SYNAPSED +SYNAPSES +SYNAPSID +SYNAPSIDS +SYNAPSING +SYNAPSIS +SYNAPTIC +SYNAPTICALLY +SYNAPTOSOMAL +SYNAPTOSOME +SYNAPTOSOMES +SYNARTHRODIAL +SYNARTHROSES +SYNARTHROSIS +SYNC +SYNCARP +SYNCARPIES +SYNCARPOUS +SYNCARPS +SYNCARPY +SYNCED +SYNCH +SYNCHED +SYNCHING +SYNCHRO +SYNCHROMESH +SYNCHROMESHES +SYNCHRONAL +SYNCHRONEITIES +SYNCHRONEITY +SYNCHRONIC +SYNCHRONICAL +SYNCHRONICALLY +SYNCHRONICITIES +SYNCHRONICITY +SYNCHRONIES +SYNCHRONISATION +SYNCHRONISE +SYNCHRONISED +SYNCHRONISES +SYNCHRONISING +SYNCHRONISM +SYNCHRONISMS +SYNCHRONISTIC +SYNCHRONIZATION +SYNCHRONIZE +SYNCHRONIZED +SYNCHRONIZER +SYNCHRONIZERS +SYNCHRONIZES +SYNCHRONIZING +SYNCHRONOUS +SYNCHRONOUSLY +SYNCHRONOUSNESS +SYNCHRONY +SYNCHROS +SYNCHROSCOPE +SYNCHROSCOPES +SYNCHROTRON +SYNCHROTRONS +SYNCHS +SYNCING +SYNCLINAL +SYNCLINE +SYNCLINES +SYNCOM +SYNCOMS +SYNCOPAL +SYNCOPATE +SYNCOPATED +SYNCOPATES +SYNCOPATING +SYNCOPATION +SYNCOPATIONS +SYNCOPATIVE +SYNCOPATOR +SYNCOPATORS +SYNCOPE +SYNCOPES +SYNCOPIC +SYNCRETIC +SYNCRETISE +SYNCRETISED +SYNCRETISES +SYNCRETISING +SYNCRETISM +SYNCRETISMS +SYNCRETIST +SYNCRETISTIC +SYNCRETISTS +SYNCRETIZE +SYNCRETIZED +SYNCRETIZES +SYNCRETIZING +SYNCS +SYNCYTIA +SYNCYTIAL +SYNCYTIUM +SYNDACTYL +SYNDACTYLIES +SYNDACTYLISM +SYNDACTYLISMS +SYNDACTYLS +SYNDACTYLY +SYNDESES +SYNDESIS +SYNDESISES +SYNDESMOSES +SYNDESMOSIS +SYNDET +SYNDETIC +SYNDETICALLY +SYNDETS +SYNDIC +SYNDICAL +SYNDICALISM +SYNDICALISMS +SYNDICALIST +SYNDICALISTS +SYNDICATE +SYNDICATED +SYNDICATES +SYNDICATING +SYNDICATION +SYNDICATIONS +SYNDICATOR +SYNDICATORS +SYNDICS +SYNDROME +SYNDROMES +SYNDROMIC +SYNE +SYNECDOCHE +SYNECDOCHES +SYNECDOCHIC +SYNECDOCHICAL +SYNECDOCHICALLY +SYNECOLOGICAL +SYNECOLOGIES +SYNECOLOGY +SYNECTIC +SYNERESES +SYNERESIS +SYNERGETIC +SYNERGIA +SYNERGIAS +SYNERGIC +SYNERGICALLY +SYNERGID +SYNERGIDS +SYNERGIES +SYNERGISM +SYNERGISMS +SYNERGIST +SYNERGISTIC +SYNERGISTICALLY +SYNERGISTS +SYNERGY +SYNESIS +SYNESISES +SYNESTHESIA +SYNESTHESIAS +SYNESTHETIC +SYNFUEL +SYNFUELS +SYNGAMIC +SYNGAMIES +SYNGAMOUS +SYNGAMY +SYNGAS +SYNGASES +SYNGASSES +SYNGENEIC +SYNGENIC +SYNIZESES +SYNIZESIS +SYNKARYA +SYNKARYON +SYNKARYONS +SYNOD +SYNODAL +SYNODIC +SYNODICAL +SYNODS +SYNOICOUS +SYNONYM +SYNONYME +SYNONYMES +SYNONYMIC +SYNONYMICAL +SYNONYMIES +SYNONYMIST +SYNONYMISTS +SYNONYMITIES +SYNONYMITY +SYNONYMIZE +SYNONYMIZED +SYNONYMIZES +SYNONYMIZING +SYNONYMOUS +SYNONYMOUSLY +SYNONYMS +SYNONYMY +SYNOPSES +SYNOPSIS +SYNOPSIZE +SYNOPSIZED +SYNOPSIZES +SYNOPSIZING +SYNOPTIC +SYNOPTICAL +SYNOPTICALLY +SYNOSTOSES +SYNOSTOSIS +SYNOVIA +SYNOVIAL +SYNOVIAS +SYNOVITIS +SYNOVITISES +SYNTACTIC +SYNTACTICAL +SYNTACTICALLY +SYNTACTICS +SYNTAGM +SYNTAGMA +SYNTAGMAS +SYNTAGMATA +SYNTAGMATIC +SYNTAGMS +SYNTAX +SYNTAXES +SYNTH +SYNTHESES +SYNTHESIS +SYNTHESIST +SYNTHESISTS +SYNTHESIZE +SYNTHESIZED +SYNTHESIZER +SYNTHESIZERS +SYNTHESIZES +SYNTHESIZING +SYNTHETASE +SYNTHETASES +SYNTHETIC +SYNTHETICALLY +SYNTHETICS +SYNTHPOP +SYNTHPOPS +SYNTHS +SYNTONIC +SYNTONIES +SYNTONY +SYNURA +SYNURAE +SYPH +SYPHER +SYPHERED +SYPHERING +SYPHERS +SYPHILIS +SYPHILISES +SYPHILITIC +SYPHILITICS +SYPHILOID +SYPHON +SYPHONED +SYPHONING +SYPHONS +SYPHS +SYREN +SYRENS +SYRETTE +SYRETTES +SYRINGA +SYRINGAS +SYRINGE +SYRINGEAL +SYRINGED +SYRINGES +SYRINGING +SYRINGOMYELIA +SYRINGOMYELIAS +SYRINGOMYELIC +SYRINX +SYRINXES +SYRPHIAN +SYRPHIANS +SYRPHID +SYRPHIDS +SYRUP +SYRUPED +SYRUPIER +SYRUPIEST +SYRUPING +SYRUPLIKE +SYRUPS +SYRUPY +SYSADMIN +SYSADMINS +SYSOP +SYSOPS +SYSTALTIC +SYSTEM +SYSTEMATIC +SYSTEMATICALLY +SYSTEMATICNESS +SYSTEMATICS +SYSTEMATISE +SYSTEMATISED +SYSTEMATISES +SYSTEMATISING +SYSTEMATISM +SYSTEMATISMS +SYSTEMATIST +SYSTEMATISTS +SYSTEMATIZATION +SYSTEMATIZE +SYSTEMATIZED +SYSTEMATIZER +SYSTEMATIZERS +SYSTEMATIZES +SYSTEMATIZING +SYSTEMIC +SYSTEMICALLY +SYSTEMICS +SYSTEMIZATION +SYSTEMIZATIONS +SYSTEMIZE +SYSTEMIZED +SYSTEMIZES +SYSTEMIZING +SYSTEMLESS +SYSTEMS +SYSTOLE +SYSTOLES +SYSTOLIC +SYZYGAL +SYZYGETIC +SYZYGIAL +SYZYGIES +SYZYGY +TA +TAB +TABANID +TABANIDS +TABARD +TABARDED +TABARDS +TABARET +TABARETS +TABBED +TABBIED +TABBIES +TABBING +TABBIS +TABBISES +TABBOULEH +TABBOULEHS +TABBY +TABBYING +TABER +TABERED +TABERING +TABERNACLE +TABERNACLED +TABERNACLES +TABERNACLING +TABERNACULAR +TABERS +TABES +TABETIC +TABETICS +TABID +TABLA +TABLAS +TABLATURE +TABLATURES +TABLE +TABLEAU +TABLEAUS +TABLEAUX +TABLECLOTH +TABLECLOTHS +TABLED +TABLEFUL +TABLEFULS +TABLELAND +TABLELANDS +TABLELESS +TABLEMATE +TABLEMATES +TABLES +TABLESFUL +TABLESPOON +TABLESPOONFUL +TABLESPOONFULS +TABLESPOONS +TABLESPOONSFUL +TABLET +TABLETED +TABLETING +TABLETOP +TABLETOPS +TABLETS +TABLETTED +TABLETTING +TABLEWARE +TABLEWARES +TABLING +TABLOID +TABLOIDS +TABOO +TABOOED +TABOOING +TABOOLEY +TABOOLEYS +TABOOS +TABOR +TABORED +TABORER +TABORERS +TABORET +TABORETS +TABORIN +TABORINE +TABORINES +TABORING +TABORINS +TABORS +TABOULEH +TABOULEHS +TABOULI +TABOULIS +TABOUR +TABOURED +TABOURER +TABOURERS +TABOURET +TABOURETS +TABOURING +TABOURS +TABS +TABU +TABUED +TABUING +TABULABLE +TABULAR +TABULARLY +TABULATE +TABULATED +TABULATES +TABULATING +TABULATION +TABULATIONS +TABULATOR +TABULATORS +TABULI +TABULIS +TABUN +TABUNS +TABUS +TACAMAHAC +TACAMAHACS +TACE +TACES +TACET +TACH +TACHE +TACHES +TACHINID +TACHINIDS +TACHISM +TACHISME +TACHISMES +TACHISMS +TACHIST +TACHISTE +TACHISTES +TACHISTOSCOPE +TACHISTOSCOPES +TACHISTOSCOPIC +TACHISTS +TACHOMETER +TACHOMETERS +TACHS +TACHYARRHYTHMIA +TACHYCARDIA +TACHYCARDIAS +TACHYLITE +TACHYLITES +TACHYLYTE +TACHYLYTES +TACHYON +TACHYONIC +TACHYONS +TACIT +TACITLY +TACITNESS +TACITNESSES +TACITURN +TACITURNITIES +TACITURNITY +TACK +TACKBOARD +TACKBOARDS +TACKED +TACKER +TACKERS +TACKET +TACKETS +TACKEY +TACKIER +TACKIEST +TACKIFIED +TACKIFIER +TACKIFIERS +TACKIFIES +TACKIFY +TACKIFYING +TACKILY +TACKINESS +TACKINESSES +TACKING +TACKLE +TACKLED +TACKLER +TACKLERS +TACKLES +TACKLESS +TACKLING +TACKLINGS +TACKS +TACKY +TACNODE +TACNODES +TACO +TACONITE +TACONITES +TACOS +TACRINE +TACRINES +TACT +TACTFUL +TACTFULLY +TACTFULNESS +TACTFULNESSES +TACTIC +TACTICAL +TACTICALLY +TACTICIAN +TACTICIANS +TACTICS +TACTILE +TACTILELY +TACTILITIES +TACTILITY +TACTION +TACTIONS +TACTLESS +TACTLESSLY +TACTLESSNESS +TACTLESSNESSES +TACTS +TACTUAL +TACTUALLY +TAD +TADPOLE +TADPOLES +TADS +TAE +TAEKWONDO +TAEKWONDOS +TAEL +TAELS +TAENIA +TAENIAE +TAENIAS +TAENIASES +TAENIASIS +TAFFAREL +TAFFARELS +TAFFEREL +TAFFERELS +TAFFETA +TAFFETAS +TAFFETIZED +TAFFIA +TAFFIAS +TAFFIES +TAFFRAIL +TAFFRAILS +TAFFY +TAFIA +TAFIAS +TAG +TAGALONG +TAGALONGS +TAGBOARD +TAGBOARDS +TAGGANT +TAGGANTS +TAGGED +TAGGER +TAGGERS +TAGGING +TAGLIATELLE +TAGLIATELLES +TAGLIKE +TAGLINE +TAGLINES +TAGMEME +TAGMEMES +TAGMEMIC +TAGMEMICS +TAGRAG +TAGRAGS +TAGS +TAHINI +TAHINIS +TAHR +TAHRS +TAHSIL +TAHSILDAR +TAHSILDARS +TAHSILS +TAIGA +TAIGAS +TAIGLACH +TAIL +TAILBACK +TAILBACKS +TAILBOARD +TAILBOARDS +TAILBONE +TAILBONES +TAILCOAT +TAILCOATED +TAILCOATS +TAILED +TAILENDER +TAILENDERS +TAILER +TAILERS +TAILFAN +TAILFANS +TAILFIN +TAILFINS +TAILGATE +TAILGATED +TAILGATER +TAILGATERS +TAILGATES +TAILGATING +TAILING +TAILINGS +TAILLAMP +TAILLAMPS +TAILLE +TAILLES +TAILLESS +TAILLEUR +TAILLEURS +TAILLIGHT +TAILLIGHTS +TAILLIKE +TAILOR +TAILORBIRD +TAILORBIRDS +TAILORED +TAILORING +TAILORINGS +TAILORS +TAILPIECE +TAILPIECES +TAILPIPE +TAILPIPES +TAILPLANE +TAILPLANES +TAILRACE +TAILRACES +TAILS +TAILSKID +TAILSKIDS +TAILSLIDE +TAILSLIDES +TAILSPIN +TAILSPINNED +TAILSPINNING +TAILSPINS +TAILSTOCK +TAILSTOCKS +TAILWATER +TAILWATERS +TAILWIND +TAILWINDS +TAIN +TAINS +TAINT +TAINTED +TAINTING +TAINTLESS +TAINTS +TAIPAN +TAIPANS +TAJ +TAJES +TAKA +TAKABLE +TAKAHE +TAKAHES +TAKAS +TAKE +TAKEABLE +TAKEAWAY +TAKEAWAYS +TAKEDOWN +TAKEDOWNS +TAKEN +TAKEOFF +TAKEOFFS +TAKEOUT +TAKEOUTS +TAKEOVER +TAKEOVERS +TAKER +TAKERS +TAKES +TAKEUP +TAKEUPS +TAKIN +TAKING +TAKINGLY +TAKINGS +TAKINS +TALA +TALAPOIN +TALAPOINS +TALAR +TALARIA +TALARS +TALAS +TALC +TALCED +TALCING +TALCKED +TALCKING +TALCKY +TALCOSE +TALCOUS +TALCS +TALCUM +TALCUMS +TALE +TALEBEARER +TALEBEARERS +TALEBEARING +TALEBEARINGS +TALEGGIO +TALEGGIOS +TALENT +TALENTED +TALENTLESS +TALENTS +TALER +TALERS +TALES +TALESMAN +TALESMEN +TALEYSIM +TALI +TALION +TALIONS +TALIPED +TALIPEDS +TALIPES +TALIPOT +TALIPOTS +TALISMAN +TALISMANIC +TALISMANICALLY +TALISMANS +TALK +TALKABLE +TALKATHON +TALKATHONS +TALKATIVE +TALKATIVELY +TALKATIVENESS +TALKATIVENESSES +TALKBACK +TALKBACKS +TALKED +TALKER +TALKERS +TALKIE +TALKIER +TALKIES +TALKIEST +TALKINESS +TALKINESSES +TALKING +TALKINGS +TALKS +TALKY +TALL +TALLAGE +TALLAGED +TALLAGES +TALLAGING +TALLAISIM +TALLBOY +TALLBOYS +TALLER +TALLEST +TALLGRASS +TALLGRASSES +TALLIED +TALLIER +TALLIERS +TALLIES +TALLIS +TALLISES +TALLISH +TALLISIM +TALLIT +TALLITH +TALLITHES +TALLITHIM +TALLITHS +TALLITIM +TALLITOTH +TALLITS +TALLNESS +TALLNESSES +TALLOL +TALLOLS +TALLOW +TALLOWED +TALLOWING +TALLOWS +TALLOWY +TALLS +TALLY +TALLYHO +TALLYHOED +TALLYHOING +TALLYHOS +TALLYING +TALLYMAN +TALLYMEN +TALMUDIC +TALMUDISM +TALMUDISMS +TALON +TALONED +TALONS +TALOOKA +TALOOKAS +TALUK +TALUKA +TALUKAS +TALUKS +TALUS +TALUSES +TAM +TAMABLE +TAMAL +TAMALE +TAMALES +TAMALS +TAMANDU +TAMANDUA +TAMANDUAS +TAMANDUS +TAMARACK +TAMARACKS +TAMARAO +TAMARAOS +TAMARAU +TAMARAUS +TAMARI +TAMARILLO +TAMARILLOS +TAMARIN +TAMARIND +TAMARINDS +TAMARINS +TAMARIS +TAMARISK +TAMARISKS +TAMASHA +TAMASHAS +TAMBAC +TAMBACS +TAMBAK +TAMBAKS +TAMBALA +TAMBALAS +TAMBOUR +TAMBOURA +TAMBOURAS +TAMBOURED +TAMBOURER +TAMBOURERS +TAMBOURIN +TAMBOURINE +TAMBOURINES +TAMBOURING +TAMBOURINS +TAMBOURS +TAMBUR +TAMBURA +TAMBURAS +TAMBURS +TAME +TAMEABLE +TAMED +TAMEIN +TAMEINS +TAMELESS +TAMELY +TAMENESS +TAMENESSES +TAMER +TAMERS +TAMES +TAMEST +TAMING +TAMIS +TAMISES +TAMMIE +TAMMIES +TAMMY +TAMOXIFEN +TAMOXIFENS +TAMP +TAMPALA +TAMPALAS +TAMPAN +TAMPANS +TAMPED +TAMPER +TAMPERED +TAMPERER +TAMPERERS +TAMPERING +TAMPERPROOF +TAMPERS +TAMPING +TAMPION +TAMPIONS +TAMPON +TAMPONED +TAMPONING +TAMPONS +TAMPS +TAMS +TAN +TANAGER +TANAGERS +TANBARK +TANBARKS +TANDEM +TANDEMS +TANDOOR +TANDOORI +TANDOORIS +TANDOORS +TANG +TANGA +TANGED +TANGELO +TANGELOS +TANGENCE +TANGENCES +TANGENCIES +TANGENCY +TANGENT +TANGENTAL +TANGENTIAL +TANGENTIALLY +TANGENTS +TANGERINE +TANGERINES +TANGIBILITIES +TANGIBILITY +TANGIBLE +TANGIBLENESS +TANGIBLENESSES +TANGIBLES +TANGIBLY +TANGIER +TANGIEST +TANGINESS +TANGINESSES +TANGING +TANGLE +TANGLED +TANGLEMENT +TANGLEMENTS +TANGLER +TANGLERS +TANGLES +TANGLIER +TANGLIEST +TANGLING +TANGLY +TANGO +TANGOED +TANGOING +TANGOLIKE +TANGOS +TANGRAM +TANGRAMS +TANGS +TANGY +TANIST +TANISTRIES +TANISTRY +TANISTS +TANK +TANKA +TANKAGE +TANKAGES +TANKARD +TANKARDS +TANKAS +TANKED +TANKER +TANKERS +TANKFUL +TANKFULS +TANKING +TANKINI +TANKINIS +TANKLESS +TANKLIKE +TANKS +TANKSHIP +TANKSHIPS +TANNABLE +TANNAGE +TANNAGES +TANNATE +TANNATES +TANNED +TANNER +TANNERIES +TANNERS +TANNERY +TANNEST +TANNIC +TANNIN +TANNING +TANNINGS +TANNINS +TANNISH +TANNOY +TANNOYS +TANREC +TANRECS +TANS +TANSIES +TANSY +TANTALATE +TANTALATES +TANTALIC +TANTALISE +TANTALISED +TANTALISES +TANTALISING +TANTALITE +TANTALITES +TANTALIZE +TANTALIZED +TANTALIZER +TANTALIZERS +TANTALIZES +TANTALIZING +TANTALIZINGLY +TANTALOUS +TANTALUM +TANTALUMS +TANTALUS +TANTALUSES +TANTAMOUNT +TANTARA +TANTARAS +TANTIVIES +TANTIVY +TANTO +TANTRA +TANTRAS +TANTRIC +TANTRISM +TANTRISMS +TANTRUM +TANTRUMS +TANUKI +TANUKIS +TANYARD +TANYARDS +TANZANITE +TANZANITES +TAO +TAOS +TAP +TAPA +TAPADERA +TAPADERAS +TAPADERO +TAPADEROS +TAPALO +TAPALOS +TAPAS +TAPE +TAPEABLE +TAPED +TAPELESS +TAPELIKE +TAPELINE +TAPELINES +TAPENADE +TAPENADES +TAPER +TAPERED +TAPERER +TAPERERS +TAPERING +TAPERS +TAPERSTICK +TAPERSTICKS +TAPES +TAPESTRIED +TAPESTRIES +TAPESTRY +TAPESTRYING +TAPETA +TAPETAL +TAPETUM +TAPEWORM +TAPEWORMS +TAPHOLE +TAPHOLES +TAPHONOMIC +TAPHONOMIES +TAPHONOMIST +TAPHONOMISTS +TAPHONOMY +TAPHOUSE +TAPHOUSES +TAPING +TAPIOCA +TAPIOCAS +TAPIR +TAPIRS +TAPIS +TAPISES +TAPPABLE +TAPPED +TAPPER +TAPPERS +TAPPET +TAPPETS +TAPPING +TAPPINGS +TAPROOM +TAPROOMS +TAPROOT +TAPROOTS +TAPS +TAPSTER +TAPSTERS +TAQUERIA +TAQUERIAS +TAR +TARADIDDLE +TARADIDDLES +TARAMA +TARAMAS +TARANTAS +TARANTASES +TARANTELLA +TARANTELLAS +TARANTISM +TARANTISMS +TARANTIST +TARANTISTS +TARANTULA +TARANTULAE +TARANTULAS +TARBOOSH +TARBOOSHES +TARBUSH +TARBUSHES +TARDIER +TARDIES +TARDIEST +TARDIGRADE +TARDIGRADES +TARDILY +TARDINESS +TARDINESSES +TARDIVE +TARDO +TARDY +TARDYON +TARDYONS +TARE +TARED +TARES +TARGE +TARGES +TARGET +TARGETABLE +TARGETED +TARGETING +TARGETS +TARIFF +TARIFFED +TARIFFING +TARIFFS +TARING +TARLATAN +TARLATANS +TARLETAN +TARLETANS +TARMAC +TARMACADAM +TARMACADAMS +TARMACKED +TARMACKING +TARMACS +TARN +TARNAL +TARNALLY +TARNATION +TARNATIONS +TARNISH +TARNISHABLE +TARNISHED +TARNISHES +TARNISHING +TARNS +TARO +TAROC +TAROCS +TAROK +TAROKS +TAROS +TAROT +TAROTS +TARP +TARPAN +TARPANS +TARPAPER +TARPAPERS +TARPAULIN +TARPAULINS +TARPON +TARPONS +TARPS +TARRADIDDLE +TARRADIDDLES +TARRAGON +TARRAGONS +TARRE +TARRED +TARRES +TARRIANCE +TARRIANCES +TARRIED +TARRIER +TARRIERS +TARRIES +TARRIEST +TARRINESS +TARRINESSES +TARRING +TARRY +TARRYING +TARS +TARSAL +TARSALS +TARSI +TARSIA +TARSIAS +TARSIER +TARSIERS +TARSOMETATARSI +TARSOMETATARSUS +TARSUS +TART +TARTAN +TARTANA +TARTANAS +TARTANS +TARTAR +TARTARE +TARTARIC +TARTAROUS +TARTARS +TARTED +TARTER +TARTEST +TARTIER +TARTIEST +TARTILY +TARTINESS +TARTINESSES +TARTING +TARTISH +TARTLET +TARTLETS +TARTLY +TARTNESS +TARTNESSES +TARTRATE +TARTRATED +TARTRATES +TARTS +TARTUFE +TARTUFES +TARTUFFE +TARTUFFES +TARTY +TARWEED +TARWEEDS +TARZAN +TARZANS +TAS +TASK +TASKBAR +TASKBARS +TASKED +TASKING +TASKMASTER +TASKMASTERS +TASKMISTRESS +TASKMISTRESSES +TASKS +TASKWORK +TASKWORKS +TASS +TASSE +TASSEL +TASSELED +TASSELING +TASSELLED +TASSELLING +TASSELS +TASSES +TASSET +TASSETS +TASSIE +TASSIES +TASTABLE +TASTE +TASTEABLE +TASTED +TASTEFUL +TASTEFULLY +TASTEFULNESS +TASTEFULNESSES +TASTELESS +TASTELESSLY +TASTELESSNESS +TASTELESSNESSES +TASTEMAKER +TASTEMAKERS +TASTER +TASTERS +TASTES +TASTIER +TASTIEST +TASTILY +TASTINESS +TASTINESSES +TASTING +TASTY +TAT +TATAMI +TATAMIS +TATAR +TATARS +TATE +TATER +TATERS +TATES +TATOUAY +TATOUAYS +TATS +TATSOI +TATSOIS +TATTED +TATTER +TATTERDEMALION +TATTERDEMALIONS +TATTERED +TATTERING +TATTERS +TATTERSALL +TATTERSALLS +TATTIE +TATTIER +TATTIES +TATTIEST +TATTILY +TATTINESS +TATTINESSES +TATTING +TATTINGS +TATTLE +TATTLED +TATTLER +TATTLERS +TATTLES +TATTLETALE +TATTLETALES +TATTLING +TATTOO +TATTOOED +TATTOOER +TATTOOERS +TATTOOING +TATTOOIST +TATTOOISTS +TATTOOS +TATTY +TAU +TAUGHT +TAUNT +TAUNTED +TAUNTER +TAUNTERS +TAUNTING +TAUNTINGLY +TAUNTS +TAUON +TAUONS +TAUPE +TAUPES +TAURINE +TAURINES +TAUS +TAUT +TAUTAUG +TAUTAUGS +TAUTED +TAUTEN +TAUTENED +TAUTENING +TAUTENS +TAUTER +TAUTEST +TAUTING +TAUTLY +TAUTNESS +TAUTNESSES +TAUTOG +TAUTOGS +TAUTOLOGICAL +TAUTOLOGICALLY +TAUTOLOGIES +TAUTOLOGOUS +TAUTOLOGOUSLY +TAUTOLOGY +TAUTOMER +TAUTOMERIC +TAUTOMERISM +TAUTOMERISMS +TAUTOMERS +TAUTONYM +TAUTONYMIES +TAUTONYMS +TAUTONYMY +TAUTS +TAV +TAVERN +TAVERNA +TAVERNAS +TAVERNER +TAVERNERS +TAVERNS +TAVS +TAW +TAWDRIER +TAWDRIES +TAWDRIEST +TAWDRILY +TAWDRINESS +TAWDRINESSES +TAWDRY +TAWED +TAWER +TAWERS +TAWIE +TAWING +TAWNEY +TAWNEYS +TAWNIER +TAWNIES +TAWNIEST +TAWNILY +TAWNINESS +TAWNINESSES +TAWNY +TAWPIE +TAWPIES +TAWS +TAWSE +TAWSED +TAWSES +TAWSING +TAX +TAXA +TAXABLE +TAXABLES +TAXABLY +TAXATION +TAXATIONS +TAXED +TAXEME +TAXEMES +TAXEMIC +TAXER +TAXERS +TAXES +TAXI +TAXICAB +TAXICABS +TAXIDERMIC +TAXIDERMIES +TAXIDERMIST +TAXIDERMISTS +TAXIDERMY +TAXIED +TAXIES +TAXIING +TAXIMAN +TAXIMEN +TAXIMETER +TAXIMETERS +TAXING +TAXINGLY +TAXIS +TAXITE +TAXITES +TAXITIC +TAXIWAY +TAXIWAYS +TAXLESS +TAXMAN +TAXMEN +TAXOL +TAXOLS +TAXON +TAXONOMIC +TAXONOMICALLY +TAXONOMIES +TAXONOMIST +TAXONOMISTS +TAXONOMY +TAXONS +TAXPAID +TAXPAYER +TAXPAYERS +TAXPAYING +TAXPAYINGS +TAXUS +TAXWISE +TAXYING +TAZZA +TAZZAS +TAZZE +TCHOTCHKE +TCHOTCHKES +TEA +TEABERRIES +TEABERRY +TEABOARD +TEABOARDS +TEABOWL +TEABOWLS +TEABOX +TEABOXES +TEACAKE +TEACAKES +TEACART +TEACARTS +TEACH +TEACHABLE +TEACHABLENESS +TEACHABLENESSES +TEACHABLY +TEACHER +TEACHERLY +TEACHERS +TEACHES +TEACHING +TEACHINGS +TEACUP +TEACUPFUL +TEACUPFULS +TEACUPS +TEACUPSFUL +TEAHOUSE +TEAHOUSES +TEAK +TEAKETTLE +TEAKETTLES +TEAKS +TEAKWOOD +TEAKWOODS +TEAL +TEALIKE +TEALS +TEAM +TEAMAKER +TEAMAKERS +TEAMED +TEAMING +TEAMMATE +TEAMMATES +TEAMS +TEAMSTER +TEAMSTERS +TEAMWORK +TEAMWORKS +TEAPOT +TEAPOTS +TEAPOY +TEAPOYS +TEAR +TEARABLE +TEARAWAY +TEARAWAYS +TEARDOWN +TEARDOWNS +TEARDROP +TEARDROPS +TEARED +TEARER +TEARERS +TEARFUL +TEARFULLY +TEARFULNESS +TEARFULNESSES +TEARGAS +TEARGASES +TEARGASSED +TEARGASSES +TEARGASSING +TEARIER +TEARIEST +TEARILY +TEARINESS +TEARINESSES +TEARING +TEARJERKER +TEARJERKERS +TEARLESS +TEAROOM +TEAROOMS +TEARS +TEARSTAIN +TEARSTAINED +TEARSTAINS +TEARSTRIP +TEARSTRIPS +TEARY +TEAS +TEASABLE +TEASE +TEASED +TEASEL +TEASELED +TEASELER +TEASELERS +TEASELING +TEASELLED +TEASELLER +TEASELLERS +TEASELLING +TEASELS +TEASER +TEASERS +TEASES +TEASHOP +TEASHOPS +TEASING +TEASINGLY +TEASPOON +TEASPOONFUL +TEASPOONFULS +TEASPOONS +TEASPOONSFUL +TEAT +TEATASTER +TEATASTERS +TEATED +TEATIME +TEATIMES +TEATS +TEAWARE +TEAWARES +TEAZEL +TEAZELED +TEAZELING +TEAZELLED +TEAZELLING +TEAZELS +TEAZLE +TEAZLED +TEAZLES +TEAZLING +TECH +TECHED +TECHIE +TECHIER +TECHIES +TECHIEST +TECHILY +TECHNETIUM +TECHNETIUMS +TECHNETRONIC +TECHNIC +TECHNICAL +TECHNICALITIES +TECHNICALITY +TECHNICALIZE +TECHNICALIZED +TECHNICALIZES +TECHNICALIZING +TECHNICALLY +TECHNICALS +TECHNICIAN +TECHNICIANS +TECHNICS +TECHNIQUE +TECHNIQUES +TECHNO +TECHNOBABBLE +TECHNOBABBLES +TECHNOCRACIES +TECHNOCRACY +TECHNOCRAT +TECHNOCRATIC +TECHNOCRATS +TECHNOLOGIC +TECHNOLOGICAL +TECHNOLOGICALLY +TECHNOLOGIES +TECHNOLOGIST +TECHNOLOGISTS +TECHNOLOGIZE +TECHNOLOGIZED +TECHNOLOGIZES +TECHNOLOGIZING +TECHNOLOGY +TECHNOPHILE +TECHNOPHILES +TECHNOPHOBE +TECHNOPHOBES +TECHNOPHOBIA +TECHNOPHOBIAS +TECHNOPHOBIC +TECHNOPOP +TECHNOPOPS +TECHNOS +TECHNOSTRUCTURE +TECHS +TECHY +TECTA +TECTAL +TECTITE +TECTITES +TECTONIC +TECTONICALLY +TECTONICS +TECTONISM +TECTONISMS +TECTORIAL +TECTRICES +TECTRIX +TECTUM +TECTUMS +TED +TEDDED +TEDDER +TEDDERED +TEDDERING +TEDDERS +TEDDIES +TEDDING +TEDDY +TEDIOUS +TEDIOUSLY +TEDIOUSNESS +TEDIOUSNESSES +TEDIUM +TEDIUMS +TEDS +TEE +TEED +TEEING +TEEL +TEELS +TEEM +TEEMED +TEEMER +TEEMERS +TEEMING +TEEMINGLY +TEEMINGNESS +TEEMINGNESSES +TEEMS +TEEN +TEENAGE +TEENAGED +TEENAGER +TEENAGERS +TEENER +TEENERS +TEENFUL +TEENIER +TEENIEST +TEENS +TEENSIER +TEENSIEST +TEENSY +TEENTSIER +TEENTSIEST +TEENTSY +TEENY +TEENYBOP +TEENYBOPPER +TEENYBOPPERS +TEEPEE +TEEPEES +TEES +TEETER +TEETERBOARD +TEETERBOARDS +TEETERED +TEETERING +TEETERS +TEETH +TEETHE +TEETHED +TEETHER +TEETHERS +TEETHES +TEETHING +TEETHINGS +TEETHLESS +TEETHRIDGE +TEETHRIDGES +TEETOTAL +TEETOTALED +TEETOTALER +TEETOTALERS +TEETOTALING +TEETOTALISM +TEETOTALISMS +TEETOTALIST +TEETOTALISTS +TEETOTALLED +TEETOTALLER +TEETOTALLERS +TEETOTALLING +TEETOTALLY +TEETOTALS +TEETOTUM +TEETOTUMS +TEFF +TEFFS +TEFILLIN +TEFLON +TEFLONS +TEG +TEGG +TEGGS +TEGMEN +TEGMENTA +TEGMENTAL +TEGMENTUM +TEGMINA +TEGMINAL +TEGS +TEGUA +TEGUAS +TEGULAR +TEGULARLY +TEGULATED +TEGUMEN +TEGUMENT +TEGUMENTS +TEGUMINA +TEIGLACH +TEIID +TEIIDS +TEIND +TEINDS +TEKKIE +TEKKIES +TEKTITE +TEKTITES +TEKTITIC +TEL +TELA +TELAE +TELAMON +TELAMONES +TELANGIECTASES +TELANGIECTASIA +TELANGIECTASIAS +TELANGIECTASIS +TELANGIECTATIC +TELCO +TELCOS +TELE +TELECAST +TELECASTED +TELECASTER +TELECASTERS +TELECASTING +TELECASTS +TELECOM +TELECOMMUTE +TELECOMMUTED +TELECOMMUTER +TELECOMMUTERS +TELECOMMUTES +TELECOMMUTING +TELECOMS +TELECONFERENCE +TELECONFERENCES +TELECOURSE +TELECOURSES +TELEDU +TELEDUS +TELEFACSIMILE +TELEFACSIMILES +TELEFAX +TELEFAXES +TELEFILM +TELEFILMS +TELEGA +TELEGAS +TELEGENIC +TELEGONIC +TELEGONIES +TELEGONY +TELEGRAM +TELEGRAMMED +TELEGRAMMING +TELEGRAMS +TELEGRAPH +TELEGRAPHED +TELEGRAPHER +TELEGRAPHERS +TELEGRAPHESE +TELEGRAPHESES +TELEGRAPHIC +TELEGRAPHICALLY +TELEGRAPHIES +TELEGRAPHING +TELEGRAPHIST +TELEGRAPHISTS +TELEGRAPHS +TELEGRAPHY +TELEKINESES +TELEKINESIS +TELEKINETIC +TELEKINETICALLY +TELEMAN +TELEMARK +TELEMARKETER +TELEMARKETERS +TELEMARKETING +TELEMARKETINGS +TELEMARKS +TELEMEN +TELEMETER +TELEMETERED +TELEMETERING +TELEMETERS +TELEMETRIC +TELEMETRICALLY +TELEMETRIES +TELEMETRY +TELENCEPHALA +TELENCEPHALIC +TELENCEPHALON +TELEOLOGIC +TELEOLOGICAL +TELEOLOGICALLY +TELEOLOGIES +TELEOLOGIST +TELEOLOGISTS +TELEOLOGY +TELEONOMIC +TELEONOMIES +TELEONOMY +TELEOST +TELEOSTEAN +TELEOSTS +TELEPATH +TELEPATHIC +TELEPATHICALLY +TELEPATHIES +TELEPATHS +TELEPATHY +TELEPHONE +TELEPHONED +TELEPHONER +TELEPHONERS +TELEPHONES +TELEPHONIC +TELEPHONICALLY +TELEPHONIES +TELEPHONING +TELEPHONIST +TELEPHONISTS +TELEPHONY +TELEPHOTO +TELEPHOTOGRAPHY +TELEPHOTOS +TELEPLAY +TELEPLAYS +TELEPORT +TELEPORTATION +TELEPORTATIONS +TELEPORTED +TELEPORTING +TELEPORTS +TELEPRINTER +TELEPRINTERS +TELEPROCESSING +TELEPROCESSINGS +TELERAN +TELERANS +TELES +TELESCOPE +TELESCOPED +TELESCOPES +TELESCOPIC +TELESCOPICALLY +TELESCOPIES +TELESCOPING +TELESCOPY +TELESES +TELESHOP +TELESHOPPED +TELESHOPPING +TELESHOPS +TELESIS +TELESTIC +TELESTICH +TELESTICHS +TELESTICS +TELETEXT +TELETEXTS +TELETHON +TELETHONS +TELETYPE +TELETYPED +TELETYPES +TELETYPEWRITER +TELETYPEWRITERS +TELETYPING +TELEUTOSPORE +TELEUTOSPORES +TELEVANGELISM +TELEVANGELISMS +TELEVANGELIST +TELEVANGELISTS +TELEVIEW +TELEVIEWED +TELEVIEWER +TELEVIEWERS +TELEVIEWING +TELEVIEWS +TELEVISE +TELEVISED +TELEVISES +TELEVISING +TELEVISION +TELEVISIONS +TELEVISOR +TELEVISORS +TELEVISUAL +TELEX +TELEXED +TELEXES +TELEXING +TELFER +TELFERED +TELFERING +TELFERS +TELFORD +TELFORDS +TELIA +TELIAL +TELIC +TELICALLY +TELIOSPORE +TELIOSPORES +TELIUM +TELL +TELLABLE +TELLER +TELLERS +TELLIES +TELLING +TELLINGLY +TELLS +TELLTALE +TELLTALES +TELLURIAN +TELLURIANS +TELLURIC +TELLURIDE +TELLURIDES +TELLURION +TELLURIONS +TELLURITE +TELLURITES +TELLURIUM +TELLURIUMS +TELLURIZE +TELLURIZED +TELLURIZES +TELLURIZING +TELLUROMETER +TELLUROMETERS +TELLUROUS +TELLY +TELLYS +TELNET +TELNETED +TELNETING +TELNETS +TELNETTED +TELNETTING +TELOCENTRIC +TELOCENTRICS +TELOI +TELOME +TELOMERE +TELOMERES +TELOMES +TELOMIC +TELOPHASE +TELOPHASES +TELOS +TELOTAXES +TELOTAXIS +TELPHER +TELPHERED +TELPHERING +TELPHERS +TELS +TELSON +TELSONIC +TELSONS +TEMBLOR +TEMBLORES +TEMBLORS +TEMERARIOUS +TEMERARIOUSLY +TEMERARIOUSNESS +TEMERITIES +TEMERITY +TEMP +TEMPED +TEMPEH +TEMPEHS +TEMPER +TEMPERA +TEMPERABLE +TEMPERAMENT +TEMPERAMENTAL +TEMPERAMENTALLY +TEMPERAMENTS +TEMPERANCE +TEMPERANCES +TEMPERAS +TEMPERATE +TEMPERATELY +TEMPERATENESS +TEMPERATENESSES +TEMPERATURE +TEMPERATURES +TEMPERED +TEMPERER +TEMPERERS +TEMPERING +TEMPERS +TEMPEST +TEMPESTED +TEMPESTING +TEMPESTS +TEMPESTUOUS +TEMPESTUOUSLY +TEMPESTUOUSNESS +TEMPI +TEMPING +TEMPLAR +TEMPLARS +TEMPLATE +TEMPLATES +TEMPLE +TEMPLED +TEMPLES +TEMPLET +TEMPLETS +TEMPO +TEMPORAL +TEMPORALITIES +TEMPORALITY +TEMPORALIZE +TEMPORALIZED +TEMPORALIZES +TEMPORALIZING +TEMPORALLY +TEMPORALS +TEMPORARIES +TEMPORARILY +TEMPORARINESS +TEMPORARINESSES +TEMPORARY +TEMPORISE +TEMPORISED +TEMPORISES +TEMPORISING +TEMPORIZATION +TEMPORIZATIONS +TEMPORIZE +TEMPORIZED +TEMPORIZER +TEMPORIZERS +TEMPORIZES +TEMPORIZING +TEMPOS +TEMPS +TEMPT +TEMPTABLE +TEMPTATION +TEMPTATIONS +TEMPTED +TEMPTER +TEMPTERS +TEMPTING +TEMPTINGLY +TEMPTRESS +TEMPTRESSES +TEMPTS +TEMPURA +TEMPURAS +TEN +TENABILITIES +TENABILITY +TENABLE +TENABLENESS +TENABLENESSES +TENABLY +TENACE +TENACES +TENACIOUS +TENACIOUSLY +TENACIOUSNESS +TENACIOUSNESSES +TENACITIES +TENACITY +TENACULA +TENACULUM +TENACULUMS +TENAIL +TENAILLE +TENAILLES +TENAILS +TENANCIES +TENANCY +TENANT +TENANTABLE +TENANTED +TENANTING +TENANTLESS +TENANTRIES +TENANTRY +TENANTS +TENCH +TENCHES +TEND +TENDANCE +TENDANCES +TENDED +TENDENCE +TENDENCES +TENDENCIES +TENDENCIOUS +TENDENCY +TENDENTIOUS +TENDENTIOUSLY +TENDENTIOUSNESS +TENDER +TENDERED +TENDERER +TENDERERS +TENDEREST +TENDERFEET +TENDERFOOT +TENDERFOOTS +TENDERHEARTED +TENDERHEARTEDLY +TENDERING +TENDERIZATION +TENDERIZATIONS +TENDERIZE +TENDERIZED +TENDERIZER +TENDERIZERS +TENDERIZES +TENDERIZING +TENDERLOIN +TENDERLOINS +TENDERLY +TENDERNESS +TENDERNESSES +TENDEROMETER +TENDEROMETERS +TENDERS +TENDING +TENDINITIS +TENDINITISES +TENDINOUS +TENDON +TENDONITIS +TENDONITISES +TENDONS +TENDRESSE +TENDRESSES +TENDRIL +TENDRILED +TENDRILLED +TENDRILOUS +TENDRILS +TENDS +TENDU +TENDUS +TENEBRAE +TENEBRIFIC +TENEBRIONID +TENEBRIONIDS +TENEBRIOUS +TENEBRISM +TENEBRISMS +TENEBRIST +TENEBRISTS +TENEBROUS +TENEMENT +TENEMENTS +TENESMIC +TENESMUS +TENESMUSES +TENET +TENETS +TENFOLD +TENFOLDS +TENGE +TENIA +TENIAE +TENIAS +TENIASES +TENIASIS +TENNER +TENNERS +TENNIES +TENNIS +TENNISES +TENNIST +TENNISTS +TENON +TENONED +TENONER +TENONERS +TENONING +TENONS +TENOR +TENORIST +TENORISTS +TENORITE +TENORITES +TENORS +TENOSYNOVITIS +TENOSYNOVITISES +TENOTOMIES +TENOTOMY +TENOUR +TENOURS +TENPENCE +TENPENCES +TENPENNY +TENPIN +TENPINS +TENPOUNDER +TENPOUNDERS +TENREC +TENRECS +TENS +TENSE +TENSED +TENSELY +TENSENESS +TENSENESSES +TENSER +TENSES +TENSEST +TENSIBLE +TENSIBLY +TENSILE +TENSILELY +TENSILITIES +TENSILITY +TENSING +TENSIOMETER +TENSIOMETERS +TENSIOMETRIC +TENSIOMETRIES +TENSIOMETRY +TENSION +TENSIONAL +TENSIONED +TENSIONER +TENSIONERS +TENSIONING +TENSIONLESS +TENSIONS +TENSITIES +TENSITY +TENSIVE +TENSOR +TENSORIAL +TENSORS +TENT +TENTACLE +TENTACLED +TENTACLES +TENTACULAR +TENTAGE +TENTAGES +TENTATIVE +TENTATIVELY +TENTATIVENESS +TENTATIVENESSES +TENTATIVES +TENTED +TENTER +TENTERED +TENTERHOOK +TENTERHOOKS +TENTERING +TENTERS +TENTH +TENTHLY +TENTHS +TENTIE +TENTIER +TENTIEST +TENTING +TENTLESS +TENTLIKE +TENTMAKER +TENTMAKERS +TENTORIA +TENTORIAL +TENTORIUM +TENTS +TENTY +TENUES +TENUIS +TENUITIES +TENUITY +TENUOUS +TENUOUSLY +TENUOUSNESS +TENUOUSNESSES +TENURABLE +TENURE +TENURED +TENURES +TENURIAL +TENURIALLY +TENURING +TENUTI +TENUTO +TENUTOS +TEOCALLI +TEOCALLIS +TEOPAN +TEOPANS +TEOSINTE +TEOSINTES +TEPA +TEPAL +TEPALS +TEPAS +TEPEE +TEPEES +TEPEFIED +TEPEFIES +TEPEFY +TEPEFYING +TEPHRA +TEPHRAS +TEPHRITE +TEPHRITES +TEPHRITIC +TEPID +TEPIDITIES +TEPIDITY +TEPIDLY +TEPIDNESS +TEPIDNESSES +TEPOY +TEPOYS +TEQUILA +TEQUILAS +TERABYTE +TERABYTES +TERAFLOP +TERAFLOPS +TERAHERTZ +TERAHERTZES +TERAI +TERAIS +TERAOHM +TERAOHMS +TERAPH +TERAPHIM +TERATISM +TERATISMS +TERATOCARCINOMA +TERATOGEN +TERATOGENESES +TERATOGENESIS +TERATOGENIC +TERATOGENICITY +TERATOGENS +TERATOID +TERATOLOGIC +TERATOLOGICAL +TERATOLOGIES +TERATOLOGIST +TERATOLOGISTS +TERATOLOGY +TERATOMA +TERATOMAS +TERATOMATA +TERAWATT +TERAWATTS +TERBIA +TERBIAS +TERBIC +TERBIUM +TERBIUMS +TERCE +TERCEL +TERCELET +TERCELETS +TERCELS +TERCENTENARIES +TERCENTENARY +TERCENTENNIAL +TERCENTENNIALS +TERCES +TERCET +TERCETS +TEREBENE +TEREBENES +TEREBIC +TEREBINTH +TEREBINTHS +TEREDINES +TEREDO +TEREDOS +TEREFAH +TEREPHTHALATE +TEREPHTHALATES +TERETE +TERGA +TERGAL +TERGITE +TERGITES +TERGIVERSATE +TERGIVERSATED +TERGIVERSATES +TERGIVERSATING +TERGIVERSATION +TERGIVERSATIONS +TERGIVERSATOR +TERGIVERSATORS +TERGUM +TERIYAKI +TERIYAKIS +TERM +TERMAGANT +TERMAGANTS +TERMED +TERMER +TERMERS +TERMINABLE +TERMINABLENESS +TERMINABLY +TERMINAL +TERMINALLY +TERMINALS +TERMINATE +TERMINATED +TERMINATES +TERMINATING +TERMINATION +TERMINATIONAL +TERMINATIONS +TERMINATIVE +TERMINATIVELY +TERMINATOR +TERMINATORS +TERMING +TERMINI +TERMINOLOGICAL +TERMINOLOGIES +TERMINOLOGY +TERMINUS +TERMINUSES +TERMITARIA +TERMITARIES +TERMITARIUM +TERMITARY +TERMITE +TERMITES +TERMITIC +TERMLESS +TERMLY +TERMOR +TERMORS +TERMS +TERMTIME +TERMTIMES +TERN +TERNARIES +TERNARY +TERNATE +TERNATELY +TERNE +TERNEPLATE +TERNEPLATES +TERNES +TERNION +TERNIONS +TERNS +TERPENE +TERPENELESS +TERPENES +TERPENIC +TERPENOID +TERPENOIDS +TERPINEOL +TERPINEOLS +TERPINOL +TERPINOLS +TERPOLYMER +TERPOLYMERS +TERPSICHOREAN +TERRA +TERRACE +TERRACED +TERRACES +TERRACING +TERRAE +TERRAFORM +TERRAFORMED +TERRAFORMING +TERRAFORMS +TERRAIN +TERRAINS +TERRANE +TERRANES +TERRAPIN +TERRAPINS +TERRAQUEOUS +TERRARIA +TERRARIUM +TERRARIUMS +TERRAS +TERRASES +TERRAZZO +TERRAZZOS +TERREEN +TERREENS +TERRELLA +TERRELLAS +TERRENE +TERRENELY +TERRENES +TERREPLEIN +TERREPLEINS +TERRESTRIAL +TERRESTRIALLY +TERRESTRIALS +TERRET +TERRETS +TERRIBLE +TERRIBLENESS +TERRIBLENESSES +TERRIBLY +TERRICOLOUS +TERRIER +TERRIERS +TERRIES +TERRIFIC +TERRIFICALLY +TERRIFIED +TERRIFIER +TERRIFIERS +TERRIFIES +TERRIFY +TERRIFYING +TERRIFYINGLY +TERRIGENOUS +TERRINE +TERRINES +TERRIT +TERRITORIAL +TERRITORIALISM +TERRITORIALISMS +TERRITORIALIST +TERRITORIALISTS +TERRITORIALITY +TERRITORIALIZE +TERRITORIALIZED +TERRITORIALIZES +TERRITORIALLY +TERRITORIALS +TERRITORIES +TERRITORY +TERRITS +TERROR +TERRORISE +TERRORISED +TERRORISES +TERRORISING +TERRORISM +TERRORISMS +TERRORIST +TERRORISTIC +TERRORISTS +TERRORIZATION +TERRORIZATIONS +TERRORIZE +TERRORIZED +TERRORIZES +TERRORIZING +TERRORLESS +TERRORS +TERRY +TERSE +TERSELY +TERSENESS +TERSENESSES +TERSER +TERSEST +TERTIAL +TERTIALS +TERTIAN +TERTIANS +TERTIARIES +TERTIARY +TERVALENT +TERYLENE +TERYLENES +TESLA +TESLAS +TESSELATE +TESSELATED +TESSELATES +TESSELATING +TESSELLATE +TESSELLATED +TESSELLATES +TESSELLATING +TESSELLATION +TESSELLATIONS +TESSERA +TESSERACT +TESSERACTS +TESSERAE +TESSITURA +TESSITURAS +TESSITURE +TEST +TESTA +TESTABILITIES +TESTABILITY +TESTABLE +TESTACEAN +TESTACEANS +TESTACEOUS +TESTACIES +TESTACY +TESTAE +TESTAMENT +TESTAMENTARY +TESTAMENTS +TESTATE +TESTATES +TESTATOR +TESTATORS +TESTATRICES +TESTATRIX +TESTATRIXES +TESTCROSS +TESTCROSSED +TESTCROSSES +TESTCROSSING +TESTED +TESTEE +TESTEES +TESTER +TESTERS +TESTES +TESTICLE +TESTICLES +TESTICULAR +TESTIER +TESTIEST +TESTIFIED +TESTIFIER +TESTIFIERS +TESTIFIES +TESTIFY +TESTIFYING +TESTILY +TESTIMONIAL +TESTIMONIALS +TESTIMONIES +TESTIMONY +TESTINESS +TESTINESSES +TESTING +TESTIS +TESTON +TESTONS +TESTOON +TESTOONS +TESTOSTERONE +TESTOSTERONES +TESTS +TESTUDINES +TESTUDO +TESTUDOS +TESTY +TET +TETANAL +TETANIC +TETANICAL +TETANICALLY +TETANICS +TETANIES +TETANISE +TETANISED +TETANISES +TETANISING +TETANIZATION +TETANIZATIONS +TETANIZE +TETANIZED +TETANIZES +TETANIZING +TETANOID +TETANUS +TETANUSES +TETANY +TETARTOHEDRAL +TETCHED +TETCHIER +TETCHIEST +TETCHILY +TETCHINESS +TETCHINESSES +TETCHY +TETH +TETHER +TETHERBALL +TETHERBALLS +TETHERED +TETHERING +TETHERS +TETHS +TETOTUM +TETOTUMS +TETRA +TETRACAINE +TETRACAINES +TETRACHLORIDE +TETRACHLORIDES +TETRACHORD +TETRACHORDS +TETRACID +TETRACIDS +TETRACYCLINE +TETRACYCLINES +TETRAD +TETRADIC +TETRADRACHM +TETRADRACHMS +TETRADS +TETRADYNAMOUS +TETRAFLUORIDE +TETRAFLUORIDES +TETRAGON +TETRAGONAL +TETRAGONALLY +TETRAGONS +TETRAGRAM +TETRAGRAMMATON +TETRAGRAMMATONS +TETRAGRAMS +TETRAHEDRA +TETRAHEDRAL +TETRAHEDRALLY +TETRAHEDRITE +TETRAHEDRITES +TETRAHEDRON +TETRAHEDRONS +TETRAHYDROFURAN +TETRAHYMENA +TETRAHYMENAS +TETRALOGIES +TETRALOGY +TETRAMER +TETRAMERIC +TETRAMEROUS +TETRAMERS +TETRAMETER +TETRAMETERS +TETRAMETHYLLEAD +TETRAPLOID +TETRAPLOIDIES +TETRAPLOIDS +TETRAPLOIDY +TETRAPOD +TETRAPODS +TETRAPYRROLE +TETRAPYRROLES +TETRARCH +TETRARCHIC +TETRARCHIES +TETRARCHS +TETRARCHY +TETRAS +TETRASPORE +TETRASPORES +TETRASPORIC +TETRAVALENT +TETRAZOLIUM +TETRAZOLIUMS +TETRAZZINI +TETRI +TETRIS +TETRODE +TETRODES +TETRODOTOXIN +TETRODOTOXINS +TETROXID +TETROXIDE +TETROXIDES +TETROXIDS +TETRYL +TETRYLS +TETS +TETTER +TETTERS +TEUCH +TEUGH +TEUGHLY +TEUTONIZE +TEUTONIZED +TEUTONIZES +TEUTONIZING +TEVATRON +TEVATRONS +TEW +TEWED +TEWING +TEWS +TEXAS +TEXASES +TEXT +TEXTBOOK +TEXTBOOKISH +TEXTBOOKS +TEXTILE +TEXTILES +TEXTLESS +TEXTS +TEXTUAL +TEXTUALLY +TEXTUARIES +TEXTUARY +TEXTURAL +TEXTURALLY +TEXTURE +TEXTURED +TEXTURELESS +TEXTURES +TEXTURING +TEXTURIZE +TEXTURIZED +TEXTURIZES +TEXTURIZING +THACK +THACKED +THACKING +THACKS +THAE +THAIRM +THAIRMS +THALAMI +THALAMIC +THALAMUS +THALASSAEMIA +THALASSAEMIAS +THALASSEMIA +THALASSEMIAS +THALASSEMIC +THALASSEMICS +THALASSIC +THALASSOCRACIES +THALASSOCRACY +THALASSOCRAT +THALASSOCRATS +THALER +THALERS +THALIDOMIDE +THALIDOMIDES +THALLI +THALLIC +THALLIOUS +THALLIUM +THALLIUMS +THALLOID +THALLOPHYTE +THALLOPHYTES +THALLOPHYTIC +THALLOUS +THALLUS +THALLUSES +THALWEG +THALWEGS +THAN +THANAGE +THANAGES +THANATOLOGICAL +THANATOLOGIES +THANATOLOGIST +THANATOLOGISTS +THANATOLOGY +THANATOS +THANATOSES +THANE +THANES +THANESHIP +THANESHIPS +THANK +THANKED +THANKER +THANKERS +THANKFUL +THANKFULLER +THANKFULLEST +THANKFULLY +THANKFULNESS +THANKFULNESSES +THANKING +THANKLESS +THANKLESSLY +THANKLESSNESS +THANKLESSNESSES +THANKS +THANKSGIVING +THANKSGIVINGS +THANKWORTHY +THARM +THARMS +THAT +THATAWAY +THATCH +THATCHED +THATCHER +THATCHERS +THATCHES +THATCHIER +THATCHIEST +THATCHING +THATCHINGS +THATCHY +THAUMATURGE +THAUMATURGES +THAUMATURGIC +THAUMATURGIES +THAUMATURGIST +THAUMATURGISTS +THAUMATURGY +THAW +THAWED +THAWER +THAWERS +THAWING +THAWLESS +THAWS +THE +THEARCHIES +THEARCHY +THEATER +THEATERGOER +THEATERGOERS +THEATERGOING +THEATERGOINGS +THEATERS +THEATRE +THEATRES +THEATRIC +THEATRICAL +THEATRICALISM +THEATRICALISMS +THEATRICALITIES +THEATRICALITY +THEATRICALIZE +THEATRICALIZED +THEATRICALIZES +THEATRICALIZING +THEATRICALLY +THEATRICALS +THEATRICS +THEBAINE +THEBAINES +THEBE +THEBES +THECA +THECAE +THECAL +THECATE +THECODONT +THECODONTS +THEE +THEELIN +THEELINS +THEELOL +THEELOLS +THEFT +THEFTS +THEGN +THEGNLY +THEGNS +THEIN +THEINE +THEINES +THEINS +THEIR +THEIRS +THEIRSELF +THEIRSELVES +THEISM +THEISMS +THEIST +THEISTIC +THEISTICAL +THEISTICALLY +THEISTS +THELITIS +THELITISES +THEM +THEMATIC +THEMATICALLY +THEMATICS +THEME +THEMED +THEMES +THEMING +THEMSELVES +THEN +THENAGE +THENAGES +THENAL +THENAR +THENARS +THENCE +THENCEFORTH +THENCEFORWARD +THENCEFORWARDS +THENS +THEOBROMINE +THEOBROMINES +THEOCENTRIC +THEOCENTRICITY +THEOCENTRISM +THEOCENTRISMS +THEOCRACIES +THEOCRACY +THEOCRAT +THEOCRATIC +THEOCRATICAL +THEOCRATICALLY +THEOCRATS +THEODICIES +THEODICY +THEODOLITE +THEODOLITES +THEOGONIC +THEOGONIES +THEOGONY +THEOLOG +THEOLOGIAN +THEOLOGIANS +THEOLOGIC +THEOLOGICAL +THEOLOGICALLY +THEOLOGIES +THEOLOGISE +THEOLOGISED +THEOLOGISES +THEOLOGISING +THEOLOGIZE +THEOLOGIZED +THEOLOGIZER +THEOLOGIZERS +THEOLOGIZES +THEOLOGIZING +THEOLOGS +THEOLOGUE +THEOLOGUES +THEOLOGY +THEOMACHIES +THEOMACHY +THEONOMIES +THEONOMOUS +THEONOMY +THEOPHANIC +THEOPHANIES +THEOPHANY +THEOPHYLLINE +THEOPHYLLINES +THEORBO +THEORBOS +THEOREM +THEOREMATIC +THEOREMS +THEORETIC +THEORETICAL +THEORETICALLY +THEORETICIAN +THEORETICIANS +THEORIES +THEORISE +THEORISED +THEORISES +THEORISING +THEORIST +THEORISTS +THEORIZATION +THEORIZATIONS +THEORIZE +THEORIZED +THEORIZER +THEORIZERS +THEORIZES +THEORIZING +THEORY +THEOSOPHICAL +THEOSOPHICALLY +THEOSOPHIES +THEOSOPHIST +THEOSOPHISTS +THEOSOPHY +THERAPEUSES +THERAPEUSIS +THERAPEUTIC +THERAPEUTICALLY +THERAPEUTICS +THERAPIES +THERAPIST +THERAPISTS +THERAPSID +THERAPSIDS +THERAPY +THERE +THEREABOUT +THEREABOUTS +THEREAFTER +THEREAT +THEREBY +THEREFOR +THEREFORE +THEREFROM +THEREIN +THEREINAFTER +THEREINTO +THEREMIN +THEREMINS +THEREOF +THEREON +THERES +THERETO +THERETOFORE +THEREUNDER +THEREUNTO +THEREUPON +THEREWITH +THEREWITHAL +THERIAC +THERIACA +THERIACAL +THERIACAS +THERIACS +THERIAN +THERIANS +THERIOMORPHIC +THERM +THERMAE +THERMAL +THERMALIZATION +THERMALIZATIONS +THERMALIZE +THERMALIZED +THERMALIZES +THERMALIZING +THERMALLY +THERMALS +THERME +THERMEL +THERMELS +THERMES +THERMIC +THERMICALLY +THERMIDOR +THERMIDORS +THERMION +THERMIONIC +THERMIONICS +THERMIONS +THERMISTOR +THERMISTORS +THERMIT +THERMITE +THERMITES +THERMITS +THERMOCHEMICAL +THERMOCHEMIST +THERMOCHEMISTRY +THERMOCHEMISTS +THERMOCLINE +THERMOCLINES +THERMOCOUPLE +THERMOCOUPLES +THERMODURIC +THERMODYNAMIC +THERMODYNAMICAL +THERMODYNAMICS +THERMOELECTRIC +THERMOELEMENT +THERMOELEMENTS +THERMOFORM +THERMOFORMABLE +THERMOFORMED +THERMOFORMING +THERMOFORMS +THERMOGRAM +THERMOGRAMS +THERMOGRAPH +THERMOGRAPHER +THERMOGRAPHERS +THERMOGRAPHIC +THERMOGRAPHIES +THERMOGRAPHS +THERMOGRAPHY +THERMOHALINE +THERMOJUNCTION +THERMOJUNCTIONS +THERMOLABILE +THERMOLABILITY +THERMOMAGNETIC +THERMOMETER +THERMOMETERS +THERMOMETRIC +THERMOMETRIES +THERMOMETRY +THERMONUCLEAR +THERMOPERIODISM +THERMOPHILE +THERMOPHILES +THERMOPHILIC +THERMOPHILOUS +THERMOPILE +THERMOPILES +THERMOPLASTIC +THERMOPLASTICS +THERMORECEPTOR +THERMORECEPTORS +THERMOREGULATE +THERMOREGULATED +THERMOREGULATES +THERMOREGULATOR +THERMOREMANENCE +THERMOREMANENT +THERMOS +THERMOSCOPE +THERMOSCOPES +THERMOSES +THERMOSET +THERMOSETS +THERMOSETTING +THERMOSPHERE +THERMOSPHERES +THERMOSPHERIC +THERMOSTABILITY +THERMOSTABLE +THERMOSTAT +THERMOSTATED +THERMOSTATIC +THERMOSTATING +THERMOSTATS +THERMOSTATTED +THERMOSTATTING +THERMOTACTIC +THERMOTAXES +THERMOTAXIS +THERMOTROPIC +THERMOTROPISM +THERMOTROPISMS +THERMS +THEROID +THEROPOD +THEROPODS +THESAURAL +THESAURI +THESAURUS +THESAURUSES +THESE +THESES +THESIS +THESP +THESPIAN +THESPIANS +THESPS +THETA +THETAS +THETIC +THETICAL +THETICALLY +THEURGIC +THEURGICAL +THEURGIES +THEURGIST +THEURGISTS +THEURGY +THEW +THEWIER +THEWIEST +THEWLESS +THEWS +THEWY +THEY +THIABENDAZOLE +THIABENDAZOLES +THIAMIN +THIAMINASE +THIAMINASES +THIAMINE +THIAMINES +THIAMINS +THIAZIDE +THIAZIDES +THIAZIN +THIAZINE +THIAZINES +THIAZINS +THIAZOL +THIAZOLE +THIAZOLES +THIAZOLS +THICK +THICKEN +THICKENED +THICKENER +THICKENERS +THICKENING +THICKENINGS +THICKENS +THICKER +THICKEST +THICKET +THICKETED +THICKETS +THICKETY +THICKHEAD +THICKHEADED +THICKHEADS +THICKISH +THICKLY +THICKNESS +THICKNESSES +THICKS +THICKSET +THICKSETS +THIEF +THIEVE +THIEVED +THIEVERIES +THIEVERY +THIEVES +THIEVING +THIEVISH +THIEVISHLY +THIEVISHNESS +THIEVISHNESSES +THIGH +THIGHBONE +THIGHBONES +THIGHED +THIGHS +THIGMOTAXES +THIGMOTAXIS +THIGMOTROPISM +THIGMOTROPISMS +THILL +THILLS +THIMBLE +THIMBLEBERRIES +THIMBLEBERRY +THIMBLEFUL +THIMBLEFULS +THIMBLERIG +THIMBLERIGGED +THIMBLERIGGER +THIMBLERIGGERS +THIMBLERIGGING +THIMBLERIGS +THIMBLES +THIMBLESFUL +THIMBLEWEED +THIMBLEWEEDS +THIMEROSAL +THIMEROSALS +THIN +THINCLAD +THINCLADS +THINDOWN +THINDOWNS +THINE +THING +THINGAMABOB +THINGAMABOBS +THINGAMAJIG +THINGAMAJIGS +THINGNESS +THINGNESSES +THINGS +THINGUMAJIG +THINGUMAJIGS +THINGUMMIES +THINGUMMY +THINK +THINKABLE +THINKABLENESS +THINKABLENESSES +THINKABLY +THINKER +THINKERS +THINKING +THINKINGLY +THINKINGNESS +THINKINGNESSES +THINKINGS +THINKS +THINLY +THINNED +THINNER +THINNERS +THINNESS +THINNESSES +THINNEST +THINNING +THINNISH +THINS +THIO +THIOCYANATE +THIOCYANATES +THIOL +THIOLIC +THIOLS +THIONATE +THIONATES +THIONIC +THIONIN +THIONINE +THIONINES +THIONINS +THIONYL +THIONYLS +THIOPENTAL +THIOPENTALS +THIOPHEN +THIOPHENE +THIOPHENES +THIOPHENS +THIORIDAZINE +THIORIDAZINES +THIOSULFATE +THIOSULFATES +THIOTEPA +THIOTEPAS +THIOURACIL +THIOURACILS +THIOUREA +THIOUREAS +THIR +THIRAM +THIRAMS +THIRD +THIRDHAND +THIRDLY +THIRDS +THIRL +THIRLAGE +THIRLAGES +THIRLED +THIRLING +THIRLS +THIRST +THIRSTED +THIRSTER +THIRSTERS +THIRSTIER +THIRSTIEST +THIRSTILY +THIRSTINESS +THIRSTINESSES +THIRSTING +THIRSTS +THIRSTY +THIRTEEN +THIRTEENS +THIRTEENTH +THIRTEENTHS +THIRTIES +THIRTIETH +THIRTIETHS +THIRTY +THIRTYISH +THIS +THISAWAY +THISTLE +THISTLEDOWN +THISTLEDOWNS +THISTLES +THISTLIER +THISTLIEST +THISTLY +THITHER +THITHERTO +THITHERWARD +THITHERWARDS +THIXOTROPIC +THIXOTROPIES +THIXOTROPY +THO +THOLE +THOLED +THOLEIITE +THOLEIITES +THOLEIITIC +THOLEPIN +THOLEPINS +THOLES +THOLING +THOLOI +THOLOS +THONG +THONGED +THONGS +THORACAL +THORACES +THORACIC +THORACICALLY +THORACOTOMIES +THORACOTOMY +THORAX +THORAXES +THORIA +THORIANITE +THORIANITES +THORIAS +THORIC +THORITE +THORITES +THORIUM +THORIUMS +THORN +THORNBACK +THORNBACKS +THORNBUSH +THORNBUSHES +THORNED +THORNIER +THORNIEST +THORNILY +THORNINESS +THORNINESSES +THORNING +THORNLESS +THORNLIKE +THORNS +THORNY +THORO +THORON +THORONS +THOROUGH +THOROUGHBASS +THOROUGHBASSES +THOROUGHBRACE +THOROUGHBRACES +THOROUGHBRED +THOROUGHBREDS +THOROUGHER +THOROUGHEST +THOROUGHFARE +THOROUGHFARES +THOROUGHGOING +THOROUGHLY +THOROUGHNESS +THOROUGHNESSES +THOROUGHPIN +THOROUGHPINS +THOROUGHWORT +THOROUGHWORTS +THORP +THORPE +THORPES +THORPS +THOSE +THOU +THOUED +THOUGH +THOUGHT +THOUGHTFUL +THOUGHTFULLY +THOUGHTFULNESS +THOUGHTLESS +THOUGHTLESSLY +THOUGHTLESSNESS +THOUGHTS +THOUGHTWAY +THOUGHTWAYS +THOUING +THOUS +THOUSAND +THOUSANDFOLD +THOUSANDS +THOUSANDTH +THOUSANDTHS +THOWLESS +THRALDOM +THRALDOMS +THRALL +THRALLDOM +THRALLDOMS +THRALLED +THRALLING +THRALLS +THRASH +THRASHED +THRASHER +THRASHERS +THRASHES +THRASHING +THRASHINGS +THRASONICAL +THRASONICALLY +THRAVE +THRAVES +THRAW +THRAWART +THRAWED +THRAWING +THRAWN +THRAWNLY +THRAWS +THREAD +THREADBARE +THREADBARENESS +THREADED +THREADER +THREADERS +THREADFIN +THREADFINS +THREADIER +THREADIEST +THREADINESS +THREADINESSES +THREADING +THREADLESS +THREADLIKE +THREADS +THREADWORM +THREADWORMS +THREADY +THREAP +THREAPED +THREAPER +THREAPERS +THREAPING +THREAPS +THREAT +THREATED +THREATEN +THREATENED +THREATENER +THREATENERS +THREATENING +THREATENINGLY +THREATENS +THREATING +THREATS +THREE +THREEFOLD +THREEP +THREEPED +THREEPENCE +THREEPENCES +THREEPENNY +THREEPING +THREEPS +THREES +THREESCORE +THREESOME +THREESOMES +THRENODE +THRENODES +THRENODIC +THRENODIES +THRENODIST +THRENODISTS +THRENODY +THREONINE +THREONINES +THRESH +THRESHED +THRESHER +THRESHERS +THRESHES +THRESHING +THRESHOLD +THRESHOLDS +THREW +THRICE +THRIFT +THRIFTIER +THRIFTIEST +THRIFTILY +THRIFTINESS +THRIFTINESSES +THRIFTLESS +THRIFTLESSLY +THRIFTLESSNESS +THRIFTS +THRIFTY +THRILL +THRILLED +THRILLER +THRILLERS +THRILLING +THRILLINGLY +THRILLS +THRIP +THRIPS +THRIVE +THRIVED +THRIVEN +THRIVER +THRIVERS +THRIVES +THRIVING +THRIVINGLY +THRO +THROAT +THROATED +THROATIER +THROATIEST +THROATILY +THROATINESS +THROATINESSES +THROATING +THROATLATCH +THROATLATCHES +THROATS +THROATY +THROB +THROBBED +THROBBER +THROBBERS +THROBBING +THROBS +THROE +THROES +THROMBI +THROMBIN +THROMBINS +THROMBOCYTE +THROMBOCYTES +THROMBOCYTIC +THROMBOEMBOLIC +THROMBOEMBOLISM +THROMBOKINASE +THROMBOKINASES +THROMBOLYTIC +THROMBOPLASTIC +THROMBOPLASTIN +THROMBOPLASTINS +THROMBOSE +THROMBOSED +THROMBOSES +THROMBOSING +THROMBOSIS +THROMBOTIC +THROMBOXANE +THROMBOXANES +THROMBUS +THRONE +THRONED +THRONES +THRONG +THRONGED +THRONGING +THRONGS +THRONING +THROSTLE +THROSTLES +THROTTLE +THROTTLEABLE +THROTTLED +THROTTLEHOLD +THROTTLEHOLDS +THROTTLER +THROTTLERS +THROTTLES +THROTTLING +THROUGH +THROUGHITHER +THROUGHLY +THROUGHOTHER +THROUGHOUT +THROUGHPUT +THROUGHPUTS +THROVE +THROW +THROWAWAY +THROWAWAYS +THROWBACK +THROWBACKS +THROWER +THROWERS +THROWING +THROWN +THROWS +THROWSTER +THROWSTERS +THRU +THRUM +THRUMMED +THRUMMER +THRUMMERS +THRUMMIER +THRUMMIEST +THRUMMING +THRUMMY +THRUMS +THRUPUT +THRUPUTS +THRUSH +THRUSHES +THRUST +THRUSTED +THRUSTER +THRUSTERS +THRUSTFUL +THRUSTING +THRUSTOR +THRUSTORS +THRUSTS +THRUWAY +THRUWAYS +THUD +THUDDED +THUDDING +THUDS +THUG +THUGGEE +THUGGEES +THUGGERIES +THUGGERY +THUGGISH +THUGS +THUJA +THUJAS +THULIA +THULIAS +THULIUM +THULIUMS +THUMB +THUMBED +THUMBHOLE +THUMBHOLES +THUMBING +THUMBKIN +THUMBKINS +THUMBLESS +THUMBNAIL +THUMBNAILS +THUMBNUT +THUMBNUTS +THUMBPRINT +THUMBPRINTS +THUMBS +THUMBSCREW +THUMBSCREWS +THUMBTACK +THUMBTACKED +THUMBTACKING +THUMBTACKS +THUMBWHEEL +THUMBWHEELS +THUMP +THUMPED +THUMPER +THUMPERS +THUMPING +THUMPS +THUNDER +THUNDERBIRD +THUNDERBIRDS +THUNDERBOLT +THUNDERBOLTS +THUNDERCLAP +THUNDERCLAPS +THUNDERCLOUD +THUNDERCLOUDS +THUNDERED +THUNDERER +THUNDERERS +THUNDERHEAD +THUNDERHEADS +THUNDERING +THUNDERINGLY +THUNDEROUS +THUNDEROUSLY +THUNDERS +THUNDERSHOWER +THUNDERSHOWERS +THUNDERSTONE +THUNDERSTONES +THUNDERSTORM +THUNDERSTORMS +THUNDERSTRICKEN +THUNDERSTRIKE +THUNDERSTRIKES +THUNDERSTRIKING +THUNDERSTROKE +THUNDERSTROKES +THUNDERSTRUCK +THUNDERY +THUNK +THUNKED +THUNKING +THUNKS +THURIBLE +THURIBLES +THURIFER +THURIFERS +THURL +THURLS +THUS +THUSLY +THUYA +THUYAS +THWACK +THWACKED +THWACKER +THWACKERS +THWACKING +THWACKS +THWART +THWARTED +THWARTER +THWARTERS +THWARTING +THWARTLY +THWARTS +THWARTWISE +THY +THYLACINE +THYLACINES +THYLAKOID +THYLAKOIDS +THYME +THYMECTOMIES +THYMECTOMIZE +THYMECTOMIZED +THYMECTOMIZES +THYMECTOMIZING +THYMECTOMY +THYMES +THYMEY +THYMI +THYMIC +THYMIDINE +THYMIDINES +THYMIER +THYMIEST +THYMINE +THYMINES +THYMOCYTE +THYMOCYTES +THYMOL +THYMOLS +THYMOSIN +THYMOSINS +THYMUS +THYMUSES +THYMY +THYRATRON +THYRATRONS +THYREOID +THYRISTOR +THYRISTORS +THYROCALCITONIN +THYROGLOBULIN +THYROGLOBULINS +THYROID +THYROIDAL +THYROIDECTOMIES +THYROIDECTOMY +THYROIDITIS +THYROIDITISES +THYROIDS +THYROTOXICOSES +THYROTOXICOSIS +THYROTROPHIC +THYROTROPHIN +THYROTROPHINS +THYROTROPIC +THYROTROPIN +THYROTROPINS +THYROXIN +THYROXINE +THYROXINES +THYROXINS +THYRSE +THYRSES +THYRSI +THYRSOID +THYRSUS +THYSANURAN +THYSANURANS +THYSELF +TI +TIARA +TIARAED +TIARAS +TIBIA +TIBIAE +TIBIAL +TIBIAS +TIBIOFIBULA +TIBIOFIBULAE +TIBIOFIBULAS +TIC +TICAL +TICALS +TICCED +TICCING +TICK +TICKED +TICKER +TICKERS +TICKET +TICKETED +TICKETING +TICKETLESS +TICKETS +TICKING +TICKINGS +TICKLE +TICKLED +TICKLER +TICKLERS +TICKLES +TICKLING +TICKLISH +TICKLISHLY +TICKLISHNESS +TICKLISHNESSES +TICKS +TICKSEED +TICKSEEDS +TICKTACK +TICKTACKED +TICKTACKING +TICKTACKS +TICKTACKTOE +TICKTACKTOES +TICKTOCK +TICKTOCKED +TICKTOCKING +TICKTOCKS +TICS +TICTAC +TICTACKED +TICTACKING +TICTACS +TICTOC +TICTOCKED +TICTOCKING +TICTOCS +TIDAL +TIDALLY +TIDBIT +TIDBITS +TIDDLEDYWINKS +TIDDLER +TIDDLERS +TIDDLY +TIDDLYWINKS +TIDE +TIDED +TIDELAND +TIDELANDS +TIDELESS +TIDELIKE +TIDEMARK +TIDEMARKS +TIDERIP +TIDERIPS +TIDES +TIDEWATER +TIDEWATERS +TIDEWAY +TIDEWAYS +TIDIED +TIDIER +TIDIERS +TIDIES +TIDIEST +TIDILY +TIDINESS +TIDINESSES +TIDING +TIDINGS +TIDY +TIDYING +TIDYTIPS +TIE +TIEBACK +TIEBACKS +TIEBREAK +TIEBREAKER +TIEBREAKERS +TIEBREAKS +TIECLASP +TIECLASPS +TIED +TIEING +TIELESS +TIEMANNITE +TIEMANNITES +TIEPIN +TIEPINS +TIER +TIERCE +TIERCED +TIERCEL +TIERCELS +TIERCERON +TIERCERONS +TIERCES +TIERED +TIERING +TIERS +TIES +TIFF +TIFFANIES +TIFFANY +TIFFED +TIFFIN +TIFFINED +TIFFING +TIFFINING +TIFFINS +TIFFS +TIGER +TIGEREYE +TIGEREYES +TIGERISH +TIGERISHLY +TIGERISHNESS +TIGERISHNESSES +TIGERLIKE +TIGERS +TIGHT +TIGHTEN +TIGHTENED +TIGHTENER +TIGHTENERS +TIGHTENING +TIGHTENS +TIGHTER +TIGHTEST +TIGHTFISTED +TIGHTFISTEDNESS +TIGHTKNIT +TIGHTLY +TIGHTNESS +TIGHTNESSES +TIGHTROPE +TIGHTROPES +TIGHTS +TIGHTWAD +TIGHTWADS +TIGHTWIRE +TIGHTWIRES +TIGLON +TIGLONS +TIGON +TIGONS +TIGRESS +TIGRESSES +TIGRISH +TIKE +TIKES +TIKI +TIKIS +TIKKA +TIKKAS +TIL +TILAK +TILAKS +TILAPIA +TILAPIAS +TILBURIES +TILBURY +TILDE +TILDES +TILE +TILED +TILEFISH +TILEFISHES +TILELIKE +TILER +TILERS +TILES +TILING +TILINGS +TILL +TILLABLE +TILLAGE +TILLAGES +TILLANDSIA +TILLANDSIAS +TILLED +TILLER +TILLERED +TILLERING +TILLERMAN +TILLERMEN +TILLERS +TILLING +TILLITE +TILLITES +TILLS +TILS +TILT +TILTABLE +TILTED +TILTER +TILTERS +TILTH +TILTHS +TILTING +TILTMETER +TILTMETERS +TILTROTOR +TILTROTORS +TILTS +TILTYARD +TILTYARDS +TIMARAU +TIMARAUS +TIMBAL +TIMBALE +TIMBALES +TIMBALS +TIMBER +TIMBERDOODLE +TIMBERDOODLES +TIMBERED +TIMBERHEAD +TIMBERHEADS +TIMBERING +TIMBERINGS +TIMBERLAND +TIMBERLANDS +TIMBERLINE +TIMBERLINES +TIMBERMAN +TIMBERMEN +TIMBERS +TIMBERWORK +TIMBERWORKS +TIMBERY +TIMBRAL +TIMBRE +TIMBREL +TIMBRELLED +TIMBRELS +TIMBRES +TIME +TIMECARD +TIMECARDS +TIMED +TIMEKEEPER +TIMEKEEPERS +TIMEKEEPING +TIMEKEEPINGS +TIMELESS +TIMELESSLY +TIMELESSNESS +TIMELESSNESSES +TIMELIER +TIMELIEST +TIMELINE +TIMELINES +TIMELINESS +TIMELINESSES +TIMELY +TIMEOUS +TIMEOUSLY +TIMEOUT +TIMEOUTS +TIMEPIECE +TIMEPIECES +TIMEPLEASER +TIMEPLEASERS +TIMER +TIMERS +TIMES +TIMESAVER +TIMESAVERS +TIMESAVING +TIMESCALE +TIMESCALES +TIMESERVER +TIMESERVERS +TIMESERVING +TIMESERVINGS +TIMETABLE +TIMETABLES +TIMEWORK +TIMEWORKER +TIMEWORKERS +TIMEWORKS +TIMEWORN +TIMID +TIMIDER +TIMIDEST +TIMIDITIES +TIMIDITY +TIMIDLY +TIMIDNESS +TIMIDNESSES +TIMING +TIMINGS +TIMOCRACIES +TIMOCRACY +TIMOCRATIC +TIMOCRATICAL +TIMOLOL +TIMOLOLS +TIMOROUS +TIMOROUSLY +TIMOROUSNESS +TIMOROUSNESSES +TIMOTHIES +TIMOTHY +TIMPANA +TIMPANI +TIMPANIST +TIMPANISTS +TIMPANO +TIMPANUM +TIMPANUMS +TIN +TINAMOU +TINAMOUS +TINCAL +TINCALS +TINCT +TINCTED +TINCTING +TINCTORIAL +TINCTORIALLY +TINCTS +TINCTURE +TINCTURED +TINCTURES +TINCTURING +TINDER +TINDERBOX +TINDERBOXES +TINDERS +TINDERY +TINE +TINEA +TINEAL +TINEAS +TINED +TINEID +TINEIDS +TINES +TINFOIL +TINFOILS +TINFUL +TINFULS +TING +TINGE +TINGED +TINGEING +TINGES +TINGING +TINGLE +TINGLED +TINGLER +TINGLERS +TINGLES +TINGLIER +TINGLIEST +TINGLING +TINGLINGLY +TINGLY +TINGS +TINHORN +TINHORNS +TINIER +TINIEST +TINILY +TININESS +TININESSES +TINING +TINKER +TINKERED +TINKERER +TINKERERS +TINKERING +TINKERS +TINKERTOY +TINKERTOYS +TINKLE +TINKLED +TINKLER +TINKLERS +TINKLES +TINKLIER +TINKLIEST +TINKLING +TINKLINGS +TINKLY +TINLIKE +TINMAN +TINMEN +TINNED +TINNER +TINNERS +TINNIER +TINNIEST +TINNILY +TINNINESS +TINNINESSES +TINNING +TINNITUS +TINNITUSES +TINNY +TINPLATE +TINPLATES +TINPOT +TINS +TINSEL +TINSELED +TINSELING +TINSELLED +TINSELLING +TINSELLY +TINSELS +TINSMITH +TINSMITHING +TINSMITHINGS +TINSMITHS +TINSNIPS +TINSTONE +TINSTONES +TINT +TINTED +TINTER +TINTERS +TINTING +TINTINGS +TINTINNABULARY +TINTLESS +TINTS +TINTYPE +TINTYPES +TINWARE +TINWARES +TINWORK +TINWORKS +TINY +TIP +TIPCART +TIPCARTS +TIPCAT +TIPCATS +TIPI +TIPIS +TIPLESS +TIPOFF +TIPOFFS +TIPPABLE +TIPPED +TIPPER +TIPPERS +TIPPET +TIPPETS +TIPPIER +TIPPIEST +TIPPING +TIPPLE +TIPPLED +TIPPLER +TIPPLERS +TIPPLES +TIPPLING +TIPPY +TIPPYTOE +TIPPYTOED +TIPPYTOEING +TIPPYTOES +TIPS +TIPSHEET +TIPSHEETS +TIPSIER +TIPSIEST +TIPSILY +TIPSINESS +TIPSINESSES +TIPSTAFF +TIPSTAFFS +TIPSTAVES +TIPSTER +TIPSTERS +TIPSTOCK +TIPSTOCKS +TIPSY +TIPTOE +TIPTOED +TIPTOEING +TIPTOES +TIPTOP +TIPTOPS +TIRADE +TIRADES +TIRAMISU +TIRAMISUS +TIRE +TIRED +TIREDER +TIREDEST +TIREDLY +TIREDNESS +TIREDNESSES +TIRELESS +TIRELESSLY +TIRELESSNESS +TIRELESSNESSES +TIRES +TIRESOME +TIRESOMELY +TIRESOMENESS +TIRESOMENESSES +TIREWOMAN +TIREWOMEN +TIRING +TIRL +TIRLED +TIRLING +TIRLS +TIRO +TIROS +TIRRIVEE +TIRRIVEES +TIS +TISANE +TISANES +TISSUAL +TISSUE +TISSUED +TISSUES +TISSUEY +TISSUING +TISSULAR +TIT +TITAN +TITANATE +TITANATES +TITANESS +TITANESSES +TITANIA +TITANIAS +TITANIC +TITANICALLY +TITANIFEROUS +TITANISM +TITANISMS +TITANITE +TITANITES +TITANIUM +TITANIUMS +TITANOUS +TITANS +TITBIT +TITBITS +TITER +TITERS +TITFER +TITFERS +TITHABLE +TITHE +TITHED +TITHER +TITHERS +TITHES +TITHING +TITHINGS +TITHONIA +TITHONIAS +TITI +TITIAN +TITIANS +TITILLATE +TITILLATED +TITILLATES +TITILLATING +TITILLATINGLY +TITILLATION +TITILLATIONS +TITILLATIVE +TITIS +TITIVATE +TITIVATED +TITIVATES +TITIVATING +TITIVATION +TITIVATIONS +TITLARK +TITLARKS +TITLE +TITLED +TITLEHOLDER +TITLEHOLDERS +TITLES +TITLING +TITLIST +TITLISTS +TITMAN +TITMEN +TITMICE +TITMOUSE +TITRABLE +TITRANT +TITRANTS +TITRATABLE +TITRATE +TITRATED +TITRATES +TITRATING +TITRATION +TITRATIONS +TITRATOR +TITRATORS +TITRE +TITRES +TITRIMETRIC +TITS +TITTER +TITTERED +TITTERER +TITTERERS +TITTERING +TITTERS +TITTIE +TITTIES +TITTIVATE +TITTIVATED +TITTIVATES +TITTIVATING +TITTLE +TITTLES +TITTUP +TITTUPED +TITTUPING +TITTUPPED +TITTUPPING +TITTUPPY +TITTUPS +TITTY +TITUBANT +TITULAR +TITULARIES +TITULARLY +TITULARS +TITULARY +TIVY +TIZZIES +TIZZY +TMESES +TMESIS +TO +TOAD +TOADEATER +TOADEATERS +TOADFISH +TOADFISHES +TOADFLAX +TOADFLAXES +TOADIED +TOADIES +TOADISH +TOADLESS +TOADLIKE +TOADS +TOADSTONE +TOADSTONES +TOADSTOOL +TOADSTOOLS +TOADY +TOADYING +TOADYISH +TOADYISM +TOADYISMS +TOAST +TOASTED +TOASTER +TOASTERS +TOASTIER +TOASTIEST +TOASTING +TOASTMASTER +TOASTMASTERS +TOASTMISTRESS +TOASTMISTRESSES +TOASTS +TOASTY +TOBACCO +TOBACCOES +TOBACCONIST +TOBACCONISTS +TOBACCOS +TOBIES +TOBOGGAN +TOBOGGANED +TOBOGGANER +TOBOGGANERS +TOBOGGANING +TOBOGGANINGS +TOBOGGANIST +TOBOGGANISTS +TOBOGGANS +TOBY +TOCCATA +TOCCATAS +TOCCATE +TOCHER +TOCHERED +TOCHERING +TOCHERS +TOCOLOGIES +TOCOLOGY +TOCOPHEROL +TOCOPHEROLS +TOCSIN +TOCSINS +TOD +TODAY +TODAYS +TODDIES +TODDLE +TODDLED +TODDLER +TODDLERHOOD +TODDLERHOODS +TODDLERS +TODDLES +TODDLING +TODDY +TODIES +TODS +TODY +TOE +TOEA +TOEAS +TOECAP +TOECAPS +TOED +TOEHOLD +TOEHOLDS +TOEING +TOELESS +TOELIKE +TOENAIL +TOENAILED +TOENAILING +TOENAILS +TOEPIECE +TOEPIECES +TOEPLATE +TOEPLATES +TOES +TOESHOE +TOESHOES +TOFF +TOFFEE +TOFFEES +TOFFIES +TOFFS +TOFFY +TOFT +TOFTS +TOFU +TOFUS +TOFUTTI +TOFUTTIS +TOG +TOGA +TOGAE +TOGAED +TOGAS +TOGATE +TOGATED +TOGAVIRUS +TOGAVIRUSES +TOGETHER +TOGETHERNESS +TOGETHERNESSES +TOGGED +TOGGERIES +TOGGERY +TOGGING +TOGGLE +TOGGLED +TOGGLER +TOGGLERS +TOGGLES +TOGGLING +TOGS +TOGUE +TOGUES +TOIL +TOILE +TOILED +TOILER +TOILERS +TOILES +TOILET +TOILETED +TOILETING +TOILETRIES +TOILETRY +TOILETS +TOILETTE +TOILETTES +TOILFUL +TOILFULLY +TOILING +TOILS +TOILSOME +TOILSOMELY +TOILSOMENESS +TOILSOMENESSES +TOILWORN +TOIT +TOITED +TOITING +TOITS +TOKAMAK +TOKAMAKS +TOKAY +TOKAYS +TOKE +TOKED +TOKEN +TOKENED +TOKENING +TOKENISM +TOKENISMS +TOKENS +TOKER +TOKERS +TOKES +TOKING +TOKOLOGIES +TOKOLOGY +TOKOMAK +TOKOMAKS +TOKONOMA +TOKONOMAS +TOLA +TOLAN +TOLANE +TOLANES +TOLANS +TOLAR +TOLARJEV +TOLARS +TOLAS +TOLBOOTH +TOLBOOTHS +TOLBUTAMIDE +TOLBUTAMIDES +TOLD +TOLE +TOLED +TOLEDO +TOLEDOS +TOLERABILITIES +TOLERABILITY +TOLERABLE +TOLERABLY +TOLERANCE +TOLERANCES +TOLERANT +TOLERANTLY +TOLERATE +TOLERATED +TOLERATES +TOLERATING +TOLERATION +TOLERATIONS +TOLERATIVE +TOLERATOR +TOLERATORS +TOLES +TOLIDIN +TOLIDINE +TOLIDINES +TOLIDINS +TOLING +TOLL +TOLLAGE +TOLLAGES +TOLLBAR +TOLLBARS +TOLLBOOTH +TOLLBOOTHS +TOLLED +TOLLER +TOLLERS +TOLLGATE +TOLLGATES +TOLLHOUSE +TOLLHOUSES +TOLLING +TOLLMAN +TOLLMEN +TOLLS +TOLLWAY +TOLLWAYS +TOLU +TOLUATE +TOLUATES +TOLUENE +TOLUENES +TOLUIC +TOLUID +TOLUIDE +TOLUIDES +TOLUIDIDE +TOLUIDIDES +TOLUIDIN +TOLUIDINE +TOLUIDINES +TOLUIDINS +TOLUIDS +TOLUOL +TOLUOLE +TOLUOLES +TOLUOLS +TOLUS +TOLUYL +TOLUYLS +TOLYL +TOLYLS +TOM +TOMAHAWK +TOMAHAWKED +TOMAHAWKING +TOMAHAWKS +TOMALLEY +TOMALLEYS +TOMAN +TOMANS +TOMATILLO +TOMATILLOES +TOMATILLOS +TOMATO +TOMATOES +TOMATOEY +TOMB +TOMBAC +TOMBACK +TOMBACKS +TOMBACS +TOMBAK +TOMBAKS +TOMBAL +TOMBED +TOMBING +TOMBLESS +TOMBLIKE +TOMBOLA +TOMBOLAS +TOMBOLO +TOMBOLOS +TOMBOY +TOMBOYISH +TOMBOYISHNESS +TOMBOYISHNESSES +TOMBOYS +TOMBS +TOMBSTONE +TOMBSTONES +TOMCAT +TOMCATS +TOMCATTED +TOMCATTING +TOMCOD +TOMCODS +TOME +TOMENTA +TOMENTOSE +TOMENTUM +TOMES +TOMFOOL +TOMFOOLERIES +TOMFOOLERY +TOMFOOLS +TOMMED +TOMMIES +TOMMING +TOMMY +TOMMYROT +TOMMYROTS +TOMOGRAM +TOMOGRAMS +TOMOGRAPH +TOMOGRAPHIC +TOMOGRAPHIES +TOMOGRAPHS +TOMOGRAPHY +TOMORROW +TOMORROWS +TOMPION +TOMPIONS +TOMS +TOMTIT +TOMTITS +TON +TONAL +TONALITIES +TONALITY +TONALLY +TONDI +TONDO +TONDOS +TONE +TONEARM +TONEARMS +TONED +TONELESS +TONELESSLY +TONELESSNESS +TONELESSNESSES +TONEME +TONEMES +TONEMIC +TONER +TONERS +TONES +TONETIC +TONETICALLY +TONETICS +TONETTE +TONETTES +TONEY +TONG +TONGA +TONGAS +TONGED +TONGER +TONGERS +TONGING +TONGMAN +TONGMEN +TONGS +TONGUE +TONGUED +TONGUELESS +TONGUELIKE +TONGUES +TONGUING +TONGUINGS +TONIC +TONICALLY +TONICITIES +TONICITY +TONICS +TONIER +TONIEST +TONIGHT +TONIGHTS +TONING +TONISH +TONISHLY +TONLET +TONLETS +TONNAGE +TONNAGES +TONNE +TONNEAU +TONNEAUS +TONNEAUX +TONNER +TONNERS +TONNES +TONNISH +TONOMETER +TONOMETERS +TONOMETRIES +TONOMETRY +TONOPLAST +TONOPLASTS +TONS +TONSIL +TONSILAR +TONSILLAR +TONSILLECTOMIES +TONSILLECTOMY +TONSILLITIS +TONSILLITISES +TONSILS +TONSORIAL +TONSURE +TONSURED +TONSURES +TONSURING +TONTINE +TONTINES +TONUS +TONUSES +TONY +TOO +TOOK +TOOL +TOOLBAR +TOOLBARS +TOOLBOX +TOOLBOXES +TOOLED +TOOLER +TOOLERS +TOOLHEAD +TOOLHEADS +TOOLHOLDER +TOOLHOLDERS +TOOLHOUSE +TOOLHOUSES +TOOLING +TOOLINGS +TOOLLESS +TOOLMAKER +TOOLMAKERS +TOOLMAKING +TOOLMAKINGS +TOOLROOM +TOOLROOMS +TOOLS +TOOLSHED +TOOLSHEDS +TOOM +TOON +TOONIE +TOONIES +TOONS +TOOT +TOOTED +TOOTER +TOOTERS +TOOTH +TOOTHACHE +TOOTHACHES +TOOTHBRUSH +TOOTHBRUSHES +TOOTHBRUSHING +TOOTHBRUSHINGS +TOOTHED +TOOTHIER +TOOTHIEST +TOOTHILY +TOOTHING +TOOTHLESS +TOOTHLIKE +TOOTHPASTE +TOOTHPASTES +TOOTHPICK +TOOTHPICKS +TOOTHS +TOOTHSOME +TOOTHSOMELY +TOOTHSOMENESS +TOOTHSOMENESSES +TOOTHWORT +TOOTHWORTS +TOOTHY +TOOTING +TOOTLE +TOOTLED +TOOTLER +TOOTLERS +TOOTLES +TOOTLING +TOOTS +TOOTSES +TOOTSIE +TOOTSIES +TOOTSY +TOP +TOPAZ +TOPAZES +TOPAZINE +TOPCOAT +TOPCOATS +TOPCROSS +TOPCROSSES +TOPDRESSING +TOPDRESSINGS +TOPE +TOPED +TOPEE +TOPEES +TOPER +TOPERS +TOPES +TOPFLIGHT +TOPFUL +TOPFULL +TOPGALLANT +TOPGALLANTS +TOPH +TOPHE +TOPHES +TOPHI +TOPHS +TOPHUS +TOPI +TOPIARIES +TOPIARY +TOPIC +TOPICAL +TOPICALITIES +TOPICALITY +TOPICALLY +TOPICS +TOPING +TOPIS +TOPKICK +TOPKICKS +TOPKNOT +TOPKNOTS +TOPLESS +TOPLESSNESS +TOPLESSNESSES +TOPLINE +TOPLINES +TOPLOFTICAL +TOPLOFTIER +TOPLOFTIEST +TOPLOFTILY +TOPLOFTINESS +TOPLOFTINESSES +TOPLOFTY +TOPMAST +TOPMASTS +TOPMINNOW +TOPMINNOWS +TOPMOST +TOPNOTCH +TOPNOTCHER +TOPNOTCHERS +TOPO +TOPOCENTRIC +TOPOGRAPH +TOPOGRAPHER +TOPOGRAPHERS +TOPOGRAPHIC +TOPOGRAPHICAL +TOPOGRAPHICALLY +TOPOGRAPHIES +TOPOGRAPHS +TOPOGRAPHY +TOPOI +TOPOLOGIC +TOPOLOGICAL +TOPOLOGICALLY +TOPOLOGIES +TOPOLOGIST +TOPOLOGISTS +TOPOLOGY +TOPONYM +TOPONYMIC +TOPONYMICAL +TOPONYMIES +TOPONYMIST +TOPONYMISTS +TOPONYMS +TOPONYMY +TOPOS +TOPOTYPE +TOPOTYPES +TOPPED +TOPPER +TOPPERS +TOPPING +TOPPINGS +TOPPLE +TOPPLED +TOPPLES +TOPPLING +TOPS +TOPSAIL +TOPSAILS +TOPSIDE +TOPSIDER +TOPSIDERS +TOPSIDES +TOPSOIL +TOPSOILED +TOPSOILING +TOPSOILS +TOPSPIN +TOPSPINS +TOPSTITCH +TOPSTITCHED +TOPSTITCHES +TOPSTITCHING +TOPSTONE +TOPSTONES +TOPWORK +TOPWORKED +TOPWORKING +TOPWORKS +TOQUE +TOQUES +TOQUET +TOQUETS +TOR +TORA +TORAH +TORAHS +TORAS +TORC +TORCH +TORCHABLE +TORCHBEARER +TORCHBEARERS +TORCHED +TORCHERE +TORCHERES +TORCHES +TORCHIER +TORCHIERE +TORCHIERES +TORCHIERS +TORCHIEST +TORCHING +TORCHLIGHT +TORCHLIGHTS +TORCHLIKE +TORCHON +TORCHONS +TORCHWOOD +TORCHWOODS +TORCHY +TORCS +TORE +TOREADOR +TOREADORS +TORERO +TOREROS +TORES +TOREUTIC +TOREUTICS +TORI +TORIC +TORICS +TORIES +TORII +TORMENT +TORMENTED +TORMENTER +TORMENTERS +TORMENTIL +TORMENTILS +TORMENTING +TORMENTOR +TORMENTORS +TORMENTS +TORN +TORNADIC +TORNADO +TORNADOES +TORNADOS +TORNILLO +TORNILLOS +TORO +TOROID +TOROIDAL +TOROIDALLY +TOROIDS +TOROS +TOROSE +TOROSITIES +TOROSITY +TOROT +TOROTH +TOROUS +TORPEDO +TORPEDOED +TORPEDOES +TORPEDOING +TORPEDOS +TORPID +TORPIDITIES +TORPIDITY +TORPIDLY +TORPIDS +TORPOR +TORPORS +TORQUATE +TORQUE +TORQUED +TORQUER +TORQUERS +TORQUES +TORQUESES +TORQUING +TORR +TORREFIED +TORREFIES +TORREFY +TORREFYING +TORRENT +TORRENTIAL +TORRENTIALLY +TORRENTS +TORRID +TORRIDER +TORRIDEST +TORRIDITIES +TORRIDITY +TORRIDLY +TORRIDNESS +TORRIDNESSES +TORRIFIED +TORRIFIES +TORRIFY +TORRIFYING +TORRS +TORS +TORSADE +TORSADES +TORSE +TORSES +TORSI +TORSION +TORSIONAL +TORSIONALLY +TORSIONS +TORSK +TORSKS +TORSO +TORSOS +TORT +TORTA +TORTAS +TORTE +TORTELLINI +TORTELLINIS +TORTEN +TORTES +TORTICOLLIS +TORTICOLLISES +TORTILE +TORTILLA +TORTILLAS +TORTIOUS +TORTIOUSLY +TORTOISE +TORTOISES +TORTOISESHELL +TORTOISESHELLS +TORTONI +TORTONIS +TORTRICID +TORTRICIDS +TORTRIX +TORTRIXES +TORTS +TORTUOSITIES +TORTUOSITY +TORTUOUS +TORTUOUSLY +TORTUOUSNESS +TORTUOUSNESSES +TORTURE +TORTURED +TORTURER +TORTURERS +TORTURES +TORTURING +TORTUROUS +TORTUROUSLY +TORULA +TORULAE +TORULAS +TORUS +TORY +TOSH +TOSHES +TOSS +TOSSED +TOSSER +TOSSERS +TOSSES +TOSSING +TOSSPOT +TOSSPOTS +TOSSUP +TOSSUPS +TOST +TOSTADA +TOSTADAS +TOSTADO +TOSTADOS +TOT +TOTABLE +TOTAL +TOTALED +TOTALING +TOTALISATOR +TOTALISATORS +TOTALISE +TOTALISED +TOTALISES +TOTALISING +TOTALISM +TOTALISMS +TOTALIST +TOTALISTIC +TOTALISTS +TOTALITARIAN +TOTALITARIANISM +TOTALITARIANIZE +TOTALITARIANS +TOTALITIES +TOTALITY +TOTALIZATOR +TOTALIZATORS +TOTALIZE +TOTALIZED +TOTALIZER +TOTALIZERS +TOTALIZES +TOTALIZING +TOTALLED +TOTALLING +TOTALLY +TOTALS +TOTAQUINE +TOTAQUINES +TOTE +TOTEABLE +TOTED +TOTEM +TOTEMIC +TOTEMISM +TOTEMISMS +TOTEMIST +TOTEMISTIC +TOTEMISTS +TOTEMITE +TOTEMITES +TOTEMS +TOTER +TOTERS +TOTES +TOTHER +TOTING +TOTIPOTENCIES +TOTIPOTENCY +TOTIPOTENT +TOTS +TOTTED +TOTTER +TOTTERED +TOTTERER +TOTTERERS +TOTTERING +TOTTERINGLY +TOTTERS +TOTTERY +TOTTING +TOUCAN +TOUCANS +TOUCH +TOUCHABLE +TOUCHBACK +TOUCHBACKS +TOUCHDOWN +TOUCHDOWNS +TOUCHE +TOUCHED +TOUCHER +TOUCHERS +TOUCHES +TOUCHHOLE +TOUCHHOLES +TOUCHIER +TOUCHIEST +TOUCHILY +TOUCHINESS +TOUCHINESSES +TOUCHING +TOUCHINGLY +TOUCHLINE +TOUCHLINES +TOUCHMARK +TOUCHMARKS +TOUCHPAD +TOUCHPADS +TOUCHSTONE +TOUCHSTONES +TOUCHTONE +TOUCHTONES +TOUCHUP +TOUCHUPS +TOUCHWOOD +TOUCHWOODS +TOUCHY +TOUGH +TOUGHED +TOUGHEN +TOUGHENED +TOUGHENER +TOUGHENERS +TOUGHENING +TOUGHENS +TOUGHER +TOUGHEST +TOUGHIE +TOUGHIES +TOUGHING +TOUGHISH +TOUGHLY +TOUGHNESS +TOUGHNESSES +TOUGHS +TOUGHY +TOUPEE +TOUPEES +TOUR +TOURACO +TOURACOS +TOURBILLION +TOURBILLIONS +TOURBILLON +TOURBILLONS +TOURED +TOURER +TOURERS +TOURING +TOURINGS +TOURISM +TOURISMS +TOURIST +TOURISTA +TOURISTAS +TOURISTED +TOURISTIC +TOURISTICALLY +TOURISTS +TOURISTY +TOURMALINE +TOURMALINES +TOURNAMENT +TOURNAMENTS +TOURNEDOS +TOURNEY +TOURNEYED +TOURNEYING +TOURNEYS +TOURNIQUET +TOURNIQUETS +TOURS +TOUSE +TOUSED +TOUSES +TOUSING +TOUSLE +TOUSLED +TOUSLES +TOUSLING +TOUT +TOUTED +TOUTER +TOUTERS +TOUTING +TOUTS +TOUZLE +TOUZLED +TOUZLES +TOUZLING +TOVARICH +TOVARICHES +TOVARISH +TOVARISHES +TOW +TOWABLE +TOWAGE +TOWAGES +TOWARD +TOWARDLINESS +TOWARDLINESSES +TOWARDLY +TOWARDS +TOWAWAY +TOWAWAYS +TOWBOAT +TOWBOATS +TOWED +TOWEL +TOWELED +TOWELETTE +TOWELETTES +TOWELING +TOWELINGS +TOWELLED +TOWELLING +TOWELLINGS +TOWELS +TOWER +TOWERED +TOWERIER +TOWERIEST +TOWERING +TOWERINGLY +TOWERLIKE +TOWERS +TOWERY +TOWHEAD +TOWHEADED +TOWHEADS +TOWHEE +TOWHEES +TOWIE +TOWIES +TOWING +TOWLINE +TOWLINES +TOWMOND +TOWMONDS +TOWMONT +TOWMONTS +TOWN +TOWNEE +TOWNEES +TOWNFOLK +TOWNHOME +TOWNHOMES +TOWNHOUSE +TOWNHOUSES +TOWNIE +TOWNIES +TOWNISH +TOWNLESS +TOWNLET +TOWNLETS +TOWNS +TOWNSCAPE +TOWNSCAPES +TOWNSFOLK +TOWNSHIP +TOWNSHIPS +TOWNSMAN +TOWNSMEN +TOWNSPEOPLE +TOWNSWOMAN +TOWNSWOMEN +TOWNWEAR +TOWNY +TOWPATH +TOWPATHS +TOWPLANE +TOWPLANES +TOWROPE +TOWROPES +TOWS +TOWSACK +TOWSACKS +TOWY +TOXAEMIA +TOXAEMIAS +TOXAEMIC +TOXAPHENE +TOXAPHENES +TOXEMIA +TOXEMIAS +TOXEMIC +TOXIC +TOXICAL +TOXICALLY +TOXICANT +TOXICANTS +TOXICITIES +TOXICITY +TOXICOLOGIC +TOXICOLOGICAL +TOXICOLOGICALLY +TOXICOLOGIES +TOXICOLOGIST +TOXICOLOGISTS +TOXICOLOGY +TOXICOSES +TOXICOSIS +TOXICS +TOXIGENIC +TOXIGENICITIES +TOXIGENICITY +TOXIN +TOXINE +TOXINES +TOXINS +TOXOID +TOXOIDS +TOXOPHILIES +TOXOPHILITE +TOXOPHILITES +TOXOPHILY +TOXOPLASMA +TOXOPLASMAS +TOXOPLASMIC +TOXOPLASMOSES +TOXOPLASMOSIS +TOY +TOYED +TOYER +TOYERS +TOYING +TOYISH +TOYLESS +TOYLIKE +TOYO +TOYON +TOYONS +TOYOS +TOYS +TOYSHOP +TOYSHOPS +TRABEATE +TRABEATED +TRABEATION +TRABEATIONS +TRABECULA +TRABECULAE +TRABECULAR +TRABECULAS +TRABECULATE +TRACE +TRACEABILITIES +TRACEABILITY +TRACEABLE +TRACEABLY +TRACED +TRACELESS +TRACER +TRACERIED +TRACERIES +TRACERS +TRACERY +TRACES +TRACHEA +TRACHEAE +TRACHEAL +TRACHEARY +TRACHEAS +TRACHEATE +TRACHEATED +TRACHEATES +TRACHEID +TRACHEIDS +TRACHEITIS +TRACHEITISES +TRACHEOLAR +TRACHEOLE +TRACHEOLES +TRACHEOPHYTE +TRACHEOPHYTES +TRACHEOSTOMIES +TRACHEOSTOMY +TRACHEOTOMIES +TRACHEOTOMY +TRACHLE +TRACHLED +TRACHLES +TRACHLING +TRACHOMA +TRACHOMAS +TRACHYTE +TRACHYTES +TRACHYTIC +TRACING +TRACINGS +TRACK +TRACKABLE +TRACKAGE +TRACKAGES +TRACKBALL +TRACKBALLS +TRACKED +TRACKER +TRACKERS +TRACKING +TRACKINGS +TRACKLAYER +TRACKLAYERS +TRACKLAYING +TRACKLAYINGS +TRACKLESS +TRACKMAN +TRACKMEN +TRACKPAD +TRACKPADS +TRACKS +TRACKSIDE +TRACKSIDES +TRACKSUIT +TRACKSUITS +TRACKWALKER +TRACKWALKERS +TRACKWAY +TRACKWAYS +TRACT +TRACTABILITIES +TRACTABILITY +TRACTABLE +TRACTABLENESS +TRACTABLENESSES +TRACTABLY +TRACTATE +TRACTATES +TRACTILE +TRACTION +TRACTIONAL +TRACTIONS +TRACTIVE +TRACTOR +TRACTORS +TRACTS +TRAD +TRADABLE +TRADE +TRADEABLE +TRADECRAFT +TRADECRAFTS +TRADED +TRADEMARK +TRADEMARKED +TRADEMARKING +TRADEMARKS +TRADEOFF +TRADEOFFS +TRADER +TRADERS +TRADES +TRADESCANTIA +TRADESCANTIAS +TRADESMAN +TRADESMEN +TRADESPEOPLE +TRADING +TRADITION +TRADITIONAL +TRADITIONALISM +TRADITIONALISMS +TRADITIONALIST +TRADITIONALISTS +TRADITIONALIZE +TRADITIONALIZED +TRADITIONALIZES +TRADITIONALLY +TRADITIONARY +TRADITIONLESS +TRADITIONS +TRADITIVE +TRADITOR +TRADITORES +TRADUCE +TRADUCED +TRADUCEMENT +TRADUCEMENTS +TRADUCER +TRADUCERS +TRADUCES +TRADUCING +TRAFFIC +TRAFFICABILITY +TRAFFICABLE +TRAFFICKED +TRAFFICKER +TRAFFICKERS +TRAFFICKING +TRAFFICS +TRAGACANTH +TRAGACANTHS +TRAGEDIAN +TRAGEDIANS +TRAGEDIENNE +TRAGEDIENNES +TRAGEDIES +TRAGEDY +TRAGI +TRAGIC +TRAGICAL +TRAGICALLY +TRAGICOMEDIES +TRAGICOMEDY +TRAGICOMIC +TRAGICOMICAL +TRAGICS +TRAGOPAN +TRAGOPANS +TRAGUS +TRAIK +TRAIKED +TRAIKING +TRAIKS +TRAIL +TRAILBLAZER +TRAILBLAZERS +TRAILBLAZING +TRAILBREAKER +TRAILBREAKERS +TRAILED +TRAILER +TRAILERABLE +TRAILERED +TRAILERING +TRAILERINGS +TRAILERIST +TRAILERISTS +TRAILERITE +TRAILERITES +TRAILERS +TRAILHEAD +TRAILHEADS +TRAILING +TRAILLESS +TRAILS +TRAILSIDE +TRAIN +TRAINABILITIES +TRAINABILITY +TRAINABLE +TRAINBAND +TRAINBANDS +TRAINBEARER +TRAINBEARERS +TRAINED +TRAINEE +TRAINEES +TRAINEESHIP +TRAINEESHIPS +TRAINER +TRAINERS +TRAINFUL +TRAINFULS +TRAINING +TRAININGS +TRAINLOAD +TRAINLOADS +TRAINMAN +TRAINMEN +TRAINS +TRAINWAY +TRAINWAYS +TRAIPSE +TRAIPSED +TRAIPSES +TRAIPSING +TRAIT +TRAITOR +TRAITORESS +TRAITORESSES +TRAITOROUS +TRAITOROUSLY +TRAITORS +TRAITRESS +TRAITRESSES +TRAITS +TRAJECT +TRAJECTED +TRAJECTING +TRAJECTION +TRAJECTIONS +TRAJECTORIES +TRAJECTORY +TRAJECTS +TRAM +TRAMCAR +TRAMCARS +TRAMEL +TRAMELED +TRAMELING +TRAMELL +TRAMELLED +TRAMELLING +TRAMELLS +TRAMELS +TRAMLESS +TRAMLINE +TRAMLINES +TRAMMED +TRAMMEL +TRAMMELED +TRAMMELER +TRAMMELERS +TRAMMELING +TRAMMELLED +TRAMMELLING +TRAMMELS +TRAMMING +TRAMONTANE +TRAMONTANES +TRAMP +TRAMPED +TRAMPER +TRAMPERS +TRAMPIER +TRAMPIEST +TRAMPING +TRAMPISH +TRAMPLE +TRAMPLED +TRAMPLER +TRAMPLERS +TRAMPLES +TRAMPLING +TRAMPOLINE +TRAMPOLINER +TRAMPOLINERS +TRAMPOLINES +TRAMPOLINING +TRAMPOLININGS +TRAMPOLINIST +TRAMPOLINISTS +TRAMPS +TRAMPY +TRAMROAD +TRAMROADS +TRAMS +TRAMWAY +TRAMWAYS +TRANCE +TRANCED +TRANCELIKE +TRANCES +TRANCHE +TRANCHES +TRANCING +TRANGAM +TRANGAMS +TRANK +TRANKS +TRANNIES +TRANNY +TRANQ +TRANQS +TRANQUIL +TRANQUILER +TRANQUILEST +TRANQUILITIES +TRANQUILITY +TRANQUILIZE +TRANQUILIZED +TRANQUILIZER +TRANQUILIZERS +TRANQUILIZES +TRANQUILIZING +TRANQUILLER +TRANQUILLEST +TRANQUILLITIES +TRANQUILLITY +TRANQUILLIZE +TRANQUILLIZED +TRANQUILLIZER +TRANQUILLIZERS +TRANQUILLIZES +TRANQUILLIZING +TRANQUILLY +TRANQUILNESS +TRANQUILNESSES +TRANS +TRANSACT +TRANSACTED +TRANSACTING +TRANSACTINIDE +TRANSACTION +TRANSACTIONAL +TRANSACTIONS +TRANSACTOR +TRANSACTORS +TRANSACTS +TRANSALPINE +TRANSAMINASE +TRANSAMINASES +TRANSAMINATION +TRANSAMINATIONS +TRANSATLANTIC +TRANSAXLE +TRANSAXLES +TRANSCEIVER +TRANSCEIVERS +TRANSCEND +TRANSCENDED +TRANSCENDENCE +TRANSCENDENCES +TRANSCENDENCIES +TRANSCENDENCY +TRANSCENDENT +TRANSCENDENTAL +TRANSCENDENTLY +TRANSCENDING +TRANSCENDS +TRANSCRIBE +TRANSCRIBED +TRANSCRIBER +TRANSCRIBERS +TRANSCRIBES +TRANSCRIBING +TRANSCRIPT +TRANSCRIPTASE +TRANSCRIPTASES +TRANSCRIPTION +TRANSCRIPTIONAL +TRANSCRIPTIONS +TRANSCRIPTS +TRANSCULTURAL +TRANSCUTANEOUS +TRANSDERMAL +TRANSDUCE +TRANSDUCED +TRANSDUCER +TRANSDUCERS +TRANSDUCES +TRANSDUCING +TRANSDUCTANT +TRANSDUCTANTS +TRANSDUCTION +TRANSDUCTIONAL +TRANSDUCTIONS +TRANSECT +TRANSECTED +TRANSECTING +TRANSECTION +TRANSECTIONS +TRANSECTS +TRANSEPT +TRANSEPTAL +TRANSEPTS +TRANSEUNT +TRANSFECT +TRANSFECTED +TRANSFECTING +TRANSFECTION +TRANSFECTIONS +TRANSFECTS +TRANSFER +TRANSFERABILITY +TRANSFERABLE +TRANSFERAL +TRANSFERALS +TRANSFERASE +TRANSFERASES +TRANSFEREE +TRANSFEREES +TRANSFERENCE +TRANSFERENCES +TRANSFERENTIAL +TRANSFEROR +TRANSFERORS +TRANSFERRABLE +TRANSFERRED +TRANSFERRER +TRANSFERRERS +TRANSFERRIN +TRANSFERRING +TRANSFERRINS +TRANSFERS +TRANSFIGURATION +TRANSFIGURE +TRANSFIGURED +TRANSFIGURES +TRANSFIGURING +TRANSFINITE +TRANSFIX +TRANSFIXED +TRANSFIXES +TRANSFIXING +TRANSFIXION +TRANSFIXIONS +TRANSFIXT +TRANSFORM +TRANSFORMABLE +TRANSFORMATION +TRANSFORMATIONS +TRANSFORMATIVE +TRANSFORMED +TRANSFORMER +TRANSFORMERS +TRANSFORMING +TRANSFORMS +TRANSFUSABLE +TRANSFUSE +TRANSFUSED +TRANSFUSES +TRANSFUSIBLE +TRANSFUSING +TRANSFUSION +TRANSFUSIONAL +TRANSFUSIONS +TRANSGENDER +TRANSGENDERED +TRANSGENE +TRANSGENES +TRANSGENIC +TRANSGRESS +TRANSGRESSED +TRANSGRESSES +TRANSGRESSING +TRANSGRESSION +TRANSGRESSIONS +TRANSGRESSIVE +TRANSGRESSOR +TRANSGRESSORS +TRANSHIP +TRANSHIPPED +TRANSHIPPING +TRANSHIPS +TRANSHISTORICAL +TRANSHUMANCE +TRANSHUMANCES +TRANSHUMANT +TRANSHUMANTS +TRANSIENCE +TRANSIENCES +TRANSIENCIES +TRANSIENCY +TRANSIENT +TRANSIENTLY +TRANSIENTS +TRANSILLUMINATE +TRANSISTOR +TRANSISTORISE +TRANSISTORISED +TRANSISTORISES +TRANSISTORISING +TRANSISTORIZE +TRANSISTORIZED +TRANSISTORIZES +TRANSISTORIZING +TRANSISTORS +TRANSIT +TRANSITED +TRANSITING +TRANSITION +TRANSITIONAL +TRANSITIONALLY +TRANSITIONS +TRANSITIVE +TRANSITIVELY +TRANSITIVENESS +TRANSITIVITIES +TRANSITIVITY +TRANSITORILY +TRANSITORINESS +TRANSITORY +TRANSITS +TRANSLATABILITY +TRANSLATABLE +TRANSLATE +TRANSLATED +TRANSLATES +TRANSLATING +TRANSLATION +TRANSLATIONAL +TRANSLATIONS +TRANSLATIVE +TRANSLATOR +TRANSLATORS +TRANSLATORY +TRANSLITERATE +TRANSLITERATED +TRANSLITERATES +TRANSLITERATING +TRANSLITERATION +TRANSLOCATE +TRANSLOCATED +TRANSLOCATES +TRANSLOCATING +TRANSLOCATION +TRANSLOCATIONS +TRANSLUCENCE +TRANSLUCENCES +TRANSLUCENCIES +TRANSLUCENCY +TRANSLUCENT +TRANSLUCENTLY +TRANSMARINE +TRANSMEMBRANE +TRANSMIGRATE +TRANSMIGRATED +TRANSMIGRATES +TRANSMIGRATING +TRANSMIGRATION +TRANSMIGRATIONS +TRANSMIGRATOR +TRANSMIGRATORS +TRANSMIGRATORY +TRANSMISSIBLE +TRANSMISSION +TRANSMISSIONS +TRANSMISSIVE +TRANSMISSIVITY +TRANSMISSOMETER +TRANSMIT +TRANSMITS +TRANSMITTABLE +TRANSMITTAL +TRANSMITTALS +TRANSMITTANCE +TRANSMITTANCES +TRANSMITTED +TRANSMITTER +TRANSMITTERS +TRANSMITTING +TRANSMOGRIFIED +TRANSMOGRIFIES +TRANSMOGRIFY +TRANSMOGRIFYING +TRANSMONTANE +TRANSMOUNTAIN +TRANSMUTABLE +TRANSMUTATION +TRANSMUTATIONS +TRANSMUTATIVE +TRANSMUTE +TRANSMUTED +TRANSMUTES +TRANSMUTING +TRANSNATIONAL +TRANSNATURAL +TRANSOCEANIC +TRANSOM +TRANSOMS +TRANSONIC +TRANSPACIFIC +TRANSPARENCE +TRANSPARENCES +TRANSPARENCIES +TRANSPARENCY +TRANSPARENT +TRANSPARENTIZE +TRANSPARENTIZED +TRANSPARENTIZES +TRANSPARENTLY +TRANSPARENTNESS +TRANSPERSONAL +TRANSPICUOUS +TRANSPIERCE +TRANSPIERCED +TRANSPIERCES +TRANSPIERCING +TRANSPIRATION +TRANSPIRATIONAL +TRANSPIRATIONS +TRANSPIRE +TRANSPIRED +TRANSPIRES +TRANSPIRING +TRANSPLACENTAL +TRANSPLANT +TRANSPLANTABLE +TRANSPLANTATION +TRANSPLANTED +TRANSPLANTER +TRANSPLANTERS +TRANSPLANTING +TRANSPLANTS +TRANSPOLAR +TRANSPONDER +TRANSPONDERS +TRANSPONTINE +TRANSPORT +TRANSPORTABLE +TRANSPORTATION +TRANSPORTATIONS +TRANSPORTED +TRANSPORTER +TRANSPORTERS +TRANSPORTING +TRANSPORTS +TRANSPOSABLE +TRANSPOSE +TRANSPOSED +TRANSPOSES +TRANSPOSING +TRANSPOSITION +TRANSPOSITIONAL +TRANSPOSITIONS +TRANSPOSON +TRANSPOSONS +TRANSSEXUAL +TRANSSEXUALISM +TRANSSEXUALISMS +TRANSSEXUALITY +TRANSSEXUALS +TRANSSHAPE +TRANSSHAPED +TRANSSHAPES +TRANSSHAPING +TRANSSHIP +TRANSSHIPMENT +TRANSSHIPMENTS +TRANSSHIPPED +TRANSSHIPPING +TRANSSHIPS +TRANSSONIC +TRANSTHORACIC +TRANSUBSTANTIAL +TRANSUDATE +TRANSUDATES +TRANSUDATION +TRANSUDATIONS +TRANSUDE +TRANSUDED +TRANSUDES +TRANSUDING +TRANSURANIC +TRANSURANICS +TRANSURANIUM +TRANSVALUATE +TRANSVALUATED +TRANSVALUATES +TRANSVALUATING +TRANSVALUATION +TRANSVALUATIONS +TRANSVALUE +TRANSVALUED +TRANSVALUES +TRANSVALUING +TRANSVERSAL +TRANSVERSALS +TRANSVERSE +TRANSVERSELY +TRANSVERSES +TRANSVESTISM +TRANSVESTISMS +TRANSVESTITE +TRANSVESTITES +TRAP +TRAPAN +TRAPANNED +TRAPANNING +TRAPANS +TRAPBALL +TRAPBALLS +TRAPDOOR +TRAPDOORS +TRAPES +TRAPESED +TRAPESES +TRAPESING +TRAPEZE +TRAPEZES +TRAPEZIA +TRAPEZIAL +TRAPEZII +TRAPEZIST +TRAPEZISTS +TRAPEZIUM +TRAPEZIUMS +TRAPEZIUS +TRAPEZIUSES +TRAPEZOHEDRA +TRAPEZOHEDRON +TRAPEZOHEDRONS +TRAPEZOID +TRAPEZOIDAL +TRAPEZOIDS +TRAPLIKE +TRAPLINE +TRAPLINES +TRAPNEST +TRAPNESTED +TRAPNESTING +TRAPNESTS +TRAPPEAN +TRAPPED +TRAPPER +TRAPPERS +TRAPPING +TRAPPINGS +TRAPPOSE +TRAPPOUS +TRAPROCK +TRAPROCKS +TRAPS +TRAPSHOOTER +TRAPSHOOTERS +TRAPSHOOTING +TRAPSHOOTINGS +TRAPT +TRAPUNTO +TRAPUNTOS +TRASH +TRASHED +TRASHER +TRASHERS +TRASHES +TRASHIER +TRASHIEST +TRASHILY +TRASHINESS +TRASHINESSES +TRASHING +TRASHMAN +TRASHMEN +TRASHY +TRASS +TRASSES +TRATTORIA +TRATTORIAS +TRATTORIE +TRAUCHLE +TRAUCHLED +TRAUCHLES +TRAUCHLING +TRAUMA +TRAUMAS +TRAUMATA +TRAUMATIC +TRAUMATICALLY +TRAUMATISE +TRAUMATISED +TRAUMATISES +TRAUMATISING +TRAUMATISM +TRAUMATISMS +TRAUMATIZATION +TRAUMATIZATIONS +TRAUMATIZE +TRAUMATIZED +TRAUMATIZES +TRAUMATIZING +TRAVAIL +TRAVAILED +TRAVAILING +TRAVAILS +TRAVE +TRAVEL +TRAVELED +TRAVELER +TRAVELERS +TRAVELING +TRAVELLED +TRAVELLER +TRAVELLERS +TRAVELLING +TRAVELOG +TRAVELOGS +TRAVELOGUE +TRAVELOGUES +TRAVELS +TRAVERSABLE +TRAVERSAL +TRAVERSALS +TRAVERSE +TRAVERSED +TRAVERSER +TRAVERSERS +TRAVERSES +TRAVERSING +TRAVERTINE +TRAVERTINES +TRAVES +TRAVESTIED +TRAVESTIES +TRAVESTY +TRAVESTYING +TRAVOIS +TRAVOISE +TRAVOISES +TRAWL +TRAWLED +TRAWLER +TRAWLERMAN +TRAWLERMEN +TRAWLERS +TRAWLEY +TRAWLEYS +TRAWLING +TRAWLNET +TRAWLNETS +TRAWLS +TRAY +TRAYFUL +TRAYFULS +TRAYS +TRAZODONE +TRAZODONES +TREACHERIES +TREACHEROUS +TREACHEROUSLY +TREACHEROUSNESS +TREACHERY +TREACLE +TREACLES +TREACLIER +TREACLIEST +TREACLY +TREAD +TREADED +TREADER +TREADERS +TREADING +TREADLE +TREADLED +TREADLER +TREADLERS +TREADLES +TREADLESS +TREADLING +TREADMILL +TREADMILLS +TREADS +TREASON +TREASONABLE +TREASONABLY +TREASONOUS +TREASONS +TREASURABLE +TREASURE +TREASURED +TREASURER +TREASURERS +TREASURERSHIP +TREASURERSHIPS +TREASURES +TREASURIES +TREASURING +TREASURY +TREAT +TREATABILITIES +TREATABILITY +TREATABLE +TREATED +TREATER +TREATERS +TREATIES +TREATING +TREATISE +TREATISES +TREATMENT +TREATMENTS +TREATS +TREATY +TREBBIANO +TREBBIANOS +TREBLE +TREBLED +TREBLES +TREBLING +TREBLY +TREBUCHET +TREBUCHETS +TREBUCKET +TREBUCKETS +TRECENTO +TRECENTOS +TREDDLE +TREDDLED +TREDDLES +TREDDLING +TREDECILLION +TREDECILLIONS +TREE +TREED +TREEHOPPER +TREEHOPPERS +TREEHOUSE +TREEHOUSES +TREEING +TREELAWN +TREELAWNS +TREELESS +TREELIKE +TREEN +TREENAIL +TREENAILS +TREENS +TREENWARE +TREENWARES +TREES +TREETOP +TREETOPS +TREF +TREFAH +TREFOIL +TREFOILS +TREHALA +TREHALAS +TREHALOSE +TREHALOSES +TREILLAGE +TREILLAGES +TREK +TREKKED +TREKKER +TREKKERS +TREKKING +TREKS +TRELLIS +TRELLISED +TRELLISES +TRELLISING +TRELLISWORK +TRELLISWORKS +TREMATODE +TREMATODES +TREMBLE +TREMBLED +TREMBLER +TREMBLERS +TREMBLES +TREMBLIER +TREMBLIEST +TREMBLING +TREMBLY +TREMENDOUS +TREMENDOUSLY +TREMENDOUSNESS +TREMOLITE +TREMOLITES +TREMOLITIC +TREMOLO +TREMOLOS +TREMOR +TREMOROUS +TREMORS +TREMULANT +TREMULOUS +TREMULOUSLY +TREMULOUSNESS +TREMULOUSNESSES +TRENAIL +TRENAILS +TRENCH +TRENCHANCIES +TRENCHANCY +TRENCHANT +TRENCHANTLY +TRENCHED +TRENCHER +TRENCHERMAN +TRENCHERMEN +TRENCHERS +TRENCHES +TRENCHING +TREND +TRENDED +TRENDIER +TRENDIES +TRENDIEST +TRENDILY +TRENDINESS +TRENDINESSES +TRENDING +TRENDOID +TRENDOIDS +TRENDS +TRENDSETTER +TRENDSETTERS +TRENDSETTING +TRENDY +TREPAN +TREPANATION +TREPANATIONS +TREPANG +TREPANGS +TREPANNED +TREPANNER +TREPANNERS +TREPANNING +TREPANS +TREPHINATION +TREPHINATIONS +TREPHINE +TREPHINED +TREPHINES +TREPHINING +TREPID +TREPIDANT +TREPIDATION +TREPIDATIONS +TREPONEMA +TREPONEMAL +TREPONEMAS +TREPONEMATA +TREPONEMATOSES +TREPONEMATOSIS +TREPONEME +TREPONEMES +TRES +TRESPASS +TRESPASSED +TRESPASSER +TRESPASSERS +TRESPASSES +TRESPASSING +TRESS +TRESSED +TRESSEL +TRESSELS +TRESSES +TRESSIER +TRESSIEST +TRESSOUR +TRESSOURS +TRESSURE +TRESSURES +TRESSY +TRESTLE +TRESTLES +TRESTLEWORK +TRESTLEWORKS +TRET +TRETINOIN +TRETINOINS +TRETS +TREVALLIES +TREVALLY +TREVALLYS +TREVET +TREVETS +TREWS +TREY +TREYS +TRIABLE +TRIAC +TRIACETATE +TRIACETATES +TRIACID +TRIACIDS +TRIACS +TRIAD +TRIADIC +TRIADICALLY +TRIADICS +TRIADISM +TRIADISMS +TRIADS +TRIAGE +TRIAGED +TRIAGES +TRIAGING +TRIAL +TRIALOGUE +TRIALOGUES +TRIALS +TRIAMCINOLONE +TRIAMCINOLONES +TRIANGLE +TRIANGLED +TRIANGLES +TRIANGULAR +TRIANGULARITIES +TRIANGULARITY +TRIANGULARLY +TRIANGULATE +TRIANGULATED +TRIANGULATES +TRIANGULATING +TRIANGULATION +TRIANGULATIONS +TRIARCHIES +TRIARCHY +TRIASSIC +TRIATHLETE +TRIATHLETES +TRIATHLON +TRIATHLONS +TRIATOMIC +TRIAXIAL +TRIAXIALITIES +TRIAXIALITY +TRIAZIN +TRIAZINE +TRIAZINES +TRIAZINS +TRIAZOLE +TRIAZOLES +TRIBADE +TRIBADES +TRIBADIC +TRIBADISM +TRIBADISMS +TRIBAL +TRIBALISM +TRIBALISMS +TRIBALIST +TRIBALISTS +TRIBALLY +TRIBALS +TRIBASIC +TRIBE +TRIBES +TRIBESMAN +TRIBESMEN +TRIBESPEOPLE +TRIBOELECTRIC +TRIBOLOGICAL +TRIBOLOGIES +TRIBOLOGIST +TRIBOLOGISTS +TRIBOLOGY +TRIBRACH +TRIBRACHIC +TRIBRACHS +TRIBULATE +TRIBULATED +TRIBULATES +TRIBULATING +TRIBULATION +TRIBULATIONS +TRIBUNAL +TRIBUNALS +TRIBUNARY +TRIBUNATE +TRIBUNATES +TRIBUNE +TRIBUNES +TRIBUNESHIP +TRIBUNESHIPS +TRIBUTARIES +TRIBUTARY +TRIBUTE +TRIBUTES +TRICARBOXYLIC +TRICE +TRICED +TRICEP +TRICEPS +TRICEPSES +TRICERATOPS +TRICERATOPSES +TRICES +TRICHIASES +TRICHIASIS +TRICHINA +TRICHINAE +TRICHINAL +TRICHINAS +TRICHINIZE +TRICHINIZED +TRICHINIZES +TRICHINIZING +TRICHINOSES +TRICHINOSIS +TRICHINOUS +TRICHITE +TRICHITES +TRICHLORFON +TRICHLORFONS +TRICHLORPHON +TRICHLORPHONS +TRICHOCYST +TRICHOCYSTS +TRICHOGYNE +TRICHOGYNES +TRICHOID +TRICHOLOGIES +TRICHOLOGIST +TRICHOLOGISTS +TRICHOLOGY +TRICHOME +TRICHOMES +TRICHOMIC +TRICHOMONACIDAL +TRICHOMONACIDE +TRICHOMONACIDES +TRICHOMONAD +TRICHOMONADS +TRICHOMONAL +TRICHOMONIASES +TRICHOMONIASIS +TRICHOPTERAN +TRICHOPTERANS +TRICHOSES +TRICHOSIS +TRICHOTHECENE +TRICHOTHECENES +TRICHOTOMIES +TRICHOTOMOUS +TRICHOTOMOUSLY +TRICHOTOMY +TRICHROIC +TRICHROMAT +TRICHROMATIC +TRICHROMATISM +TRICHROMATISMS +TRICHROMATS +TRICHROME +TRICING +TRICK +TRICKED +TRICKER +TRICKERIES +TRICKERS +TRICKERY +TRICKIE +TRICKIER +TRICKIEST +TRICKILY +TRICKINESS +TRICKINESSES +TRICKING +TRICKISH +TRICKISHLY +TRICKISHNESS +TRICKISHNESSES +TRICKLE +TRICKLED +TRICKLES +TRICKLIER +TRICKLIEST +TRICKLING +TRICKLY +TRICKS +TRICKSIER +TRICKSIEST +TRICKSINESS +TRICKSINESSES +TRICKSTER +TRICKSTERS +TRICKSY +TRICKY +TRICLAD +TRICLADS +TRICLINIA +TRICLINIC +TRICLINIUM +TRICLOSAN +TRICLOSANS +TRICOLETTE +TRICOLETTES +TRICOLOR +TRICOLORED +TRICOLORS +TRICOLOUR +TRICOLOURS +TRICORN +TRICORNE +TRICORNERED +TRICORNES +TRICORNS +TRICOT +TRICOTINE +TRICOTINES +TRICOTS +TRICROTIC +TRICTRAC +TRICTRACS +TRICUSPID +TRICUSPIDS +TRICYCLE +TRICYCLES +TRICYCLIC +TRICYCLICS +TRIDACTYL +TRIDENT +TRIDENTAL +TRIDENTS +TRIDIMENSIONAL +TRIDUUM +TRIDUUMS +TRIED +TRIENE +TRIENES +TRIENNIA +TRIENNIAL +TRIENNIALLY +TRIENNIALS +TRIENNIUM +TRIENNIUMS +TRIENS +TRIENTES +TRIER +TRIERARCH +TRIERARCHIES +TRIERARCHS +TRIERARCHY +TRIERS +TRIES +TRIETHYL +TRIFACIAL +TRIFACIALS +TRIFECTA +TRIFECTAS +TRIFID +TRIFLE +TRIFLED +TRIFLER +TRIFLERS +TRIFLES +TRIFLING +TRIFLINGS +TRIFLUOPERAZINE +TRIFLURALIN +TRIFLURALINS +TRIFOCAL +TRIFOCALS +TRIFOLD +TRIFOLIATE +TRIFOLIOLATE +TRIFOLIUM +TRIFOLIUMS +TRIFORIA +TRIFORIUM +TRIFORM +TRIFORMED +TRIFURCATE +TRIFURCATED +TRIFURCATES +TRIFURCATING +TRIFURCATION +TRIFURCATIONS +TRIG +TRIGEMINAL +TRIGEMINALS +TRIGGED +TRIGGER +TRIGGERED +TRIGGERFISH +TRIGGERFISHES +TRIGGERING +TRIGGERMAN +TRIGGERMEN +TRIGGERS +TRIGGEST +TRIGGING +TRIGLY +TRIGLYCERIDE +TRIGLYCERIDES +TRIGLYPH +TRIGLYPHIC +TRIGLYPHICAL +TRIGLYPHS +TRIGNESS +TRIGNESSES +TRIGO +TRIGON +TRIGONAL +TRIGONALLY +TRIGONOMETRIC +TRIGONOMETRICAL +TRIGONOMETRIES +TRIGONOMETRY +TRIGONOUS +TRIGONS +TRIGOS +TRIGRAM +TRIGRAMS +TRIGRAPH +TRIGRAPHIC +TRIGRAPHS +TRIGS +TRIHALOMETHANE +TRIHALOMETHANES +TRIHEDRA +TRIHEDRAL +TRIHEDRALS +TRIHEDRON +TRIHEDRONS +TRIHYBRID +TRIHYBRIDS +TRIHYDROXY +TRIJET +TRIJETS +TRIJUGATE +TRIJUGOUS +TRIKE +TRIKES +TRILATERAL +TRILBIES +TRILBY +TRILINEAR +TRILINGUAL +TRILINGUALLY +TRILITERAL +TRILITERALISM +TRILITERALISMS +TRILITERALS +TRILITH +TRILITHON +TRILITHONS +TRILITHS +TRILL +TRILLED +TRILLER +TRILLERS +TRILLING +TRILLION +TRILLIONS +TRILLIONTH +TRILLIONTHS +TRILLIUM +TRILLIUMS +TRILLS +TRILOBAL +TRILOBATE +TRILOBED +TRILOBITE +TRILOBITES +TRILOGIES +TRILOGY +TRIM +TRIMARAN +TRIMARANS +TRIMER +TRIMERIC +TRIMERISM +TRIMERISMS +TRIMEROUS +TRIMERS +TRIMESTER +TRIMESTERS +TRIMETER +TRIMETERS +TRIMETHOPRIM +TRIMETHOPRIMS +TRIMETRIC +TRIMETROGON +TRIMETROGONS +TRIMLY +TRIMMED +TRIMMER +TRIMMERS +TRIMMEST +TRIMMING +TRIMMINGS +TRIMNESS +TRIMNESSES +TRIMONTHLY +TRIMORPH +TRIMORPHIC +TRIMORPHS +TRIMOTOR +TRIMOTORS +TRIMS +TRINAL +TRINARY +TRINDLE +TRINDLED +TRINDLES +TRINDLING +TRINE +TRINED +TRINES +TRINING +TRINITARIAN +TRINITIES +TRINITROTOLUENE +TRINITY +TRINKET +TRINKETED +TRINKETER +TRINKETERS +TRINKETING +TRINKETRIES +TRINKETRY +TRINKETS +TRINKUMS +TRINOCULAR +TRINODAL +TRINOMIAL +TRINOMIALS +TRINUCLEOTIDE +TRINUCLEOTIDES +TRIO +TRIODE +TRIODES +TRIOL +TRIOLET +TRIOLETS +TRIOLS +TRIOS +TRIOSE +TRIOSES +TRIOXID +TRIOXIDE +TRIOXIDES +TRIOXIDS +TRIP +TRIPACK +TRIPACKS +TRIPART +TRIPARTITE +TRIPE +TRIPEDAL +TRIPES +TRIPHASE +TRIPHOSPHATE +TRIPHOSPHATES +TRIPHTHONG +TRIPHTHONGAL +TRIPHTHONGS +TRIPINNATE +TRIPINNATELY +TRIPLANE +TRIPLANES +TRIPLE +TRIPLED +TRIPLES +TRIPLET +TRIPLETAIL +TRIPLETAILS +TRIPLETS +TRIPLEX +TRIPLEXES +TRIPLICATE +TRIPLICATED +TRIPLICATES +TRIPLICATING +TRIPLICATION +TRIPLICATIONS +TRIPLICITIES +TRIPLICITY +TRIPLING +TRIPLITE +TRIPLITES +TRIPLOBLASTIC +TRIPLOID +TRIPLOIDIES +TRIPLOIDS +TRIPLOIDY +TRIPLY +TRIPOD +TRIPODAL +TRIPODIC +TRIPODIES +TRIPODS +TRIPODY +TRIPOLI +TRIPOLIS +TRIPOS +TRIPOSES +TRIPPED +TRIPPER +TRIPPERS +TRIPPET +TRIPPETS +TRIPPIER +TRIPPIEST +TRIPPING +TRIPPINGLY +TRIPPINGS +TRIPPY +TRIPS +TRIPTAN +TRIPTANE +TRIPTANES +TRIPTANS +TRIPTYCA +TRIPTYCAS +TRIPTYCH +TRIPTYCHS +TRIPWIRE +TRIPWIRES +TRIQUETROUS +TRIRADIATE +TRIREME +TRIREMES +TRISACCHARIDE +TRISACCHARIDES +TRISCELE +TRISCELES +TRISECT +TRISECTED +TRISECTING +TRISECTION +TRISECTIONS +TRISECTOR +TRISECTORS +TRISECTS +TRISEME +TRISEMES +TRISEMIC +TRISHAW +TRISHAWS +TRISKELE +TRISKELES +TRISKELIA +TRISKELION +TRISKELIONS +TRISMIC +TRISMUS +TRISMUSES +TRISOCTAHEDRA +TRISOCTAHEDRON +TRISOCTAHEDRONS +TRISODIUM +TRISOME +TRISOMES +TRISOMIC +TRISOMICS +TRISOMIES +TRISOMY +TRISTATE +TRISTE +TRISTEARIN +TRISTEARINS +TRISTEZA +TRISTEZAS +TRISTFUL +TRISTFULLY +TRISTFULNESS +TRISTFULNESSES +TRISTICH +TRISTICHS +TRISTIMULUS +TRISUBSTITUTED +TRISULFIDE +TRISULFIDES +TRISYLLABIC +TRISYLLABLE +TRISYLLABLES +TRITE +TRITELY +TRITENESS +TRITENESSES +TRITER +TRITEST +TRITHEISM +TRITHEISMS +TRITHEIST +TRITHEISTIC +TRITHEISTICAL +TRITHEISTS +TRITHING +TRITHINGS +TRITIATED +TRITICALE +TRITICALES +TRITICUM +TRITICUMS +TRITIUM +TRITIUMS +TRITOMA +TRITOMAS +TRITON +TRITONE +TRITONES +TRITONS +TRITURABLE +TRITURATE +TRITURATED +TRITURATES +TRITURATING +TRITURATION +TRITURATIONS +TRITURATOR +TRITURATORS +TRIUMPH +TRIUMPHAL +TRIUMPHALISM +TRIUMPHALISMS +TRIUMPHALIST +TRIUMPHALISTS +TRIUMPHANT +TRIUMPHANTLY +TRIUMPHED +TRIUMPHING +TRIUMPHS +TRIUMVIR +TRIUMVIRATE +TRIUMVIRATES +TRIUMVIRI +TRIUMVIRS +TRIUNE +TRIUNES +TRIUNITIES +TRIUNITY +TRIVALENT +TRIVALVE +TRIVALVES +TRIVET +TRIVETS +TRIVIA +TRIVIAL +TRIVIALISE +TRIVIALISED +TRIVIALISES +TRIVIALISING +TRIVIALIST +TRIVIALISTS +TRIVIALITIES +TRIVIALITY +TRIVIALIZATION +TRIVIALIZATIONS +TRIVIALIZE +TRIVIALIZED +TRIVIALIZES +TRIVIALIZING +TRIVIALLY +TRIVIUM +TRIWEEKLIES +TRIWEEKLY +TROAK +TROAKED +TROAKING +TROAKS +TROCAR +TROCARS +TROCHAIC +TROCHAICS +TROCHAL +TROCHANTER +TROCHANTERAL +TROCHANTERIC +TROCHANTERS +TROCHAR +TROCHARS +TROCHE +TROCHEE +TROCHEES +TROCHES +TROCHIL +TROCHILI +TROCHILS +TROCHILUS +TROCHLEA +TROCHLEAE +TROCHLEAR +TROCHLEARS +TROCHLEAS +TROCHOID +TROCHOIDAL +TROCHOIDS +TROCHOPHORE +TROCHOPHORES +TROCK +TROCKED +TROCKING +TROCKS +TROD +TRODDEN +TRODE +TROFFER +TROFFERS +TROG +TROGLODYTE +TROGLODYTES +TROGLODYTIC +TROGON +TROGONS +TROGS +TROIKA +TROIKAS +TROILISM +TROILISMS +TROILITE +TROILITES +TROILUS +TROILUSES +TROIS +TROKE +TROKED +TROKES +TROKING +TROLAND +TROLANDS +TROLL +TROLLED +TROLLER +TROLLERS +TROLLEY +TROLLEYBUS +TROLLEYBUSES +TROLLEYBUSSES +TROLLEYED +TROLLEYING +TROLLEYS +TROLLIED +TROLLIES +TROLLING +TROLLINGS +TROLLOP +TROLLOPS +TROLLOPY +TROLLS +TROLLY +TROLLYING +TROMBONE +TROMBONES +TROMBONIST +TROMBONISTS +TROMMEL +TROMMELS +TROMP +TROMPE +TROMPED +TROMPES +TROMPING +TROMPS +TRONA +TRONAS +TRONE +TRONES +TROOP +TROOPED +TROOPER +TROOPERS +TROOPIAL +TROOPIALS +TROOPING +TROOPS +TROOPSHIP +TROOPSHIPS +TROOSTITE +TROOSTITES +TROOZ +TROP +TROPAEOLA +TROPAEOLUM +TROPAEOLUMS +TROPE +TROPEOLIN +TROPEOLINS +TROPES +TROPHALLAXES +TROPHALLAXIS +TROPHIC +TROPHICALLY +TROPHIED +TROPHIES +TROPHOBLAST +TROPHOBLASTIC +TROPHOBLASTS +TROPHOZOITE +TROPHOZOITES +TROPHY +TROPHYING +TROPIC +TROPICAL +TROPICALIZE +TROPICALIZED +TROPICALIZES +TROPICALIZING +TROPICALLY +TROPICALS +TROPICS +TROPIN +TROPINE +TROPINES +TROPINS +TROPISM +TROPISMS +TROPISTIC +TROPOCOLLAGEN +TROPOCOLLAGENS +TROPOLOGIC +TROPOLOGICAL +TROPOLOGICALLY +TROPOLOGIES +TROPOLOGY +TROPOMYOSIN +TROPOMYOSINS +TROPONIN +TROPONINS +TROPOPAUSE +TROPOPAUSES +TROPOSPHERE +TROPOSPHERES +TROPOSPHERIC +TROPOTAXES +TROPOTAXIS +TROT +TROTH +TROTHED +TROTHING +TROTHPLIGHT +TROTHPLIGHTED +TROTHPLIGHTING +TROTHPLIGHTS +TROTHS +TROTLINE +TROTLINES +TROTS +TROTTED +TROTTER +TROTTERS +TROTTING +TROTYL +TROTYLS +TROUBADOUR +TROUBADOURS +TROUBLE +TROUBLED +TROUBLEMAKER +TROUBLEMAKERS +TROUBLEMAKING +TROUBLEMAKINGS +TROUBLER +TROUBLERS +TROUBLES +TROUBLESHOOT +TROUBLESHOOTER +TROUBLESHOOTERS +TROUBLESHOOTING +TROUBLESHOOTS +TROUBLESHOT +TROUBLESOME +TROUBLESOMELY +TROUBLESOMENESS +TROUBLING +TROUBLOUS +TROUBLOUSLY +TROUBLOUSNESS +TROUBLOUSNESSES +TROUGH +TROUGHS +TROUNCE +TROUNCED +TROUNCER +TROUNCERS +TROUNCES +TROUNCING +TROUPE +TROUPED +TROUPER +TROUPERS +TROUPES +TROUPIAL +TROUPIALS +TROUPING +TROUSER +TROUSERS +TROUSSEAU +TROUSSEAUS +TROUSSEAUX +TROUT +TROUTIER +TROUTIEST +TROUTS +TROUTY +TROUVERE +TROUVERES +TROUVEUR +TROUVEURS +TROVE +TROVER +TROVERS +TROVES +TROW +TROWED +TROWEL +TROWELED +TROWELER +TROWELERS +TROWELING +TROWELLED +TROWELLER +TROWELLERS +TROWELLING +TROWELS +TROWING +TROWS +TROWSERS +TROWTH +TROWTHS +TROY +TROYS +TRUANCIES +TRUANCY +TRUANT +TRUANTED +TRUANTING +TRUANTLY +TRUANTRIES +TRUANTRY +TRUANTS +TRUCE +TRUCED +TRUCELESS +TRUCES +TRUCING +TRUCK +TRUCKABLE +TRUCKAGE +TRUCKAGES +TRUCKED +TRUCKER +TRUCKERS +TRUCKFUL +TRUCKFULS +TRUCKING +TRUCKINGS +TRUCKLE +TRUCKLED +TRUCKLER +TRUCKLERS +TRUCKLES +TRUCKLINE +TRUCKLINES +TRUCKLING +TRUCKLOAD +TRUCKLOADS +TRUCKMAN +TRUCKMASTER +TRUCKMASTERS +TRUCKMEN +TRUCKS +TRUCULENCE +TRUCULENCES +TRUCULENCIES +TRUCULENCY +TRUCULENT +TRUCULENTLY +TRUDGE +TRUDGED +TRUDGEN +TRUDGENS +TRUDGEON +TRUDGEONS +TRUDGER +TRUDGERS +TRUDGES +TRUDGING +TRUE +TRUEBLUE +TRUEBLUES +TRUEBORN +TRUEBRED +TRUED +TRUEHEARTED +TRUEHEARTEDNESS +TRUEING +TRUELOVE +TRUELOVES +TRUENESS +TRUENESSES +TRUEPENNIES +TRUEPENNY +TRUER +TRUES +TRUEST +TRUFFE +TRUFFES +TRUFFLE +TRUFFLED +TRUFFLES +TRUG +TRUGS +TRUING +TRUISM +TRUISMS +TRUISTIC +TRULL +TRULLS +TRULY +TRUMEAU +TRUMEAUX +TRUMP +TRUMPED +TRUMPERIES +TRUMPERY +TRUMPET +TRUMPETED +TRUMPETER +TRUMPETERS +TRUMPETING +TRUMPETLIKE +TRUMPETS +TRUMPING +TRUMPS +TRUNCATE +TRUNCATED +TRUNCATES +TRUNCATING +TRUNCATION +TRUNCATIONS +TRUNCHEON +TRUNCHEONED +TRUNCHEONING +TRUNCHEONS +TRUNDLE +TRUNDLED +TRUNDLER +TRUNDLERS +TRUNDLES +TRUNDLING +TRUNK +TRUNKED +TRUNKFISH +TRUNKFISHES +TRUNKFUL +TRUNKFULS +TRUNKS +TRUNNEL +TRUNNELS +TRUNNION +TRUNNIONS +TRUSS +TRUSSED +TRUSSER +TRUSSERS +TRUSSES +TRUSSING +TRUSSINGS +TRUST +TRUSTABILITIES +TRUSTABILITY +TRUSTABLE +TRUSTBUSTER +TRUSTBUSTERS +TRUSTED +TRUSTEE +TRUSTEED +TRUSTEEING +TRUSTEES +TRUSTEESHIP +TRUSTEESHIPS +TRUSTER +TRUSTERS +TRUSTFUL +TRUSTFULLY +TRUSTFULNESS +TRUSTFULNESSES +TRUSTIER +TRUSTIES +TRUSTIEST +TRUSTILY +TRUSTINESS +TRUSTINESSES +TRUSTING +TRUSTINGLY +TRUSTINGNESS +TRUSTINGNESSES +TRUSTLESS +TRUSTOR +TRUSTORS +TRUSTS +TRUSTWORTHILY +TRUSTWORTHINESS +TRUSTWORTHY +TRUSTY +TRUTH +TRUTHFUL +TRUTHFULLY +TRUTHFULNESS +TRUTHFULNESSES +TRUTHLESS +TRUTHS +TRY +TRYING +TRYINGLY +TRYMA +TRYMATA +TRYOUT +TRYOUTS +TRYPANOSOME +TRYPANOSOMES +TRYPANOSOMIASES +TRYPANOSOMIASIS +TRYPSIN +TRYPSINOGEN +TRYPSINOGENS +TRYPSINS +TRYPTAMINE +TRYPTAMINES +TRYPTIC +TRYPTOPHAN +TRYPTOPHANE +TRYPTOPHANES +TRYPTOPHANS +TRYSAIL +TRYSAILS +TRYST +TRYSTE +TRYSTED +TRYSTER +TRYSTERS +TRYSTES +TRYSTING +TRYSTS +TRYWORKS +TSADDIK +TSADDIKIM +TSADE +TSADES +TSADI +TSADIS +TSAR +TSARDOM +TSARDOMS +TSAREVNA +TSAREVNAS +TSARINA +TSARINAS +TSARISM +TSARISMS +TSARIST +TSARISTS +TSARITZA +TSARITZAS +TSARS +TSATSKE +TSATSKES +TSETSE +TSETSES +TSIMMES +TSK +TSKED +TSKING +TSKS +TSKTSK +TSKTSKED +TSKTSKING +TSKTSKS +TSOORIS +TSORES +TSORIS +TSORRISS +TSOURIS +TSUBA +TSUNAMI +TSUNAMIC +TSUNAMIS +TSURIS +TSUTSUGAMUSHI +TSUTSUGAMUSHIS +TUATARA +TUATARAS +TUATERA +TUATERAS +TUB +TUBA +TUBAE +TUBAIST +TUBAISTS +TUBAL +TUBAS +TUBATE +TUBBABLE +TUBBED +TUBBER +TUBBERS +TUBBIER +TUBBIEST +TUBBINESS +TUBBINESSES +TUBBING +TUBBY +TUBE +TUBED +TUBELESS +TUBELIKE +TUBENOSE +TUBENOSES +TUBER +TUBERCLE +TUBERCLES +TUBERCULAR +TUBERCULARS +TUBERCULATE +TUBERCULATED +TUBERCULIN +TUBERCULINS +TUBERCULOID +TUBERCULOSES +TUBERCULOSIS +TUBERCULOUS +TUBEROID +TUBEROSE +TUBEROSES +TUBEROSITIES +TUBEROSITY +TUBEROUS +TUBERS +TUBES +TUBEWORK +TUBEWORKS +TUBEWORM +TUBEWORMS +TUBFUL +TUBFULS +TUBIFEX +TUBIFEXES +TUBIFICID +TUBIFICIDS +TUBIFORM +TUBING +TUBINGS +TUBIST +TUBISTS +TUBLIKE +TUBOCURARINE +TUBOCURARINES +TUBS +TUBULAR +TUBULARLY +TUBULATE +TUBULATED +TUBULATES +TUBULATING +TUBULATOR +TUBULATORS +TUBULE +TUBULES +TUBULIN +TUBULINS +TUBULOSE +TUBULOUS +TUBULURE +TUBULURES +TUCHUN +TUCHUNS +TUCK +TUCKAHOE +TUCKAHOES +TUCKED +TUCKER +TUCKERED +TUCKERING +TUCKERS +TUCKET +TUCKETS +TUCKING +TUCKS +TUCKSHOP +TUCKSHOPS +TUFA +TUFACEOUS +TUFAS +TUFF +TUFFACEOUS +TUFFET +TUFFETS +TUFFS +TUFOLI +TUFT +TUFTED +TUFTER +TUFTERS +TUFTIER +TUFTIEST +TUFTILY +TUFTING +TUFTINGS +TUFTS +TUFTY +TUG +TUGBOAT +TUGBOATS +TUGGED +TUGGER +TUGGERS +TUGGING +TUGHRIK +TUGHRIKS +TUGLESS +TUGRIK +TUGRIKS +TUGS +TUI +TUILLE +TUILLES +TUIS +TUITION +TUITIONAL +TUITIONS +TULADI +TULADIS +TULAREMIA +TULAREMIAS +TULAREMIC +TULE +TULES +TULIP +TULIPLIKE +TULIPS +TULIPWOOD +TULIPWOODS +TULLE +TULLES +TULLIBEE +TULLIBEES +TUMBLE +TUMBLEBUG +TUMBLEBUGS +TUMBLED +TUMBLEDOWN +TUMBLER +TUMBLERFUL +TUMBLERFULS +TUMBLERS +TUMBLERSFUL +TUMBLES +TUMBLESET +TUMBLESETS +TUMBLEWEED +TUMBLEWEEDS +TUMBLING +TUMBLINGS +TUMBREL +TUMBRELS +TUMBRIL +TUMBRILS +TUMEFACTION +TUMEFACTIONS +TUMEFIED +TUMEFIES +TUMEFY +TUMEFYING +TUMESCE +TUMESCED +TUMESCENCE +TUMESCENCES +TUMESCENT +TUMESCES +TUMESCING +TUMID +TUMIDITIES +TUMIDITY +TUMIDLY +TUMIDNESS +TUMIDNESSES +TUMMIES +TUMMLER +TUMMLERS +TUMMY +TUMOR +TUMORAL +TUMORIGENESES +TUMORIGENESIS +TUMORIGENIC +TUMORIGENICITY +TUMORLIKE +TUMOROUS +TUMORS +TUMOUR +TUMOURS +TUMP +TUMPED +TUMPING +TUMPLINE +TUMPLINES +TUMPS +TUMULAR +TUMULI +TUMULOSE +TUMULOUS +TUMULT +TUMULTS +TUMULTUARY +TUMULTUOUS +TUMULTUOUSLY +TUMULTUOUSNESS +TUMULUS +TUMULUSES +TUN +TUNA +TUNABILITIES +TUNABILITY +TUNABLE +TUNABLENESS +TUNABLENESSES +TUNABLY +TUNAS +TUNDISH +TUNDISHES +TUNDRA +TUNDRAS +TUNE +TUNEABLE +TUNEABLY +TUNED +TUNEFUL +TUNEFULLY +TUNEFULNESS +TUNEFULNESSES +TUNELESS +TUNELESSLY +TUNER +TUNERS +TUNES +TUNESMITH +TUNESMITHS +TUNEUP +TUNEUPS +TUNG +TUNGS +TUNGSTATE +TUNGSTATES +TUNGSTEN +TUNGSTENS +TUNGSTIC +TUNGSTITE +TUNGSTITES +TUNIC +TUNICA +TUNICAE +TUNICATE +TUNICATED +TUNICATES +TUNICLE +TUNICLES +TUNICS +TUNING +TUNNAGE +TUNNAGES +TUNNED +TUNNEL +TUNNELED +TUNNELER +TUNNELERS +TUNNELING +TUNNELINGS +TUNNELLED +TUNNELLER +TUNNELLERS +TUNNELLIKE +TUNNELLING +TUNNELS +TUNNIES +TUNNING +TUNNY +TUNS +TUP +TUPELO +TUPELOS +TUPIK +TUPIKS +TUPPED +TUPPENCE +TUPPENCES +TUPPENNY +TUPPING +TUPS +TUQUE +TUQUES +TURACO +TURACOS +TURACOU +TURACOUS +TURBAN +TURBANED +TURBANNED +TURBANS +TURBARIES +TURBARY +TURBELLARIAN +TURBELLARIANS +TURBETH +TURBETHS +TURBID +TURBIDIMETER +TURBIDIMETERS +TURBIDIMETRIC +TURBIDIMETRIES +TURBIDIMETRY +TURBIDITE +TURBIDITES +TURBIDITIES +TURBIDITY +TURBIDLY +TURBIDNESS +TURBIDNESSES +TURBINAL +TURBINALS +TURBINATE +TURBINATED +TURBINATES +TURBINE +TURBINES +TURBIT +TURBITH +TURBITHS +TURBITS +TURBO +TURBOCAR +TURBOCARS +TURBOCHARGED +TURBOCHARGER +TURBOCHARGERS +TURBOELECTRIC +TURBOFAN +TURBOFANS +TURBOGENERATOR +TURBOGENERATORS +TURBOJET +TURBOJETS +TURBOMACHINERY +TURBOPROP +TURBOPROPS +TURBOS +TURBOSHAFT +TURBOSHAFTS +TURBOT +TURBOTS +TURBULENCE +TURBULENCES +TURBULENCIES +TURBULENCY +TURBULENT +TURBULENTLY +TURD +TURDINE +TURDS +TUREEN +TUREENS +TURF +TURFED +TURFGRASS +TURFGRASSES +TURFIER +TURFIEST +TURFING +TURFLESS +TURFLIKE +TURFMAN +TURFMEN +TURFS +TURFSKI +TURFSKIING +TURFSKIINGS +TURFSKIS +TURFY +TURGENCIES +TURGENCY +TURGENT +TURGESCENCE +TURGESCENCES +TURGESCENT +TURGID +TURGIDITIES +TURGIDITY +TURGIDLY +TURGIDNESS +TURGIDNESSES +TURGITE +TURGITES +TURGOR +TURGORS +TURION +TURIONS +TURISTA +TURISTAS +TURK +TURKEY +TURKEYS +TURKOIS +TURKOISES +TURKS +TURMERIC +TURMERICS +TURMOIL +TURMOILED +TURMOILING +TURMOILS +TURN +TURNABLE +TURNABOUT +TURNABOUTS +TURNAROUND +TURNAROUNDS +TURNBUCKLE +TURNBUCKLES +TURNCOAT +TURNCOATS +TURNDOWN +TURNDOWNS +TURNED +TURNER +TURNERIES +TURNERS +TURNERY +TURNHALL +TURNHALLS +TURNING +TURNINGS +TURNIP +TURNIPS +TURNKEY +TURNKEYS +TURNOFF +TURNOFFS +TURNON +TURNONS +TURNOUT +TURNOUTS +TURNOVER +TURNOVERS +TURNPIKE +TURNPIKES +TURNS +TURNSOLE +TURNSOLES +TURNSPIT +TURNSPITS +TURNSTILE +TURNSTILES +TURNSTONE +TURNSTONES +TURNTABLE +TURNTABLES +TURNUP +TURNUPS +TURNVEREIN +TURNVEREINS +TUROPHILE +TUROPHILES +TURPENTINE +TURPENTINED +TURPENTINES +TURPENTINING +TURPETH +TURPETHS +TURPITUDE +TURPITUDES +TURPS +TURQUOIS +TURQUOISE +TURQUOISES +TURRET +TURRETED +TURRETS +TURRICAL +TURTLE +TURTLEBACK +TURTLEBACKS +TURTLED +TURTLEDOVE +TURTLEDOVES +TURTLEHEAD +TURTLEHEADS +TURTLENECK +TURTLENECKED +TURTLENECKS +TURTLER +TURTLERS +TURTLES +TURTLING +TURTLINGS +TURVES +TUSCHE +TUSCHES +TUSH +TUSHED +TUSHERIES +TUSHERY +TUSHES +TUSHIE +TUSHIES +TUSHING +TUSHY +TUSK +TUSKED +TUSKER +TUSKERS +TUSKING +TUSKLESS +TUSKLIKE +TUSKS +TUSSAH +TUSSAHS +TUSSAL +TUSSAR +TUSSARS +TUSSEH +TUSSEHS +TUSSER +TUSSERS +TUSSES +TUSSIS +TUSSISES +TUSSIVE +TUSSLE +TUSSLED +TUSSLES +TUSSLING +TUSSOCK +TUSSOCKED +TUSSOCKS +TUSSOCKY +TUSSOR +TUSSORE +TUSSORES +TUSSORS +TUSSUCK +TUSSUCKS +TUSSUR +TUSSURS +TUT +TUTEE +TUTEES +TUTELAGE +TUTELAGES +TUTELAR +TUTELARIES +TUTELARS +TUTELARY +TUTOR +TUTORAGE +TUTORAGES +TUTORED +TUTORESS +TUTORESSES +TUTORIAL +TUTORIALS +TUTORING +TUTORS +TUTORSHIP +TUTORSHIPS +TUTOYED +TUTOYER +TUTOYERED +TUTOYERING +TUTOYERS +TUTS +TUTTED +TUTTI +TUTTIES +TUTTING +TUTTIS +TUTTY +TUTU +TUTUED +TUTUS +TUX +TUXEDO +TUXEDOED +TUXEDOES +TUXEDOS +TUXES +TUYER +TUYERE +TUYERES +TUYERS +TWA +TWADDLE +TWADDLED +TWADDLER +TWADDLERS +TWADDLES +TWADDLING +TWAE +TWAES +TWAIN +TWAINS +TWANG +TWANGED +TWANGER +TWANGERS +TWANGIER +TWANGIEST +TWANGING +TWANGLE +TWANGLED +TWANGLER +TWANGLERS +TWANGLES +TWANGLING +TWANGS +TWANGY +TWANKIES +TWANKY +TWAS +TWASOME +TWASOMES +TWAT +TWATS +TWATTLE +TWATTLED +TWATTLES +TWATTLING +TWAYBLADE +TWAYBLADES +TWEAK +TWEAKED +TWEAKIER +TWEAKIEST +TWEAKING +TWEAKS +TWEAKY +TWEE +TWEED +TWEEDIER +TWEEDIEST +TWEEDINESS +TWEEDINESSES +TWEEDLE +TWEEDLED +TWEEDLES +TWEEDLING +TWEEDS +TWEEDY +TWEEN +TWEENER +TWEENERS +TWEENESS +TWEENESSES +TWEENIES +TWEENS +TWEENY +TWEET +TWEETED +TWEETER +TWEETERS +TWEETING +TWEETS +TWEEZE +TWEEZED +TWEEZER +TWEEZERS +TWEEZES +TWEEZING +TWELFTH +TWELFTHS +TWELVE +TWELVEMO +TWELVEMONTH +TWELVEMONTHS +TWELVEMOS +TWELVES +TWENTIES +TWENTIETH +TWENTIETHS +TWENTY +TWERP +TWERPS +TWIBIL +TWIBILL +TWIBILLS +TWIBILS +TWICE +TWIDDLE +TWIDDLED +TWIDDLER +TWIDDLERS +TWIDDLES +TWIDDLIER +TWIDDLIEST +TWIDDLING +TWIDDLY +TWIER +TWIERS +TWIG +TWIGGED +TWIGGEN +TWIGGIER +TWIGGIEST +TWIGGING +TWIGGY +TWIGLESS +TWIGLIKE +TWIGS +TWILIGHT +TWILIGHTS +TWILIT +TWILL +TWILLED +TWILLING +TWILLINGS +TWILLS +TWIN +TWINBERRIES +TWINBERRY +TWINBORN +TWINE +TWINED +TWINER +TWINERS +TWINES +TWINFLOWER +TWINFLOWERS +TWINGE +TWINGED +TWINGEING +TWINGES +TWINGING +TWINIER +TWINIEST +TWINIGHT +TWINING +TWINJET +TWINJETS +TWINKIE +TWINKIES +TWINKLE +TWINKLED +TWINKLER +TWINKLERS +TWINKLES +TWINKLING +TWINKLINGS +TWINKLY +TWINNED +TWINNING +TWINNINGS +TWINS +TWINSET +TWINSETS +TWINSHIP +TWINSHIPS +TWINY +TWIRL +TWIRLED +TWIRLER +TWIRLERS +TWIRLIER +TWIRLIEST +TWIRLING +TWIRLS +TWIRLY +TWIRP +TWIRPS +TWIST +TWISTABLE +TWISTED +TWISTER +TWISTERS +TWISTIER +TWISTIEST +TWISTING +TWISTINGS +TWISTS +TWISTY +TWIT +TWITCH +TWITCHED +TWITCHER +TWITCHERS +TWITCHES +TWITCHIER +TWITCHIEST +TWITCHILY +TWITCHING +TWITCHY +TWITS +TWITTED +TWITTER +TWITTERED +TWITTERER +TWITTERERS +TWITTERING +TWITTERS +TWITTERY +TWITTING +TWIXT +TWO +TWOFER +TWOFERS +TWOFOLD +TWOFOLDS +TWOONIE +TWOONIES +TWOPENCE +TWOPENCES +TWOPENNY +TWOS +TWOSOME +TWOSOMES +TWYER +TWYERS +TYCOON +TYCOONS +TYE +TYEE +TYEES +TYER +TYERS +TYES +TYIN +TYING +TYIYN +TYKE +TYKES +TYLOSIN +TYLOSINS +TYMBAL +TYMBALS +TYMPAN +TYMPANA +TYMPANAL +TYMPANI +TYMPANIC +TYMPANIES +TYMPANIST +TYMPANISTS +TYMPANITES +TYMPANITESES +TYMPANITIC +TYMPANO +TYMPANS +TYMPANUM +TYMPANUMS +TYMPANY +TYNE +TYNED +TYNES +TYNING +TYPABLE +TYPAL +TYPE +TYPEABLE +TYPEBAR +TYPEBARS +TYPECASE +TYPECASES +TYPECAST +TYPECASTING +TYPECASTS +TYPED +TYPEFACE +TYPEFACES +TYPEFOUNDER +TYPEFOUNDERS +TYPEFOUNDING +TYPEFOUNDINGS +TYPES +TYPESCRIPT +TYPESCRIPTS +TYPESET +TYPESETS +TYPESETTER +TYPESETTERS +TYPESETTING +TYPESETTINGS +TYPESTYLE +TYPESTYLES +TYPEWRITE +TYPEWRITER +TYPEWRITERS +TYPEWRITES +TYPEWRITING +TYPEWRITINGS +TYPEWRITTEN +TYPEWROTE +TYPEY +TYPHLITIC +TYPHLITIS +TYPHLITISES +TYPHLOSOLE +TYPHLOSOLES +TYPHOID +TYPHOIDAL +TYPHOIDS +TYPHON +TYPHONIC +TYPHONS +TYPHOON +TYPHOONS +TYPHOSE +TYPHOUS +TYPHUS +TYPHUSES +TYPIC +TYPICAL +TYPICALITIES +TYPICALITY +TYPICALLY +TYPICALNESS +TYPICALNESSES +TYPIER +TYPIEST +TYPIFICATION +TYPIFICATIONS +TYPIFIED +TYPIFIER +TYPIFIERS +TYPIFIES +TYPIFY +TYPIFYING +TYPING +TYPIST +TYPISTS +TYPO +TYPOGRAPH +TYPOGRAPHED +TYPOGRAPHER +TYPOGRAPHERS +TYPOGRAPHIC +TYPOGRAPHICAL +TYPOGRAPHICALLY +TYPOGRAPHIES +TYPOGRAPHING +TYPOGRAPHS +TYPOGRAPHY +TYPOLOGIC +TYPOLOGICAL +TYPOLOGICALLY +TYPOLOGIES +TYPOLOGIST +TYPOLOGISTS +TYPOLOGY +TYPOS +TYPP +TYPPS +TYPY +TYRAMINE +TYRAMINES +TYRANNIC +TYRANNICAL +TYRANNICALLY +TYRANNICALNESS +TYRANNICIDE +TYRANNICIDES +TYRANNIES +TYRANNISE +TYRANNISED +TYRANNISES +TYRANNISING +TYRANNIZE +TYRANNIZED +TYRANNIZER +TYRANNIZERS +TYRANNIZES +TYRANNIZING +TYRANNOSAUR +TYRANNOSAURS +TYRANNOSAURUS +TYRANNOSAURUSES +TYRANNOUS +TYRANNOUSLY +TYRANNY +TYRANT +TYRANTS +TYRE +TYRED +TYRES +TYRING +TYRO +TYROCIDIN +TYROCIDINE +TYROCIDINES +TYROCIDINS +TYRONIC +TYROS +TYROSINASE +TYROSINASES +TYROSINE +TYROSINES +TYROTHRICIN +TYROTHRICINS +TYTHE +TYTHED +TYTHES +TYTHING +TZADDIK +TZADDIKIM +TZAR +TZARDOM +TZARDOMS +TZAREVNA +TZAREVNAS +TZARINA +TZARINAS +TZARISM +TZARISMS +TZARIST +TZARISTS +TZARITZA +TZARITZAS +TZARS +TZETZE +TZETZES +TZIGANE +TZIGANES +TZIMMES +TZITZIS +TZITZIT +TZITZITH +TZURIS +UAKARI +UAKARIS +UBIETIES +UBIETY +UBIQUE +UBIQUINONE +UBIQUINONES +UBIQUITIES +UBIQUITOUS +UBIQUITOUSLY +UBIQUITOUSNESS +UBIQUITY +UDDER +UDDERS +UDO +UDOMETER +UDOMETERS +UDOMETRIES +UDOMETRY +UDON +UDONS +UDOS +UFOLOGICAL +UFOLOGIES +UFOLOGIST +UFOLOGISTS +UFOLOGY +UGH +UGHS +UGLIER +UGLIES +UGLIEST +UGLIFICATION +UGLIFICATIONS +UGLIFIED +UGLIFIER +UGLIFIERS +UGLIFIES +UGLIFY +UGLIFYING +UGLILY +UGLINESS +UGLINESSES +UGLY +UGSOME +UH +UHLAN +UHLANS +UINTAHITE +UINTAHITES +UINTAITE +UINTAITES +UITLANDER +UITLANDERS +UKASE +UKASES +UKE +UKELELE +UKELELES +UKES +UKULELE +UKULELES +ULAMA +ULAMAS +ULAN +ULANS +ULCER +ULCERATE +ULCERATED +ULCERATES +ULCERATING +ULCERATION +ULCERATIONS +ULCERATIVE +ULCERED +ULCERING +ULCEROGENIC +ULCEROUS +ULCERS +ULEMA +ULEMAS +ULEXITE +ULEXITES +ULLAGE +ULLAGED +ULLAGES +ULNA +ULNAD +ULNAE +ULNAR +ULNAS +ULPAN +ULPANIM +ULSTER +ULSTERS +ULTERIOR +ULTERIORLY +ULTIMA +ULTIMACIES +ULTIMACY +ULTIMAS +ULTIMATA +ULTIMATE +ULTIMATED +ULTIMATELY +ULTIMATENESS +ULTIMATENESSES +ULTIMATES +ULTIMATING +ULTIMATUM +ULTIMATUMS +ULTIMO +ULTIMOGENITURE +ULTIMOGENITURES +ULTRA +ULTRABASIC +ULTRABASICS +ULTRACAREFUL +ULTRACASUAL +ULTRACAUTIOUS +ULTRACENTRIFUGE +ULTRACHIC +ULTRACIVILIZED +ULTRACLEAN +ULTRACOLD +ULTRACOMMERCIAL +ULTRACOMPACT +ULTRACOMPETENT +ULTRACONVENIENT +ULTRACOOL +ULTRACRITICAL +ULTRADEMOCRATIC +ULTRADENSE +ULTRADISTANCE +ULTRADISTANT +ULTRADRY +ULTRAEFFICIENT +ULTRAENERGETIC +ULTRAEXCLUSIVE +ULTRAFAMILIAR +ULTRAFAST +ULTRAFASTIDIOUS +ULTRAFEMININE +ULTRAFICHE +ULTRAFICHES +ULTRAFILTRATE +ULTRAFILTRATES +ULTRAFILTRATION +ULTRAFINE +ULTRAGLAMOROUS +ULTRAHAZARDOUS +ULTRAHEAT +ULTRAHEATED +ULTRAHEATING +ULTRAHEATS +ULTRAHEAVY +ULTRAHIGH +ULTRAHIP +ULTRAHOT +ULTRAHUMAN +ULTRAISM +ULTRAISMS +ULTRAIST +ULTRAISTIC +ULTRAISTS +ULTRALEFT +ULTRALEFTISM +ULTRALEFTISMS +ULTRALEFTIST +ULTRALEFTISTS +ULTRALIBERAL +ULTRALIBERALISM +ULTRALIBERALS +ULTRALIGHT +ULTRALIGHTS +ULTRALOW +ULTRAMAFIC +ULTRAMARATHON +ULTRAMARATHONER +ULTRAMARATHONS +ULTRAMARINE +ULTRAMARINES +ULTRAMASCULINE +ULTRAMICRO +ULTRAMICROSCOPE +ULTRAMICROTOME +ULTRAMICROTOMES +ULTRAMICROTOMY +ULTRAMILITANT +ULTRAMILITANTS +ULTRAMINIATURE +ULTRAMODERN +ULTRAMODERNIST +ULTRAMODERNISTS +ULTRAMONTANE +ULTRAMONTANES +ULTRAMONTANISM +ULTRAMONTANISMS +ULTRAORTHODOX +ULTRAPATRIOTIC +ULTRAPHYSICAL +ULTRAPOSH +ULTRAPOWERFUL +ULTRAPRACTICAL +ULTRAPRECISE +ULTRAPRECISION +ULTRAPURE +ULTRAQUIET +ULTRARADICAL +ULTRARADICALS +ULTRARAPID +ULTRARARE +ULTRARAREFIED +ULTRARATIONAL +ULTRAREALISM +ULTRAREALISMS +ULTRAREALIST +ULTRAREALISTIC +ULTRAREALISTS +ULTRARED +ULTRAREDS +ULTRAREFINED +ULTRARELIABLE +ULTRARICH +ULTRARIGHT +ULTRARIGHTIST +ULTRARIGHTISTS +ULTRAROMANTIC +ULTRAROYALIST +ULTRAROYALISTS +ULTRAS +ULTRASAFE +ULTRASECRET +ULTRASENSITIVE +ULTRASERIOUS +ULTRASHARP +ULTRASHORT +ULTRASIMPLE +ULTRASLICK +ULTRASLOW +ULTRASMALL +ULTRASMART +ULTRASMOOTH +ULTRASOFT +ULTRASONIC +ULTRASONICALLY +ULTRASONICS +ULTRASONOGRAPHY +ULTRASOUND +ULTRASOUNDS +ULTRASTRUCTURAL +ULTRASTRUCTURE +ULTRASTRUCTURES +ULTRATHIN +ULTRATINY +ULTRAVACUA +ULTRAVACUUM +ULTRAVACUUMS +ULTRAVIOLENCE +ULTRAVIOLENCES +ULTRAVIOLENT +ULTRAVIOLET +ULTRAVIOLETS +ULTRAVIRILE +ULTRAVIRILITIES +ULTRAVIRILITY +ULTRAWIDE +ULU +ULULANT +ULULATE +ULULATED +ULULATES +ULULATING +ULULATION +ULULATIONS +ULUS +ULVA +ULVAS +UM +UMAMI +UMAMIS +UMANGITE +UMANGITES +UMBEL +UMBELED +UMBELLAR +UMBELLATE +UMBELLED +UMBELLET +UMBELLETS +UMBELLIFER +UMBELLIFEROUS +UMBELLIFERS +UMBELLULE +UMBELLULES +UMBELS +UMBER +UMBERED +UMBERING +UMBERS +UMBILICAL +UMBILICALS +UMBILICATE +UMBILICATED +UMBILICATION +UMBILICATIONS +UMBILICI +UMBILICUS +UMBILICUSES +UMBLES +UMBO +UMBONAL +UMBONATE +UMBONES +UMBONIC +UMBOS +UMBRA +UMBRAE +UMBRAGE +UMBRAGEOUS +UMBRAGEOUSLY +UMBRAGEOUSNESS +UMBRAGES +UMBRAL +UMBRAS +UMBRELLA +UMBRELLAED +UMBRELLAING +UMBRELLAS +UMBRETTE +UMBRETTES +UMIAC +UMIACK +UMIACKS +UMIACS +UMIAK +UMIAKS +UMIAQ +UMIAQS +UMLAUT +UMLAUTED +UMLAUTING +UMLAUTS +UMM +UMP +UMPED +UMPING +UMPIRAGE +UMPIRAGES +UMPIRE +UMPIRED +UMPIRES +UMPIRING +UMPS +UMPTEEN +UMPTEENTH +UMTEENTH +UN +UNABASHED +UNABASHEDLY +UNABATED +UNABATEDLY +UNABATING +UNABETTED +UNABIDING +UNABJURED +UNABLE +UNABORTED +UNABRADED +UNABRIDGED +UNABSORBED +UNABSORBENT +UNABUSED +UNABUSIVE +UNACADEMIC +UNACADEMICALLY +UNACCENTED +UNACCEPTABILITY +UNACCEPTABLE +UNACCEPTABLY +UNACCEPTED +UNACCLIMATED +UNACCLIMATIZED +UNACCOMMODATED +UNACCOMMODATING +UNACCOMPANIED +UNACCOUNTABLE +UNACCOUNTABLY +UNACCOUNTED +UNACCREDITED +UNACCRUED +UNACCULTURATED +UNACCUSTOMED +UNACCUSTOMEDLY +UNACERBIC +UNACHIEVED +UNACIDIC +UNACKNOWLEDGED +UNACQUAINTED +UNACTABLE +UNACTED +UNACTORISH +UNADAPTABLE +UNADAPTED +UNADDED +UNADDRESSED +UNADEPT +UNADEPTLY +UNADJUDICATED +UNADJUSTED +UNADMIRED +UNADMITTED +UNADOPTABLE +UNADOPTED +UNADORNED +UNADULT +UNADULTERATED +UNADULTERATEDLY +UNADVENTUROUS +UNADVERTISED +UNADVISED +UNADVISEDLY +UNAESTHETIC +UNAFFECTED +UNAFFECTEDLY +UNAFFECTEDNESS +UNAFFECTING +UNAFFECTIONATE +UNAFFILIATED +UNAFFLUENT +UNAFFORDABLE +UNAFRAID +UNAGED +UNAGEING +UNAGGRESSIVE +UNAGILE +UNAGING +UNAGREED +UNAI +UNAIDED +UNAIDEDLY +UNAIMED +UNAIRED +UNAIS +UNAKIN +UNAKITE +UNAKITES +UNALARMED +UNALERTED +UNALIENABLE +UNALIENATED +UNALIGNED +UNALIKE +UNALLAYED +UNALLEGED +UNALLEVIATED +UNALLIED +UNALLOCATED +UNALLOWED +UNALLOYED +UNALLURING +UNALTERABILITY +UNALTERABLE +UNALTERABLENESS +UNALTERABLY +UNALTERED +UNAMASSED +UNAMAZED +UNAMBIGUOUS +UNAMBIGUOUSLY +UNAMBITIOUS +UNAMBIVALENT +UNAMBIVALENTLY +UNAMENABLE +UNAMENDED +UNAMIABLE +UNAMORTIZED +UNAMPLIFIED +UNAMUSED +UNAMUSING +UNANALYZABLE +UNANALYZED +UNANCHOR +UNANCHORED +UNANCHORING +UNANCHORS +UNANELED +UNANESTHETIZED +UNANIMITIES +UNANIMITY +UNANIMOUS +UNANIMOUSLY +UNANNEXED +UNANNOTATED +UNANNOUNCED +UNANNOYED +UNANSWERABILITY +UNANSWERABLE +UNANSWERABLY +UNANSWERED +UNANTICIPATED +UNANTICIPATEDLY +UNAPOLOGETIC +UNAPOLOGIZING +UNAPPARENT +UNAPPEALABLE +UNAPPEALING +UNAPPEALINGLY +UNAPPEASABLE +UNAPPEASABLY +UNAPPEASED +UNAPPETIZING +UNAPPETIZINGLY +UNAPPLIED +UNAPPRECIATED +UNAPPRECIATION +UNAPPRECIATIONS +UNAPPRECIATIVE +UNAPPROACHABLE +UNAPPROACHABLY +UNAPPROPRIATED +UNAPPROVED +UNAPT +UNAPTLY +UNAPTNESS +UNAPTNESSES +UNARCHED +UNARGUABLE +UNARGUABLY +UNARGUED +UNARM +UNARMED +UNARMING +UNARMORED +UNARMS +UNAROUSED +UNARRAYED +UNARROGANT +UNARTFUL +UNARTICULATED +UNARTISTIC +UNARY +UNASHAMED +UNASHAMEDLY +UNASKED +UNASPIRATED +UNASSAILABILITY +UNASSAILABLE +UNASSAILABLY +UNASSAILED +UNASSAYED +UNASSEMBLED +UNASSERTIVE +UNASSERTIVELY +UNASSIGNED +UNASSIMILABLE +UNASSIMILATED +UNASSISTED +UNASSOCIATED +UNASSUAGEABLE +UNASSUAGED +UNASSUMING +UNASSUMINGNESS +UNASSURED +UNATHLETIC +UNATONED +UNATTACHED +UNATTAINABLE +UNATTENDED +UNATTENUATED +UNATTESTED +UNATTIRED +UNATTRACTIVE +UNATTRACTIVELY +UNATTRIBUTABLE +UNATTRIBUTED +UNATTUNED +UNAU +UNAUDITED +UNAUS +UNAUTHENTIC +UNAUTHORIZED +UNAUTOMATED +UNAVAILABILITY +UNAVAILABLE +UNAVAILING +UNAVAILINGLY +UNAVAILINGNESS +UNAVENGED +UNAVERAGE +UNAVERTED +UNAVOIDABLE +UNAVOIDABLY +UNAVOWED +UNAWAKE +UNAWAKED +UNAWAKENED +UNAWARDED +UNAWARE +UNAWARELY +UNAWARENESS +UNAWARENESSES +UNAWARES +UNAWED +UNAWESOME +UNAXED +UNBACKED +UNBAKED +UNBALANCE +UNBALANCED +UNBALANCES +UNBALANCING +UNBALE +UNBALED +UNBALES +UNBALING +UNBALLASTED +UNBAN +UNBANDAGE +UNBANDAGED +UNBANDAGES +UNBANDAGING +UNBANDED +UNBANNED +UNBANNING +UNBANS +UNBAPTIZED +UNBAR +UNBARBED +UNBARBERED +UNBARRED +UNBARRICADED +UNBARRING +UNBARS +UNBASED +UNBASTED +UNBATED +UNBATHED +UNBE +UNBEAR +UNBEARABLE +UNBEARABLY +UNBEARDED +UNBEARED +UNBEARING +UNBEARS +UNBEATABLE +UNBEATABLY +UNBEATEN +UNBEAUTIFUL +UNBEAUTIFULLY +UNBECOMING +UNBECOMINGLY +UNBECOMINGNESS +UNBEHOLDEN +UNBEING +UNBEKNOWN +UNBEKNOWNST +UNBELIEF +UNBELIEFS +UNBELIEVABLE +UNBELIEVABLY +UNBELIEVER +UNBELIEVERS +UNBELIEVING +UNBELIEVINGLY +UNBELLIGERENT +UNBELOVED +UNBELT +UNBELTED +UNBELTING +UNBELTS +UNBEMUSED +UNBEND +UNBENDABLE +UNBENDED +UNBENDING +UNBENDINGS +UNBENDS +UNBENIGN +UNBENT +UNBESEEMING +UNBIASED +UNBIASEDNESS +UNBIASEDNESSES +UNBIASSED +UNBIBLICAL +UNBID +UNBIDDEN +UNBIGOTED +UNBILLED +UNBIND +UNBINDING +UNBINDS +UNBITTED +UNBITTEN +UNBITTER +UNBLAMED +UNBLEACHED +UNBLEMISHED +UNBLENCHED +UNBLENDED +UNBLESSED +UNBLEST +UNBLINDED +UNBLINKING +UNBLINKINGLY +UNBLOCK +UNBLOCKED +UNBLOCKING +UNBLOCKS +UNBLOODED +UNBLOODY +UNBLURRED +UNBLUSHING +UNBLUSHINGLY +UNBOARDED +UNBOBBED +UNBODIED +UNBOILED +UNBOLT +UNBOLTED +UNBOLTING +UNBOLTS +UNBONDED +UNBONED +UNBONNET +UNBONNETED +UNBONNETING +UNBONNETS +UNBOOKISH +UNBOOTED +UNBORN +UNBOSOM +UNBOSOMED +UNBOSOMER +UNBOSOMERS +UNBOSOMING +UNBOSOMS +UNBOTTLE +UNBOTTLED +UNBOTTLES +UNBOTTLING +UNBOUGHT +UNBOUNCY +UNBOUND +UNBOUNDED +UNBOUNDEDNESS +UNBOUNDEDNESSES +UNBOWDLERIZED +UNBOWED +UNBOWING +UNBOX +UNBOXED +UNBOXES +UNBOXING +UNBRACE +UNBRACED +UNBRACES +UNBRACING +UNBRACKETED +UNBRAID +UNBRAIDED +UNBRAIDING +UNBRAIDS +UNBRAKE +UNBRAKED +UNBRAKES +UNBRAKING +UNBRANCHED +UNBRANDED +UNBREACHABLE +UNBREAKABLE +UNBREATHABLE +UNBRED +UNBREECH +UNBREECHED +UNBREECHES +UNBREECHING +UNBRIDGEABLE +UNBRIDGED +UNBRIDLE +UNBRIDLED +UNBRIDLES +UNBRIDLING +UNBRIEFED +UNBRIGHT +UNBRILLIANT +UNBROILED +UNBROKE +UNBROKEN +UNBROWNED +UNBRUISED +UNBRUSHED +UNBUCKLE +UNBUCKLED +UNBUCKLES +UNBUCKLING +UNBUDGEABLE +UNBUDGEABLY +UNBUDGETED +UNBUDGING +UNBUDGINGLY +UNBUFFERED +UNBUILD +UNBUILDABLE +UNBUILDING +UNBUILDS +UNBUILT +UNBULKY +UNBUNDLE +UNBUNDLED +UNBUNDLES +UNBUNDLING +UNBURDEN +UNBURDENED +UNBURDENING +UNBURDENS +UNBUREAUCRATIC +UNBURIED +UNBURNABLE +UNBURNED +UNBURNT +UNBUSINESSLIKE +UNBUSTED +UNBUSY +UNBUTTERED +UNBUTTON +UNBUTTONED +UNBUTTONING +UNBUTTONS +UNCAGE +UNCAGED +UNCAGES +UNCAGING +UNCAKE +UNCAKED +UNCAKES +UNCAKING +UNCALCIFIED +UNCALCINED +UNCALCULATED +UNCALCULATING +UNCALIBRATED +UNCALLED +UNCALLOUSED +UNCANCELED +UNCANDID +UNCANDIDLY +UNCANDLED +UNCANNED +UNCANNIER +UNCANNIEST +UNCANNILY +UNCANNINESS +UNCANNINESSES +UNCANNY +UNCANONICAL +UNCAP +UNCAPABLE +UNCAPITALIZED +UNCAPPED +UNCAPPING +UNCAPS +UNCAPTIONED +UNCAPTURABLE +UNCARDED +UNCARING +UNCARPETED +UNCARTED +UNCARVED +UNCASE +UNCASED +UNCASES +UNCASHED +UNCASING +UNCASKED +UNCAST +UNCASTRATED +UNCATALOGED +UNCATCHABLE +UNCATCHY +UNCATEGORIZABLE +UNCATERED +UNCAUGHT +UNCAUSED +UNCEASING +UNCEASINGLY +UNCEDED +UNCELEBRATED +UNCENSORED +UNCENSORIOUS +UNCENSURED +UNCEREMONIOUS +UNCEREMONIOUSLY +UNCERTAIN +UNCERTAINLY +UNCERTAINNESS +UNCERTAINNESSES +UNCERTAINTIES +UNCERTAINTY +UNCERTIFIED +UNCHAIN +UNCHAINED +UNCHAINING +UNCHAINS +UNCHAIR +UNCHAIRED +UNCHAIRING +UNCHAIRS +UNCHALLENGEABLE +UNCHALLENGED +UNCHALLENGING +UNCHANCY +UNCHANGEABILITY +UNCHANGEABLE +UNCHANGEABLY +UNCHANGED +UNCHANGING +UNCHANGINGLY +UNCHANGINGNESS +UNCHANNELED +UNCHAPERONED +UNCHARGE +UNCHARGED +UNCHARGES +UNCHARGING +UNCHARISMATIC +UNCHARITABLE +UNCHARITABLY +UNCHARMING +UNCHARRED +UNCHARTED +UNCHARTERED +UNCHARY +UNCHASTE +UNCHASTELY +UNCHASTENESS +UNCHASTENESSES +UNCHASTER +UNCHASTEST +UNCHASTITIES +UNCHASTITY +UNCHAUVINISTIC +UNCHECKABLE +UNCHECKED +UNCHEWABLE +UNCHEWED +UNCHIC +UNCHICLY +UNCHILDLIKE +UNCHILLED +UNCHIVALROUS +UNCHIVALROUSLY +UNCHLORINATED +UNCHOKE +UNCHOKED +UNCHOKES +UNCHOKING +UNCHOREOGRAPHED +UNCHOSEN +UNCHRISTENED +UNCHRISTIAN +UNCHRONICLED +UNCHRONOLOGICAL +UNCHURCH +UNCHURCHED +UNCHURCHES +UNCHURCHING +UNCHURCHLY +UNCI +UNCIA +UNCIAE +UNCIAL +UNCIALLY +UNCIALS +UNCIFORM +UNCIFORMS +UNCILIATED +UNCINAL +UNCINARIA +UNCINARIAS +UNCINARIASES +UNCINARIASIS +UNCINATE +UNCINEMATIC +UNCINI +UNCINUS +UNCIRCULATED +UNCIRCUMCISED +UNCIRCUMCISION +UNCIRCUMCISIONS +UNCIVIL +UNCIVILIZED +UNCIVILLY +UNCLAD +UNCLAIMED +UNCLAMP +UNCLAMPED +UNCLAMPING +UNCLAMPS +UNCLARIFIED +UNCLARITIES +UNCLARITY +UNCLASP +UNCLASPED +UNCLASPING +UNCLASPS +UNCLASSICAL +UNCLASSIFIABLE +UNCLASSIFIED +UNCLASSY +UNCLAWED +UNCLE +UNCLEAN +UNCLEANED +UNCLEANER +UNCLEANEST +UNCLEANLIER +UNCLEANLIEST +UNCLEANLINESS +UNCLEANLINESSES +UNCLEANLY +UNCLEANNESS +UNCLEANNESSES +UNCLEAR +UNCLEARED +UNCLEARER +UNCLEAREST +UNCLEARLY +UNCLEFT +UNCLENCH +UNCLENCHED +UNCLENCHES +UNCLENCHING +UNCLES +UNCLICHED +UNCLIMBABLE +UNCLIMBABLENESS +UNCLINCH +UNCLINCHED +UNCLINCHES +UNCLINCHING +UNCLIP +UNCLIPPED +UNCLIPPING +UNCLIPS +UNCLOAK +UNCLOAKED +UNCLOAKING +UNCLOAKS +UNCLOG +UNCLOGGED +UNCLOGGING +UNCLOGS +UNCLOSE +UNCLOSED +UNCLOSES +UNCLOSING +UNCLOTHE +UNCLOTHED +UNCLOTHES +UNCLOTHING +UNCLOUD +UNCLOUDED +UNCLOUDEDLY +UNCLOUDING +UNCLOUDS +UNCLOUDY +UNCLOYED +UNCLOYING +UNCLUBBABLE +UNCLUTTER +UNCLUTTERED +UNCLUTTERING +UNCLUTTERS +UNCO +UNCOALESCE +UNCOALESCED +UNCOALESCES +UNCOALESCING +UNCOATED +UNCOATING +UNCOATINGS +UNCOBBLED +UNCOCK +UNCOCKED +UNCOCKING +UNCOCKS +UNCODED +UNCODIFIED +UNCOERCED +UNCOERCIVE +UNCOERCIVELY +UNCOFFIN +UNCOFFINED +UNCOFFINING +UNCOFFINS +UNCOIL +UNCOILED +UNCOILING +UNCOILS +UNCOINED +UNCOLLECTED +UNCOLLECTIBLE +UNCOLLECTIBLES +UNCOLORED +UNCOMBATIVE +UNCOMBED +UNCOMBINED +UNCOMELY +UNCOMFORTABLE +UNCOMFORTABLY +UNCOMIC +UNCOMMERCIAL +UNCOMMITTED +UNCOMMON +UNCOMMONER +UNCOMMONEST +UNCOMMONLY +UNCOMMONNESS +UNCOMMONNESSES +UNCOMMUNICABLE +UNCOMMUNICATIVE +UNCOMPASSIONATE +UNCOMPELLING +UNCOMPENSATED +UNCOMPETITIVE +UNCOMPLACENT +UNCOMPLAINING +UNCOMPLAININGLY +UNCOMPLETED +UNCOMPLICATED +UNCOMPLIMENTARY +UNCOMPOUNDED +UNCOMPREHENDED +UNCOMPREHENDING +UNCOMPROMISABLE +UNCOMPROMISING +UNCOMPUTERIZED +UNCONCEALED +UNCONCEIVABLE +UNCONCERN +UNCONCERNED +UNCONCERNEDLY +UNCONCERNEDNESS +UNCONCERNS +UNCONDITIONAL +UNCONDITIONALLY +UNCONDITIONED +UNCONFESSED +UNCONFINED +UNCONFIRMED +UNCONFORMABLE +UNCONFORMABLY +UNCONFORMITIES +UNCONFORMITY +UNCONFOUNDED +UNCONFUSE +UNCONFUSED +UNCONFUSES +UNCONFUSING +UNCONGENIAL +UNCONGENIALITY +UNCONJUGATED +UNCONNECTED +UNCONQUERABLE +UNCONQUERABLY +UNCONQUERED +UNCONSCIONABLE +UNCONSCIONABLY +UNCONSCIOUS +UNCONSCIOUSES +UNCONSCIOUSLY +UNCONSCIOUSNESS +UNCONSECRATED +UNCONSIDERED +UNCONSOLIDATED +UNCONSTRAINED +UNCONSTRAINT +UNCONSTRAINTS +UNCONSTRICTED +UNCONSTRUCTED +UNCONSTRUCTIVE +UNCONSUMED +UNCONSUMMATED +UNCONTAINABLE +UNCONTAMINATED +UNCONTEMPLATED +UNCONTEMPORARY +UNCONTENTIOUS +UNCONTESTED +UNCONTRACTED +UNCONTRADICTED +UNCONTRIVED +UNCONTROLLABLE +UNCONTROLLABLY +UNCONTROLLED +UNCONTROVERSIAL +UNCONVENTIONAL +UNCONVERTED +UNCONVINCED +UNCONVINCING +UNCONVINCINGLY +UNCONVOYED +UNCOOKED +UNCOOL +UNCOOLED +UNCOOPERATIVE +UNCOORDINATED +UNCOPYRIGHTABLE +UNCORK +UNCORKED +UNCORKING +UNCORKS +UNCORRECTABLE +UNCORRECTED +UNCORRELATED +UNCORROBORATED +UNCORRUPT +UNCORSETED +UNCOS +UNCOUNTABLE +UNCOUNTED +UNCOUPLE +UNCOUPLED +UNCOUPLER +UNCOUPLERS +UNCOUPLES +UNCOUPLING +UNCOURAGEOUS +UNCOUTH +UNCOUTHLY +UNCOUTHNESS +UNCOUTHNESSES +UNCOVENANTED +UNCOVER +UNCOVERED +UNCOVERING +UNCOVERS +UNCOY +UNCRACKED +UNCRATE +UNCRATED +UNCRATES +UNCRATING +UNCRAZY +UNCREATE +UNCREATED +UNCREATES +UNCREATING +UNCREATIVE +UNCREDENTIALED +UNCREDITED +UNCREWED +UNCRIPPLED +UNCRITICAL +UNCRITICALLY +UNCROPPED +UNCROSS +UNCROSSABLE +UNCROSSED +UNCROSSES +UNCROSSING +UNCROWDED +UNCROWN +UNCROWNED +UNCROWNING +UNCROWNS +UNCRUMPLE +UNCRUMPLED +UNCRUMPLES +UNCRUMPLING +UNCRUSHABLE +UNCRUSHED +UNCRYSTALLIZED +UNCTION +UNCTIONS +UNCTUOUS +UNCTUOUSLY +UNCTUOUSNESS +UNCTUOUSNESSES +UNCUFF +UNCUFFED +UNCUFFING +UNCUFFS +UNCULTIVABLE +UNCULTIVATED +UNCULTURED +UNCURABLE +UNCURABLY +UNCURB +UNCURBED +UNCURBING +UNCURBS +UNCURED +UNCURIOUS +UNCURL +UNCURLED +UNCURLING +UNCURLS +UNCURRENT +UNCURSED +UNCURTAINED +UNCUS +UNCUSTOMARILY +UNCUSTOMARY +UNCUT +UNCUTE +UNCYNICAL +UNCYNICALLY +UNDAMAGED +UNDAMPED +UNDANCEABLE +UNDARING +UNDATABLE +UNDATED +UNDAUNTABLE +UNDAUNTED +UNDAUNTEDLY +UNDE +UNDEAD +UNDEBATABLE +UNDEBATABLY +UNDEBATED +UNDECADENT +UNDECAYED +UNDECEIVE +UNDECEIVED +UNDECEIVES +UNDECEIVING +UNDECIDABILITY +UNDECIDABLE +UNDECIDED +UNDECIDEDS +UNDECILLION +UNDECILLIONS +UNDECIPHERABLE +UNDECIPHERED +UNDECKED +UNDECLARED +UNDECOMPOSED +UNDECORATED +UNDEDICATED +UNDEE +UNDEFACED +UNDEFEATED +UNDEFENDED +UNDEFILED +UNDEFINABLE +UNDEFINED +UNDEFOLIATED +UNDEFORMED +UNDELEGATED +UNDELETED +UNDELIVERABLE +UNDELIVERED +UNDELUDED +UNDEMANDING +UNDEMOCRATIC +UNDEMONSTRATIVE +UNDENIABLE +UNDENIABLENESS +UNDENIABLY +UNDENIED +UNDENTED +UNDEPENDABLE +UNDER +UNDERACHIEVE +UNDERACHIEVED +UNDERACHIEVER +UNDERACHIEVERS +UNDERACHIEVES +UNDERACHIEVING +UNDERACT +UNDERACTED +UNDERACTING +UNDERACTIVE +UNDERACTIVITIES +UNDERACTIVITY +UNDERACTS +UNDERAGE +UNDERAGED +UNDERAGES +UNDERARM +UNDERARMS +UNDERATE +UNDERBAKE +UNDERBAKED +UNDERBAKES +UNDERBAKING +UNDERBELLIES +UNDERBELLY +UNDERBID +UNDERBIDDER +UNDERBIDDERS +UNDERBIDDING +UNDERBIDS +UNDERBITE +UNDERBITES +UNDERBODIES +UNDERBODY +UNDERBOSS +UNDERBOSSES +UNDERBOUGHT +UNDERBRED +UNDERBRIM +UNDERBRIMS +UNDERBRUSH +UNDERBRUSHES +UNDERBUD +UNDERBUDDED +UNDERBUDDING +UNDERBUDGETED +UNDERBUDS +UNDERBUY +UNDERBUYING +UNDERBUYS +UNDERCARD +UNDERCARDS +UNDERCARRIAGE +UNDERCARRIAGES +UNDERCHARGE +UNDERCHARGED +UNDERCHARGES +UNDERCHARGING +UNDERCLAD +UNDERCLASS +UNDERCLASSES +UNDERCLASSMAN +UNDERCLASSMEN +UNDERCLAY +UNDERCLAYS +UNDERCLOTHES +UNDERCLOTHING +UNDERCLOTHINGS +UNDERCOAT +UNDERCOATED +UNDERCOATING +UNDERCOATINGS +UNDERCOATS +UNDERCOOK +UNDERCOOKED +UNDERCOOKING +UNDERCOOKS +UNDERCOOL +UNDERCOOLED +UNDERCOOLING +UNDERCOOLS +UNDERCOUNT +UNDERCOUNTED +UNDERCOUNTING +UNDERCOUNTS +UNDERCOVER +UNDERCROFT +UNDERCROFTS +UNDERCURRENT +UNDERCURRENTS +UNDERCUT +UNDERCUTS +UNDERCUTTING +UNDERDEVELOPED +UNDERDID +UNDERDO +UNDERDOES +UNDERDOG +UNDERDOGS +UNDERDOING +UNDERDONE +UNDERDOSE +UNDERDOSED +UNDERDOSES +UNDERDOSING +UNDERDRAWERS +UNDEREAT +UNDEREATEN +UNDEREATING +UNDEREATS +UNDEREDUCATED +UNDEREMPHASES +UNDEREMPHASIS +UNDEREMPHASIZE +UNDEREMPHASIZED +UNDEREMPHASIZES +UNDEREMPLOYED +UNDEREMPLOYMENT +UNDERESTIMATE +UNDERESTIMATED +UNDERESTIMATES +UNDERESTIMATING +UNDERESTIMATION +UNDEREXPOSE +UNDEREXPOSED +UNDEREXPOSES +UNDEREXPOSING +UNDEREXPOSURE +UNDEREXPOSURES +UNDERFED +UNDERFEED +UNDERFEEDING +UNDERFEEDS +UNDERFINANCED +UNDERFLOW +UNDERFLOWS +UNDERFOOT +UNDERFUND +UNDERFUNDED +UNDERFUNDING +UNDERFUNDS +UNDERFUR +UNDERFURS +UNDERGARMENT +UNDERGARMENTS +UNDERGIRD +UNDERGIRDED +UNDERGIRDING +UNDERGIRDS +UNDERGIRT +UNDERGLAZE +UNDERGLAZES +UNDERGO +UNDERGOD +UNDERGODS +UNDERGOER +UNDERGOERS +UNDERGOES +UNDERGOING +UNDERGONE +UNDERGRAD +UNDERGRADS +UNDERGRADUATE +UNDERGRADUATES +UNDERGROUND +UNDERGROUNDER +UNDERGROUNDERS +UNDERGROUNDS +UNDERGROWTH +UNDERGROWTHS +UNDERHAIR +UNDERHAIRS +UNDERHAND +UNDERHANDED +UNDERHANDEDLY +UNDERHANDEDNESS +UNDERHANDS +UNDERHEAT +UNDERHEATED +UNDERHEATING +UNDERHEATS +UNDERHUNG +UNDERINFLATED +UNDERINFLATION +UNDERINFLATIONS +UNDERINSURED +UNDERINVESTMENT +UNDERIVED +UNDERJAW +UNDERJAWS +UNDERKILL +UNDERKILLS +UNDERLAID +UNDERLAIN +UNDERLAP +UNDERLAPPED +UNDERLAPPING +UNDERLAPS +UNDERLAY +UNDERLAYING +UNDERLAYMENT +UNDERLAYMENTS +UNDERLAYS +UNDERLET +UNDERLETS +UNDERLETTING +UNDERLIE +UNDERLIES +UNDERLINE +UNDERLINED +UNDERLINES +UNDERLING +UNDERLINGS +UNDERLINING +UNDERLIP +UNDERLIPS +UNDERLIT +UNDERLOAD +UNDERLOADED +UNDERLOADING +UNDERLOADS +UNDERLYING +UNDERLYINGLY +UNDERMANNED +UNDERMINE +UNDERMINED +UNDERMINES +UNDERMINING +UNDERMOST +UNDERNEATH +UNDERNOURISHED +UNDERNUTRITION +UNDERNUTRITIONS +UNDERPAID +UNDERPAINTING +UNDERPAINTINGS +UNDERPANTS +UNDERPART +UNDERPARTS +UNDERPASS +UNDERPASSES +UNDERPAY +UNDERPAYING +UNDERPAYMENT +UNDERPAYMENTS +UNDERPAYS +UNDERPIN +UNDERPINNED +UNDERPINNING +UNDERPINNINGS +UNDERPINS +UNDERPLAY +UNDERPLAYED +UNDERPLAYING +UNDERPLAYS +UNDERPLOT +UNDERPLOTS +UNDERPOPULATED +UNDERPOWERED +UNDERPREPARED +UNDERPRICE +UNDERPRICED +UNDERPRICES +UNDERPRICING +UNDERPRIVILEGED +UNDERPRODUCTION +UNDERPROOF +UNDERPROP +UNDERPROPPED +UNDERPROPPING +UNDERPROPS +UNDERPUBLICIZED +UNDERRAN +UNDERRATE +UNDERRATED +UNDERRATES +UNDERRATING +UNDERREACT +UNDERREACTED +UNDERREACTING +UNDERREACTS +UNDERREPORT +UNDERREPORTED +UNDERREPORTING +UNDERREPORTS +UNDERRIPE +UNDERRUN +UNDERRUNNING +UNDERRUNS +UNDERSATURATED +UNDERSCORE +UNDERSCORED +UNDERSCORES +UNDERSCORING +UNDERSEA +UNDERSEAS +UNDERSECRETARY +UNDERSELL +UNDERSELLING +UNDERSELLS +UNDERSERVED +UNDERSET +UNDERSETS +UNDERSEXED +UNDERSHIRT +UNDERSHIRTED +UNDERSHIRTS +UNDERSHOOT +UNDERSHOOTING +UNDERSHOOTS +UNDERSHORTS +UNDERSHOT +UNDERSHRUB +UNDERSHRUBS +UNDERSIDE +UNDERSIDES +UNDERSIGN +UNDERSIGNED +UNDERSIGNING +UNDERSIGNS +UNDERSIZE +UNDERSIZED +UNDERSKIRT +UNDERSKIRTS +UNDERSLUNG +UNDERSOIL +UNDERSOILS +UNDERSOLD +UNDERSONG +UNDERSONGS +UNDERSPIN +UNDERSPINS +UNDERSTAFFED +UNDERSTAFFING +UNDERSTAFFINGS +UNDERSTAND +UNDERSTANDABLE +UNDERSTANDABLY +UNDERSTANDING +UNDERSTANDINGLY +UNDERSTANDINGS +UNDERSTANDS +UNDERSTATE +UNDERSTATED +UNDERSTATEDLY +UNDERSTATEMENT +UNDERSTATEMENTS +UNDERSTATES +UNDERSTATING +UNDERSTEER +UNDERSTEERED +UNDERSTEERING +UNDERSTEERS +UNDERSTOOD +UNDERSTORIES +UNDERSTORY +UNDERSTRAPPER +UNDERSTRAPPERS +UNDERSTRENGTH +UNDERSTUDIED +UNDERSTUDIES +UNDERSTUDY +UNDERSTUDYING +UNDERSUPPLIES +UNDERSUPPLY +UNDERSURFACE +UNDERSURFACES +UNDERTAKE +UNDERTAKEN +UNDERTAKER +UNDERTAKERS +UNDERTAKES +UNDERTAKING +UNDERTAKINGS +UNDERTAX +UNDERTAXED +UNDERTAXES +UNDERTAXING +UNDERTENANT +UNDERTENANTS +UNDERTHRUST +UNDERTHRUSTING +UNDERTHRUSTS +UNDERTINT +UNDERTINTS +UNDERTONE +UNDERTONES +UNDERTOOK +UNDERTOW +UNDERTOWS +UNDERTRICK +UNDERTRICKS +UNDERUSE +UNDERUSED +UNDERUSES +UNDERUSING +UNDERUTILIZE +UNDERUTILIZED +UNDERUTILIZES +UNDERUTILIZING +UNDERVALUATION +UNDERVALUATIONS +UNDERVALUE +UNDERVALUED +UNDERVALUES +UNDERVALUING +UNDERVEST +UNDERVESTS +UNDERVOTE +UNDERVOTES +UNDERWATER +UNDERWAY +UNDERWEAR +UNDERWEIGHT +UNDERWEIGHTS +UNDERWENT +UNDERWHELM +UNDERWHELMED +UNDERWHELMING +UNDERWHELMS +UNDERWING +UNDERWINGS +UNDERWIRE +UNDERWIRES +UNDERWOOD +UNDERWOODS +UNDERWOOL +UNDERWOOLS +UNDERWORK +UNDERWORKED +UNDERWORKING +UNDERWORKS +UNDERWORLD +UNDERWORLDS +UNDERWRITE +UNDERWRITER +UNDERWRITERS +UNDERWRITES +UNDERWRITING +UNDERWRITTEN +UNDERWROTE +UNDESCENDED +UNDESCRIBABLE +UNDESERVED +UNDESERVING +UNDESIGNATED +UNDESIGNING +UNDESIRABILITY +UNDESIRABLE +UNDESIRABLENESS +UNDESIRABLES +UNDESIRABLY +UNDESIRED +UNDETECTABLE +UNDETECTED +UNDETERMINABLE +UNDETERMINED +UNDETERRED +UNDEVELOPED +UNDEVIATING +UNDEVIATINGLY +UNDEVOUT +UNDIAGNOSABLE +UNDIAGNOSED +UNDIALECTICAL +UNDID +UNDIDACTIC +UNDIES +UNDIGESTED +UNDIGESTIBLE +UNDIGNIFIED +UNDILUTED +UNDIMINISHED +UNDIMMED +UNDINE +UNDINES +UNDIPLOMATIC +UNDIRECTED +UNDISCHARGED +UNDISCIPLINED +UNDISCLOSED +UNDISCOURAGED +UNDISCOVERABLE +UNDISCOVERED +UNDISCUSSED +UNDISGUISED +UNDISGUISEDLY +UNDISMAYED +UNDISPUTABLE +UNDISPUTED +UNDISSOCIATED +UNDISSOLVED +UNDISTINGUISHED +UNDISTORTED +UNDISTRACTED +UNDISTRIBUTED +UNDISTURBED +UNDIVIDED +UNDO +UNDOABLE +UNDOCILE +UNDOCK +UNDOCKED +UNDOCKING +UNDOCKS +UNDOCTORED +UNDOCTRINAIRE +UNDOCUMENTED +UNDOER +UNDOERS +UNDOES +UNDOGMATIC +UNDOGMATICALLY +UNDOING +UNDOINGS +UNDOMESTIC +UNDOMESTICATED +UNDONE +UNDOTTED +UNDOUBLE +UNDOUBLED +UNDOUBLES +UNDOUBLING +UNDOUBTABLE +UNDOUBTED +UNDOUBTEDLY +UNDOUBTING +UNDRAINED +UNDRAMATIC +UNDRAMATICALLY +UNDRAMATIZED +UNDRAPE +UNDRAPED +UNDRAPES +UNDRAPING +UNDRAW +UNDRAWING +UNDRAWN +UNDRAWS +UNDREAMED +UNDREAMT +UNDRESS +UNDRESSED +UNDRESSES +UNDRESSING +UNDREST +UNDREW +UNDRIED +UNDRILLED +UNDRINKABLE +UNDRUNK +UNDUBBED +UNDUE +UNDULANCE +UNDULANCES +UNDULANT +UNDULAR +UNDULATE +UNDULATED +UNDULATES +UNDULATING +UNDULATION +UNDULATIONS +UNDULATOR +UNDULATORS +UNDULATORY +UNDULLED +UNDULY +UNDUPLICATED +UNDUTIFUL +UNDUTIFULLY +UNDUTIFULNESS +UNDUTIFULNESSES +UNDY +UNDYED +UNDYING +UNDYINGLY +UNDYNAMIC +UNEAGER +UNEAGERLY +UNEARMARKED +UNEARNED +UNEARTH +UNEARTHED +UNEARTHING +UNEARTHLIER +UNEARTHLIEST +UNEARTHLINESS +UNEARTHLINESSES +UNEARTHLY +UNEARTHS +UNEASE +UNEASES +UNEASIER +UNEASIEST +UNEASILY +UNEASINESS +UNEASINESSES +UNEASY +UNEATABLE +UNEATEN +UNECCENTRIC +UNECOLOGICAL +UNECONOMIC +UNECONOMICAL +UNEDIBLE +UNEDIFYING +UNEDITED +UNEDUCABLE +UNEDUCATED +UNEFFACED +UNELABORATE +UNELECTABLE +UNELECTED +UNELECTRIFIED +UNEMBARRASSED +UNEMBELLISHED +UNEMBITTERED +UNEMOTIONAL +UNEMOTIONALLY +UNEMPHATIC +UNEMPHATICALLY +UNEMPIRICAL +UNEMPLOYABILITY +UNEMPLOYABLE +UNEMPLOYABLES +UNEMPLOYED +UNEMPLOYEDS +UNEMPLOYMENT +UNEMPLOYMENTS +UNENCHANTED +UNENCLOSED +UNENCOURAGING +UNENCUMBERED +UNENDEARING +UNENDED +UNENDING +UNENDINGLY +UNENDOWED +UNENDURABLE +UNENDURABLENESS +UNENDURABLY +UNENFORCEABLE +UNENFORCED +UNENGAGED +UNENJOYED +UNENLARGED +UNENLIGHTENED +UNENLIGHTENING +UNENRICHED +UNENSURED +UNENTERED +UNENTERPRISING +UNENTHUSIASTIC +UNENVIABLE +UNENVIED +UNENVIOUS +UNEQUAL +UNEQUALED +UNEQUALLED +UNEQUALLY +UNEQUALS +UNEQUIVOCABLY +UNEQUIVOCAL +UNEQUIVOCALLY +UNERASED +UNEROTIC +UNERRING +UNERRINGLY +UNESCAPABLE +UNESSAYED +UNESSENTIAL +UNESTABLISHED +UNETHICAL +UNEVADED +UNEVALUATED +UNEVEN +UNEVENER +UNEVENEST +UNEVENLY +UNEVENNESS +UNEVENNESSES +UNEVENTFUL +UNEVENTFULLY +UNEVENTFULNESS +UNEVOLVED +UNEXALTED +UNEXAMINED +UNEXAMPLED +UNEXCELLED +UNEXCEPTIONABLE +UNEXCEPTIONABLY +UNEXCEPTIONAL +UNEXCITABLE +UNEXCITED +UNEXCITING +UNEXCUSED +UNEXERCISED +UNEXOTIC +UNEXPECTED +UNEXPECTEDLY +UNEXPECTEDNESS +UNEXPENDED +UNEXPERT +UNEXPIRED +UNEXPLAINABLE +UNEXPLAINED +UNEXPLODED +UNEXPLOITED +UNEXPLORED +UNEXPOSED +UNEXPRESSED +UNEXPRESSIVE +UNEXPURGATED +UNEXTRAORDINARY +UNFADED +UNFADING +UNFADINGLY +UNFAILING +UNFAILINGLY +UNFAIR +UNFAIRER +UNFAIREST +UNFAIRLY +UNFAIRNESS +UNFAIRNESSES +UNFAITH +UNFAITHFUL +UNFAITHFULLY +UNFAITHFULNESS +UNFAITHS +UNFAKED +UNFALLEN +UNFALSIFIABLE +UNFALTERING +UNFALTERINGLY +UNFAMILIAR +UNFAMILIARITIES +UNFAMILIARITY +UNFAMILIARLY +UNFAMOUS +UNFANCY +UNFASHIONABLE +UNFASHIONABLY +UNFASTEN +UNFASTENED +UNFASTENING +UNFASTENS +UNFASTIDIOUS +UNFATHERED +UNFATHOMABLE +UNFAVORABLE +UNFAVORABLENESS +UNFAVORABLY +UNFAVORED +UNFAVORITE +UNFAZED +UNFEARED +UNFEARFUL +UNFEARING +UNFEASIBLE +UNFED +UNFEELING +UNFEELINGLY +UNFEELINGNESS +UNFEELINGNESSES +UNFEIGNED +UNFEIGNEDLY +UNFELT +UNFELTED +UNFEMININE +UNFENCE +UNFENCED +UNFENCES +UNFENCING +UNFERMENTED +UNFERTILE +UNFERTILIZED +UNFETTER +UNFETTERED +UNFETTERING +UNFETTERS +UNFILIAL +UNFILIALLY +UNFILLED +UNFILMED +UNFILTERED +UNFINDABLE +UNFINISHED +UNFIRED +UNFISHED +UNFIT +UNFITLY +UNFITNESS +UNFITNESSES +UNFITS +UNFITTED +UNFITTING +UNFIX +UNFIXED +UNFIXES +UNFIXING +UNFIXT +UNFLAGGING +UNFLAGGINGLY +UNFLAMBOYANT +UNFLAPPABILITY +UNFLAPPABLE +UNFLAPPABLY +UNFLAPPED +UNFLASHY +UNFLATTERING +UNFLATTERINGLY +UNFLAWED +UNFLEDGED +UNFLEXED +UNFLINCHING +UNFLINCHINGLY +UNFLUTED +UNFLYABLE +UNFOCUSED +UNFOCUSSED +UNFOILED +UNFOLD +UNFOLDED +UNFOLDER +UNFOLDERS +UNFOLDING +UNFOLDMENT +UNFOLDMENTS +UNFOLDS +UNFOND +UNFORCED +UNFORESEEABLE +UNFORESEEN +UNFORESTED +UNFORGED +UNFORGETTABLE +UNFORGETTABLY +UNFORGIVABLE +UNFORGIVING +UNFORGIVINGNESS +UNFORGOT +UNFORKED +UNFORMED +UNFORMULATED +UNFORTHCOMING +UNFORTIFIED +UNFORTUNATE +UNFORTUNATELY +UNFORTUNATES +UNFOSSILIFEROUS +UNFOUGHT +UNFOUND +UNFOUNDED +UNFRAMED +UNFREE +UNFREED +UNFREEDOM +UNFREEDOMS +UNFREEING +UNFREES +UNFREEZE +UNFREEZES +UNFREEZING +UNFREQUENTED +UNFRIENDED +UNFRIENDLINESS +UNFRIENDLY +UNFRIVOLOUS +UNFROCK +UNFROCKED +UNFROCKING +UNFROCKS +UNFROZE +UNFROZEN +UNFRUITFUL +UNFRUITFULLY +UNFRUITFULNESS +UNFULFILLABLE +UNFULFILLED +UNFUNDED +UNFUNNY +UNFURL +UNFURLED +UNFURLING +UNFURLS +UNFURNISHED +UNFUSED +UNFUSSILY +UNFUSSY +UNGAINLIER +UNGAINLIEST +UNGAINLINESS +UNGAINLINESSES +UNGAINLY +UNGALLANT +UNGALLANTLY +UNGALLED +UNGARBED +UNGARNISHED +UNGATED +UNGAZING +UNGELDED +UNGENEROSITIES +UNGENEROSITY +UNGENEROUS +UNGENEROUSLY +UNGENIAL +UNGENTEEL +UNGENTLE +UNGENTLEMANLY +UNGENTLY +UNGENTRIFIED +UNGENUINE +UNGERMINATED +UNGIFTED +UNGIMMICKY +UNGIRD +UNGIRDED +UNGIRDING +UNGIRDS +UNGIRT +UNGIVING +UNGLAMORIZED +UNGLAMOROUS +UNGLAZED +UNGLOSSED +UNGLOVE +UNGLOVED +UNGLOVES +UNGLOVING +UNGLUE +UNGLUED +UNGLUES +UNGLUING +UNGODLIER +UNGODLIEST +UNGODLINESS +UNGODLINESSES +UNGODLY +UNGOT +UNGOTTEN +UNGOVERNABLE +UNGOWNED +UNGRACED +UNGRACEFUL +UNGRACEFULLY +UNGRACIOUS +UNGRACIOUSLY +UNGRACIOUSNESS +UNGRADED +UNGRAMMATICAL +UNGRASPABLE +UNGRATEFUL +UNGRATEFULLY +UNGRATEFULNESS +UNGREASED +UNGREEDY +UNGROOMED +UNGROUND +UNGROUPED +UNGRUDGING +UNGUAL +UNGUARD +UNGUARDED +UNGUARDEDLY +UNGUARDEDNESS +UNGUARDEDNESSES +UNGUARDING +UNGUARDS +UNGUENT +UNGUENTA +UNGUENTS +UNGUENTUM +UNGUES +UNGUESSABLE +UNGUIDED +UNGUINOUS +UNGUIS +UNGULA +UNGULAE +UNGULAR +UNGULATE +UNGULATES +UNHACKNEYED +UNHAILED +UNHAIR +UNHAIRED +UNHAIRER +UNHAIRERS +UNHAIRING +UNHAIRS +UNHALLOW +UNHALLOWED +UNHALLOWING +UNHALLOWS +UNHALVED +UNHAMPERED +UNHAND +UNHANDED +UNHANDIER +UNHANDIEST +UNHANDILY +UNHANDINESS +UNHANDINESSES +UNHANDING +UNHANDLED +UNHANDS +UNHANDSOME +UNHANDSOMELY +UNHANDY +UNHANG +UNHANGED +UNHANGING +UNHANGS +UNHAPPIER +UNHAPPIEST +UNHAPPILY +UNHAPPINESS +UNHAPPINESSES +UNHAPPY +UNHARMED +UNHARMFUL +UNHARNESS +UNHARNESSED +UNHARNESSES +UNHARNESSING +UNHARRIED +UNHARVESTED +UNHASTY +UNHAT +UNHATCHED +UNHATS +UNHATTED +UNHATTING +UNHEALED +UNHEALTHFUL +UNHEALTHIER +UNHEALTHIEST +UNHEALTHILY +UNHEALTHINESS +UNHEALTHINESSES +UNHEALTHY +UNHEARD +UNHEATED +UNHEDGED +UNHEEDED +UNHEEDFUL +UNHEEDING +UNHELM +UNHELMED +UNHELMING +UNHELMS +UNHELPED +UNHELPFUL +UNHELPFULLY +UNHERALDED +UNHEROIC +UNHESITATING +UNHESITATINGLY +UNHEWN +UNHINDERED +UNHINGE +UNHINGED +UNHINGES +UNHINGING +UNHIP +UNHIRABLE +UNHIRED +UNHISTORICAL +UNHITCH +UNHITCHED +UNHITCHES +UNHITCHING +UNHOLIER +UNHOLIEST +UNHOLILY +UNHOLINESS +UNHOLINESSES +UNHOLY +UNHOMOGENIZED +UNHONORED +UNHOOD +UNHOODED +UNHOODING +UNHOODS +UNHOOK +UNHOOKED +UNHOOKING +UNHOOKS +UNHOPED +UNHOPEFUL +UNHORSE +UNHORSED +UNHORSES +UNHORSING +UNHOSTILE +UNHOUSE +UNHOUSED +UNHOUSELED +UNHOUSES +UNHOUSING +UNHUMAN +UNHUMANLY +UNHUMBLED +UNHUMOROUS +UNHUNG +UNHURRIED +UNHURRIEDLY +UNHURT +UNHUSK +UNHUSKED +UNHUSKING +UNHUSKS +UNHYDROLYZED +UNHYGIENIC +UNHYPHENATED +UNHYSTERICAL +UNHYSTERICALLY +UNIALGAL +UNIAXIAL +UNIBODY +UNICAMERAL +UNICAMERALLY +UNICELLULAR +UNICOLOR +UNICORN +UNICORNS +UNICYCLE +UNICYCLED +UNICYCLES +UNICYCLING +UNICYCLIST +UNICYCLISTS +UNIDEAED +UNIDEAL +UNIDENTIFIABLE +UNIDENTIFIED +UNIDEOLOGICAL +UNIDIMENSIONAL +UNIDIOMATIC +UNIDIRECTIONAL +UNIFACE +UNIFACES +UNIFIABLE +UNIFIC +UNIFICATION +UNIFICATIONS +UNIFIED +UNIFIER +UNIFIERS +UNIFIES +UNIFILAR +UNIFOLIATE +UNIFOLIOLATE +UNIFORM +UNIFORMED +UNIFORMER +UNIFORMEST +UNIFORMING +UNIFORMITARIAN +UNIFORMITARIANS +UNIFORMITIES +UNIFORMITY +UNIFORMLY +UNIFORMNESS +UNIFORMNESSES +UNIFORMS +UNIFY +UNIFYING +UNIGNORABLE +UNIJUGATE +UNILATERAL +UNILATERALLY +UNILINEAL +UNILINEAR +UNILINGUAL +UNILLUMINATING +UNILLUSIONED +UNILOBED +UNILOCULAR +UNIMAGINABLE +UNIMAGINABLY +UNIMAGINATIVE +UNIMAGINATIVELY +UNIMBUED +UNIMMUNIZED +UNIMPAIRED +UNIMPASSIONED +UNIMPEACHABLE +UNIMPEACHABLY +UNIMPEDED +UNIMPORTANT +UNIMPOSING +UNIMPRESSED +UNIMPRESSIVE +UNIMPROVED +UNINCORPORATED +UNINDEXED +UNINDICTED +UNINFECTED +UNINFLATED +UNINFLECTED +UNINFLUENCED +UNINFORMATIVE +UNINFORMATIVELY +UNINFORMED +UNINGRATIATING +UNINHABITABLE +UNINHABITED +UNINHIBITED +UNINHIBITEDLY +UNINHIBITEDNESS +UNINITIATE +UNINITIATED +UNINITIATES +UNINJURED +UNINOCULATED +UNINSPECTED +UNINSPIRED +UNINSPIRING +UNINSTALL +UNINSTALLED +UNINSTALLING +UNINSTALLS +UNINSTRUCTED +UNINSTRUCTIVE +UNINSULATED +UNINSURABLE +UNINSURED +UNINSUREDS +UNINTEGRATED +UNINTELLECTUAL +UNINTELLIGENT +UNINTELLIGENTLY +UNINTELLIGIBLE +UNINTELLIGIBLY +UNINTENDED +UNINTENTIONAL +UNINTENTIONALLY +UNINTEREST +UNINTERESTED +UNINTERESTING +UNINTERESTS +UNINTERRUPTED +UNINTERRUPTEDLY +UNINTIMIDATED +UNINUCLEATE +UNINVENTIVE +UNINVITED +UNINVITING +UNINVOKED +UNINVOLVED +UNION +UNIONISATION +UNIONISATIONS +UNIONISE +UNIONISED +UNIONISES +UNIONISING +UNIONISM +UNIONISMS +UNIONIST +UNIONISTS +UNIONIZATION +UNIONIZATIONS +UNIONIZE +UNIONIZED +UNIONIZER +UNIONIZERS +UNIONIZES +UNIONIZING +UNIONS +UNIPARENTAL +UNIPARENTALLY +UNIPAROUS +UNIPLANAR +UNIPOD +UNIPODS +UNIPOLAR +UNIPOTENT +UNIQUE +UNIQUELY +UNIQUENESS +UNIQUENESSES +UNIQUER +UNIQUES +UNIQUEST +UNIRAMOUS +UNIRONED +UNIRONIC +UNIRONICALLY +UNIRRADIATED +UNIRRIGATED +UNISEX +UNISEXES +UNISEXUAL +UNISEXUALITIES +UNISEXUALITY +UNISIZE +UNISON +UNISONAL +UNISONANT +UNISONOUS +UNISONS +UNISSUED +UNIT +UNITAGE +UNITAGES +UNITARD +UNITARDS +UNITARIAN +UNITARIANISM +UNITARIANISMS +UNITARIANS +UNITARILY +UNITARY +UNITE +UNITED +UNITEDLY +UNITER +UNITERS +UNITES +UNITIES +UNITING +UNITIVE +UNITIVELY +UNITIZATION +UNITIZATIONS +UNITIZE +UNITIZED +UNITIZER +UNITIZERS +UNITIZES +UNITIZING +UNITRUST +UNITRUSTS +UNITS +UNITY +UNIVALENT +UNIVALENTS +UNIVALVE +UNIVALVED +UNIVALVES +UNIVARIATE +UNIVERSAL +UNIVERSALISM +UNIVERSALISMS +UNIVERSALIST +UNIVERSALISTIC +UNIVERSALISTS +UNIVERSALITIES +UNIVERSALITY +UNIVERSALIZE +UNIVERSALIZED +UNIVERSALIZES +UNIVERSALIZING +UNIVERSALLY +UNIVERSALNESS +UNIVERSALNESSES +UNIVERSALS +UNIVERSE +UNIVERSES +UNIVERSITIES +UNIVERSITY +UNIVOCAL +UNIVOCALLY +UNIVOCALS +UNJADED +UNJAM +UNJAMMED +UNJAMMING +UNJAMS +UNJOINED +UNJOINT +UNJOINTED +UNJOINTING +UNJOINTS +UNJOYFUL +UNJUDGED +UNJUST +UNJUSTIFIABLE +UNJUSTIFIABLY +UNJUSTIFIED +UNJUSTLY +UNJUSTNESS +UNJUSTNESSES +UNKEELED +UNKEMPT +UNKEND +UNKENNED +UNKENNEL +UNKENNELED +UNKENNELING +UNKENNELLED +UNKENNELLING +UNKENNELS +UNKENT +UNKEPT +UNKIND +UNKINDER +UNKINDEST +UNKINDLED +UNKINDLIER +UNKINDLIEST +UNKINDLINESS +UNKINDLINESSES +UNKINDLY +UNKINDNESS +UNKINDNESSES +UNKINGLY +UNKINK +UNKINKED +UNKINKING +UNKINKS +UNKISSED +UNKNIT +UNKNITS +UNKNITTED +UNKNITTING +UNKNOT +UNKNOTS +UNKNOTTED +UNKNOTTING +UNKNOWABILITIES +UNKNOWABILITY +UNKNOWABLE +UNKNOWING +UNKNOWINGLY +UNKNOWINGS +UNKNOWLEDGEABLE +UNKNOWN +UNKNOWNS +UNKOSHER +UNLABELED +UNLABORED +UNLACE +UNLACED +UNLACES +UNLACING +UNLADE +UNLADED +UNLADEN +UNLADES +UNLADING +UNLADYLIKE +UNLAID +UNLAMENTED +UNLASH +UNLASHED +UNLASHES +UNLASHING +UNLATCH +UNLATCHED +UNLATCHES +UNLATCHING +UNLAUNDERED +UNLAWFUL +UNLAWFULLY +UNLAWFULNESS +UNLAWFULNESSES +UNLAY +UNLAYING +UNLAYS +UNLEAD +UNLEADED +UNLEADEDS +UNLEADING +UNLEADS +UNLEARN +UNLEARNABLE +UNLEARNED +UNLEARNING +UNLEARNS +UNLEARNT +UNLEASED +UNLEASH +UNLEASHED +UNLEASHES +UNLEASHING +UNLEAVENED +UNLED +UNLESS +UNLET +UNLETHAL +UNLETTED +UNLETTERED +UNLEVEL +UNLEVELED +UNLEVELING +UNLEVELLED +UNLEVELLING +UNLEVELS +UNLEVIED +UNLIBERATED +UNLICENSED +UNLICKED +UNLIGHTED +UNLIKABLE +UNLIKE +UNLIKED +UNLIKELIER +UNLIKELIEST +UNLIKELIHOOD +UNLIKELIHOODS +UNLIKELINESS +UNLIKELINESSES +UNLIKELY +UNLIKENESS +UNLIKENESSES +UNLIMBER +UNLIMBERED +UNLIMBERING +UNLIMBERS +UNLIMITED +UNLIMITEDLY +UNLINED +UNLINK +UNLINKED +UNLINKING +UNLINKS +UNLISTED +UNLISTENABLE +UNLIT +UNLITERARY +UNLIVABLE +UNLIVE +UNLIVED +UNLIVELY +UNLIVES +UNLIVING +UNLOAD +UNLOADED +UNLOADER +UNLOADERS +UNLOADING +UNLOADS +UNLOBED +UNLOCALIZED +UNLOCATED +UNLOCK +UNLOCKED +UNLOCKING +UNLOCKS +UNLOOSE +UNLOOSED +UNLOOSEN +UNLOOSENED +UNLOOSENING +UNLOOSENS +UNLOOSES +UNLOOSING +UNLOVABLE +UNLOVED +UNLOVELIER +UNLOVELIEST +UNLOVELINESS +UNLOVELINESSES +UNLOVELY +UNLOVING +UNLUCKIER +UNLUCKIEST +UNLUCKILY +UNLUCKINESS +UNLUCKINESSES +UNLUCKY +UNLYRICAL +UNMACHO +UNMADE +UNMAGNIFIED +UNMAILED +UNMAKE +UNMAKER +UNMAKERS +UNMAKES +UNMAKING +UNMALICIOUS +UNMALICIOUSLY +UNMAN +UNMANAGEABLE +UNMANAGEABLY +UNMANAGED +UNMANFUL +UNMANIPULATED +UNMANLIER +UNMANLIEST +UNMANLINESS +UNMANLINESSES +UNMANLY +UNMANNED +UNMANNERED +UNMANNEREDLY +UNMANNERLINESS +UNMANNERLY +UNMANNING +UNMANNISH +UNMANS +UNMAPPED +UNMARKED +UNMARKETABLE +UNMARRED +UNMARRIED +UNMARRIEDS +UNMASCULINE +UNMASK +UNMASKED +UNMASKER +UNMASKERS +UNMASKING +UNMASKS +UNMATCHABLE +UNMATCHED +UNMATED +UNMATTED +UNMATURED +UNMEANING +UNMEANT +UNMEASURABLE +UNMEASURED +UNMECHANIZED +UNMEDIATED +UNMEDICATED +UNMEET +UNMEETLY +UNMELLOW +UNMELODIOUS +UNMELODIOUSNESS +UNMELTED +UNMEMORABLE +UNMEMORABLY +UNMENDED +UNMENTIONABLE +UNMENTIONABLES +UNMERCIFUL +UNMERCIFULLY +UNMERITED +UNMERRY +UNMESH +UNMESHED +UNMESHES +UNMESHING +UNMET +UNMETABOLIZED +UNMEW +UNMEWED +UNMEWING +UNMEWS +UNMILITARY +UNMILLED +UNMINDFUL +UNMINED +UNMINGLE +UNMINGLED +UNMINGLES +UNMINGLING +UNMISTAKABLE +UNMISTAKABLY +UNMITER +UNMITERED +UNMITERING +UNMITERS +UNMITIGATED +UNMITIGATEDLY +UNMITIGATEDNESS +UNMITRE +UNMITRED +UNMITRES +UNMITRING +UNMIX +UNMIXABLE +UNMIXED +UNMIXEDLY +UNMIXES +UNMIXING +UNMIXT +UNMODERNIZED +UNMODIFIED +UNMODISH +UNMOLD +UNMOLDED +UNMOLDING +UNMOLDS +UNMOLESTED +UNMOLTEN +UNMONITORED +UNMOOR +UNMOORED +UNMOORING +UNMOORS +UNMORAL +UNMORALITIES +UNMORALITY +UNMORALLY +UNMORTISE +UNMORTISED +UNMORTISES +UNMORTISING +UNMOTIVATED +UNMOUNTED +UNMOURNED +UNMOVABLE +UNMOVED +UNMOVING +UNMOWN +UNMUFFLE +UNMUFFLED +UNMUFFLES +UNMUFFLING +UNMUSICAL +UNMUZZLE +UNMUZZLED +UNMUZZLES +UNMUZZLING +UNMYELINATED +UNNAIL +UNNAILED +UNNAILING +UNNAILS +UNNAMABLE +UNNAMEABLE +UNNAMED +UNNATURAL +UNNATURALLY +UNNATURALNESS +UNNATURALNESSES +UNNECESSARILY +UNNECESSARY +UNNEEDED +UNNEEDFUL +UNNEGOTIABLE +UNNERVE +UNNERVED +UNNERVES +UNNERVING +UNNERVINGLY +UNNEUROTIC +UNNEWSWORTHY +UNNILHEXIUM +UNNILHEXIUMS +UNNILPENTIUM +UNNILPENTIUMS +UNNILQUADIUM +UNNILQUADIUMS +UNNOISY +UNNOTED +UNNOTICEABLE +UNNOTICED +UNNOURISHING +UNNUANCED +UNNUMBERED +UNOBJECTIONABLE +UNOBSERVABLE +UNOBSERVED +UNOBSTRUCTED +UNOBTAINABLE +UNOBTRUSIVE +UNOBTRUSIVELY +UNOBTRUSIVENESS +UNOCCUPIED +UNOFFERED +UNOFFICIAL +UNOFFICIALLY +UNOILED +UNOPEN +UNOPENABLE +UNOPENED +UNOPPOSED +UNORDERED +UNORDERLY +UNORGANIZED +UNORIGINAL +UNORNAMENTED +UNORNATE +UNORTHODOX +UNORTHODOXIES +UNORTHODOXLY +UNORTHODOXY +UNOSTENTATIOUS +UNOWNED +UNOXYGENATED +UNPACK +UNPACKED +UNPACKER +UNPACKERS +UNPACKING +UNPACKS +UNPADDED +UNPAGED +UNPAID +UNPAINFUL +UNPAINTED +UNPAIRED +UNPALATABILITY +UNPALATABLE +UNPARALLELED +UNPARASITIZED +UNPARDONABLE +UNPARLIAMENTARY +UNPARTED +UNPASSABLE +UNPASTEURIZED +UNPASTORAL +UNPATCHED +UNPATENTABLE +UNPATRIOTIC +UNPAVED +UNPAYING +UNPEDANTIC +UNPEELED +UNPEG +UNPEGGED +UNPEGGING +UNPEGS +UNPEN +UNPENNED +UNPENNING +UNPENS +UNPENT +UNPEOPLE +UNPEOPLED +UNPEOPLES +UNPEOPLING +UNPERCEIVED +UNPERCEPTIVE +UNPERFECT +UNPERFORMABLE +UNPERFORMED +UNPERSON +UNPERSONS +UNPERSUADED +UNPERSUASIVE +UNPERTURBED +UNPICK +UNPICKED +UNPICKING +UNPICKS +UNPICTURESQUE +UNPIERCED +UNPILE +UNPILED +UNPILES +UNPILING +UNPIN +UNPINNED +UNPINNING +UNPINS +UNPITIED +UNPITTED +UNPITYING +UNPLACED +UNPLAIT +UNPLAITED +UNPLAITING +UNPLAITS +UNPLANNED +UNPLANTED +UNPLAUSIBLE +UNPLAYABLE +UNPLAYED +UNPLEASANT +UNPLEASANTLY +UNPLEASANTNESS +UNPLEASED +UNPLEASING +UNPLEDGED +UNPLIABLE +UNPLIANT +UNPLOWED +UNPLUCKED +UNPLUG +UNPLUGGED +UNPLUGGING +UNPLUGS +UNPLUMBED +UNPOETIC +UNPOINTED +UNPOISED +UNPOLARIZED +UNPOLICED +UNPOLISHED +UNPOLITE +UNPOLITIC +UNPOLITICAL +UNPOLLED +UNPOLLUTED +UNPOPULAR +UNPOPULARITIES +UNPOPULARITY +UNPOSED +UNPOSTED +UNPOTTED +UNPRACTICAL +UNPRECEDENTED +UNPRECEDENTEDLY +UNPREDICTABLE +UNPREDICTABLES +UNPREDICTABLY +UNPREGNANT +UNPREJUDICED +UNPREMEDITATED +UNPREPARED +UNPREPAREDNESS +UNPREPOSSESSING +UNPRESSED +UNPRESSURED +UNPRESSURIZED +UNPRETENDING +UNPRETENTIOUS +UNPRETENTIOUSLY +UNPRETTY +UNPRICED +UNPRIMED +UNPRINCIPLED +UNPRINTABLE +UNPRINTED +UNPRIVILEGED +UNPRIZED +UNPROBED +UNPROBLEMATIC +UNPROCESSED +UNPRODUCED +UNPRODUCTIVE +UNPROFESSED +UNPROFESSIONAL +UNPROFESSIONALS +UNPROFITABLE +UNPROFITABLY +UNPROGRAMMABLE +UNPROGRAMMED +UNPROGRESSIVE +UNPROMISING +UNPROMISINGLY +UNPROMPTED +UNPRONOUNCEABLE +UNPRONOUNCED +UNPROPITIOUS +UNPROSPEROUS +UNPROTECTED +UNPROVABLE +UNPROVED +UNPROVEN +UNPROVOKED +UNPRUNED +UNPUBLICIZED +UNPUBLISHABLE +UNPUBLISHED +UNPUCKER +UNPUCKERED +UNPUCKERING +UNPUCKERS +UNPUNCTUAL +UNPUNCTUALITIES +UNPUNCTUALITY +UNPUNCTUATED +UNPUNISHED +UNPURE +UNPURELY +UNPURGED +UNPUZZLE +UNPUZZLED +UNPUZZLES +UNPUZZLING +UNQUAKING +UNQUALIFIED +UNQUALIFIEDLY +UNQUANTIFIABLE +UNQUELLED +UNQUENCHABLE +UNQUESTIONABLE +UNQUESTIONABLY +UNQUESTIONED +UNQUESTIONING +UNQUESTIONINGLY +UNQUIET +UNQUIETER +UNQUIETEST +UNQUIETLY +UNQUIETNESS +UNQUIETNESSES +UNQUIETS +UNQUOTE +UNQUOTED +UNQUOTES +UNQUOTING +UNRAISED +UNRAKED +UNRANKED +UNRATED +UNRAVAGED +UNRAVEL +UNRAVELED +UNRAVELING +UNRAVELLED +UNRAVELLING +UNRAVELS +UNRAVISHED +UNRAZED +UNREACHABLE +UNREACHED +UNREAD +UNREADABLE +UNREADIER +UNREADIEST +UNREADILY +UNREADINESS +UNREADINESSES +UNREADY +UNREAL +UNREALISTIC +UNREALISTICALLY +UNREALITIES +UNREALITY +UNREALIZABLE +UNREALIZED +UNREALLY +UNREASON +UNREASONABLE +UNREASONABLY +UNREASONED +UNREASONING +UNREASONINGLY +UNREASONS +UNREBUKED +UNRECEPTIVE +UNRECLAIMABLE +UNRECLAIMED +UNRECOGNIZABLE +UNRECOGNIZABLY +UNRECOGNIZED +UNRECONCILABLE +UNRECONCILED +UNRECONSTRUCTED +UNRECORDED +UNRECOVERABLE +UNRECOVERED +UNRECYCLABLE +UNREDEEMABLE +UNREDEEMED +UNREDRESSED +UNREEL +UNREELED +UNREELER +UNREELERS +UNREELING +UNREELS +UNREEVE +UNREEVED +UNREEVES +UNREEVING +UNREFINED +UNREFLECTIVE +UNREFORMED +UNREFRIGERATED +UNREGENERATE +UNREGENERATELY +UNREGISTERED +UNREGULATED +UNREHEARSED +UNREINFORCED +UNRELATED +UNRELAXED +UNRELENTING +UNRELENTINGLY +UNRELIABILITIES +UNRELIABILITY +UNRELIABLE +UNRELIEVED +UNRELIEVEDLY +UNRELUCTANT +UNREMARKABLE +UNREMARKABLY +UNREMARKED +UNREMEMBERED +UNREMINISCENT +UNREMITTING +UNREMITTINGLY +UNREMOVABLE +UNRENEWED +UNRENT +UNRENTED +UNREPAID +UNREPAIR +UNREPAIRS +UNREPEATABLE +UNREPENTANT +UNREPENTANTLY +UNREPORTED +UNREPRESENTED +UNREPRESSED +UNREQUITED +UNRESERVE +UNRESERVED +UNRESERVEDLY +UNRESERVEDNESS +UNRESERVES +UNRESISTANT +UNRESOLVABLE +UNRESOLVED +UNRESPECTABLE +UNRESPONSIVE +UNRESPONSIVELY +UNREST +UNRESTED +UNRESTFUL +UNRESTING +UNRESTORED +UNRESTRAINED +UNRESTRAINEDLY +UNRESTRAINT +UNRESTRAINTS +UNRESTRICTED +UNRESTS +UNRETIRE +UNRETIRED +UNRETIRES +UNRETIRING +UNRETOUCHED +UNRETURNABLE +UNREVEALED +UNREVIEWABLE +UNREVIEWED +UNREVISED +UNREVOKED +UNREVOLUTIONARY +UNREWARDED +UNREWARDING +UNRHETORICAL +UNRHYMED +UNRHYTHMIC +UNRIBBED +UNRIDABLE +UNRIDDLE +UNRIDDLED +UNRIDDLER +UNRIDDLERS +UNRIDDLES +UNRIDDLING +UNRIFLED +UNRIG +UNRIGGED +UNRIGGING +UNRIGHTEOUS +UNRIGHTEOUSLY +UNRIGHTEOUSNESS +UNRIGS +UNRIMED +UNRINSED +UNRIP +UNRIPE +UNRIPELY +UNRIPENED +UNRIPENESS +UNRIPENESSES +UNRIPER +UNRIPEST +UNRIPPED +UNRIPPING +UNRIPS +UNRISEN +UNRIVALED +UNRIVALLED +UNROASTED +UNROBE +UNROBED +UNROBES +UNROBING +UNROLL +UNROLLED +UNROLLING +UNROLLS +UNROMANTIC +UNROMANTICALLY +UNROMANTICIZED +UNROOF +UNROOFED +UNROOFING +UNROOFS +UNROOT +UNROOTED +UNROOTING +UNROOTS +UNROPED +UNROUGH +UNROUND +UNROUNDED +UNROUNDING +UNROUNDS +UNROVE +UNROVEN +UNRUFFLED +UNRULED +UNRULIER +UNRULIEST +UNRULINESS +UNRULINESSES +UNRULY +UNRUMPLED +UNRUSHED +UNRUSTED +UNS +UNSADDLE +UNSADDLED +UNSADDLES +UNSADDLING +UNSAFE +UNSAFELY +UNSAFETIES +UNSAFETY +UNSAID +UNSAINTLY +UNSALABLE +UNSALABLY +UNSALARIED +UNSALTED +UNSALVAGEABLE +UNSAMPLED +UNSANCTIONED +UNSANITARY +UNSATED +UNSATISFACTORY +UNSATISFIED +UNSATURATE +UNSATURATED +UNSATURATES +UNSAVED +UNSAVORY +UNSAVOURY +UNSAWED +UNSAWN +UNSAY +UNSAYABLE +UNSAYABLES +UNSAYING +UNSAYS +UNSCALABLE +UNSCALED +UNSCANNED +UNSCARRED +UNSCATHED +UNSCENTED +UNSCHEDULED +UNSCHOLARLY +UNSCHOOLED +UNSCIENTIFIC +UNSCRAMBLE +UNSCRAMBLED +UNSCRAMBLER +UNSCRAMBLERS +UNSCRAMBLES +UNSCRAMBLING +UNSCREENED +UNSCREW +UNSCREWED +UNSCREWING +UNSCREWS +UNSCRIPTED +UNSCRIPTURAL +UNSCRUPULOUS +UNSCRUPULOUSLY +UNSEAL +UNSEALED +UNSEALING +UNSEALS +UNSEAM +UNSEAMED +UNSEAMING +UNSEAMS +UNSEARCHABLE +UNSEARCHABLY +UNSEARED +UNSEASONABLE +UNSEASONABLY +UNSEASONED +UNSEAT +UNSEATED +UNSEATING +UNSEATS +UNSEAWORTHY +UNSECURED +UNSEEABLE +UNSEEDED +UNSEEING +UNSEEMLIER +UNSEEMLIEST +UNSEEMLINESS +UNSEEMLINESSES +UNSEEMLY +UNSEEN +UNSEGMENTED +UNSEGREGATED +UNSEIZED +UNSELECTED +UNSELECTIVE +UNSELECTIVELY +UNSELFISH +UNSELFISHLY +UNSELFISHNESS +UNSELFISHNESSES +UNSELL +UNSELLABLE +UNSELLING +UNSELLS +UNSENSATIONAL +UNSENSITIZED +UNSENT +UNSENTIMENTAL +UNSEPARATED +UNSERIOUS +UNSERIOUSNESS +UNSERIOUSNESSES +UNSERVED +UNSERVICEABLE +UNSET +UNSETS +UNSETTING +UNSETTLE +UNSETTLED +UNSETTLEDNESS +UNSETTLEDNESSES +UNSETTLEMENT +UNSETTLEMENTS +UNSETTLES +UNSETTLING +UNSETTLINGLY +UNSEW +UNSEWED +UNSEWING +UNSEWN +UNSEWS +UNSEX +UNSEXED +UNSEXES +UNSEXING +UNSEXUAL +UNSEXY +UNSHACKLE +UNSHACKLED +UNSHACKLES +UNSHACKLING +UNSHADED +UNSHAKABLE +UNSHAKABLY +UNSHAKEN +UNSHAMED +UNSHAPED +UNSHAPELY +UNSHAPEN +UNSHARED +UNSHARP +UNSHAVED +UNSHAVEN +UNSHEATHE +UNSHEATHED +UNSHEATHES +UNSHEATHING +UNSHED +UNSHELL +UNSHELLED +UNSHELLING +UNSHELLS +UNSHIFT +UNSHIFTED +UNSHIFTING +UNSHIFTS +UNSHIP +UNSHIPPED +UNSHIPPING +UNSHIPS +UNSHIRTED +UNSHOCKABLE +UNSHOD +UNSHORN +UNSHOWY +UNSHRUNK +UNSHUT +UNSICKER +UNSIFTED +UNSIGHT +UNSIGHTED +UNSIGHTING +UNSIGHTLIER +UNSIGHTLIEST +UNSIGHTLINESS +UNSIGHTLINESSES +UNSIGHTLY +UNSIGHTS +UNSIGNED +UNSILENT +UNSIMILAR +UNSINFUL +UNSINKABLE +UNSIZED +UNSKILFUL +UNSKILLED +UNSKILLFUL +UNSKILLFULLY +UNSKILLFULNESS +UNSLAKABLE +UNSLAKED +UNSLICED +UNSLICK +UNSLING +UNSLINGING +UNSLINGS +UNSLUNG +UNSMART +UNSMILING +UNSMOKED +UNSMOOTHED +UNSNAG +UNSNAGGED +UNSNAGGING +UNSNAGS +UNSNAP +UNSNAPPED +UNSNAPPING +UNSNAPS +UNSNARL +UNSNARLED +UNSNARLING +UNSNARLS +UNSOAKED +UNSOBER +UNSOBERLY +UNSOCIABILITIES +UNSOCIABILITY +UNSOCIABLE +UNSOCIABLENESS +UNSOCIABLY +UNSOCIAL +UNSOCIALLY +UNSOILED +UNSOLD +UNSOLDER +UNSOLDERED +UNSOLDERING +UNSOLDERS +UNSOLDIERLY +UNSOLICITED +UNSOLID +UNSOLVABLE +UNSOLVED +UNSONCY +UNSONSIE +UNSONSY +UNSOOTHED +UNSOPHISTICATED +UNSORTED +UNSOUGHT +UNSOUND +UNSOUNDED +UNSOUNDER +UNSOUNDEST +UNSOUNDLY +UNSOUNDNESS +UNSOUNDNESSES +UNSOURCED +UNSOURED +UNSOWED +UNSOWN +UNSPARING +UNSPARINGLY +UNSPEAK +UNSPEAKABLE +UNSPEAKABLY +UNSPEAKING +UNSPEAKS +UNSPECIALIZED +UNSPECIFIABLE +UNSPECIFIC +UNSPECIFIED +UNSPECTACULAR +UNSPENT +UNSPHERE +UNSPHERED +UNSPHERES +UNSPHERING +UNSPILLED +UNSPILT +UNSPIRITUAL +UNSPLIT +UNSPOILED +UNSPOILT +UNSPOKE +UNSPOKEN +UNSPOOL +UNSPOOLED +UNSPOOLING +UNSPOOLS +UNSPORTSMANLIKE +UNSPOTTED +UNSPRAYED +UNSPRUNG +UNSPUN +UNSQUARED +UNSTABLE +UNSTABLENESS +UNSTABLENESSES +UNSTABLER +UNSTABLEST +UNSTABLY +UNSTACK +UNSTACKED +UNSTACKING +UNSTACKS +UNSTAINED +UNSTALKED +UNSTAMPED +UNSTANDARDIZED +UNSTARRED +UNSTARTLING +UNSTATE +UNSTATED +UNSTATES +UNSTATING +UNSTAYED +UNSTEADIED +UNSTEADIER +UNSTEADIES +UNSTEADIEST +UNSTEADILY +UNSTEADINESS +UNSTEADINESSES +UNSTEADY +UNSTEADYING +UNSTEEL +UNSTEELED +UNSTEELING +UNSTEELS +UNSTEMMED +UNSTEP +UNSTEPPED +UNSTEPPING +UNSTEPS +UNSTERILE +UNSTERILIZED +UNSTICK +UNSTICKING +UNSTICKS +UNSTINTED +UNSTINTING +UNSTINTINGLY +UNSTITCH +UNSTITCHED +UNSTITCHES +UNSTITCHING +UNSTOCKED +UNSTONED +UNSTOP +UNSTOPPABLE +UNSTOPPABLY +UNSTOPPED +UNSTOPPER +UNSTOPPERED +UNSTOPPERING +UNSTOPPERS +UNSTOPPING +UNSTOPS +UNSTRAINED +UNSTRAP +UNSTRAPPED +UNSTRAPPING +UNSTRAPS +UNSTRATIFIED +UNSTRESS +UNSTRESSED +UNSTRESSES +UNSTRING +UNSTRINGING +UNSTRINGS +UNSTRIPED +UNSTRUCTURED +UNSTRUNG +UNSTUCK +UNSTUDIED +UNSTUFFED +UNSTUFFY +UNSTUNG +UNSTYLISH +UNSUBDUED +UNSUBSIDIZED +UNSUBSTANTIAL +UNSUBSTANTIALLY +UNSUBSTANTIATED +UNSUBTLE +UNSUBTLY +UNSUCCESS +UNSUCCESSES +UNSUCCESSFUL +UNSUCCESSFULLY +UNSUITABILITIES +UNSUITABILITY +UNSUITABLE +UNSUITABLY +UNSUITED +UNSULLIED +UNSUNG +UNSUNK +UNSUPERVISED +UNSUPPORTABLE +UNSUPPORTED +UNSURE +UNSURELY +UNSURPASSABLE +UNSURPASSED +UNSURPRISED +UNSURPRISING +UNSURPRISINGLY +UNSUSCEPTIBLE +UNSUSPECTED +UNSUSPECTING +UNSUSPICIOUS +UNSUSTAINABLE +UNSWATHE +UNSWATHED +UNSWATHES +UNSWATHING +UNSWAYED +UNSWEAR +UNSWEARING +UNSWEARS +UNSWEETENED +UNSWEPT +UNSWERVING +UNSWOLLEN +UNSWORE +UNSWORN +UNSYMMETRICAL +UNSYMMETRICALLY +UNSYMPATHETIC +UNSYNCHRONIZED +UNSYSTEMATIC +UNSYSTEMATIZED +UNTACK +UNTACKED +UNTACKING +UNTACKS +UNTACTFUL +UNTAGGED +UNTAINTED +UNTAKEN +UNTALENTED +UNTAMABLE +UNTAME +UNTAMED +UNTANGLE +UNTANGLED +UNTANGLES +UNTANGLING +UNTANNED +UNTAPPED +UNTARNISHED +UNTASTED +UNTAUGHT +UNTAXED +UNTEACH +UNTEACHABLE +UNTEACHES +UNTEACHING +UNTECHNICAL +UNTEMPERED +UNTENABILITIES +UNTENABILITY +UNTENABLE +UNTENABLY +UNTENANTED +UNTENDED +UNTENTED +UNTENURED +UNTESTABLE +UNTESTED +UNTETHER +UNTETHERED +UNTETHERING +UNTETHERS +UNTHANKED +UNTHAWED +UNTHEORETICAL +UNTHINK +UNTHINKABILITY +UNTHINKABLE +UNTHINKABLY +UNTHINKING +UNTHINKINGLY +UNTHINKS +UNTHOUGHT +UNTHREAD +UNTHREADED +UNTHREADING +UNTHREADS +UNTHREATENING +UNTHRIFTY +UNTHRONE +UNTHRONED +UNTHRONES +UNTHRONING +UNTIDIED +UNTIDIER +UNTIDIES +UNTIDIEST +UNTIDILY +UNTIDINESS +UNTIDINESSES +UNTIDY +UNTIDYING +UNTIE +UNTIED +UNTIEING +UNTIES +UNTIL +UNTILLABLE +UNTILLED +UNTILTED +UNTIMED +UNTIMELIER +UNTIMELIEST +UNTIMELINESS +UNTIMELINESSES +UNTIMELY +UNTIMEOUS +UNTINGED +UNTIPPED +UNTIRED +UNTIRING +UNTIRINGLY +UNTITLED +UNTO +UNTOGETHER +UNTOLD +UNTORN +UNTOUCHABILITY +UNTOUCHABLE +UNTOUCHABLES +UNTOUCHED +UNTOWARD +UNTOWARDLY +UNTOWARDNESS +UNTOWARDNESSES +UNTRACEABLE +UNTRACED +UNTRACK +UNTRACKED +UNTRACKING +UNTRACKS +UNTRADITIONAL +UNTRADITIONALLY +UNTRAINED +UNTRAMMELED +UNTRANSFORMED +UNTRANSLATABLE +UNTRANSLATED +UNTRAPPED +UNTRAVELED +UNTRAVERSED +UNTREAD +UNTREADED +UNTREADING +UNTREADS +UNTREATED +UNTRENDY +UNTRIED +UNTRIM +UNTRIMMED +UNTRIMMING +UNTRIMS +UNTROD +UNTRODDEN +UNTROUBLED +UNTRUE +UNTRUER +UNTRUEST +UNTRULY +UNTRUSS +UNTRUSSED +UNTRUSSES +UNTRUSSING +UNTRUSTING +UNTRUSTWORTHY +UNTRUSTY +UNTRUTH +UNTRUTHFUL +UNTRUTHFULLY +UNTRUTHFULNESS +UNTRUTHS +UNTUCK +UNTUCKED +UNTUCKING +UNTUCKS +UNTUFTED +UNTUNABLE +UNTUNE +UNTUNED +UNTUNEFUL +UNTUNES +UNTUNING +UNTURNED +UNTUTORED +UNTWILLED +UNTWINE +UNTWINED +UNTWINES +UNTWINING +UNTWIST +UNTWISTED +UNTWISTING +UNTWISTS +UNTYING +UNTYPICAL +UNTYPICALLY +UNUNBIUM +UNUNBIUMS +UNUNITED +UNUNUNIUM +UNUNUNIUMS +UNURGED +UNUSABLE +UNUSED +UNUSUAL +UNUSUALLY +UNUSUALNESS +UNUSUALNESSES +UNUTILIZED +UNUTTERABLE +UNUTTERABLY +UNUTTERED +UNVACCINATED +UNVALUED +UNVARIED +UNVARNISHED +UNVARYING +UNVEIL +UNVEILED +UNVEILING +UNVEILINGS +UNVEILS +UNVEINED +UNVENTILATED +UNVERBALIZED +UNVERIFIABLE +UNVERSED +UNVESTED +UNVEXED +UNVEXT +UNVIABLE +UNVISITED +UNVOCAL +UNVOICE +UNVOICED +UNVOICES +UNVOICING +UNWAKENED +UNWALLED +UNWANING +UNWANTED +UNWARIER +UNWARIEST +UNWARILY +UNWARINESS +UNWARINESSES +UNWARLIKE +UNWARMED +UNWARNED +UNWARPED +UNWARRANTABLE +UNWARRANTABLY +UNWARRANTED +UNWARY +UNWASHED +UNWASHEDNESS +UNWASHEDNESSES +UNWASHEDS +UNWASTED +UNWATCHABLE +UNWATCHED +UNWATERED +UNWAVERING +UNWAVERINGLY +UNWAXED +UNWEANED +UNWEARABLE +UNWEARIED +UNWEARIEDLY +UNWEARY +UNWEATHERED +UNWEAVE +UNWEAVES +UNWEAVING +UNWED +UNWEDDED +UNWEEDED +UNWEETING +UNWEETINGLY +UNWEIGHED +UNWEIGHT +UNWEIGHTED +UNWEIGHTING +UNWEIGHTS +UNWELCOME +UNWELDED +UNWELL +UNWEPT +UNWET +UNWETTED +UNWHIPPED +UNWHITE +UNWHOLESOME +UNWHOLESOMELY +UNWIELDIER +UNWIELDIEST +UNWIELDILY +UNWIELDINESS +UNWIELDINESSES +UNWIELDY +UNWIFELY +UNWILLED +UNWILLING +UNWILLINGLY +UNWILLINGNESS +UNWILLINGNESSES +UNWIND +UNWINDER +UNWINDERS +UNWINDING +UNWINDS +UNWINKING +UNWINNABLE +UNWISDOM +UNWISDOMS +UNWISE +UNWISELY +UNWISER +UNWISEST +UNWISH +UNWISHED +UNWISHES +UNWISHING +UNWIT +UNWITS +UNWITTED +UNWITTING +UNWITTINGLY +UNWOMANLY +UNWON +UNWONTED +UNWONTEDLY +UNWONTEDNESS +UNWONTEDNESSES +UNWOODED +UNWOOED +UNWORKABILITIES +UNWORKABILITY +UNWORKABLE +UNWORKED +UNWORLDLIER +UNWORLDLIEST +UNWORLDLINESS +UNWORLDLINESSES +UNWORLDLY +UNWORN +UNWORRIED +UNWORTHIER +UNWORTHIES +UNWORTHIEST +UNWORTHILY +UNWORTHINESS +UNWORTHINESSES +UNWORTHY +UNWOUND +UNWOUNDED +UNWOVE +UNWOVEN +UNWRAP +UNWRAPPED +UNWRAPPING +UNWRAPS +UNWREATHE +UNWREATHED +UNWREATHES +UNWREATHING +UNWRINKLE +UNWRINKLED +UNWRINKLES +UNWRINKLING +UNWRITTEN +UNWROUGHT +UNWRUNG +UNYEANED +UNYIELDING +UNYIELDINGLY +UNYOKE +UNYOKED +UNYOKES +UNYOKING +UNYOUNG +UNZEALOUS +UNZIP +UNZIPPED +UNZIPPING +UNZIPS +UNZONED +UP +UPAS +UPASES +UPBEAR +UPBEARER +UPBEARERS +UPBEARING +UPBEARS +UPBEAT +UPBEATS +UPBIND +UPBINDING +UPBINDS +UPBOIL +UPBOILED +UPBOILING +UPBOILS +UPBORE +UPBORNE +UPBOUND +UPBOW +UPBOWS +UPBRAID +UPBRAIDED +UPBRAIDER +UPBRAIDERS +UPBRAIDING +UPBRAIDS +UPBRINGING +UPBRINGINGS +UPBUILD +UPBUILDER +UPBUILDERS +UPBUILDING +UPBUILDS +UPBUILT +UPBY +UPBYE +UPCAST +UPCASTING +UPCASTS +UPCHUCK +UPCHUCKED +UPCHUCKING +UPCHUCKS +UPCLIMB +UPCLIMBED +UPCLIMBING +UPCLIMBS +UPCOAST +UPCOIL +UPCOILED +UPCOILING +UPCOILS +UPCOMING +UPCOUNTRIES +UPCOUNTRY +UPCOURT +UPCURL +UPCURLED +UPCURLING +UPCURLS +UPCURVE +UPCURVED +UPCURVES +UPCURVING +UPDART +UPDARTED +UPDARTING +UPDARTS +UPDATE +UPDATED +UPDATER +UPDATERS +UPDATES +UPDATING +UPDIVE +UPDIVED +UPDIVES +UPDIVING +UPDO +UPDOS +UPDOVE +UPDRAFT +UPDRAFTS +UPDRIED +UPDRIES +UPDRY +UPDRYING +UPEND +UPENDED +UPENDING +UPENDS +UPFIELD +UPFLING +UPFLINGING +UPFLINGS +UPFLOW +UPFLOWED +UPFLOWING +UPFLOWS +UPFLUNG +UPFOLD +UPFOLDED +UPFOLDING +UPFOLDS +UPFRONT +UPGATHER +UPGATHERED +UPGATHERING +UPGATHERS +UPGAZE +UPGAZED +UPGAZES +UPGAZING +UPGIRD +UPGIRDED +UPGIRDING +UPGIRDS +UPGIRT +UPGOING +UPGRADABILITIES +UPGRADABILITY +UPGRADABLE +UPGRADE +UPGRADEABILITY +UPGRADEABLE +UPGRADED +UPGRADES +UPGRADING +UPGREW +UPGROW +UPGROWING +UPGROWN +UPGROWS +UPGROWTH +UPGROWTHS +UPHEAP +UPHEAPED +UPHEAPING +UPHEAPS +UPHEAVAL +UPHEAVALS +UPHEAVE +UPHEAVED +UPHEAVER +UPHEAVERS +UPHEAVES +UPHEAVING +UPHELD +UPHILL +UPHILLS +UPHOARD +UPHOARDED +UPHOARDING +UPHOARDS +UPHOLD +UPHOLDER +UPHOLDERS +UPHOLDING +UPHOLDS +UPHOLSTER +UPHOLSTERED +UPHOLSTERER +UPHOLSTERERS +UPHOLSTERIES +UPHOLSTERING +UPHOLSTERS +UPHOLSTERY +UPHOVE +UPHROE +UPHROES +UPKEEP +UPKEEPS +UPLAND +UPLANDER +UPLANDERS +UPLANDS +UPLEAP +UPLEAPED +UPLEAPING +UPLEAPS +UPLEAPT +UPLIFT +UPLIFTED +UPLIFTER +UPLIFTERS +UPLIFTING +UPLIFTS +UPLIGHT +UPLIGHTED +UPLIGHTING +UPLIGHTS +UPLINK +UPLINKED +UPLINKING +UPLINKS +UPLIT +UPLOAD +UPLOADED +UPLOADING +UPLOADS +UPMANSHIP +UPMANSHIPS +UPMARKET +UPMOST +UPO +UPON +UPPED +UPPER +UPPERCASE +UPPERCASED +UPPERCASES +UPPERCASING +UPPERCLASSMAN +UPPERCLASSMEN +UPPERCUT +UPPERCUTS +UPPERCUTTING +UPPERMOST +UPPERPART +UPPERPARTS +UPPERS +UPPILE +UPPILED +UPPILES +UPPILING +UPPING +UPPINGS +UPPISH +UPPISHLY +UPPISHNESS +UPPISHNESSES +UPPITINESS +UPPITINESSES +UPPITY +UPPITYNESS +UPPITYNESSES +UPPROP +UPPROPPED +UPPROPPING +UPPROPS +UPRAISE +UPRAISED +UPRAISER +UPRAISERS +UPRAISES +UPRAISING +UPRATE +UPRATED +UPRATES +UPRATING +UPREACH +UPREACHED +UPREACHES +UPREACHING +UPREAR +UPREARED +UPREARING +UPREARS +UPRIGHT +UPRIGHTED +UPRIGHTING +UPRIGHTLY +UPRIGHTNESS +UPRIGHTNESSES +UPRIGHTS +UPRISE +UPRISEN +UPRISER +UPRISERS +UPRISES +UPRISING +UPRISINGS +UPRIVER +UPRIVERS +UPROAR +UPROARIOUS +UPROARIOUSLY +UPROARIOUSNESS +UPROARS +UPROOT +UPROOTAL +UPROOTALS +UPROOTED +UPROOTEDNESS +UPROOTEDNESSES +UPROOTER +UPROOTERS +UPROOTING +UPROOTS +UPROSE +UPROUSE +UPROUSED +UPROUSES +UPROUSING +UPRUSH +UPRUSHED +UPRUSHES +UPRUSHING +UPS +UPSADAISY +UPSCALE +UPSCALED +UPSCALES +UPSCALING +UPSEND +UPSENDING +UPSENDS +UPSENT +UPSET +UPSETS +UPSETTER +UPSETTERS +UPSETTING +UPSHIFT +UPSHIFTED +UPSHIFTING +UPSHIFTS +UPSHOOT +UPSHOOTING +UPSHOOTS +UPSHOT +UPSHOTS +UPSIDE +UPSIDES +UPSILON +UPSILONS +UPSIZE +UPSIZED +UPSIZES +UPSIZING +UPSLOPE +UPSOAR +UPSOARED +UPSOARING +UPSOARS +UPSPRANG +UPSPRING +UPSPRINGING +UPSPRINGS +UPSPRUNG +UPSTAGE +UPSTAGED +UPSTAGER +UPSTAGERS +UPSTAGES +UPSTAGING +UPSTAIR +UPSTAIRS +UPSTAND +UPSTANDING +UPSTANDINGNESS +UPSTANDS +UPSTARE +UPSTARED +UPSTARES +UPSTARING +UPSTART +UPSTARTED +UPSTARTING +UPSTARTS +UPSTATE +UPSTATER +UPSTATERS +UPSTATES +UPSTEP +UPSTEPPED +UPSTEPPING +UPSTEPS +UPSTIR +UPSTIRRED +UPSTIRRING +UPSTIRS +UPSTOOD +UPSTREAM +UPSTROKE +UPSTROKES +UPSURGE +UPSURGED +UPSURGES +UPSURGING +UPSWEEP +UPSWEEPING +UPSWEEPS +UPSWELL +UPSWELLED +UPSWELLING +UPSWELLS +UPSWEPT +UPSWING +UPSWINGING +UPSWINGS +UPSWOLLEN +UPSWUNG +UPTAKE +UPTAKES +UPTALK +UPTALKED +UPTALKING +UPTALKS +UPTEAR +UPTEARING +UPTEARS +UPTEMPO +UPTEMPOS +UPTHREW +UPTHROW +UPTHROWING +UPTHROWN +UPTHROWS +UPTHRUST +UPTHRUSTED +UPTHRUSTING +UPTHRUSTS +UPTICK +UPTICKS +UPTIGHT +UPTIGHTNESS +UPTIGHTNESSES +UPTILT +UPTILTED +UPTILTING +UPTILTS +UPTIME +UPTIMES +UPTORE +UPTORN +UPTOSS +UPTOSSED +UPTOSSES +UPTOSSING +UPTOWN +UPTOWNER +UPTOWNERS +UPTOWNS +UPTREND +UPTRENDS +UPTURN +UPTURNED +UPTURNING +UPTURNS +UPWAFT +UPWAFTED +UPWAFTING +UPWAFTS +UPWARD +UPWARDLY +UPWARDNESS +UPWARDNESSES +UPWARDS +UPWELL +UPWELLED +UPWELLING +UPWELLINGS +UPWELLS +UPWIND +UPWINDS +URACIL +URACILS +URAEI +URAEMIA +URAEMIAS +URAEMIC +URAEUS +URAEUSES +URALITE +URALITES +URALITIC +URANIA +URANIAS +URANIC +URANIDE +URANIDES +URANINITE +URANINITES +URANISM +URANISMS +URANITE +URANITES +URANITIC +URANIUM +URANIUMS +URANOGRAPHIES +URANOGRAPHY +URANOLOGIES +URANOLOGY +URANOUS +URANYL +URANYLIC +URANYLS +URARE +URARES +URARI +URARIS +URASE +URASES +URATE +URATES +URATIC +URB +URBAN +URBANE +URBANELY +URBANER +URBANEST +URBANISATION +URBANISATIONS +URBANISE +URBANISED +URBANISES +URBANISING +URBANISM +URBANISMS +URBANIST +URBANISTIC +URBANISTICALLY +URBANISTS +URBANITE +URBANITES +URBANITIES +URBANITY +URBANIZATION +URBANIZATIONS +URBANIZE +URBANIZED +URBANIZES +URBANIZING +URBANOLOGIES +URBANOLOGIST +URBANOLOGISTS +URBANOLOGY +URBIA +URBIAS +URBS +URCEOLATE +URCHIN +URCHINS +URD +URDS +UREA +UREAL +UREAS +UREASE +UREASES +UREDIA +UREDIAL +UREDINIA +UREDINIAL +UREDINIOSPORE +UREDINIOSPORES +UREDINIUM +UREDIOSPORE +UREDIOSPORES +UREDIUM +UREDO +UREDOS +UREDOSPORE +UREDOSPORES +UREIC +UREIDE +UREIDES +UREMIA +UREMIAS +UREMIC +UREOTELIC +UREOTELISM +UREOTELISMS +URETER +URETERAL +URETERIC +URETERS +URETHAN +URETHANE +URETHANES +URETHANS +URETHRA +URETHRAE +URETHRAL +URETHRAS +URETHRITIS +URETHRITISES +URETHROSCOPE +URETHROSCOPES +URETIC +URGE +URGED +URGENCIES +URGENCY +URGENT +URGENTLY +URGER +URGERS +URGES +URGING +URGINGLY +URIAL +URIALS +URIC +URICOSURIC +URICOTELIC +URICOTELISM +URICOTELISMS +URIDINE +URIDINES +URINAL +URINALS +URINALYSES +URINALYSIS +URINARIES +URINARY +URINATE +URINATED +URINATES +URINATING +URINATION +URINATIONS +URINATIVE +URINATOR +URINATORS +URINE +URINEMIA +URINEMIAS +URINEMIC +URINES +URINOGENITAL +URINOMETER +URINOMETERS +URINOSE +URINOUS +URN +URNLIKE +URNS +UROCHORD +UROCHORDATE +UROCHORDATES +UROCHORDS +UROCHROME +UROCHROMES +URODELE +URODELES +UROGENITAL +UROGENOUS +UROKINASE +UROKINASES +UROLITH +UROLITHIASES +UROLITHIASIS +UROLITHIC +UROLITHS +UROLOGIC +UROLOGICAL +UROLOGIES +UROLOGIST +UROLOGISTS +UROLOGY +UROPOD +UROPODAL +UROPODOUS +UROPODS +UROPYGIA +UROPYGIAL +UROPYGIUM +UROPYGIUMS +UROSCOPIC +UROSCOPIES +UROSCOPY +UROSTYLE +UROSTYLES +URP +URPED +URPING +URPS +URSA +URSAE +URSID +URSIDS +URSIFORM +URSINE +URTEXT +URTEXTS +URTICANT +URTICANTS +URTICARIA +URTICARIAL +URTICARIAS +URTICATE +URTICATED +URTICATES +URTICATING +URTICATION +URTICATIONS +URUS +URUSES +URUSHIOL +URUSHIOLS +US +USABILITIES +USABILITY +USABLE +USABLENESS +USABLENESSES +USABLY +USAGE +USAGES +USANCE +USANCES +USAUNCE +USAUNCES +USE +USEABLE +USEABLY +USED +USEFUL +USEFULLY +USEFULNESS +USEFULNESSES +USELESS +USELESSLY +USELESSNESS +USELESSNESSES +USER +USERNAME +USERNAMES +USERS +USES +USHER +USHERED +USHERETTE +USHERETTES +USHERING +USHERS +USING +USNEA +USNEAS +USQUABAE +USQUABAES +USQUE +USQUEBAE +USQUEBAES +USQUEBAUGH +USQUEBAUGHS +USQUES +USTULATE +USUAL +USUALLY +USUALNESS +USUALNESSES +USUALS +USUFRUCT +USUFRUCTS +USUFRUCTUARIES +USUFRUCTUARY +USURER +USURERS +USURIES +USURIOUS +USURIOUSLY +USURIOUSNESS +USURIOUSNESSES +USURP +USURPATION +USURPATIONS +USURPED +USURPER +USURPERS +USURPING +USURPS +USURY +UT +UTA +UTAS +UTE +UTENSIL +UTENSILS +UTERI +UTERINE +UTERUS +UTERUSES +UTES +UTILE +UTILIDOR +UTILIDORS +UTILISE +UTILISED +UTILISER +UTILISERS +UTILISES +UTILISING +UTILITARIAN +UTILITARIANISM +UTILITARIANISMS +UTILITARIANS +UTILITIES +UTILITY +UTILIZABLE +UTILIZATION +UTILIZATIONS +UTILIZE +UTILIZED +UTILIZER +UTILIZERS +UTILIZES +UTILIZING +UTMOST +UTMOSTS +UTOPIA +UTOPIAN +UTOPIANISM +UTOPIANISMS +UTOPIANS +UTOPIAS +UTOPISM +UTOPISMS +UTOPIST +UTOPISTIC +UTOPISTS +UTRICLE +UTRICLES +UTRICULAR +UTRICULI +UTRICULUS +UTS +UTTER +UTTERABLE +UTTERANCE +UTTERANCES +UTTERED +UTTERER +UTTERERS +UTTERING +UTTERLY +UTTERMOST +UTTERMOSTS +UTTERNESS +UTTERNESSES +UTTERS +UVAROVITE +UVAROVITES +UVEA +UVEAL +UVEAS +UVEITIC +UVEITIS +UVEITISES +UVEOUS +UVULA +UVULAE +UVULAR +UVULARLY +UVULARS +UVULAS +UVULITIS +UVULITISES +UXORIAL +UXORIALLY +UXORICIDE +UXORICIDES +UXORIOUS +UXORIOUSLY +UXORIOUSNESS +UXORIOUSNESSES +VAC +VACANCIES +VACANCY +VACANT +VACANTLY +VACANTNESS +VACANTNESSES +VACATABLE +VACATE +VACATED +VACATES +VACATING +VACATION +VACATIONED +VACATIONER +VACATIONERS +VACATIONING +VACATIONIST +VACATIONISTS +VACATIONLAND +VACATIONLANDS +VACATIONS +VACCINA +VACCINAL +VACCINAS +VACCINATE +VACCINATED +VACCINATES +VACCINATING +VACCINATION +VACCINATIONS +VACCINATOR +VACCINATORS +VACCINE +VACCINEE +VACCINEES +VACCINES +VACCINIA +VACCINIAL +VACCINIAS +VACILLANT +VACILLATE +VACILLATED +VACILLATES +VACILLATING +VACILLATINGLY +VACILLATION +VACILLATIONS +VACILLATOR +VACILLATORS +VACS +VACUA +VACUITIES +VACUITY +VACUOLAR +VACUOLATE +VACUOLATED +VACUOLATION +VACUOLATIONS +VACUOLE +VACUOLES +VACUOUS +VACUOUSLY +VACUOUSNESS +VACUOUSNESSES +VACUUM +VACUUMED +VACUUMING +VACUUMS +VADOSE +VAGABOND +VAGABONDAGE +VAGABONDAGES +VAGABONDED +VAGABONDING +VAGABONDISH +VAGABONDISM +VAGABONDISMS +VAGABONDS +VAGAL +VAGALLY +VAGARIES +VAGARIOUS +VAGARIOUSLY +VAGARY +VAGI +VAGILE +VAGILITIES +VAGILITY +VAGINA +VAGINAE +VAGINAL +VAGINALLY +VAGINAS +VAGINATE +VAGINATED +VAGINISMUS +VAGINISMUSES +VAGINITIS +VAGINITISES +VAGINOSES +VAGINOSIS +VAGOTOMIES +VAGOTOMY +VAGOTONIA +VAGOTONIAS +VAGOTONIC +VAGRANCIES +VAGRANCY +VAGRANT +VAGRANTLY +VAGRANTS +VAGROM +VAGUE +VAGUELY +VAGUENESS +VAGUENESSES +VAGUER +VAGUEST +VAGUS +VAHINE +VAHINES +VAIL +VAILED +VAILING +VAILS +VAIN +VAINER +VAINEST +VAINGLORIES +VAINGLORIOUS +VAINGLORIOUSLY +VAINGLORY +VAINLY +VAINNESS +VAINNESSES +VAIR +VAIRS +VAKEEL +VAKEELS +VAKIL +VAKILS +VALANCE +VALANCED +VALANCES +VALANCING +VALE +VALEDICTION +VALEDICTIONS +VALEDICTORIAN +VALEDICTORIANS +VALEDICTORIES +VALEDICTORY +VALENCE +VALENCES +VALENCIA +VALENCIAS +VALENCIES +VALENCY +VALENTINE +VALENTINES +VALERATE +VALERATES +VALERIAN +VALERIANS +VALERIC +VALES +VALET +VALETED +VALETING +VALETS +VALETUDINARIAN +VALETUDINARIANS +VALETUDINARIES +VALETUDINARY +VALGOID +VALGUS +VALGUSES +VALIANCE +VALIANCES +VALIANCIES +VALIANCY +VALIANT +VALIANTLY +VALIANTNESS +VALIANTNESSES +VALIANTS +VALID +VALIDATE +VALIDATED +VALIDATES +VALIDATING +VALIDATION +VALIDATIONS +VALIDITIES +VALIDITY +VALIDLY +VALIDNESS +VALIDNESSES +VALINE +VALINES +VALISE +VALISES +VALKYR +VALKYRIE +VALKYRIES +VALKYRS +VALLATE +VALLATION +VALLATIONS +VALLECULA +VALLECULAE +VALLECULAR +VALLEY +VALLEYED +VALLEYS +VALONIA +VALONIAS +VALOR +VALORISE +VALORISED +VALORISES +VALORISING +VALORIZATION +VALORIZATIONS +VALORIZE +VALORIZED +VALORIZES +VALORIZING +VALOROUS +VALOROUSLY +VALORS +VALOUR +VALOURS +VALPOLICELLA +VALPOLICELLAS +VALSE +VALSES +VALUABLE +VALUABLENESS +VALUABLENESSES +VALUABLES +VALUABLY +VALUATE +VALUATED +VALUATES +VALUATING +VALUATION +VALUATIONAL +VALUATIONALLY +VALUATIONS +VALUATOR +VALUATORS +VALUE +VALUED +VALUELESS +VALUELESSNESS +VALUELESSNESSES +VALUER +VALUERS +VALUES +VALUING +VALUTA +VALUTAS +VALVAL +VALVAR +VALVATE +VALVE +VALVED +VALVELESS +VALVELET +VALVELETS +VALVELIKE +VALVES +VALVING +VALVULA +VALVULAE +VALVULAR +VALVULE +VALVULES +VALVULITIS +VALVULITISES +VAMBRACE +VAMBRACED +VAMBRACES +VAMOOSE +VAMOOSED +VAMOOSES +VAMOOSING +VAMOSE +VAMOSED +VAMOSES +VAMOSING +VAMP +VAMPED +VAMPER +VAMPERS +VAMPIER +VAMPIEST +VAMPING +VAMPIRE +VAMPIRES +VAMPIRIC +VAMPIRISH +VAMPIRISM +VAMPIRISMS +VAMPISH +VAMPISHLY +VAMPS +VAMPY +VAN +VANADATE +VANADATES +VANADIATE +VANADIATES +VANADIC +VANADIUM +VANADIUMS +VANADOUS +VANASPATI +VANASPATIS +VANDA +VANDAL +VANDALIC +VANDALISE +VANDALISED +VANDALISES +VANDALISH +VANDALISING +VANDALISM +VANDALISMS +VANDALISTIC +VANDALIZATION +VANDALIZATIONS +VANDALIZE +VANDALIZED +VANDALIZES +VANDALIZING +VANDALS +VANDAS +VANDYKE +VANDYKED +VANDYKES +VANE +VANED +VANES +VANG +VANGS +VANGUARD +VANGUARDISM +VANGUARDISMS +VANGUARDIST +VANGUARDISTS +VANGUARDS +VANILLA +VANILLAS +VANILLIC +VANILLIN +VANILLINS +VANISH +VANISHED +VANISHER +VANISHERS +VANISHES +VANISHING +VANISHINGLY +VANITIED +VANITIES +VANITORIES +VANITORY +VANITY +VANLOAD +VANLOADS +VANMAN +VANMEN +VANNED +VANNER +VANNERS +VANNING +VANPOOL +VANPOOLING +VANPOOLINGS +VANPOOLS +VANQUISH +VANQUISHABLE +VANQUISHED +VANQUISHER +VANQUISHERS +VANQUISHES +VANQUISHING +VANS +VANTAGE +VANTAGES +VANWARD +VAPID +VAPIDITIES +VAPIDITY +VAPIDLY +VAPIDNESS +VAPIDNESSES +VAPOR +VAPORABLE +VAPORED +VAPORER +VAPORERS +VAPORETTI +VAPORETTO +VAPORETTOS +VAPORIFIC +VAPORING +VAPORINGS +VAPORISE +VAPORISED +VAPORISES +VAPORISH +VAPORISHNESS +VAPORISHNESSES +VAPORISING +VAPORIZABLE +VAPORIZATION +VAPORIZATIONS +VAPORIZE +VAPORIZED +VAPORIZER +VAPORIZERS +VAPORIZES +VAPORIZING +VAPORLESS +VAPORLIKE +VAPOROUS +VAPOROUSLY +VAPOROUSNESS +VAPOROUSNESSES +VAPORS +VAPORWARE +VAPORWARES +VAPORY +VAPOUR +VAPOURED +VAPOURER +VAPOURERS +VAPOURING +VAPOURS +VAPOURY +VAQUERO +VAQUEROS +VAR +VARA +VARACTOR +VARACTORS +VARAS +VARIA +VARIABILITIES +VARIABILITY +VARIABLE +VARIABLENESS +VARIABLENESSES +VARIABLES +VARIABLY +VARIANCE +VARIANCES +VARIANT +VARIANTS +VARIAS +VARIATE +VARIATED +VARIATES +VARIATING +VARIATION +VARIATIONAL +VARIATIONALLY +VARIATIONS +VARICELLA +VARICELLAS +VARICES +VARICOCELE +VARICOCELES +VARICOLORED +VARICOSE +VARICOSED +VARICOSES +VARICOSIS +VARICOSITIES +VARICOSITY +VARIED +VARIEDLY +VARIEGATE +VARIEGATED +VARIEGATES +VARIEGATING +VARIEGATION +VARIEGATIONS +VARIEGATOR +VARIEGATORS +VARIER +VARIERS +VARIES +VARIETAL +VARIETALS +VARIETIES +VARIETY +VARIFORM +VARIOLA +VARIOLAR +VARIOLAS +VARIOLATE +VARIOLATED +VARIOLATES +VARIOLATING +VARIOLE +VARIOLES +VARIOLITE +VARIOLITES +VARIOLOID +VARIOLOIDS +VARIOLOUS +VARIOMETER +VARIOMETERS +VARIORUM +VARIORUMS +VARIOUS +VARIOUSLY +VARIOUSNESS +VARIOUSNESSES +VARISIZED +VARISTOR +VARISTORS +VARIX +VARLET +VARLETRIES +VARLETRY +VARLETS +VARMENT +VARMENTS +VARMINT +VARMINTS +VARNA +VARNAS +VARNISH +VARNISHED +VARNISHER +VARNISHERS +VARNISHES +VARNISHING +VARNISHY +VAROOM +VAROOMED +VAROOMING +VAROOMS +VARS +VARSITIES +VARSITY +VARUS +VARUSES +VARVE +VARVED +VARVES +VARY +VARYING +VARYINGLY +VAS +VASA +VASAL +VASCULA +VASCULAR +VASCULARITIES +VASCULARITY +VASCULARIZATION +VASCULATURE +VASCULATURES +VASCULITIDES +VASCULITIS +VASCULUM +VASCULUMS +VASE +VASECTOMIES +VASECTOMIZE +VASECTOMIZED +VASECTOMIZES +VASECTOMIZING +VASECTOMY +VASELIKE +VASELINE +VASELINES +VASES +VASIFORM +VASOACTIVE +VASOACTIVITIES +VASOACTIVITY +VASOCONSTRICTOR +VASODILATATION +VASODILATATIONS +VASODILATION +VASODILATIONS +VASODILATOR +VASODILATORS +VASOMOTOR +VASOPRESSIN +VASOPRESSINS +VASOPRESSOR +VASOPRESSORS +VASOSPASM +VASOSPASMS +VASOSPASTIC +VASOTOCIN +VASOTOCINS +VASOTOMIES +VASOTOMY +VASOVAGAL +VASSAL +VASSALAGE +VASSALAGES +VASSALS +VAST +VASTER +VASTEST +VASTIER +VASTIEST +VASTITIES +VASTITUDE +VASTITUDES +VASTITY +VASTLY +VASTNESS +VASTNESSES +VASTS +VASTY +VAT +VATFUL +VATFULS +VATIC +VATICAL +VATICIDE +VATICIDES +VATICINAL +VATICINATE +VATICINATED +VATICINATES +VATICINATING +VATICINATION +VATICINATIONS +VATICINATOR +VATICINATORS +VATS +VATTED +VATTING +VATU +VATUS +VAU +VAUDEVILLE +VAUDEVILLES +VAUDEVILLIAN +VAUDEVILLIANS +VAULT +VAULTED +VAULTER +VAULTERS +VAULTIER +VAULTIEST +VAULTING +VAULTINGLY +VAULTINGS +VAULTS +VAULTY +VAUNT +VAUNTED +VAUNTER +VAUNTERS +VAUNTFUL +VAUNTIE +VAUNTING +VAUNTINGLY +VAUNTS +VAUNTY +VAUS +VAV +VAVASOR +VAVASORS +VAVASOUR +VAVASOURS +VAVASSOR +VAVASSORS +VAVS +VAW +VAWARD +VAWARDS +VAWNTIE +VAWS +VEAL +VEALED +VEALER +VEALERS +VEALIER +VEALIEST +VEALING +VEALS +VEALY +VECTOR +VECTORED +VECTORIAL +VECTORIALLY +VECTORING +VECTORS +VEDALIA +VEDALIAS +VEDETTE +VEDETTES +VEE +VEEJAY +VEEJAYS +VEENA +VEENAS +VEEP +VEEPEE +VEEPEES +VEEPS +VEER +VEERED +VEERIES +VEERING +VEERINGLY +VEERS +VEERY +VEES +VEG +VEGAN +VEGANISM +VEGANISMS +VEGANS +VEGES +VEGETABLE +VEGETABLES +VEGETABLY +VEGETAL +VEGETALLY +VEGETANT +VEGETARIAN +VEGETARIANISM +VEGETARIANISMS +VEGETARIANS +VEGETATE +VEGETATED +VEGETATES +VEGETATING +VEGETATION +VEGETATIONAL +VEGETATIONS +VEGETATIVE +VEGETATIVELY +VEGETATIVENESS +VEGETE +VEGETIST +VEGETISTS +VEGETIVE +VEGGED +VEGGIE +VEGGIES +VEGGING +VEGIE +VEGIES +VEHEMENCE +VEHEMENCES +VEHEMENCIES +VEHEMENCY +VEHEMENT +VEHEMENTLY +VEHICLE +VEHICLES +VEHICULAR +VEIL +VEILED +VEILEDLY +VEILER +VEILERS +VEILING +VEILINGS +VEILLIKE +VEILS +VEIN +VEINAL +VEINED +VEINER +VEINERS +VEINIER +VEINIEST +VEINING +VEININGS +VEINLESS +VEINLET +VEINLETS +VEINLIKE +VEINS +VEINSTONE +VEINSTONES +VEINULE +VEINULES +VEINULET +VEINULETS +VEINY +VELA +VELAMEN +VELAMINA +VELAR +VELARIA +VELARIUM +VELARIZATION +VELARIZATIONS +VELARIZE +VELARIZED +VELARIZES +VELARIZING +VELARS +VELATE +VELCRO +VELCROS +VELD +VELDS +VELDT +VELDTS +VELIGER +VELIGERS +VELITES +VELLEITIES +VELLEITY +VELLICATE +VELLICATED +VELLICATES +VELLICATING +VELLUM +VELLUMS +VELOCE +VELOCIMETER +VELOCIMETERS +VELOCIPEDE +VELOCIPEDES +VELOCIRAPTOR +VELOCIRAPTORS +VELOCITIES +VELOCITY +VELODROME +VELODROMES +VELOUR +VELOURS +VELOUTE +VELOUTES +VELUM +VELURE +VELURED +VELURES +VELURING +VELVERET +VELVERETS +VELVET +VELVETED +VELVETEEN +VELVETEENS +VELVETIER +VELVETIEST +VELVETLIKE +VELVETS +VELVETY +VENA +VENAE +VENAL +VENALITIES +VENALITY +VENALLY +VENATIC +VENATICAL +VENATION +VENATIONS +VEND +VENDABLE +VENDABLES +VENDACE +VENDACES +VENDED +VENDEE +VENDEES +VENDER +VENDERS +VENDETTA +VENDETTAS +VENDEUSE +VENDEUSES +VENDIBILITIES +VENDIBILITY +VENDIBLE +VENDIBLES +VENDIBLY +VENDING +VENDITION +VENDITIONS +VENDOR +VENDORS +VENDS +VENDUE +VENDUES +VENEER +VENEERED +VENEERER +VENEERERS +VENEERING +VENEERINGS +VENEERS +VENENATE +VENENATED +VENENATES +VENENATING +VENENE +VENENES +VENENOSE +VENERABILITIES +VENERABILITY +VENERABLE +VENERABLENESS +VENERABLENESSES +VENERABLES +VENERABLY +VENERATE +VENERATED +VENERATES +VENERATING +VENERATION +VENERATIONS +VENERATOR +VENERATORS +VENEREAL +VENERIES +VENERY +VENESECTION +VENESECTIONS +VENETIAN +VENETIANS +VENGE +VENGEANCE +VENGEANCES +VENGED +VENGEFUL +VENGEFULLY +VENGEFULNESS +VENGEFULNESSES +VENGES +VENGING +VENIAL +VENIALITIES +VENIALITY +VENIALLY +VENIALNESS +VENIALNESSES +VENIN +VENINE +VENINES +VENINS +VENIPUNCTURE +VENIPUNCTURES +VENIRE +VENIREMAN +VENIREMEN +VENIRES +VENISON +VENISONS +VENOGRAM +VENOGRAMS +VENOGRAPHIES +VENOGRAPHY +VENOLOGIES +VENOLOGY +VENOM +VENOMED +VENOMER +VENOMERS +VENOMING +VENOMOUS +VENOMOUSLY +VENOMOUSNESS +VENOMOUSNESSES +VENOMS +VENOSE +VENOSITIES +VENOSITY +VENOUS +VENOUSLY +VENT +VENTAGE +VENTAGES +VENTAIL +VENTAILS +VENTED +VENTER +VENTERS +VENTIFACT +VENTIFACTS +VENTILATE +VENTILATED +VENTILATES +VENTILATING +VENTILATION +VENTILATIONS +VENTILATOR +VENTILATORS +VENTILATORY +VENTING +VENTLESS +VENTRAL +VENTRALLY +VENTRALS +VENTRICLE +VENTRICLES +VENTRICOSE +VENTRICULAR +VENTRICULI +VENTRICULUS +VENTRILOQUIAL +VENTRILOQUIALLY +VENTRILOQUIES +VENTRILOQUISM +VENTRILOQUISMS +VENTRILOQUIST +VENTRILOQUISTIC +VENTRILOQUISTS +VENTRILOQUIZE +VENTRILOQUIZED +VENTRILOQUIZES +VENTRILOQUIZING +VENTRILOQUY +VENTROLATERAL +VENTROMEDIAL +VENTS +VENTURE +VENTURED +VENTURER +VENTURERS +VENTURES +VENTURESOME +VENTURESOMELY +VENTURESOMENESS +VENTURI +VENTURING +VENTURIS +VENTUROUS +VENTUROUSLY +VENTUROUSNESS +VENTUROUSNESSES +VENUE +VENUES +VENULAR +VENULE +VENULES +VENULOSE +VENULOUS +VENUS +VENUSES +VERA +VERACIOUS +VERACIOUSLY +VERACIOUSNESS +VERACIOUSNESSES +VERACITIES +VERACITY +VERANDA +VERANDAED +VERANDAH +VERANDAHED +VERANDAHS +VERANDAS +VERAPAMIL +VERAPAMILS +VERATRIA +VERATRIAS +VERATRIDINE +VERATRIDINES +VERATRIN +VERATRINE +VERATRINES +VERATRINS +VERATRUM +VERATRUMS +VERB +VERBAL +VERBALISM +VERBALISMS +VERBALIST +VERBALISTIC +VERBALISTS +VERBALIZATION +VERBALIZATIONS +VERBALIZE +VERBALIZED +VERBALIZER +VERBALIZERS +VERBALIZES +VERBALIZING +VERBALLY +VERBALS +VERBATIM +VERBENA +VERBENAS +VERBIAGE +VERBIAGES +VERBICIDE +VERBICIDES +VERBID +VERBIDS +VERBIFIED +VERBIFIES +VERBIFY +VERBIFYING +VERBIGERATION +VERBIGERATIONS +VERBILE +VERBILES +VERBLESS +VERBOSE +VERBOSELY +VERBOSENESS +VERBOSENESSES +VERBOSITIES +VERBOSITY +VERBOTEN +VERBS +VERDANCIES +VERDANCY +VERDANT +VERDANTLY +VERDERER +VERDERERS +VERDEROR +VERDERORS +VERDICT +VERDICTS +VERDIGRIS +VERDIGRISES +VERDIN +VERDINS +VERDITER +VERDITERS +VERDURE +VERDURED +VERDURES +VERDUROUS +VERECUND +VERGE +VERGED +VERGENCE +VERGENCES +VERGER +VERGERS +VERGES +VERGING +VERGLAS +VERGLASES +VERIDIC +VERIDICAL +VERIDICALITIES +VERIDICALITY +VERIDICALLY +VERIER +VERIEST +VERIFIABILITIES +VERIFIABILITY +VERIFIABLE +VERIFIABLENESS +VERIFICATION +VERIFICATIONS +VERIFIED +VERIFIER +VERIFIERS +VERIFIES +VERIFY +VERIFYING +VERILY +VERISIMILAR +VERISIMILARLY +VERISIMILITUDE +VERISIMILITUDES +VERISM +VERISMO +VERISMOS +VERISMS +VERIST +VERISTIC +VERISTS +VERITABLE +VERITABLENESS +VERITABLENESSES +VERITABLY +VERITAS +VERITATES +VERITE +VERITES +VERITIES +VERITY +VERJUICE +VERJUICES +VERMEIL +VERMEILS +VERMES +VERMIAN +VERMICELLI +VERMICELLIS +VERMICIDE +VERMICIDES +VERMICULAR +VERMICULATE +VERMICULATED +VERMICULATION +VERMICULATIONS +VERMICULITE +VERMICULITES +VERMIFORM +VERMIFUGE +VERMIFUGES +VERMILION +VERMILIONED +VERMILIONING +VERMILIONS +VERMILLION +VERMILLIONS +VERMIN +VERMINOUS +VERMIS +VERMOULU +VERMOUTH +VERMOUTHS +VERMUTH +VERMUTHS +VERNACLE +VERNACLES +VERNACULAR +VERNACULARISM +VERNACULARISMS +VERNACULARLY +VERNACULARS +VERNAL +VERNALIZATION +VERNALIZATIONS +VERNALIZE +VERNALIZED +VERNALIZES +VERNALIZING +VERNALLY +VERNATION +VERNATIONS +VERNICLE +VERNICLES +VERNIER +VERNIERS +VERNISSAGE +VERNISSAGES +VERNIX +VERNIXES +VERONICA +VERONICAS +VERRUCA +VERRUCAE +VERRUCAS +VERRUCOSE +VERRUCOUS +VERSAL +VERSANT +VERSANTS +VERSATILE +VERSATILELY +VERSATILENESS +VERSATILENESSES +VERSATILITIES +VERSATILITY +VERSE +VERSED +VERSEMAN +VERSEMEN +VERSER +VERSERS +VERSES +VERSET +VERSETS +VERSICLE +VERSICLES +VERSICULAR +VERSIFICATION +VERSIFICATIONS +VERSIFIED +VERSIFIER +VERSIFIERS +VERSIFIES +VERSIFY +VERSIFYING +VERSINE +VERSINES +VERSING +VERSION +VERSIONAL +VERSIONS +VERSO +VERSOS +VERST +VERSTE +VERSTES +VERSTS +VERSUS +VERT +VERTEBRA +VERTEBRAE +VERTEBRAL +VERTEBRAS +VERTEBRATE +VERTEBRATES +VERTEX +VERTEXES +VERTICAL +VERTICALITIES +VERTICALITY +VERTICALLY +VERTICALNESS +VERTICALNESSES +VERTICALS +VERTICES +VERTICIL +VERTICILLATE +VERTICILS +VERTIGINES +VERTIGINOUS +VERTIGINOUSLY +VERTIGO +VERTIGOES +VERTIGOS +VERTS +VERTU +VERTUS +VERVAIN +VERVAINS +VERVE +VERVES +VERVET +VERVETS +VERY +VESICA +VESICAE +VESICAL +VESICANT +VESICANTS +VESICATE +VESICATED +VESICATES +VESICATING +VESICLE +VESICLES +VESICULA +VESICULAE +VESICULAR +VESICULARITIES +VESICULARITY +VESICULATE +VESICULATED +VESICULATES +VESICULATING +VESICULATION +VESICULATIONS +VESPER +VESPERAL +VESPERALS +VESPERS +VESPERTILIAN +VESPERTINE +VESPIARIES +VESPIARY +VESPID +VESPIDS +VESPINE +VESSEL +VESSELED +VESSELS +VEST +VESTA +VESTAL +VESTALLY +VESTALS +VESTAS +VESTED +VESTEE +VESTEES +VESTIARIES +VESTIARY +VESTIBULAR +VESTIBULE +VESTIBULED +VESTIBULES +VESTIBULING +VESTIGE +VESTIGES +VESTIGIA +VESTIGIAL +VESTIGIALLY +VESTIGIUM +VESTING +VESTINGS +VESTLESS +VESTLIKE +VESTMENT +VESTMENTAL +VESTMENTS +VESTRAL +VESTRIES +VESTRY +VESTRYMAN +VESTRYMEN +VESTS +VESTURAL +VESTURE +VESTURED +VESTURES +VESTURING +VESUVIAN +VESUVIANITE +VESUVIANITES +VESUVIANS +VET +VETCH +VETCHES +VETCHLING +VETCHLINGS +VETERAN +VETERANS +VETERINARIAN +VETERINARIANS +VETERINARIES +VETERINARY +VETIVER +VETIVERS +VETIVERT +VETIVERTS +VETO +VETOED +VETOER +VETOERS +VETOES +VETOING +VETS +VETTED +VETTER +VETTERS +VETTING +VEX +VEXATION +VEXATIONS +VEXATIOUS +VEXATIOUSLY +VEXATIOUSNESS +VEXATIOUSNESSES +VEXED +VEXEDLY +VEXEDNESS +VEXEDNESSES +VEXER +VEXERS +VEXES +VEXIL +VEXILLA +VEXILLAR +VEXILLARIES +VEXILLARY +VEXILLATE +VEXILLOLOGIC +VEXILLOLOGICAL +VEXILLOLOGIES +VEXILLOLOGIST +VEXILLOLOGISTS +VEXILLOLOGY +VEXILLUM +VEXILS +VEXING +VEXINGLY +VEXT +VIA +VIABILITIES +VIABILITY +VIABLE +VIABLY +VIADUCT +VIADUCTS +VIAL +VIALED +VIALING +VIALLED +VIALLING +VIALS +VIAND +VIANDS +VIATIC +VIATICA +VIATICAL +VIATICALS +VIATICUM +VIATICUMS +VIATOR +VIATORES +VIATORS +VIBE +VIBES +VIBIST +VIBISTS +VIBRACULA +VIBRACULUM +VIBRAHARP +VIBRAHARPIST +VIBRAHARPISTS +VIBRAHARPS +VIBRANCE +VIBRANCES +VIBRANCIES +VIBRANCY +VIBRANT +VIBRANTLY +VIBRANTS +VIBRAPHONE +VIBRAPHONES +VIBRAPHONIST +VIBRAPHONISTS +VIBRATE +VIBRATED +VIBRATES +VIBRATILE +VIBRATING +VIBRATION +VIBRATIONAL +VIBRATIONLESS +VIBRATIONS +VIBRATIVE +VIBRATO +VIBRATOLESS +VIBRATOR +VIBRATORS +VIBRATORY +VIBRATOS +VIBRIO +VIBRIOID +VIBRION +VIBRIONIC +VIBRIONS +VIBRIOS +VIBRIOSES +VIBRIOSIS +VIBRISSA +VIBRISSAE +VIBRISSAL +VIBRONIC +VIBURNUM +VIBURNUMS +VICAR +VICARAGE +VICARAGES +VICARATE +VICARATES +VICARIAL +VICARIANCE +VICARIANCES +VICARIANT +VICARIANTS +VICARIATE +VICARIATES +VICARIOUS +VICARIOUSLY +VICARIOUSNESS +VICARIOUSNESSES +VICARLY +VICARS +VICARSHIP +VICARSHIPS +VICE +VICED +VICEGERAL +VICEGERENCIES +VICEGERENCY +VICEGERENT +VICEGERENTS +VICELESS +VICENARY +VICENNIAL +VICEREGAL +VICEREGALLY +VICEREINE +VICEREINES +VICEROY +VICEROYALTIES +VICEROYALTY +VICEROYS +VICEROYSHIP +VICEROYSHIPS +VICES +VICHIES +VICHY +VICHYSSOISE +VICHYSSOISES +VICINAGE +VICINAGES +VICINAL +VICING +VICINITIES +VICINITY +VICIOUS +VICIOUSLY +VICIOUSNESS +VICIOUSNESSES +VICISSITUDE +VICISSITUDES +VICISSITUDINOUS +VICOMTE +VICOMTES +VICTIM +VICTIMHOOD +VICTIMHOODS +VICTIMISE +VICTIMISED +VICTIMISES +VICTIMISING +VICTIMIZATION +VICTIMIZATIONS +VICTIMIZE +VICTIMIZED +VICTIMIZER +VICTIMIZERS +VICTIMIZES +VICTIMIZING +VICTIMLESS +VICTIMOLOGIES +VICTIMOLOGIST +VICTIMOLOGISTS +VICTIMOLOGY +VICTIMS +VICTOR +VICTORIA +VICTORIAS +VICTORIES +VICTORIOUS +VICTORIOUSLY +VICTORIOUSNESS +VICTORS +VICTORY +VICTRESS +VICTRESSES +VICTUAL +VICTUALED +VICTUALER +VICTUALERS +VICTUALING +VICTUALLED +VICTUALLER +VICTUALLERS +VICTUALLING +VICTUALS +VICUGNA +VICUGNAS +VICUNA +VICUNAS +VID +VIDE +VIDELICET +VIDEO +VIDEOCASSETTE +VIDEOCASSETTES +VIDEOCONFERENCE +VIDEODISC +VIDEODISCS +VIDEODISK +VIDEODISKS +VIDEOGRAPHER +VIDEOGRAPHERS +VIDEOGRAPHIES +VIDEOGRAPHY +VIDEOLAND +VIDEOLANDS +VIDEOPHILE +VIDEOPHILES +VIDEOPHONE +VIDEOPHONES +VIDEOS +VIDEOTAPE +VIDEOTAPED +VIDEOTAPES +VIDEOTAPING +VIDEOTEX +VIDEOTEXES +VIDEOTEXT +VIDEOTEXTS +VIDETTE +VIDETTES +VIDICON +VIDICONS +VIDS +VIDUITIES +VIDUITY +VIE +VIED +VIER +VIERS +VIES +VIEW +VIEWABLE +VIEWDATA +VIEWED +VIEWER +VIEWERS +VIEWERSHIP +VIEWERSHIPS +VIEWFINDER +VIEWFINDERS +VIEWIER +VIEWIEST +VIEWING +VIEWINGS +VIEWLESS +VIEWLESSLY +VIEWPOINT +VIEWPOINTS +VIEWS +VIEWY +VIG +VIGA +VIGAS +VIGESIMAL +VIGIA +VIGIAS +VIGIL +VIGILANCE +VIGILANCES +VIGILANT +VIGILANTE +VIGILANTES +VIGILANTISM +VIGILANTISMS +VIGILANTLY +VIGILS +VIGINTILLION +VIGINTILLIONS +VIGNERON +VIGNERONS +VIGNETTE +VIGNETTED +VIGNETTER +VIGNETTERS +VIGNETTES +VIGNETTING +VIGNETTIST +VIGNETTISTS +VIGOR +VIGORISH +VIGORISHES +VIGOROSO +VIGOROUS +VIGOROUSLY +VIGOROUSNESS +VIGOROUSNESSES +VIGORS +VIGOUR +VIGOURS +VIGS +VIKING +VIKINGS +VILAYET +VILAYETS +VILE +VILELY +VILENESS +VILENESSES +VILER +VILEST +VILIFICATION +VILIFICATIONS +VILIFIED +VILIFIER +VILIFIERS +VILIFIES +VILIFY +VILIFYING +VILIPEND +VILIPENDED +VILIPENDING +VILIPENDS +VILL +VILLA +VILLADOM +VILLADOMS +VILLAE +VILLAGE +VILLAGER +VILLAGERIES +VILLAGERS +VILLAGERY +VILLAGES +VILLAIN +VILLAINESS +VILLAINESSES +VILLAINIES +VILLAINOUS +VILLAINOUSLY +VILLAINOUSNESS +VILLAINS +VILLAINY +VILLANELLA +VILLANELLE +VILLANELLES +VILLAS +VILLATIC +VILLEIN +VILLEINS +VILLENAGE +VILLENAGES +VILLI +VILLIFORM +VILLOSE +VILLOSITIES +VILLOSITY +VILLOUS +VILLOUSLY +VILLS +VILLUS +VIM +VIMEN +VIMINA +VIMINAL +VIMINEOUS +VIMS +VINA +VINACEOUS +VINAIGRETTE +VINAIGRETTES +VINAL +VINALS +VINAS +VINASSE +VINASSES +VINBLASTINE +VINBLASTINES +VINCA +VINCAS +VINCIBLE +VINCIBLY +VINCRISTINE +VINCRISTINES +VINCULA +VINCULUM +VINCULUMS +VINDALOO +VINDALOOS +VINDICABLE +VINDICATE +VINDICATED +VINDICATES +VINDICATING +VINDICATION +VINDICATIONS +VINDICATIVE +VINDICATOR +VINDICATORS +VINDICATORY +VINDICTIVE +VINDICTIVELY +VINDICTIVENESS +VINE +VINEAL +VINED +VINEDRESSER +VINEDRESSERS +VINEGAR +VINEGARED +VINEGARISH +VINEGARS +VINEGARY +VINERIES +VINERY +VINES +VINEYARD +VINEYARDIST +VINEYARDISTS +VINEYARDS +VINIC +VINICULTURE +VINICULTURES +VINIER +VINIEST +VINIFERA +VINIFERAS +VINIFICATION +VINIFICATIONS +VINIFIED +VINIFIES +VINIFY +VINIFYING +VINING +VINO +VINOS +VINOSITIES +VINOSITY +VINOUS +VINOUSLY +VINTAGE +VINTAGER +VINTAGERS +VINTAGES +VINTNER +VINTNERS +VINY +VINYL +VINYLIC +VINYLIDENE +VINYLIDENES +VINYLS +VIOL +VIOLA +VIOLABILITIES +VIOLABILITY +VIOLABLE +VIOLABLENESS +VIOLABLENESSES +VIOLABLY +VIOLACEOUS +VIOLAS +VIOLATE +VIOLATED +VIOLATER +VIOLATERS +VIOLATES +VIOLATING +VIOLATION +VIOLATIONS +VIOLATIVE +VIOLATOR +VIOLATORS +VIOLENCE +VIOLENCES +VIOLENT +VIOLENTLY +VIOLET +VIOLETS +VIOLIN +VIOLINIST +VIOLINISTIC +VIOLINISTS +VIOLINS +VIOLIST +VIOLISTS +VIOLONCELLI +VIOLONCELLIST +VIOLONCELLISTS +VIOLONCELLO +VIOLONCELLOS +VIOLONE +VIOLONES +VIOLS +VIOMYCIN +VIOMYCINS +VIOSTEROL +VIOSTEROLS +VIPER +VIPERFISH +VIPERFISHES +VIPERINE +VIPERISH +VIPEROUS +VIPEROUSLY +VIPERS +VIRAGINOUS +VIRAGO +VIRAGOES +VIRAGOS +VIRAL +VIRALLY +VIRELAI +VIRELAIS +VIRELAY +VIRELAYS +VIREMIA +VIREMIAS +VIREMIC +VIREO +VIREONINE +VIREONINES +VIREOS +VIRES +VIRESCENCE +VIRESCENCES +VIRESCENT +VIRGA +VIRGAS +VIRGATE +VIRGATES +VIRGIN +VIRGINAL +VIRGINALIST +VIRGINALISTS +VIRGINALLY +VIRGINALS +VIRGINITIES +VIRGINITY +VIRGINS +VIRGULATE +VIRGULE +VIRGULES +VIRICIDAL +VIRICIDE +VIRICIDES +VIRID +VIRIDESCENT +VIRIDIAN +VIRIDIANS +VIRIDITIES +VIRIDITY +VIRILE +VIRILELY +VIRILISM +VIRILISMS +VIRILITIES +VIRILITY +VIRILIZE +VIRILIZED +VIRILIZES +VIRILIZING +VIRILOCAL +VIRION +VIRIONS +VIRL +VIRLS +VIROID +VIROIDS +VIROLOGIC +VIROLOGICAL +VIROLOGICALLY +VIROLOGIES +VIROLOGIST +VIROLOGISTS +VIROLOGY +VIROSES +VIROSIS +VIRTU +VIRTUAL +VIRTUALITIES +VIRTUALITY +VIRTUALLY +VIRTUE +VIRTUELESS +VIRTUES +VIRTUOSA +VIRTUOSAS +VIRTUOSE +VIRTUOSI +VIRTUOSIC +VIRTUOSITIES +VIRTUOSITY +VIRTUOSO +VIRTUOSOS +VIRTUOUS +VIRTUOUSLY +VIRTUOUSNESS +VIRTUOUSNESSES +VIRTUS +VIRUCIDAL +VIRUCIDE +VIRUCIDES +VIRULENCE +VIRULENCES +VIRULENCIES +VIRULENCY +VIRULENT +VIRULENTLY +VIRULIFEROUS +VIRUS +VIRUSES +VIRUSLIKE +VIRUSOID +VIRUSOIDS +VIS +VISA +VISAED +VISAGE +VISAGED +VISAGES +VISAING +VISARD +VISARDS +VISAS +VISCACHA +VISCACHAS +VISCERA +VISCERAL +VISCERALLY +VISCID +VISCIDITIES +VISCIDITY +VISCIDLY +VISCOELASTIC +VISCOELASTICITY +VISCOID +VISCOIDAL +VISCOMETER +VISCOMETERS +VISCOMETRIC +VISCOMETRIES +VISCOMETRY +VISCOSE +VISCOSES +VISCOSIMETER +VISCOSIMETERS +VISCOSIMETRIC +VISCOSITIES +VISCOSITY +VISCOUNT +VISCOUNTCIES +VISCOUNTCY +VISCOUNTESS +VISCOUNTESSES +VISCOUNTIES +VISCOUNTS +VISCOUNTY +VISCOUS +VISCOUSLY +VISCOUSNESS +VISCOUSNESSES +VISCUS +VISE +VISED +VISEED +VISEING +VISELIKE +VISES +VISIBILITIES +VISIBILITY +VISIBLE +VISIBLENESS +VISIBLENESSES +VISIBLY +VISING +VISION +VISIONAL +VISIONALLY +VISIONARIES +VISIONARINESS +VISIONARINESSES +VISIONARY +VISIONED +VISIONING +VISIONLESS +VISIONS +VISIT +VISITABLE +VISITANT +VISITANTS +VISITATION +VISITATIONS +VISITATORIAL +VISITED +VISITER +VISITERS +VISITING +VISITOR +VISITORS +VISITS +VISIVE +VISOR +VISORED +VISORING +VISORLESS +VISORS +VISTA +VISTAED +VISTALESS +VISTAS +VISUAL +VISUALISE +VISUALISED +VISUALISES +VISUALISING +VISUALIST +VISUALISTS +VISUALITIES +VISUALITY +VISUALIZATION +VISUALIZATIONS +VISUALIZE +VISUALIZED +VISUALIZER +VISUALIZERS +VISUALIZES +VISUALIZING +VISUALLY +VISUALS +VITA +VITAE +VITAL +VITALISE +VITALISED +VITALISES +VITALISING +VITALISM +VITALISMS +VITALIST +VITALISTIC +VITALISTS +VITALITIES +VITALITY +VITALIZATION +VITALIZATIONS +VITALIZE +VITALIZED +VITALIZER +VITALIZERS +VITALIZES +VITALIZING +VITALLY +VITALNESS +VITALNESSES +VITALS +VITAMER +VITAMERS +VITAMIN +VITAMINE +VITAMINES +VITAMINIC +VITAMINS +VITELLIN +VITELLINE +VITELLINES +VITELLINS +VITELLOGENESES +VITELLOGENESIS +VITELLUS +VITELLUSES +VITESSE +VITESSES +VITIABLE +VITIATE +VITIATED +VITIATES +VITIATING +VITIATION +VITIATIONS +VITIATOR +VITIATORS +VITICULTURAL +VITICULTURALLY +VITICULTURE +VITICULTURES +VITICULTURIST +VITICULTURISTS +VITILIGO +VITILIGOS +VITRAIN +VITRAINS +VITRECTOMIES +VITRECTOMY +VITREOUS +VITREOUSES +VITRIC +VITRICS +VITRIFIABLE +VITRIFICATION +VITRIFICATIONS +VITRIFIED +VITRIFIES +VITRIFORM +VITRIFY +VITRIFYING +VITRINE +VITRINES +VITRIOL +VITRIOLED +VITRIOLIC +VITRIOLING +VITRIOLLED +VITRIOLLING +VITRIOLS +VITTA +VITTAE +VITTATE +VITTLE +VITTLED +VITTLES +VITTLING +VITULINE +VITUPERATE +VITUPERATED +VITUPERATES +VITUPERATING +VITUPERATION +VITUPERATIONS +VITUPERATIVE +VITUPERATIVELY +VITUPERATOR +VITUPERATORS +VITUPERATORY +VIVA +VIVACE +VIVACES +VIVACIOUS +VIVACIOUSLY +VIVACIOUSNESS +VIVACIOUSNESSES +VIVACITIES +VIVACITY +VIVANDIERE +VIVANDIERES +VIVARIA +VIVARIES +VIVARIUM +VIVARIUMS +VIVARY +VIVAS +VIVE +VIVERRID +VIVERRIDS +VIVERRINE +VIVERRINES +VIVERS +VIVID +VIVIDER +VIVIDEST +VIVIDLY +VIVIDNESS +VIVIDNESSES +VIVIFIC +VIVIFICATION +VIVIFICATIONS +VIVIFIED +VIVIFIER +VIVIFIERS +VIVIFIES +VIVIFY +VIVIFYING +VIVIPARA +VIVIPARITIES +VIVIPARITY +VIVIPAROUS +VIVIPAROUSLY +VIVISECT +VIVISECTED +VIVISECTING +VIVISECTION +VIVISECTIONAL +VIVISECTIONIST +VIVISECTIONISTS +VIVISECTIONS +VIVISECTOR +VIVISECTORS +VIVISECTS +VIXEN +VIXENISH +VIXENLY +VIXENS +VIZARD +VIZARDED +VIZARDS +VIZCACHA +VIZCACHAS +VIZIER +VIZIERATE +VIZIERATES +VIZIERIAL +VIZIERS +VIZIERSHIP +VIZIERSHIPS +VIZIR +VIZIRATE +VIZIRATES +VIZIRIAL +VIZIRS +VIZOR +VIZORED +VIZORING +VIZORS +VIZSLA +VIZSLAS +VOCAB +VOCABLE +VOCABLES +VOCABLY +VOCABS +VOCABULAR +VOCABULARIES +VOCABULARY +VOCAL +VOCALESE +VOCALESES +VOCALIC +VOCALICALLY +VOCALICS +VOCALISE +VOCALISED +VOCALISES +VOCALISING +VOCALISM +VOCALISMS +VOCALIST +VOCALISTS +VOCALITIES +VOCALITY +VOCALIZATION +VOCALIZATIONS +VOCALIZE +VOCALIZED +VOCALIZER +VOCALIZERS +VOCALIZES +VOCALIZING +VOCALLY +VOCALNESS +VOCALNESSES +VOCALS +VOCATION +VOCATIONAL +VOCATIONALISM +VOCATIONALISMS +VOCATIONALIST +VOCATIONALISTS +VOCATIONALLY +VOCATIONS +VOCATIVE +VOCATIVELY +VOCATIVES +VOCES +VOCIFERANT +VOCIFERATE +VOCIFERATED +VOCIFERATES +VOCIFERATING +VOCIFERATION +VOCIFERATIONS +VOCIFERATOR +VOCIFERATORS +VOCIFEROUS +VOCIFEROUSLY +VOCIFEROUSNESS +VOCODER +VOCODERS +VODKA +VODKAS +VODOU +VODOUN +VODOUNS +VODOUS +VODUN +VODUNS +VOE +VOES +VOGIE +VOGUE +VOGUED +VOGUEING +VOGUEINGS +VOGUER +VOGUERS +VOGUES +VOGUING +VOGUINGS +VOGUISH +VOGUISHLY +VOGUISHNESS +VOGUISHNESSES +VOICE +VOICED +VOICEFUL +VOICEFULNESS +VOICEFULNESSES +VOICELESS +VOICELESSLY +VOICELESSNESS +VOICELESSNESSES +VOICEMAIL +VOICEMAILS +VOICEOVER +VOICEOVERS +VOICEPRINT +VOICEPRINTS +VOICER +VOICERS +VOICES +VOICING +VOICINGS +VOID +VOIDABLE +VOIDABLENESS +VOIDABLENESSES +VOIDANCE +VOIDANCES +VOIDED +VOIDER +VOIDERS +VOIDING +VOIDNESS +VOIDNESSES +VOIDS +VOILA +VOILE +VOILES +VOLANT +VOLANTE +VOLAR +VOLATILE +VOLATILENESS +VOLATILENESSES +VOLATILES +VOLATILISE +VOLATILISED +VOLATILISES +VOLATILISING +VOLATILITIES +VOLATILITY +VOLATILIZABLE +VOLATILIZATION +VOLATILIZATIONS +VOLATILIZE +VOLATILIZED +VOLATILIZES +VOLATILIZING +VOLCANIC +VOLCANICALLY +VOLCANICITIES +VOLCANICITY +VOLCANICS +VOLCANISM +VOLCANISMS +VOLCANIZE +VOLCANIZED +VOLCANIZES +VOLCANIZING +VOLCANO +VOLCANOES +VOLCANOLOGIC +VOLCANOLOGICAL +VOLCANOLOGIES +VOLCANOLOGIST +VOLCANOLOGISTS +VOLCANOLOGY +VOLCANOS +VOLE +VOLED +VOLERIES +VOLERY +VOLES +VOLING +VOLITANT +VOLITION +VOLITIONAL +VOLITIONS +VOLITIVE +VOLKSLIED +VOLKSLIEDER +VOLLEY +VOLLEYBALL +VOLLEYBALLS +VOLLEYED +VOLLEYER +VOLLEYERS +VOLLEYING +VOLLEYS +VOLOST +VOLOSTS +VOLPLANE +VOLPLANED +VOLPLANES +VOLPLANING +VOLT +VOLTA +VOLTAGE +VOLTAGES +VOLTAIC +VOLTAISM +VOLTAISMS +VOLTE +VOLTES +VOLTI +VOLTMETER +VOLTMETERS +VOLTS +VOLUBILITIES +VOLUBILITY +VOLUBLE +VOLUBLENESS +VOLUBLENESSES +VOLUBLY +VOLUME +VOLUMED +VOLUMES +VOLUMETER +VOLUMETERS +VOLUMETRIC +VOLUMETRICALLY +VOLUMING +VOLUMINOSITIES +VOLUMINOSITY +VOLUMINOUS +VOLUMINOUSLY +VOLUMINOUSNESS +VOLUNTARIES +VOLUNTARILY +VOLUNTARINESS +VOLUNTARINESSES +VOLUNTARISM +VOLUNTARISMS +VOLUNTARIST +VOLUNTARISTIC +VOLUNTARISTS +VOLUNTARY +VOLUNTARYISM +VOLUNTARYISMS +VOLUNTARYIST +VOLUNTARYISTS +VOLUNTEER +VOLUNTEERED +VOLUNTEERING +VOLUNTEERISM +VOLUNTEERISMS +VOLUNTEERS +VOLUPTUARIES +VOLUPTUARY +VOLUPTUOUS +VOLUPTUOUSLY +VOLUPTUOUSNESS +VOLUTE +VOLUTED +VOLUTES +VOLUTIN +VOLUTINS +VOLUTION +VOLUTIONS +VOLVA +VOLVAS +VOLVATE +VOLVOX +VOLVOXES +VOLVULI +VOLVULUS +VOLVULUSES +VOMER +VOMERINE +VOMERS +VOMICA +VOMICAE +VOMIT +VOMITED +VOMITER +VOMITERS +VOMITING +VOMITIVE +VOMITIVES +VOMITO +VOMITORIES +VOMITORY +VOMITOS +VOMITOUS +VOMITS +VOMITUS +VOMITUSES +VOODOO +VOODOOED +VOODOOING +VOODOOISM +VOODOOISMS +VOODOOIST +VOODOOISTIC +VOODOOISTS +VOODOOS +VORACIOUS +VORACIOUSLY +VORACIOUSNESS +VORACIOUSNESSES +VORACITIES +VORACITY +VORLAGE +VORLAGES +VORTEX +VORTEXES +VORTICAL +VORTICALLY +VORTICELLA +VORTICELLAE +VORTICELLAS +VORTICES +VORTICISM +VORTICISMS +VORTICIST +VORTICISTS +VORTICITIES +VORTICITY +VORTICOSE +VOTABLE +VOTARESS +VOTARESSES +VOTARIES +VOTARIST +VOTARISTS +VOTARY +VOTE +VOTEABLE +VOTED +VOTELESS +VOTER +VOTERS +VOTES +VOTING +VOTIVE +VOTIVELY +VOTIVENESS +VOTIVENESSES +VOTIVES +VOTRESS +VOTRESSES +VOUCH +VOUCHED +VOUCHEE +VOUCHEES +VOUCHER +VOUCHERED +VOUCHERING +VOUCHERS +VOUCHES +VOUCHING +VOUCHSAFE +VOUCHSAFED +VOUCHSAFEMENT +VOUCHSAFEMENTS +VOUCHSAFES +VOUCHSAFING +VOUDON +VOUDONS +VOUDOUN +VOUDOUNS +VOUSSOIR +VOUSSOIRS +VOUVRAY +VOUVRAYS +VOW +VOWED +VOWEL +VOWELIZE +VOWELIZED +VOWELIZES +VOWELIZING +VOWELS +VOWER +VOWERS +VOWING +VOWLESS +VOWS +VOX +VOYAGE +VOYAGED +VOYAGER +VOYAGERS +VOYAGES +VOYAGEUR +VOYAGEURS +VOYAGING +VOYEUR +VOYEURISM +VOYEURISMS +VOYEURISTIC +VOYEURISTICALLY +VOYEURS +VROOM +VROOMED +VROOMING +VROOMS +VROUW +VROUWS +VROW +VROWS +VUG +VUGG +VUGGIER +VUGGIEST +VUGGS +VUGGY +VUGH +VUGHS +VUGS +VULCANIAN +VULCANIC +VULCANICITIES +VULCANICITY +VULCANISATE +VULCANISATES +VULCANISATION +VULCANISATIONS +VULCANISE +VULCANISED +VULCANISES +VULCANISING +VULCANISM +VULCANISMS +VULCANITE +VULCANITES +VULCANIZATE +VULCANIZATES +VULCANIZATION +VULCANIZATIONS +VULCANIZE +VULCANIZED +VULCANIZER +VULCANIZERS +VULCANIZES +VULCANIZING +VULCANOLOGIES +VULCANOLOGIST +VULCANOLOGISTS +VULCANOLOGY +VULGAR +VULGARER +VULGAREST +VULGARIAN +VULGARIANS +VULGARISE +VULGARISED +VULGARISES +VULGARISING +VULGARISM +VULGARISMS +VULGARITIES +VULGARITY +VULGARIZATION +VULGARIZATIONS +VULGARIZE +VULGARIZED +VULGARIZER +VULGARIZERS +VULGARIZES +VULGARIZING +VULGARLY +VULGARS +VULGATE +VULGATES +VULGO +VULGUS +VULGUSES +VULNERABILITIES +VULNERABILITY +VULNERABLE +VULNERABLENESS +VULNERABLY +VULNERARIES +VULNERARY +VULPINE +VULTURE +VULTURES +VULTURINE +VULTURISH +VULTUROUS +VULVA +VULVAE +VULVAL +VULVAR +VULVAS +VULVATE +VULVIFORM +VULVITIS +VULVITISES +VULVOVAGINITIS +VUM +VYING +VYINGLY +WAB +WABBLE +WABBLED +WABBLER +WABBLERS +WABBLES +WABBLIER +WABBLIEST +WABBLING +WABBLY +WABS +WACK +WACKE +WACKER +WACKES +WACKEST +WACKIER +WACKIEST +WACKILY +WACKINESS +WACKINESSES +WACKO +WACKOS +WACKS +WACKY +WAD +WADABLE +WADDED +WADDER +WADDERS +WADDIE +WADDIED +WADDIES +WADDING +WADDINGS +WADDLE +WADDLED +WADDLER +WADDLERS +WADDLES +WADDLING +WADDLY +WADDY +WADDYING +WADE +WADEABLE +WADED +WADER +WADERS +WADES +WADI +WADIES +WADING +WADIS +WADMAAL +WADMAALS +WADMAL +WADMALS +WADMEL +WADMELS +WADMOL +WADMOLL +WADMOLLS +WADMOLS +WADS +WADSET +WADSETS +WADSETTED +WADSETTING +WADY +WAE +WAEFUL +WAENESS +WAENESSES +WAES +WAESUCK +WAESUCKS +WAFER +WAFERED +WAFERING +WAFERS +WAFERY +WAFF +WAFFED +WAFFIE +WAFFIES +WAFFING +WAFFLE +WAFFLED +WAFFLER +WAFFLERS +WAFFLES +WAFFLESTOMPER +WAFFLESTOMPERS +WAFFLIER +WAFFLIEST +WAFFLING +WAFFLINGS +WAFFLY +WAFFS +WAFT +WAFTAGE +WAFTAGES +WAFTED +WAFTER +WAFTERS +WAFTING +WAFTS +WAFTURE +WAFTURES +WAG +WAGE +WAGED +WAGELESS +WAGER +WAGERED +WAGERER +WAGERERS +WAGERING +WAGERS +WAGES +WAGEWORKER +WAGEWORKERS +WAGGED +WAGGER +WAGGERIES +WAGGERS +WAGGERY +WAGGING +WAGGISH +WAGGISHLY +WAGGISHNESS +WAGGISHNESSES +WAGGLE +WAGGLED +WAGGLES +WAGGLIER +WAGGLIEST +WAGGLING +WAGGLY +WAGGON +WAGGONED +WAGGONER +WAGGONERS +WAGGONING +WAGGONS +WAGING +WAGON +WAGONAGE +WAGONAGES +WAGONED +WAGONER +WAGONERS +WAGONETTE +WAGONETTES +WAGONING +WAGONLOAD +WAGONLOADS +WAGONS +WAGS +WAGSOME +WAGTAIL +WAGTAILS +WAHCONDA +WAHCONDAS +WAHINE +WAHINES +WAHOO +WAHOOS +WAIF +WAIFED +WAIFING +WAIFISH +WAIFLIKE +WAIFS +WAIL +WAILED +WAILER +WAILERS +WAILFUL +WAILFULLY +WAILING +WAILINGLY +WAILS +WAILSOME +WAIN +WAINS +WAINSCOT +WAINSCOTED +WAINSCOTING +WAINSCOTINGS +WAINSCOTS +WAINSCOTTED +WAINSCOTTING +WAINSCOTTINGS +WAINWRIGHT +WAINWRIGHTS +WAIR +WAIRED +WAIRING +WAIRS +WAIST +WAISTBAND +WAISTBANDS +WAISTCOAT +WAISTCOATED +WAISTCOATS +WAISTED +WAISTER +WAISTERS +WAISTING +WAISTINGS +WAISTLESS +WAISTLINE +WAISTLINES +WAISTS +WAIT +WAITED +WAITER +WAITERED +WAITERING +WAITERS +WAITING +WAITINGS +WAITLIST +WAITLISTED +WAITLISTING +WAITLISTS +WAITPERSON +WAITPERSONS +WAITRESS +WAITRESSED +WAITRESSES +WAITRESSING +WAITRON +WAITRONS +WAITS +WAITSTAFF +WAITSTAFFS +WAIVE +WAIVED +WAIVER +WAIVERS +WAIVES +WAIVING +WAKAME +WAKAMES +WAKANDA +WAKANDAS +WAKE +WAKEBOARD +WAKEBOARDER +WAKEBOARDERS +WAKEBOARDING +WAKEBOARDINGS +WAKEBOARDS +WAKED +WAKEFUL +WAKEFULLY +WAKEFULNESS +WAKEFULNESSES +WAKELESS +WAKEN +WAKENED +WAKENER +WAKENERS +WAKENING +WAKENINGS +WAKENS +WAKER +WAKERIFE +WAKERS +WAKES +WAKIKI +WAKIKIS +WAKING +WALE +WALED +WALER +WALERS +WALES +WALIES +WALING +WALK +WALKABLE +WALKABOUT +WALKABOUTS +WALKATHON +WALKATHONS +WALKAWAY +WALKAWAYS +WALKED +WALKER +WALKERS +WALKING +WALKINGS +WALKINGSTICK +WALKINGSTICKS +WALKOUT +WALKOUTS +WALKOVER +WALKOVERS +WALKS +WALKUP +WALKUPS +WALKWAY +WALKWAYS +WALKYRIE +WALKYRIES +WALL +WALLA +WALLABIES +WALLABY +WALLAH +WALLAHS +WALLAROO +WALLAROOS +WALLAS +WALLBOARD +WALLBOARDS +WALLED +WALLET +WALLETS +WALLEYE +WALLEYED +WALLEYES +WALLFLOWER +WALLFLOWERS +WALLIE +WALLIES +WALLING +WALLOP +WALLOPED +WALLOPER +WALLOPERS +WALLOPING +WALLOPINGS +WALLOPS +WALLOW +WALLOWED +WALLOWER +WALLOWERS +WALLOWING +WALLOWS +WALLPAPER +WALLPAPERED +WALLPAPERING +WALLPAPERS +WALLS +WALLY +WALLYBALL +WALLYBALLS +WALLYDRAG +WALLYDRAGS +WALLYDRAIGLE +WALLYDRAIGLES +WALNUT +WALNUTS +WALRUS +WALRUSES +WALTZ +WALTZED +WALTZER +WALTZERS +WALTZES +WALTZING +WALY +WAMBLE +WAMBLED +WAMBLES +WAMBLIER +WAMBLIEST +WAMBLING +WAMBLY +WAME +WAMEFOU +WAMEFOUS +WAMEFUL +WAMEFULS +WAMES +WAMMUS +WAMMUSES +WAMPISH +WAMPISHED +WAMPISHES +WAMPISHING +WAMPUM +WAMPUMPEAG +WAMPUMPEAGS +WAMPUMS +WAMPUS +WAMPUSES +WAMUS +WAMUSES +WAN +WAND +WANDER +WANDERED +WANDERER +WANDERERS +WANDERING +WANDERINGS +WANDERLUST +WANDERLUSTS +WANDEROO +WANDEROOS +WANDERS +WANDLE +WANDS +WANE +WANED +WANES +WANEY +WANGAN +WANGANS +WANGLE +WANGLED +WANGLER +WANGLERS +WANGLES +WANGLING +WANGUN +WANGUNS +WANIER +WANIEST +WANIGAN +WANIGANS +WANING +WANION +WANIONS +WANK +WANKED +WANKER +WANKERS +WANKING +WANKS +WANLY +WANNABE +WANNABEE +WANNABEES +WANNABES +WANNED +WANNER +WANNESS +WANNESSES +WANNEST +WANNIGAN +WANNIGANS +WANNING +WANS +WANT +WANTAGE +WANTAGES +WANTED +WANTER +WANTERS +WANTING +WANTON +WANTONED +WANTONER +WANTONERS +WANTONING +WANTONLY +WANTONNESS +WANTONNESSES +WANTONS +WANTS +WANY +WAP +WAPENTAKE +WAPENTAKES +WAPITI +WAPITIS +WAPPED +WAPPENSCHAWING +WAPPENSCHAWINGS +WAPPING +WAPS +WAR +WARBLE +WARBLED +WARBLER +WARBLERS +WARBLES +WARBLING +WARBONNET +WARBONNETS +WARCRAFT +WARCRAFTS +WARD +WARDED +WARDEN +WARDENRIES +WARDENRY +WARDENS +WARDENSHIP +WARDENSHIPS +WARDER +WARDERS +WARDING +WARDLESS +WARDRESS +WARDRESSES +WARDROBE +WARDROBED +WARDROBES +WARDROBING +WARDROOM +WARDROOMS +WARDS +WARDSHIP +WARDSHIPS +WARE +WARED +WAREHOUSE +WAREHOUSED +WAREHOUSEMAN +WAREHOUSEMEN +WAREHOUSER +WAREHOUSERS +WAREHOUSES +WAREHOUSING +WAREROOM +WAREROOMS +WARES +WARFARE +WARFARES +WARFARIN +WARFARINS +WARHEAD +WARHEADS +WARHORSE +WARHORSES +WARIER +WARIEST +WARILY +WARINESS +WARINESSES +WARING +WARISON +WARISONS +WARK +WARKED +WARKING +WARKS +WARLESS +WARLIKE +WARLOCK +WARLOCKS +WARLORD +WARLORDISM +WARLORDISMS +WARLORDS +WARM +WARMAKER +WARMAKERS +WARMED +WARMER +WARMERS +WARMEST +WARMHEARTED +WARMHEARTEDNESS +WARMING +WARMISH +WARMLY +WARMNESS +WARMNESSES +WARMONGER +WARMONGERING +WARMONGERINGS +WARMONGERS +WARMOUTH +WARMOUTHS +WARMS +WARMTH +WARMTHS +WARMUP +WARMUPS +WARN +WARNED +WARNER +WARNERS +WARNING +WARNINGLY +WARNINGS +WARNS +WARP +WARPAGE +WARPAGES +WARPATH +WARPATHS +WARPED +WARPER +WARPERS +WARPING +WARPLANE +WARPLANES +WARPOWER +WARPOWERS +WARPS +WARPWISE +WARRAGAL +WARRAGALS +WARRANT +WARRANTABLE +WARRANTABLENESS +WARRANTABLY +WARRANTED +WARRANTEE +WARRANTEES +WARRANTER +WARRANTERS +WARRANTIED +WARRANTIES +WARRANTING +WARRANTLESS +WARRANTOR +WARRANTORS +WARRANTS +WARRANTY +WARRANTYING +WARRED +WARREN +WARRENER +WARRENERS +WARRENS +WARRIGAL +WARRIGALS +WARRING +WARRIOR +WARRIORS +WARS +WARSAW +WARSAWS +WARSHIP +WARSHIPS +WARSLE +WARSLED +WARSLER +WARSLERS +WARSLES +WARSLING +WARSTLE +WARSTLED +WARSTLER +WARSTLERS +WARSTLES +WARSTLING +WART +WARTED +WARTHOG +WARTHOGS +WARTIER +WARTIEST +WARTIME +WARTIMES +WARTLESS +WARTLIKE +WARTS +WARTY +WARWORK +WARWORKS +WARWORN +WARY +WAS +WASABI +WASABIS +WASH +WASHABILITIES +WASHABILITY +WASHABLE +WASHABLES +WASHATERIA +WASHATERIAS +WASHBASIN +WASHBASINS +WASHBOARD +WASHBOARDS +WASHBOWL +WASHBOWLS +WASHCLOTH +WASHCLOTHS +WASHDAY +WASHDAYS +WASHED +WASHER +WASHERMAN +WASHERMEN +WASHERS +WASHERWOMAN +WASHERWOMEN +WASHES +WASHETERIA +WASHETERIAS +WASHHOUSE +WASHHOUSES +WASHIER +WASHIEST +WASHINESS +WASHINESSES +WASHING +WASHINGS +WASHOUT +WASHOUTS +WASHRAG +WASHRAGS +WASHROOM +WASHROOMS +WASHSTAND +WASHSTANDS +WASHTUB +WASHTUBS +WASHUP +WASHUPS +WASHWOMAN +WASHWOMEN +WASHY +WASP +WASPIER +WASPIEST +WASPILY +WASPINESS +WASPINESSES +WASPISH +WASPISHLY +WASPISHNESS +WASPISHNESSES +WASPLIKE +WASPS +WASPY +WASSAIL +WASSAILED +WASSAILER +WASSAILERS +WASSAILING +WASSAILS +WAST +WASTABLE +WASTAGE +WASTAGES +WASTE +WASTEBASKET +WASTEBASKETS +WASTED +WASTEFUL +WASTEFULLY +WASTEFULNESS +WASTEFULNESSES +WASTELAND +WASTELANDS +WASTELOT +WASTELOTS +WASTEPAPER +WASTEPAPERS +WASTER +WASTERIE +WASTERIES +WASTERS +WASTERY +WASTES +WASTEWATER +WASTEWATERS +WASTEWAY +WASTEWAYS +WASTING +WASTINGLY +WASTREL +WASTRELS +WASTRIE +WASTRIES +WASTRY +WASTS +WAT +WATAP +WATAPE +WATAPES +WATAPS +WATCH +WATCHABLE +WATCHABLES +WATCHBAND +WATCHBANDS +WATCHCASE +WATCHCASES +WATCHCRIES +WATCHCRY +WATCHDOG +WATCHDOGGED +WATCHDOGGING +WATCHDOGS +WATCHED +WATCHER +WATCHERS +WATCHES +WATCHEYE +WATCHEYES +WATCHFUL +WATCHFULLY +WATCHFULNESS +WATCHFULNESSES +WATCHING +WATCHMAKER +WATCHMAKERS +WATCHMAKING +WATCHMAKINGS +WATCHMAN +WATCHMEN +WATCHOUT +WATCHOUTS +WATCHTOWER +WATCHTOWERS +WATCHWORD +WATCHWORDS +WATER +WATERAGE +WATERAGES +WATERBED +WATERBEDS +WATERBIRD +WATERBIRDS +WATERBORNE +WATERBUCK +WATERBUCKS +WATERBUS +WATERBUSES +WATERBUSSES +WATERCOLOR +WATERCOLORIST +WATERCOLORISTS +WATERCOLORS +WATERCOOLER +WATERCOOLERS +WATERCOURSE +WATERCOURSES +WATERCRAFT +WATERCRAFTS +WATERCRESS +WATERCRESSES +WATERDOG +WATERDOGS +WATERED +WATERER +WATERERS +WATERFALL +WATERFALLS +WATERFLOOD +WATERFLOODED +WATERFLOODING +WATERFLOODS +WATERFOWL +WATERFOWLER +WATERFOWLERS +WATERFOWLING +WATERFOWLINGS +WATERFOWLS +WATERFRONT +WATERFRONTS +WATERHEAD +WATERHEADS +WATERHEN +WATERHENS +WATERIER +WATERIEST +WATERILY +WATERINESS +WATERINESSES +WATERING +WATERINGS +WATERISH +WATERISHNESS +WATERISHNESSES +WATERJET +WATERJETS +WATERLEAF +WATERLEAFS +WATERLESS +WATERLESSNESS +WATERLESSNESSES +WATERLILIES +WATERLILY +WATERLINE +WATERLINES +WATERLOG +WATERLOGGED +WATERLOGGING +WATERLOGS +WATERLOO +WATERLOOS +WATERMAN +WATERMANSHIP +WATERMANSHIPS +WATERMARK +WATERMARKED +WATERMARKING +WATERMARKS +WATERMELON +WATERMELONS +WATERMEN +WATERPOWER +WATERPOWERS +WATERPROOF +WATERPROOFED +WATERPROOFER +WATERPROOFERS +WATERPROOFING +WATERPROOFINGS +WATERPROOFNESS +WATERPROOFS +WATERS +WATERSCAPE +WATERSCAPES +WATERSHED +WATERSHEDS +WATERSIDE +WATERSIDES +WATERSKI +WATERSKIING +WATERSKIINGS +WATERSKIS +WATERSPOUT +WATERSPOUTS +WATERTHRUSH +WATERTHRUSHES +WATERTIGHT +WATERTIGHTNESS +WATERWAY +WATERWAYS +WATERWEED +WATERWEEDS +WATERWHEEL +WATERWHEELS +WATERWORK +WATERWORKS +WATERWORN +WATERY +WATERZOOI +WATERZOOIS +WATS +WATT +WATTAGE +WATTAGES +WATTAPE +WATTAPES +WATTER +WATTEST +WATTHOUR +WATTHOURS +WATTLE +WATTLEBIRD +WATTLEBIRDS +WATTLED +WATTLES +WATTLESS +WATTLING +WATTMETER +WATTMETERS +WATTS +WAUCHT +WAUCHTED +WAUCHTING +WAUCHTS +WAUGH +WAUGHT +WAUGHTED +WAUGHTING +WAUGHTS +WAUK +WAUKED +WAUKING +WAUKS +WAUL +WAULED +WAULING +WAULS +WAUR +WAVE +WAVEBAND +WAVEBANDS +WAVED +WAVEFORM +WAVEFORMS +WAVEGUIDE +WAVEGUIDES +WAVELENGTH +WAVELENGTHS +WAVELESS +WAVELESSLY +WAVELET +WAVELETS +WAVELIKE +WAVELLITE +WAVELLITES +WAVEOFF +WAVEOFFS +WAVER +WAVERED +WAVERER +WAVERERS +WAVERING +WAVERINGLY +WAVERS +WAVERY +WAVES +WAVESHAPE +WAVESHAPES +WAVEY +WAVEYS +WAVICLE +WAVICLES +WAVIER +WAVIES +WAVIEST +WAVILY +WAVINESS +WAVINESSES +WAVING +WAVY +WAW +WAWL +WAWLED +WAWLING +WAWLS +WAWS +WAX +WAXABLE +WAXBERRIES +WAXBERRY +WAXBILL +WAXBILLS +WAXED +WAXEN +WAXER +WAXERS +WAXES +WAXIER +WAXIEST +WAXILY +WAXINESS +WAXINESSES +WAXING +WAXINGS +WAXLIKE +WAXPLANT +WAXPLANTS +WAXWEED +WAXWEEDS +WAXWING +WAXWINGS +WAXWORK +WAXWORKER +WAXWORKERS +WAXWORKS +WAXWORM +WAXWORMS +WAXY +WAY +WAYBILL +WAYBILLS +WAYFARER +WAYFARERS +WAYFARING +WAYFARINGS +WAYGOING +WAYGOINGS +WAYLAID +WAYLAY +WAYLAYER +WAYLAYERS +WAYLAYING +WAYLAYS +WAYLESS +WAYPOINT +WAYPOINTS +WAYS +WAYSIDE +WAYSIDES +WAYWARD +WAYWARDLY +WAYWARDNESS +WAYWARDNESSES +WAYWORN +WAZOO +WAZOOS +WE +WEAK +WEAKEN +WEAKENED +WEAKENER +WEAKENERS +WEAKENING +WEAKENS +WEAKER +WEAKEST +WEAKFISH +WEAKFISHES +WEAKHEARTED +WEAKISH +WEAKISHLY +WEAKLIER +WEAKLIEST +WEAKLINESS +WEAKLINESSES +WEAKLING +WEAKLINGS +WEAKLY +WEAKNESS +WEAKNESSES +WEAKON +WEAKONS +WEAKSIDE +WEAKSIDES +WEAL +WEALD +WEALDS +WEALS +WEALTH +WEALTHIER +WEALTHIEST +WEALTHILY +WEALTHINESS +WEALTHINESSES +WEALTHS +WEALTHY +WEAN +WEANED +WEANER +WEANERS +WEANING +WEANLING +WEANLINGS +WEANS +WEAPON +WEAPONED +WEAPONEER +WEAPONEERING +WEAPONEERS +WEAPONING +WEAPONIZE +WEAPONIZED +WEAPONIZES +WEAPONIZING +WEAPONLESS +WEAPONRIES +WEAPONRY +WEAPONS +WEAR +WEARABILITIES +WEARABILITY +WEARABLE +WEARABLES +WEARER +WEARERS +WEARIED +WEARIER +WEARIES +WEARIEST +WEARIFUL +WEARIFULLY +WEARIFULNESS +WEARIFULNESSES +WEARILESS +WEARILESSLY +WEARILY +WEARINESS +WEARINESSES +WEARING +WEARINGLY +WEARISH +WEARISOME +WEARISOMELY +WEARISOMENESS +WEARISOMENESSES +WEARPROOF +WEARS +WEARY +WEARYING +WEASAND +WEASANDS +WEASEL +WEASELED +WEASELING +WEASELLED +WEASELLING +WEASELLY +WEASELS +WEASELY +WEASON +WEASONS +WEATHER +WEATHERABILITY +WEATHERBOARD +WEATHERBOARDED +WEATHERBOARDING +WEATHERBOARDS +WEATHERCAST +WEATHERCASTER +WEATHERCASTERS +WEATHERCASTS +WEATHERCOCK +WEATHERCOCKS +WEATHERED +WEATHERGLASS +WEATHERGLASSES +WEATHERING +WEATHERINGS +WEATHERIZATION +WEATHERIZATIONS +WEATHERIZE +WEATHERIZED +WEATHERIZES +WEATHERIZING +WEATHERLY +WEATHERMAN +WEATHERMEN +WEATHERPERSON +WEATHERPERSONS +WEATHERPROOF +WEATHERPROOFED +WEATHERPROOFING +WEATHERPROOFS +WEATHERS +WEATHERWORN +WEAVE +WEAVED +WEAVER +WEAVERBIRD +WEAVERBIRDS +WEAVERS +WEAVES +WEAVING +WEAZAND +WEAZANDS +WEB +WEBBED +WEBBIER +WEBBIEST +WEBBING +WEBBINGS +WEBBY +WEBCAM +WEBCAMS +WEBCAST +WEBCASTED +WEBCASTER +WEBCASTERS +WEBCASTING +WEBCASTS +WEBER +WEBERS +WEBFED +WEBFEET +WEBFOOT +WEBLESS +WEBLIKE +WEBLOG +WEBLOGS +WEBMASTER +WEBMASTERS +WEBPAGE +WEBPAGES +WEBS +WEBSITE +WEBSITES +WEBSTER +WEBSTERS +WEBWORK +WEBWORKS +WEBWORM +WEBWORMS +WECHT +WECHTS +WED +WEDDED +WEDDER +WEDDERS +WEDDING +WEDDINGS +WEDEL +WEDELED +WEDELING +WEDELN +WEDELNS +WEDELS +WEDGE +WEDGED +WEDGELIKE +WEDGES +WEDGIE +WEDGIER +WEDGIES +WEDGIEST +WEDGING +WEDGY +WEDLOCK +WEDLOCKS +WEDS +WEE +WEED +WEEDED +WEEDER +WEEDERS +WEEDIER +WEEDIEST +WEEDILY +WEEDINESS +WEEDINESSES +WEEDING +WEEDLESS +WEEDLIKE +WEEDS +WEEDY +WEEK +WEEKDAY +WEEKDAYS +WEEKEND +WEEKENDED +WEEKENDER +WEEKENDERS +WEEKENDING +WEEKENDS +WEEKLIES +WEEKLONG +WEEKLY +WEEKNIGHT +WEEKNIGHTS +WEEKS +WEEL +WEEN +WEENED +WEENIE +WEENIER +WEENIES +WEENIEST +WEENING +WEENS +WEENSIER +WEENSIEST +WEENSY +WEENY +WEEP +WEEPER +WEEPERS +WEEPIE +WEEPIER +WEEPIES +WEEPIEST +WEEPINESS +WEEPINESSES +WEEPING +WEEPINGLY +WEEPINGS +WEEPS +WEEPY +WEER +WEES +WEEST +WEET +WEETED +WEETING +WEETS +WEEVER +WEEVERS +WEEVIL +WEEVILED +WEEVILLY +WEEVILS +WEEVILY +WEEWEE +WEEWEED +WEEWEEING +WEEWEES +WEFT +WEFTS +WEFTWISE +WEIGELA +WEIGELAS +WEIGELIA +WEIGELIAS +WEIGH +WEIGHABLE +WEIGHED +WEIGHER +WEIGHERS +WEIGHING +WEIGHMAN +WEIGHMEN +WEIGHS +WEIGHT +WEIGHTED +WEIGHTER +WEIGHTERS +WEIGHTIER +WEIGHTIEST +WEIGHTILY +WEIGHTINESS +WEIGHTINESSES +WEIGHTING +WEIGHTLESS +WEIGHTLESSLY +WEIGHTLESSNESS +WEIGHTS +WEIGHTY +WEIMARANER +WEIMARANERS +WEINER +WEINERS +WEIR +WEIRD +WEIRDED +WEIRDER +WEIRDEST +WEIRDIE +WEIRDIES +WEIRDING +WEIRDLY +WEIRDNESS +WEIRDNESSES +WEIRDO +WEIRDOES +WEIRDOS +WEIRDS +WEIRDY +WEIRS +WEISENHEIMER +WEISENHEIMERS +WEKA +WEKAS +WELCH +WELCHED +WELCHER +WELCHERS +WELCHES +WELCHING +WELCOME +WELCOMED +WELCOMELY +WELCOMENESS +WELCOMENESSES +WELCOMER +WELCOMERS +WELCOMES +WELCOMING +WELD +WELDABLE +WELDED +WELDER +WELDERS +WELDING +WELDLESS +WELDMENT +WELDMENTS +WELDOR +WELDORS +WELDS +WELFARE +WELFARES +WELFARISM +WELFARISMS +WELFARIST +WELFARISTS +WELKIN +WELKINS +WELL +WELLADAY +WELLADAYS +WELLAWAY +WELLAWAYS +WELLBORN +WELLCURB +WELLCURBS +WELLDOER +WELLDOERS +WELLED +WELLHEAD +WELLHEADS +WELLHOLE +WELLHOLES +WELLHOUSE +WELLHOUSES +WELLIE +WELLIES +WELLING +WELLNESS +WELLNESSES +WELLS +WELLSITE +WELLSITES +WELLSPRING +WELLSPRINGS +WELLY +WELSH +WELSHED +WELSHER +WELSHERS +WELSHES +WELSHING +WELT +WELTANSCHAUUNG +WELTANSCHAUUNGS +WELTED +WELTER +WELTERED +WELTERING +WELTERS +WELTERWEIGHT +WELTERWEIGHTS +WELTING +WELTINGS +WELTS +WELTSCHMERZ +WELTSCHMERZES +WEN +WENCH +WENCHED +WENCHER +WENCHERS +WENCHES +WENCHING +WEND +WENDED +WENDIGO +WENDIGOS +WENDING +WENDS +WENNIER +WENNIEST +WENNISH +WENNY +WENS +WENT +WENTLETRAP +WENTLETRAPS +WEPT +WERE +WEREGILD +WEREGILDS +WEREWOLF +WEREWOLVES +WERGELD +WERGELDS +WERGELT +WERGELTS +WERGILD +WERGILDS +WERNERITE +WERNERITES +WERT +WERWOLF +WERWOLVES +WESKIT +WESKITS +WESSAND +WESSANDS +WEST +WESTBOUND +WESTER +WESTERED +WESTERING +WESTERLIES +WESTERLY +WESTERN +WESTERNER +WESTERNERS +WESTERNISATION +WESTERNISATIONS +WESTERNISE +WESTERNISED +WESTERNISES +WESTERNISING +WESTERNIZATION +WESTERNIZATIONS +WESTERNIZE +WESTERNIZED +WESTERNIZES +WESTERNIZING +WESTERNMOST +WESTERNS +WESTERS +WESTING +WESTINGS +WESTMOST +WESTS +WESTWARD +WESTWARDS +WET +WETBACK +WETBACKS +WETHER +WETHERS +WETLAND +WETLANDS +WETLY +WETNESS +WETNESSES +WETPROOF +WETS +WETSUIT +WETSUITS +WETTABILITIES +WETTABILITY +WETTABLE +WETTED +WETTER +WETTERS +WETTEST +WETTING +WETTINGS +WETTISH +WETWARE +WETWARES +WHA +WHACK +WHACKED +WHACKER +WHACKERS +WHACKIER +WHACKIEST +WHACKING +WHACKO +WHACKOS +WHACKS +WHACKY +WHALE +WHALEBACK +WHALEBACKS +WHALEBOAT +WHALEBOATS +WHALEBONE +WHALEBONES +WHALED +WHALELIKE +WHALEMAN +WHALEMEN +WHALER +WHALERS +WHALES +WHALING +WHALINGS +WHAM +WHAMMED +WHAMMIES +WHAMMING +WHAMMO +WHAMMY +WHAMO +WHAMS +WHANG +WHANGED +WHANGEE +WHANGEES +WHANGING +WHANGS +WHAP +WHAPPED +WHAPPER +WHAPPERS +WHAPPING +WHAPS +WHARF +WHARFAGE +WHARFAGES +WHARFED +WHARFING +WHARFINGER +WHARFINGERS +WHARFMASTER +WHARFMASTERS +WHARFS +WHARVE +WHARVES +WHAT +WHATCHAMACALLIT +WHATEVER +WHATNESS +WHATNESSES +WHATNOT +WHATNOTS +WHATS +WHATSIS +WHATSISES +WHATSIT +WHATSITS +WHATSOEVER +WHAUP +WHAUPS +WHEAL +WHEALS +WHEAT +WHEATEAR +WHEATEARS +WHEATEN +WHEATENS +WHEATLAND +WHEATLANDS +WHEATLESS +WHEATS +WHEATWORM +WHEATWORMS +WHEE +WHEEDLE +WHEEDLED +WHEEDLER +WHEEDLERS +WHEEDLES +WHEEDLING +WHEEL +WHEELBARROW +WHEELBARROWED +WHEELBARROWING +WHEELBARROWS +WHEELBASE +WHEELBASES +WHEELCHAIR +WHEELCHAIRS +WHEELED +WHEELER +WHEELERS +WHEELHORSE +WHEELHORSES +WHEELHOUSE +WHEELHOUSES +WHEELIE +WHEELIES +WHEELING +WHEELINGS +WHEELLESS +WHEELMAN +WHEELMEN +WHEELS +WHEELSMAN +WHEELSMEN +WHEELWORK +WHEELWORKS +WHEELWRIGHT +WHEELWRIGHTS +WHEEN +WHEENS +WHEEP +WHEEPED +WHEEPING +WHEEPLE +WHEEPLED +WHEEPLES +WHEEPLING +WHEEPS +WHEEZE +WHEEZED +WHEEZER +WHEEZERS +WHEEZES +WHEEZIER +WHEEZIEST +WHEEZILY +WHEEZINESS +WHEEZINESSES +WHEEZING +WHEEZY +WHELK +WHELKIER +WHELKIEST +WHELKS +WHELKY +WHELM +WHELMED +WHELMING +WHELMS +WHELP +WHELPED +WHELPING +WHELPLESS +WHELPS +WHEN +WHENAS +WHENCE +WHENCESOEVER +WHENEVER +WHENS +WHENSOEVER +WHERE +WHEREABOUT +WHEREABOUTS +WHEREAS +WHEREASES +WHEREAT +WHEREBY +WHEREFORE +WHEREFORES +WHEREFROM +WHEREIN +WHEREINTO +WHEREOF +WHEREON +WHERES +WHERESOEVER +WHERETHROUGH +WHERETO +WHEREUNTO +WHEREUPON +WHEREVER +WHEREWITH +WHEREWITHAL +WHEREWITHALS +WHEREWITHS +WHERRIED +WHERRIES +WHERRY +WHERRYING +WHERVE +WHERVES +WHET +WHETHER +WHETS +WHETSTONE +WHETSTONES +WHETTED +WHETTER +WHETTERS +WHETTING +WHEW +WHEWS +WHEY +WHEYEY +WHEYFACE +WHEYFACED +WHEYFACES +WHEYISH +WHEYLIKE +WHEYS +WHICH +WHICHEVER +WHICHSOEVER +WHICKER +WHICKERED +WHICKERING +WHICKERS +WHID +WHIDAH +WHIDAHS +WHIDDED +WHIDDING +WHIDS +WHIFF +WHIFFED +WHIFFER +WHIFFERS +WHIFFET +WHIFFETS +WHIFFING +WHIFFLE +WHIFFLED +WHIFFLER +WHIFFLERS +WHIFFLES +WHIFFLETREE +WHIFFLETREES +WHIFFLING +WHIFFS +WHIG +WHIGMALEERIE +WHIGMALEERIES +WHIGS +WHILE +WHILED +WHILES +WHILING +WHILOM +WHILST +WHIM +WHIMBREL +WHIMBRELS +WHIMPER +WHIMPERED +WHIMPERER +WHIMPERERS +WHIMPERING +WHIMPERS +WHIMS +WHIMSEY +WHIMSEYS +WHIMSICAL +WHIMSICALITIES +WHIMSICALITY +WHIMSICALLY +WHIMSICALNESS +WHIMSICALNESSES +WHIMSIED +WHIMSIES +WHIMSY +WHIN +WHINCHAT +WHINCHATS +WHINE +WHINED +WHINER +WHINERS +WHINES +WHINEY +WHINGDING +WHINGDINGS +WHINGE +WHINGED +WHINGEING +WHINGER +WHINGERS +WHINGES +WHINGING +WHINIER +WHINIEST +WHININESS +WHININESSES +WHINING +WHININGLY +WHINNIED +WHINNIER +WHINNIES +WHINNIEST +WHINNY +WHINNYING +WHINS +WHINSTONE +WHINSTONES +WHINY +WHIP +WHIPCORD +WHIPCORDS +WHIPLASH +WHIPLASHES +WHIPLIKE +WHIPPED +WHIPPER +WHIPPERS +WHIPPERSNAPPER +WHIPPERSNAPPERS +WHIPPET +WHIPPETS +WHIPPIER +WHIPPIEST +WHIPPING +WHIPPINGS +WHIPPLETREE +WHIPPLETREES +WHIPPOORWILL +WHIPPOORWILLS +WHIPPY +WHIPRAY +WHIPRAYS +WHIPS +WHIPSAW +WHIPSAWED +WHIPSAWING +WHIPSAWN +WHIPSAWS +WHIPSNAKE +WHIPSNAKES +WHIPSTALL +WHIPSTALLS +WHIPSTITCH +WHIPSTITCHED +WHIPSTITCHES +WHIPSTITCHING +WHIPSTOCK +WHIPSTOCKS +WHIPT +WHIPTAIL +WHIPTAILS +WHIPWORM +WHIPWORMS +WHIR +WHIRL +WHIRLED +WHIRLER +WHIRLERS +WHIRLIER +WHIRLIES +WHIRLIEST +WHIRLIGIG +WHIRLIGIGS +WHIRLING +WHIRLPOOL +WHIRLPOOLS +WHIRLS +WHIRLWIND +WHIRLWINDS +WHIRLY +WHIRLYBIRD +WHIRLYBIRDS +WHIRR +WHIRRED +WHIRRIED +WHIRRIES +WHIRRING +WHIRRS +WHIRRY +WHIRRYING +WHIRS +WHISH +WHISHED +WHISHES +WHISHING +WHISHT +WHISHTED +WHISHTING +WHISHTS +WHISK +WHISKED +WHISKER +WHISKERED +WHISKERS +WHISKERY +WHISKEY +WHISKEYS +WHISKIES +WHISKING +WHISKS +WHISKY +WHISPER +WHISPERED +WHISPERER +WHISPERERS +WHISPERING +WHISPERINGLY +WHISPERINGS +WHISPERS +WHISPERY +WHIST +WHISTED +WHISTING +WHISTLE +WHISTLEABLE +WHISTLED +WHISTLER +WHISTLERS +WHISTLES +WHISTLING +WHISTLINGS +WHISTS +WHIT +WHITE +WHITEBAIT +WHITEBAITS +WHITEBEARD +WHITEBEARDS +WHITECAP +WHITECAPS +WHITECOMB +WHITECOMBS +WHITED +WHITEFACE +WHITEFACES +WHITEFISH +WHITEFISHES +WHITEFLIES +WHITEFLY +WHITEHEAD +WHITEHEADS +WHITELY +WHITEN +WHITENED +WHITENER +WHITENERS +WHITENESS +WHITENESSES +WHITENING +WHITENINGS +WHITENS +WHITEOUT +WHITEOUTS +WHITER +WHITES +WHITESMITH +WHITESMITHS +WHITEST +WHITETAIL +WHITETAILS +WHITETHROAT +WHITETHROATS +WHITEWALL +WHITEWALLS +WHITEWASH +WHITEWASHED +WHITEWASHER +WHITEWASHERS +WHITEWASHES +WHITEWASHING +WHITEWASHINGS +WHITEWING +WHITEWINGS +WHITEWOOD +WHITEWOODS +WHITEY +WHITEYS +WHITHER +WHITHERSOEVER +WHITHERWARD +WHITIER +WHITIES +WHITIEST +WHITING +WHITINGS +WHITISH +WHITLOW +WHITLOWS +WHITRACK +WHITRACKS +WHITS +WHITTER +WHITTERS +WHITTLE +WHITTLED +WHITTLER +WHITTLERS +WHITTLES +WHITTLING +WHITTLINGS +WHITTRET +WHITTRETS +WHITY +WHIZ +WHIZBANG +WHIZBANGS +WHIZZ +WHIZZBANG +WHIZZBANGS +WHIZZED +WHIZZER +WHIZZERS +WHIZZES +WHIZZIER +WHIZZIEST +WHIZZING +WHIZZY +WHO +WHOA +WHODUNIT +WHODUNITS +WHODUNNIT +WHODUNNITS +WHOEVER +WHOLE +WHOLEHEARTED +WHOLEHEARTEDLY +WHOLEMEAL +WHOLENESS +WHOLENESSES +WHOLES +WHOLESALE +WHOLESALED +WHOLESALER +WHOLESALERS +WHOLESALES +WHOLESALING +WHOLESOME +WHOLESOMELY +WHOLESOMENESS +WHOLESOMENESSES +WHOLESOMER +WHOLESOMEST +WHOLISM +WHOLISMS +WHOLISTIC +WHOLLY +WHOM +WHOMEVER +WHOMP +WHOMPED +WHOMPING +WHOMPS +WHOMSO +WHOMSOEVER +WHOOF +WHOOFED +WHOOFING +WHOOFS +WHOOP +WHOOPED +WHOOPEE +WHOOPEES +WHOOPER +WHOOPERS +WHOOPIE +WHOOPIES +WHOOPING +WHOOPLA +WHOOPLAS +WHOOPS +WHOOSH +WHOOSHED +WHOOSHES +WHOOSHING +WHOOSIS +WHOOSISES +WHOP +WHOPPED +WHOPPER +WHOPPERS +WHOPPING +WHOPS +WHORE +WHORED +WHOREDOM +WHOREDOMS +WHOREHOUSE +WHOREHOUSES +WHOREMASTER +WHOREMASTERS +WHOREMONGER +WHOREMONGERS +WHORES +WHORESON +WHORESONS +WHORING +WHORISH +WHORISHLY +WHORL +WHORLED +WHORLS +WHORT +WHORTLE +WHORTLEBERRIES +WHORTLEBERRY +WHORTLES +WHORTS +WHOSE +WHOSESOEVER +WHOSEVER +WHOSIS +WHOSISES +WHOSO +WHOSOEVER +WHUMP +WHUMPED +WHUMPING +WHUMPS +WHUP +WHUPPED +WHUPPING +WHUPS +WHY +WHYDAH +WHYDAHS +WHYS +WICCA +WICCAN +WICCANS +WICCAS +WICH +WICHES +WICK +WICKAPE +WICKAPES +WICKED +WICKEDER +WICKEDEST +WICKEDLY +WICKEDNESS +WICKEDNESSES +WICKER +WICKERS +WICKERWORK +WICKERWORKS +WICKET +WICKETS +WICKING +WICKINGS +WICKIUP +WICKIUPS +WICKLESS +WICKS +WICKYUP +WICKYUPS +WICOPIES +WICOPY +WIDDER +WIDDERS +WIDDERSHINS +WIDDIE +WIDDIES +WIDDLE +WIDDLED +WIDDLES +WIDDLING +WIDDY +WIDE +WIDEAWAKE +WIDEAWAKES +WIDEBAND +WIDEBODIES +WIDEBODY +WIDELY +WIDEMOUTHED +WIDEN +WIDENED +WIDENER +WIDENERS +WIDENESS +WIDENESSES +WIDENING +WIDENS +WIDEOUT +WIDEOUTS +WIDER +WIDES +WIDESPREAD +WIDEST +WIDGEON +WIDGEONS +WIDGET +WIDGETS +WIDISH +WIDOW +WIDOWBIRD +WIDOWBIRDS +WIDOWED +WIDOWER +WIDOWERED +WIDOWERHOOD +WIDOWERHOODS +WIDOWERS +WIDOWHOOD +WIDOWHOODS +WIDOWING +WIDOWS +WIDTH +WIDTHS +WIDTHWAY +WIDTHWAYS +WIDTHWISE +WIELD +WIELDABLE +WIELDED +WIELDER +WIELDERS +WIELDIER +WIELDIEST +WIELDING +WIELDS +WIELDY +WIENER +WIENERS +WIENERWURST +WIENERWURSTS +WIENIE +WIENIES +WIFE +WIFED +WIFEDOM +WIFEDOMS +WIFEHOOD +WIFEHOODS +WIFELESS +WIFELIER +WIFELIEST +WIFELIKE +WIFELINESS +WIFELINESSES +WIFELY +WIFES +WIFEY +WIFEYS +WIFING +WIFTIER +WIFTIEST +WIFTY +WIG +WIGAN +WIGANS +WIGEON +WIGEONS +WIGGED +WIGGERIES +WIGGERY +WIGGIER +WIGGIEST +WIGGING +WIGGINGS +WIGGLE +WIGGLED +WIGGLER +WIGGLERS +WIGGLES +WIGGLIER +WIGGLIEST +WIGGLING +WIGGLY +WIGGY +WIGHT +WIGHTS +WIGLESS +WIGLET +WIGLETS +WIGLIKE +WIGMAKER +WIGMAKERS +WIGS +WIGWAG +WIGWAGGED +WIGWAGGER +WIGWAGGERS +WIGWAGGING +WIGWAGS +WIGWAM +WIGWAMS +WIKIUP +WIKIUPS +WILCO +WILD +WILDCARD +WILDCARDS +WILDCAT +WILDCATS +WILDCATTED +WILDCATTER +WILDCATTERS +WILDCATTING +WILDEBEEST +WILDEBEESTS +WILDED +WILDER +WILDERED +WILDERING +WILDERMENT +WILDERMENTS +WILDERNESS +WILDERNESSES +WILDERS +WILDEST +WILDFIRE +WILDFIRES +WILDFLOWER +WILDFLOWERS +WILDFOWL +WILDFOWLER +WILDFOWLERS +WILDFOWLING +WILDFOWLINGS +WILDFOWLS +WILDING +WILDINGS +WILDISH +WILDLAND +WILDLANDS +WILDLIFE +WILDLING +WILDLINGS +WILDLY +WILDNESS +WILDNESSES +WILDS +WILDWOOD +WILDWOODS +WILE +WILED +WILES +WILFUL +WILFULLY +WILIER +WILIEST +WILILY +WILINESS +WILINESSES +WILING +WILL +WILLABLE +WILLED +WILLEMITE +WILLEMITES +WILLER +WILLERS +WILLET +WILLETS +WILLFUL +WILLFULLY +WILLFULNESS +WILLFULNESSES +WILLIE +WILLIED +WILLIES +WILLING +WILLINGER +WILLINGEST +WILLINGLY +WILLINGNESS +WILLINGNESSES +WILLIWAU +WILLIWAUS +WILLIWAW +WILLIWAWS +WILLOW +WILLOWED +WILLOWER +WILLOWERS +WILLOWIER +WILLOWIEST +WILLOWING +WILLOWLIKE +WILLOWS +WILLOWWARE +WILLOWWARES +WILLOWY +WILLPOWER +WILLPOWERS +WILLS +WILLY +WILLYARD +WILLYART +WILLYING +WILLYWAW +WILLYWAWS +WILT +WILTED +WILTING +WILTS +WILY +WIMBLE +WIMBLED +WIMBLES +WIMBLING +WIMMIN +WIMP +WIMPED +WIMPIER +WIMPIEST +WIMPINESS +WIMPINESSES +WIMPING +WIMPISH +WIMPISHNESS +WIMPISHNESSES +WIMPLE +WIMPLED +WIMPLES +WIMPLING +WIMPS +WIMPY +WIN +WINCE +WINCED +WINCER +WINCERS +WINCES +WINCEY +WINCEYS +WINCH +WINCHED +WINCHER +WINCHERS +WINCHES +WINCHING +WINCING +WIND +WINDABLE +WINDAGE +WINDAGES +WINDBAG +WINDBAGS +WINDBELL +WINDBELLS +WINDBLAST +WINDBLASTS +WINDBLOWN +WINDBREAK +WINDBREAKER +WINDBREAKERS +WINDBREAKS +WINDBURN +WINDBURNED +WINDBURNING +WINDBURNS +WINDBURNT +WINDCHILL +WINDCHILLS +WINDED +WINDER +WINDERS +WINDFALL +WINDFALLS +WINDFLAW +WINDFLAWS +WINDFLOWER +WINDFLOWERS +WINDGALL +WINDGALLS +WINDHOVER +WINDHOVERS +WINDIER +WINDIEST +WINDIGO +WINDIGOS +WINDILY +WINDINESS +WINDINESSES +WINDING +WINDINGLY +WINDINGS +WINDJAMMER +WINDJAMMERS +WINDJAMMING +WINDJAMMINGS +WINDLASS +WINDLASSED +WINDLASSES +WINDLASSING +WINDLE +WINDLED +WINDLES +WINDLESS +WINDLESSLY +WINDLESTRAW +WINDLESTRAWS +WINDLING +WINDLINGS +WINDMILL +WINDMILLED +WINDMILLING +WINDMILLS +WINDOW +WINDOWED +WINDOWING +WINDOWLESS +WINDOWPANE +WINDOWPANES +WINDOWS +WINDOWSILL +WINDOWSILLS +WINDOWY +WINDPIPE +WINDPIPES +WINDPROOF +WINDROW +WINDROWED +WINDROWER +WINDROWERS +WINDROWING +WINDROWS +WINDS +WINDSCREEN +WINDSCREENS +WINDSHIELD +WINDSHIELDS +WINDSOCK +WINDSOCKS +WINDSTORM +WINDSTORMS +WINDSURF +WINDSURFED +WINDSURFING +WINDSURFINGS +WINDSURFS +WINDSWEPT +WINDTHROW +WINDTHROWS +WINDUP +WINDUPS +WINDWARD +WINDWARDS +WINDWAY +WINDWAYS +WINDY +WINE +WINED +WINEGLASS +WINEGLASSES +WINEGROWER +WINEGROWERS +WINELESS +WINEMAKER +WINEMAKERS +WINEPRESS +WINEPRESSES +WINERIES +WINERY +WINES +WINESAP +WINESAPS +WINESHOP +WINESHOPS +WINESKIN +WINESKINS +WINESOP +WINESOPS +WINEY +WING +WINGBACK +WINGBACKS +WINGBOW +WINGBOWS +WINGCHAIR +WINGCHAIRS +WINGDING +WINGDINGS +WINGED +WINGEDLY +WINGER +WINGERS +WINGIER +WINGIEST +WINGING +WINGLESS +WINGLESSNESS +WINGLESSNESSES +WINGLET +WINGLETS +WINGLIKE +WINGMAN +WINGMEN +WINGOVER +WINGOVERS +WINGS +WINGSPAN +WINGSPANS +WINGSPREAD +WINGSPREADS +WINGTIP +WINGTIPS +WINGY +WINIER +WINIEST +WINING +WINISH +WINK +WINKED +WINKER +WINKERS +WINKING +WINKINGLY +WINKLE +WINKLED +WINKLES +WINKLING +WINKS +WINLESS +WINNABLE +WINNED +WINNER +WINNERS +WINNING +WINNINGLY +WINNINGS +WINNOCK +WINNOCKS +WINNOW +WINNOWED +WINNOWER +WINNOWERS +WINNOWING +WINNOWS +WINO +WINOES +WINOS +WINS +WINSOME +WINSOMELY +WINSOMENESS +WINSOMENESSES +WINSOMER +WINSOMEST +WINTER +WINTERBERRIES +WINTERBERRY +WINTERED +WINTERER +WINTERERS +WINTERFED +WINTERFEED +WINTERFEEDING +WINTERFEEDS +WINTERGREEN +WINTERGREENS +WINTERIER +WINTERIEST +WINTERING +WINTERISH +WINTERIZATION +WINTERIZATIONS +WINTERIZE +WINTERIZED +WINTERIZES +WINTERIZING +WINTERKILL +WINTERKILLS +WINTERLY +WINTERS +WINTERTIDE +WINTERTIDES +WINTERTIME +WINTERTIMES +WINTERY +WINTLE +WINTLED +WINTLES +WINTLING +WINTRIER +WINTRIEST +WINTRILY +WINTRINESS +WINTRINESSES +WINTRY +WINY +WINZE +WINZES +WIPE +WIPED +WIPEOUT +WIPEOUTS +WIPER +WIPERS +WIPES +WIPING +WIRABLE +WIRE +WIRED +WIREDRAW +WIREDRAWER +WIREDRAWERS +WIREDRAWING +WIREDRAWN +WIREDRAWS +WIREDREW +WIREGRASS +WIREGRASSES +WIREHAIR +WIREHAIRED +WIREHAIRS +WIRELESS +WIRELESSED +WIRELESSES +WIRELESSING +WIRELIKE +WIREMAN +WIREMEN +WIREPHOTO +WIREPHOTOS +WIRER +WIRERS +WIRES +WIRETAP +WIRETAPPED +WIRETAPPER +WIRETAPPERS +WIRETAPPING +WIRETAPS +WIREWAY +WIREWAYS +WIREWORK +WIREWORKS +WIREWORM +WIREWORMS +WIRIER +WIRIEST +WIRILY +WIRINESS +WIRINESSES +WIRING +WIRINGS +WIRRA +WIRY +WIS +WISDOM +WISDOMS +WISE +WISEACRE +WISEACRES +WISEASS +WISEASSES +WISECRACK +WISECRACKED +WISECRACKER +WISECRACKERS +WISECRACKING +WISECRACKS +WISED +WISEGUY +WISEGUYS +WISELIER +WISELIEST +WISELY +WISENESS +WISENESSES +WISENHEIMER +WISENHEIMERS +WISENT +WISENTS +WISER +WISES +WISEST +WISEWOMAN +WISEWOMEN +WISH +WISHA +WISHBONE +WISHBONES +WISHED +WISHER +WISHERS +WISHES +WISHFUL +WISHFULLY +WISHFULNESS +WISHFULNESSES +WISHING +WISHLESS +WISING +WISP +WISPED +WISPIER +WISPIEST +WISPILY +WISPINESS +WISPINESSES +WISPING +WISPISH +WISPLIKE +WISPS +WISPY +WISS +WISSED +WISSES +WISSING +WIST +WISTARIA +WISTARIAS +WISTED +WISTERIA +WISTERIAS +WISTFUL +WISTFULLY +WISTFULNESS +WISTFULNESSES +WISTING +WISTS +WIT +WITAN +WITANS +WITCH +WITCHCRAFT +WITCHCRAFTS +WITCHED +WITCHERIES +WITCHERY +WITCHES +WITCHGRASS +WITCHGRASSES +WITCHHOOD +WITCHHOODS +WITCHIER +WITCHIEST +WITCHING +WITCHINGS +WITCHLIKE +WITCHWEED +WITCHWEEDS +WITCHY +WITE +WITED +WITENAGEMOT +WITENAGEMOTE +WITENAGEMOTES +WITENAGEMOTS +WITES +WITH +WITHAL +WITHDRAW +WITHDRAWABLE +WITHDRAWAL +WITHDRAWALS +WITHDRAWING +WITHDRAWN +WITHDRAWNNESS +WITHDRAWNNESSES +WITHDRAWS +WITHDREW +WITHE +WITHED +WITHER +WITHERED +WITHERER +WITHERERS +WITHERING +WITHERINGLY +WITHERITE +WITHERITES +WITHEROD +WITHERODS +WITHERS +WITHERSHINS +WITHES +WITHHELD +WITHHOLD +WITHHOLDER +WITHHOLDERS +WITHHOLDING +WITHHOLDS +WITHIER +WITHIES +WITHIEST +WITHIN +WITHINDOORS +WITHING +WITHINS +WITHOUT +WITHOUTDOORS +WITHOUTS +WITHSTAND +WITHSTANDING +WITHSTANDS +WITHSTOOD +WITHY +WITING +WITLESS +WITLESSLY +WITLESSNESS +WITLESSNESSES +WITLING +WITLINGS +WITLOOF +WITLOOFS +WITNESS +WITNESSED +WITNESSER +WITNESSERS +WITNESSES +WITNESSING +WITNEY +WITNEYS +WITS +WITTED +WITTICISM +WITTICISMS +WITTIER +WITTIEST +WITTILY +WITTINESS +WITTINESSES +WITTING +WITTINGLY +WITTINGS +WITTOL +WITTOLS +WITTY +WIVE +WIVED +WIVER +WIVERN +WIVERNS +WIVERS +WIVES +WIVING +WIZ +WIZARD +WIZARDLY +WIZARDRIES +WIZARDRY +WIZARDS +WIZEN +WIZENED +WIZENING +WIZENS +WIZES +WIZZEN +WIZZENS +WIZZES +WO +WOAD +WOADED +WOADS +WOADWAX +WOADWAXEN +WOADWAXENS +WOADWAXES +WOALD +WOALDS +WOBBLE +WOBBLED +WOBBLER +WOBBLERS +WOBBLES +WOBBLIER +WOBBLIES +WOBBLIEST +WOBBLINESS +WOBBLINESSES +WOBBLING +WOBBLY +WOBEGONE +WODGE +WODGES +WOE +WOEBEGONE +WOEBEGONENESS +WOEBEGONENESSES +WOEFUL +WOEFULLER +WOEFULLEST +WOEFULLY +WOEFULNESS +WOEFULNESSES +WOENESS +WOENESSES +WOES +WOESOME +WOFUL +WOFULLER +WOFULLEST +WOFULLY +WOG +WOGGISH +WOGS +WOK +WOKE +WOKEN +WOKS +WOLD +WOLDS +WOLF +WOLFBERRIES +WOLFBERRY +WOLFED +WOLFER +WOLFERS +WOLFFISH +WOLFFISHES +WOLFHOUND +WOLFHOUNDS +WOLFING +WOLFISH +WOLFISHLY +WOLFISHNESS +WOLFISHNESSES +WOLFLIKE +WOLFRAM +WOLFRAMITE +WOLFRAMITES +WOLFRAMS +WOLFS +WOLFSBANE +WOLFSBANES +WOLLASTONITE +WOLLASTONITES +WOLVER +WOLVERINE +WOLVERINES +WOLVERS +WOLVES +WOMAN +WOMANED +WOMANHOOD +WOMANHOODS +WOMANING +WOMANISE +WOMANISED +WOMANISES +WOMANISH +WOMANISHLY +WOMANISHNESS +WOMANISHNESSES +WOMANISING +WOMANISM +WOMANISMS +WOMANIST +WOMANISTS +WOMANIZE +WOMANIZED +WOMANIZER +WOMANIZERS +WOMANIZES +WOMANIZING +WOMANKIND +WOMANLESS +WOMANLIER +WOMANLIEST +WOMANLIKE +WOMANLINESS +WOMANLINESSES +WOMANLY +WOMANNESS +WOMANNESSES +WOMANPOWER +WOMANPOWERS +WOMANS +WOMB +WOMBAT +WOMBATS +WOMBED +WOMBIER +WOMBIEST +WOMBS +WOMBY +WOMEN +WOMENFOLK +WOMENFOLKS +WOMENKIND +WOMERA +WOMERAS +WOMMERA +WOMMERAS +WOMYN +WON +WONDER +WONDERED +WONDERER +WONDERERS +WONDERFUL +WONDERFULLY +WONDERFULNESS +WONDERFULNESSES +WONDERING +WONDERLAND +WONDERLANDS +WONDERMENT +WONDERMENTS +WONDERS +WONDERWORK +WONDERWORKS +WONDROUS +WONDROUSLY +WONDROUSNESS +WONDROUSNESSES +WONK +WONKIER +WONKIEST +WONKS +WONKY +WONNED +WONNER +WONNERS +WONNING +WONS +WONT +WONTED +WONTEDLY +WONTEDNESS +WONTEDNESSES +WONTING +WONTON +WONTONS +WONTS +WOO +WOOD +WOODBIN +WOODBIND +WOODBINDS +WOODBINE +WOODBINES +WOODBINS +WOODBLOCK +WOODBLOCKS +WOODBORER +WOODBORERS +WOODBOX +WOODBOXES +WOODCHAT +WOODCHATS +WOODCHOPPER +WOODCHOPPERS +WOODCHUCK +WOODCHUCKS +WOODCOCK +WOODCOCKS +WOODCRAFT +WOODCRAFTS +WOODCUT +WOODCUTS +WOODCUTTER +WOODCUTTERS +WOODCUTTING +WOODCUTTINGS +WOODED +WOODEN +WOODENER +WOODENEST +WOODENHEAD +WOODENHEADED +WOODENHEADS +WOODENLY +WOODENNESS +WOODENNESSES +WOODENWARE +WOODENWARES +WOODGRAIN +WOODGRAINS +WOODHEN +WOODHENS +WOODIE +WOODIER +WOODIES +WOODIEST +WOODINESS +WOODINESSES +WOODING +WOODLAND +WOODLANDER +WOODLANDERS +WOODLANDS +WOODLARK +WOODLARKS +WOODLESS +WOODLORE +WOODLORES +WOODLOT +WOODLOTS +WOODMAN +WOODMEN +WOODNOTE +WOODNOTES +WOODPECKER +WOODPECKERS +WOODPILE +WOODPILES +WOODRUFF +WOODRUFFS +WOODS +WOODSHED +WOODSHEDDED +WOODSHEDDING +WOODSHEDS +WOODSIA +WOODSIAS +WOODSIER +WOODSIEST +WOODSMAN +WOODSMEN +WOODSTOVE +WOODSTOVES +WOODSY +WOODTONE +WOODTONES +WOODWAX +WOODWAXEN +WOODWAXENS +WOODWAXES +WOODWIND +WOODWINDS +WOODWORK +WOODWORKER +WOODWORKERS +WOODWORKING +WOODWORKINGS +WOODWORKS +WOODWORM +WOODWORMS +WOODY +WOOED +WOOER +WOOERS +WOOF +WOOFED +WOOFER +WOOFERS +WOOFING +WOOFS +WOOING +WOOINGLY +WOOL +WOOLED +WOOLEN +WOOLENS +WOOLER +WOOLERS +WOOLFELL +WOOLFELLS +WOOLGATHERER +WOOLGATHERERS +WOOLGATHERING +WOOLGATHERINGS +WOOLHAT +WOOLHATS +WOOLIE +WOOLIER +WOOLIES +WOOLIEST +WOOLINESS +WOOLINESSES +WOOLLED +WOOLLEN +WOOLLENS +WOOLLIER +WOOLLIES +WOOLLIEST +WOOLLIKE +WOOLLILY +WOOLLINESS +WOOLLINESSES +WOOLLY +WOOLMAN +WOOLMEN +WOOLPACK +WOOLPACKS +WOOLS +WOOLSACK +WOOLSACKS +WOOLSHED +WOOLSHEDS +WOOLSKIN +WOOLSKINS +WOOLWORK +WOOLWORKS +WOOLY +WOOMERA +WOOMERAS +WOOPS +WOOPSED +WOOPSES +WOOPSING +WOORALI +WOORALIS +WOORARI +WOORARIS +WOOS +WOOSH +WOOSHED +WOOSHES +WOOSHING +WOOZIER +WOOZIEST +WOOZILY +WOOZINESS +WOOZINESSES +WOOZY +WOP +WOPS +WORD +WORDAGE +WORDAGES +WORDBOOK +WORDBOOKS +WORDED +WORDIER +WORDIEST +WORDILY +WORDINESS +WORDINESSES +WORDING +WORDINGS +WORDLESS +WORDLESSLY +WORDLESSNESS +WORDLESSNESSES +WORDMONGER +WORDMONGERS +WORDPLAY +WORDPLAYS +WORDS +WORDSMITH +WORDSMITHERIES +WORDSMITHERY +WORDSMITHS +WORDY +WORE +WORK +WORKABILITIES +WORKABILITY +WORKABLE +WORKABLENESS +WORKABLENESSES +WORKABLY +WORKADAY +WORKAHOLIC +WORKAHOLICS +WORKAHOLISM +WORKAHOLISMS +WORKBAG +WORKBAGS +WORKBASKET +WORKBASKETS +WORKBENCH +WORKBENCHES +WORKBOAT +WORKBOATS +WORKBOOK +WORKBOOKS +WORKBOX +WORKBOXES +WORKDAY +WORKDAYS +WORKED +WORKER +WORKERS +WORKFARE +WORKFARES +WORKFLOW +WORKFLOWS +WORKFOLK +WORKFOLKS +WORKFORCE +WORKFORCES +WORKHORSE +WORKHORSES +WORKHOUR +WORKHOURS +WORKHOUSE +WORKHOUSES +WORKING +WORKINGMAN +WORKINGMEN +WORKINGS +WORKINGWOMAN +WORKINGWOMEN +WORKLESS +WORKLESSNESS +WORKLESSNESSES +WORKLOAD +WORKLOADS +WORKMAN +WORKMANLIKE +WORKMANLY +WORKMANSHIP +WORKMANSHIPS +WORKMATE +WORKMATES +WORKMEN +WORKOUT +WORKOUTS +WORKPEOPLE +WORKPIECE +WORKPIECES +WORKPLACE +WORKPLACES +WORKPRINT +WORKPRINTS +WORKROOM +WORKROOMS +WORKS +WORKSHEET +WORKSHEETS +WORKSHOP +WORKSHOPS +WORKSPACE +WORKSPACES +WORKSTATION +WORKSTATIONS +WORKTABLE +WORKTABLES +WORKUP +WORKUPS +WORKWEEK +WORKWEEKS +WORKWOMAN +WORKWOMEN +WORLD +WORLDBEAT +WORLDBEATS +WORLDLIER +WORLDLIEST +WORLDLINESS +WORLDLINESSES +WORLDLING +WORLDLINGS +WORLDLY +WORLDS +WORLDVIEW +WORLDVIEWS +WORLDWIDE +WORM +WORMED +WORMER +WORMERS +WORMGEAR +WORMGEARS +WORMHOLE +WORMHOLES +WORMIER +WORMIEST +WORMIL +WORMILS +WORMINESS +WORMINESSES +WORMING +WORMISH +WORMLIKE +WORMROOT +WORMROOTS +WORMS +WORMSEED +WORMSEEDS +WORMWOOD +WORMWOODS +WORMY +WORN +WORNNESS +WORNNESSES +WORRIED +WORRIEDLY +WORRIER +WORRIERS +WORRIES +WORRIMENT +WORRIMENTS +WORRISOME +WORRISOMELY +WORRISOMENESS +WORRISOMENESSES +WORRIT +WORRITED +WORRITING +WORRITS +WORRY +WORRYING +WORRYWART +WORRYWARTS +WORSE +WORSEN +WORSENED +WORSENING +WORSENS +WORSER +WORSES +WORSET +WORSETS +WORSHIP +WORSHIPED +WORSHIPER +WORSHIPERS +WORSHIPFUL +WORSHIPFULLY +WORSHIPFULNESS +WORSHIPING +WORSHIPLESS +WORSHIPPED +WORSHIPPER +WORSHIPPERS +WORSHIPPING +WORSHIPS +WORST +WORSTED +WORSTEDS +WORSTING +WORSTS +WORT +WORTH +WORTHED +WORTHFUL +WORTHIER +WORTHIES +WORTHIEST +WORTHILY +WORTHINESS +WORTHINESSES +WORTHING +WORTHLESS +WORTHLESSLY +WORTHLESSNESS +WORTHLESSNESSES +WORTHS +WORTHWHILE +WORTHWHILENESS +WORTHY +WORTS +WOS +WOST +WOT +WOTS +WOTTED +WOTTING +WOULD +WOULDEST +WOULDST +WOUND +WOUNDED +WOUNDEDLY +WOUNDING +WOUNDLESS +WOUNDS +WOUNDWORT +WOUNDWORTS +WOVE +WOVEN +WOVENS +WOW +WOWED +WOWING +WOWS +WOWSER +WOWSERS +WRACK +WRACKED +WRACKFUL +WRACKING +WRACKS +WRAITH +WRAITHLIKE +WRAITHS +WRANG +WRANGLE +WRANGLED +WRANGLER +WRANGLERS +WRANGLES +WRANGLING +WRANGS +WRAP +WRAPAROUND +WRAPAROUNDS +WRAPPED +WRAPPER +WRAPPERS +WRAPPING +WRAPPINGS +WRAPS +WRAPT +WRASSE +WRASSES +WRASSLE +WRASSLED +WRASSLES +WRASSLING +WRASTLE +WRASTLED +WRASTLES +WRASTLING +WRATH +WRATHED +WRATHFUL +WRATHFULLY +WRATHFULNESS +WRATHFULNESSES +WRATHIER +WRATHIEST +WRATHILY +WRATHING +WRATHS +WRATHY +WREAK +WREAKED +WREAKER +WREAKERS +WREAKING +WREAKS +WREATH +WREATHE +WREATHED +WREATHEN +WREATHER +WREATHERS +WREATHES +WREATHING +WREATHS +WREATHY +WRECK +WRECKAGE +WRECKAGES +WRECKED +WRECKER +WRECKERS +WRECKFUL +WRECKING +WRECKINGS +WRECKS +WREN +WRENCH +WRENCHED +WRENCHER +WRENCHERS +WRENCHES +WRENCHING +WRENCHINGLY +WRENS +WREST +WRESTED +WRESTER +WRESTERS +WRESTING +WRESTLE +WRESTLED +WRESTLER +WRESTLERS +WRESTLES +WRESTLING +WRESTLINGS +WRESTS +WRETCH +WRETCHED +WRETCHEDER +WRETCHEDEST +WRETCHEDLY +WRETCHEDNESS +WRETCHEDNESSES +WRETCHES +WRICK +WRICKED +WRICKING +WRICKS +WRIED +WRIER +WRIES +WRIEST +WRIGGLE +WRIGGLED +WRIGGLER +WRIGGLERS +WRIGGLES +WRIGGLIER +WRIGGLIEST +WRIGGLING +WRIGGLY +WRIGHT +WRIGHTS +WRING +WRINGED +WRINGER +WRINGERS +WRINGING +WRINGS +WRINKLE +WRINKLED +WRINKLES +WRINKLIER +WRINKLIEST +WRINKLING +WRINKLY +WRIST +WRISTBAND +WRISTBANDS +WRISTIER +WRISTIEST +WRISTLET +WRISTLETS +WRISTLOCK +WRISTLOCKS +WRISTS +WRISTWATCH +WRISTWATCHES +WRISTY +WRIT +WRITABLE +WRITE +WRITEABLE +WRITER +WRITERLY +WRITERS +WRITES +WRITHE +WRITHED +WRITHEN +WRITHER +WRITHERS +WRITHES +WRITHING +WRITING +WRITINGS +WRITS +WRITTEN +WRONG +WRONGDOER +WRONGDOERS +WRONGDOING +WRONGDOINGS +WRONGED +WRONGER +WRONGERS +WRONGEST +WRONGFUL +WRONGFULLY +WRONGFULNESS +WRONGFULNESSES +WRONGHEADED +WRONGHEADEDLY +WRONGHEADEDNESS +WRONGING +WRONGLY +WRONGNESS +WRONGNESSES +WRONGS +WROTE +WROTH +WROTHFUL +WROUGHT +WRUNG +WRY +WRYER +WRYEST +WRYING +WRYLY +WRYNECK +WRYNECKS +WRYNESS +WRYNESSES +WUD +WULFENITE +WULFENITES +WUNDERKIND +WUNDERKINDER +WURST +WURSTS +WURTZITE +WURTZITES +WURZEL +WURZELS +WUSHU +WUSS +WUSSES +WUSSIER +WUSSIES +WUSSIEST +WUSSY +WUTHER +WUTHERED +WUTHERING +WUTHERS +WYANDOTTE +WYANDOTTES +WYCH +WYCHES +WYE +WYES +WYLE +WYLED +WYLES +WYLIECOAT +WYLIECOATS +WYLING +WYN +WYND +WYNDS +WYNN +WYNNS +WYNS +WYTE +WYTED +WYTES +WYTING +WYVERN +WYVERNS +XANTHAN +XANTHANS +XANTHATE +XANTHATES +XANTHEIN +XANTHEINS +XANTHENE +XANTHENES +XANTHIC +XANTHIN +XANTHINE +XANTHINES +XANTHINS +XANTHOMA +XANTHOMAS +XANTHOMATA +XANTHONE +XANTHONES +XANTHOPHYLL +XANTHOPHYLLS +XANTHOUS +XEBEC +XEBECS +XENIA +XENIAL +XENIAS +XENIC +XENOBIOTIC +XENOBIOTICS +XENOBLAST +XENOBLASTS +XENOCRYST +XENOCRYSTS +XENODIAGNOSES +XENODIAGNOSIS +XENODIAGNOSTIC +XENOGAMIES +XENOGAMY +XENOGENEIC +XENOGENIC +XENOGENIES +XENOGENY +XENOGRAFT +XENOGRAFTS +XENOLITH +XENOLITHIC +XENOLITHS +XENON +XENONS +XENOPHILE +XENOPHILES +XENOPHOBE +XENOPHOBES +XENOPHOBIA +XENOPHOBIAS +XENOPHOBIC +XENOPHOBICALLY +XENOPUS +XENOPUSES +XENOTROPIC +XERARCH +XERIC +XERICALLY +XERISCAPE +XERISCAPES +XERODERMA +XERODERMAE +XERODERMAS +XEROGRAPHIC +XEROGRAPHICALLY +XEROGRAPHIES +XEROGRAPHY +XEROPHILE +XEROPHILIES +XEROPHILOUS +XEROPHILY +XEROPHTHALMIA +XEROPHTHALMIAS +XEROPHTHALMIC +XEROPHYTE +XEROPHYTES +XEROPHYTIC +XEROPHYTISM +XEROPHYTISMS +XERORADIOGRAPHY +XEROSERE +XEROSERES +XEROSES +XEROSIS +XEROTHERMIC +XEROTIC +XEROX +XEROXED +XEROXES +XEROXING +XERUS +XERUSES +XI +XIPHISTERNA +XIPHISTERNUM +XIPHOID +XIPHOIDS +XIS +XU +XYLAN +XYLANS +XYLEM +XYLEMS +XYLENE +XYLENES +XYLIDIN +XYLIDINE +XYLIDINES +XYLIDINS +XYLITOL +XYLITOLS +XYLOCARP +XYLOCARPS +XYLOGRAPH +XYLOGRAPHED +XYLOGRAPHER +XYLOGRAPHERS +XYLOGRAPHIC +XYLOGRAPHICAL +XYLOGRAPHIES +XYLOGRAPHING +XYLOGRAPHS +XYLOGRAPHY +XYLOID +XYLOL +XYLOLS +XYLOPHAGE +XYLOPHAGES +XYLOPHAGOUS +XYLOPHONE +XYLOPHONES +XYLOPHONIST +XYLOPHONISTS +XYLOSE +XYLOSES +XYLOTOMIES +XYLOTOMY +XYLYL +XYLYLS +XYST +XYSTER +XYSTERS +XYSTI +XYSTOI +XYSTOS +XYSTS +XYSTUS +YA +YABBER +YABBERED +YABBERING +YABBERS +YABBIE +YABBIES +YABBY +YACHT +YACHTED +YACHTER +YACHTERS +YACHTING +YACHTINGS +YACHTMAN +YACHTMEN +YACHTS +YACHTSMAN +YACHTSMEN +YACK +YACKED +YACKING +YACKS +YAFF +YAFFED +YAFFING +YAFFS +YAG +YAGER +YAGERS +YAGI +YAGIS +YAGS +YAH +YAHOO +YAHOOISM +YAHOOISMS +YAHOOS +YAHRZEIT +YAHRZEITS +YAIRD +YAIRDS +YAK +YAKITORI +YAKITORIS +YAKKED +YAKKER +YAKKERS +YAKKING +YAKS +YAKUZA +YALD +YAM +YAMALKA +YAMALKAS +YAMEN +YAMENS +YAMMER +YAMMERED +YAMMERER +YAMMERERS +YAMMERING +YAMMERS +YAMS +YAMULKA +YAMULKAS +YAMUN +YAMUNS +YANG +YANGS +YANK +YANKED +YANKING +YANKS +YANQUI +YANQUIS +YANTRA +YANTRAS +YAP +YAPOCK +YAPOCKS +YAPOK +YAPOKS +YAPON +YAPONS +YAPPED +YAPPER +YAPPERS +YAPPING +YAPPINGLY +YAPS +YAR +YARD +YARDAGE +YARDAGES +YARDARM +YARDARMS +YARDBIRD +YARDBIRDS +YARDED +YARDER +YARDERS +YARDING +YARDLAND +YARDLANDS +YARDMAN +YARDMASTER +YARDMASTERS +YARDMEN +YARDS +YARDSTICK +YARDSTICKS +YARDWAND +YARDWANDS +YARDWORK +YARDWORKS +YARE +YARELY +YARER +YAREST +YARMELKE +YARMELKES +YARMULKE +YARMULKES +YARN +YARNED +YARNER +YARNERS +YARNING +YARNS +YARROW +YARROWS +YASHMAC +YASHMACS +YASHMAK +YASHMAKS +YASMAK +YASMAKS +YATAGAN +YATAGANS +YATAGHAN +YATAGHANS +YATTER +YATTERED +YATTERING +YATTERS +YAUD +YAUDS +YAULD +YAUP +YAUPED +YAUPER +YAUPERS +YAUPING +YAUPON +YAUPONS +YAUPS +YAUTIA +YAUTIAS +YAW +YAWED +YAWEY +YAWING +YAWL +YAWLED +YAWLING +YAWLS +YAWMETER +YAWMETERS +YAWN +YAWNED +YAWNER +YAWNERS +YAWNING +YAWNINGLY +YAWNS +YAWP +YAWPED +YAWPER +YAWPERS +YAWPING +YAWPINGS +YAWPS +YAWS +YAY +YAYS +YCLAD +YCLEPED +YCLEPT +YE +YEA +YEAH +YEAHS +YEALING +YEALINGS +YEAN +YEANED +YEANING +YEANLING +YEANLINGS +YEANS +YEAR +YEARBOOK +YEARBOOKS +YEAREND +YEARENDS +YEARLIES +YEARLING +YEARLINGS +YEARLONG +YEARLY +YEARN +YEARNED +YEARNER +YEARNERS +YEARNING +YEARNINGLY +YEARNINGS +YEARNS +YEARS +YEAS +YEASAYER +YEASAYERS +YEAST +YEASTED +YEASTIER +YEASTIEST +YEASTILY +YEASTINESS +YEASTINESSES +YEASTING +YEASTLESS +YEASTLIKE +YEASTS +YEASTY +YECCH +YECCHS +YECH +YECHS +YECHY +YEELIN +YEELINS +YEGG +YEGGMAN +YEGGMEN +YEGGS +YEH +YELD +YELK +YELKS +YELL +YELLED +YELLER +YELLERS +YELLING +YELLOW +YELLOWED +YELLOWER +YELLOWEST +YELLOWFIN +YELLOWFINS +YELLOWHAMMER +YELLOWHAMMERS +YELLOWING +YELLOWISH +YELLOWLEGS +YELLOWLY +YELLOWS +YELLOWTAIL +YELLOWTAILS +YELLOWTHROAT +YELLOWTHROATS +YELLOWWARE +YELLOWWARES +YELLOWWOOD +YELLOWWOODS +YELLOWY +YELLS +YELP +YELPED +YELPER +YELPERS +YELPING +YELPS +YEN +YENNED +YENNING +YENS +YENTA +YENTAS +YENTE +YENTES +YEOMAN +YEOMANLY +YEOMANRIES +YEOMANRY +YEOMEN +YEP +YEPS +YERBA +YERBAS +YERK +YERKED +YERKING +YERKS +YES +YESES +YESHIVA +YESHIVAH +YESHIVAHS +YESHIVAS +YESHIVOT +YESHIVOTH +YESSED +YESSES +YESSING +YESTER +YESTERDAY +YESTERDAYS +YESTEREVE +YESTEREVES +YESTERN +YESTERNIGHT +YESTERNIGHTS +YESTERYEAR +YESTERYEARS +YESTREEN +YESTREENS +YET +YETI +YETIS +YETT +YETTS +YEUK +YEUKED +YEUKING +YEUKS +YEUKY +YEW +YEWS +YID +YIDS +YIELD +YIELDABLE +YIELDED +YIELDER +YIELDERS +YIELDING +YIELDS +YIKES +YILL +YILLS +YIN +YINCE +YINS +YIP +YIPE +YIPES +YIPPED +YIPPEE +YIPPIE +YIPPIES +YIPPING +YIPS +YIRD +YIRDS +YIRR +YIRRED +YIRRING +YIRRS +YIRTH +YIRTHS +YLEM +YLEMS +YO +YOB +YOBBO +YOBBOES +YOBBOS +YOBS +YOCK +YOCKED +YOCKING +YOCKS +YOCTOSECOND +YOCTOSECONDS +YOD +YODEL +YODELED +YODELER +YODELERS +YODELING +YODELLED +YODELLER +YODELLERS +YODELLING +YODELS +YODH +YODHS +YODLE +YODLED +YODLER +YODLERS +YODLES +YODLING +YODS +YOGA +YOGAS +YOGEE +YOGEES +YOGH +YOGHOURT +YOGHOURTS +YOGHS +YOGHURT +YOGHURTS +YOGI +YOGIC +YOGIN +YOGINI +YOGINIS +YOGINS +YOGIS +YOGURT +YOGURTS +YOHIMBE +YOHIMBES +YOHIMBINE +YOHIMBINES +YOICKS +YOK +YOKE +YOKED +YOKEFELLOW +YOKEFELLOWS +YOKEL +YOKELESS +YOKELISH +YOKELS +YOKEMATE +YOKEMATES +YOKES +YOKING +YOKOZUNA +YOKOZUNAS +YOKS +YOLK +YOLKED +YOLKIER +YOLKIEST +YOLKS +YOLKY +YOM +YOMIM +YON +YOND +YONDER +YONI +YONIC +YONIS +YONKER +YONKERS +YORE +YORES +YOTTABYTE +YOTTABYTES +YOU +YOUNG +YOUNGBERRIES +YOUNGBERRY +YOUNGER +YOUNGERS +YOUNGEST +YOUNGISH +YOUNGLING +YOUNGLINGS +YOUNGNESS +YOUNGNESSES +YOUNGS +YOUNGSTER +YOUNGSTERS +YOUNKER +YOUNKERS +YOUPON +YOUPONS +YOUR +YOURN +YOURS +YOURSELF +YOURSELVES +YOUS +YOUSE +YOUTH +YOUTHEN +YOUTHENED +YOUTHENING +YOUTHENS +YOUTHFUL +YOUTHFULLY +YOUTHFULNESS +YOUTHFULNESSES +YOUTHQUAKE +YOUTHQUAKES +YOUTHS +YOW +YOWE +YOWED +YOWES +YOWIE +YOWIES +YOWING +YOWL +YOWLED +YOWLER +YOWLERS +YOWLING +YOWLS +YOWS +YPERITE +YPERITES +YTTERBIA +YTTERBIAS +YTTERBIC +YTTERBIUM +YTTERBIUMS +YTTERBOUS +YTTRIA +YTTRIAS +YTTRIC +YTTRIUM +YTTRIUMS +YUAN +YUANS +YUCA +YUCAS +YUCCA +YUCCAS +YUCCH +YUCH +YUCK +YUCKED +YUCKIER +YUCKIEST +YUCKINESS +YUCKINESSES +YUCKING +YUCKS +YUCKY +YUGA +YUGAS +YUK +YUKKED +YUKKIER +YUKKIEST +YUKKING +YUKKY +YUKS +YULAN +YULANS +YULE +YULES +YULETIDE +YULETIDES +YUM +YUMMIER +YUMMIES +YUMMIEST +YUMMINESS +YUMMINESSES +YUMMY +YUP +YUPON +YUPONS +YUPPIE +YUPPIEDOM +YUPPIEDOMS +YUPPIEISH +YUPPIES +YUPPIFIED +YUPPIFIES +YUPPIFY +YUPPIFYING +YUPPY +YUPS +YURT +YURTA +YURTS +YUTZ +YUTZES +YWIS +ZA +ZABAGLIONE +ZABAGLIONES +ZABAIONE +ZABAIONES +ZABAJONE +ZABAJONES +ZACATON +ZACATONS +ZADDICK +ZADDIK +ZADDIKIM +ZAFFAR +ZAFFARS +ZAFFER +ZAFFERS +ZAFFIR +ZAFFIRS +ZAFFRE +ZAFFRES +ZAFTIG +ZAG +ZAGGED +ZAGGING +ZAGS +ZAIBATSU +ZAIKAI +ZAIKAIS +ZAIRE +ZAIRES +ZAMARRA +ZAMARRAS +ZAMARRO +ZAMARROS +ZAMIA +ZAMIAS +ZAMINDAR +ZAMINDARI +ZAMINDARIS +ZAMINDARS +ZANANA +ZANANAS +ZANDER +ZANDERS +ZANIER +ZANIES +ZANIEST +ZANILY +ZANINESS +ZANINESSES +ZANY +ZANYISH +ZANZA +ZANZAS +ZAP +ZAPATEADO +ZAPATEADOS +ZAPATEO +ZAPATEOS +ZAPPED +ZAPPER +ZAPPERS +ZAPPIER +ZAPPIEST +ZAPPING +ZAPPY +ZAPS +ZAPTIAH +ZAPTIAHS +ZAPTIEH +ZAPTIEHS +ZARATITE +ZARATITES +ZAREBA +ZAREBAS +ZAREEBA +ZAREEBAS +ZARF +ZARFS +ZARIBA +ZARIBAS +ZARZUELA +ZARZUELAS +ZAS +ZASTRUGA +ZASTRUGI +ZAX +ZAXES +ZAYIN +ZAYINS +ZAZEN +ZAZENS +ZEAL +ZEALOT +ZEALOTRIES +ZEALOTRY +ZEALOTS +ZEALOUS +ZEALOUSLY +ZEALOUSNESS +ZEALOUSNESSES +ZEALS +ZEATIN +ZEATINS +ZEBEC +ZEBECK +ZEBECKS +ZEBECS +ZEBRA +ZEBRAFISH +ZEBRAFISHES +ZEBRAIC +ZEBRANO +ZEBRANOS +ZEBRAS +ZEBRASS +ZEBRASSES +ZEBRAWOOD +ZEBRAWOODS +ZEBRINE +ZEBRINES +ZEBROID +ZEBU +ZEBUS +ZECCHIN +ZECCHINI +ZECCHINO +ZECCHINOS +ZECCHINS +ZECHIN +ZECHINS +ZED +ZEDOARIES +ZEDOARY +ZEDS +ZEE +ZEES +ZEIN +ZEINS +ZEITGEBER +ZEITGEBERS +ZEITGEIST +ZEITGEISTS +ZEK +ZEKS +ZELKOVA +ZELKOVAS +ZEMINDAR +ZEMINDARIES +ZEMINDARS +ZEMINDARY +ZEMSTVA +ZEMSTVO +ZEMSTVOS +ZENAIDA +ZENAIDAS +ZENANA +ZENANAS +ZENITH +ZENITHAL +ZENITHS +ZEOLITE +ZEOLITES +ZEOLITIC +ZEP +ZEPHYR +ZEPHYRS +ZEPPELIN +ZEPPELINS +ZEPPOLE +ZEPPOLES +ZEPPOLI +ZEPS +ZEPTOSECOND +ZEPTOSECONDS +ZERK +ZERKS +ZERO +ZEROED +ZEROES +ZEROING +ZEROS +ZEROTH +ZEST +ZESTED +ZESTER +ZESTERS +ZESTFUL +ZESTFULLY +ZESTFULNESS +ZESTFULNESSES +ZESTIER +ZESTIEST +ZESTILY +ZESTING +ZESTLESS +ZESTS +ZESTY +ZETA +ZETAS +ZETTABYTE +ZETTABYTES +ZEUGMA +ZEUGMAS +ZEUGMATIC +ZIBELINE +ZIBELINES +ZIBELLINE +ZIBELLINES +ZIBET +ZIBETH +ZIBETHS +ZIBETS +ZIDOVUDINE +ZIDOVUDINES +ZIG +ZIGGED +ZIGGING +ZIGGURAT +ZIGGURATS +ZIGS +ZIGZAG +ZIGZAGGED +ZIGZAGGER +ZIGZAGGERS +ZIGZAGGING +ZIGZAGGY +ZIGZAGS +ZIKKURAT +ZIKKURATS +ZIKURAT +ZIKURATS +ZILCH +ZILCHES +ZILL +ZILLAH +ZILLAHS +ZILLION +ZILLIONAIRE +ZILLIONAIRES +ZILLIONS +ZILLIONTH +ZILLS +ZIN +ZINC +ZINCATE +ZINCATES +ZINCED +ZINCIC +ZINCIFIED +ZINCIFIES +ZINCIFY +ZINCIFYING +ZINCING +ZINCITE +ZINCITES +ZINCKED +ZINCKING +ZINCKY +ZINCOID +ZINCOUS +ZINCS +ZINCY +ZINE +ZINEB +ZINEBS +ZINES +ZINFANDEL +ZINFANDELS +ZING +ZINGANI +ZINGANO +ZINGARA +ZINGARE +ZINGARI +ZINGARO +ZINGED +ZINGER +ZINGERS +ZINGIER +ZINGIEST +ZINGING +ZINGS +ZINGY +ZINKENITE +ZINKENITES +ZINKIFIED +ZINKIFIES +ZINKIFY +ZINKIFYING +ZINKY +ZINNIA +ZINNIAS +ZINS +ZIP +ZIPLESS +ZIPLOCK +ZIPPED +ZIPPER +ZIPPERED +ZIPPERING +ZIPPERS +ZIPPIER +ZIPPIEST +ZIPPING +ZIPPY +ZIPS +ZIRAM +ZIRAMS +ZIRCALOY +ZIRCALOYS +ZIRCON +ZIRCONIA +ZIRCONIAS +ZIRCONIC +ZIRCONIUM +ZIRCONIUMS +ZIRCONS +ZIT +ZITHER +ZITHERIST +ZITHERISTS +ZITHERN +ZITHERNS +ZITHERS +ZITI +ZITIS +ZITS +ZIZIT +ZIZITH +ZIZZLE +ZIZZLED +ZIZZLES +ZIZZLING +ZLOTE +ZLOTIES +ZLOTY +ZLOTYCH +ZLOTYS +ZOA +ZOANTHARIAN +ZOANTHARIANS +ZOARIA +ZOARIAL +ZOARIUM +ZOCALO +ZOCALOS +ZODIAC +ZODIACAL +ZODIACS +ZOEA +ZOEAE +ZOEAL +ZOEAS +ZOECIA +ZOECIUM +ZOFTIG +ZOIC +ZOISITE +ZOISITES +ZOMBI +ZOMBIE +ZOMBIELIKE +ZOMBIES +ZOMBIFICATION +ZOMBIFICATIONS +ZOMBIFIED +ZOMBIFIES +ZOMBIFY +ZOMBIFYING +ZOMBIISM +ZOMBIISMS +ZOMBIS +ZONA +ZONAE +ZONAL +ZONALLY +ZONARY +ZONATE +ZONATED +ZONATION +ZONATIONS +ZONE +ZONED +ZONELESS +ZONER +ZONERS +ZONES +ZONETIME +ZONETIMES +ZONING +ZONK +ZONKED +ZONKING +ZONKS +ZONULA +ZONULAE +ZONULAR +ZONULAS +ZONULE +ZONULES +ZOO +ZOOCHORE +ZOOCHORES +ZOOECIA +ZOOECIUM +ZOOEY +ZOOGAMETE +ZOOGAMETES +ZOOGENIC +ZOOGENIES +ZOOGENOUS +ZOOGENY +ZOOGEOGRAPHER +ZOOGEOGRAPHERS +ZOOGEOGRAPHIC +ZOOGEOGRAPHICAL +ZOOGEOGRAPHIES +ZOOGEOGRAPHY +ZOOGLEA +ZOOGLEAE +ZOOGLEAL +ZOOGLEAS +ZOOGLOEA +ZOOGLOEAE +ZOOGLOEAL +ZOOGLOEAS +ZOOGLOEIC +ZOOGRAPHIES +ZOOGRAPHY +ZOOID +ZOOIDAL +ZOOIDS +ZOOIER +ZOOIEST +ZOOKEEPER +ZOOKEEPERS +ZOOKS +ZOOLATER +ZOOLATERS +ZOOLATRIES +ZOOLATRY +ZOOLOGIC +ZOOLOGICAL +ZOOLOGICALLY +ZOOLOGIES +ZOOLOGIST +ZOOLOGISTS +ZOOLOGY +ZOOM +ZOOMANIA +ZOOMANIAS +ZOOMED +ZOOMETRIC +ZOOMETRIES +ZOOMETRY +ZOOMING +ZOOMORPH +ZOOMORPHIC +ZOOMORPHS +ZOOMS +ZOON +ZOONAL +ZOONED +ZOONING +ZOONOSES +ZOONOSIS +ZOONOTIC +ZOONS +ZOOPHILE +ZOOPHILES +ZOOPHILIA +ZOOPHILIAS +ZOOPHILIC +ZOOPHILIES +ZOOPHILOUS +ZOOPHILY +ZOOPHOBE +ZOOPHOBES +ZOOPHOBIA +ZOOPHOBIAS +ZOOPHYTE +ZOOPHYTES +ZOOPHYTIC +ZOOPLANKTER +ZOOPLANKTERS +ZOOPLANKTON +ZOOPLANKTONIC +ZOOPLANKTONS +ZOOS +ZOOSPERM +ZOOSPERMS +ZOOSPORANGIA +ZOOSPORANGIUM +ZOOSPORE +ZOOSPORES +ZOOSPORIC +ZOOSTEROL +ZOOSTEROLS +ZOOTECHNICAL +ZOOTECHNICS +ZOOTIER +ZOOTIEST +ZOOTOMIC +ZOOTOMIES +ZOOTOMIST +ZOOTOMISTS +ZOOTOMY +ZOOTY +ZOOXANTHELLA +ZOOXANTHELLAE +ZORI +ZORIL +ZORILLA +ZORILLAS +ZORILLE +ZORILLES +ZORILLO +ZORILLOS +ZORILS +ZORIS +ZOSTER +ZOSTERS +ZOUAVE +ZOUAVES +ZOUK +ZOUKS +ZOUNDS +ZOWIE +ZOYSIA +ZOYSIAS +ZUCCHETTI +ZUCCHETTO +ZUCCHETTOS +ZUCCHINI +ZUCCHINIS +ZUGZWANG +ZUGZWANGS +ZUZ +ZUZIM +ZWIEBACK +ZWIEBACKS +ZWITTERION +ZWITTERIONIC +ZWITTERIONS +ZYDECO +ZYDECOS +ZYGAPOPHYSES +ZYGAPOPHYSIS +ZYGODACTYL +ZYGODACTYLOUS +ZYGOID +ZYGOMA +ZYGOMAS +ZYGOMATA +ZYGOMATIC +ZYGOMATICS +ZYGOMORPHIC +ZYGOMORPHIES +ZYGOMORPHY +ZYGOSE +ZYGOSES +ZYGOSIS +ZYGOSITIES +ZYGOSITY +ZYGOSPORE +ZYGOSPORES +ZYGOTE +ZYGOTENE +ZYGOTENES +ZYGOTES +ZYGOTIC +ZYMASE +ZYMASES +ZYME +ZYMES +ZYMOGEN +ZYMOGENE +ZYMOGENES +ZYMOGENIC +ZYMOGENS +ZYMOGRAM +ZYMOGRAMS +ZYMOLOGIC +ZYMOLOGIES +ZYMOLOGY +ZYMOLYSES +ZYMOLYSIS +ZYMOLYTIC +ZYMOMETER +ZYMOMETERS +ZYMOSAN +ZYMOSANS +ZYMOSES +ZYMOSIS +ZYMOTIC +ZYMURGIES +ZYMURGY +ZYZZYVA +ZYZZYVAS +ZZZ \ No newline at end of file diff --git a/core-java/src/test/resources/file.txt b/core-java-io/src/test/resources/file.txt similarity index 100% rename from core-java/src/test/resources/file.txt rename to core-java-io/src/test/resources/file.txt diff --git a/core-java/src/test/resources/fileToRead.txt b/core-java-io/src/test/resources/fileToRead.txt similarity index 100% rename from core-java/src/test/resources/fileToRead.txt rename to core-java-io/src/test/resources/fileToRead.txt diff --git a/core-java-io/src/test/resources/fileToWriteTo.txt b/core-java-io/src/test/resources/fileToWriteTo.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-io/src/test/resources/initialFile.txt b/core-java-io/src/test/resources/initialFile.txt new file mode 100644 index 0000000000..7d572d5b9d --- /dev/null +++ b/core-java-io/src/test/resources/initialFile.txt @@ -0,0 +1 @@ +With Commons IO \ No newline at end of file diff --git a/core-java-io/src/test/resources/original.txt b/core-java-io/src/test/resources/original.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core-java-io/src/test/resources/sample.txt b/core-java-io/src/test/resources/sample.txt new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-io/src/test/resources/sample.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/core-java-io/src/test/resources/targetFile.tmp b/core-java-io/src/test/resources/targetFile.tmp new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-io/src/test/resources/targetFile.tmp @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/core-java-io/src/test/resources/targetFile.txt b/core-java-io/src/test/resources/targetFile.txt new file mode 100644 index 0000000000..424a8d0d1e --- /dev/null +++ b/core-java-io/src/test/resources/targetFile.txt @@ -0,0 +1 @@ +Some textSome text \ No newline at end of file diff --git a/core-java-io/src/test/resources/test.find b/core-java-io/src/test/resources/test.find new file mode 100644 index 0000000000..0cb7d51df1 --- /dev/null +++ b/core-java-io/src/test/resources/test.find @@ -0,0 +1 @@ +Test of JNDI on file. \ No newline at end of file diff --git a/core-java/src/test/resources/testFolder/sample_file_1.in b/core-java-io/src/test/resources/testFolder/sample_file_1.in similarity index 100% rename from core-java/src/test/resources/testFolder/sample_file_1.in rename to core-java-io/src/test/resources/testFolder/sample_file_1.in diff --git a/core-java/src/test/resources/testFolder/sample_file_2.in b/core-java-io/src/test/resources/testFolder/sample_file_2.in similarity index 100% rename from core-java/src/test/resources/testFolder/sample_file_2.in rename to core-java-io/src/test/resources/testFolder/sample_file_2.in diff --git a/core-java-io/src/test/resources/test_read.in b/core-java-io/src/test/resources/test_read.in new file mode 100644 index 0000000000..70c379b63f --- /dev/null +++ b/core-java-io/src/test/resources/test_read.in @@ -0,0 +1 @@ +Hello world \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read1.in b/core-java-io/src/test/resources/test_read1.in new file mode 100644 index 0000000000..1e46242993 --- /dev/null +++ b/core-java-io/src/test/resources/test_read1.in @@ -0,0 +1 @@ +Hello world 1 \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read2.in b/core-java-io/src/test/resources/test_read2.in new file mode 100644 index 0000000000..fe47dc003b --- /dev/null +++ b/core-java-io/src/test/resources/test_read2.in @@ -0,0 +1 @@ +2,3 4 \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read3.in b/core-java-io/src/test/resources/test_read3.in new file mode 100644 index 0000000000..db9f25a672 --- /dev/null +++ b/core-java-io/src/test/resources/test_read3.in @@ -0,0 +1 @@ +Hello 1 \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read4.in b/core-java-io/src/test/resources/test_read4.in new file mode 100644 index 0000000000..5727d54bfc Binary files /dev/null and b/core-java-io/src/test/resources/test_read4.in differ diff --git a/core-java-io/src/test/resources/test_read7.in b/core-java-io/src/test/resources/test_read7.in new file mode 100644 index 0000000000..28d4d45d43 --- /dev/null +++ b/core-java-io/src/test/resources/test_read7.in @@ -0,0 +1 @@ +青空 \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read8.in b/core-java-io/src/test/resources/test_read8.in new file mode 100644 index 0000000000..10fc1aac8a --- /dev/null +++ b/core-java-io/src/test/resources/test_read8.in @@ -0,0 +1,2 @@ +Hello world + Test line diff --git a/core-java-io/src/test/resources/test_read_d.in b/core-java-io/src/test/resources/test_read_d.in new file mode 100644 index 0000000000..82bbb4071f --- /dev/null +++ b/core-java-io/src/test/resources/test_read_d.in @@ -0,0 +1 @@ +John,Adam-Tom \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_read_multiple.in b/core-java-io/src/test/resources/test_read_multiple.in new file mode 100644 index 0000000000..7d64000a76 --- /dev/null +++ b/core-java-io/src/test/resources/test_read_multiple.in @@ -0,0 +1,2 @@ +Hello world +Hi, John \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_write.txt b/core-java-io/src/test/resources/test_write.txt new file mode 100644 index 0000000000..a15aad69b5 --- /dev/null +++ b/core-java-io/src/test/resources/test_write.txt @@ -0,0 +1 @@ +Some StringProduct name is iPhone and its price is 1000 $ \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_write_1.txt b/core-java-io/src/test/resources/test_write_1.txt new file mode 100644 index 0000000000..5727d54bfc Binary files /dev/null and b/core-java-io/src/test/resources/test_write_1.txt differ diff --git a/core-java-io/src/test/resources/test_write_2.txt b/core-java-io/src/test/resources/test_write_2.txt new file mode 100644 index 0000000000..6a87dfc075 Binary files /dev/null and b/core-java-io/src/test/resources/test_write_2.txt differ diff --git a/core-java-io/src/test/resources/test_write_3.txt b/core-java-io/src/test/resources/test_write_3.txt new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-io/src/test/resources/test_write_3.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/core-java-io/src/test/resources/test_write_4.txt b/core-java-io/src/test/resources/test_write_4.txt new file mode 100644 index 0000000000..f14fca61f6 Binary files /dev/null and b/core-java-io/src/test/resources/test_write_4.txt differ diff --git a/core-java-io/src/test/resources/test_write_5.txt b/core-java-io/src/test/resources/test_write_5.txt new file mode 100644 index 0000000000..5ab2f8a432 --- /dev/null +++ b/core-java-io/src/test/resources/test_write_5.txt @@ -0,0 +1 @@ +Hello \ No newline at end of file diff --git a/core-java-sun/.gitignore b/core-java-sun/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-sun/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-sun/README.md b/core-java-sun/README.md new file mode 100644 index 0000000000..9cf8b26f1b --- /dev/null +++ b/core-java-sun/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java Cookbooks and Examples + +### Relevant Articles: +- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) diff --git a/core-java-sun/pom.xml b/core-java-sun/pom.xml new file mode 100644 index 0000000000..11aa21f44d --- /dev/null +++ b/core-java-sun/pom.xml @@ -0,0 +1,489 @@ + + 4.0.0 + com.baeldung + core-java-sun + 0.1.0-SNAPSHOT + jar + + core-java-sun + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + org.unix4j + unix4j-command + ${unix4j.version} + + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + junit + junit + ${junit.version} + test + + + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + commons-codec + commons-codec + ${commons-codec.version} + + + + org.javamoney + moneta + 1.1 + + + + org.owasp.esapi + esapi + 2.1.0.1 + + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + org.springframework + spring-web + 4.3.4.RELEASE + + + com.sun + tools + 1.8.0 + system + ${java.home}/../lib/tools.jar + + + + + core-java + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + + + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + 2.8.5 + + + 1.7.21 + 1.1.7 + + + 23.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + + + 1.3 + 4.12 + 2.8.9 + 3.6.1 + 1.7.0 + + + 3.7.0 + 2.19.1 + + \ No newline at end of file diff --git a/spring-jpa/.gitignore b/core-java-sun/src/main/java/com/baeldung/.gitignore similarity index 100% rename from spring-jpa/.gitignore rename to core-java-sun/src/main/java/com/baeldung/.gitignore diff --git a/core-java-sun/src/main/java/com/baeldung/README.md b/core-java-sun/src/main/java/com/baeldung/README.md new file mode 100644 index 0000000000..51809b2882 --- /dev/null +++ b/core-java-sun/src/main/java/com/baeldung/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) diff --git a/core-java-sun/src/main/java/com/baeldung/javac/Positive.java b/core-java-sun/src/main/java/com/baeldung/javac/Positive.java new file mode 100644 index 0000000000..443b866fea --- /dev/null +++ b/core-java-sun/src/main/java/com/baeldung/javac/Positive.java @@ -0,0 +1,9 @@ +package com.baeldung.javac; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.PARAMETER}) +public @interface Positive { +} diff --git a/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java b/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java new file mode 100644 index 0000000000..eb48d6a216 --- /dev/null +++ b/core-java-sun/src/main/java/com/baeldung/javac/SampleJavacPlugin.java @@ -0,0 +1,123 @@ +package com.baeldung.javac; + +import com.sun.source.tree.MethodTree; +import com.sun.source.tree.VariableTree; +import com.sun.source.util.*; +import com.sun.tools.javac.api.BasicJavacTask; +import com.sun.tools.javac.code.TypeTag; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.TreeMaker; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Name; +import com.sun.tools.javac.util.Names; + +import javax.tools.JavaCompiler; +import java.util.*; +import java.util.stream.Collectors; + +import static com.sun.tools.javac.util.List.nil; + +/** + * A {@link JavaCompiler javac} plugin which inserts {@code >= 0} checks into resulting {@code *.class} files + * for numeric method parameters marked by {@link Positive} + */ +public class SampleJavacPlugin implements Plugin { + + public static final String NAME = "MyPlugin"; + + private static Set TARGET_TYPES = new HashSet<>(Arrays.asList( + // Use only primitive types for simplicity + byte.class.getName(), short.class.getName(), char.class.getName(), + int.class.getName(), long.class.getName(), float.class.getName(), double.class.getName())); + + @Override + public String getName() { + return NAME; + } + + @Override + public void init(JavacTask task, String... args) { + Context context = ((BasicJavacTask) task).getContext(); + task.addTaskListener(new TaskListener() { + @Override + public void started(TaskEvent e) { + } + + @Override + public void finished(TaskEvent e) { + if (e.getKind() != TaskEvent.Kind.PARSE) { + return; + } + e.getCompilationUnit() + .accept(new TreeScanner() { + @Override + public Void visitMethod(MethodTree method, Void v) { + List parametersToInstrument = method.getParameters() + .stream() + .filter(SampleJavacPlugin.this::shouldInstrument) + .collect(Collectors.toList()); + if (!parametersToInstrument.isEmpty()) { + // There is a possible case that more than one argument is marked by @Positive, + // as the checks are added to the method's body beginning, we process parameters RTL + // to ensure correct order. + Collections.reverse(parametersToInstrument); + parametersToInstrument.forEach(p -> addCheck(method, p, context)); + } + // There is a possible case that there is a nested class declared in a method's body, + // hence, we want to proceed with method body AST as well. + return super.visitMethod(method, v); + } + }, null); + } + }); + } + + private boolean shouldInstrument(VariableTree parameter) { + return TARGET_TYPES.contains(parameter.getType().toString()) + && parameter.getModifiers().getAnnotations() + .stream() + .anyMatch(a -> Positive.class.getSimpleName().equals(a.getAnnotationType().toString())); + } + + private void addCheck(MethodTree method, VariableTree parameter, Context context) { + JCTree.JCIf check = createCheck(parameter, context); + JCTree.JCBlock body = (JCTree.JCBlock) method.getBody(); + body.stats = body.stats.prepend(check); + } + + private static JCTree.JCIf createCheck(VariableTree parameter, Context context) { + TreeMaker factory = TreeMaker.instance(context); + Names symbolsTable = Names.instance(context); + + return factory.at(((JCTree) parameter).pos) + .If(factory.Parens(createIfCondition(factory, symbolsTable, parameter)), + createIfBlock(factory, symbolsTable, parameter), + null); + } + + private static JCTree.JCBinary createIfCondition(TreeMaker factory, Names symbolsTable, VariableTree parameter) { + Name parameterId = symbolsTable.fromString(parameter.getName().toString()); + return factory.Binary(JCTree.Tag.LE, + factory.Ident(parameterId), + factory.Literal(TypeTag.INT, 0)); + } + + private static JCTree.JCBlock createIfBlock(TreeMaker factory, Names symbolsTable, VariableTree parameter) { + String parameterName = parameter.getName().toString(); + Name parameterId = symbolsTable.fromString(parameterName); + + String errorMessagePrefix = String.format("Argument '%s' of type %s is marked by @%s but got '", + parameterName, parameter.getType(), Positive.class.getSimpleName()); + String errorMessageSuffix = "' for it"; + + return factory.Block(0, com.sun.tools.javac.util.List.of( + factory.Throw( + factory.NewClass(null, nil(), + factory.Ident(symbolsTable.fromString(IllegalArgumentException.class.getSimpleName())), + com.sun.tools.javac.util.List.of(factory.Binary(JCTree.Tag.PLUS, + factory.Binary(JCTree.Tag.PLUS, factory.Literal(TypeTag.CLASS, errorMessagePrefix), + factory.Ident(parameterId)), + factory.Literal(TypeTag.CLASS, errorMessageSuffix))), null)))); + } + +} diff --git a/core-java-sun/src/main/resources/log4j.properties b/core-java-sun/src/main/resources/log4j.properties new file mode 100644 index 0000000000..621cf01735 --- /dev/null +++ b/core-java-sun/src/main/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=DEBUG, A1 + +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n \ No newline at end of file diff --git a/rest-assured/src/test/resources/logback.xml b/core-java-sun/src/main/resources/logback.xml similarity index 100% rename from rest-assured/src/test/resources/logback.xml rename to core-java-sun/src/main/resources/logback.xml diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java b/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java new file mode 100644 index 0000000000..b877038add --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/SampleJavacPluginIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.javac; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SampleJavacPluginIntegrationTest { + + private static final String CLASS_TEMPLATE = + "package com.baeldung.javac;\n" + + "\n" + + "public class Test {\n" + + " public static %1$s service(@Positive %1$s i) {\n" + + " return i;\n" + + " }\n" + + "}\n" + + ""; + + private TestCompiler compiler = new TestCompiler(); + private TestRunner runner = new TestRunner(); + + @Test(expected = IllegalArgumentException.class) + public void givenInt_whenNegative_thenThrowsException() throws Throwable { + compileAndRun(double.class,-1); + } + + @Test(expected = IllegalArgumentException.class) + public void givenInt_whenZero_thenThrowsException() throws Throwable { + compileAndRun(int.class,0); + } + + @Test + public void givenInt_whenPositive_thenSuccess() throws Throwable { + assertEquals(1, compileAndRun(int.class, 1)); + } + + private Object compileAndRun(Class argumentType, Object argument) throws Throwable { + String qualifiedClassName = "com.baeldung.javac.Test"; + byte[] byteCode = compiler.compile(qualifiedClassName, String.format(CLASS_TEMPLATE, argumentType.getName())); + return runner.run(byteCode, qualifiedClassName, "service", new Class[] {argumentType}, argument); + } +} diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java new file mode 100644 index 0000000000..2c8e66e6e3 --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleClassFile.java @@ -0,0 +1,26 @@ +package com.baeldung.javac; + +import javax.tools.SimpleJavaFileObject; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URI; + +/** Holds compiled byte code in a byte array */ +public class SimpleClassFile extends SimpleJavaFileObject { + + private ByteArrayOutputStream out; + + public SimpleClassFile(URI uri) { + super(uri, Kind.CLASS); + } + + @Override + public OutputStream openOutputStream() throws IOException { + return out = new ByteArrayOutputStream(); + } + + public byte[] getCompiledBinaries() { + return out.toByteArray(); + } +} \ No newline at end of file diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java new file mode 100644 index 0000000000..346f240754 --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleFileManager.java @@ -0,0 +1,34 @@ +package com.baeldung.javac; + +import javax.tools.*; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +/** Adapts {@link SimpleClassFile} to the {@link JavaCompiler} */ +public class SimpleFileManager extends ForwardingJavaFileManager { + + private final List compiled = new ArrayList<>(); + + public SimpleFileManager(StandardJavaFileManager delegate) { + super(delegate); + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, + String className, + JavaFileObject.Kind kind, + FileObject sibling) + { + SimpleClassFile result = new SimpleClassFile(URI.create("string://" + className)); + compiled.add(result); + return result; + } + + /** + * @return compiled binaries processed by the current class + */ + public List getCompiled() { + return compiled; + } +} \ No newline at end of file diff --git a/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java b/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java new file mode 100644 index 0000000000..9287b1a0dd --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/SimpleSourceFile.java @@ -0,0 +1,23 @@ +package com.baeldung.javac; + +import javax.tools.SimpleJavaFileObject; +import java.net.URI; + +/** Exposes given test source to the compiler. */ +public class SimpleSourceFile extends SimpleJavaFileObject { + + private final String content; + + public SimpleSourceFile(String qualifiedClassName, String testSource) { + super(URI.create(String.format("file://%s%s", + qualifiedClassName.replaceAll("\\.", "/"), + Kind.SOURCE.extension)), + Kind.SOURCE); + content = testSource; + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return content; + } +} \ No newline at end of file diff --git a/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java b/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java new file mode 100644 index 0000000000..ee40e563a3 --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/TestCompiler.java @@ -0,0 +1,35 @@ +package com.baeldung.javac; + +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; + +public class TestCompiler { + public byte[] compile(String qualifiedClassName, String testSource) { + StringWriter output = new StringWriter(); + + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + SimpleFileManager fileManager = new SimpleFileManager(compiler.getStandardFileManager( + null, + null, + null + )); + List compilationUnits = singletonList(new SimpleSourceFile(qualifiedClassName, testSource)); + List arguments = new ArrayList<>(); + arguments.addAll(asList("-classpath", System.getProperty("java.class.path"), + "-Xplugin:" + SampleJavacPlugin.NAME)); + JavaCompiler.CompilationTask task = compiler.getTask(output, + fileManager, + null, + arguments, + null, + compilationUnits); + task.call(); + return fileManager.getCompiled().iterator().next().getCompiledBinaries(); + } +} diff --git a/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java b/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java new file mode 100644 index 0000000000..6a03ad4918 --- /dev/null +++ b/core-java-sun/src/test/java/com/baeldung/javac/TestRunner.java @@ -0,0 +1,41 @@ +package com.baeldung.javac; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class TestRunner { + + public Object run(byte[] byteCode, + String qualifiedClassName, + String methodName, + Class[] argumentTypes, + Object... args) + throws Throwable + { + ClassLoader classLoader = new ClassLoader() { + @Override + protected Class findClass(String name) throws ClassNotFoundException { + return defineClass(name, byteCode, 0, byteCode.length); + } + }; + Class clazz; + try { + clazz = classLoader.loadClass(qualifiedClassName); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Can't load compiled test class", e); + } + + Method method; + try { + method = clazz.getMethod(methodName, argumentTypes); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Can't find the 'main()' method in the compiled test class", e); + } + + try { + return method.invoke(null, args); + } catch (InvocationTargetException e) { + throw e.getCause(); + } + } +} diff --git a/spring-jpa/src/test/resources/.gitignore b/core-java-sun/src/test/resources/.gitignore similarity index 100% rename from spring-jpa/src/test/resources/.gitignore rename to core-java-sun/src/test/resources/.gitignore diff --git a/core-java/README.md b/core-java/README.md index b4b8d9062e..b7482b09cc 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -4,19 +4,13 @@ ### Relevant Articles: - [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) -- [Java - Reading a Large File Efficiently](http://www.baeldung.com/java-read-lines-large-file) -- [Java InputStream to String](http://www.baeldung.com/convert-input-stream-to-string) - [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array) - [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array) - [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list) - [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set) -- [Java – Write to File](http://www.baeldung.com/java-write-to-file) -- [Java - Convert File to InputStream](http://www.baeldung.com/convert-file-to-input-stream) - [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double) - [Java – Generate Random String](http://www.baeldung.com/java-random-string) -- [Java Scanner](http://www.baeldung.com/java-scanner) - [Java Timer](http://www.baeldung.com/java-timer-and-timertask) -- [Java – Byte Array to Writer](http://www.baeldung.com/java-convert-byte-array-to-writer) - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) @@ -25,7 +19,6 @@ - [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string) - [Random List Element](http://www.baeldung.com/java-random-list-element) - [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer) -- [Java – Directory Size](http://www.baeldung.com/java-folder-size) - [Java – Try with Resources](http://www.baeldung.com/java-try-with-resources) - [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) @@ -39,10 +32,8 @@ - [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) - [Simulated Annealing for Travelling Salesman Problem](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) - [Slope One Algorithm: Collaborative Filtering Recommendation Systems](http://www.baeldung.com/java-collaborative-filtering-recommendations) -- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](http://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) - [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) - [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) -- [Calculate the Size of a File in Java](http://www.baeldung.com/java-file-size) - [The Basics of Java Generics](http://www.baeldung.com/java-generics) - [The Traveling Salesman Problem in Java](http://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) @@ -53,7 +44,6 @@ - [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap) -- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) - [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) - [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) - [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap) @@ -73,15 +63,12 @@ - [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) - [Guide to UUID in JAVA](http://www.baeldung.com/guide-to-uuid-in-java) -- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) - [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) - [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) -- [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer) - [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number) - [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) - [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null) -- [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream) - [Changing the Order in a Sum Operation Can Produce Different Results?](http://www.baeldung.com/java-floating-point-sum-order) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) - [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map) @@ -110,8 +97,43 @@ - [Singletons in Java](http://www.baeldung.com/java-singleton) - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) -- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) - [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer) - [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int) - [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) +- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) +- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) +- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array) +- [Guide to Java String Pool](http://www.baeldung.com/java-string-pool) +- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) +- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) +- [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) +- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) +- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque) +- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) +- [Batch Processing in JDBC](http://www.baeldung.com/jdbc-batch-processing) +- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value) +- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array) +- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) +- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) +- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree) +- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) +- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions) +- [Introduction to the JDBC RowSet Interface in Java](http://www.baeldung.com/java-jdbc-rowset) +- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) +- [A Guide to Java Loops](http://www.baeldung.com/java-loops) +- [Varargs in Java](http://www.baeldung.com/java-varargs) +- [A Guide to HashSet in Java](http://www.baeldung.com/java-hashset) +- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) +- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) +- [Recursion In Java](http://www.baeldung.com/java-recursion) +- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize) +- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) +- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override) +- [A Guide to TreeSet in Java](http://www.baeldung.com/java-tree-set) +- [Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) +- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap) +- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) +- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) +- [Introduction to Javadoc](http://www.baeldung.com/javadoc) +- [How to TDD a List Implementation](http://jira.baeldung.com/browse/BAEL-1537) diff --git a/core-java/customers.xml b/core-java/customers.xml new file mode 100644 index 0000000000..b52dc27633 --- /dev/null +++ b/core-java/customers.xml @@ -0,0 +1,95 @@ + + + + SELECT * FROM customers + 1008 + + true + 1000 + 0 + 2 + + + + + 0 + 0 + 0 + true + ResultSet.TYPE_SCROLL_INSENSITIVE + false + customers + jdbc:h2:mem:testdb + + com.sun.rowset.providers.RIOptimisticProvider + Oracle Corporation + 1.0 + 2 + 1 + + + + 2 + + 1 + false + true + false + 0 + true + true + 11 + ID + ID + PUBLIC + 10 + 0 + CUSTOMERS + TESTDB + 4 + INTEGER + + + 2 + false + true + false + 0 + true + true + 50 + NAME + NAME + PUBLIC + 50 + 0 + CUSTOMERS + TESTDB + 12 + VARCHAR + + + + + 1 + Customer1 + + + 2 + Customer2 + + + 3 + Customer3 + + + 4 + Customer4 + + + 5 + Customer5 + + + diff --git a/core-java/pom.xml b/core-java/pom.xml index bb3958f36c..e2983de9dd 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -78,6 +78,11 @@ jackson-databind ${jackson.version} + + com.google.code.gson + gson + ${gson.version} + @@ -216,6 +221,17 @@ spring-web 4.3.4.RELEASE + + org.springframework.boot + spring-boot-starter + 1.5.8.RELEASE + + + org.hsqldb + hsqldb + 2.4.0 + runtime + @@ -378,6 +394,16 @@ + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0-M1 + + 1.8 + 1.8 + + @@ -447,6 +473,7 @@ 2.8.5 + 2.8.2 1.7.21 @@ -478,7 +505,7 @@ 1.7.0 - 3.6.0 + 3.7.0 2.19.1 \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java b/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java new file mode 100644 index 0000000000..977587a06a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/ArrayBenchmarkRunner.java @@ -0,0 +1,21 @@ +package com.baeldung.array; + +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +public class ArrayBenchmarkRunner { + + public static void main(String[] args) throws Exception { + + Options options = new OptionsBuilder() + .include(SearchArrayTest.class.getSimpleName()).threads(1) + .forks(1).shouldFailOnError(true).shouldDoGC(true) + .jvmArgs("-server").build(); + + new Runner(options).run(); + + + } + +} diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java new file mode 100644 index 0000000000..86438baf1a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java @@ -0,0 +1,43 @@ +package com.baeldung.array; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; + +import org.apache.commons.lang3.ArrayUtils; + +import com.google.common.collect.Lists; + +public class ArrayInverter { + + public void invertUsingFor(Object[] array) { + for (int i = 0; i < array.length / 2; i++) { + Object temp = array[i]; + array[i] = array[array.length - 1 - i]; + array[array.length - 1 - i] = temp; + } + } + + public void invertUsingCollectionsReverse(Object[] array) { + List list = Arrays.asList(array); + Collections.reverse(list); + } + + public Object[] invertUsingStreams(final Object[] array) { + return IntStream.rangeClosed(1, array.length) + .mapToObj(i -> array[array.length - i]) + .toArray(); + } + + public void invertUsingCommonsLang(Object[] array) { + ArrayUtils.reverse(array); + } + + public Object[] invertUsingGuava(Object[] array) { + List list = Arrays.asList(array); + List reverted = Lists.reverse(list); + return reverted.toArray(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java b/core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java new file mode 100644 index 0000000000..d424bd429f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/Find2ndLargestInArray.java @@ -0,0 +1,20 @@ +package com.baeldung.array; + +public class Find2ndLargestInArray { + + public static int find2ndLargestElement(int[] array) { + int maxElement = array[0]; + int secondLargestElement = -1; + + for (int index = 0; index < array.length; index++) { + if (maxElement <= array[index]) { + secondLargestElement = maxElement; + maxElement = array[index]; + } else if (secondLargestElement < array[index]) { + secondLargestElement = array[index]; + } + } + return secondLargestElement; + } + +} diff --git a/core-java/src/main/java/com/baeldung/array/FindElementInArray.java b/core-java/src/main/java/com/baeldung/array/FindElementInArray.java new file mode 100644 index 0000000000..6da889fe91 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/FindElementInArray.java @@ -0,0 +1,22 @@ +package com.baeldung.array; + +import java.util.Arrays; + +public class FindElementInArray { + + public static boolean findGivenElementInArrayWithoutUsingStream(int[] array, int element) { + boolean actualResult = false; + + for (int index = 0; index < array.length; index++) { + if (element == array[index]) { + actualResult = true; + break; + } + } + return actualResult; + } + + public static boolean findGivenElementInArrayUsingStream(int[] array, int element) { + return Arrays.stream(array).filter(x -> element == x).findFirst().isPresent(); + } +} diff --git a/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java new file mode 100644 index 0000000000..199ebdf036 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/SearchArrayTest.java @@ -0,0 +1,96 @@ +package com.baeldung.array; + +import org.openjdk.jmh.annotations.*; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 5) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +public class SearchArrayTest { + + @State(Scope.Benchmark) + public static class SearchData { + static int count = 1000; + static String[] strings = seedArray(1000); + } + + + @Benchmark + public void searchArrayLoop() { + for (int i = 0; i < SearchData.count; i++) { + searchLoop(SearchData.strings, "T"); + } + } + + @Benchmark + public void searchArrayAllocNewList() { + for (int i = 0; i < SearchData.count; i++) { + searchList(SearchData.strings, "T"); + } + + } + + @Benchmark + public void searchArrayAllocNewSet() { + for (int i = 0; i < SearchData.count; i++) { + searchSet(SearchData.strings, "T"); + } + } + + + @Benchmark + public void searchArrayReuseList() { + List asList = Arrays.asList(SearchData.strings); + for (int i = 0; i < SearchData.count; i++) { + asList.contains("T"); + } + } + + + @Benchmark + public void searchArrayReuseSet() { + Set asSet = new HashSet<>(Arrays.asList(SearchData.strings)); + for (int i = 0; i < SearchData.count; i++) { + asSet.contains("T"); + } + } + + + @Benchmark + public void searchArrayBinarySearch() { + Arrays.sort(SearchData.strings); + for (int i = 0; i < SearchData.count; i++) { + Arrays.binarySearch(SearchData.strings, "T"); + } + } + + private boolean searchList(String[] strings, String searchString) { + return Arrays.asList(strings).contains(searchString); + } + + private boolean searchSet(String[] strings, String searchString) { + Set set = new HashSet<>(Arrays.asList(strings)); + return set.contains(searchString); + } + + private boolean searchLoop(String[] strings, String searchString) { + for (String s : strings) { + if (s.equals(searchString)) + return true; + } + return false; + } + + private static String[] seedArray(int length) { + String[] strings = new String[length]; + Random random = new Random(); + for (int i = 0; i < length; i++) + { + strings[i] = String.valueOf(random.nextInt()); + } + return strings; + } + +} diff --git a/core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java b/core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java new file mode 100644 index 0000000000..e7d7172fdb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/array/SumAndAverageInArray.java @@ -0,0 +1,27 @@ +package com.baeldung.array; + +import java.util.Arrays; + +public class SumAndAverageInArray { + + public static int findSumWithoutUsingStream(int[] array) { + int sum = 0; + for (int index = 0; index < array.length; index++) { + sum += array[index]; + } + return sum; + } + + public static int findSumUsingStream(int[] array) { + return Arrays.stream(array).sum(); + } + + public static double findAverageWithoutUsingStream(int[] array) { + int sum = findSumWithoutUsingStream(array); + return (double) sum / array.length; + } + + public static double findAverageUsingStream(int[] array) { + return Arrays.stream(array).average().getAsDouble(); + } +} diff --git a/core-java/src/main/java/com/baeldung/asciiart/AsciiArt.java b/core-java/src/main/java/com/baeldung/asciiart/AsciiArt.java new file mode 100644 index 0000000000..081717b4fa --- /dev/null +++ b/core-java/src/main/java/com/baeldung/asciiart/AsciiArt.java @@ -0,0 +1,62 @@ +package com.baeldung.asciiart; + +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; + +public class AsciiArt { + + public AsciiArt() { + } + + public void drawString(String text, String artChar, Settings settings) { + BufferedImage image = getImageIntegerMode(settings.width, settings.height); + + Graphics2D graphics2D = getGraphics2D(image.getGraphics(), settings); + graphics2D.drawString(text, 6, ((int) (settings.height * 0.67))); + + for (int y = 0; y < settings.height; y++) { + StringBuilder stringBuilder = new StringBuilder(); + + for (int x = 0; x < settings.width; x++) { + stringBuilder.append(image.getRGB(x, y) == -16777216 ? " " : artChar); + } + + if (stringBuilder.toString() + .trim() + .isEmpty()) { + continue; + } + + System.out.println(stringBuilder); + } + + } + + private BufferedImage getImageIntegerMode(int width, int height) { + return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + } + + private Graphics2D getGraphics2D(Graphics graphics, Settings settings) { + graphics.setFont(settings.font); + + Graphics2D graphics2D = (Graphics2D) graphics; + graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + return graphics2D; + } + + public class Settings { + public Font font; + public int width; + public int height; + + public Settings(Font font, int width, int height) { + this.font = font; + this.width = width; + this.height = height; + } + } +} diff --git a/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java new file mode 100644 index 0000000000..ce85b487c1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/breakcontinue/BreakContinue.java @@ -0,0 +1,138 @@ +package com.baeldung.breakcontinue; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * @author Santosh + * + */ +public class BreakContinue { + + public static int unlabeledBreak() { + String searchName = "Wilson"; + int counter = 0; + List names = Arrays.asList("John", "Peter", "Robert", "Wilson", "Anthony", "Donald", "Richard"); + + for (String name : names) { + counter++; + if (name.equalsIgnoreCase(searchName)) { + break; + } + } + + return counter; + } + + public static int unlabeledBreakNestedLoops() { + String searchName = "Wilson"; + int counter = 0; + Map> nameMap = new HashMap<>(); + nameMap.put("Grade1", Arrays.asList("John", "Peter", "Robert", "Wilson")); + nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Richard", "Arnold")); + nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Stephen", "Ryan")); + + Iterator>> iterator = nameMap.entrySet() + .iterator(); + Entry> entry = null; + List names = null; + while (iterator.hasNext()) { + entry = iterator.next(); + names = entry.getValue(); + for (String name : names) { + if (name.equalsIgnoreCase(searchName)) { + counter++; + break; + } + } + } + + return counter; + } + + public static int labeledBreak() { + String searchName = "Wilson"; + int counter = 0; + Map> nameMap = new HashMap<>(); + nameMap.put("Grade1", Arrays.asList("John", "Peter", "Robert", "Wilson")); + nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Richard", "Arnold")); + nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Stephen", "Ryan")); + + Iterator>> iterator = nameMap.entrySet() + .iterator(); + Entry> entry = null; + List names = null; + compare: + while (iterator.hasNext()) { + entry = iterator.next(); + names = entry.getValue(); + for (String name : names) { + if (name.equalsIgnoreCase(searchName)) { + counter++; + break compare; + } + } + } + + return counter; + } + + public static int unlabeledContinue() { + String searchName = "Wilson"; + int counter = 0; + Map> nameMap = new HashMap<>(); + nameMap.put("Grade1", Arrays.asList("John", "Wilson", "Robert", "Wilson")); + nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Wilson", "Arnold")); + nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Wilson", "Ryan")); + + Iterator>> iterator = nameMap.entrySet() + .iterator(); + Entry> entry = null; + List names = null; + while (iterator.hasNext()) { + entry = iterator.next(); + names = entry.getValue(); + for (String name : names) { + if (!name.equalsIgnoreCase(searchName)) { + continue; + } + + counter++; + } + } + + return counter; + } + + public static int labeledContinue() { + String searchName = "Wilson"; + int counter = 0; + Map> nameMap = new HashMap<>(); + nameMap.put("Grade1", Arrays.asList("John", "Wilson", "Robert", "Wilson")); + nameMap.put("Grade2", Arrays.asList("Anthony", "Donald", "Wilson", "Arnold")); + nameMap.put("Grade3", Arrays.asList("Wilson", "Michael", "Wilson", "Ryan")); + + Iterator>> iterator = nameMap.entrySet() + .iterator(); + Entry> entry = null; + List names = null; + compare: + while (iterator.hasNext()) { + entry = iterator.next(); + names = entry.getValue(); + for (String name : names) { + if (name.equalsIgnoreCase(searchName)) { + counter++; + continue compare; + } + } + } + + return counter; + } + +} diff --git a/core-java/src/main/java/com/baeldung/casting/Animal.java b/core-java/src/main/java/com/baeldung/casting/Animal.java new file mode 100644 index 0000000000..9f31c1dda3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/Animal.java @@ -0,0 +1,13 @@ +package com.baeldung.casting; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Animal { + private static final Logger LOGGER = LoggerFactory.getLogger(Animal.class); + + public void eat() { + LOGGER.info("animal is eating"); + } + +} diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java new file mode 100644 index 0000000000..89b972e5c2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/AnimalFeeder.java @@ -0,0 +1,23 @@ +package com.baeldung.casting; + +import java.util.List; + +public class AnimalFeeder { + + public void feed(List animals) { + animals.forEach(animal -> { + animal.eat(); + if (animal instanceof Cat) { + ((Cat) animal).meow(); + } + }); + } + + public void uncheckedFeed(List animals) { + animals.forEach(animal -> { + animal.eat(); + ((Cat) animal).meow(); + }); + } + +} diff --git a/core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java new file mode 100644 index 0000000000..5fbd2415c7 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java @@ -0,0 +1,24 @@ +package com.baeldung.casting; + +import java.util.ArrayList; +import java.util.List; + +public class AnimalFeederGeneric { + private Class type; + + public AnimalFeederGeneric(Class type) { + this.type = type; + } + + public List feed(List animals) { + List list = new ArrayList(); + animals.forEach(animal -> { + if (type.isInstance(animal)) { + T objAsType = type.cast(animal); + list.add(objAsType); + } + }); + return list; + } + +} diff --git a/core-java/src/main/java/com/baeldung/casting/Cat.java b/core-java/src/main/java/com/baeldung/casting/Cat.java new file mode 100644 index 0000000000..aa9a9a881a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/Cat.java @@ -0,0 +1,16 @@ +package com.baeldung.casting; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Cat extends Animal implements Mew { + private static final Logger LOGGER = LoggerFactory.getLogger(Cat.class); + + public void eat() { + LOGGER.info("cat is eating"); + } + + public void meow() { + LOGGER.info("meow"); + } +} diff --git a/core-java/src/main/java/com/baeldung/casting/Dog.java b/core-java/src/main/java/com/baeldung/casting/Dog.java new file mode 100644 index 0000000000..763c6b4785 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/Dog.java @@ -0,0 +1,12 @@ +package com.baeldung.casting; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Dog extends Animal { + private static final Logger LOGGER = LoggerFactory.getLogger(Dog.class); + + public void eat() { + LOGGER.info("dog is eating"); + } +} diff --git a/core-java/src/main/java/com/baeldung/casting/Mew.java b/core-java/src/main/java/com/baeldung/casting/Mew.java new file mode 100644 index 0000000000..f3c7324551 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/casting/Mew.java @@ -0,0 +1,5 @@ +package com.baeldung.casting; + +public interface Mew { + public void meow(); +} diff --git a/core-java/src/main/java/com/baeldung/cipher/Encryptor.java b/core-java/src/main/java/com/baeldung/cipher/Encryptor.java new file mode 100644 index 0000000000..901975a5d6 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/cipher/Encryptor.java @@ -0,0 +1,35 @@ +package com.baeldung.cipher; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.Certificate; + +public class Encryptor { + + public byte[] encryptMessage(byte[] message, byte[] keyBytes) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + SecretKey secretKey = new SecretKeySpec(keyBytes, "AES"); + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + byte[] encryptedMessage = cipher.doFinal(message); + return encryptedMessage; + } + + public byte[] encryptMessage(byte[] message, Certificate publicKeyCertificate) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, publicKeyCertificate); + byte[] encryptedMessage = cipher.doFinal(message); + return encryptedMessage; + } + + public byte[] decryptMessage(byte[] encryptedMessage, byte[] keyBytes) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + SecretKey secretKey = new SecretKeySpec(keyBytes, "AES"); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + byte[] clearMessage = cipher.doFinal(encryptedMessage); + return clearMessage; + } + + +} diff --git a/core-java/src/main/java/com/baeldung/classloader/CustomClassLoader.java b/core-java/src/main/java/com/baeldung/classloader/CustomClassLoader.java new file mode 100644 index 0000000000..c44e863776 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/classloader/CustomClassLoader.java @@ -0,0 +1,29 @@ +package com.baeldung.classloader; + +import java.io.*; + +public class CustomClassLoader extends ClassLoader { + + + public Class getClass(String name) throws ClassNotFoundException { + byte[] b = loadClassFromFile(name); + return defineClass(name, b, 0, b.length); + } + + private byte[] loadClassFromFile(String fileName) { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream( + fileName.replace('.', File.separatorChar) + ".class"); + byte[] buffer; + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + int nextValue = 0; + try { + while ( (nextValue = inputStream.read()) != -1 ) { + byteStream.write(nextValue); + } + } catch (IOException e) { + e.printStackTrace(); + } + buffer = byteStream.toByteArray(); + return buffer; + } +} diff --git a/core-java/src/main/java/com/baeldung/classloader/PrintClassLoader.java b/core-java/src/main/java/com/baeldung/classloader/PrintClassLoader.java new file mode 100644 index 0000000000..09ee68bf6e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/classloader/PrintClassLoader.java @@ -0,0 +1,22 @@ +package com.baeldung.classloader; + +import com.sun.javafx.util.Logging; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; + +public class PrintClassLoader { + + public void printClassLoaders() throws ClassNotFoundException { + + System.out.println("Classloader of this class:" + PrintClassLoader.class.getClassLoader()); + System.out.println("Classloader of Logging:" + Logging.class.getClassLoader()); + System.out.println("Classloader of ArrayList:" + ArrayList.class.getClassLoader()); + + } +} diff --git a/core-java/src/main/java/com/baeldung/comparable/Player.java b/core-java/src/main/java/com/baeldung/comparable/Player.java new file mode 100644 index 0000000000..68a78980f3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparable/Player.java @@ -0,0 +1,51 @@ +package com.baeldung.comparable; + +public class Player implements Comparable { + + private int ranking; + + private String name; + + private int age; + + public Player(int ranking, String name, int age) { + this.ranking = ranking; + this.name = name; + this.age = age; + } + + public int getRanking() { + return ranking; + } + + public void setRanking(int ranking) { + this.ranking = ranking; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return this.name; + } + + @Override + public int compareTo(Player otherPlayer) { + return (this.getRanking() - otherPlayer.getRanking()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java b/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java new file mode 100644 index 0000000000..a9b883f579 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparable/PlayerSorter.java @@ -0,0 +1,25 @@ +package com.baeldung.comparable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PlayerSorter { + + public static void main(String[] args) { + + List footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 20); + Player player2 = new Player(67, "Roger", 22); + Player player3 = new Player(45, "Steven", 24); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + + System.out.println("Before Sorting : " + footballTeam); + Collections.sort(footballTeam); + System.out.println("After Sorting : " + footballTeam); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparator/Player.java b/core-java/src/main/java/com/baeldung/comparator/Player.java new file mode 100644 index 0000000000..e6e9ee0db6 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparator/Player.java @@ -0,0 +1,46 @@ +package com.baeldung.comparator; + +public class Player { + + private int ranking; + + private String name; + + private int age; + + public Player(int ranking, String name, int age) { + this.ranking = ranking; + this.name = name; + this.age = age; + } + + public int getRanking() { + return ranking; + } + + public void setRanking(int ranking) { + this.ranking = ranking; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return this.name; + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java new file mode 100644 index 0000000000..d2e7ca1f42 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeComparator.java @@ -0,0 +1,12 @@ +package com.baeldung.comparator; + +import java.util.Comparator; + +public class PlayerAgeComparator implements Comparator { + + @Override + public int compare(Player firstPlayer, Player secondPlayer) { + return (firstPlayer.getAge() - secondPlayer.getAge()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java new file mode 100644 index 0000000000..3bbbcddb80 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparator/PlayerAgeSorter.java @@ -0,0 +1,27 @@ +package com.baeldung.comparator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PlayerAgeSorter { + + public static void main(String[] args) { + + List footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 22); + Player player2 = new Player(67, "Roger", 20); + Player player3 = new Player(45, "Steven", 24); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + + System.out.println("Before Sorting : " + footballTeam); + //Instance of PlayerAgeComparator + PlayerAgeComparator playerComparator = new PlayerAgeComparator(); + Collections.sort(footballTeam, playerComparator); + System.out.println("After Sorting by age : " + footballTeam); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java new file mode 100644 index 0000000000..2d42698843 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingComparator.java @@ -0,0 +1,12 @@ +package com.baeldung.comparator; + +import java.util.Comparator; + +public class PlayerRankingComparator implements Comparator { + + @Override + public int compare(Player firstPlayer, Player secondPlayer) { + return (firstPlayer.getRanking() - secondPlayer.getRanking()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java new file mode 100644 index 0000000000..581585fb7e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/comparator/PlayerRankingSorter.java @@ -0,0 +1,27 @@ +package com.baeldung.comparator; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PlayerRankingSorter { + + public static void main(String[] args) { + + List footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 22); + Player player2 = new Player(67, "Roger", 20); + Player player3 = new Player(45, "Steven", 40); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + + System.out.println("Before Sorting : " + footballTeam); + //Instance of PlayerRankingComparator + PlayerRankingComparator playerComparator = new PlayerRankingComparator(); + Collections.sort(footballTeam, playerComparator); + System.out.println("After Sorting by ranking : " + footballTeam); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/deepcopy/Address.java b/core-java/src/main/java/com/baeldung/deepcopy/Address.java new file mode 100644 index 0000000000..4e010ea92b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/deepcopy/Address.java @@ -0,0 +1,59 @@ +package com.baeldung.deepcopy; + +import java.io.Serializable; + +public class Address implements Serializable, Cloneable { + + @Override + public Object clone() { + try { + return (Address) super.clone(); + } catch (CloneNotSupportedException e) { + return new Address(this.street, this.getCity(), this.getCountry()); + } + } + + private static final long serialVersionUID = 1740913841244949416L; + private String street; + private String city; + + private String country; + + public Address(Address that) { + this(that.getStreet(), that.getCity(), that.getCountry()); + } + + public Address(String street, String city, String country) { + this.street = street; + this.city = city; + this.country = country; + } + + public Address() { + } + + public String getStreet() { + return street; + } + + public String getCity() { + return city; + } + + public String getCountry() { + return country; + } + + public void setStreet(String street) { + this.street = street; + } + + public void setCity(String city) { + this.city = city; + } + + public void setCountry(String country) { + this.country = country; + } +} + diff --git a/core-java/src/main/java/com/baeldung/deepcopy/User.java b/core-java/src/main/java/com/baeldung/deepcopy/User.java new file mode 100644 index 0000000000..329cfc6b27 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/deepcopy/User.java @@ -0,0 +1,48 @@ +package com.baeldung.deepcopy; + +import java.io.Serializable; + +public class User implements Serializable, Cloneable { + + private static final long serialVersionUID = -3427002229954777557L; + private String firstName; + private String lastName; + private Address address; + + public User(String firstName, String lastName, Address address) { + this.firstName = firstName; + this.lastName = lastName; + this.address = address; + } + + public User(User that) { + this(that.getFirstName(), that.getLastName(), new Address(that.getAddress())); + } + + public User() { + } + + @Override + public Object clone() { + User user; + try { + user = (User) super.clone(); + } catch (CloneNotSupportedException e) { + user = new User(this.getFirstName(), this.getLastName(), this.getAddress()); + } + user.address = (Address) this.address.clone(); + return user; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public Address getAddress() { + return address; + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java new file mode 100644 index 0000000000..46d97d1a15 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractFactory.java @@ -0,0 +1,6 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public interface AbstractFactory { + Animal getAnimal(String toyType) ; + Color getColor(String colorType); +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java new file mode 100644 index 0000000000..7ab166e16a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternDriver.java @@ -0,0 +1,18 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class AbstractPatternDriver { + public static void main(String[] args) { + AbstractFactory abstractFactory; + + //creating a brown toy dog + abstractFactory = FactoryProvider.getFactory("Toy"); + Animal toy = abstractFactory.getAnimal("Dog"); + + abstractFactory = FactoryProvider.getFactory("Color"); + Color color = abstractFactory.getColor("Brown"); + + String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound(); + + System.out.println(result); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java new file mode 100644 index 0000000000..59c1336053 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Animal.java @@ -0,0 +1,6 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public interface Animal { + String getType(); + String makeSound(); +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java new file mode 100644 index 0000000000..49583c3a98 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/AnimalFactory.java @@ -0,0 +1,21 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class AnimalFactory implements AbstractFactory { + + @Override + public Animal getAnimal(String animalType) { + if ("Dog".equalsIgnoreCase(animalType)) { + return new Dog(); + } else if ("Duck".equalsIgnoreCase(animalType)) { + return new Duck(); + } + + return null; + } + + @Override + public Color getColor(String color) { + throw new UnsupportedOperationException(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java new file mode 100644 index 0000000000..f251285ebf --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Brown.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class Brown implements Color { + + @Override + public String getColor() { + return "brown"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java new file mode 100644 index 0000000000..897bb71f38 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Color.java @@ -0,0 +1,5 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public interface Color { + String getColor(); +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java new file mode 100644 index 0000000000..8f7559ff27 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/ColorFactory.java @@ -0,0 +1,21 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class ColorFactory implements AbstractFactory { + + @Override + public Color getColor(String colorType) { + if ("Brown".equalsIgnoreCase(colorType)) { + return new Brown(); + } else if ("White".equalsIgnoreCase(colorType)) { + return new White(); + } + + return null; + } + + @Override + public Animal getAnimal(String toyType) { + throw new UnsupportedOperationException(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java new file mode 100644 index 0000000000..002b5665d3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Dog.java @@ -0,0 +1,15 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class Dog implements Animal { + + @Override + public String getType() { + return "Dog"; + } + + @Override + public String makeSound() { + return "Barks"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java new file mode 100644 index 0000000000..5603ad6eee --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/Duck.java @@ -0,0 +1,15 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class Duck implements Animal { + + @Override + public String getType() { + return "Duck"; + } + + @Override + public String makeSound() { + return "Squeks"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java new file mode 100644 index 0000000000..fcbee1e6de --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/FactoryProvider.java @@ -0,0 +1,15 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class FactoryProvider { + public static AbstractFactory getFactory(String choice){ + + if("Toy".equalsIgnoreCase(choice)){ + return new AnimalFactory(); + } + else if("Color".equalsIgnoreCase(choice)){ + return new ColorFactory(); + } + + return null; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java new file mode 100644 index 0000000000..62ef8048ea --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/abstractfactory/White.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +public class White implements Color { + + @Override + public String getColor() { + return "White"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java new file mode 100644 index 0000000000..355fa74895 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BankAccount.java @@ -0,0 +1,64 @@ +package com.baeldung.designpatterns.creational.builder; + +public class BankAccount { + private String name; + private String accountNumber; + private String email; + private boolean newsletter; + + //The constructor that takes a builder from which it will create object + //the access to this is only provided to builder + private BankAccount(BankAccountBuilder builder) { + this.name = builder.name; + this.accountNumber = builder.accountNumber; + this.email = builder.email; + this.newsletter = builder.newsletter; + } + + public static class BankAccountBuilder { + private String name; + private String accountNumber; + private String email; + private boolean newsletter; + + //All Mandatory parameters goes with this constructor + public BankAccountBuilder(String name, String accountNumber) { + this.name = name; + this.accountNumber = accountNumber; + } + + //setters for optional parameters which returns this same builder + //to support fluent design + public BankAccountBuilder withEmail(String email) { + this.email = email; + return this; + } + + public BankAccountBuilder wantNewsletter(boolean newsletter) { + this.newsletter = newsletter; + return this; + } + + //the actual build method that prepares and returns a BankAccount object + public BankAccount build() { + return new BankAccount(this); + } + } + + //getters + public String getName() { + return name; + } + + public String getAccountNumber() { + return accountNumber; + } + + public String getEmail() { + return email; + } + + public boolean isNewsletter() { + return newsletter; + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java new file mode 100644 index 0000000000..d92a70e664 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/builder/BuilderPatternDriver.java @@ -0,0 +1,16 @@ +package com.baeldung.designpatterns.creational.builder; + +public class BuilderPatternDriver { + public static void main(String[] args) { + BankAccount newAccount = new BankAccount + .BankAccountBuilder("Jon", "22738022275") + .withEmail("jon@example.com") + .wantNewsletter(true) + .build(); + + System.out.println("Name: " + newAccount.getName()); + System.out.println("AccountNumber:" + newAccount.getAccountNumber()); + System.out.println("Email: " + newAccount.getEmail()); + System.out.println("Want News letter?: " + newAccount.isNewsletter()); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java new file mode 100644 index 0000000000..64ee307bb8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/FactoryDriver.java @@ -0,0 +1,16 @@ +package com.baeldung.designpatterns.creational.factory; + +public class FactoryDriver { + public static void main(String[] args) { + Polygon p; + PolygonFactory factory = new PolygonFactory(); + + //get the shape which has 4 sides + p = factory.getPolygon(4); + System.out.println("The shape with 4 sides is a " + p.getType()); + + //get the shape which has 4 sides + p = factory.getPolygon(8); + System.out.println("The shape with 8 sides is a " + p.getType()); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java new file mode 100644 index 0000000000..935fc2f04c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Heptagon.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.factory; + +public class Heptagon implements Polygon { + + @Override + public String getType() { + return "Heptagon"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java new file mode 100644 index 0000000000..fc62302dc8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Octagon.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.factory; + +public class Octagon implements Polygon { + + @Override + public String getType() { + return "Octagon"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java new file mode 100644 index 0000000000..65d109b10b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Pentagon.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.factory; + +public class Pentagon implements Polygon { + + @Override + public String getType() { + return "Pentagon"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java new file mode 100644 index 0000000000..8364e546b0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Polygon.java @@ -0,0 +1,5 @@ +package com.baeldung.designpatterns.creational.factory; + +public interface Polygon { + String getType(); +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java new file mode 100644 index 0000000000..9f34fe77b9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/PolygonFactory.java @@ -0,0 +1,22 @@ +package com.baeldung.designpatterns.creational.factory; + +public class PolygonFactory { + public Polygon getPolygon(int numberOfSides) { + if(numberOfSides == 3) { + return new Triangle(); + } + if(numberOfSides == 4) { + return new Square(); + } + if(numberOfSides == 5) { + return new Pentagon(); + } + if(numberOfSides == 7) { + return new Heptagon(); + } + else if(numberOfSides == 8) { + return new Octagon(); + } + return null; + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java new file mode 100644 index 0000000000..805c1c9ae3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Square.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.factory; + +public class Square implements Polygon { + + @Override + public String getType() { + return "Square"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java new file mode 100644 index 0000000000..8a8832d8a1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/factory/Triangle.java @@ -0,0 +1,10 @@ +package com.baeldung.designpatterns.creational.factory; + +public class Triangle implements Polygon { + + @Override + public String getType() { + return "Triangle"; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java new file mode 100644 index 0000000000..1a5ac82c89 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/Singleton.java @@ -0,0 +1,13 @@ +package com.baeldung.designpatterns.creational.singleton; + +public class Singleton { + private Singleton() {} + + private static class SingletonHolder { + public static final Singleton instance = new Singleton(); + } + + public static Singleton getInstance() { + return SingletonHolder.instance; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java new file mode 100644 index 0000000000..1955008d3e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/creational/singleton/SingletonDriver.java @@ -0,0 +1,8 @@ +package com.baeldung.designpatterns.creational.singleton; + +public class SingletonDriver { + public static void main(String[] args) { + Singleton instance = Singleton.getInstance(); + System.out.println(instance.toString()); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Car.java b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Car.java new file mode 100644 index 0000000000..50f62cafaa --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Car.java @@ -0,0 +1,85 @@ +package com.baeldung.designpatterns.flyweight; + +import java.awt.Color; + +import javax.annotation.concurrent.Immutable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Represents a car. This class is immutable. + * + * @author Donato Rimenti + */ +@Immutable +public class Car implements Vehicle { + + /** + * Logger. + */ + private final static Logger LOG = LoggerFactory.getLogger(Car.class); + + /** + * The car's engine. + */ + private Engine engine; + + /** + * The car's color. + */ + private Color color; + + /** + * Instantiates a new Car. + * + * @param engine + * the {@link #engine} + * @param color + * the {@link #color} + */ + public Car(Engine engine, Color color) { + this.engine = engine; + this.color = color; + + // Building a new car is a very expensive operation! + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + LOG.error("Error while creating a new car", e); + } + } + + /* + * (non-Javadoc) + * + * @see com.baeldung.designpatterns.flyweight.Vehicle#start() + */ + @Override + public void start() { + LOG.info("Car is starting!"); + engine.start(); + } + + /* + * (non-Javadoc) + * + * @see com.baeldung.designpatterns.flyweight.Vehicle#stop() + */ + @Override + public void stop() { + LOG.info("Car is stopping!"); + engine.stop(); + } + + /* + * (non-Javadoc) + * + * @see com.baeldung.designpatterns.flyweight.Vehicle#getColor() + */ + @Override + public Color getColor() { + return this.color; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Engine.java b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Engine.java new file mode 100644 index 0000000000..05d9ca98b8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Engine.java @@ -0,0 +1,31 @@ +package com.baeldung.designpatterns.flyweight; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Engine for a vehicle. + * + * @author Donato Rimenti + */ +public class Engine { + + /** + * Logger. + */ + private final static Logger LOG = LoggerFactory.getLogger(Engine.class); + + /** + * Starts the engine. + */ + public void start() { + LOG.info("Engine is starting!"); + } + + /** + * Stops the engine. + */ + public void stop() { + LOG.info("Engine is stopping!"); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Vehicle.java b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Vehicle.java new file mode 100644 index 0000000000..c285f9fcff --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/Vehicle.java @@ -0,0 +1,29 @@ +package com.baeldung.designpatterns.flyweight; + +import java.awt.Color; + +/** + * Interface for a vehicle. + * + * @author Donato Rimenti + */ +public interface Vehicle { + + /** + * Starts the vehicle. + */ + public void start(); + + /** + * Stops the vehicle. + */ + public void stop(); + + /** + * Gets the color of the vehicle. + * + * @return the color of the vehicle + */ + public Color getColor(); + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/designpatterns/flyweight/VehicleFactory.java b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/VehicleFactory.java new file mode 100644 index 0000000000..2854b7dab1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/flyweight/VehicleFactory.java @@ -0,0 +1,45 @@ +package com.baeldung.designpatterns.flyweight; + +import java.awt.Color; +import java.util.HashMap; +import java.util.Map; + +/** + * Factory which implements the Flyweight pattern to return an existing vehicle + * if present or a new one otherwise. + * + * @author Donato Rimenti + */ +public class VehicleFactory { + + /** + * Stores the already created vehicles. + */ + private static Map vehiclesCache = new HashMap(); + + /** + * Private constructor to prevent this class instantiation. + */ + private VehicleFactory() { + } + + /** + * Returns a vehicle of the same color passed as argument. If that vehicle + * was already created by this factory, that vehicle is returned, otherwise + * a new one is created and returned. + * + * @param color + * the color of the vehicle to return + * @return a vehicle of the specified color + */ + public static Vehicle createVehicle(Color color) { + // Looks for the requested vehicle into the cache. + // If the vehicle doesn't exist, a new one is created. + Vehicle newVehicle = vehiclesCache.computeIfAbsent(color, newColor -> { + // Creates the new car. + Engine newEngine = new Engine(); + return new Car(newEngine, newColor); + }); + return newVehicle; + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/Channel.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/Channel.java new file mode 100644 index 0000000000..9ca2edac38 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/Channel.java @@ -0,0 +1,5 @@ +package com.baeldung.designpatterns.observer; + +public interface Channel { + public void update(Object o); +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsAgency.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsAgency.java new file mode 100644 index 0000000000..0330fbdcdc --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsAgency.java @@ -0,0 +1,24 @@ +package com.baeldung.designpatterns.observer; + +import java.util.ArrayList; +import java.util.List; + +public class NewsAgency { + private String news; + private List channels = new ArrayList<>(); + + public void addObserver(Channel channel) { + this.channels.add(channel); + } + + public void removeObserver(Channel channel) { + this.channels.remove(channel); + } + + public void setNews(String news) { + this.news = news; + for (Channel channel : this.channels) { + channel.update(this.news); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsChannel.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsChannel.java new file mode 100644 index 0000000000..09c22e0ad8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/NewsChannel.java @@ -0,0 +1,20 @@ +package com.baeldung.designpatterns.observer; + +public class NewsChannel implements Channel { + + private String news; + + @Override + public void update(Object news) { + this.setNews((String) news); + } + + public String getNews() { + return news; + } + + public void setNews(String news) { + this.news = news; + } + +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsAgency.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsAgency.java new file mode 100644 index 0000000000..2849820663 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsAgency.java @@ -0,0 +1,13 @@ +package com.baeldung.designpatterns.observer; + +import java.util.Observable; + +public class ONewsAgency extends Observable { + private String news; + + public void setNews(String news) { + this.news = news; + setChanged(); + notifyObservers(news); + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsChannel.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsChannel.java new file mode 100644 index 0000000000..3989fe0286 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/ONewsChannel.java @@ -0,0 +1,22 @@ +package com.baeldung.designpatterns.observer; + +import java.util.Observable; +import java.util.Observer; + +public class ONewsChannel implements Observer { + + private String news; + + @Override + public void update(Observable o, Object news) { + this.setNews((String) news); + } + + public String getNews() { + return news; + } + + public void setNews(String news) { + this.news = news; + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsAgency.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsAgency.java new file mode 100644 index 0000000000..b05b97ab0b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsAgency.java @@ -0,0 +1,28 @@ +package com.baeldung.designpatterns.observer; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +public class PCLNewsAgency { + private String news; + + private PropertyChangeSupport support; + + public PCLNewsAgency() { + support = new PropertyChangeSupport(this); + } + + public void addPropertyChangeListener(PropertyChangeListener pcl) { + support.addPropertyChangeListener(pcl); + } + + public void removePropertyChangeListener(PropertyChangeListener pcl) { + support.removePropertyChangeListener(pcl); + } + + public void setNews(String value) { + support.firePropertyChange("news", this.news, value); + this.news = value; + + } +} diff --git a/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsChannel.java b/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsChannel.java new file mode 100644 index 0000000000..ff8d35463c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/designpatterns/observer/PCLNewsChannel.java @@ -0,0 +1,21 @@ +package com.baeldung.designpatterns.observer; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class PCLNewsChannel implements PropertyChangeListener { + + private String news; + + public void propertyChange(PropertyChangeEvent evt) { + this.setNews((String) evt.getNewValue()); + } + + public String getNews() { + return news; + } + + public void setNews(String news) { + this.news = news; + } +} diff --git a/core-java/src/main/java/com/baeldung/finalize/CloseableResource.java b/core-java/src/main/java/com/baeldung/finalize/CloseableResource.java new file mode 100644 index 0000000000..d286570fbc --- /dev/null +++ b/core-java/src/main/java/com/baeldung/finalize/CloseableResource.java @@ -0,0 +1,30 @@ +package com.baeldung.finalize; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class CloseableResource implements AutoCloseable { + private BufferedReader reader; + + public CloseableResource() { + InputStream input = this.getClass().getClassLoader().getResourceAsStream("file.txt"); + reader = new BufferedReader(new InputStreamReader(input)); + } + + public String readFirstLine() throws IOException { + String firstLine = reader.readLine(); + return firstLine; + } + + @Override + public void close() { + try { + reader.close(); + System.out.println("Closed BufferedReader in the close method"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/finalize/Finalizable.java b/core-java/src/main/java/com/baeldung/finalize/Finalizable.java new file mode 100644 index 0000000000..cfc6616f5c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/finalize/Finalizable.java @@ -0,0 +1,30 @@ +package com.baeldung.finalize; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class Finalizable { + private BufferedReader reader; + + public Finalizable() { + InputStream input = this.getClass().getClassLoader().getResourceAsStream("file.txt"); + reader = new BufferedReader(new InputStreamReader(input)); + } + + public String readFirstLine() throws IOException { + String firstLine = reader.readLine(); + return firstLine; + } + + @Override + public void finalize() { + try { + reader.close(); + System.out.println("Closed BufferedReader in the finalizer"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java new file mode 100644 index 0000000000..b6bb5181b8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/ArmoredCar.java @@ -0,0 +1,43 @@ +package com.baeldung.inheritance; + +public class ArmoredCar extends Car implements Floatable, Flyable{ + private int bulletProofWindows; + private String model; + + public void remoteStartCar() { + // this vehicle can be started by using a remote control + } + + public String registerModel() { + return model; + } + + public String getAValue() { + return super.model; // returns value of model defined in base class Car + // return this.model; // will return value of model defined in ArmoredCar + // return model; // will return value of model defined in ArmoredCar + } + + public static String msg() { + // return super.msg(); // this won't compile. + return "ArmoredCar"; + } + + @Override + public void floatOnWater() { + System.out.println("I can float!"); + } + + @Override + public void fly() { + System.out.println("I can fly!"); + } + + public void aMethod() { + // System.out.println(duration); // Won't compile + System.out.println(Floatable.duration); // outputs 10 + System.out.println(Flyable.duration); // outputs 20 + } + + +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/BMW.java b/core-java/src/main/java/com/baeldung/inheritance/BMW.java new file mode 100644 index 0000000000..8ad3bb683f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/BMW.java @@ -0,0 +1,12 @@ +package com.baeldung.inheritance; + +public class BMW extends Car { + public BMW() { + super(5, "BMW"); + } + + @Override + public String toString() { + return model; + } +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/Car.java b/core-java/src/main/java/com/baeldung/inheritance/Car.java new file mode 100644 index 0000000000..21ea9ea569 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/Car.java @@ -0,0 +1,32 @@ +package com.baeldung.inheritance; + +public class Car { + private final int DEFAULT_WHEEL_COUNT = 5; + private final String DEFAULT_MODEL = "Basic"; + + protected int wheels; + protected String model; + + public Car() { + this.wheels = DEFAULT_WHEEL_COUNT; + this.model = DEFAULT_MODEL; + } + + public Car(int wheels, String model) { + this.wheels = wheels; + this.model = model; + } + + public void start() { + // Check essential parts + // If okay, start. + } + public static int count = 10; + public static String msg() { + return "Car"; + } + + public String toString() { + return model; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/inheritance/Employee.java b/core-java/src/main/java/com/baeldung/inheritance/Employee.java new file mode 100644 index 0000000000..599a1d7331 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.inheritance; + +public class Employee { + private String name; + private Car car; + + public Employee(String name, Car car) { + this.name = name; + this.car = car; + } + + public Car getCar() { + return car; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java/src/main/java/com/baeldung/inheritance/Floatable.java new file mode 100644 index 0000000000..c0b456dffb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/Floatable.java @@ -0,0 +1,10 @@ +package com.baeldung.inheritance; + +public interface Floatable { + int duration = 10; + void floatOnWater(); + + default void repair() { + System.out.println("Repairing Floatable object"); + } +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java/src/main/java/com/baeldung/inheritance/Flyable.java new file mode 100644 index 0000000000..cb8244cf5b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/Flyable.java @@ -0,0 +1,13 @@ +package com.baeldung.inheritance; + +public interface Flyable { + int duration = 10; + void fly(); + + /* + * Commented + */ + //default void repair() { + // System.out.println("Repairing Flyable object"); + //} +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java new file mode 100644 index 0000000000..8c23b26da9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/SpaceCar.java @@ -0,0 +1,18 @@ +package com.baeldung.inheritance; + +public class SpaceCar extends Car implements SpaceTraveller { + @Override + public void floatOnWater() { + System.out.println("SpaceCar floating!"); + } + + @Override + public void fly() { + System.out.println("SpaceCar flying!"); + } + + @Override + public void remoteControl() { + System.out.println("SpaceCar being controlled remotely!"); + } +} diff --git a/core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java new file mode 100644 index 0000000000..9b66441791 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/inheritance/SpaceTraveller.java @@ -0,0 +1,6 @@ +package com.baeldung.inheritance; + +public interface SpaceTraveller extends Floatable, Flyable { + int duration = 10; + void remoteControl(); +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/initializationguide/User.java b/core-java/src/main/java/com/baeldung/initializationguide/User.java new file mode 100644 index 0000000000..e2e3f051dd --- /dev/null +++ b/core-java/src/main/java/com/baeldung/initializationguide/User.java @@ -0,0 +1,53 @@ +package com.baeldung.initializationguide; + +import java.io.Serializable; + +public class User implements Serializable, Cloneable { + private static final long serialVersionUID = 1L; + static String forum; + private String name; + private int id; + + { + id = 0; + System.out.println("Instance Initializer"); + } + + static { + forum = "Java"; + System.out.println("Static Initializer"); + } + + public User(String name, int id) { + super(); + this.name = name; + this.id = id; + } + + public User() { + System.out.println("Constructor"); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return this; + } + +} + diff --git a/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java b/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java new file mode 100644 index 0000000000..29ed2d3d26 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java @@ -0,0 +1,21 @@ +package com.baeldung.interfaces; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class CommaSeparatedCustomers implements Customer.List { + + private List customers = new ArrayList(); + + @Override + public void Add(Customer customer) { + customers.add(customer); + } + + @Override + public String getCustomerNames() { + return customers.stream().map(customer -> customer.getName()).collect(Collectors.joining(",")); + } + +} diff --git a/core-java/src/main/java/com/baeldung/interfaces/Customer.java b/core-java/src/main/java/com/baeldung/interfaces/Customer.java new file mode 100644 index 0000000000..d2f2b48074 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/interfaces/Customer.java @@ -0,0 +1,19 @@ +package com.baeldung.interfaces; + +public class Customer { + public interface List { + void Add(Customer customer); + + String getCustomerNames(); + } + + private String name; + + public Customer(String name) { + this.name = name; + } + + String getName() { + return name; + } +} diff --git a/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java b/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java new file mode 100644 index 0000000000..447f588fed --- /dev/null +++ b/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java @@ -0,0 +1,39 @@ +package com.baeldung.iteratorguide; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class IteratorGuide { + + public static void main(String[] args) { + List items = new ArrayList<>(); + items.add("ONE"); + items.add("TWO"); + items.add("THREE"); + Iterator iter = items.iterator(); + while (iter.hasNext()) { + String next = iter.next(); + System.out.println(next); + iter.remove(); + } + ListIterator listIterator = items.listIterator(); + while(listIterator.hasNext()) { + String nextWithIndex = items.get(listIterator.nextIndex()); + String next = listIterator.next(); + if( "ONE".equals(next)) { + listIterator.set("SWAPPED"); + } + } + listIterator.add("FOUR"); + while(listIterator.hasPrevious()) { + String previousWithIndex = items.get(listIterator.previousIndex()); + String previous = listIterator.previous(); + System.out.println(previous); + } + listIterator.forEachRemaining(e -> { + System.out.println(e); + }); + } +} diff --git a/core-java/src/main/java/com/baeldung/java/list/CustomList.java b/core-java/src/main/java/com/baeldung/java/list/CustomList.java new file mode 100644 index 0000000000..8b91fca32f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/list/CustomList.java @@ -0,0 +1,210 @@ +package com.baeldung.java.list; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class CustomList implements List { + private Object[] internal = {}; + + @Override + public boolean isEmpty() { + // the first cycle + // return true; + + // the second cycle + // if (internal.length != 0) { + // return false; + // } else { + // return true; + // } + + // refactoring + return internal.length == 0; + } + + @Override + public int size() { + // the first cycle + // if (isEmpty()) { + // return 0; + // } else { + // return internal.length; + // } + + // refactoring + return internal.length; + } + + @SuppressWarnings("unchecked") + @Override + public E get(int index) { + // the first cycle + // return (E) internal[0]; + + // improvement + return (E) internal[index]; + } + + @Override + public boolean add(E element) { + // the first cycle + // internal = new Object[] { element }; + // return true; + + // the second cycle + Object[] temp = Arrays.copyOf(internal, internal.length + 1); + temp[internal.length] = element; + internal = temp; + return true; + } + + @Override + public void add(int index, E element) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean addAll(Collection collection) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean addAll(int index, Collection collection) { + throw new UnsupportedOperationException(); + } + + @Override + public E remove(int index) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean remove(Object object) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean removeAll(Collection collection) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean retainAll(Collection collection) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean contains(Object object) { + for (Object element : internal) { + if (object.equals(element)) { + return true; + } + } + return false; + } + + @Override + public boolean containsAll(Collection collection) { + for (Object element : collection) + if (!contains(element)) { + return false; + } + return true; + } + + @SuppressWarnings("unchecked") + @Override + public E set(int index, E element) { + E oldElement = (E) internal[index]; + internal[index] = element; + return oldElement; + } + + @Override + public void clear() { + internal = new Object[0]; + } + + @Override + public int indexOf(Object object) { + for (int i = 0; i < internal.length; i++) { + if (object.equals(internal[i])) { + return i; + } + } + return -1; + } + + @Override + public int lastIndexOf(Object object) { + for (int i = internal.length - 1; i >= 0; i--) { + if (object.equals(internal[i])) { + return i; + } + } + return -1; + } + + @SuppressWarnings("unchecked") + @Override + public List subList(int fromIndex, int toIndex) { + Object[] temp = new Object[toIndex - fromIndex]; + System.arraycopy(internal, fromIndex, temp, 0, temp.length); + return (List) Arrays.asList(temp); + } + + @Override + public Object[] toArray() { + return Arrays.copyOf(internal, internal.length); + } + + @SuppressWarnings("unchecked") + @Override + public T[] toArray(T[] array) { + if (array.length < internal.length) { + return (T[]) Arrays.copyOf(internal, internal.length, array.getClass()); + } + + System.arraycopy(internal, 0, array, 0, internal.length); + if (array.length > internal.length) { + array[internal.length] = null; + } + return array; + } + + @Override + public Iterator iterator() { + return new CustomIterator(); + } + + @Override + public ListIterator listIterator() { + return null; + } + + @Override + public ListIterator listIterator(int index) { + // ignored for brevity + return null; + } + + private class CustomIterator implements Iterator { + int index; + + @Override + public boolean hasNext() { + return index != internal.length; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + E element = (E) CustomList.this.internal[index]; + index++; + return element; + } + } +} diff --git a/core-java/src/main/java/com/baeldung/javac/Data.java b/core-java/src/main/java/com/baeldung/javac/Data.java new file mode 100644 index 0000000000..feef0c4f1e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javac/Data.java @@ -0,0 +1,16 @@ +package com.baeldung.javac; + +import java.util.ArrayList; +import java.util.List; + +public class Data { + List textList = new ArrayList(); + + public void addText(String text) { + textList.add(text); + } + + public List getTextList() { + return this.textList; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/javadoc/Person.java b/core-java/src/main/java/com/baeldung/javadoc/Person.java new file mode 100644 index 0000000000..5efb410de4 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javadoc/Person.java @@ -0,0 +1,22 @@ +package com.baeldung.javadoc; + +public class Person { + /** + * This is a first name + */ + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java b/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java new file mode 100644 index 0000000000..561430f66f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java @@ -0,0 +1,70 @@ +package com.baeldung.javadoc; + +/** + * Hero is the main entity we will be using to . . . + * @author Captain America + * + */ +public class SuperHero extends Person { + + /** + * The public name of a hero that is common knowledge + */ + private String heroName; + private String uniquePower; + private int health; + private int defense; + + /** + *

This is a simple description of the method. . . + * Superman! + *

+ * @param incomingDamage the amount of incoming damage + * @return the amount of health hero has after attack + * @see HERO-402 + * @since 1.0 + * @deprecated As of version 1.1, use . . . instead + * @version 1.2 + * @throws IllegalArgumentException if incomingDamage is negative + */ + public int successfullyAttacked(int incomingDamage, String damageType) throws Exception { + // do things + if (incomingDamage < 0) { + throw new IllegalArgumentException ("Cannot cause negative damage"); + } + return 0; + } + + public String getHeroName() { + return heroName; + } + + public void setHeroName(String heroName) { + this.heroName = heroName; + } + + public String getUniquePower() { + return uniquePower; + } + + public void setUniquePower(String uniquePower) { + this.uniquePower = uniquePower; + } + + public int getHealth() { + return health; + } + + public void setHealth(int health) { + this.health = health; + } + + public int getDefense() { + return defense; + } + + public void setDefense(int defense) { + this.defense = defense; + } + +} diff --git a/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java new file mode 100644 index 0000000000..d5c53c3ffc --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java @@ -0,0 +1,96 @@ +package com.baeldung.jdbc; + +import java.sql.*; +import java.util.UUID; + +public class BatchProcessing { + + private final String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"}; + private final String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"}; + private final String[] ADDRESSES = new String[]{"China","York","Diego","Carolina","India"}; + + private Connection connection; + + public void getConnection(){ + try { + Class.forName("org.hsqldb.jdbcDriver"); + connection = DriverManager.getConnection("jdbc:hsqldb:file:C:\\EMPLOYEEDB", "SA", ""); + connection.setAutoCommit(false); + } catch (Exception e) { + e.printStackTrace(System.out); + } + } + + public void createTables(){ + try { + connection.createStatement().executeUpdate("create table EMPLOYEE (ID VARCHAR(36), NAME VARCHAR(45), DESIGNATION VARCHAR(15))"); + connection.createStatement().executeUpdate("create table EMP_ADDRESS (ID VARCHAR(36), EMP_ID VARCHAR(36), ADDRESS VARCHAR(45))"); + System.out.println("Tables Created!!!"); + } catch (SQLException e) { + e.printStackTrace(System.out); + } + } + + public void useStatement(){ + try { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES ('%s','%s','%s');"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES ('%s','%s','%s');"; + Statement statement = connection.createStatement(); + for(int i = 0; i < EMPLOYEES.length; i++){ + String employeeId = UUID.randomUUID().toString(); + statement.addBatch(String.format(insertEmployeeSQL, employeeId, EMPLOYEES[i],DESIGNATIONS[i])); + statement.addBatch(String.format(insertEmployeeAddrSQL, UUID.randomUUID().toString(),employeeId,ADDRESSES[i])); + } + statement.executeBatch(); + connection.commit(); + } catch (Exception e) { + try { + connection.rollback(); + } catch (SQLException ex) { + System.out.println("Error during rollback"); + System.out.println(ex.getMessage()); + } + e.printStackTrace(System.out); + } + } + + public void usePreparedStatement(){ + try { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL); + PreparedStatement empAddressStmt = connection.prepareStatement(insertEmployeeAddrSQL); + for(int i = 0; i < EMPLOYEES.length; i++){ + String employeeId = UUID.randomUUID().toString(); + employeeStmt.setString(1,employeeId); + employeeStmt.setString(2,EMPLOYEES[i]); + employeeStmt.setString(3,DESIGNATIONS[i]); + employeeStmt.addBatch(); + + empAddressStmt.setString(1,UUID.randomUUID().toString()); + empAddressStmt.setString(2,employeeId); + empAddressStmt.setString(3,ADDRESSES[i]); + empAddressStmt.addBatch(); + } + employeeStmt.executeBatch(); + empAddressStmt.executeBatch(); + connection.commit(); + } catch (Exception e) { + try { + connection.rollback(); + } catch (SQLException ex) { + System.out.println("Error during rollback"); + System.out.println(ex.getMessage()); + } + e.printStackTrace(System.out); + } + } + + public static void main(String[] args) { + BatchProcessing batchProcessing = new BatchProcessing(); + batchProcessing.getConnection(); + batchProcessing.createTables(); + batchProcessing.useStatement(); + batchProcessing.usePreparedStatement(); + } +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java b/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java new file mode 100644 index 0000000000..9cfcff468e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java @@ -0,0 +1,51 @@ +package com.baeldung.jdbcrowset; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAutoConfiguration +public class DatabaseConfiguration { + + + public static Connection geth2Connection() throws Exception { + Class.forName("org.h2.Driver"); + System.out.println("Driver Loaded."); + String url = "jdbc:h2:mem:testdb"; + return DriverManager.getConnection(url, "sa", ""); + } + + public static void initDatabase(Statement stmt) throws SQLException{ + int iter = 1; + while(iter<=5){ + String customer = "Customer"+iter; + String sql ="INSERT INTO customers(id, name) VALUES ("+iter+ ",'"+customer+"');"; + System.out.println("here is sql statmeent for execution: " + sql); + stmt.executeUpdate(sql); + iter++; + } + + int iterb = 1; + while(iterb<=5){ + String associate = "Associate"+iter; + String sql = "INSERT INTO associates(id, name) VALUES("+iterb+",'"+associate+"');"; + System.out.println("here is sql statement for associate:"+ sql); + stmt.executeUpdate(sql); + iterb++; + } + + + } + + + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java b/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java new file mode 100644 index 0000000000..7d5bb759f5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java @@ -0,0 +1,24 @@ +package com.baeldung.jdbcrowset; + +import javax.sql.RowSetEvent; +import javax.sql.RowSetListener; + +public class ExampleListener implements RowSetListener { + + + public void cursorMoved(RowSetEvent event) { + System.out.println("ExampleListener alerted of cursorMoved event"); + System.out.println(event.toString()); + } + + public void rowChanged(RowSetEvent event) { + System.out.println("ExampleListener alerted of rowChanged event"); + System.out.println(event.toString()); + } + + public void rowSetChanged(RowSetEvent event) { + System.out.println("ExampleListener alerted of rowSetChanged event"); + System.out.println(event.toString()); + } + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java b/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java new file mode 100644 index 0000000000..14e738f72d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/FilterExample.java @@ -0,0 +1,46 @@ +package com.baeldung.jdbcrowset; + +import java.sql.SQLException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.sql.RowSet; +import javax.sql.rowset.Predicate; + +public class FilterExample implements Predicate { + + private Pattern pattern; + + public FilterExample(String regexQuery) { + if (regexQuery != null && !regexQuery.isEmpty()) { + pattern = Pattern.compile(regexQuery); + } + } + + public boolean evaluate(RowSet rs) { + try { + if (!rs.isAfterLast()) { + String name = rs.getString("name"); + System.out.println(String.format( + "Searching for pattern '%s' in %s", pattern.toString(), + name)); + Matcher matcher = pattern.matcher(name); + return matcher.matches(); + } else + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean evaluate(Object value, int column) throws SQLException { + throw new UnsupportedOperationException("This operation is unsupported."); + } + + public boolean evaluate(Object value, String columnName) + throws SQLException { + throw new UnsupportedOperationException("This operation is unsupported."); + } + +} diff --git a/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java b/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java new file mode 100644 index 0000000000..72c462ac42 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java @@ -0,0 +1,139 @@ +package com.baeldung.jdbcrowset; + +import java.io.FileOutputStream; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +import com.sun.rowset.*; + +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.FilteredRowSet; +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.JoinRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; +import javax.sql.rowset.WebRowSet; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JdbcRowsetApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(JdbcRowsetApplication.class, args); + Statement stmt = null; + try { + Connection conn = DatabaseConfiguration.geth2Connection(); + + String drop = "DROP TABLE IF EXISTS customers, associates;"; + String schema = "CREATE TABLE customers (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id)); "; + String schemapartb = "CREATE TABLE associates (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id));"; + + stmt = conn.createStatement(); + stmt.executeUpdate(drop); + stmt.executeUpdate(schema); + stmt.executeUpdate(schemapartb); + // insert data + DatabaseConfiguration.initDatabase(stmt); + // JdbcRowSet Example + String sql = "SELECT * FROM customers"; + JdbcRowSet jdbcRS; + jdbcRS = new JdbcRowSetImpl(conn); + jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); + jdbcRS.setCommand(sql); + jdbcRS.execute(); + jdbcRS.addRowSetListener(new ExampleListener()); + + while (jdbcRS.next()) { + // each call to next, generates a cursorMoved event + System.out.println("id=" + jdbcRS.getString(1)); + System.out.println("name=" + jdbcRS.getString(2)); + } + + // CachedRowSet Example + String username = "sa"; + String password = ""; + String url = "jdbc:h2:mem:testdb"; + CachedRowSet crs = new CachedRowSetImpl(); + crs.setUsername(username); + crs.setPassword(password); + crs.setUrl(url); + crs.setCommand(sql); + crs.execute(); + crs.addRowSetListener(new ExampleListener()); + while (crs.next()) { + if (crs.getInt("id") == 1) { + System.out.println("CRS found customer1 and will remove the record."); + crs.deleteRow(); + break; + } + } + + // WebRowSet example + WebRowSet wrs = new WebRowSetImpl(); + wrs.setUsername(username); + wrs.setPassword(password); + wrs.setUrl(url); + wrs.setCommand(sql); + wrs.execute(); + FileOutputStream ostream = new FileOutputStream("customers.xml"); + wrs.writeXml(ostream); + + // JoinRowSet example + CachedRowSetImpl customers = new CachedRowSetImpl(); + customers.setUsername(username); + customers.setPassword(password); + customers.setUrl(url); + customers.setCommand(sql); + customers.execute(); + + CachedRowSetImpl associates = new CachedRowSetImpl(); + associates.setUsername(username); + associates.setPassword(password); + associates.setUrl(url); + String associatesSQL = "SELECT * FROM associates"; + associates.setCommand(associatesSQL); + associates.execute(); + + JoinRowSet jrs = new JoinRowSetImpl(); + final String ID = "id"; + final String NAME = "name"; + jrs.addRowSet(customers, ID); + jrs.addRowSet(associates, ID); + jrs.last(); + System.out.println("Total rows: " + jrs.getRow()); + jrs.beforeFirst(); + while (jrs.next()) { + + String string1 = jrs.getString(ID); + String string2 = jrs.getString(NAME); + System.out.println("ID: " + string1 + ", NAME: " + string2); + } + + // FilteredRowSet example + RowSetFactory rsf = RowSetProvider.newFactory(); + FilteredRowSet frs = rsf.createFilteredRowSet(); + frs.setCommand("select * from customers"); + frs.execute(conn); + frs.setFilter(new FilterExample("^[A-C].*")); + + ResultSetMetaData rsmd = frs.getMetaData(); + int columncount = rsmd.getColumnCount(); + while (frs.next()) { + for (int i = 1; i <= columncount; i++) { + System.out.println(rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); + } + } + + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + +} diff --git a/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java new file mode 100644 index 0000000000..1b2e621b52 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/loops/LoopsInJava.java @@ -0,0 +1,43 @@ +package com.baeldung.loops; + +public class LoopsInJava { + + public int[] simple_for_loop() { + int[] arr = new int[5]; + for (int i = 0; i < 5; i++) { + arr[i] = i; + System.out.println("Simple for loop: i - " + i); + } + return arr; + } + + public int[] enhanced_for_each_loop() { + int[] intArr = { 0, 1, 2, 3, 4 }; + int[] arr = new int[5]; + for (int num : intArr) { + arr[num] = num; + System.out.println("Enhanced for-each loop: i - " + num); + } + return arr; + } + + public int[] while_loop() { + int i = 0; + int[] arr = new int[5]; + while (i < 5) { + arr[i] = i; + System.out.println("While loop: i - " + i++); + } + return arr; + } + + public int[] do_while_loop() { + int i = 0; + int[] arr = new int[5]; + do { + arr[i] = i; + System.out.println("Do-While loop: i - " + i++); + } while (i < 5); + return arr; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java new file mode 100644 index 0000000000..6e023e9fa8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java @@ -0,0 +1,26 @@ +package com.baeldung.methodoverloadingoverriding.application; + +import com.baeldung.methodoverloadingoverriding.model.Car; +import com.baeldung.methodoverloadingoverriding.model.Vehicle; +import com.baeldung.methodoverloadingoverriding.util.Multiplier; + +public class Application { + + public static void main(String[] args) { + Multiplier multiplier = new Multiplier(); + System.out.println(multiplier.multiply(10, 10)); + System.out.println(multiplier.multiply(10, 10, 10)); + System.out.println(multiplier.multiply(10, 10.5)); + System.out.println(multiplier.multiply(10.5, 10.5)); + + Vehicle vehicle = new Vehicle(); + System.out.println(vehicle.accelerate(100)); + System.out.println(vehicle.run()); + System.out.println(vehicle.stop()); + + Vehicle car = new Car(); + System.out.println(car.accelerate(80)); + System.out.println(car.run()); + System.out.println(car.stop()); + } +} diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java new file mode 100644 index 0000000000..aa5bdcaec9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java @@ -0,0 +1,9 @@ +package com.baeldung.methodoverloadingoverriding.model; + +public class Car extends Vehicle { + + @Override + public String accelerate(long mph) { + return "The car accelerates at : " + mph + " MPH."; + } +} diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java new file mode 100644 index 0000000000..eb59e8ca23 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java @@ -0,0 +1,16 @@ +package com.baeldung.methodoverloadingoverriding.model; + +public class Vehicle { + + public String accelerate(long mph) { + return "The vehicle accelerates at : " + mph + " MPH."; + } + + public String stop() { + return "The vehicle has stopped."; + } + + public String run() { + return "The vehicle is running."; + } +} diff --git a/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java new file mode 100644 index 0000000000..c43e61c78f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java @@ -0,0 +1,16 @@ +package com.baeldung.methodoverloadingoverriding.util; + +public class Multiplier { + + public int multiply(int a, int b) { + return a * b; + } + + public int multiply(int a, int b, int c) { + return a * b * c; + } + + public double multiply(double a, double b) { + return a * b; + } +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java new file mode 100644 index 0000000000..7f2665ff2d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/FileManager.java @@ -0,0 +1,38 @@ +package com.baeldung.polymorphism; + +import java.awt.image.BufferedImage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FileManager { + + final static Logger logger = LoggerFactory.getLogger(FileManager.class); + + public static void main(String[] args) { + GenericFile file1 = new TextFile("SampleTextFile", "This is a sample text content", "v1.0.0"); + logger.info("File Info: \n" + file1.getFileInfo() + "\n"); + ImageFile imageFile = new ImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString() + .getBytes(), "v1.0.0"); + logger.info("File Info: \n" + imageFile.getFileInfo()); + } + + public static ImageFile createImageFile(String name, int height, int width, byte[] content, String version) { + ImageFile imageFile = new ImageFile(name, height, width, content, version); + logger.info("File 2 Info: \n" + imageFile.getFileInfo()); + return imageFile; + } + + public static GenericFile createTextFile(String name, String content, String version) { + GenericFile file1 = new TextFile(name, content, version); + logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n"); + return file1; + } + + public static TextFile createTextFile2(String name, String content, String version) { + TextFile file1 = new TextFile(name, content, version); + logger.info("File 1 Info: \n" + file1.getFileInfo() + "\n"); + return file1; + } + +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java new file mode 100644 index 0000000000..85acbc5be0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/GenericFile.java @@ -0,0 +1,63 @@ +package com.baeldung.polymorphism; + +import java.util.Date; + +public class GenericFile { + private String name; + private String extension; + private Date dateCreated; + private String version; + private byte[] content; + + public GenericFile() { + this.setDateCreated(new Date()); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public Date getDateCreated() { + return dateCreated; + } + + public void setDateCreated(Date dateCreated) { + this.dateCreated = dateCreated; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public byte[] getContent() { + return content; + } + + public void setContent(byte[] content) { + this.content = content; + } + + public String getFileInfo() { + return "Generic File Impl"; + } + + public Object read() { + return content; + } +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java new file mode 100644 index 0000000000..54eb24af5e --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/ImageFile.java @@ -0,0 +1,41 @@ +package com.baeldung.polymorphism; + +public class ImageFile extends GenericFile { + private int height; + private int width; + + public ImageFile(String name, int height, int width, byte[] content, String version) { + this.setHeight(height); + this.setWidth(width); + this.setContent(content); + this.setName(name); + this.setVersion(version); + this.setExtension(".jpg"); + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public String getFileInfo() { + return "Image File Impl"; + } + + public String read() { + return this.getContent() + .toString(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java new file mode 100644 index 0000000000..0103291c5a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/polymorphism/TextFile.java @@ -0,0 +1,44 @@ +package com.baeldung.polymorphism; + +public class TextFile extends GenericFile { + private int wordCount; + + public TextFile(String name, String content, String version) { + String[] words = content.split(" "); + this.setWordCount(words.length > 0 ? words.length : 1); + this.setContent(content.getBytes()); + this.setName(name); + this.setVersion(version); + this.setExtension(".txt"); + } + + public int getWordCount() { + return wordCount; + } + + public void setWordCount(int wordCount) { + this.wordCount = wordCount; + } + + public String getFileInfo() { + return "Text File Impl"; + } + + public String read() { + return this.getContent() + .toString(); + } + + public String read(int limit) { + return this.getContent() + .toString() + .substring(0, limit); + } + + public String read(int start, int stop) { + return this.getContent() + .toString() + .substring(start, stop); + } + +} diff --git a/core-java/src/main/java/com/baeldung/recursion/BinaryNode.java b/core-java/src/main/java/com/baeldung/recursion/BinaryNode.java new file mode 100644 index 0000000000..0c3f0ecc40 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/recursion/BinaryNode.java @@ -0,0 +1,31 @@ +package com.baeldung.recursion; + +public class BinaryNode { + int value; + BinaryNode left; + BinaryNode right; + + public BinaryNode(int value){ + this.value = value; + } + + public int getValue() { + return value; + } + public void setValue(int value) { + this.value = value; + } + public BinaryNode getLeft() { + return left; + } + public void setLeft(BinaryNode left) { + this.left = left; + } + public BinaryNode getRight() { + return right; + } + public void setRight(BinaryNode right) { + this.right = right; + } + +} diff --git a/core-java/src/main/java/com/baeldung/recursion/RecursionExample.java b/core-java/src/main/java/com/baeldung/recursion/RecursionExample.java new file mode 100644 index 0000000000..649c0e0587 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/recursion/RecursionExample.java @@ -0,0 +1,64 @@ +package com.baeldung.recursion; + +public class RecursionExample { + + public int sum(int n){ + if (n >= 1){ + return sum(n - 1) + n; + } + return n; + } + + public int tailSum(int currentSum, int n){ + if (n <= 1) { + return currentSum + n; + } + return tailSum(currentSum + n, n - 1); + } + + public int iterativeSum(int n){ + int sum = 0; + if(n < 0){ + return -1; + } + for(int i=0; i<=n; i++){ + sum += i; + } + return sum; + } + + public int powerOf10(int n){ + if (n == 0){ + return 1; + } + return powerOf10(n-1)*10; + } + + public int fibonacci(int n){ + if (n <=1 ){ + return n; + } + return fibonacci(n-1) + fibonacci(n-2); + } + + public String toBinary(int n){ + if (n <= 1 ){ + return String.valueOf(n); + } + return toBinary(n / 2) + String.valueOf(n % 2); + } + + public int calculateTreeHeight(BinaryNode root){ + if (root!= null){ + if (root.getLeft() != null || root.getRight() != null){ + return 1 + max(calculateTreeHeight(root.left) , calculateTreeHeight(root.right)); + } + } + return 0; + } + + public int max(int a,int b){ + return a>b ? a:b; + } + +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java new file mode 100644 index 0000000000..3e85bf13bb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java @@ -0,0 +1,7 @@ +package com.baeldung.regexp.datepattern; + +public interface DateMatcher { + + boolean matches(String date); + +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java new file mode 100644 index 0000000000..1d3a609b55 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java @@ -0,0 +1,14 @@ +package com.baeldung.regexp.datepattern; + +import java.util.regex.Pattern; + +class FormattedDateMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^\\d{4}-\\d{2}-\\d{2}$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java new file mode 100644 index 0000000000..af4e183fef --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java @@ -0,0 +1,14 @@ +package com.baeldung.regexp.datepattern; + +import java.util.regex.Pattern; + +class RangedDateMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^((19|2[0-9])[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java new file mode 100644 index 0000000000..b0243ae48f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java @@ -0,0 +1,16 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; + +import java.util.regex.Pattern; + +public class February29thMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java new file mode 100644 index 0000000000..f294348928 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java @@ -0,0 +1,16 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; + +import java.util.regex.Pattern; + +public class FebruaryGeneralMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java new file mode 100644 index 0000000000..fc8abdb201 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java @@ -0,0 +1,19 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; + +import java.util.regex.Pattern; + +class GregorianDateMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$" + + "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$" + + "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$" + + "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java new file mode 100644 index 0000000000..be202081e8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; + +import java.util.regex.Pattern; + +public class MonthsOf30DaysMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java new file mode 100644 index 0000000000..7f0943991b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; + +import java.util.regex.Pattern; + +public class MonthsOf31DaysMatcher implements DateMatcher { + + private static final Pattern DATE_PATTERN = Pattern.compile( + "^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$"); + + @Override + public boolean matches(String date) { + return DATE_PATTERN.matcher(date).matches(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/resourcebundle/ExampleControl.java b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleControl.java new file mode 100644 index 0000000000..88ce36c27f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleControl.java @@ -0,0 +1,15 @@ +package com.baeldung.resourcebundle; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; + +public class ExampleControl extends ResourceBundle.Control { + + @Override + public List getCandidateLocales(String s, Locale locale) { + return Arrays.asList(new Locale("pl", "PL")); + } + +} diff --git a/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource.java b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource.java new file mode 100644 index 0000000000..52ccc80f52 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource.java @@ -0,0 +1,14 @@ +package com.baeldung.resourcebundle; + +import java.util.ListResourceBundle; + +public class ExampleResource extends ListResourceBundle { + + @Override + protected Object[][] getContents() { + return new Object[][] { + { "greeting", "hello" } + }; + } + +} diff --git a/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl.java b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl.java new file mode 100644 index 0000000000..7d4f11a5d3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl.java @@ -0,0 +1,15 @@ +package com.baeldung.resourcebundle; + +import java.util.ListResourceBundle; + +public class ExampleResource_pl extends ListResourceBundle { + + @Override + protected Object[][] getContents() { + return new Object[][] { + { "greeting", "cześć" }, + { "language", "polish" }, + }; + } + +} diff --git a/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl_PL.java b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl_PL.java new file mode 100644 index 0000000000..252bfcb9cf --- /dev/null +++ b/core-java/src/main/java/com/baeldung/resourcebundle/ExampleResource_pl_PL.java @@ -0,0 +1,17 @@ +package com.baeldung.resourcebundle; + +import java.math.BigDecimal; +import java.util.ListResourceBundle; + +public class ExampleResource_pl_PL extends ListResourceBundle { + + @Override + protected Object[][] getContents() { + return new Object[][] { + { "currency", "polish zloty" }, + { "toUsdRate", new BigDecimal("3.401") }, + { "cities", new String[] { "Warsaw", "Cracow" } } + }; + } + +} diff --git a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java b/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java index a9f055f8f4..d2f9f0459c 100644 --- a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java +++ b/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java @@ -16,7 +16,7 @@ public class EchoMultiServer { try { serverSocket = new ServerSocket(port); while (true) - new EchoClientHandler(serverSocket.accept()).run(); + new EchoClientHandler(serverSocket.accept()).start(); } catch (IOException e) { e.printStackTrace(); diff --git a/core-java/src/main/java/com/baeldung/staticclass/Pizza.java b/core-java/src/main/java/com/baeldung/staticclass/Pizza.java new file mode 100644 index 0000000000..ee6283cee1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/staticclass/Pizza.java @@ -0,0 +1,33 @@ +package com.baeldung.staticclass; + +public class Pizza { + + private static String cookedCount; + private boolean isThinCrust; + + // Accessible globally + public static class PizzaSalesCounter { + + private static String orderedCount; + public static String deliveredCount; + + PizzaSalesCounter() { + System.out.println("Static field of enclosing class is " + + Pizza.cookedCount); + System.out.println("Non-static field of enclosing class is " + + new Pizza().isThinCrust); + } + } + + Pizza() { + System.out.println("Non private static field of static class is " + + PizzaSalesCounter.deliveredCount); + System.out.println("Private static field of static class is " + + PizzaSalesCounter.orderedCount); + } + + public static void main(String[] a) { + // Create instance of the static class without an instance of enclosing class + new Pizza.PizzaSalesCounter(); + } +} diff --git a/core-java/src/main/java/com/baeldung/string/Palindrome.java b/core-java/src/main/java/com/baeldung/string/Palindrome.java new file mode 100644 index 0000000000..97d4d36d07 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/Palindrome.java @@ -0,0 +1,66 @@ +package com.baeldung.string; + +import java.util.stream.IntStream; + +public class Palindrome { + + public boolean isPalindrome(String text) { + String clean = text.replaceAll("\\s+", "").toLowerCase(); + int length = clean.length(); + int forward = 0; + int backward = length - 1; + while (backward > forward) { + char forwardChar = clean.charAt(forward++); + char backwardChar = clean.charAt(backward--); + if (forwardChar != backwardChar) + return false; + } + return true; + } + + public boolean isPalindromeReverseTheString(String text) { + StringBuilder reverse = new StringBuilder(); + String clean = text.replaceAll("\\s+", "").toLowerCase(); + char[] plain = clean.toCharArray(); + for (int i = plain.length - 1; i >= 0; i--) + reverse.append(plain[i]); + return (reverse.toString()).equals(clean); + } + + public boolean isPalindromeUsingStringBuilder(String text) { + String clean = text.replaceAll("\\s+", "").toLowerCase(); + StringBuilder plain = new StringBuilder(clean); + StringBuilder reverse = plain.reverse(); + return (reverse.toString()).equals(clean); + } + + public boolean isPalindromeUsingStringBuffer(String text) { + String clean = text.replaceAll("\\s+", "").toLowerCase(); + StringBuffer plain = new StringBuffer(clean); + StringBuffer reverse = plain.reverse(); + return (reverse.toString()).equals(clean); + } + + public boolean isPalindromeRecursive(String text) { + String clean = text.replaceAll("\\s+", "").toLowerCase(); + return recursivePalindrome(clean, 0, clean.length() - 1); + } + + private boolean recursivePalindrome(String text, int forward, int backward) { + if (forward == backward) + return true; + if ((text.charAt(forward)) != (text.charAt(backward))) + return false; + if (forward < backward + 1) { + return recursivePalindrome(text, forward + 1, backward - 1); + } + + return true; + } + + public boolean isPalindromeUsingIntStream(String text) { + String temp = text.replaceAll("\\s+", "").toLowerCase(); + return IntStream.range(0, temp.length() / 2) + .noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1)); + } +} diff --git a/core-java/src/main/java/com/baeldung/system/DetectOS.java b/core-java/src/main/java/com/baeldung/system/DetectOS.java new file mode 100644 index 0000000000..2d605fe49f --- /dev/null +++ b/core-java/src/main/java/com/baeldung/system/DetectOS.java @@ -0,0 +1,18 @@ +package com.baeldung.system; + +import org.apache.commons.lang3.SystemUtils; + +public class DetectOS { + + public String getOperatingSystem() { + String os = System.getProperty("os.name"); + System.out.println("Using System Property: " + os); + return os; + } + + public String getOperatingSystemSystemUtils() { + String os = SystemUtils.OS_NAME; + System.out.println("Using SystemUtils: " + os); + return os; + } +} diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java new file mode 100644 index 0000000000..e9c8056ff5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java @@ -0,0 +1,22 @@ +package com.baeldung.threadlocalrandom; + +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +public class ThreadLocalRandomBenchMarkRunner { + + public static void main(String[] args) throws Exception { + + Options options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName()) + .threads(1) + .forks(1) + .shouldFailOnError(true) + .shouldDoGC(true) + .jvmArgs("-server") + .build(); + + new Runner(options).run(); + + } +} diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java new file mode 100644 index 0000000000..8a0e2d2826 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java @@ -0,0 +1,64 @@ +package com.baeldung.threadlocalrandom; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +@BenchmarkMode(Mode.AverageTime) +@Warmup(iterations = 1) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +public class ThreadLocalRandomBenchMarker { + + List> randomCallables = new ArrayList<>(); + List> threadLocalRandomCallables = new ArrayList<>(); + + @Setup(Level.Iteration) + public void init() { + Random random = new Random(); + randomCallables = new ArrayList<>(); + threadLocalRandomCallables = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + randomCallables.add(() -> { + return random.nextInt(); + }); + } + + for (int i = 0; i < 1000; i++) { + threadLocalRandomCallables.add(() -> { + return ThreadLocalRandom.current() + .nextInt(); + }); + } + } + + @Benchmark + public void randomValuesUsingRandom() throws InterruptedException { + ExecutorService executor = Executors.newWorkStealingPool(); + executor.invokeAll(randomCallables); + executor.shutdown(); + } + + @Benchmark + public void randomValuesUsingThreadLocalRandom() throws InterruptedException { + ExecutorService executor = Executors.newWorkStealingPool(); + executor.invokeAll(threadLocalRandomCallables); + executor.shutdown(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java new file mode 100644 index 0000000000..4882ebe175 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java @@ -0,0 +1,43 @@ +package com.baeldung.timezonedisplay; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +public class TimezoneDisplayJava7 { + + public enum OffsetBase { + GMT, UTC + } + + public List getTimeZoneList(TimezoneDisplayJava7.OffsetBase base) { + String[] availableZoneIds = TimeZone.getAvailableIDs(); + List result = new ArrayList<>(availableZoneIds.length); + + for (String zoneId : availableZoneIds) { + TimeZone curTimeZone = TimeZone.getTimeZone(zoneId); + + String offset = calculateOffset(curTimeZone.getRawOffset()); + + result.add(String.format("(%s%s) %s", base, offset, zoneId)); + } + + Collections.sort(result); + + return result; + } + + private String calculateOffset(int rawOffset) { + if (rawOffset == 0) { + return "+00:00"; + } + long hours = TimeUnit.MILLISECONDS.toHours(rawOffset); + long minutes = TimeUnit.MILLISECONDS.toMinutes(rawOffset); + minutes = Math.abs(minutes - TimeUnit.HOURS.toMinutes(hours)); + + return String.format("%+03d:%02d", hours, Math.abs(minutes)); + } + +} diff --git a/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java new file mode 100644 index 0000000000..9f20667660 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java @@ -0,0 +1,23 @@ +package com.baeldung.timezonedisplay; + +import java.util.List; + +public class TimezoneDisplayJava7App { + + public static void main(String... args) { + TimezoneDisplayJava7 display = new TimezoneDisplayJava7(); + + System.out.println("Time zones in UTC:"); + List utc = display.getTimeZoneList(TimezoneDisplayJava7.OffsetBase.UTC); + for (String timeZone : utc) { + System.out.println(timeZone); + } + + System.out.println("Time zones in GMT:"); + List gmt = display.getTimeZoneList(TimezoneDisplayJava7.OffsetBase.GMT); + for (String timeZone : gmt) { + System.out.println(timeZone); + } + } + +} diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java new file mode 100644 index 0000000000..e3179dca32 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java @@ -0,0 +1,161 @@ +package com.baeldung.tree; + +import java.util.LinkedList; +import java.util.Queue; + +public class BinaryTree { + + Node root; + + public void add(int value) { + root = addRecursive(root, value); + } + + private Node addRecursive(Node current, int value) { + + if (current == null) { + return new Node(value); + } + + if (value < current.value) { + current.left = addRecursive(current.left, value); + } else if (value > current.value) { + current.right = addRecursive(current.right, value); + } + + return current; + } + + public boolean isEmpty() { + return root == null; + } + + public int getSize() { + return getSizeRecursive(root); + } + + private int getSizeRecursive(Node current) { + return current == null ? 0 : getSizeRecursive(current.left) + 1 + getSizeRecursive(current.right); + } + + public boolean containsNode(int value) { + return containsNodeRecursive(root, value); + } + + private boolean containsNodeRecursive(Node current, int value) { + if (current == null) { + return false; + } + + if (value == current.value) { + return true; + } + + return value < current.value + ? containsNodeRecursive(current.left, value) + : containsNodeRecursive(current.right, value); + } + + public void delete(int value) { + deleteRecursive(root, value); + } + + private Node deleteRecursive(Node current, int value) { + if (current == null) { + return null; + } + + if (value == current.value) { + // Case 1: no children + if (current.left == null && current.right == null) { + return null; + } + + // Case 2: only 1 child + if (current.right == null) { + return current.left; + } + + if (current.left == null) { + return current.right; + } + + // Case 3: 2 children + int smallestValue = findSmallestValue(current.right); + current.value = smallestValue; + current.right = deleteRecursive(current.right, smallestValue); + return current; + } + if (value < current.value) { + current.left = deleteRecursive(current.left, value); + return current; + } + + current.right = deleteRecursive(current.right, value); + return current; + } + + private int findSmallestValue(Node root) { + return root.left == null ? root.value : findSmallestValue(root.left); + } + + public void traverseInOrder(Node node) { + if (node != null) { + traverseInOrder(node.left); + System.out.print(" " + node.value); + traverseInOrder(node.right); + } + } + + public void traversePreOrder(Node node) { + if (node != null) { + System.out.print(" " + node.value); + traversePreOrder(node.left); + traversePreOrder(node.right); + } + } + + public void traversePostOrder(Node node) { + if (node != null) { + traversePostOrder(node.left); + traversePostOrder(node.right); + System.out.print(" " + node.value); + } + } + + public void traverseLevelOrder() { + if (root == null) { + return; + } + + Queue nodes = new LinkedList<>(); + nodes.add(root); + + while (!nodes.isEmpty()) { + + Node node = nodes.remove(); + + System.out.print(" " + node.value); + + if (node.left != null) { + nodes.add(node.left); + } + + if (node.left != null) { + nodes.add(node.right); + } + } + } + + class Node { + int value; + Node left; + Node right; + + Node(int value) { + this.value = value; + right = null; + left = null; + } + } +} diff --git a/core-java/src/main/java/com/baeldung/trie/Trie.java b/core-java/src/main/java/com/baeldung/trie/Trie.java new file mode 100644 index 0000000000..dd51d97b2d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/trie/Trie.java @@ -0,0 +1,62 @@ +package com.baeldung.trie; + +public class Trie { + private TrieNode root; + + Trie() { + root = new TrieNode(); + } + + public void insert(String word) { + TrieNode current = root; + + for (int i = 0; i < word.length(); i++) { + current = current.getChildren().computeIfAbsent(word.charAt(i), c -> new TrieNode()); + } + current.setEndOfWord(true); + } + + public boolean delete(String word) { + return delete(root, word, 0); + } + + public boolean containsNode(String word) { + TrieNode current = root; + + for (int i = 0; i < word.length(); i++) { + char ch = word.charAt(i); + TrieNode node = current.getChildren().get(ch); + if (node == null) { + return false; + } + current = node; + } + return current.isEndOfWord(); + } + + public boolean isEmpty() { + return root == null; + } + + private boolean delete(TrieNode current, String word, int index) { + if (index == word.length()) { + if (!current.isEndOfWord()) { + return false; + } + current.setEndOfWord(false); + return current.getChildren().isEmpty(); + } + char ch = word.charAt(index); + TrieNode node = current.getChildren().get(ch); + if (node == null) { + return false; + } + boolean shouldDeleteCurrentNode = delete(node, word, index + 1); + + if (shouldDeleteCurrentNode) { + current.getChildren().remove(ch); + return current.getChildren().isEmpty(); + } + return false; + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/trie/TrieNode.java b/core-java/src/main/java/com/baeldung/trie/TrieNode.java new file mode 100644 index 0000000000..25dc753950 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/trie/TrieNode.java @@ -0,0 +1,31 @@ +package com.baeldung.trie; + +import java.util.HashMap; +import java.util.Map; + +class TrieNode { + private Map children; + private boolean endOfWord; + + public TrieNode() { + children = new HashMap<>(); + endOfWord = false; + } + + public Map getChildren() { + return children; + } + + public void setChildren(Map children) { + this.children = children; + } + + public boolean isEndOfWord() { + return endOfWord; + } + + public void setEndOfWord(boolean endOfWord) { + this.endOfWord = endOfWord; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/javac-args/arguments b/core-java/src/main/java/javac-args/arguments new file mode 100644 index 0000000000..51639800a7 --- /dev/null +++ b/core-java/src/main/java/javac-args/arguments @@ -0,0 +1,2 @@ +-d javac-target -verbose +com/baeldung/javac/Data.java \ No newline at end of file diff --git a/core-java/src/main/java/javac-args/options b/core-java/src/main/java/javac-args/options new file mode 100644 index 0000000000..f02f2344ff --- /dev/null +++ b/core-java/src/main/java/javac-args/options @@ -0,0 +1,2 @@ +-d javac-target +-verbose \ No newline at end of file diff --git a/core-java/src/main/java/javac-args/types b/core-java/src/main/java/javac-args/types new file mode 100644 index 0000000000..ef2d861f84 --- /dev/null +++ b/core-java/src/main/java/javac-args/types @@ -0,0 +1 @@ +com/baeldung/javac/Data.java \ No newline at end of file diff --git a/core-java/src/main/java/javac-args/xlint-ops b/core-java/src/main/java/javac-args/xlint-ops new file mode 100644 index 0000000000..cdccbc0cce --- /dev/null +++ b/core-java/src/main/java/javac-args/xlint-ops @@ -0,0 +1,3 @@ +-d javac-target +-Xlint:rawtypes,unchecked,static,cast,serial,fallthrough +com/baeldung/javac/Data.java \ No newline at end of file diff --git a/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin b/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin new file mode 100644 index 0000000000..91fb6eb3b0 --- /dev/null +++ b/core-java/src/main/resources/META-INF/services/com.sun.source.util.Plugin @@ -0,0 +1 @@ +com.baeldung.javac.SampleJavacPlugin \ No newline at end of file diff --git a/core-java/src/main/resources/countries.properties b/core-java/src/main/resources/countries.properties new file mode 100644 index 0000000000..50b5e85653 --- /dev/null +++ b/core-java/src/main/resources/countries.properties @@ -0,0 +1,3 @@ +UK +US +Germany \ No newline at end of file diff --git a/core-java/src/main/resources/fileTest.txt b/core-java/src/main/resources/fileTest.txt deleted file mode 100644 index ce4bea208b..0000000000 --- a/core-java/src/main/resources/fileTest.txt +++ /dev/null @@ -1 +0,0 @@ -Hello World from fileTest.txt!!! \ No newline at end of file diff --git a/core-java/src/main/resources/resourcebundle/resource.properties b/core-java/src/main/resources/resourcebundle/resource.properties new file mode 100644 index 0000000000..edeae3ef4b --- /dev/null +++ b/core-java/src/main/resources/resourcebundle/resource.properties @@ -0,0 +1,6 @@ +# Buttons +cancelButton=cancel +continueButton continue + +! Labels +helloLabel:hello diff --git a/core-java/src/main/resources/resourcebundle/resource_en.properties b/core-java/src/main/resources/resourcebundle/resource_en.properties new file mode 100644 index 0000000000..5d72b65e2f --- /dev/null +++ b/core-java/src/main/resources/resourcebundle/resource_en.properties @@ -0,0 +1 @@ +deleteButton=delete \ No newline at end of file diff --git a/core-java/src/main/resources/resourcebundle/resource_pl_PL.properties b/core-java/src/main/resources/resourcebundle/resource_pl_PL.properties new file mode 100644 index 0000000000..37dea822ad --- /dev/null +++ b/core-java/src/main/resources/resourcebundle/resource_pl_PL.properties @@ -0,0 +1,3 @@ +backButton=cofnij +helloLabel=cze\u015b\u0107 +helloLabelNoEncoding=cześć \ No newline at end of file diff --git a/core-java/src/main/resources/sample.txt b/core-java/src/main/resources/sample.txt deleted file mode 100644 index 20f137b416..0000000000 --- a/core-java/src/main/resources/sample.txt +++ /dev/null @@ -1,2 +0,0 @@ -line 1 -a second line \ No newline at end of file diff --git a/core-java/src/main/resources/targetFile.tmp b/core-java/src/main/resources/targetFile.tmp deleted file mode 100644 index 20f137b416..0000000000 --- a/core-java/src/main/resources/targetFile.tmp +++ /dev/null @@ -1,2 +0,0 @@ -line 1 -a second line \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java b/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java new file mode 100644 index 0000000000..ca59ee51fb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/ArrayInverterUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.array; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class ArrayInverterUnitTest { + + private String[] fruits = { "apples", "tomatoes", "bananas", "guavas", "pineapples", "oranges" }; + + @Test + public void invertArrayWithForLoop() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingFor(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithCollectionsReverse() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingCollectionsReverse(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithStreams() { + ArrayInverter inverter = new ArrayInverter(); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(inverter.invertUsingStreams(fruits)); + } + + @Test + public void invertArrayWithCommonsLang() { + ArrayInverter inverter = new ArrayInverter(); + inverter.invertUsingCommonsLang(fruits); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(fruits); + } + + @Test + public void invertArrayWithGuava() { + ArrayInverter inverter = new ArrayInverter(); + + assertThat(new String[] { "oranges", "pineapples", "guavas", "bananas", "tomatoes", "apples" }).isEqualTo(inverter.invertUsingGuava(fruits)); + } + +} diff --git a/core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayTest.java b/core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayTest.java new file mode 100644 index 0000000000..ec916af092 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/Find2ndLargestInArrayTest.java @@ -0,0 +1,16 @@ +package com.baeldung.array; + +import org.junit.Assert; +import org.junit.Test; + +public class Find2ndLargestInArrayTest { + @Test + public void givenAnIntArray_thenFind2ndLargestElement() { + int[] array = { 1, 3, 24, 16, 87, 20 }; + int expected2ndLargest = 24; + + int actualSecondLargestElement = Find2ndLargestInArray.find2ndLargestElement(array); + + Assert.assertEquals(expected2ndLargest, actualSecondLargestElement); + } +} diff --git a/core-java/src/test/java/com/baeldung/array/FindElementInArrayTest.java b/core-java/src/test/java/com/baeldung/array/FindElementInArrayTest.java new file mode 100644 index 0000000000..ba9188fa7b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/FindElementInArrayTest.java @@ -0,0 +1,35 @@ +package com.baeldung.array; + +import org.junit.Assert; +import org.junit.Test; + +public class FindElementInArrayTest { + @Test + public void givenAnIntArray_whenNotUsingStream_thenFindAnElement() { + int[] array = { 1, 3, 4, 8, 19, 20 }; + int element = 19; + boolean expectedResult = true; + boolean actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element); + Assert.assertEquals(expectedResult, actualResult); + + element = 78; + expectedResult = false; + actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element); + Assert.assertEquals(expectedResult, actualResult); + } + + @Test + public void givenAnIntArray_whenUsingStream_thenFindAnElement() { + int[] array = { 15, 16, 12, 18 }; + int element = 16; + boolean expectedResult = true; + boolean actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element); + Assert.assertEquals(expectedResult, actualResult); + + element = 20; + expectedResult = false; + actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element); + Assert.assertEquals(expectedResult, actualResult); + } + +} diff --git a/core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayTest.java b/core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayTest.java new file mode 100644 index 0000000000..3385ed690f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/array/SumAndAverageInArrayTest.java @@ -0,0 +1,41 @@ +package com.baeldung.array; + +import org.junit.Assert; +import org.junit.Test; + +public class SumAndAverageInArrayTest { + @Test + public void givenAnIntArray_whenNotUsingStream_thenFindSum() { + int[] array = { 1, 3, 4, 8, 19, 20 }; + int expectedSumOfArray = 55; + int actualSumOfArray = SumAndAverageInArray.findSumWithoutUsingStream(array); + Assert.assertEquals(expectedSumOfArray, actualSumOfArray); + } + + @Test + public void givenAnIntArray_whenUsingStream_thenFindSum() { + int[] array = { 1, 3, 4, 8, 19, 20 }; + int expectedSumOfArray = 55; + int actualSumOfArray = SumAndAverageInArray.findSumUsingStream(array); + + Assert.assertEquals(expectedSumOfArray, actualSumOfArray); + } + + @Test + public void givenAnIntArray_whenNotUsingStream_thenFindAverage() { + int[] array = { 1, 3, 4, 8, 19, 20 }; + double expectedAvgOfArray = 9.17; + double actualAvgOfArray = SumAndAverageInArray.findAverageWithoutUsingStream(array); + + Assert.assertEquals(expectedAvgOfArray, actualAvgOfArray, 0.0034); + } + + @Test + public void givenAnIntArray_whenUsingStream_thenFindAverage() { + int[] array = { 1, 3, 4, 8, 19, 20 }; + double expectedAvgOfArray = 9.17; + double actualAvgOfArray = SumAndAverageInArray.findAverageUsingStream(array); + + Assert.assertEquals(expectedAvgOfArray, actualAvgOfArray, 0.0034); + } +} diff --git a/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java b/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java new file mode 100644 index 0000000000..50813a8601 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/arraydeque/ArrayDequeTest.java @@ -0,0 +1,50 @@ +package com.baeldung.arraydeque; + +import java.util.ArrayDeque; +import java.util.Deque; + +import static org.junit.Assert.*; +import org.junit.Test; + +public class ArrayDequeTest { + + @Test + public void whenOffer_addsAtLast() { + final Deque deque = new ArrayDeque<>(); + + deque.offer("first"); + deque.offer("second"); + + assertEquals("second", deque.getLast()); + } + + @Test + public void whenPoll_removesFirst() { + final Deque deque = new ArrayDeque<>(); + + deque.offer("first"); + deque.offer("second"); + + assertEquals("first", deque.poll()); + } + + @Test + public void whenPush_addsAtFirst() { + final Deque deque = new ArrayDeque<>(); + + deque.push("first"); + deque.push("second"); + + assertEquals("second", deque.getFirst()); + } + + @Test + public void whenPop_removesLast() { + final Deque deque = new ArrayDeque<>(); + + deque.push("first"); + deque.push("second"); + + assertEquals("second", deque.pop()); + } +} diff --git a/core-java/src/test/java/com/baeldung/asciiart/AsciiArtTest.java b/core-java/src/test/java/com/baeldung/asciiart/AsciiArtTest.java new file mode 100644 index 0000000000..103681894e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/asciiart/AsciiArtTest.java @@ -0,0 +1,20 @@ +package com.baeldung.asciiart; + +import java.awt.Font; + +import org.junit.Test; + +import com.baeldung.asciiart.AsciiArt.Settings; + +public class AsciiArtTest { + + @Test + public void givenTextWithAsciiCharacterAndSettings_shouldPrintAsciiArt() { + AsciiArt asciiArt = new AsciiArt(); + String text = "BAELDUNG"; + Settings settings = asciiArt.new Settings(new Font("SansSerif", Font.BOLD, 24), text.length() * 30, 30); // 30 pixel width per character + + asciiArt.drawString(text, "*", settings); + } + +} diff --git a/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java b/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java new file mode 100644 index 0000000000..1980497cd3 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/breakcontinue/BreakContinueTest.java @@ -0,0 +1,39 @@ +package com.baeldung.breakcontinue; + +import static com.baeldung.breakcontinue.BreakContinue.labeledBreak; +import static com.baeldung.breakcontinue.BreakContinue.labeledContinue; +import static com.baeldung.breakcontinue.BreakContinue.unlabeledBreak; +import static com.baeldung.breakcontinue.BreakContinue.unlabeledBreakNestedLoops; +import static com.baeldung.breakcontinue.BreakContinue.unlabeledContinue; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class BreakContinueTest { + + @Test + public void whenUnlabeledBreak_ThenEqual() { + assertEquals(4, unlabeledBreak()); + } + + @Test + public void whenUnlabeledBreakNestedLoops_ThenEqual() { + assertEquals(2, unlabeledBreakNestedLoops()); + } + + @Test + public void whenLabeledBreak_ThenEqual() { + assertEquals(1, labeledBreak()); + } + + @Test + public void whenUnlabeledContinue_ThenEqual() { + assertEquals(5, unlabeledContinue()); + } + + @Test + public void whenLabeledContinue_ThenEqual() { + assertEquals(3, labeledContinue()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/casting/CastingTest.java b/core-java/src/test/java/com/baeldung/casting/CastingTest.java new file mode 100644 index 0000000000..dd95e0dd80 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/casting/CastingTest.java @@ -0,0 +1,80 @@ +package com.baeldung.casting; + +import org.junit.Test; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.List; + +public class CastingTest { + + @Test + public void whenPrimitiveConverted_thenValueChanged() { + double myDouble = 1.1; + int myInt = (int) myDouble; + + assertNotEquals(myDouble, myInt); + } + + @Test + public void whenUpcast_thenInstanceUnchanged() { + Cat cat = new Cat(); + Animal animal = cat; + animal = (Animal) cat; + assertTrue(animal instanceof Cat); + } + + @Test + public void whenUpcastToObject_thenInstanceUnchanged() { + Object object = new Animal(); + assertTrue(object instanceof Animal); + } + + @Test + public void whenUpcastToInterface_thenInstanceUnchanged() { + Mew mew = new Cat(); + assertTrue(mew instanceof Cat); + } + + @Test + public void whenUpcastToAnimal_thenOverridenMethodsCalled() { + List animals = new ArrayList<>(); + animals.add(new Cat()); + animals.add(new Dog()); + new AnimalFeeder().feed(animals); + } + + @Test + public void whenDowncastToCat_thenMeowIsCalled() { + Animal animal = new Cat(); + ((Cat) animal).meow(); + } + + @Test(expected = ClassCastException.class) + public void whenDownCastWithoutCheck_thenExceptionThrown() { + List animals = new ArrayList<>(); + animals.add(new Cat()); + animals.add(new Dog()); + new AnimalFeeder().uncheckedFeed(animals); + } + + @Test + public void whenDowncastToCatWithCastMethod_thenMeowIsCalled() { + Animal animal = new Cat(); + if (Cat.class.isInstance(animal)) { + Cat cat = Cat.class.cast(animal); + cat.meow(); + } + } + + @Test + public void whenParameterCat_thenOnlyCatsFed() { + List animals = new ArrayList<>(); + animals.add(new Cat()); + animals.add(new Dog()); + AnimalFeederGeneric catFeeder = new AnimalFeederGeneric(Cat.class); + List fedAnimals = catFeeder.feed(animals); + + assertTrue(fedAnimals.size() == 1); + assertTrue(fedAnimals.get(0) instanceof Cat); + } +} diff --git a/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java b/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java new file mode 100644 index 0000000000..ba8d2ed96f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung.cipher; + + +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; + +import static org.assertj.core.api.Assertions.assertThat; + +public class EncryptorUnitTest { + private String encKeyString; + private String message; + private String certificateString; + private Encryptor encryptor; + + @Before + public void init(){ + encKeyString = "1234567890123456"; + message = "This is a secret message"; + encryptor = new Encryptor(); + certificateString = "-----BEGIN CERTIFICATE-----\n" + + "MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n" + + "A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n" + + "MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n" + + "YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n" + + "ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n" + + "CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n" + + "ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n" + + "+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n" + + "MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n" + + "C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n" + + "kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n" + + "jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n" + + "evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n" + + "-----END CERTIFICATE-----"; + } + + @Test + public void givenEncryptionKey_whenMessageIsPassedToEncryptor_thenMessageIsEncrypted() throws Exception { + byte[] encryptedMessage = encryptor.encryptMessage(message.getBytes(),encKeyString.getBytes()); + + assertThat(encryptedMessage).isNotNull(); + assertThat(encryptedMessage.length % 32).isEqualTo(0); + } + + @Test + public void givenCertificateWithPublicKey_whenMessageIsPassedToEncryptor_thenMessageIsEncrypted() throws Exception { + CertificateFactory factory = CertificateFactory.getInstance("X.509"); + InputStream is = new ByteArrayInputStream(certificateString.getBytes()); + X509Certificate certificate = (X509Certificate) factory.generateCertificate(is); + + byte[] encryptedMessage = encryptor.encryptMessage(message.getBytes(),certificate); + + assertThat(encryptedMessage).isNotNull(); + assertThat(encryptedMessage.length % 128).isEqualTo(0); + } + + @Test + public void givenEncryptionKey_whenMessageIsEncrypted_thenDecryptMessage() throws Exception{ + byte[] encryptedMessageBytes = encryptor.encryptMessage(message.getBytes(),encKeyString.getBytes()); + + byte[] clearMessageBytes = encryptor.decryptMessage(encryptedMessageBytes, encKeyString.getBytes()); + + assertThat(message).isEqualTo(new String(clearMessageBytes)); + } +} diff --git a/core-java/src/test/java/com/baeldung/classloader/CustomClassLoaderTest.java b/core-java/src/test/java/com/baeldung/classloader/CustomClassLoaderTest.java new file mode 100644 index 0000000000..9f3c751805 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/classloader/CustomClassLoaderTest.java @@ -0,0 +1,23 @@ +package com.baeldung.classloader; + +import org.junit.Test; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class CustomClassLoaderTest { + + @Test + public void customLoader() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + + CustomClassLoader customClassLoader = new CustomClassLoader(); + Class c = customClassLoader.getClass(PrintClassLoader.class.getName()); + + Object ob = c.newInstance(); + + Method md = c.getMethod("printClassLoaders"); + md.invoke(ob); + + } + +} diff --git a/core-java/src/test/java/com/baeldung/classloader/PrintClassLoaderTest.java b/core-java/src/test/java/com/baeldung/classloader/PrintClassLoaderTest.java new file mode 100644 index 0000000000..f44a5cef09 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/classloader/PrintClassLoaderTest.java @@ -0,0 +1,14 @@ +package com.baeldung.classloader; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class PrintClassLoaderTest { + @Test(expected = ClassNotFoundException.class) + public void givenAppClassLoader_whenParentClassLoader_thenClassNotFoundException() throws Exception { + PrintClassLoader sampleClassLoader = (PrintClassLoader) Class.forName(PrintClassLoader.class.getName()).newInstance(); + sampleClassLoader.printClassLoaders(); + Class.forName(PrintClassLoader.class.getName(), true, PrintClassLoader.class.getClassLoader().getParent()); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java new file mode 100644 index 0000000000..f2dfc992c2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java @@ -0,0 +1,60 @@ +package com.baeldung.collection; + +import java.util.ConcurrentModificationException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Test; + +public class WhenComparingTreeMapVsHashMap { + + @Test + public void whenInsertObjectsTreeMap_thenNaturalOrder() { + Map treemap = new TreeMap<>(); + treemap.put(3, "TreeMap"); + treemap.put(2, "vs"); + treemap.put(1, "HashMap"); + Assert.assertThat(treemap.keySet(), Matchers.contains(1, 2, 3)); + } + + @Test(expected = NullPointerException.class) + public void whenInsertNullInTreeMap_thenException() { + Map treemap = new TreeMap<>(); + treemap.put(null, "NullPointerException"); + } + + @Test + public void whenInsertObjectsHashMap_thenRandomOrder() { + Map hashmap = new HashMap<>(); + hashmap.put(3, "TreeMap"); + hashmap.put(2, "vs"); + hashmap.put(1, "HashMap"); + Assert.assertThat(hashmap.keySet(), Matchers.containsInAnyOrder(1, 2, 3)); + } + + @Test + public void whenInsertNullInHashMap_thenInsertsNull() { + Map hashmap = new HashMap<>(); + hashmap.put(null, null); + Assert.assertNull(hashmap.get(null)); + } + + @Test + public void givenHashMapAndTreeMap_whenputDuplicates_thenOnlyUnique() { + Map treeMap = new HashMap<>(); + treeMap.put(1, "Baeldung"); + treeMap.put(1, "Baeldung"); + + Assert.assertTrue(treeMap.size() == 1); + + Map treeMap2 = new TreeMap<>(); + treeMap2.put(1, "Baeldung"); + treeMap2.put(1, "Baeldung"); + + Assert.assertTrue(treeMap2.size() == 1); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java new file mode 100644 index 0000000000..7dc47ee8c2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingHashSet.java @@ -0,0 +1,93 @@ +package com.baeldung.collection; + +import java.util.ConcurrentModificationException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Test; + +public class WhenUsingHashSet { + + @Test + public void whenAddingElement_shouldAddElement() { + Set hashset = new HashSet<>(); + Assert.assertTrue(hashset.add("String Added")); + } + + @Test + public void whenCheckingForElement_shouldSearchForElement() { + Set hashsetContains = new HashSet<>(); + hashsetContains.add("String Added"); + Assert.assertTrue(hashsetContains.contains("String Added")); + } + + @Test + public void whenCheckingTheSizeOfHashSet_shouldReturnThesize() { + Set hashSetSize = new HashSet<>(); + hashSetSize.add("String Added"); + Assert.assertEquals(1, hashSetSize.size()); + } + + @Test + public void whenCheckingForEmptyHashSet_shouldCheckForEmpty() { + Set emptyHashSet = new HashSet<>(); + Assert.assertTrue(emptyHashSet.isEmpty()); + } + + @Test + public void whenRemovingElement_shouldRemoveElement() { + Set removeFromHashSet = new HashSet<>(); + removeFromHashSet.add("String Added"); + Assert.assertTrue(removeFromHashSet.remove("String Added")); + } + + @Test + public void whenClearingHashSet_shouldClearHashSet() { + Set clearHashSet = new HashSet<>(); + clearHashSet.add("String Added"); + clearHashSet.clear(); + Assert.assertTrue(clearHashSet.isEmpty()); + } + + @Test + public void whenIteratingHashSet_shouldIterateHashSet() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test(expected = ConcurrentModificationException.class) + public void whenModifyingHashSetWhileIterating_shouldThrowException() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + itr.next(); + hashset.remove("Second"); + } + } + + @Test + public void whenRemovingElementUsingIterator_shouldRemoveElement() { + Set hashset = new HashSet<>(); + hashset.add("First"); + hashset.add("Second"); + hashset.add("Third"); + Iterator itr = hashset.iterator(); + while (itr.hasNext()) { + String element = itr.next(); + if (element.equals("Second")) + itr.remove(); + } + Assert.assertEquals(2, hashset.size()); + } +} diff --git a/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java new file mode 100644 index 0000000000..52d5b08813 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/collection/WhenUsingTreeSet.java @@ -0,0 +1,228 @@ +package com.baeldung.collection; + +import java.util.Comparator; +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.NavigableSet; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.junit.Assert; +import org.junit.Test; + +public class WhenUsingTreeSet { + + private static class Element { + private Integer id; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + @Override + public String toString() { + return id.toString(); + } + } + + private Comparator comparator = (ele1, ele2) -> { + return ele1.getId() + .compareTo(ele2.getId()); + }; + + @Test + public void whenAddingElement_shouldAddElement() { + Set treeSet = new TreeSet<>(); + Assert.assertTrue(treeSet.add("String Added")); + } + + @Test + public void whenCheckingForElement_shouldSearchForElement() { + Set treeSetContains = new TreeSet<>(); + treeSetContains.add("String Added"); + Assert.assertTrue(treeSetContains.contains("String Added")); + } + + @Test + public void whenRemovingElement_shouldRemoveElement() { + Set removeFromTreeSet = new TreeSet<>(); + removeFromTreeSet.add("String Added"); + Assert.assertTrue(removeFromTreeSet.remove("String Added")); + } + + @Test + public void whenClearingTreeSet_shouldClearTreeSet() { + Set clearTreeSet = new TreeSet<>(); + clearTreeSet.add("String Added"); + clearTreeSet.clear(); + Assert.assertTrue(clearTreeSet.isEmpty()); + } + + @Test + public void whenCheckingTheSizeOfTreeSet_shouldReturnThesize() { + Set treeSetSize = new TreeSet<>(); + treeSetSize.add("String Added"); + Assert.assertEquals(1, treeSetSize.size()); + } + + @Test + public void whenCheckingForEmptyTreeSet_shouldCheckForEmpty() { + Set emptyTreeSet = new TreeSet<>(); + Assert.assertTrue(emptyTreeSet.isEmpty()); + } + + @Test + public void whenIteratingTreeSet_shouldIterateTreeSetInAscendingOrder() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test + public void whenIteratingTreeSet_shouldIterateTreeSetInDescendingOrder() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.descendingIterator(); + while (itr.hasNext()) { + System.out.println(itr.next()); + } + } + + @Test(expected = ConcurrentModificationException.class) + public void whenModifyingTreeSetWhileIterating_shouldThrowException() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + itr.next(); + treeSet.remove("Second"); + } + } + + @Test + public void whenRemovingElementUsingIterator_shouldRemoveElement() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Second"); + treeSet.add("Third"); + Iterator itr = treeSet.iterator(); + while (itr.hasNext()) { + String element = itr.next(); + if (element.equals("Second")) + itr.remove(); + } + Assert.assertEquals(2, treeSet.size()); + } + + @Test(expected = NullPointerException.class) + public void whenAddingNullToNonEmptyTreeSet_shouldThrowException() { + Set treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add(null); + } + + @Test + public void whenCheckingFirstElement_shouldReturnFirstElement() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + Assert.assertEquals("First", treeSet.first()); + } + + @Test + public void whenCheckingLastElement_shouldReturnLastElement() { + TreeSet treeSet = new TreeSet<>(); + treeSet.add("First"); + treeSet.add("Last"); + Assert.assertEquals("Last", treeSet.last()); + } + + @Test + public void whenUsingComparator_shouldSortAndInsertElements() { + Set treeSet = new TreeSet<>(comparator); + Element ele1 = new Element(); + ele1.setId(100); + Element ele2 = new Element(); + ele2.setId(200); + + treeSet.add(ele1); + treeSet.add(ele2); + + System.out.println(treeSet); + } + + @Test + public void whenUsingHeadSet_shouldReturnElementsLessThanSpecifiedElement() { + Set treeSet = new TreeSet<>(comparator); + Element ele1 = new Element(); + ele1.setId(100); + Element ele2 = new Element(); + ele2.setId(200); + + treeSet.add(ele1); + treeSet.add(ele2); + + System.out.println(treeSet); + } + + @Test + public void whenUsingSubSet_shouldReturnSubSetElements() { + SortedSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set expectedSet = new TreeSet<>(); + expectedSet.add(2); + expectedSet.add(3); + expectedSet.add(4); + expectedSet.add(5); + + Set subSet = treeSet.subSet(2, 6); + Assert.assertEquals(expectedSet, subSet); + } + + @Test + public void whenUsingHeadSet_shouldReturnHeadSetElements() { + SortedSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set subSet = treeSet.headSet(6); + Assert.assertEquals(subSet, treeSet.subSet(1, 6)); + } + + @Test + public void whenUsingTailSet_shouldReturnTailSetElements() { + NavigableSet treeSet = new TreeSet<>(); + treeSet.add(1); + treeSet.add(2); + treeSet.add(3); + treeSet.add(4); + treeSet.add(5); + treeSet.add(6); + + Set subSet = treeSet.tailSet(3); + Assert.assertEquals(subSet, treeSet.subSet(3, true, 6, true)); + } +} diff --git a/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java b/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java new file mode 100644 index 0000000000..e8745884b8 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/comparable/ComparableUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.comparable; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; + +public class ComparableUnitTest { + + @Test + public void whenUsingComparable_thenSortedList() { + List footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 20); + Player player2 = new Player(67, "Roger", 22); + Player player3 = new Player(45, "Steven", 24); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + Collections.sort(footballTeam); + assertEquals(footballTeam.get(0) + .getName(), "Steven"); + assertEquals(footballTeam.get(2) + .getRanking(), 67); + } + +} diff --git a/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java b/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java new file mode 100644 index 0000000000..5b7ec3bfe4 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/comparator/ComparatorUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.comparator; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +public class ComparatorUnitTest { + + List footballTeam; + + @Before + public void setUp() { + footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 20); + Player player2 = new Player(67, "Roger", 22); + Player player3 = new Player(45, "Steven", 24); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + } + + @Test + public void whenUsingRankingComparator_thenSortedList() { + PlayerRankingComparator playerComparator = new PlayerRankingComparator(); + Collections.sort(footballTeam, playerComparator); + assertEquals(footballTeam.get(0) + .getName(), "Steven"); + assertEquals(footballTeam.get(2) + .getRanking(), 67); + } + + @Test + public void whenUsingAgeComparator_thenSortedList() { + PlayerAgeComparator playerComparator = new PlayerAgeComparator(); + Collections.sort(footballTeam, playerComparator); + assertEquals(footballTeam.get(0) + .getName(), "John"); + assertEquals(footballTeam.get(2) + .getRanking(), 45); + } + +} diff --git a/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java b/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java new file mode 100644 index 0000000000..49c8749309 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/comparator/Java8ComparatorUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.comparator; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +public class Java8ComparatorUnitTest { + + List footballTeam; + + @Before + public void setUp() { + footballTeam = new ArrayList(); + Player player1 = new Player(59, "John", 22); + Player player2 = new Player(67, "Roger", 20); + Player player3 = new Player(45, "Steven", 24); + footballTeam.add(player1); + footballTeam.add(player2); + footballTeam.add(player3); + } + + @Test + public void whenComparing_UsingLambda_thenSorted() { + System.out.println("************** Java 8 Comaparator **************"); + Comparator byRanking = (Player player1, Player player2) -> player1.getRanking() - player2.getRanking(); + + System.out.println("Before Sorting : " + footballTeam); + Collections.sort(footballTeam, byRanking); + System.out.println("After Sorting : " + footballTeam); + assertEquals(footballTeam.get(0) + .getName(), "Steven"); + assertEquals(footballTeam.get(2) + .getRanking(), 67); + } + + @Test + public void whenComparing_UsingComparatorComparing_thenSorted() { + System.out.println("********* Comaparator.comparing method *********"); + System.out.println("********* byRanking *********"); + Comparator byRanking = Comparator.comparing(Player::getRanking); + + System.out.println("Before Sorting : " + footballTeam); + Collections.sort(footballTeam, byRanking); + System.out.println("After Sorting : " + footballTeam); + assertEquals(footballTeam.get(0) + .getName(), "Steven"); + assertEquals(footballTeam.get(2) + .getRanking(), 67); + + System.out.println("********* byAge *********"); + Comparator byAge = Comparator.comparing(Player::getAge); + + System.out.println("Before Sorting : " + footballTeam); + Collections.sort(footballTeam, byAge); + System.out.println("After Sorting : " + footballTeam); + assertEquals(footballTeam.get(0) + .getName(), "Roger"); + assertEquals(footballTeam.get(2) + .getRanking(), 45); + } + +} diff --git a/core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesTest.java b/core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesTest.java new file mode 100644 index 0000000000..8acd4e023e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesTest.java @@ -0,0 +1,116 @@ +package com.baeldung.decimalformat; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; + +import org.junit.Test; + +public class DecimalFormatExamplesTest { + + double d = 1234567.89; + + @Test + public void givenSimpleDecimal_WhenFormatting_ThenCorrectOutput() { + + assertThat(new DecimalFormat("#.##", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1234567.89"); + + assertThat(new DecimalFormat("0.00", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1234567.89"); + + assertThat(new DecimalFormat("#########.###", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1234567.89"); + + assertThat(new DecimalFormat("000000000.000", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("001234567.890"); + + } + + @Test + public void givenSmallerDecimalPattern_WhenFormatting_ThenRounding() { + + assertThat(new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)).isEqualTo("1234567.9"); + + assertThat(new DecimalFormat("#", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)).isEqualTo("1234568"); + + } + + @Test + public void givenGroupingSeparator_WhenFormatting_ThenGroupedOutput() { + + assertThat(new DecimalFormat("#,###.#", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1,234,567.9"); + + assertThat(new DecimalFormat("#,###", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1,234,568"); + + } + + @Test + public void givenMixedPattern_WhenFormatting_ThenCorrectOutput() { + + assertThat(new DecimalFormat("The # number", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("The 1234568 number"); + + assertThat(new DecimalFormat("The '#' # number", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("The # 1234568 number"); + + } + + @Test + public void givenLocales_WhenFormatting_ThenCorrectOutput() { + + assertThat(new DecimalFormat("#,###.##", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1,234,567.89"); + + assertThat(new DecimalFormat("#,###.##", new DecimalFormatSymbols(Locale.ITALIAN)).format(d)) + .isEqualTo("1.234.567,89"); + + assertThat(new DecimalFormat("#,###.##", DecimalFormatSymbols.getInstance(new Locale("it", "IT"))).format(d)) + .isEqualTo("1.234.567,89"); + + } + + @Test + public void givenE_WhenFormatting_ThenScientificNotation() { + + assertThat(new DecimalFormat("00.#######E0", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("12.3456789E5"); + + assertThat(new DecimalFormat("000.000000E0", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("123.456789E4"); + + assertThat(new DecimalFormat("##0.######E0", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1.23456789E6"); + + assertThat(new DecimalFormat("###.000000E0", new DecimalFormatSymbols(Locale.ENGLISH)).format(d)) + .isEqualTo("1.23456789E6"); + + } + + @Test + public void givenString_WhenParsing_ThenCorrectOutput() throws ParseException { + + assertThat(new DecimalFormat("", new DecimalFormatSymbols(Locale.ENGLISH)).parse("1234567.89")) + .isEqualTo(1234567.89); + + assertThat(new DecimalFormat("", new DecimalFormatSymbols(Locale.ITALIAN)).parse("1.234.567,89")) + .isEqualTo(1234567.89); + + } + + @Test + public void givenStringAndBigDecimalFlag_WhenParsing_ThenCorrectOutput() throws ParseException { + + NumberFormat nf = new DecimalFormat("", new DecimalFormatSymbols(Locale.ENGLISH)); + ((DecimalFormat) nf).setParseBigDecimal(true); + assertThat(nf.parse("1234567.89")).isEqualTo(BigDecimal.valueOf(1234567.89)); + } + +} diff --git a/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java new file mode 100644 index 0000000000..196b69fbf7 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java @@ -0,0 +1,128 @@ +package com.baeldung.deepcopy; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.apache.commons.lang.SerializationUtils; +import org.junit.Ignore; +import org.junit.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; + +public class DeepCopyUnitTest { + + @Test + public void whenCreatingDeepCopyWithCopyConstructor_thenObjectsShouldNotBeSame() { + + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + + User deepCopy = new User(pm); + + assertThat(deepCopy).isNotSameAs(pm); + } + + @Test + public void whenModifyingOriginalObject_thenConstructorCopyShouldNotChange() { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + User deepCopy = new User(pm); + + address.setCountry("Great Britain"); + + assertThat(deepCopy.getAddress().getCountry()).isNotEqualTo(pm.getAddress().getCountry()); + } + + @Test + public void whenModifyingOriginalObject_thenCloneCopyShouldNotChange() { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + User deepCopy = (User) pm.clone(); + + address.setCountry("Great Britain"); + + assertThat(deepCopy.getAddress().getCountry()).isNotEqualTo(pm.getAddress().getCountry()); + } + + @Test + public void whenModifyingOriginalObject_thenCommonsCloneShouldNotChange() { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + User deepCopy = (User) SerializationUtils.clone(pm); + + address.setCountry("Great Britain"); + + assertThat(deepCopy.getAddress().getCountry()).isNotEqualTo(pm.getAddress().getCountry()); + } + + @Test + public void whenModifyingOriginalObject_thenGsonCloneShouldNotChange() { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + Gson gson = new Gson(); + User deepCopy = gson.fromJson(gson.toJson(pm), User.class); + + address.setCountry("Great Britain"); + + assertThat(deepCopy.getAddress().getCountry()).isNotEqualTo(pm.getAddress().getCountry()); + } + + @Test + public void whenModifyingOriginalObject_thenJacksonCopyShouldNotChange() throws IOException { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + ObjectMapper objectMapper = new ObjectMapper(); + User deepCopy = objectMapper.readValue(objectMapper.writeValueAsString(pm), User.class); + + address.setCountry("Great Britain"); + + assertThat(deepCopy.getAddress().getCountry()).isNotEqualTo(pm.getAddress().getCountry()); + } + + @Test + @Ignore + public void whenMakingCopies_thenShowHowLongEachMethodTakes() throws CloneNotSupportedException, IOException { + int times = 1000000; + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + + long start = System.currentTimeMillis(); + for (int i = 0; i < times; i++) { + User primeMinisterClone = (User) SerializationUtils.clone(pm); + } + long end = System.currentTimeMillis(); + System.out.println("Cloning with Apache Commons Lang took " + (end - start) + " milliseconds."); + + start = System.currentTimeMillis(); + Gson gson = new Gson(); + for (int i = 0; i < times; i++) { + User primeMinisterClone = gson.fromJson(gson.toJson(pm), User.class); + } + end = System.currentTimeMillis(); + System.out.println("Cloning with Gson took " + (end - start) + " milliseconds."); + + start = System.currentTimeMillis(); + for (int i = 0; i < times; i++) { + User primeMinisterClone = new User(pm); + } + end = System.currentTimeMillis(); + System.out.println("Cloning with the copy constructor took " + (end - start) + " milliseconds."); + + start = System.currentTimeMillis(); + for (int i = 0; i < times; i++) { + User primeMinisterClone = (User) pm.clone(); + } + end = System.currentTimeMillis(); + System.out.println("Cloning with Cloneable interface took " + (end - start) + " milliseconds."); + + start = System.currentTimeMillis(); + ObjectMapper objectMapper = new ObjectMapper(); + for (int i = 0; i < times; i++) { + User primeMinisterClone = objectMapper.readValue(objectMapper.writeValueAsString(pm), User.class); + } + end = System.currentTimeMillis(); + System.out.println("Cloning with Jackson took " + (end - start) + " milliseconds."); + } +} diff --git a/core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java new file mode 100644 index 0000000000..57660fadf1 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.deepcopy; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +public class ShallowCopyUnitTest { + + + @Test + public void whenShallowCopying_thenObjectsShouldNotBeSame() { + + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + + User shallowCopy = new User(pm.getFirstName(), pm.getLastName(), pm.getAddress()); + + assertThat(shallowCopy) + .isNotSameAs(pm); + } + + @Test + public void whenModifyingOriginalObject_thenCopyShouldChange() { + Address address = new Address("Downing St 10", "London", "England"); + User pm = new User("Prime", "Minister", address); + User shallowCopy = new User(pm.getFirstName(), pm.getLastName(), pm.getAddress()); + + address.setCountry("Great Britain"); + + assertThat(shallowCopy.getAddress().getCountry()) + .isEqualTo(pm.getAddress().getCountry()); + } +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java new file mode 100644 index 0000000000..dc02b976a0 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/abstractfactory/AbstractPatternIntegrationTest.java @@ -0,0 +1,23 @@ +package com.baeldung.designpatterns.creational.abstractfactory; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class AbstractPatternIntegrationTest { + @Test + public void givenAbstractFactory_whenGettingObjects_thenSuccessful() { + AbstractFactory abstractFactory; + + //creating a brown toy dog + abstractFactory = FactoryProvider.getFactory("Toy"); + Animal toy = abstractFactory.getAnimal("Dog"); + + abstractFactory = FactoryProvider.getFactory("Color"); + Color color = abstractFactory.getColor("Brown"); + + String result = "A " + toy.getType() + " with " + color.getColor() + " color " + toy.makeSound(); + assertEquals("A Dog with brown color Barks", result); + } + +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java new file mode 100644 index 0000000000..898330b26e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/builder/BuilderPatternIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.designpatterns.creational.builder; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class BuilderPatternIntegrationTest { + @Test + public void whenCreatingObjectThroughBuilder_thenObjectValid() { + BankAccount newAccount = new BankAccount + .BankAccountBuilder("Jon", "22738022275") + .withEmail("jon@example.com") + .wantNewsletter(true) + .build(); + + assertEquals(newAccount.getName(), "Jon"); + assertEquals(newAccount.getAccountNumber(), "22738022275"); + assertEquals(newAccount.getEmail(), "jon@example.com"); + assertEquals(newAccount.isNewsletter(), true); + } + + @Test + public void whenSkippingOptionalParameters_thenObjectValid() { + BankAccount newAccount = new BankAccount + .BankAccountBuilder("Jon", "22738022275") + .build(); + + assertEquals(newAccount.getName(), "Jon"); + assertEquals(newAccount.getAccountNumber(), "22738022275"); + assertEquals(newAccount.getEmail(), null); + assertEquals(newAccount.isNewsletter(), false); + } +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java new file mode 100644 index 0000000000..ed0419c16d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/factory/FactoryIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.designpatterns.creational.factory; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class FactoryIntegrationTest { + + @Test + public void whenUsingFactoryForSquare_thenCorrectObjectReturned() { + Polygon p; + PolygonFactory factory = new PolygonFactory(); + + //get the shape which has 4 sides + p = factory.getPolygon(4); + String result = "The shape with 4 sides is a " + p.getType(); + + assertEquals("The shape with 4 sides is a Square", result); + } + + @Test + public void whenUsingFactoryForOctagon_thenCorrectObjectReturned() { + Polygon p; + PolygonFactory factory = new PolygonFactory(); + + //get the shape which has 4 sides + p = factory.getPolygon(8); + String result = "The shape with 8 sides is a " + p.getType(); + + assertEquals("The shape with 8 sides is a Octagon", result); + } +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java new file mode 100644 index 0000000000..a3d5b7a14d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/creational/singleton/SingletonIntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.designpatterns.creational.singleton; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class SingletonIntegrationTest { + + @Test + /** + * Although there is absolutely no way to determine whether + * a class is Singleton, in this test case, we will just + * check for two objects if they point to same instance or + * not. We will also check for their hashcode. + */ + public void whenGettingMultipleObjects_thenAllPointToSame() { + //first object + Singleton obj1 = Singleton.getInstance(); + + //Second object + Singleton obj2 = Singleton.getInstance(); + + assertTrue(obj1 == obj2); + assertEquals(obj1.hashCode(), obj2.hashCode()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/flyweight/FlyweightUnitTest.java b/core-java/src/test/java/com/baeldung/designpatterns/flyweight/FlyweightUnitTest.java new file mode 100644 index 0000000000..645e2fd459 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/flyweight/FlyweightUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.designpatterns.flyweight; + +import java.awt.Color; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit test for {@link VehicleFactory}. + * + * @author Donato Rimenti + */ +public class FlyweightUnitTest { + + /** + * Checks that when the {@link VehicleFactory} is asked to provide two + * vehicles of different colors, the objects returned are different. + */ + @Test + public void givenDifferentFlyweightObjects_whenEquals_thenFalse() { + Vehicle blackVehicle = VehicleFactory.createVehicle(Color.BLACK); + Vehicle blueVehicle = VehicleFactory.createVehicle(Color.BLUE); + + Assert.assertNotNull("Object returned by the factory is null!", blackVehicle); + Assert.assertNotNull("Object returned by the factory is null!", blueVehicle); + Assert.assertNotEquals("Objects returned by the factory are equals!", blackVehicle, blueVehicle); + } + + /** + * Checks that when the {@link VehicleFactory} is asked to provide two + * vehicles of the same colors, the same object is returned twice. + */ + @Test + public void givenSameFlyweightObjects_whenEquals_thenTrue() { + Vehicle blackVehicle = VehicleFactory.createVehicle(Color.BLACK); + Vehicle anotherBlackVehicle = VehicleFactory.createVehicle(Color.BLACK); + + Assert.assertNotNull("Object returned by the factory is null!", blackVehicle); + Assert.assertNotNull("Object returned by the factory is null!", anotherBlackVehicle); + Assert.assertEquals("Objects returned by the factory are not equals!", blackVehicle, anotherBlackVehicle); + } +} diff --git a/core-java/src/test/java/com/baeldung/designpatterns/observer/ObserverIntegrationTest.java b/core-java/src/test/java/com/baeldung/designpatterns/observer/ObserverIntegrationTest.java new file mode 100644 index 0000000000..a8a0e29990 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/designpatterns/observer/ObserverIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.designpatterns.observer; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.baeldung.designpatterns.observer.NewsAgency; +import com.baeldung.designpatterns.observer.NewsChannel; + +public class ObserverIntegrationTest { + + @Test + public void whenChangingNewsAgencyState_thenNewsChannelNotified() { + + NewsAgency observable = new NewsAgency(); + NewsChannel observer = new NewsChannel(); + + observable.addObserver(observer); + + observable.setNews("news"); + assertEquals(observer.getNews(), "news"); + } + + @Test + public void whenChangingONewsAgencyState_thenONewsChannelNotified() { + + ONewsAgency observable = new ONewsAgency(); + ONewsChannel observer = new ONewsChannel(); + + observable.addObserver(observer); + + observable.setNews("news"); + assertEquals(observer.getNews(), "news"); + } + + @Test + public void whenChangingPCLNewsAgencyState_thenONewsChannelNotified() { + + PCLNewsAgency observable = new PCLNewsAgency(); + PCLNewsChannel observer = new PCLNewsChannel(); + + observable.addPropertyChangeListener(observer); + + observable.setNews("news"); + assertEquals(observer.getNews(), "news"); + } +} diff --git a/core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java b/core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java new file mode 100644 index 0000000000..57d409074b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/finalize/FinalizeUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.finalize; + +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Test; + +public class FinalizeUnitTest { + @Test + public void whenGC_thenFinalizerExecuted() throws IOException { + String firstLine = new Finalizable().readFirstLine(); + Assert.assertEquals("baeldung.com", firstLine); + System.gc(); + } + + @Test + public void whenTryWResourcesExits_thenResourceClosed() throws IOException { + try (CloseableResource resource = new CloseableResource()) { + String firstLine = resource.readFirstLine(); + Assert.assertEquals("baeldung.com", firstLine); + } + } +} diff --git a/core-java/src/test/java/com/baeldung/inheritance/AppTest.java b/core-java/src/test/java/com/baeldung/inheritance/AppTest.java new file mode 100644 index 0000000000..1235761aba --- /dev/null +++ b/core-java/src/test/java/com/baeldung/inheritance/AppTest.java @@ -0,0 +1,46 @@ +package com.baeldung.inheritance; + +import com.baeldung.inheritance.*; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +public class AppTest extends TestCase { + + public AppTest(String testName) { + super( testName ); + } + + public static Test suite() { + return new TestSuite(AppTest.class); + } + + @SuppressWarnings("static-access") + public void testStaticMethodUsingBaseClassVariable() { + Car first = new ArmoredCar(); + assertEquals("Car", first.msg()); + } + + @SuppressWarnings("static-access") + public void testStaticMethodUsingDerivedClassVariable() { + ArmoredCar second = new ArmoredCar(); + assertEquals("ArmoredCar", second.msg()); + } + + public void testAssignArmoredCarToCar() { + Employee e1 = new Employee("Shreya", new ArmoredCar()); + assertNotNull(e1.getCar()); + } + + public void testAssignSpaceCarToCar() { + Employee e2 = new Employee("Paul", new SpaceCar()); + assertNotNull(e2.getCar()); + } + + public void testBMWToCar() { + Employee e3 = new Employee("Pavni", new BMW()); + assertNotNull(e3.getCar()); + } + +} diff --git a/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java b/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java new file mode 100644 index 0000000000..8d352ba706 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java @@ -0,0 +1,37 @@ +package com.baeldung.initializationguide; +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.*; + +import java.lang.reflect.InvocationTargetException; + +public class UserTest { + + @Test + public void givenUserInstance_whenIntializedWithNew_thenInstanceIsNotNull() { + User user = new User("Alice", 1); + assertThat(user).isNotNull(); + } + + @Test + public void givenUserInstance_whenInitializedWithReflection_thenInstanceIsNotNull() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { + User user = User.class.getConstructor(String.class, int.class) + .newInstance("Alice", 2); + assertThat(user).isNotNull(); + } + + @Test + public void givenUserInstance_whenCopiedWithClone_thenExactMatchIsCreated() throws CloneNotSupportedException { + User user = new User("Alice", 3); + User clonedUser = (User) user.clone(); + assertThat(clonedUser).isEqualTo(user); + } + + @Test + public void givenUserInstance_whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault() { + User user = new User(); + assertThat(user.getName()).isNull(); + assertThat(user.getId() == 0); + } +} diff --git a/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java b/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java new file mode 100644 index 0000000000..b19ed76189 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/interfaces/InnerInterfaceTests.java @@ -0,0 +1,18 @@ +package com.baeldung.interfaces; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class InnerInterfaceTests { + @Test + public void whenCustomerListJoined_thenReturnsJoinedNames() { + Customer.List customerList = new CommaSeparatedCustomers(); + customerList.Add(new Customer("customer1")); + customerList.Add(new Customer("customer2")); + assertEquals("customer1,customer2", customerList.getCustomerNames()); + } +} diff --git a/core-java/src/test/java/com/baeldung/java/list/CustomListUnitTest.java b/core-java/src/test/java/com/baeldung/java/list/CustomListUnitTest.java new file mode 100644 index 0000000000..9ea42e88e8 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/list/CustomListUnitTest.java @@ -0,0 +1,296 @@ +package com.baeldung.java.list; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.junit.Test; + +public class CustomListUnitTest { + @Test + public void givenEmptyList_whenIsEmpty_thenTrueIsReturned() { + List list = new CustomList<>(); + + assertTrue(list.isEmpty()); + } + + @Test + public void givenNonEmptyList_whenIsEmpty_thenFalseIsReturned() { + List list = new CustomList<>(); + list.add(null); + + assertFalse(list.isEmpty()); + } + + @Test + public void givenListWithAnElement_whenSize_thenOneIsReturned() { + List list = new CustomList<>(); + list.add(null); + + assertEquals(1, list.size()); + } + + @Test + public void givenListWithAnElement_whenGet_thenThatElementIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + Object element = list.get(0); + + assertEquals("baeldung", element); + } + + @Test + public void givenEmptyList_whenElementIsAdded_thenGetReturnsThatElement() { + List list = new CustomList<>(); + boolean succeeded = list.add(null); + + assertTrue(succeeded); + } + + @Test + public void givenListWithAnElement_whenAnotherIsAdded_thenGetReturnsBoth() { + List list = new CustomList<>(); + list.add("baeldung"); + list.add(".com"); + Object element1 = list.get(0); + Object element2 = list.get(1); + + assertEquals("baeldung", element1); + assertEquals(".com", element2); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenAddToSpecifiedIndex_thenExceptionIsThrown() { + new CustomList<>().add(0, null); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenAddAllToTheEnd_thenExceptionIsThrown() { + Collection collection = new ArrayList<>(); + List list = new CustomList<>(); + list.addAll(collection); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenAddAllToSpecifiedIndex_thenExceptionIsThrown() { + Collection collection = new ArrayList<>(); + List list = new CustomList<>(); + list.addAll(0, collection); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenRemoveAtSpecifiedIndex_thenExceptionIsThrown() { + List list = new CustomList<>(); + list.add("baeldung"); + list.remove(0); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenRemoveSpecifiedElement_thenExceptionIsThrown() { + List list = new CustomList<>(); + list.add("baeldung"); + list.remove("baeldung"); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenRemoveAll_thenExceptionIsThrown() { + Collection collection = new ArrayList<>(); + collection.add("baeldung"); + List list = new CustomList<>(); + list.removeAll(collection); + } + + @Test(expected = UnsupportedOperationException.class) + public void whenRetainAll_thenExceptionIsThrown() { + Collection collection = new ArrayList<>(); + collection.add("baeldung"); + List list = new CustomList<>(); + list.add("baeldung"); + list.retainAll(collection); + } + + @Test + public void givenEmptyList_whenContains_thenFalseIsReturned() { + List list = new CustomList<>(); + + assertFalse(list.contains(null)); + } + + @Test + public void givenListWithAnElement_whenContains_thenTrueIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + + assertTrue(list.contains("baeldung")); + } + + @Test + public void givenListWithAnElement_whenContainsAll_thenTrueIsReturned() { + Collection collection = new ArrayList<>(); + collection.add("baeldung"); + List list = new CustomList<>(); + list.add("baeldung"); + + assertTrue(list.containsAll(collection)); + } + + @Test + public void givenList_whenContainsAll_thenEitherTrueOrFalseIsReturned() { + Collection collection1 = new ArrayList<>(); + collection1.add("baeldung"); + collection1.add(".com"); + Collection collection2 = new ArrayList<>(); + collection2.add("baeldung"); + + List list = new CustomList<>(); + list.add("baeldung"); + + assertFalse(list.containsAll(collection1)); + assertTrue(list.containsAll(collection2)); + } + + @Test + public void givenList_whenSet_thenOldElementIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + Object element = list.set(0, null); + + assertEquals("baeldung", element); + assertNull(list.get(0)); + } + + @Test + public void givenList_whenClear_thenAllElementsAreRemoved() { + List list = new CustomList<>(); + list.add("baeldung"); + list.clear(); + + assertTrue(list.isEmpty()); + } + + @Test + public void givenList_whenIndexOf_thenIndexZeroIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + + assertEquals(0, list.indexOf("baeldung")); + } + + @Test + public void givenList_whenIndexOf_thenPositiveIndexOrMinusOneIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + list.add(".com"); + list.add(".com"); + + assertEquals(1, list.indexOf(".com")); + assertEquals(-1, list.indexOf("com")); + } + + @Test + public void whenLastIndexOf_thenIndexZeroIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + + assertEquals(0, list.lastIndexOf("baeldung")); + } + + @Test + public void whenLastIndexOf_thenPositiveIndexOrMinusOneIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + list.add("baeldung"); + list.add(".com"); + + assertEquals(1, list.lastIndexOf("baeldung")); + assertEquals(-1, list.indexOf("com")); + } + + @Test + public void whenSubListZeroToOne_thenListContainingFirstElementIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + List subList = list.subList(0, 1); + + assertEquals("baeldung", subList.get(0)); + } + + @Test + public void whenSubListOneToTwo_thenListContainingSecondElementIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + list.add("."); + list.add("com"); + List subList = list.subList(1, 2); + + assertEquals(1, subList.size()); + assertEquals(".", subList.get(0)); + } + + @Test + public void givenListWithElements_whenToArray_thenArrayContainsThose() { + List list = new CustomList<>(); + list.add("baeldung"); + list.add(".com"); + Object[] array = list.toArray(); + + assertArrayEquals(new Object[] { "baeldung", ".com" }, array); + } + + @Test + public void givenListWithAnElement_whenToArray_thenInputArrayIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + String[] input = new String[1]; + String[] output = list.toArray(input); + + assertArrayEquals(new String[] { "baeldung" }, input); + } + + @Test + public void whenToArrayIsCalledWithEmptyInputArray_thenNewArrayIsReturned() { + List list = new CustomList<>(); + list.add("baeldung"); + String[] input = {}; + String[] output = list.toArray(input); + + assertArrayEquals(new String[] { "baeldung" }, output); + } + + @Test + public void whenToArrayIsCalledWithLargerInput_thenOutputHasTrailingNull() { + List list = new CustomList<>(); + list.add("baeldung"); + String[] input = new String[2]; + String[] output = list.toArray(input); + + assertArrayEquals(new String[] { "baeldung", null }, output); + } + + @Test + public void givenListWithOneElement_whenIterator_thenThisElementIsNext() { + List list = new CustomList<>(); + list.add("baeldung"); + Iterator iterator = list.iterator(); + + assertTrue(iterator.hasNext()); + assertEquals("baeldung", iterator.next()); + } + + @Test + public void whenIteratorHasNextIsCalledTwice_thenTheSecondReturnsFalse() { + List list = new CustomList<>(); + list.add("baeldung"); + Iterator iterator = list.iterator(); + + iterator.next(); + assertFalse(iterator.hasNext()); + } +} diff --git a/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java new file mode 100644 index 0000000000..90f2ea133f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java @@ -0,0 +1,71 @@ +package com.baeldung.jdbc; + + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnitRunner; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.Statement; + +@RunWith(MockitoJUnitRunner.class) +public class BatchProcessingTest { + + + @InjectMocks + private BatchProcessing target = new BatchProcessing(); + + @Mock + private Connection connection; + + @Mock + private Statement statement; + + @Mock + private PreparedStatement employeeStatement; + + @Mock + private PreparedStatement employeeAddressStatement; + + @Before + public void before(){ + MockitoAnnotations.initMocks(this); + } + + + @Test + public void when_useStatement_thenInsertData_success() throws Exception { + Mockito.when(connection.createStatement()).thenReturn(statement); + target.useStatement(); + } + + @Test + public void when_useStatement_ifThrowException_thenCatchException() throws Exception { + Mockito.when(connection.createStatement()).thenThrow(new RuntimeException()); + target.useStatement(); + } + + @Test + public void when_usePreparedStatement_thenInsertData_success() throws Exception { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement); + Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenReturn(employeeAddressStatement); + target.usePreparedStatement(); + } + + @Test + public void when_usePreparedStatement_ifThrowException_thenCatchException() throws Exception { + String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);"; + String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);"; + Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement); + Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenThrow(new RuntimeException()); + target.usePreparedStatement(); + } +} diff --git a/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java b/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java new file mode 100644 index 0000000000..cb455c213a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetTest.java @@ -0,0 +1,157 @@ +package com.baeldung.jdbcrowset; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.rowset.CachedRowSet; +import javax.sql.rowset.FilteredRowSet; +import javax.sql.rowset.JdbcRowSet; +import javax.sql.rowset.JoinRowSet; +import javax.sql.rowset.RowSetFactory; +import javax.sql.rowset.RowSetProvider; +import javax.sql.rowset.WebRowSet; + +import org.junit.Before; +import org.junit.Test; + +import com.sun.rowset.CachedRowSetImpl; +import com.sun.rowset.JdbcRowSetImpl; +import com.sun.rowset.JoinRowSetImpl; +import com.sun.rowset.WebRowSetImpl; + +public class JdbcRowSetTest { + Statement stmt = null; + String username = "sa"; + String password = ""; + String url = "jdbc:h2:mem:testdb"; + String sql = "SELECT * FROM customers"; + + @Before + public void setup() throws Exception { + Connection conn = DatabaseConfiguration.geth2Connection(); + + String drop = "DROP TABLE IF EXISTS customers, associates;"; + String schema = "CREATE TABLE customers (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id)); "; + String schemapartb = "CREATE TABLE associates (id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY (id));"; + stmt = conn.createStatement(); + stmt.executeUpdate(drop); + stmt.executeUpdate(schema); + stmt.executeUpdate(schemapartb); + DatabaseConfiguration.initDatabase(stmt); + + } + + // JdbcRowSet Example + @Test + public void createJdbcRowSet_SelectCustomers_ThenCorrect() throws Exception { + + String sql = "SELECT * FROM customers"; + JdbcRowSet jdbcRS; + Connection conn = DatabaseConfiguration.geth2Connection(); + jdbcRS = new JdbcRowSetImpl(conn); + jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); + jdbcRS.setCommand(sql); + jdbcRS.execute(); + jdbcRS.addRowSetListener(new ExampleListener()); + + while (jdbcRS.next()) { + // each call to next, generates a cursorMoved event + System.out.println("id=" + jdbcRS.getString(1)); + System.out.println("name=" + jdbcRS.getString(2)); + } + + } + + // CachedRowSet Example + @Test + public void createCachedRowSet_DeleteRecord_ThenCorrect() throws Exception { + + CachedRowSet crs = new CachedRowSetImpl(); + crs.setUsername(username); + crs.setPassword(password); + crs.setUrl(url); + crs.setCommand(sql); + crs.execute(); + crs.addRowSetListener(new ExampleListener()); + while (crs.next()) { + if (crs.getInt("id") == 1) { + System.out.println("CRS found customer1 and will remove the record."); + crs.deleteRow(); + break; + } + } + } + + // WebRowSet example + @Test + public void createWebRowSet_SelectCustomers_WritetoXML_ThenCorrect() throws SQLException, IOException { + + WebRowSet wrs = new WebRowSetImpl(); + wrs.setUsername(username); + wrs.setPassword(password); + wrs.setUrl(url); + wrs.setCommand(sql); + wrs.execute(); + FileOutputStream ostream = new FileOutputStream("customers.xml"); + wrs.writeXml(ostream); + } + + // JoinRowSet example + @Test + public void createCachedRowSets_DoJoinRowSet_ThenCorrect() throws Exception { + + CachedRowSetImpl customers = new CachedRowSetImpl(); + customers.setUsername(username); + customers.setPassword(password); + customers.setUrl(url); + customers.setCommand(sql); + customers.execute(); + + CachedRowSetImpl associates = new CachedRowSetImpl(); + associates.setUsername(username); + associates.setPassword(password); + associates.setUrl(url); + String associatesSQL = "SELECT * FROM associates"; + associates.setCommand(associatesSQL); + associates.execute(); + + JoinRowSet jrs = new JoinRowSetImpl(); + final String ID = "id"; + final String NAME = "name"; + jrs.addRowSet(customers, ID); + jrs.addRowSet(associates, ID); + jrs.last(); + System.out.println("Total rows: " + jrs.getRow()); + jrs.beforeFirst(); + while (jrs.next()) { + + String string1 = jrs.getString(ID); + String string2 = jrs.getString(NAME); + System.out.println("ID: " + string1 + ", NAME: " + string2); + } + } + + // FilteredRowSet example + @Test + public void createFilteredRowSet_filterByRegexExpression_thenCorrect() throws Exception { + RowSetFactory rsf = RowSetProvider.newFactory(); + FilteredRowSet frs = rsf.createFilteredRowSet(); + frs.setCommand("select * from customers"); + Connection conn = DatabaseConfiguration.geth2Connection(); + frs.execute(conn); + frs.setFilter(new FilterExample("^[A-C].*")); + + ResultSetMetaData rsmd = frs.getMetaData(); + int columncount = rsmd.getColumnCount(); + while (frs.next()) { + for (int i = 1; i <= columncount; i++) { + System.out.println(rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); + } + } + } +} diff --git a/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java new file mode 100644 index 0000000000..f82f9ddaa7 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/loops/WhenUsingLoops.java @@ -0,0 +1,107 @@ +package com.baeldung.loops; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class WhenUsingLoops { + + private LoopsInJava loops = new LoopsInJava(); + private static List list = new ArrayList<>(); + private static Set set = new HashSet<>(); + private static Map map = new HashMap<>(); + + @BeforeClass + public static void setUp() { + list.add("One"); + list.add("Two"); + list.add("Three"); + + set.add("Four"); + set.add("Five"); + set.add("Six"); + + map.put("One", 1); + map.put("Two", 2); + map.put("Three", 3); + } + + @Test + public void shouldRunForLoop() { + int[] expected = { 0, 1, 2, 3, 4 }; + int[] actual = loops.simple_for_loop(); + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void shouldRunEnhancedForeachLoop() { + int[] expected = { 0, 1, 2, 3, 4 }; + int[] actual = loops.enhanced_for_each_loop(); + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void shouldRunWhileLoop() { + int[] expected = { 0, 1, 2, 3, 4 }; + int[] actual = loops.while_loop(); + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void shouldRunDoWhileLoop() { + int[] expected = { 0, 1, 2, 3, 4 }; + int[] actual = loops.do_while_loop(); + Assert.assertArrayEquals(expected, actual); + } + + @Test + public void whenUsingSimpleFor_shouldIterateList() { + for (int i = 0; i < list.size(); i++) { + System.out.println(list.get(i)); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateList() { + for (String item : list) { + System.out.println(item); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateSet() { + for (String item : set) { + System.out.println(item); + } + } + + @Test + public void whenUsingEnhancedFor_shouldIterateMap() { + for (Entry entry : map.entrySet()) { + System.out.println("Key: " + entry.getKey() + " - " + "Value: " + entry.getValue()); + } + } + + @Test + public void whenUsingSimpleFor_shouldRunLabelledLoop() { + aa: for (int i = 1; i <= 3; i++) { + if (i == 1) + continue; + bb: for (int j = 1; j <= 3; j++) { + if (i == 2 && j == 2) { + break aa; + } + System.out.println(i + " " + j); + } + } + } + +} diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java new file mode 100644 index 0000000000..081a30c34a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.methodoverloadingoverriding.test; + +import com.baeldung.methodoverloadingoverriding.util.Multiplier; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.assertj.core.api.Assertions.*; + +public class MethodOverloadingUnitTest { + + private static Multiplier multiplier; + + @BeforeClass + public static void setUpMultiplierInstance() { + multiplier = new Multiplier(); + } + + @Test + public void givenMultiplierInstance_whenCalledMultiplyWithTwoIntegers_thenOneAssertion() { + assertThat(multiplier.multiply(10, 10)).isEqualTo(100); + } + + @Test + public void givenMultiplierInstance_whenCalledMultiplyWithTreeIntegers_thenOneAssertion() { + assertThat(multiplier.multiply(10, 10, 10)).isEqualTo(1000); + } + + @Test + public void givenMultiplierInstance_whenCalledMultiplyWithIntDouble_thenOneAssertion() { + assertThat(multiplier.multiply(10, 10.5)).isEqualTo(105.0); + } + + @Test + public void givenMultiplierInstance_whenCalledMultiplyWithDoubleDouble_thenOneAssertion() { + assertThat(multiplier.multiply(10.5, 10.5)).isEqualTo(110.25); + } + + @Test + public void givenMultiplierInstance_whenCalledMultiplyWithIntIntAndMatching_thenNoTypePromotion() { + assertThat(multiplier.multiply(10, 10)).isEqualTo(100); + } +} diff --git a/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java new file mode 100644 index 0000000000..554ac121bc --- /dev/null +++ b/core-java/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.methodoverloadingoverriding.test; + +import com.baeldung.methodoverloadingoverriding.model.Car; +import com.baeldung.methodoverloadingoverriding.model.Vehicle; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.assertj.core.api.Assertions.*; + +public class MethodOverridingUnitTest { + + private static Vehicle vehicle; + private static Car car; + + @BeforeClass + public static void setUpVehicleInstance() { + vehicle = new Vehicle(); + } + + @BeforeClass + public static void setUpCarInstance() { + car = new Car(); + } + + @Test + public void givenVehicleInstance_whenCalledAccelerate_thenOneAssertion() { + assertThat(vehicle.accelerate(100)).isEqualTo("The vehicle accelerates at : 100 MPH."); + } + + @Test + public void givenVehicleInstance_whenCalledRun_thenOneAssertion() { + assertThat(vehicle.run()).isEqualTo("The vehicle is running."); + } + + @Test + public void givenVehicleInstance_whenCalledStop_thenOneAssertion() { + assertThat(vehicle.stop()).isEqualTo("The vehicle has stopped."); + } + + @Test + public void givenCarInstance_whenCalledAccelerate_thenOneAssertion() { + assertThat(car.accelerate(80)).isEqualTo("The car accelerates at : 80 MPH."); + } + + @Test + public void givenCarInstance_whenCalledRun_thenOneAssertion() { + assertThat(car.run()).isEqualTo("The vehicle is running."); + } + + @Test + public void givenCarInstance_whenCalledStop_thenOneAssertion() { + assertThat(car.stop()).isEqualTo("The vehicle has stopped."); + } + + @Test + public void givenVehicleCarInstances_whenCalledAccelerateWithSameArgument_thenNotEqual() { + assertThat(vehicle.accelerate(100)).isNotEqualTo(car.accelerate(100)); + } + + @Test + public void givenVehicleCarInstances_whenCalledRun_thenEqual() { + assertThat(vehicle.run()).isEqualTo(car.run()); + } + + @Test + public void givenVehicleCarInstances_whenCalledStop_thenEqual() { + assertThat(vehicle.stop()).isEqualTo(car.stop()); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java new file mode 100644 index 0000000000..9fa8ee9cd5 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/AnonymousInner.java @@ -0,0 +1,20 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +abstract class SimpleAbstractClass { + abstract void run(); +} + +public class AnonymousInner { + + @Test + public void run() { + SimpleAbstractClass simpleAbstractClass = new SimpleAbstractClass() { + void run() { + System.out.println("Running Anonymous Class..."); + } + }; + simpleAbstractClass.run(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java new file mode 100644 index 0000000000..3db33cde9b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Enclosing.java @@ -0,0 +1,21 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Enclosing { + + private static int x = 1; + + public static class StaticNested { + + private void run() { + System.out.println("x = " + x); + } + } + + @Test + public void test() { + Enclosing.StaticNested nested = new Enclosing.StaticNested(); + nested.run(); + } +} diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java new file mode 100644 index 0000000000..deeb72de0c --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewEnclosing.java @@ -0,0 +1,22 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class NewEnclosing { + + private void run() { + class Local { + void run() { + System.out.println("Welcome to Baeldung!"); + } + } + Local local = new Local(); + local.run(); + } + + @Test + public void test() { + NewEnclosing newEnclosing = new NewEnclosing(); + newEnclosing.run(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java new file mode 100644 index 0000000000..260f69fd1b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/NewOuter.java @@ -0,0 +1,30 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class NewOuter { + + int a = 1; + static int b = 2; + + public class InnerClass { + int a = 3; + static final int b = 4; + + public void run() { + System.out.println("a = " + a); + System.out.println("b = " + b); + System.out.println("NewOuter.this.a = " + NewOuter.this.a); + System.out.println("NewOuter.b = " + NewOuter.b); + System.out.println("NewOuter.this.b = " + NewOuter.this.b); + } + } + + @Test + public void test() { + NewOuter outer = new NewOuter(); + NewOuter.InnerClass inner = outer.new InnerClass(); + inner.run(); + + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java new file mode 100644 index 0000000000..d5e46670c9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/nestedclass/Outer.java @@ -0,0 +1,20 @@ +package com.baeldung.nestedclass; + +import org.junit.Test; + +public class Outer { + + public class Inner { + + public void run() { + System.out.println("Calling test..."); + } + } + + @Test + public void test() { + Outer outer = new Outer(); + Outer.Inner inner = outer.new Inner(); + inner.run(); + } +} diff --git a/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java new file mode 100644 index 0000000000..58826766e0 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.polymorphism; + +import static org.junit.Assert.*; + +import java.awt.image.BufferedImage; +import org.junit.Test; + +public class PolymorphismUnitTest { + + @Test + public void givenImageFile_whenFileCreated_shouldSucceed() { + ImageFile imageFile = FileManager.createImageFile("SampleImageFile", 200, 100, new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB).toString() + .getBytes(), "v1.0.0"); + assertEquals(200, imageFile.getHeight()); + } + + // Downcasting then Upcasting + @Test + public void givenTextFile_whenTextFileCreatedAndAssignedToGenericFileAndCastBackToTextFileOnGetWordCount_shouldSucceed() { + GenericFile textFile = FileManager.createTextFile("SampleTextFile", "This is a sample text content", "v1.0.0"); + TextFile textFile2 = (TextFile) textFile; + assertEquals(6, textFile2.getWordCount()); + } + + // Downcasting + @Test(expected = ClassCastException.class) + public void givenGenericFile_whenCastToTextFileAndInvokeGetWordCount_shouldFail() { + GenericFile genericFile = new GenericFile(); + TextFile textFile = (TextFile) genericFile; + System.out.println(textFile.getWordCount()); + } +} diff --git a/core-java/src/test/java/com/baeldung/recursion/RecursionExampleTest.java b/core-java/src/test/java/com/baeldung/recursion/RecursionExampleTest.java new file mode 100644 index 0000000000..c65be24240 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/recursion/RecursionExampleTest.java @@ -0,0 +1,61 @@ +package com.baeldung.recursion; + +import org.junit.Assert; +import org.junit.Test; + +public class RecursionExampleTest { + + RecursionExample recursion = new RecursionExample(); + + @Test + public void testPowerOf10() { + int p0 = recursion.powerOf10(0); + int p1 = recursion.powerOf10(1); + int p4 = recursion.powerOf10(4); + + Assert.assertEquals(1, p0); + Assert.assertEquals(10, p1); + Assert.assertEquals(10000, p4); + } + + @Test + public void testFibonacci() { + int n0 = recursion.fibonacci(0); + int n1 = recursion.fibonacci(1); + int n7 = recursion.fibonacci(7); + + Assert.assertEquals(0, n0); + Assert.assertEquals(1, n1); + Assert.assertEquals(13, n7); + } + + @Test + public void testToBinary() { + String b0 = recursion.toBinary(0); + String b1 = recursion.toBinary(1); + String b10 = recursion.toBinary(10); + + Assert.assertEquals("0", b0); + Assert.assertEquals("1", b1); + Assert.assertEquals("1010", b10); + } + + @Test + public void testCalculateTreeHeight() { + BinaryNode root = new BinaryNode(1); + root.setLeft(new BinaryNode(1)); + root.setRight(new BinaryNode(1)); + + root.getLeft().setLeft(new BinaryNode(1)); + root.getLeft().getLeft().setRight(new BinaryNode(1)); + root.getLeft().getLeft().getRight().setLeft(new BinaryNode(1)); + + root.getRight().setLeft(new BinaryNode(1)); + root.getRight().getLeft().setRight(new BinaryNode(1)); + + int height = recursion.calculateTreeHeight(root); + + Assert.assertEquals(4, height); + } + +} diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java new file mode 100644 index 0000000000..0a9599c3f9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.regexp.datepattern; + +import org.junit.Assert; +import org.junit.Test; + +public class FormattedDateMatcherUnitTest { + + private DateMatcher matcher = new FormattedDateMatcher(); + + @Test + public void whenUsingFormattedDateMatcher_thenFormatConstraintsSatisfied() { + Assert.assertTrue(matcher.matches("2017-12-31")); + Assert.assertTrue(matcher.matches("2018-01-01")); + Assert.assertTrue(matcher.matches("0000-00-00")); + Assert.assertTrue(matcher.matches("1029-99-72")); + + Assert.assertFalse(matcher.matches("2018-01")); + Assert.assertFalse(matcher.matches("2018-01-01-01")); + Assert.assertFalse(matcher.matches("2018-01-XX")); + Assert.assertFalse(matcher.matches(" 2018-01-01")); + Assert.assertFalse(matcher.matches("2018-01-01 ")); + Assert.assertFalse(matcher.matches("2018/01/01")); + } +} diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java new file mode 100644 index 0000000000..abbff83ec1 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.regexp.datepattern; + +import org.junit.Assert; +import org.junit.Test; + +public class RangedDateMatcherUnitTest { + + private DateMatcher matcher = new RangedDateMatcher(); + + @Test + public void whenUsingRangedDateMatcher_thenFormatConstraintsSatisfied() { + Assert.assertFalse(matcher.matches("2018-01")); + Assert.assertFalse(matcher.matches("2018-01-01-01")); + Assert.assertFalse(matcher.matches("2018-01-XX")); + Assert.assertFalse(matcher.matches(" 2018-01-01")); + Assert.assertFalse(matcher.matches("2018-01-01 ")); + Assert.assertFalse(matcher.matches("2018/01/01")); + } + + @Test + public void whenUsingRangedDateMatcher_thenRangeConstraintsSatisfied() { + Assert.assertTrue(matcher.matches("1900-01-01")); + Assert.assertTrue(matcher.matches("2018-02-31")); + Assert.assertTrue(matcher.matches("2999-12-31")); + + Assert.assertFalse(matcher.matches("1899-12-31")); + Assert.assertFalse(matcher.matches("2018-05-35")); + Assert.assertFalse(matcher.matches("2018-13-05")); + Assert.assertFalse(matcher.matches("3000-01-01")); + } +} diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java new file mode 100644 index 0000000000..67a4276728 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; +import com.baeldung.regexp.datepattern.gregorian.testhelper.GregorianDateTestHelper; +import org.junit.Test; + +public class February29thMatcherUnitTest { + + private DateMatcher matcher = new February29thMatcher(); + + private GregorianDateTestHelper testHelper = new GregorianDateTestHelper(matcher); + + @Test + public void whenYearIsLeap_thenYearHasFebruary29th() { + testHelper.assertFebruary29th(); + } +} diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java new file mode 100644 index 0000000000..48ff140620 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; +import com.baeldung.regexp.datepattern.gregorian.testhelper.GregorianDateTestHelper; +import org.junit.Test; + +public class FebruaryGeneralMatcherUnitTest { + + private DateMatcher matcher = new FebruaryGeneralMatcher(); + + private GregorianDateTestHelper testHelper = new GregorianDateTestHelper(matcher); + + @Test + public void whenMonthIsFebruary_thenMonthContainsUpTo28Days() { + testHelper.assertFebruaryGeneralDates(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java new file mode 100644 index 0000000000..e6e896a09c --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; +import com.baeldung.regexp.datepattern.gregorian.testhelper.GregorianDateTestHelper; +import org.junit.Test; + +public class GregorianDateMatcherUnitTest { + + private DateMatcher matcher = new GregorianDateMatcher(); + + private GregorianDateTestHelper testHelper = new GregorianDateTestHelper(matcher); + + @Test + public void whenUsingGregorianDateMatcher_thenFormatConstraintsSatisfied() { + testHelper.assertFormat(); + } + + @Test + public void whenUsingGregorianDateMatcher_thenRangeConstraintsSatisfied() { + testHelper.assertRange(); + } + + @Test + public void whenYearIsLeap_thenFebruaryHas29Days() { + testHelper.assertFebruary29th(); + } + + @Test + public void whenMonthIsFebruary_thenMonthContainsUpTo28Days() { + testHelper.assertFebruaryGeneralDates(); + } + + @Test + public void whenMonthIsShort_thenMonthContainsUpTo30Days() { + testHelper.assertMonthsOf30Days(); + } + + @Test + public void whenMonthIsLong_thenMonthContainsUpTo31Days() { + testHelper.assertMonthsOf31Dates(); + } +} diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java new file mode 100644 index 0000000000..d1ce4a6d57 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; +import com.baeldung.regexp.datepattern.gregorian.testhelper.GregorianDateTestHelper; +import org.junit.Test; + +public class MonthsOf30DaysMatcherUnitTest { + + private DateMatcher matcher = new MonthsOf30DaysMatcher(); + + private GregorianDateTestHelper testHelper = new GregorianDateTestHelper(matcher); + + @Test + public void whenMonthIsShort_thenMonthContainsUpTo30Days() { + testHelper.assertMonthsOf30Days(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java new file mode 100644 index 0000000000..338c8de30c --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.regexp.datepattern.gregorian; + +import com.baeldung.regexp.datepattern.DateMatcher; +import com.baeldung.regexp.datepattern.gregorian.testhelper.GregorianDateTestHelper; +import org.junit.Test; + +public class MonthsOf31DaysMatcherUnitTest { + + private DateMatcher matcher = new MonthsOf31DaysMatcher(); + + private GregorianDateTestHelper testHelper = new GregorianDateTestHelper(matcher); + + @Test + public void whenMonthIsLong_thenMonthContainsUpTo31Days() { + testHelper.assertMonthsOf31Dates(); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java new file mode 100644 index 0000000000..6429e4fe2d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java @@ -0,0 +1,102 @@ +package com.baeldung.regexp.datepattern.gregorian.testhelper; + +import com.baeldung.regexp.datepattern.DateMatcher; +import org.junit.Assert; + +public class GregorianDateTestHelper { + + private final DateMatcher matcher; + + public GregorianDateTestHelper(DateMatcher matcher) { + this.matcher = matcher; + } + + public void assertFormat() { + Assert.assertTrue(matcher.matches("2017-12-31")); + Assert.assertTrue(matcher.matches("2018-01-01")); + + Assert.assertFalse(matcher.matches("2018-02")); + Assert.assertFalse(matcher.matches("2018-02-01-01")); + Assert.assertFalse(matcher.matches("2018-02-XX")); + Assert.assertFalse(matcher.matches(" 2018-02-01")); + Assert.assertFalse(matcher.matches("2018-02-01 ")); + Assert.assertFalse(matcher.matches("2020/02/28")); + Assert.assertFalse(matcher.matches("2020.02.29")); + } + + public void assertRange() { + Assert.assertTrue(matcher.matches("1900-01-01")); + Assert.assertTrue(matcher.matches("2205-05-25")); + Assert.assertTrue(matcher.matches("2999-12-31")); + + Assert.assertFalse(matcher.matches("1899-12-31")); + Assert.assertFalse(matcher.matches("2018-05-35")); + Assert.assertFalse(matcher.matches("2018-13-05")); + Assert.assertFalse(matcher.matches("3000-01-01")); + Assert.assertFalse(matcher.matches("3200-02-29")); + } + + public void assertFebruary29th() { + Assert.assertTrue(matcher.matches("2000-02-29")); + Assert.assertTrue(matcher.matches("2400-02-29")); + Assert.assertTrue(matcher.matches("2800-02-29")); + Assert.assertTrue(matcher.matches("2020-02-29")); + Assert.assertTrue(matcher.matches("2024-02-29")); + Assert.assertTrue(matcher.matches("2028-02-29")); + + Assert.assertFalse(matcher.matches("2017-02-29")); + Assert.assertFalse(matcher.matches("2018-02-29")); + Assert.assertFalse(matcher.matches("2019-02-29")); + Assert.assertFalse(matcher.matches("2100-02-29")); + Assert.assertFalse(matcher.matches("2200-02-29")); + Assert.assertFalse(matcher.matches("2300-02-29")); + } + + public void assertFebruaryGeneralDates() { + Assert.assertTrue(matcher.matches("2018-02-01")); + Assert.assertTrue(matcher.matches("2019-02-13")); + Assert.assertTrue(matcher.matches("2020-02-25")); + + Assert.assertFalse(matcher.matches("2000-02-30")); + Assert.assertFalse(matcher.matches("2400-02-62")); + Assert.assertFalse(matcher.matches("2420-02-94")); + } + + public void assertMonthsOf30Days() { + Assert.assertTrue(matcher.matches("2018-04-30")); + Assert.assertTrue(matcher.matches("2019-06-30")); + Assert.assertTrue(matcher.matches("2020-09-30")); + Assert.assertTrue(matcher.matches("2021-11-30")); + + Assert.assertTrue(matcher.matches("2022-04-02")); + Assert.assertTrue(matcher.matches("2023-06-14")); + Assert.assertTrue(matcher.matches("2024-09-26")); + + Assert.assertFalse(matcher.matches("2018-04-31")); + Assert.assertFalse(matcher.matches("2019-06-31")); + Assert.assertFalse(matcher.matches("2020-09-31")); + Assert.assertFalse(matcher.matches("2021-11-31")); + + Assert.assertFalse(matcher.matches("2022-04-32")); + Assert.assertFalse(matcher.matches("2023-06-64")); + Assert.assertFalse(matcher.matches("2024-09-96")); + } + + public void assertMonthsOf31Dates() { + Assert.assertTrue(matcher.matches("2018-01-31")); + Assert.assertTrue(matcher.matches("2019-03-31")); + Assert.assertTrue(matcher.matches("2020-05-31")); + Assert.assertTrue(matcher.matches("2021-07-31")); + Assert.assertTrue(matcher.matches("2022-08-31")); + Assert.assertTrue(matcher.matches("2023-10-31")); + Assert.assertTrue(matcher.matches("2024-12-31")); + + Assert.assertTrue(matcher.matches("2025-01-03")); + Assert.assertTrue(matcher.matches("2026-03-15")); + Assert.assertTrue(matcher.matches("2027-05-27")); + + Assert.assertFalse(matcher.matches("2018-01-32")); + Assert.assertFalse(matcher.matches("2019-03-64")); + Assert.assertFalse(matcher.matches("2020-05-96")); + } +} diff --git a/core-java/src/test/java/com/baeldung/resourcebundle/ExampleResourceUnitTest.java b/core-java/src/test/java/com/baeldung/resourcebundle/ExampleResourceUnitTest.java new file mode 100644 index 0000000000..1ce4f1bb8f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/resourcebundle/ExampleResourceUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.resourcebundle; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Locale; +import java.util.ResourceBundle; + +import static org.junit.Assert.*; + +public class ExampleResourceUnitTest { + + @Test + public void whenGetBundleExampleResourceForLocalePlPl_thenItShouldInheritPropertiesGreetingAndLanguage() { + Locale plLocale = new Locale("pl", "PL"); + + ResourceBundle exampleBundle = ResourceBundle.getBundle("com.baeldung.resourcebundle.ExampleResource", plLocale); + + assertTrue(exampleBundle.keySet() + .containsAll(Arrays.asList("toUsdRate", "cities", "greeting", "currency", "language"))); + assertEquals(exampleBundle.getString("greeting"), "cześć"); + assertEquals(exampleBundle.getObject("toUsdRate"), new BigDecimal("3.401")); + assertArrayEquals(exampleBundle.getStringArray("cities"), new String[] { "Warsaw", "Cracow" }); + } + + @Test + public void whenGetBundleExampleResourceForLocaleUs_thenItShouldContainOnlyGreeting() { + Locale usLocale = Locale.US; + + ResourceBundle exampleBundle = ResourceBundle.getBundle("com.baeldung.resourcebundle.ExampleResource", usLocale); + + assertFalse(exampleBundle.keySet() + .containsAll(Arrays.asList("toUsdRate", "cities", "currency", "language"))); + assertTrue(exampleBundle.keySet() + .containsAll(Arrays.asList("greeting"))); + } + +} diff --git a/core-java/src/test/java/com/baeldung/resourcebundle/PropertyResourceUnitTest.java b/core-java/src/test/java/com/baeldung/resourcebundle/PropertyResourceUnitTest.java new file mode 100644 index 0000000000..4da71567e1 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/resourcebundle/PropertyResourceUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.resourcebundle; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Locale; +import java.util.ResourceBundle; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class PropertyResourceUnitTest { + + @Test + public void givenLocaleUsAsDefualt_whenGetBundleForLocalePlPl_thenItShouldContain3ButtonsAnd1Label() { + Locale.setDefault(Locale.US); + + ResourceBundle bundle = ResourceBundle.getBundle("resourcebundle.resource", new Locale("pl", "PL")); + + assertTrue(bundle.keySet() + .containsAll(Arrays.asList("backButton", "helloLabel", "cancelButton", "continueButton", "helloLabelNoEncoding"))); + } + + @Test + public void givenLocaleUsAsDefualt_whenGetBundleForLocaleFrFr_thenItShouldContainKeys1To3AndKey4() { + Locale.setDefault(Locale.US); + + ResourceBundle bundle = ResourceBundle.getBundle("resourcebundle.resource", new Locale("fr", "FR")); + + assertTrue(bundle.keySet() + .containsAll(Arrays.asList("deleteButton", "helloLabel", "cancelButton", "continueButton"))); + } + + @Test + public void givenLocaleChinaAsDefualt_whenGetBundleForLocaleFrFr_thenItShouldOnlyContainKeys1To3() { + Locale.setDefault(Locale.CHINA); + + ResourceBundle bundle = ResourceBundle.getBundle("resourcebundle.resource", new Locale("fr", "FR")); + + assertTrue(bundle.keySet() + .containsAll(Arrays.asList("continueButton", "helloLabel", "cancelButton"))); + } + + @Test + public void givenLocaleChinaAsDefualt_whenGetBundleForLocaleFrFrAndExampleControl_thenItShouldOnlyContainKey5() { + Locale.setDefault(Locale.CHINA); + + ResourceBundle bundle = ResourceBundle.getBundle("resourcebundle.resource", new Locale("fr", "FR"), new ExampleControl()); + + assertTrue(bundle.keySet() + .containsAll(Arrays.asList("backButton", "helloLabel"))); + } + + @Test + public void givenValuesDifferentlyEncoded_whenGetBundleForLocalePlPl_thenItShouldContain3ButtonsAnd1Label() { + ResourceBundle bundle = ResourceBundle.getBundle("resourcebundle.resource", new Locale("pl", "PL")); + + assertEquals(bundle.getString("helloLabel"), "cześć"); + assertEquals(bundle.getString("helloLabelNoEncoding"), "czeÅ\u009BÄ\u0087"); + } + +} diff --git a/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java b/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java new file mode 100644 index 0000000000..2b04617f36 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stack/StackUnitTest.java @@ -0,0 +1,137 @@ +package com.baeldung.stack; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.List; +import java.util.ListIterator; +import java.util.Stack; + +import org.junit.Test; +public class StackUnitTest { + + @Test + public void whenStackIsCreated_thenItHasSize0() { + Stack intStack = new Stack(); + assertEquals(0, intStack.size()); + } + + @Test + public void givenEmptyStack_whenElementIsPushed_thenStackSizeisIncreased() { + Stack intStack = new Stack(); + intStack.push(1); + assertEquals(1, intStack.size()); + } + + @Test + public void givenEmptyStack_whenMultipleElementsArePushed_thenStackSizeisIncreased() { + Stack intStack = new Stack(); + List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + boolean result = intStack.addAll(intList); + assertTrue(result); + assertEquals(7, intList.size()); + } + + @Test + public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.pop(); + assertTrue(intStack.isEmpty()); + } + + @Test + public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.peek(); + assertEquals(1, intStack.search(5)); + assertEquals(1, intStack.size()); + } + + @Test + public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() { + Stack intStack = new Stack(); + intStack.push(5); + assertEquals(1, intStack.search(5)); + } + + @Test + public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() { + Stack intStack = new Stack(); + intStack.push(5); + int indexOf = intStack.indexOf(5); + assertEquals(0, indexOf); + } + + @Test + public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.push(5); + intStack.push(5); + int lastIndexOf = intStack.lastIndexOf(5); + assertEquals(2, lastIndexOf); + } + + @Test + public void givenElementOnStack_whenRemoveElementIsInvoked_thenElementIsRemoved() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.push(5); + intStack.removeElement(5); + assertEquals(1, intStack.size()); + } + + @Test + public void givenElementOnStack_whenRemoveElementAtIsInvoked_thenElementIsRemoved() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.push(7); + intStack.removeElementAt(1); + assertEquals(-1, intStack.search(7)); + } + + @Test + public void givenElementsOnStack_whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() { + Stack intStack = new Stack(); + intStack.push(5); + intStack.push(7); + intStack.removeAllElements(); + assertTrue(intStack.isEmpty()); + } + + @Test + public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() { + Stack intStack = new Stack(); + List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + intStack.addAll(intList); + intStack.add(500); + intStack.removeAll(intList); + assertEquals(1, intStack.size()); + } + + @Test + public void givenElementsOnStack_whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() { + Stack intStack = new Stack(); + List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + intStack.addAll(intList); + intStack.removeIf(element -> element < 6); + assertEquals(2, intStack.size()); + } + + @Test + public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual() { + Stack intStack = new Stack<>(); + List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + intStack.addAll(intList); + ListIterator it = intStack.listIterator(); + Stack result = new Stack(); + while(it.hasNext()) { + result.push(it.next()); + } + + assertThat(result, equalTo(intStack)); + } +} diff --git a/core-java/src/test/java/com/baeldung/string/PalindromeTest.java b/core-java/src/test/java/com/baeldung/string/PalindromeTest.java new file mode 100644 index 0000000000..bc6fee2cd9 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/PalindromeTest.java @@ -0,0 +1,97 @@ +package com.baeldung.string; + +import static org.junit.Assert.*; +import org.junit.Test; + +public class PalindromeTest { + + private String[] words = { + "Anna", + "Civic", + "Kayak", + "Level", + "Madam", + }; + + private String[] sentences = { + "Sore was I ere I saw Eros", + "Euston saw I was not Sue", + "Too hot to hoot", + "No mists or frost Simon", + "Stella won no wallets" + }; + + private Palindrome palindrome = new Palindrome(); + + @Test + public void whenWord_shouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindrome(word)); + } + + @Test + public void whenSentence_shouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindrome(sentence)); + } + + @Test + public void whenReverseWord_shouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindromeReverseTheString(word)); + } + + @Test + public void whenReverseSentence_shouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindromeReverseTheString(sentence)); + } + + @Test + public void whenStringBuilderWord_shouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindromeUsingStringBuilder(word)); + } + + @Test + public void whenStringBuilderSentence_shouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindromeUsingStringBuilder(sentence)); + } + + @Test + public void whenStringBufferWord_shouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindromeUsingStringBuffer(word)); + } + + @Test + public void whenStringBufferSentence_shouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindromeUsingStringBuffer(sentence)); + } + + @Test + public void whenPalindromeRecursive_wordShouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindromeRecursive(word)); + } + + @Test + public void whenPalindromeRecursive_sentenceShouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindromeRecursive(sentence)); + } + + @Test + public void whenPalindromeStreams_wordShouldBePalindrome() { + for (String word : words) + assertTrue(palindrome.isPalindromeUsingIntStream(word)); + } + + @Test + public void whenPalindromeStreams_sentenceShouldBePalindrome() { + for (String sentence : sentences) + assertTrue(palindrome.isPalindromeUsingIntStream(sentence)); + } +} diff --git a/core-java/src/test/java/com/baeldung/string/StringComparisonTest.java b/core-java/src/test/java/com/baeldung/string/StringComparisonTest.java new file mode 100644 index 0000000000..5869676004 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/StringComparisonTest.java @@ -0,0 +1,154 @@ +package com.baeldung.string; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StringComparisonTest { + + @Test + public void whenUsingComparisonOperator_ThenComparingStrings(){ + + String string1 = "using comparison operator"; + String string2 = "using comparison operator"; + String string3 = new String("using comparison operator"); + + assertThat(string1 == string2).isTrue(); + assertThat(string1 == string3).isFalse(); + } + + @Test + public void whenUsingEqualsMethod_ThenComparingStrings(){ + + String string1 = "using equals method"; + String string2 = "using equals method"; + + String string3 = "using EQUALS method"; + String string4 = new String("using equals method"); + + assertThat(string1.equals(string2)).isTrue(); + assertThat(string1.equals(string4)).isTrue(); + + assertThat(string1.equals(null)).isFalse(); + assertThat(string1.equals(string3)).isFalse(); + } + + @Test + public void whenUsingEqualsIgnoreCase_ThenComparingStrings(){ + + String string1 = "using equals ignore case"; + String string2 = "USING EQUALS IGNORE CASE"; + + assertThat(string1.equalsIgnoreCase(string2)).isTrue(); + } + + @Test + public void whenUsingCompareTo_ThenComparingStrings(){ + + String author = "author"; + String book = "book"; + String duplicateBook = "book"; + + assertThat(author.compareTo(book)).isEqualTo(-1); + assertThat(book.compareTo(author)).isEqualTo(1); + assertThat(duplicateBook.compareTo(book)).isEqualTo(0); + } + + @Test + public void whenUsingCompareToIgnoreCase_ThenComparingStrings(){ + + String author = "Author"; + String book = "book"; + String duplicateBook = "BOOK"; + + assertThat(author.compareToIgnoreCase(book)).isEqualTo(-1); + assertThat(book.compareToIgnoreCase(author)).isEqualTo(1); + assertThat(duplicateBook.compareToIgnoreCase(book)).isEqualTo(0); + } + + @Test + public void whenUsingObjectsEqualsMethod_ThenComparingStrings(){ + + String string1 = "using objects equals"; + String string2 = "using objects equals"; + String string3 = new String("using objects equals"); + + assertThat(Objects.equals(string1, string2)).isTrue(); + assertThat(Objects.equals(string1, string3)).isTrue(); + + assertThat(Objects.equals(null, null)).isTrue(); + assertThat(Objects.equals(null, string1)).isFalse(); + } + + @Test + public void whenUsingEqualsOfApacheCommons_ThenComparingStrings(){ + + assertThat(StringUtils.equals(null, null)).isTrue(); + assertThat(StringUtils.equals(null, "equals method")).isFalse(); + assertThat(StringUtils.equals("equals method", "equals method")).isTrue(); + assertThat(StringUtils.equals("equals method", "EQUALS METHOD")).isFalse(); + } + + @Test + public void whenUsingEqualsIgnoreCaseOfApacheCommons_ThenComparingStrings(){ + + assertThat(StringUtils.equalsIgnoreCase(null, null)).isTrue(); + assertThat(StringUtils.equalsIgnoreCase(null, "equals method")).isFalse(); + assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method")).isTrue(); + assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD")).isTrue(); + } + + @Test + public void whenUsingEqualsAnyOf_ThenComparingStrings(){ + + assertThat(StringUtils.equalsAny(null, null, null)).isTrue(); + assertThat(StringUtils.equalsAny("equals any", "equals any", "any")).isTrue(); + assertThat(StringUtils.equalsAny("equals any", null, "equals any")).isTrue(); + assertThat(StringUtils.equalsAny(null, "equals", "any")).isFalse(); + assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY")).isFalse(); + } + + @Test + public void whenUsingEqualsAnyIgnoreCase_ThenComparingStrings(){ + + assertThat(StringUtils.equalsAnyIgnoreCase(null, null, null)).isTrue(); + assertThat(StringUtils.equalsAnyIgnoreCase("equals any", "equals any", "any")).isTrue(); + assertThat(StringUtils.equalsAnyIgnoreCase("equals any", null, "equals any")).isTrue(); + assertThat(StringUtils.equalsAnyIgnoreCase(null, "equals", "any")).isFalse(); + assertThat(StringUtils.equalsAnyIgnoreCase( + "equals any ignore case", "EQUALS ANY IGNORE CASE", "any")).isTrue(); + } + + @Test + public void whenUsingCompare_thenComparingStringsWithNulls(){ + + assertThat(StringUtils.compare(null, null)).isEqualTo(0); + assertThat(StringUtils.compare(null, "abc")).isEqualTo(-1); + + assertThat(StringUtils.compare("abc", "bbc")).isEqualTo(-1); + assertThat(StringUtils.compare("bbc", "abc")).isEqualTo(1); + assertThat(StringUtils.compare("abc", "abc")).isEqualTo(0); + } + + @Test + public void whenUsingCompareIgnoreCase_ThenComparingStringsWithNulls(){ + + assertThat(StringUtils.compareIgnoreCase(null, null)).isEqualTo(0); + assertThat(StringUtils.compareIgnoreCase(null, "abc")).isEqualTo(-1); + + assertThat(StringUtils.compareIgnoreCase("Abc", "bbc")).isEqualTo(-1); + assertThat(StringUtils.compareIgnoreCase("bbc", "ABC")).isEqualTo(1); + assertThat(StringUtils.compareIgnoreCase("abc", "ABC")).isEqualTo(0); + } + + @Test + public void whenUsingCompareWithNullIsLessOption_ThenComparingStrings(){ + + assertThat(StringUtils.compare(null, "abc", true)).isEqualTo(-1); + assertThat(StringUtils.compare(null, "abc", false)).isEqualTo(1); + } + +} diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java index fe1a69aa23..e88b2d7c2c 100644 --- a/core-java/src/test/java/com/baeldung/string/StringTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -223,4 +223,4 @@ public class StringTest { assertEquals("200", String.valueOf(l)); } -} +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java b/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java new file mode 100644 index 0000000000..ad4f5dce7e --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/formatter/StringFormatterExampleTests.java @@ -0,0 +1,141 @@ +package com.baeldung.string.formatter; + +import java.util.Calendar; +import java.util.Formatter; +import java.util.GregorianCalendar; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class StringFormatterExampleTests { + + @Test + public void givenString_whenFormatSpecifierForCalendar_thenGotExpected() { + //Syntax of Format Specifiers for Date/Time Representation + Calendar c = new GregorianCalendar(2017, 11, 10); + String s = String.format("The date is: %tm %1$te,%1$tY", c); + + + assertEquals("The date is: 12 10,2017", s); + } + + @Test + public void givenString_whenGeneralConversion_thenConvertedString() { + //General Conversions + String s = String.format("The correct answer is %s", false); + assertEquals("The correct answer is false", s); + + s = String.format("The correct answer is %b", null); + assertEquals("The correct answer is false", s); + + s = String.format("The correct answer is %B", true); + assertEquals("The correct answer is TRUE", s); + } + + @Test + public void givenString_whenCharConversion_thenConvertedString() { + //Character Conversions + String s = String.format("The correct answer is %c", 'a'); + assertEquals("The correct answer is a", s); + + s = String.format("The correct answer is %c", null); + assertEquals("The correct answer is null", s); + + s = String.format("The correct answer is %C", 'b'); + assertEquals("The correct answer is B", s); + + s = String.format("The valid unicode character: %c", 0x0400); + assertTrue(Character.isValidCodePoint(0x0400)); + assertEquals("The valid unicode character: Ѐ", s); + } + + @Test(expected = java.util.IllegalFormatCodePointException.class) + public void givenString_whenIllegalCodePointForConversion_thenError() { + String s = String.format("The valid unicode character: %c", 0x11FFFF); + assertFalse(Character.isValidCodePoint(0x11FFFF)); + assertEquals("The valid unicode character: Ā", s); + } + + @Test + public void givenString_whenNumericIntegralConversion_thenConvertedString() { + //Numeric Integral Conversions + String s = String.format("The number 25 in decimal = %d", 25); + assertEquals("The number 25 in decimal = 25", s); + + s = String.format("The number 25 in octal = %o", 25); + assertEquals("The number 25 in octal = 31", s); + + s = String.format("The number 25 in hexadecimal = %x", 25); + assertEquals("The number 25 in hexadecimal = 19", s); + } + + @Test + public void givenString_whenNumericFloatingConversion_thenConvertedString() { + //Numeric Floating-point Conversions + String s = String.format("The computerized scientific format of 10000.00 " + + "= %e", 10000.00); + assertEquals("The computerized scientific format of 10000.00 = 1.000000e+04", s); + + s = String.format("The decimal format of 10.019 = %f", 10.019); + assertEquals("The decimal format of 10.019 = 10.019000", s); + } + + @Test + public void givenString_whenLineSeparatorConversion_thenConvertedString() { + //Line Separator Conversion + String s = String.format("First Line %nSecond Line"); + assertEquals("First Line " + System.getProperty("line.separator") + + "Second Line", s); + } + + @Test + public void givenString_whenSpecifyFlag_thenGotFormattedString() { + //Without left-justified flag + String s = String.format("Without left justified flag: %5d", 25); + assertEquals("Without left justified flag: 25", s); + + //Using left-justified flag + s = String.format("With left justified flag: %-5d", 25); + assertEquals("With left justified flag: 25 ", s); + } + + @Test + public void givenString_whenSpecifyPrecision_thenGotExpected() { + + //Precision + String s = String.format("Output of 25.09878 with Precision 2: %.2f", 25.09878); + assertEquals("Output of 25.09878 with Precision 2: 25.10", s); + + s = String.format("Output of general conversion type with Precision 2: %.2b", true); + assertEquals("Output of general conversion type with Precision 2: tr", s); + } + + @Test + public void givenString_whenSpecifyArgumentIndex_thenGotExpected() { + Calendar c = new GregorianCalendar(2017, 11, 10); + //Argument_Index + String s = String.format("The date is: %tm %1$te,%1$tY", c); + assertEquals("The date is: 12 10,2017", s); + + s = String.format("The date is: %tm %= leftLimit); + } + + @Test + public void givenUsingThreadLocalRandom_whenGeneratingRandomIntUnbounded_thenCorrect() { + int generatedInt = ThreadLocalRandom.current().nextInt(); + + assertTrue(generatedInt < Integer.MAX_VALUE && generatedInt >= Integer.MIN_VALUE); + } + + @Test + public void givenUsingThreadLocalRandom_whenGeneratingRandomLongBounded_thenCorrect() { + long leftLimit = 1L; + long rightLimit = 100L; + long generatedLong = ThreadLocalRandom.current().nextLong(leftLimit, rightLimit); + + assertTrue(generatedLong < rightLimit && generatedLong >= leftLimit); + } + + @Test + public void givenUsingThreadLocalRandom_whenGeneratingRandomLongUnbounded_thenCorrect() { + long generatedInt = ThreadLocalRandom.current().nextLong(); + + assertTrue(generatedInt < Long.MAX_VALUE && generatedInt >= Long.MIN_VALUE); + } + + @Test + public void givenUsingThreadLocalRandom_whenGeneratingRandomDoubleBounded_thenCorrect() { + double leftLimit = 1D; + double rightLimit = 100D; + double generatedInt = ThreadLocalRandom.current().nextDouble(leftLimit, rightLimit); + + assertTrue(generatedInt < rightLimit && generatedInt >= leftLimit); + } + + @Test + public void givenUsingThreadLocalRandom_whenGeneratingRandomDoubleUnbounded_thenCorrect() { + double generatedInt = ThreadLocalRandom.current().nextDouble(); + + assertTrue(generatedInt < Double.MAX_VALUE && generatedInt >= Double.MIN_VALUE); + } + + @Test(expected = UnsupportedOperationException.class) + public void givenUsingThreadLocalRandom_whenSettingSeed_thenThrowUnsupportedOperationException() { + ThreadLocalRandom.current().setSeed(0l); + } + +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java new file mode 100644 index 0000000000..99e656fe28 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java @@ -0,0 +1,119 @@ +package com.baeldung.tree; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class BinaryTreeTest { + + @Test + public void givenABinaryTree_WhenAddingElements_ThenTreeNotEmpty() { + + BinaryTree bt = createBinaryTree(); + + assertTrue(!bt.isEmpty()); + } + + @Test + public void givenABinaryTree_WhenAddingElements_ThenTreeContainsThoseElements() { + + BinaryTree bt = createBinaryTree(); + + assertTrue(bt.containsNode(6)); + assertTrue(bt.containsNode(4)); + + assertFalse(bt.containsNode(1)); + } + + @Test + public void givenABinaryTree_WhenAddingExistingElement_ThenElementIsNotAdded() { + + BinaryTree bt = createBinaryTree(); + + int initialSize = bt.getSize(); + + assertTrue(bt.containsNode(3)); + bt.add(3); + assertEquals(initialSize, bt.getSize()); + } + + @Test + public void givenABinaryTree_WhenLookingForNonExistingElement_ThenReturnsFalse() { + + BinaryTree bt = createBinaryTree(); + + assertFalse(bt.containsNode(99)); + } + + @Test + public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() { + + BinaryTree bt = createBinaryTree(); + + assertTrue(bt.containsNode(9)); + bt.delete(9); + assertFalse(bt.containsNode(9)); + } + + @Test + public void givenABinaryTree_WhenDeletingNonExistingElement_ThenTreeDoesNotDelete() { + + BinaryTree bt = createBinaryTree(); + + int initialSize = bt.getSize(); + + assertFalse(bt.containsNode(99)); + bt.delete(99); + assertFalse(bt.containsNode(99)); + assertEquals(initialSize, bt.getSize()); + } + + @Test + public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() { + + BinaryTree bt = createBinaryTree(); + + bt.traverseInOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingPreOrder_ThenPrintValues() { + + BinaryTree bt = createBinaryTree(); + + bt.traversePreOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingPostOrder_ThenPrintValues() { + + BinaryTree bt = createBinaryTree(); + + bt.traversePostOrder(bt.root); + } + + @Test + public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() { + + BinaryTree bt = createBinaryTree(); + + bt.traverseLevelOrder(); + } + + private BinaryTree createBinaryTree() { + BinaryTree bt = new BinaryTree(); + + bt.add(6); + bt.add(4); + bt.add(8); + bt.add(3); + bt.add(5); + bt.add(7); + bt.add(9); + + return bt; + } + +} diff --git a/core-java/src/test/java/com/baeldung/trie/TrieTest.java b/core-java/src/test/java/com/baeldung/trie/TrieTest.java new file mode 100644 index 0000000000..be7e5575d8 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/trie/TrieTest.java @@ -0,0 +1,68 @@ +package com.baeldung.trie; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class TrieTest { + + @Test + public void whenEmptyTrie_thenNoElements() { + Trie trie = new Trie(); + + assertFalse(trie.isEmpty()); + } + + @Test + public void givenATrie_whenAddingElements_thenTrieNotEmpty() { + Trie trie = createExampleTrie(); + + assertFalse(trie.isEmpty()); + } + + @Test + public void givenATrie_whenAddingElements_thenTrieHasThoseElements() { + Trie trie = createExampleTrie(); + + assertFalse(trie.containsNode("3")); + assertFalse(trie.containsNode("vida")); + + assertTrue(trie.containsNode("Programming")); + assertTrue(trie.containsNode("is")); + assertTrue(trie.containsNode("a")); + assertTrue(trie.containsNode("way")); + assertTrue(trie.containsNode("of")); + assertTrue(trie.containsNode("life")); + } + + @Test + public void givenATrie_whenLookingForNonExistingElement_thenReturnsFalse() { + Trie trie = createExampleTrie(); + + assertFalse(trie.containsNode("99")); + } + + @Test + public void givenATrie_whenDeletingElements_thenTreeDoesNotContainThoseElements() { + + Trie trie = createExampleTrie(); + + assertTrue(trie.containsNode("Programming")); + trie.delete("Programming"); + assertFalse(trie.containsNode("Programming")); + } + + private Trie createExampleTrie() { + Trie trie = new Trie(); + + trie.insert("Programming"); + trie.insert("is"); + trie.insert("a"); + trie.insert("way"); + trie.insert("of"); + trie.insert("life"); + + return trie; + } +} diff --git a/core-java/src/test/java/com/baeldung/varargs/FormatterTest.java b/core-java/src/test/java/com/baeldung/varargs/FormatterTest.java new file mode 100644 index 0000000000..509c8764d2 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/varargs/FormatterTest.java @@ -0,0 +1,60 @@ +package com.baeldung.varargs; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class FormatterTest { + + private final static String FORMAT = "%s %s %s"; + + @Test + public void givenNoArgument_thenEmptyAndTwoSpacesAreReturned() { + String actualResult = format(); + + assertThat(actualResult, is("empty ")); + } + + @Test + public void givenOneArgument_thenResultHasTwoTrailingSpace() { + String actualResult = format("baeldung"); + + assertThat(actualResult, is("baeldung ")); + } + + @Test + public void givenTwoArguments_thenOneTrailingSpaceExists() { + String actualResult = format("baeldung", "rocks"); + + assertThat(actualResult, is("baeldung rocks ")); + } + + @Test + public void givenMoreThanThreeArguments_thenTheFirstThreeAreUsed() { + String actualResult = formatWithVarArgs("baeldung", "rocks", "java", "and", "spring"); + + assertThat(actualResult, is("baeldung rocks java")); + } + + public String format() { + return format("empty", ""); + } + + public String format(String value) { + return format(value, ""); + } + + public String format(String val1, String val2) { + return String.format(FORMAT, val1, val2, ""); + } + + public String formatWithVarArgs(String... values) { + if (values.length == 0) { + return "no arguments given"; + } + + return String.format(FORMAT, values); + } + +} \ No newline at end of file diff --git a/core-java/src/test/resources/original.txt b/core-java/src/test/resources/original.txt new file mode 100644 index 0000000000..cf8c89d389 --- /dev/null +++ b/core-java/src/test/resources/original.txt @@ -0,0 +1,2 @@ +#Copy a File with Java (www.Baeldung.com) +Copying Files with Java is Fun! \ No newline at end of file diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 720187dc44..b8cea19c58 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -15,5 +15,9 @@ - [Data Classes in Kotlin](http://www.baeldung.com/kotlin-data-classes) - [Delegated Properties in Kotlin](http://www.baeldung.com/kotlin-delegated-properties) - [Sealed Classes in Kotlin](http://www.baeldung.com/kotlin-sealed-classes) - - +- [JUnit 5 for Kotlin Developers](http://www.baeldung.com/junit-5-kotlin) +- [Extension Methods in Kotlin](http://www.baeldung.com/kotlin-extension-methods) +- [Infix Functions in Kotlin](http://www.baeldung.com/kotlin-infix-functions) +- [Try-with-resources in Kotlin](http://www.baeldung.com/kotlin-try-with-resources) +- [HTTP Requests with Kotlin and khttp](http://www.baeldung.com/kotlin-khttp) +- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection) diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index e795d1e042..36298ca084 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -44,6 +44,16 @@ kotlin-stdlib ${kotlin-stdlib.version} + + org.jetbrains.kotlin + kotlin-stdlib-jre8 + ${kotlin-stdlib.version} + + + khttp + khttp + 0.1.0 + org.jetbrains.kotlin kotlin-test-junit @@ -66,7 +76,18 @@ mockito-kotlin ${mockito-kotlin.version} test - + + + com.github.salomonbrys.kodein + kodein + ${kodein.version} + + + org.assertj + assertj-core + ${assertj.version} + test + @@ -105,7 +126,11 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + 3.7.0 + + 1.8 + 1.8 + @@ -175,11 +200,13 @@ 1.1.2 0.15 1.5.0 + 4.1.0 5.0.0 1.0.0 4.12.0 4.12 + 3.9.1 diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Controller.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Controller.kt new file mode 100644 index 0000000000..721bdb04bc --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Controller.kt @@ -0,0 +1,3 @@ +package com.baeldung.kotlin.kodein + +class Controller(private val service : Service) \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Dao.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Dao.kt new file mode 100644 index 0000000000..a0be7ef0e0 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Dao.kt @@ -0,0 +1,3 @@ +package com.baeldung.kotlin.kodein + +interface Dao \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/JdbcDao.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/JdbcDao.kt new file mode 100644 index 0000000000..0a09b95dbf --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/JdbcDao.kt @@ -0,0 +1,3 @@ +package com.baeldung.kotlin.kodein + +class JdbcDao : Dao \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/MongoDao.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/MongoDao.kt new file mode 100644 index 0000000000..06436fcd21 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/MongoDao.kt @@ -0,0 +1,3 @@ +package com.baeldung.kotlin.kodein + +class MongoDao : Dao \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Service.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Service.kt new file mode 100644 index 0000000000..bb24a5cc21 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/kodein/Service.kt @@ -0,0 +1,3 @@ +package com.baeldung.kotlin.kodein + +class Service(private val dao: Dao, private val tag: String) \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt new file mode 100644 index 0000000000..09ce898860 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/ExtensionMethods.kt @@ -0,0 +1,51 @@ +package com.baeldung.kotlin + +import org.junit.Assert +import org.junit.Test + +class ExtensionMethods { + @Test + fun simpleExtensionMethod() { + fun String.escapeForXml() : String { + return this + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + } + + Assert.assertEquals("Nothing", "Nothing".escapeForXml()) + Assert.assertEquals("<Tag>", "".escapeForXml()) + Assert.assertEquals("a&b", "a&b".escapeForXml()) + } + + @Test + fun genericExtensionMethod() { + fun T.concatAsString(b: T) : String { + return this.toString() + b.toString() + } + + Assert.assertEquals("12", "1".concatAsString("2")) + Assert.assertEquals("12", 1.concatAsString(2)) + // This doesn't compile + // Assert.assertEquals("12", 1.concatAsString(2.0)) + } + + @Test + fun infixExtensionMethod() { + infix fun Number.toPowerOf(exponent: Number): Double { + return Math.pow(this.toDouble(), exponent.toDouble()) + } + + Assert.assertEquals(9.0, 3 toPowerOf 2, 0.1) + Assert.assertEquals(3.0, 9 toPowerOf 0.5, 0.1) + } + + @Test + fun operatorExtensionMethod() { + operator fun List.times(by: Int): List { + return this.map { it * by } + } + + Assert.assertEquals(listOf(2, 4, 6), listOf(1, 2, 3) * 2) + } +} diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/InfixFunctionsTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/InfixFunctionsTest.kt new file mode 100644 index 0000000000..fc4286460a --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/InfixFunctionsTest.kt @@ -0,0 +1,51 @@ +package com.baeldung.kotlin + +import org.junit.Assert +import org.junit.Test + +class InfixFunctionsTest { + @Test + fun testColours() { + val color = 0x123456 + val red = (color and 0xff0000) shr 16 + val green = (color and 0x00ff00) shr 8 + val blue = (color and 0x0000ff) shr 0 + + Assert.assertEquals(0x12, red) + Assert.assertEquals(0x34, green) + Assert.assertEquals(0x56, blue) + } + + @Test + fun testNewAssertions() { + class Assertion(private val target: T) { + infix fun isEqualTo(other: T) { + Assert.assertEquals(other, target) + } + + infix fun isDifferentFrom(other: T) { + Assert.assertNotEquals(other, target) + } + } + + val result = Assertion(5) + + result isEqualTo 5 + + // The following two lines are expected to fail + // result isEqualTo 6 + // result isDifferentFrom 5 + } + + @Test + fun testNewStringMethod() { + infix fun String.substringMatches(r: Regex) : List { + return r.findAll(this) + .map { it.value } + .toList() + } + + val matches = "a bc def" substringMatches ".*? ".toRegex() + Assert.assertEquals(listOf("a ", "bc "), matches) + } +} diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/UseTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/UseTest.kt new file mode 100644 index 0000000000..15bdfcafd8 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/UseTest.kt @@ -0,0 +1,67 @@ +package com.baeldung.kotlin + +import org.junit.Test +import java.beans.ExceptionListener +import java.beans.XMLEncoder +import java.io.* +import java.lang.Exception +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.test.fail + +class UseTest { + + @Test + fun givenCloseable_whenUseIsCalled_thenItIsClosed() { + val stringWriter = StringWriter() + val writer = BufferedWriter(stringWriter) //Using a BufferedWriter because after close() it throws. + writer.use { + assertEquals(writer, it) + + it.write("something") + } + try { + writer.write("something else") + + fail("write() should have thrown an exception because the writer is closed.") + } catch (e: IOException) { + //Ok + } + + assertEquals("something", stringWriter.toString()) + } + + @Test + fun givenAutoCloseable_whenUseIsCalled_thenItIsClosed() { + val baos = ByteArrayOutputStream() + val encoder = XMLEncoder(PrintStream(baos)) //XMLEncoder is AutoCloseable but not Closeable. + //Here, we use a PrintStream because after close() it throws. + encoder.exceptionListener = ThrowingExceptionListener() + encoder.use { + assertEquals(encoder, it) + + it.writeObject("something") + } + try { + encoder.writeObject("something else") + encoder.flush() + + fail("write() should have thrown an exception because the encoder is closed.") + } catch (e: IOException) { + //Ok + } + } + + @Test + fun whenSimpleFormIsUsed_thenItWorks() { + StringWriter().use { it.write("something") } + } +} + +class ThrowingExceptionListener : ExceptionListener { + override fun exceptionThrown(e: Exception?) { + if(e != null) { + throw e + } + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/khttp/KhttpTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/khttp/KhttpTest.kt new file mode 100644 index 0000000000..e9147c9489 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/khttp/KhttpTest.kt @@ -0,0 +1,153 @@ +package com.baeldung.kotlin.khttp + +import khttp.structures.files.FileLike +import org.json.JSONObject +import org.junit.Test +import java.beans.ExceptionListener +import java.beans.XMLEncoder +import java.io.* +import java.lang.Exception +import java.net.ConnectException +import kotlin.test.assertEquals +import kotlin.test.assertTrue +import kotlin.test.fail + +class KhttpTest { + + @Test + fun whenHttpGetRequestIsMade_thenArgsAreReturned() { + val response = khttp.get( + url = "http://httpbin.org/get", + params = mapOf("p1" to "1", "p2" to "2")) + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + } + + @Test + fun whenAlternateHttpGetRequestIsMade_thenArgsAreReturned() { + val response = khttp.request( + method = "GET", + url = "http://httpbin.org/get", + params = mapOf("p1" to "1", "p2" to "2")) + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + } + + @Test + fun whenHeadersAreSet_thenHeadersAreSent() { + val response = khttp.get( + url = "http://httpbin.org/get", + headers = mapOf("header1" to "1", "header2" to "2")) + val headers = response.jsonObject.getJSONObject("headers") + + assertEquals("1", headers["Header1"]) + assertEquals("2", headers["Header2"]) + } + + @Test + fun whenHttpPostRequestIsMadeWithJson_thenBodyIsReturned() { + val response = khttp.post( + url = "http://httpbin.org/post", + params = mapOf("p1" to "1", "p2" to "2"), + json = mapOf("pr1" to "1", "pr2" to "2")) + + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + + val json = response.jsonObject.getJSONObject("json") + + assertEquals("1", json["pr1"]) + assertEquals("2", json["pr2"]) + } + + @Test + fun whenHttpPostRequestIsMadeWithMapData_thenBodyIsReturned() { + val response = khttp.post( + url = "http://httpbin.org/post", + params = mapOf("p1" to "1", "p2" to "2"), + data = mapOf("pr1" to "1", "pr2" to "2")) + + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + + val form = response.jsonObject.getJSONObject("form") + + assertEquals("1", form["pr1"]) + assertEquals("2", form["pr2"]) + } + + @Test + fun whenHttpPostRequestIsMadeWithFiles_thenBodyIsReturned() { + val response = khttp.post( + url = "http://httpbin.org/post", + params = mapOf("p1" to "1", "p2" to "2"), + files = listOf( + FileLike("file1", "content1"), + FileLike("file2", javaClass.getResource("KhttpTest.class").openStream().readBytes()))) + + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + + val files = response.jsonObject.getJSONObject("files") + + assertEquals("content1", files["file1"]) + } + + @Test + fun whenHttpPostRequestIsMadeWithInputStream_thenBodyIsReturned() { + val response = khttp.post( + url = "http://httpbin.org/post", + params = mapOf("p1" to "1", "p2" to "2"), + data = ByteArrayInputStream("content!".toByteArray())) + + val args = response.jsonObject.getJSONObject("args") + + assertEquals("1", args["p1"]) + assertEquals("2", args["p2"]) + + assertEquals("content!", response.jsonObject["data"]) + } + + @Test + fun whenHttpPostStreamingRequestIsMade_thenBodyIsReturnedInChunks() { + val response = khttp.post( + url = "http://httpbin.org/post", + stream = true, + json = mapOf("pr1" to "1", "pr2" to "2")) + + val baos = ByteArrayOutputStream() + response.contentIterator(chunkSize = 10).forEach { arr : ByteArray -> baos.write(arr) } + val json = JSONObject(String(baos.toByteArray())).getJSONObject("json") + + assertEquals("1", json["pr1"]) + assertEquals("2", json["pr2"]) + } + + @Test + fun whenHttpRequestFails_thenExceptionIsThrown() { + try { + khttp.get(url = "http://localhost/nothing/to/see/here") + + fail("Should have thrown an exception") + } catch (e : ConnectException) { + //Ok + } + } + + @Test + fun whenHttpNotFound_thenExceptionIsThrown() { + val response = khttp.get(url = "http://httpbin.org/nothing/to/see/here") + + assertEquals(404, response.statusCode) + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/kodein/KodeinUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/kodein/KodeinUnitTest.kt new file mode 100644 index 0000000000..7776eebd52 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/kodein/KodeinUnitTest.kt @@ -0,0 +1,191 @@ +package com.baeldung.kotlin.kodein + +import com.github.salomonbrys.kodein.* +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class KodeinUnitTest { + + class InMemoryDao : Dao + + @Test + fun whenSingletonBinding_thenSingleInstanceIsCreated() { + var created = false + val kodein = Kodein { + bind() with singleton { + created = true + MongoDao() + } + } + + assertThat(created).isFalse() + + val dao1: Dao = kodein.instance() + + assertThat(created).isTrue() + + val dao2: Dao = kodein.instance() + + assertThat(dao1).isSameAs(dao2) + } + + @Test + fun whenFactoryBinding_thenNewInstanceIsCreated() { + val kodein = Kodein { + bind() with singleton { MongoDao() } + bind() with factory { tag: String -> Service(instance(), tag) } + } + val service1: Service = kodein.with("myTag").instance() + val service2: Service = kodein.with("myTag").instance() + + assertThat(service1).isNotSameAs(service2) + } + + @Test + fun whenProviderBinding_thenNewInstanceIsCreated() { + val kodein = Kodein { + bind() with provider { MongoDao() } + } + val dao1: Dao = kodein.instance() + val dao2: Dao = kodein.instance() + + assertThat(dao1).isNotSameAs(dao2) + } + + @Test + fun whenTaggedBinding_thenMultipleInstancesOfSameTypeCanBeRegistered() { + val kodein = Kodein { + bind("dao1") with singleton { MongoDao() } + bind("dao2") with singleton { MongoDao() } + } + val dao1: Dao = kodein.instance("dao1") + val dao2: Dao = kodein.instance("dao2") + + assertThat(dao1).isNotSameAs(dao2) + } + + @Test + fun whenEagerSingletonBinding_thenCreationIsEager() { + var created = false + val kodein = Kodein { + bind() with eagerSingleton { + created = true + MongoDao() + } + } + + assertThat(created).isTrue() + val dao1: Dao = kodein.instance() + val dao2: Dao = kodein.instance() + + assertThat(dao1).isSameAs(dao2) + } + + @Test + fun whenMultitonBinding_thenInstancesAreReused() { + val kodein = Kodein { + bind() with singleton { MongoDao() } + bind() with multiton { tag: String -> Service(instance(), tag) } + } + val service1: Service = kodein.with("myTag").instance() + val service2: Service = kodein.with("myTag").instance() + + assertThat(service1).isSameAs(service2) + } + + @Test + fun whenInstanceBinding_thenItIsReused() { + val dao = MongoDao() + val kodein = Kodein { + bind() with instance(dao) + } + val fromContainer: Dao = kodein.instance() + + assertThat(dao).isSameAs(fromContainer) + } + + @Test + fun whenConstantBinding_thenItIsAvailable() { + val kodein = Kodein { + constant("magic") with 42 + } + val fromContainer: Int = kodein.instance("magic") + + assertThat(fromContainer).isEqualTo(42) + } + + @Test + fun whenUsingModules_thenTransitiveDependenciesAreSuccessfullyResolved() { + val jdbcModule = Kodein.Module { + bind() with singleton { JdbcDao() } + } + val kodein = Kodein { + import(jdbcModule) + bind() with singleton { Controller(instance()) } + bind() with singleton { Service(instance(), "myService") } + } + + val dao: Dao = kodein.instance() + assertThat(dao).isInstanceOf(JdbcDao::class.java) + } + + @Test + fun whenComposition_thenBeansAreReUsed() { + val persistenceContainer = Kodein { + bind() with singleton { MongoDao() } + } + val serviceContainer = Kodein { + extend(persistenceContainer) + bind() with singleton { Service(instance(), "myService") } + } + val fromPersistence: Dao = persistenceContainer.instance() + val fromService: Dao = serviceContainer.instance() + + assertThat(fromPersistence).isSameAs(fromService) + } + + @Test + fun whenOverriding_thenRightBeanIsUsed() { + val commonModule = Kodein.Module { + bind() with singleton { MongoDao() } + bind() with singleton { Service(instance(), "myService") } + } + val testContainer = Kodein { + import(commonModule) + bind(overrides = true) with singleton { InMemoryDao() } + } + val dao: Dao = testContainer.instance() + + assertThat(dao).isInstanceOf(InMemoryDao::class.java) + } + + @Test + fun whenMultiBinding_thenWorks() { + val kodein = Kodein { + bind() from setBinding() + bind().inSet() with singleton { MongoDao() } + bind().inSet() with singleton { JdbcDao() } + } + val daos: Set = kodein.instance() + + assertThat(daos.map { it.javaClass as Class<*> }).containsOnly(MongoDao::class.java, JdbcDao::class.java) + } + + @Test + fun whenInjector_thenWorks() { + class Controller2 { + private val injector = KodeinInjector() + val service: Service by injector.instance() + fun injectDependencies(kodein: Kodein) = injector.inject(kodein) + } + + val kodein = Kodein { + bind() with singleton { MongoDao() } + bind() with singleton { Service(instance(), "myService") } + } + val controller = Controller2() + controller.injectDependencies(kodein) + + assertThat(controller.service).isNotNull + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/stdlib/RegexTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/stdlib/RegexTest.kt new file mode 100644 index 0000000000..eeb587ee22 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/stdlib/RegexTest.kt @@ -0,0 +1,128 @@ +package com.baeldung.kotlin.stdlib + +import org.junit.Test +import java.beans.ExceptionListener +import java.beans.XMLEncoder +import java.io.* +import java.lang.Exception +import kotlin.test.* +import kotlin.text.RegexOption.* + +class RegexTest { + + @Test + fun whenRegexIsInstantiated_thenIsEqualToToRegexMethod() { + val pattern = """a([bc]+)d?\\""" + + assertEquals(Regex.fromLiteral(pattern).pattern, pattern) + assertEquals(pattern, Regex(pattern).pattern) + assertEquals(pattern, pattern.toRegex().pattern) + } + + @Test + fun whenRegexMatches_thenResultIsTrue() { + val regex = """a([bc]+)d?""".toRegex() + + assertTrue(regex.containsMatchIn("xabcdy")) + assertTrue(regex.matches("abcd")) + assertFalse(regex matches "xabcdy") + } + + @Test + fun givenCompletelyMatchingRegex_whenMatchResult_thenDestructuring() { + val regex = """a([bc]+)d?""".toRegex() + + assertNull(regex.matchEntire("xabcdy")) + + val matchResult = regex.matchEntire("abbccbbd") + + assertNotNull(matchResult) + assertEquals(matchResult!!.value, matchResult.groupValues[0]) + assertEquals(matchResult.destructured.toList(), matchResult.groupValues.drop(1)) + assertEquals("bbccbb", matchResult.destructured.component1()) + assertNull(matchResult.next()) + } + + @Test + fun givenPartiallyMatchingRegex_whenMatchResult_thenGroups() { + val regex = """a([bc]+)d?""".toRegex() + var matchResult = regex.find("abcb abbd") + + assertNotNull(matchResult) + assertEquals(matchResult!!.value, matchResult.groupValues[0]) + assertEquals("abcb", matchResult.value) + assertEquals(IntRange(0, 3), matchResult.range) + assertEquals(listOf("abcb", "bcb"), matchResult.groupValues) + assertEquals(matchResult.destructured.toList(), matchResult.groupValues.drop(1)) + + matchResult = matchResult.next() + + assertNotNull(matchResult) + assertEquals("abbd", matchResult!!.value) + assertEquals("bb", matchResult.groupValues[1]) + + matchResult = matchResult.next() + + assertNull(matchResult) + } + + @Test + fun givenPartiallyMatchingRegex_whenMatchResult_thenDestructuring() { + val regex = """([\w\s]+) is (\d+) years old""".toRegex() + val matchResult = regex.find("Mickey Mouse is 95 years old") + val (name, age) = matchResult!!.destructured + + assertEquals("Mickey Mouse", name) + assertEquals("95", age) + } + + @Test + fun givenNonMatchingRegex_whenFindCalled_thenNull() { + val regex = """a([bc]+)d?""".toRegex() + val matchResult = regex.find("foo") + + assertNull(matchResult) + } + + @Test + fun givenNonMatchingRegex_whenFindAllCalled_thenEmptySet() { + val regex = """a([bc]+)d?""".toRegex() + val matchResults = regex.findAll("foo") + + assertNotNull(matchResults) + assertTrue(matchResults.none()) + } + + @Test + fun whenReplace_thenReplacement() { + val regex = """(red|green|blue)""".toRegex() + val beautiful = "Roses are red, Violets are blue" + val grim = regex.replace(beautiful, "dark") + val shiny = regex.replaceFirst(beautiful, "rainbow") + + assertEquals("Roses are dark, Violets are dark", grim) + assertEquals("Roses are rainbow, Violets are blue", shiny) + } + + @Test + fun whenComplexReplace_thenReplacement() { + val regex = """(red|green|blue)""".toRegex() + val beautiful = "Roses are red, Violets are blue" + val reallyBeautiful = regex.replace(beautiful) { + matchResult -> matchResult.value.toUpperCase() + "!" + } + + assertEquals("Roses are RED!, Violets are BLUE!", reallyBeautiful) + } + + @Test + fun whenSplit_thenList() { + val regex = """\W+""".toRegex() + val beautiful = "Roses are red, Violets are blue" + + assertEquals(listOf("Roses", "are", "red", "Violets", "are", "blue"), regex.split(beautiful)) + assertEquals(listOf("Roses", "are", "red", "Violets are blue"), regex.split(beautiful, 4)) + assertEquals(regex.toPattern().split(beautiful).asList(), regex.split(beautiful)) + } + +} \ No newline at end of file diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index 729ab101fd..7f9c92ec73 100644 --- a/deeplearning4j/README.md +++ b/deeplearning4j/README.md @@ -2,4 +2,4 @@ This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. ### Relevant Articles: -- [A Guide to deeplearning4j](http://www.baeldung.com/a-guide-to-deeplearning4j/) +- [A Guide to deeplearning4j](http://www.baeldung.com/deeplearning4j) diff --git a/drools/README.MD b/drools/README.MD index e3f00f5047..5efbe0d3c3 100644 --- a/drools/README.MD +++ b/drools/README.MD @@ -1,4 +1,4 @@ ### Relevant Articles: - [Introduction to Drools](http://www.baeldung.com/drools) - [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) -- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) +- [An Example of Backward Chaining in Drools](http://www.baeldung.com/drools-backward-chaining) diff --git a/drools/backward-chaining/pom.xml b/drools/backward-chaining/pom.xml deleted file mode 100644 index bda0cf2abc..0000000000 --- a/drools/backward-chaining/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - 4.0.0 - - drools-backward-chaining - 1.0 - drools-backward-chaining - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - 6.4.0.Final - - - - - org.kie - kie-api - ${runtime.version} - - - org.drools - drools-core - ${runtime.version} - - - org.drools - drools-decisiontables - ${runtime.version} - - - diff --git a/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java b/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java deleted file mode 100644 index 7fc5bd3685..0000000000 --- a/drools/backward-chaining/src/main/java/com/baeldung/BackwardChainingBeatles.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung; - -import org.kie.api.KieServices; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; - -import com.baeldung.model.Beatle; - -public class BackwardChainingBeatles { - public static void main(String[] args) { - - KieServices ks = KieServices.Factory.get(); - KieContainer kContainer = ks.getKieClasspathContainer(); - KieSession kSession = kContainer.newKieSession("ksession-backward-chaining"); - // drools session base on the xml configuration (kmodule.xml) - - // graph population - kSession.insert(new Beatle("Starr", "drums")); - kSession.insert(new Beatle("McCartney", "bass")); - kSession.insert(new Beatle("Lennon", "guitar")); - kSession.insert(new Beatle("Harrison", "guitar")); - - kSession.insert("Ringo"); // invoke the rule that calls the query implentation of backward chaining - kSession.fireAllRules(); // invoke all the rules - - } - -} \ No newline at end of file diff --git a/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java b/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java deleted file mode 100644 index 4b219b3a69..0000000000 --- a/drools/backward-chaining/src/main/java/com/baeldung/model/Beatle.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.model; - -import org.kie.api.definition.type.Position; - -public class Beatle { - - @Position(0) - private String lastName; - @Position(1) - private String instrument; - - public Beatle(String lastName, String instrument) { - this.lastName = lastName; - this.instrument = instrument; - } - - public String getInstrument() { - return instrument; - } - - public void setInstrument(String instrument) { - this.instrument = instrument; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - -} \ No newline at end of file diff --git a/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml b/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml deleted file mode 100644 index 6498e26343..0000000000 --- a/drools/backward-chaining/src/main/resources/META-INF/kmodule.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/drools/backward-chaining/src/main/resources/META-INF/maven/pom.properties b/drools/backward-chaining/src/main/resources/META-INF/maven/pom.properties deleted file mode 100644 index 26d8331732..0000000000 --- a/drools/backward-chaining/src/main/resources/META-INF/maven/pom.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=com.baeldung.drools -artifactId=DroosBackwardChaining -version=1.0.0-SNAPSHOT diff --git a/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl b/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl deleted file mode 100644 index 8d0d06a79e..0000000000 --- a/drools/backward-chaining/src/main/resources/backward_chaining/Beatles.drl +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung - -import com.baeldung.model.Beatle; - - -query whichBeatle(String lastName, String instrument) - Beatle(lastName, instrument;) - or - (Beatle(lastName, null;) - and - whichBeatle(null, instrument;)) //recursive call to the function that allows to search in a derivation tree structure -end - -rule "Ringo" - when - String(this == "Ringo") - whichBeatle("Starr", "drums";) - then - System.out.println("The beatle is Ringo Starr"); -end - -rule "Paul" - when - String(this == "Paul") - whichBeatle("McCartney", "bass";) - then - System.out.println("The beatle is Paul McCartney"); -end - -rule "John" - when - String(this == "John") - whichBeatle("Lennon", "guitar";) - then - System.out.println("The beatle is John Lennon"); -end - -rule "George" - when - String(this == "George") - whichBeatle("Harrison", "guitar";) - then - System.out.println("The beatle is George Harrison"); -end diff --git a/drools/backward-chaining/src/test/java/com/baeldung/test/BackwardChainingTest.java b/drools/backward-chaining/src/test/java/com/baeldung/test/BackwardChainingTest.java deleted file mode 100644 index 676e941950..0000000000 --- a/drools/backward-chaining/src/test/java/com/baeldung/test/BackwardChainingTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.test; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.kie.api.KieServices; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; - -import com.baeldung.drools.model.Fact; -import com.baeldung.drools.model.Result; - -import static junit.framework.TestCase.assertEquals; - -@RunWith(value = JUnit4.class) -public class BackwardChainingTest { - private Result result; - private KieServices ks; - private KieContainer kContainer; - private KieSession ksession; - - @Before - public void before() { - result = new Result(); - ks = KieServices.Factory.get(); - kContainer = ks.getKieClasspathContainer(); - ksession = kContainer.newKieSession("ksession-backward-chaining"); - ksession.setGlobal("result", result); - } - - @Test - public void whenWallOfChinaIsGiven_ThenItBelongsToPlanetEarth() { - - ksession.setGlobal("result", result); - ksession.insert(new Fact("Asia", "Planet Earth")); - ksession.insert(new Fact("China", "Asia")); - ksession.insert(new Fact("Great Wall of China", "China")); - - ksession.fireAllRules(); - - // Assert Decision one - assertEquals(result.getValue(), "Decision one taken: Great Wall of China BELONGS TO Planet Earth"); - } - - @Test - public void whenChinaIsNotGiven_ThenWallOfChinaDoesNotBelongToPlanetEarth() { - ksession.insert(new Fact("Asia", "Planet Earth")); - // ksession.insert(new Location("China", "Asia")); // not provided to force Decision two - ksession.insert(new Fact("Great Wall of China", "China")); - - ksession.fireAllRules(); - - // Assert Decision two - assertEquals(result.getValue(), "Decision two taken: Great Wall of China DOES NOT BELONG TO Planet Earth"); - } -} diff --git a/drools/pom.xml b/drools/pom.xml index 29231f150c..5f228802fa 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -1,24 +1,19 @@ - 4.0.0 - com.baeldung drools - 1.0.0-SNAPSHOT - com.baeldung parent-modules 1.0.0-SNAPSHOT - - - 4.4.6 - 7.1.0.Beta2 - 3.13 - + + 4.4.6 + 7.4.1.Final + 3.13 + @@ -68,4 +63,25 @@ - \ No newline at end of file + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/JdbcTest.java + **/*LiveTest.java + + + + + + + diff --git a/drools/backward-chaining/src/main/java/com/baeldung/drools/BackwardChaining.java b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java similarity index 59% rename from drools/backward-chaining/src/main/java/com/baeldung/drools/BackwardChaining.java rename to drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java index 1c1d258b47..6f15ee510b 100644 --- a/drools/backward-chaining/src/main/java/com/baeldung/drools/BackwardChaining.java +++ b/drools/src/main/java/com/baeldung/drools/backward_chaining/BackwardChaining.java @@ -1,9 +1,8 @@ -package com.baeldung.drools; +package com.baeldung.drools.backward_chaining; -import org.kie.api.KieServices; -import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; +import com.baeldung.drools.config.DroolsBeanFactory; import com.baeldung.drools.model.Fact; import com.baeldung.drools.model.Result; @@ -11,23 +10,21 @@ public class BackwardChaining { public static void main(String[] args) { Result result = new BackwardChaining().backwardChaining(); System.out.println(result.getValue()); - result.getFacts().stream().forEach(System.out::println); + result.getFacts() + .stream() + .forEach(System.out::println); } public Result backwardChaining() { Result result = new Result(); - KieServices ks = KieServices.Factory.get(); - KieContainer kContainer = ks.getKieClasspathContainer(); - KieSession ksession = kContainer.newKieSession("ksession-backward-chaining"); + KieSession ksession = new DroolsBeanFactory().getKieSession(); ksession.setGlobal("result", result); ksession.insert(new Fact("Asia", "Planet Earth")); -// ksession.insert(new Fact("China", "Asia")); + ksession.insert(new Fact("China", "Asia")); ksession.insert(new Fact("Great Wall of China", "China")); ksession.fireAllRules(); return result; - } - } \ No newline at end of file diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java index e8841b05e2..cf5d56f246 100644 --- a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java +++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java @@ -3,7 +3,6 @@ package com.baeldung.drools.config; import org.drools.decisiontable.DecisionTableProviderImpl; import org.kie.api.KieServices; import org.kie.api.builder.*; -import org.kie.api.io.KieResources; import org.kie.api.io.Resource; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; @@ -22,7 +21,7 @@ public class DroolsBeanFactory { private KieFileSystem getKieFileSystem() throws IOException{ KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); - List rules=Arrays.asList("SuggestApplicant.drl","Product_rules.xls"); + List rules=Arrays.asList("BackwardChaining.drl","SuggestApplicant.drl","Product_rules.xls"); for(String rule:rules){ kieFileSystem.write(ResourceFactory.newClassPathResource(rule)); } @@ -56,9 +55,11 @@ public class DroolsBeanFactory { getKieRepository(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/BackwardChaining.drl")); kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/SuggestApplicant.drl")); kieFileSystem.write(ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Product_rules.xls")); - + + KieBuilder kb = kieServices.newKieBuilder(kieFileSystem); kb.buildAll(); KieModule kieModule = kb.getKieModule(); diff --git a/drools/backward-chaining/src/main/java/com/baeldung/drools/model/Fact.java b/drools/src/main/java/com/baeldung/drools/model/Fact.java similarity index 100% rename from drools/backward-chaining/src/main/java/com/baeldung/drools/model/Fact.java rename to drools/src/main/java/com/baeldung/drools/model/Fact.java diff --git a/drools/backward-chaining/src/main/java/com/baeldung/drools/model/Result.java b/drools/src/main/java/com/baeldung/drools/model/Result.java similarity index 100% rename from drools/backward-chaining/src/main/java/com/baeldung/drools/model/Result.java rename to drools/src/main/java/com/baeldung/drools/model/Result.java diff --git a/drools/backward-chaining/src/main/resources/backward_chaining/rules.drl b/drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl similarity index 67% rename from drools/backward-chaining/src/main/resources/backward_chaining/rules.drl rename to drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl index abcf95b9f1..975be84fb4 100644 --- a/drools/backward-chaining/src/main/resources/backward_chaining/rules.drl +++ b/drools/src/main/resources/com/baeldung/drools/rules/BackwardChaining.drl @@ -1,4 +1,4 @@ -package com.baeldung +package com.baeldung.drools.rules import com.baeldung.drools.model.Fact; @@ -19,13 +19,6 @@ then result.setValue("Decision one taken: Great Wall of China BELONGS TO Planet Earth"); end -rule "Great Wall of China DOES NOT BELONG TO of Planet Earth" -when - not belongsTo("Great Wall of China", "Planet Earth";) -then - result.setValue("Decision two taken: Great Wall of China DOES NOT BELONG TO Planet Earth"); -end - rule "print all facts" when belongsTo(element, place;) diff --git a/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java b/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java new file mode 100644 index 0000000000..f49d0b82de --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/backward_chaining/BackwardChainingTest.java @@ -0,0 +1,36 @@ +package com.baeldung.drools.backward_chaining; + +import org.junit.Before; +import org.junit.Test; +import org.kie.api.runtime.KieSession; + +import com.baeldung.drools.config.DroolsBeanFactory; +import com.baeldung.drools.model.Fact; +import com.baeldung.drools.model.Result; + +import static junit.framework.TestCase.assertEquals; + +public class BackwardChainingTest { + private Result result; + private KieSession ksession; + + @Before + public void before() { + result = new Result(); + ksession = new DroolsBeanFactory().getKieSession(); + } + + @Test + public void whenWallOfChinaIsGiven_ThenItBelongsToPlanetEarth() { + + ksession.setGlobal("result", result); + ksession.insert(new Fact("Asia", "Planet Earth")); + ksession.insert(new Fact("China", "Asia")); + ksession.insert(new Fact("Great Wall of China", "China")); + + ksession.fireAllRules(); + + // Assert Decision one + assertEquals(result.getValue(), "Decision one taken: Great Wall of China BELONGS TO Planet Earth"); + } +} diff --git a/dubbo/README.md b/dubbo/README.md new file mode 100644 index 0000000000..0a4cd9a204 --- /dev/null +++ b/dubbo/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Introduction to Dubbo](http://www.baeldung.com/dubbo) + diff --git a/dubbo/pom.xml b/dubbo/pom.xml new file mode 100644 index 0000000000..af242e5905 --- /dev/null +++ b/dubbo/pom.xml @@ -0,0 +1,73 @@ + + 4.0.0 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + dubbo + + + UTF-8 + UTF-8 + 1.8 + 2.5.7 + 3.4.11 + 0.10 + 2.19.1 + + + + + com.alibaba + dubbo + ${dubbo.version} + + + junit + junit + 4.12 + test + + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + + com.101tec + zkclient + ${zkclient.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + maven-surefire-plugin + ${surefire.version} + + + **/*LiveTest.java + + + + + + + diff --git a/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java b/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java new file mode 100644 index 0000000000..bf4a5e201c --- /dev/null +++ b/dubbo/src/main/java/com/alibaba/dubbo/registry/simple/SimpleRegistryService.java @@ -0,0 +1,210 @@ +/* + * Copyright 1999-2011 Alibaba Group. + * + * Licensed 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.alibaba.dubbo.registry.simple; + +import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.common.URL; +import com.alibaba.dubbo.common.logger.Logger; +import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.common.utils.ConcurrentHashSet; +import com.alibaba.dubbo.common.utils.NetUtils; +import com.alibaba.dubbo.common.utils.UrlUtils; +import com.alibaba.dubbo.registry.NotifyListener; +import com.alibaba.dubbo.registry.RegistryService; +import com.alibaba.dubbo.registry.support.AbstractRegistry; +import com.alibaba.dubbo.rpc.RpcContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * SimpleRegistryService + * + * @author william.liangf + */ +public class SimpleRegistryService extends AbstractRegistry { + + private final static Logger logger = LoggerFactory.getLogger(SimpleRegistryService.class); + private final ConcurrentMap> remoteRegistered = new ConcurrentHashMap>(); + private final ConcurrentMap>> remoteSubscribed = new ConcurrentHashMap>>(); + + public SimpleRegistryService() { + super(new URL("dubbo", NetUtils.getLocalHost(), 0, RegistryService.class.getName(), "file", "N/A")); + } + + public boolean isAvailable() { + return true; + } + + public List lookup(URL url) { + List urls = new ArrayList(); + for (URL u : getRegistered()) { + if (UrlUtils.isMatch(url, u)) { + urls.add(u); + } + } + return urls; + } + + public void register(URL url) { + String client = RpcContext.getContext().getRemoteAddressString(); + Set urls = remoteRegistered.get(client); + if (urls == null) { + remoteRegistered.putIfAbsent(client, new ConcurrentHashSet()); + urls = remoteRegistered.get(client); + } + urls.add(url); + super.register(url); + registered(url); + } + + public void unregister(URL url) { + String client = RpcContext.getContext().getRemoteAddressString(); + Set urls = remoteRegistered.get(client); + if (urls != null && urls.size() > 0) { + urls.remove(url); + } + super.unregister(url); + unregistered(url); + } + + public void subscribe(URL url, NotifyListener listener) { + if (getUrl().getPort() == 0) { + URL registryUrl = RpcContext.getContext().getUrl(); + if (registryUrl != null && registryUrl.getPort() > 0 + && RegistryService.class.getName().equals(registryUrl.getPath())) { + super.setUrl(registryUrl); + super.register(registryUrl); + } + } + String client = RpcContext.getContext().getRemoteAddressString(); + ConcurrentMap> clientListeners = remoteSubscribed.get(client); + if (clientListeners == null) { + remoteSubscribed.putIfAbsent(client, new ConcurrentHashMap>()); + clientListeners = remoteSubscribed.get(client); + } + Set listeners = clientListeners.get(url); + if (listeners == null) { + clientListeners.putIfAbsent(url, new ConcurrentHashSet()); + listeners = clientListeners.get(url); + } + listeners.add(listener); + super.subscribe(url, listener); + subscribed(url, listener); + } + + public void unsubscribe(URL url, NotifyListener listener) { + if (!Constants.ANY_VALUE.equals(url.getServiceInterface()) + && url.getParameter(Constants.REGISTER_KEY, true)) { + unregister(url); + } + String client = RpcContext.getContext().getRemoteAddressString(); + Map> clientListeners = remoteSubscribed.get(client); + if (clientListeners != null && clientListeners.size() > 0) { + Set listeners = clientListeners.get(url); + if (listeners != null && listeners.size() > 0) { + listeners.remove(listener); + } + } + } + + protected void registered(URL url) { + for (Map.Entry> entry : getSubscribed().entrySet()) { + URL key = entry.getKey(); + if (UrlUtils.isMatch(key, url)) { + List list = lookup(key); + for (NotifyListener listener : entry.getValue()) { + listener.notify(list); + } + } + } + } + + protected void unregistered(URL url) { + for (Map.Entry> entry : getSubscribed().entrySet()) { + URL key = entry.getKey(); + if (UrlUtils.isMatch(key, url)) { + List list = lookup(key); + for (NotifyListener listener : entry.getValue()) { + listener.notify(list); + } + } + } + } + + protected void subscribed(final URL url, final NotifyListener listener) { + if (Constants.ANY_VALUE.equals(url.getServiceInterface())) { + new Thread(new Runnable() { + public void run() { + Map> map = new HashMap>(); + for (URL u : getRegistered()) { + if (UrlUtils.isMatch(url, u)) { + String service = u.getServiceInterface(); + List list = map.get(service); + if (list == null) { + list = new ArrayList(); + map.put(service, list); + } + list.add(u); + } + } + for (List list : map.values()) { + try { + listener.notify(list); + } catch (Throwable e) { + logger.warn("Discard to notify " + url.getServiceKey() + " to listener " + listener); + } + } + } + }, "DubboMonitorNotifier").start(); + } else { + List list = lookup(url); + try { + listener.notify(list); + } catch (Throwable e) { + logger.warn("Discard to notify " + url.getServiceKey() + " to listener " + listener); + } + } + } + + public void disconnect() { + String client = RpcContext.getContext().getRemoteAddressString(); + if (logger.isInfoEnabled()) { + logger.info("Disconnected " + client); + } + Set urls = remoteRegistered.get(client); + if (urls != null && urls.size() > 0) { + for (URL url : urls) { + unregister(url); + } + } + Map> listeners = remoteSubscribed.get(client); + if (listeners != null && listeners.size() > 0) { + for (Map.Entry> entry : listeners.entrySet()) { + URL url = entry.getKey(); + for (NotifyListener listener : entry.getValue()) { + unsubscribe(url, listener); + } + } + } + } + +} \ No newline at end of file diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java new file mode 100644 index 0000000000..2ad26beac3 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsFailoverServiceImpl.java @@ -0,0 +1,14 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public class GreetingsFailoverServiceImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + System.out.println("failover implementation"); + return "hi, failover " + name; + } + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java new file mode 100644 index 0000000000..337c4c83e7 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsService.java @@ -0,0 +1,10 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public interface GreetingsService { + + String sayHi(String name); + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java new file mode 100644 index 0000000000..a11d9588d8 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceImpl.java @@ -0,0 +1,14 @@ +package com.baeldung.dubbo.remote; + +/** + * @author aiet + */ +public class GreetingsServiceImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + System.out.println("default implementation"); + return "hi, " + name; + } + +} diff --git a/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java new file mode 100644 index 0000000000..37449da8d8 --- /dev/null +++ b/dubbo/src/main/java/com/baeldung/dubbo/remote/GreetingsServiceSpecialImpl.java @@ -0,0 +1,20 @@ +package com.baeldung.dubbo.remote; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * @author aiet + */ +public class GreetingsServiceSpecialImpl implements GreetingsService { + + @Override + public String sayHi(String name) { + try { + System.out.println("specially called"); + SECONDS.sleep(5); + } catch (Exception ignored) { + } + return "hi, " + name; + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java new file mode 100644 index 0000000000..27c77bf9df --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/APIConfigurationLiveTest.java @@ -0,0 +1,57 @@ +package com.baeldung.dubbo; + +import com.alibaba.dubbo.config.ApplicationConfig; +import com.alibaba.dubbo.config.ReferenceConfig; +import com.alibaba.dubbo.config.RegistryConfig; +import com.alibaba.dubbo.config.ServiceConfig; +import com.baeldung.dubbo.remote.GreetingsService; +import com.baeldung.dubbo.remote.GreetingsServiceImpl; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author aiet + */ +public class APIConfigurationLiveTest { + + @Before + public void initProvider() { + ApplicationConfig application = new ApplicationConfig(); + application.setName("demo-provider"); + application.setVersion("1.0"); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setAddress("multicast://224.1.1.1:9090"); + + ServiceConfig service = new ServiceConfig<>(); + service.setApplication(application); + service.setRegistry(registryConfig); + service.setInterface(GreetingsService.class); + service.setRef(new GreetingsServiceImpl()); + + service.export(); + } + + @Test + public void givenProviderConsumer_whenSayHi_thenGotResponse() { + ApplicationConfig application = new ApplicationConfig(); + application.setName("demo-consumer"); + application.setVersion("1.0"); + + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setAddress("multicast://224.1.1.1:9090"); + + ReferenceConfig reference = new ReferenceConfig<>(); + reference.setApplication(application); + reference.setRegistry(registryConfig); + reference.setInterface(GreetingsService.class); + + GreetingsService greetingsService = reference.get(); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java new file mode 100644 index 0000000000..408d5af368 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterDynamicLoadBalanceLiveTest.java @@ -0,0 +1,70 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.OptionalDouble; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +public class ClusterDynamicLoadBalanceLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-default.xml"); + remoteContext.start(); + }); + executorService.submit(() -> { + SECONDS.sleep(2); + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + return null; + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenResponseBalanced() throws InterruptedException { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-lb.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + List elapseList = new ArrayList<>(6); + for (int i = 0; i < 6; i++) { + long current = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + assertNotNull(hiMessage); + elapseList.add(System.currentTimeMillis() - current); + SECONDS.sleep(1); + } + + OptionalDouble avgElapse = elapseList + .stream() + .mapToLong(e -> e) + .average(); + assertTrue(avgElapse.isPresent()); + assertTrue(avgElapse.getAsDouble() > 1666.0); + + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java new file mode 100644 index 0000000000..721363d3d1 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailoverLiveTest.java @@ -0,0 +1,52 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class ClusterFailoverLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + }); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-failover.xml"); + remoteContext.start(); + }); + + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenGotFailoverResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-failtest.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, failover baeldung", hiMessage); + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java new file mode 100644 index 0000000000..29a10fa20a --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterFailsafeLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +/** + * @author aiet + */ +public class ClusterFailsafeLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(1); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special-failsafe.xml"); + remoteContext.start(); + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenGotFailsafeResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-failtest.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNull(hiMessage); + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java new file mode 100644 index 0000000000..b880dfe843 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ClusterLoadBalanceLiveTest.java @@ -0,0 +1,66 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.OptionalDouble; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +public class ClusterLoadBalanceLiveTest { + + private ExecutorService executorService; + + @Before + public void initRemote() { + executorService = Executors.newFixedThreadPool(2); + executorService.submit(() -> { + ClassPathXmlApplicationContext remoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-default.xml"); + remoteContext.start(); + }); + executorService.submit(() -> { + ClassPathXmlApplicationContext backupRemoteContext = new ClassPathXmlApplicationContext("cluster/provider-app-special.xml"); + backupRemoteContext.start(); + }); + } + + @Test + public void givenProviderCluster_whenConsumerSaysHi_thenResponseBalanced() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("cluster/consumer-app-lb.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + List elapseList = new ArrayList<>(6); + for (int i = 0; i < 6; i++) { + long current = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + assertNotNull(hiMessage); + elapseList.add(System.currentTimeMillis() - current); + } + + OptionalDouble avgElapse = elapseList + .stream() + .mapToLong(e -> e) + .average(); + assertTrue(avgElapse.isPresent()); + System.out.println(avgElapse.getAsDouble()); + assertTrue(avgElapse.getAsDouble() > 2500.0); + + } + + @After + public void destroy() { + executorService.shutdown(); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java new file mode 100644 index 0000000000..13dc5d3f1e --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/MulticastRegistryLiveTest.java @@ -0,0 +1,36 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class MulticastRegistryLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + + @Before + public void initRemote() { + remoteContext = new ClassPathXmlApplicationContext("multicast/provider-app.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("multicast/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java new file mode 100644 index 0000000000..401ebc9b94 --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/ResultCacheLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.*; + +/** + * @author aiet + */ +public class ResultCacheLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + + @Before + public void initRemote() { + remoteContext = new ClassPathXmlApplicationContext("multicast/provider-app-special.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("multicast/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + + long before = System.currentTimeMillis(); + String hiMessage = greetingsService.sayHi("baeldung"); + + long timeElapsed = System.currentTimeMillis() - before; + assertTrue(timeElapsed > 5000); + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + + + before = System.currentTimeMillis(); + hiMessage = greetingsService.sayHi("baeldung"); + timeElapsed = System.currentTimeMillis() - before; + assertTrue(timeElapsed < 1000); + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java b/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java new file mode 100644 index 0000000000..72f15cf7ec --- /dev/null +++ b/dubbo/src/test/java/com/baeldung/dubbo/SimpleRegistryLiveTest.java @@ -0,0 +1,39 @@ +package com.baeldung.dubbo; + +import com.baeldung.dubbo.remote.GreetingsService; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author aiet + */ +public class SimpleRegistryLiveTest { + + private ClassPathXmlApplicationContext remoteContext; + private ClassPathXmlApplicationContext registryContext; + + @Before + public void initRemote() { + registryContext = new ClassPathXmlApplicationContext("simple/registry.xml"); + registryContext.start(); + + remoteContext = new ClassPathXmlApplicationContext("simple/provider-app.xml"); + remoteContext.start(); + } + + @Test + public void givenProvider_whenConsumerSaysHi_thenGotResponse() { + ClassPathXmlApplicationContext localContext = new ClassPathXmlApplicationContext("simple/consumer-app.xml"); + localContext.start(); + GreetingsService greetingsService = (GreetingsService) localContext.getBean("greetingsService"); + String hiMessage = greetingsService.sayHi("baeldung"); + + assertNotNull(hiMessage); + assertEquals("hi, baeldung", hiMessage); + } + +} diff --git a/dubbo/src/test/resources/cluster/consumer-app-failtest.xml b/dubbo/src/test/resources/cluster/consumer-app-failtest.xml new file mode 100644 index 0000000000..beb982db22 --- /dev/null +++ b/dubbo/src/test/resources/cluster/consumer-app-failtest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/consumer-app-lb.xml b/dubbo/src/test/resources/cluster/consumer-app-lb.xml new file mode 100644 index 0000000000..268e21b902 --- /dev/null +++ b/dubbo/src/test/resources/cluster/consumer-app-lb.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-default.xml b/dubbo/src/test/resources/cluster/provider-app-default.xml new file mode 100644 index 0000000000..cb51bc1771 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-default.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-failover.xml b/dubbo/src/test/resources/cluster/provider-app-failover.xml new file mode 100644 index 0000000000..95cbee1f90 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-failover.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml b/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml new file mode 100644 index 0000000000..7a7a139bb3 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-special-failsafe.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/cluster/provider-app-special.xml b/dubbo/src/test/resources/cluster/provider-app-special.xml new file mode 100644 index 0000000000..8e5dc07d61 --- /dev/null +++ b/dubbo/src/test/resources/cluster/provider-app-special.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/log4j.properties b/dubbo/src/test/resources/log4j.properties new file mode 100644 index 0000000000..4c15f1b4e0 --- /dev/null +++ b/dubbo/src/test/resources/log4j.properties @@ -0,0 +1,6 @@ +log4j.rootLogger=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/consumer-app.xml b/dubbo/src/test/resources/multicast/consumer-app.xml new file mode 100644 index 0000000000..da9a41fd61 --- /dev/null +++ b/dubbo/src/test/resources/multicast/consumer-app.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/provider-app-special.xml b/dubbo/src/test/resources/multicast/provider-app-special.xml new file mode 100644 index 0000000000..4b22b5aace --- /dev/null +++ b/dubbo/src/test/resources/multicast/provider-app-special.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/multicast/provider-app.xml b/dubbo/src/test/resources/multicast/provider-app.xml new file mode 100644 index 0000000000..065d5ddad8 --- /dev/null +++ b/dubbo/src/test/resources/multicast/provider-app.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/consumer-app.xml b/dubbo/src/test/resources/simple/consumer-app.xml new file mode 100644 index 0000000000..91f7a666e4 --- /dev/null +++ b/dubbo/src/test/resources/simple/consumer-app.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/provider-app.xml b/dubbo/src/test/resources/simple/provider-app.xml new file mode 100644 index 0000000000..9880172249 --- /dev/null +++ b/dubbo/src/test/resources/simple/provider-app.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo/src/test/resources/simple/registry.xml b/dubbo/src/test/resources/simple/registry.xml new file mode 100644 index 0000000000..9d1372da10 --- /dev/null +++ b/dubbo/src/test/resources/simple/registry.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml index a9b667baac..b89ff6ed15 100644 --- a/ejb/ejb-session-beans/pom.xml +++ b/ejb/ejb-session-beans/pom.xml @@ -82,7 +82,7 @@ maven-compiler-plugin - 3.1 + 3.7.0 1.8 1.8 diff --git a/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java b/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java index e86f52ff56..57376e9c4a 100644 --- a/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java +++ b/ejb/wildfly/widlfly-web/src/main/java/TestEJBServlet.java @@ -16,32 +16,26 @@ import wildfly.beans.UserBeanLocal; * Servlet implementation class TestEJBServlet */ public class TestEJBServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - @EJB - private UserBeanLocal userBean; + @EJB + private UserBeanLocal userBean; - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - List users = userBean.getUsers(); + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + List users = userBean.getUsers(); - PrintWriter out = response.getWriter(); + PrintWriter out = response.getWriter(); - out.println(""); - out.println("Users"); - out.println(""); - out.println("

List of users:

"); - out.println(""); - for (User user : users) { - out.println(""); - out.print(""); - out.print(""); - out.println(""); - } - } + out.println(""); + out.println(""); + for (User user : users) { + out.print(user.getUsername()); + out.print(" " + user.getEmail() + "
"); + } + out.println(""); + out.println(""); + } - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doGet(request, response); - } + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } } diff --git a/ethereumj/pom.xml b/ethereumj/pom.xml index c9f5924d7a..9676106e38 100644 --- a/ethereumj/pom.xml +++ b/ethereumj/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.baeldung.ethereumj ethereumj @@ -8,16 +7,11 @@ 1.0.0 ethereumj - - UTF-8 - 1.8 - 8.5.4 - - - org.springframework.boot - spring-boot-starter-parent - 1.5.6.RELEASE + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 @@ -38,14 +32,12 @@ org.springframework.boot spring-boot-starter-tomcat - org.springframework.boot spring-boot-starter-test - 1.5.6.RELEASE test @@ -107,4 +99,11 @@ + + + UTF-8 + 1.8 + 8.5.4 + + \ No newline at end of file diff --git a/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java b/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java similarity index 90% rename from ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java rename to ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java index 9298c34ec2..f62d229261 100644 --- a/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerTestOne.java +++ b/ethereumj/src/test/java/com/baeldung/ethereumj/controllers/EthControllerLiveTest.java @@ -1,25 +1,30 @@ package com.baeldung.ethereumj.controllers; -import com.baeldung.ethereumj.ApplicationMain; -import com.baeldung.ethereumj.Constants; -import com.baeldung.ethereumj.transfer.EthResponse; +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertNotNull; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.client.RestTemplate; -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertNotNull; +import com.baeldung.ethereumj.ApplicationMain; +import com.baeldung.ethereumj.Constants; +import com.baeldung.ethereumj.transfer.EthResponse; @RunWith(SpringRunner.class) @SpringBootTest(classes = ApplicationMain.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @TestPropertySource(properties = "server.port=8080") -public class EthControllerTestOne { +public class EthControllerLiveTest { @LocalServerPort int port; diff --git a/flyway/README.MD b/flyway/README.MD index 1b3f3c05ee..daeb9012b5 100644 --- a/flyway/README.MD +++ b/flyway/README.MD @@ -1,2 +1,3 @@ ### Relevant Articles: - [Database Migrations with Flyway](http://www.baeldung.com/database-migrations-with-flyway) +- [A Guide to Flyway Callbacks](http://www.baeldung.com/flyway-callbacks) diff --git a/flyway/myFlywayConfig.properties b/flyway/myFlywayConfig.properties index 8bb102930a..6b11f6f277 100644 --- a/flyway/myFlywayConfig.properties +++ b/flyway/myFlywayConfig.properties @@ -1,5 +1,5 @@ -flyway.user=root -flyway.password=mysql +flyway.user=sa +flyway.password= flyway.schemas=app-db -flyway.url=jdbc:mysql://localhost:3306/ +flyway.url=jdbc:h2:mem:DATABASE flyway.locations=filesystem:db/migration \ No newline at end of file diff --git a/flyway/pom.xml b/flyway/pom.xml index 2774602654..84009e4579 100644 --- a/flyway/pom.xml +++ b/flyway/pom.xml @@ -1,36 +1,76 @@ + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung + flyway - 1.0 + jar + flyway - A sample project to demonstrate Flyway migrations + Flyway Callbacks Demo + parent-boot-5 com.baeldung - parent-modules - 1.0.0-SNAPSHOT + 0.0.1-SNAPSHOT + ../parent-boot-5 + + UTF-8 + UTF-8 + 1.8 + + + + org.flywaydb + flyway-core + 5.0.2 + + + + org.springframework.boot + spring-boot-starter-jdbc + + mysql mysql-connector-java - ${mysql.version} + 6.0.3 + + + + com.h2database + h2 + test + + + org.springframework.boot + spring-boot-starter-test + test + org.flywaydb flyway-maven-plugin - ${flyway-maven-plugin.version} + 5.0.2 + + + com.h2database + h2 + ${h2.version} + + + + + org.springframework.boot + spring-boot-maven-plugin - - 6.0.5 - 4.0.3 - - \ No newline at end of file + + diff --git a/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java b/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java new file mode 100644 index 0000000000..6ad4ce510c --- /dev/null +++ b/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java @@ -0,0 +1,33 @@ +package com.baeldung.flywaycallbacks; + +import java.sql.Connection; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.api.MigrationInfo; +import org.flywaydb.core.api.callback.BaseFlywayCallback; + +public class ExampleFlywayCallback extends BaseFlywayCallback { + + private Log log = LogFactory.getLog(getClass()); + + @Override + public void afterEachMigrate(Connection connection, MigrationInfo info) { + log.info("> afterEachMigrate"); + } + + @Override + public void afterMigrate(Connection connection) { + log.info("> afterMigrate"); + } + + @Override + public void beforeEachMigrate(Connection connection, MigrationInfo info) { + log.info("> beforeEachMigrate"); + } + + @Override + public void beforeMigrate(Connection connection) { + log.info("> beforeMigrate"); + } +} diff --git a/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java b/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java new file mode 100644 index 0000000000..34d794f7d1 --- /dev/null +++ b/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.flywaycallbacks; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FlywayApplication { + + public static void main(String[] args) { + SpringApplication.run(FlywayApplication.class, args); + } + +} diff --git a/flyway/src/main/resources/application.properties b/flyway/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql b/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql new file mode 100644 index 0000000000..7a8f142d22 --- /dev/null +++ b/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql @@ -0,0 +1 @@ +SELECT 1 \ No newline at end of file diff --git a/flyway/src/main/resources/db/callbacks/beforeMigrate.sql b/flyway/src/main/resources/db/callbacks/beforeMigrate.sql new file mode 100644 index 0000000000..7a8f142d22 --- /dev/null +++ b/flyway/src/main/resources/db/callbacks/beforeMigrate.sql @@ -0,0 +1 @@ +SELECT 1 \ No newline at end of file diff --git a/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql b/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql new file mode 100644 index 0000000000..526d8e2aea --- /dev/null +++ b/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql @@ -0,0 +1,5 @@ +create table table_one ( + id numeric, + name varchar(50), + constraint pk_table_one primary key (id) +); \ No newline at end of file diff --git a/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql b/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql new file mode 100644 index 0000000000..d51f4a5d56 --- /dev/null +++ b/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql @@ -0,0 +1,5 @@ +create table table_two ( + id numeric, + name varchar(50), + constraint pk_table_two primary key (id) +); \ No newline at end of file diff --git a/flyway/src/main/resources/logback.xml b/flyway/src/main/resources/logback.xml new file mode 100644 index 0000000000..7f4aa46e0d --- /dev/null +++ b/flyway/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java new file mode 100644 index 0000000000..5e96fff64d --- /dev/null +++ b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java @@ -0,0 +1,68 @@ +package com.baeldung.flywaycallbacks; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.Flyway; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) +@ContextConfiguration(classes = FlywayCallbackTestConfig.class) +public class FlywayApplicationTest { + + private Log log = LogFactory.getLog(getClass()); + + @Autowired + private DataSource dataSource; + + @Test + public void migrateWithNoCallbacks() { + logTestBoundary("migrateWithNoCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration"); + flyway.migrate(); + } + + @Test + public void migrateWithJavaCallbacks() { + logTestBoundary("migrateWithJavaCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration"); + flyway.setCallbacks(new ExampleFlywayCallback()); + flyway.migrate(); + } + + @Test + public void migrateWithSqlCallbacks() { + logTestBoundary("migrateWithSqlCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration", "db/callbacks"); + flyway.migrate(); + } + + @Test + public void migrateWithSqlAndJavaCallbacks() { + logTestBoundary("migrateWithSqlAndJavaCallbacks"); + Flyway flyway = new Flyway(); + flyway.setDataSource(dataSource); + flyway.setLocations("db/migration", "db/callbacks"); + flyway.setCallbacks(new ExampleFlywayCallback()); + flyway.migrate(); + } + + private void logTestBoundary(String testName) { + System.out.println("\n"); + log.info("> " + testName); + } + } diff --git a/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java new file mode 100644 index 0000000000..f64b490dcf --- /dev/null +++ b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.flywaycallbacks; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +@Configuration +public class FlywayCallbackTestConfig { + + @Bean + public DataSource createDatasource() { + EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder(); + return dbBuilder.setType(EmbeddedDatabaseType.H2) + .setName("DATABASE") + .build(); + } + +} diff --git a/geotools/pom.xml b/geotools/pom.xml index 37b4a2338a..d0eb787be8 100644 --- a/geotools/pom.xml +++ b/geotools/pom.xml @@ -59,6 +59,7 @@ trueorg.apache.maven.pluginsmaven-compiler-plugin + 3.7.0 1.8 1.8 diff --git a/geotools/src/test/java/com/baeldung/geotools/GeoToolsUnitTest.java b/geotools/src/test/java/com/baeldung/geotools/GeoToolsUnitTest.java index 053932b2a7..4a63c44c8b 100644 --- a/geotools/src/test/java/com/baeldung/geotools/GeoToolsUnitTest.java +++ b/geotools/src/test/java/com/baeldung/geotools/GeoToolsUnitTest.java @@ -3,7 +3,6 @@ package com.baeldung.geotools; import static org.junit.Assert.assertNotNull; import org.geotools.feature.DefaultFeatureCollection; -import org.geotools.feature.simple.SimpleFeatureBuilder; import org.junit.Test; import org.opengis.feature.simple.SimpleFeatureType; @@ -19,4 +18,5 @@ public class GeoToolsUnitTest { assertNotNull(collection); } + } diff --git a/google-cloud/README.md b/google-cloud/README.md new file mode 100644 index 0000000000..6022796a0e --- /dev/null +++ b/google-cloud/README.md @@ -0,0 +1,16 @@ +## Google Cloud Tutorial Project + +### Relevant Article: +- [Intro to Google Cloud Storage With Java](http://www.baeldung.com/intro-to-google-cloud-storage-with-java/) + +### Overview +This Maven project contains the Java code for the article linked above. + +### Package Organization +Java classes for the intro tutorial are in the org.baeldung.google.cloud package. Please note that Google Cloud requires +a user account and credentials, as explained in the tutorial. + + +### Running the tests + +``` diff --git a/google-cloud/pom.xml b/google-cloud/pom.xml new file mode 100644 index 0000000000..0f1eff36f8 --- /dev/null +++ b/google-cloud/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + google-cloud + 0.1-SNAPSHOT + jar + google-cloud + Google Cloud Tutorials + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + com.google.cloud + google-cloud-storage + 1.16.0 + + + org.projectlombok + lombok + + ${lombok.version} + provided + + + + + 1.16.18 + 1.8 + UTF-8 + + + diff --git a/google-cloud/src/main/java/com/baeldung/google/cloud/storage/GoogleCloudStorage.java b/google-cloud/src/main/java/com/baeldung/google/cloud/storage/GoogleCloudStorage.java new file mode 100644 index 0000000000..a69171f1db --- /dev/null +++ b/google-cloud/src/main/java/com/baeldung/google/cloud/storage/GoogleCloudStorage.java @@ -0,0 +1,105 @@ +package com.baeldung.google.cloud.storage; + +import com.google.api.gax.paging.Page; +import com.google.auth.Credentials; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.cloud.storage.*; +import lombok.extern.slf4j.Slf4j; + +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.WritableByteChannel; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Simple class for creating, reading and modifying text blobs on Google Cloud + */ +@Slf4j +public class GoogleCloudStorage { + + private Storage storage; + private Bucket bucket; + + public static void main(String[] args) throws Exception { + + // Use this variation to read the Google authorization JSON from the resources directory with a path + // and a project name. + GoogleCloudStorage googleCloudStorage = + new GoogleCloudStorage("google-cloud/src/main/resources/google_auth.json", "baeldung-cloud-tutorial"); + + // Bucket require globally unique names, so you'll probably need to change this + Bucket bucket = googleCloudStorage.getBucket("baeldung-1-bucket"); + + // Save a simple string + BlobId blobId = googleCloudStorage.saveString("my-first-blob", "Hi there!", bucket); + + // Get it by blob id this time + String value = googleCloudStorage.getString(blobId); + + log.info("Read data: {}", value); + + googleCloudStorage.updateString(blobId, "Bye now!"); + + // Get the string by blob name + value = googleCloudStorage.getString("my-first-blob"); + + log.info("Read modified data: {}", value); + + + } + + + // Use path and project name + private GoogleCloudStorage(String pathToConfig, String projectId) throws IOException { + Credentials credentials = GoogleCredentials.fromStream(new FileInputStream(pathToConfig)); + storage = StorageOptions.newBuilder().setCredentials(credentials).setProjectId(projectId).build().getService(); + } + + // Check for bucket existence and create if needed. + private Bucket getBucket(String bucketName) { + bucket = storage.get(bucketName); + if (bucket == null) { + System.out.println("Creating new bucket."); + bucket = storage.create(BucketInfo.of(bucketName)); + } + return bucket; + } + + // Save a string to a blob + private BlobId saveString(String blobName, String value, Bucket bucket) { + byte[] bytes = value.getBytes(UTF_8); + Blob blob = bucket.create(blobName, bytes); + return blob.getBlobId(); + } + + + // get a blob by id + private String getString(BlobId blobId) { + Blob blob = storage.get(blobId); + return new String(blob.getContent()); + } + + + // get a blob by name + private String getString(String name) { + Page blobs = bucket.list(); + for (Blob blob: blobs.getValues()) { + if (name.equals(blob.getName())) { + return new String(blob.getContent()); + } + } + return "Blob not found"; + } + + // Update a blob + private void updateString(BlobId blobId, String newString) throws IOException { + Blob blob = storage.get(blobId); + if (blob != null) { + WritableByteChannel channel = blob.writer(); + channel.write(ByteBuffer.wrap(newString.getBytes(UTF_8))); + channel.close(); + } + } +} \ No newline at end of file diff --git a/gradle/.gitignore b/gradle/.gitignore new file mode 100644 index 0000000000..da88288c09 --- /dev/null +++ b/gradle/.gitignore @@ -0,0 +1 @@ +/.gradle/ diff --git a/gradle/.travis.yml b/gradle/.travis.yml new file mode 100644 index 0000000000..b2b534799b --- /dev/null +++ b/gradle/.travis.yml @@ -0,0 +1,27 @@ +# More details on how to configure the Travis build +# https://docs.travis-ci.com/user/customizing-the-build/ + +# Speed up build with travis caches +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ + +language: java + +jdk: + - oraclejdk8 + +#Skipping install step to avoid having Travis run arbitrary './gradlew assemble' task +# https://docs.travis-ci.com/user/customizing-the-build/#Skipping-the-Installation-Step +install: + - true + +#Don't build tags +branches: + except: + - /^v\d/ + +#Build and perform release (if needed) +script: + - ./gradlew build -s && ./gradlew ciPerformRelease \ No newline at end of file diff --git a/gradle/README.md b/gradle/README.md index ff12555376..5fc7b40e3f 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -1 +1,4 @@ ## Relevant articles: +- [Introduction to Gradle](http://www.baeldung.com/gradle) +- [Writing Custom Gradle Plugins](http://www.baeldung.com/gradle-create-plugin) +- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar) diff --git a/gradle/build.gradle b/gradle/build.gradle index fc561987f7..2e5d984fba 100644 --- a/gradle/build.gradle +++ b/gradle/build.gradle @@ -1,25 +1,92 @@ -apply plugin: 'java' -apply plugin: 'maven' - -repositories{ - mavenCentral() +allprojects { + repositories { + jcenter() + } } -dependencies{ - compile 'org.springframework:spring-context:4.3.5.RELEASE' -} -task hello { - println "this Baeldung's tutorial is ${awesomeness}" +subprojects { + + version = '1.0' } -uploadArchives { - repositories { - mavenDeployer { - repository(url: 'http://yourmavenrepo/repository') { - authentication(userName: 'user', password: 'password'); - } - - } - } +apply plugin: 'eclipse' + +println 'This will be executed during the configuration phase.' + +task configured { + println 'This will also be executed during the configuration phase.' } + +task execFirstTest { + doLast { + println 'This will be executed during the execution phase.' + } +} + +task execSecondTest { + doFirst { + println 'This will be executed first during the execution phase.' + } + doLast { + println 'This will be executed last during the execution phase.' + } + println 'This will be executed during the configuration phase as well.' +} + +task welcome { + doLast { + println 'Welcome on the Baeldung!' + } +} + +task welcomeWithGroup { + group 'Sample category' + doLast { + println 'Welcome on the Baeldung!' + } +} + +task welcomeWithGroupAndDescription { + group 'Sample category' + description 'Tasks which shows welcome message' + doLast { + println 'Welcome on the Baeldung!' + } +} + +class PrintToolVersionTask extends DefaultTask { + String tool + + @TaskAction + void printToolVersion() { + switch (tool) { + case 'java': + println System.getProperty("java.version") + break + case 'groovy': + println GroovySystem.version + break + default: + throw new IllegalArgumentException("Unknown tool") + } + } +} + +task printJavaVersion(type : PrintToolVersionTask) { + tool 'java' +} + +task printGroovyVersion(type : PrintToolVersionTask) { + tool 'groovy' +} + +import com.baeldung.PrintToolVersionBuildSrcTask + +task printJavaVersionBuildSrc(type : PrintToolVersionBuildSrcTask) { + tool 'java' +} + +task printGroovyVersionBuildSrc(type : PrintToolVersionBuildSrcTask) { + tool 'groovy' +} \ No newline at end of file diff --git a/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy b/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy new file mode 100644 index 0000000000..0fbd71db56 --- /dev/null +++ b/gradle/buildSrc/src/main/groovy/com/baeldung/PrintToolVersionBuildSrcTask.groovy @@ -0,0 +1,22 @@ +package com.baeldung + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction + +class PrintToolVersionBuildSrcTask extends DefaultTask { + String tool + + @TaskAction + void printToolVersion() { + switch (tool) { + case 'java': + println System.getProperty("java.version") + break + case 'groovy': + println GroovySystem.version + break + default: + throw new IllegalArgumentException("Unknown tool") + } + } +} \ No newline at end of file diff --git a/gradle/gradle-fat-jar/build.gradle b/gradle/gradle-fat-jar/build.gradle new file mode 100644 index 0000000000..6afad80652 --- /dev/null +++ b/gradle/gradle-fat-jar/build.gradle @@ -0,0 +1,41 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1' + } +} + +apply plugin: 'java' +apply plugin: 'com.github.johnrengelman.shadow' + +repositories { + mavenCentral() +} + +jar { + manifest { + attributes "Main-Class": "com.baeldung.fatjar.Application" + } + + from { + configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + } +} + + +task customFatJar(type: Jar) { + manifest { + attributes 'Main-Class': 'com.baeldung.fatjar.Application' + } + baseName = 'all-in-one-jar' + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + with jar +} + + +dependencies{ + compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25' + compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25' +} \ No newline at end of file diff --git a/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java b/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java new file mode 100644 index 0000000000..470d89c332 --- /dev/null +++ b/gradle/gradle-fat-jar/src/main/java/com/baeldung/fatjar/Application.java @@ -0,0 +1,16 @@ +package com.baeldung.fatjar; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class Application { + + static final Logger logger = LoggerFactory.getLogger(Application.class); + + public static void main(String[] args) { + + logger.info("Hello at Baeldung!"); + } + +} \ No newline at end of file diff --git a/gradle/gradle.properties b/gradle/gradle.properties deleted file mode 100644 index 41701e5a19..0000000000 --- a/gradle/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -awesomeness=awesome -group=com.baeldung.tutorial -version=1.0.1 diff --git a/gradle/gradle/shipkit.gradle b/gradle/gradle/shipkit.gradle new file mode 100644 index 0000000000..144c01dc05 --- /dev/null +++ b/gradle/gradle/shipkit.gradle @@ -0,0 +1,41 @@ +//This default Shipkit configuration file was created automatically and is intended to be checked-in. +//Default configuration is sufficient for local testing and trying out Shipkit. +//To leverage Shipkit fully, please fix the TODO items, refer to our Getting Started Guide for help: +// +// https://github.com/mockito/shipkit/blob/master/docs/getting-started.md +// +shipkit { + //TODO is the repository correct? + gitHub.repository = "unspecified-user/unspecified-repo" + + //TODO generate and use your own read-only GitHub personal access token + gitHub.readOnlyAuthToken = "76826c9ec886612f504d12fd4268b16721c4f85d" + + //TODO generate GitHub write token, and ensure your Travis CI has this env variable exported + gitHub.writeAuthToken = System.getenv("GH_WRITE_TOKEN") +} + +allprojects { + plugins.withId("com.jfrog.bintray") { + + //Bintray configuration is handled by JFrog Bintray Gradle Plugin + //For reference see the official documentation: https://github.com/bintray/gradle-bintray-plugin + bintray { + + //TODO sign up for free open source account with https://bintray.com, then look up your API key on your profile page in Bintray + key = '7ea297848ca948adb7d3ee92a83292112d7ae989' + //TODO don't check in the key, remove above line and use env variable exported on CI: + //key = System.getenv("BINTRAY_API_KEY") + + pkg { + //TODO configure Bintray settings per your project (https://github.com/bintray/gradle-bintray-plugin) + repo = 'bootstrap' + user = 'shipkit-bootstrap-bot' + userOrg = 'shipkit-bootstrap' + name = 'maven' + licenses = ['MIT'] + labels = ['continuous delivery', 'release automation', 'shipkit'] + } + } + } +} diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 3391a4cdf6..0000000000 Binary files a/gradle/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties index b601d97764..ebf7ae9184 100644 --- a/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Dec 31 15:46:08 BRT 2016 +#Thu Oct 12 16:43:02 BDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip diff --git a/gradle/gradletaskdemo/aplugin.gradle b/gradle/gradletaskdemo/aplugin.gradle new file mode 100644 index 0000000000..ca96c50b54 --- /dev/null +++ b/gradle/gradletaskdemo/aplugin.gradle @@ -0,0 +1,5 @@ +task fromPlugin { + doLast { + println "I'm from plugin" + } +} \ No newline at end of file diff --git a/gradle/gradletaskdemo/build.gradle b/gradle/gradletaskdemo/build.gradle new file mode 100644 index 0000000000..58dadd7460 --- /dev/null +++ b/gradle/gradletaskdemo/build.gradle @@ -0,0 +1,110 @@ +buildscript { + repositories { + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath "org.shipkit:shipkit:0.9.117" + } +} + + +plugins { + id 'java' +} + + +apply from: 'aplugin.gradle' +apply plugin: 'org.shipkit.bintray-release' + + +//hello task +task hello { + doLast { + println 'Baeldung' + } +} + +//Groovy in gradle task +task toLower { + doLast { + String someString = 'HELLO FROM BAELDUNG' + println "Original: " + someString + println "Lower case: " + someString.toLowerCase() + } +} + + +// Task dependencies +task helloGradle { + doLast { + println 'Hello Gradle!' + } +} + +task fromBaeldung(dependsOn: helloGradle) { + doLast { + println "I'm from Baeldung" + } +} + + +//Adding behavior to a task via api +task helloBaeldung { + doLast { + println 'I will be executed second' + } +} + +helloBaeldung.doFirst { + println 'I will be executed first' +} + +helloBaeldung.doLast { + println 'I will be executed third' +} + +helloBaeldung { + doLast { + println 'I will be executed fourth' + } +} + + + + +//Adding extra task properties +task ourTask { + ext.theProperty = "theValue" +} + +task printTaskProperty { + doLast { + println ourTask.theProperty + } +} + + + +//Declaring dependencies +dependencies { + compile group: + 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE' + compile 'org.springframework:spring-core:4.3.5.RELEASE', + 'org.springframework:spring-aop:4.3.5.RELEASE' + compile( + [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'], + [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE'] + ) + testCompile('org.hibernate:hibernate-core:5.2.12.Final') { + transitive = true + } + runtime(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') { + transitive = false + } + runtime "org.codehaus.groovy:groovy-all:2.4.11@jar" + runtime group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar' + + compile fileTree(dir: 'libs', include: '*.jar') +} diff --git a/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF b/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000000..59499bce4a --- /dev/null +++ b/gradle/gradletaskdemo/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/gradle/gradlew b/gradle/gradlew index 9d82f78915..27309d9231 100644 --- a/gradle/gradlew +++ b/gradle/gradlew @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then diff --git a/gradle/gradlew.bat b/gradle/gradlew.bat index 8a0b282aa6..832fdb6079 100644 --- a/gradle/gradlew.bat +++ b/gradle/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,7 +46,7 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args diff --git a/gradle/greeter/.gitignore b/gradle/greeter/.gitignore new file mode 100644 index 0000000000..e93e09f86e --- /dev/null +++ b/gradle/greeter/.gitignore @@ -0,0 +1,3 @@ +/.gradle +/build +/bin diff --git a/gradle/greeter/build.gradle b/gradle/greeter/build.gradle new file mode 100644 index 0000000000..6f43f23494 --- /dev/null +++ b/gradle/greeter/build.gradle @@ -0,0 +1,18 @@ +apply plugin : 'java' +apply plugin : 'application' + + + +dependencies { + compile project(':greeting-library') + compile project(':greeting-library-java') +} + +mainClassName = 'greeter.Greeter' +run { + if (project.hasProperty("appArgs")) { + args Eval.me(appArgs) + } + else + args = ["Baeldung"]; +} diff --git a/gradle/greeter/src/main/java/greeter/Greeter.java b/gradle/greeter/src/main/java/greeter/Greeter.java new file mode 100644 index 0000000000..7b59f0c4bc --- /dev/null +++ b/gradle/greeter/src/main/java/greeter/Greeter.java @@ -0,0 +1,13 @@ +package greeter; + +import baeldunggreeter.Formatter; + +public class Greeter { + public static void main(String[] args) { + final String output = GreetingFormatter + .greeting(args[0]); + String date = Formatter.getFormattedDate(); + System.out.println(output); + System.out.println("Today is :" + date); + } +} diff --git a/gradle/greeter/src/test/java/greetertest/TestGreeting.java b/gradle/greeter/src/test/java/greetertest/TestGreeting.java new file mode 100644 index 0000000000..0ae5fab631 --- /dev/null +++ b/gradle/greeter/src/test/java/greetertest/TestGreeting.java @@ -0,0 +1,11 @@ + + + + +public class TestGreeting{ + + + + + +} \ No newline at end of file diff --git a/gradle/greeting-library-java/.gitignore b/gradle/greeting-library-java/.gitignore new file mode 100644 index 0000000000..348c102afc --- /dev/null +++ b/gradle/greeting-library-java/.gitignore @@ -0,0 +1,2 @@ +/build +/bin diff --git a/gradle/greeting-library-java/build.gradle b/gradle/greeting-library-java/build.gradle new file mode 100644 index 0000000000..34931bd0cd --- /dev/null +++ b/gradle/greeting-library-java/build.gradle @@ -0,0 +1,9 @@ +apply plugin :'java' +//apply plugin : 'application' + + + +dependencies{ + compile group: 'joda-time', name: 'joda-time', version: '2.9.9' + testCompile group: 'junit', name: 'junit', version: '4.12' +} diff --git a/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java b/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java new file mode 100644 index 0000000000..367e992c1b --- /dev/null +++ b/gradle/greeting-library-java/src/main/java/baeldunggreeter/Formatter.java @@ -0,0 +1,14 @@ +package baeldunggreeter; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Formatter { + public static String getFormattedDate() { + DateFormat dateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + return dateFormat.format(date); + } +} diff --git a/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java b/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java new file mode 100644 index 0000000000..49efc934a5 --- /dev/null +++ b/gradle/greeting-library-java/src/test/java/baeldunggreetertest/FormatterTest.java @@ -0,0 +1,23 @@ +package baeldunggreetertest; + +import static org.junit.Assert.assertTrue; + +import java.util.Date; +import java.util.regex.Pattern; + +import org.junit.Test; + +import baeldunggreeter.Formatter; + +public class FormatterTest { + + @Test + public void testFormatter() { + + String dateRegex1 = "^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])$"; + String dateString = Formatter.getFormattedDate(); + assertTrue(Pattern + .matches(dateRegex1, dateString)); + + } +} \ No newline at end of file diff --git a/gradle/greeting-library/.gitignore b/gradle/greeting-library/.gitignore new file mode 100644 index 0000000000..84c048a73c --- /dev/null +++ b/gradle/greeting-library/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy b/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy new file mode 100644 index 0000000000..94c863e294 --- /dev/null +++ b/gradle/greeting-library/bin/greeter/GreetingFormatter.groovy @@ -0,0 +1,10 @@ +package greeter + +import groovy.transform.CompileStatic + +@CompileStatic +class GreetingFormatter{ + static String greeting(final String name) { + "Hello, ${name.capitalize()}" + } +} diff --git a/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy b/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy new file mode 100644 index 0000000000..f1c1211552 --- /dev/null +++ b/gradle/greeting-library/bin/greeter/GreetingFormatterSpec.groovy @@ -0,0 +1,13 @@ +package greeter + +import spock.lang.Specification + +class GreetingFormatterSpec extends Specification { + + def 'Creating a greeting'() { + + expect: 'The greeeting to be correctly capitalized' + GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant' + + } +} diff --git a/gradle/greeting-library/build.gradle b/gradle/greeting-library/build.gradle new file mode 100644 index 0000000000..eb526b3b03 --- /dev/null +++ b/gradle/greeting-library/build.gradle @@ -0,0 +1,9 @@ +apply plugin : 'groovy' + +dependencies { + compile 'org.codehaus.groovy:groovy:2.4.12' + + testCompile 'org.spockframework:spock-core:1.0-groovy-2.4', { + exclude module : 'groovy-all' + } +} diff --git a/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy b/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy new file mode 100644 index 0000000000..db8a035b67 --- /dev/null +++ b/gradle/greeting-library/src/main/groovy/greeter/GreetingFormatter.groovy @@ -0,0 +1,10 @@ +package greeter + +import groovy.transform.CompileStatic + +@CompileStatic +class GreetingFormatter{ + static String greeting(final String name) { + "Hello, ${name.capitalize()}" + } +} \ No newline at end of file diff --git a/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy b/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy new file mode 100644 index 0000000000..f1c1211552 --- /dev/null +++ b/gradle/greeting-library/src/test/groovy/greeter/GreetingFormatterSpec.groovy @@ -0,0 +1,13 @@ +package greeter + +import spock.lang.Specification + +class GreetingFormatterSpec extends Specification { + + def 'Creating a greeting'() { + + expect: 'The greeeting to be correctly capitalized' + GreetingFormatter.greeting('gradlephant') == 'Hello, Gradlephant' + + } +} diff --git a/gradle/plugin/build.gradle b/gradle/plugin/build.gradle new file mode 100644 index 0000000000..8d7329c1b0 --- /dev/null +++ b/gradle/plugin/build.gradle @@ -0,0 +1,14 @@ + repositories{ + mavenCentral() + } + apply plugin: 'java' + apply plugin: 'maven' + apply plugin: com.baeldung.GreetingPlugin + dependencies { + compile gradleApi() + } + + greeting { + greeter = "Stranger" + message = "Message from the build script!" + } \ No newline at end of file diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java new file mode 100644 index 0000000000..ad32ecfe91 --- /dev/null +++ b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPlugin.java @@ -0,0 +1,17 @@ +package com.baeldung; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + +public class GreetingPlugin implements Plugin { + @Override + public void apply(Project project) { + + GreetingPluginExtension extension = project.getExtensions().create("greeting", GreetingPluginExtension.class); + + project.task("hello").doLast(task -> { + System.out.println("Hello, " + extension.getGreeter()); + System.out.println("I have a message for You: " + extension.getMessage()); } + ); + } +} \ No newline at end of file diff --git a/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java new file mode 100644 index 0000000000..2ff64a43f5 --- /dev/null +++ b/gradle/plugin/buildSrc/src/main/java/com/baeldung/GreetingPluginExtension.java @@ -0,0 +1,22 @@ +package com.baeldung; + +public class GreetingPluginExtension { + private String greeter = "Baeldung"; + private String message = "Message from Plugin!"; + + public String getGreeter() { + return greeter; + } + + public void setGreeter(String greeter) { + this.greeter = greeter; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/gradle/settings.gradle b/gradle/settings.gradle new file mode 100644 index 0000000000..38704681bd --- /dev/null +++ b/gradle/settings.gradle @@ -0,0 +1,10 @@ +rootProject.name = 'gradletutorial' + + +include 'greeting-library' +include 'greeting-library-java' +include 'greeter' +include 'gradletaskdemo' + + +println 'This will be executed during the initialization phase.' diff --git a/gradle/src/main/java/Main.java b/gradle/src/main/java/Main.java deleted file mode 100644 index 10edd1840b..0000000000 --- a/gradle/src/main/java/Main.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Main{ - public static void main(String[] args){ - System.out.println("Baeldung Rocks"); - } -} diff --git a/gradle/version.properties b/gradle/version.properties new file mode 100644 index 0000000000..565e9213ae --- /dev/null +++ b/gradle/version.properties @@ -0,0 +1,3 @@ +#Version of the produced binaries. This file is intended to be checked-in. +#It will be automatically bumped by release automation. +version=0.0.1 diff --git a/guava-modules/README.md b/guava-modules/README.md new file mode 100644 index 0000000000..79e45a89e7 --- /dev/null +++ b/guava-modules/README.md @@ -0,0 +1,3 @@ + +## Guava Modules + diff --git a/guava18/README.md b/guava-modules/guava-18/README.md similarity index 100% rename from guava18/README.md rename to guava-modules/guava-18/README.md diff --git a/guava18/pom.xml b/guava-modules/guava-18/pom.xml similarity index 89% rename from guava18/pom.xml rename to guava-modules/guava-18/pom.xml index 0b96918171..f8dbf5657e 100644 --- a/guava18/pom.xml +++ b/guava-modules/guava-18/pom.xml @@ -4,13 +4,14 @@ 4.0.0 com.baeldung - guava18 + guava-18 0.1.0-SNAPSHOT com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Administrator.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Administrator.java similarity index 100% rename from guava18/src/main/java/com/baeldung/guava/entity/Administrator.java rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Administrator.java diff --git a/guava18/src/main/java/com/baeldung/guava/entity/Player.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Player.java similarity index 100% rename from guava18/src/main/java/com/baeldung/guava/entity/Player.java rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/Player.java diff --git a/guava18/src/main/java/com/baeldung/guava/entity/User.java b/guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/User.java similarity index 100% rename from guava18/src/main/java/com/baeldung/guava/entity/User.java rename to guava-modules/guava-18/src/main/java/com/baeldung/guava/entity/User.java diff --git a/guava18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java similarity index 100% rename from guava18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/FluentIterableUnitTest.java diff --git a/guava18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java similarity index 100% rename from guava18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java diff --git a/guava18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java similarity index 100% rename from guava18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreExecutorsUnitTest.java diff --git a/guava18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java b/guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java similarity index 100% rename from guava18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java rename to guava-modules/guava-18/src/test/java/com/baeldung/guava/MoreObjectsUnitTest.java diff --git a/guava19/README.md b/guava-modules/guava-19/README.md similarity index 100% rename from guava19/README.md rename to guava-modules/guava-19/README.md diff --git a/guava19/pom.xml b/guava-modules/guava-19/pom.xml similarity index 89% rename from guava19/pom.xml rename to guava-modules/guava-19/pom.xml index af9bc51eb9..4a23bf7aec 100644 --- a/guava19/pom.xml +++ b/guava-modules/guava-19/pom.xml @@ -4,13 +4,14 @@ 4.0.0 com.baeldung - guava19 + guava-19 0.1.0-SNAPSHOT com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/guava19/src/main/java/com/baeldung/guava/entity/User.java b/guava-modules/guava-19/src/main/java/com/baeldung/guava/entity/User.java similarity index 100% rename from guava19/src/main/java/com/baeldung/guava/entity/User.java rename to guava-modules/guava-19/src/main/java/com/baeldung/guava/entity/User.java diff --git a/guava19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java similarity index 100% rename from guava19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/CharMatcherUnitTest.java diff --git a/guava19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java similarity index 100% rename from guava19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/GuavaMiscUtilsTest.java diff --git a/guava19/src/test/java/com/baeldung/guava/HashingUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/HashingUnitTest.java similarity index 100% rename from guava19/src/test/java/com/baeldung/guava/HashingUnitTest.java rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/HashingUnitTest.java diff --git a/guava19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java b/guava-modules/guava-19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java similarity index 100% rename from guava19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java rename to guava-modules/guava-19/src/test/java/com/baeldung/guava/TypeTokenUnitTest.java diff --git a/guava21/README.md b/guava-modules/guava-21/README.md similarity index 100% rename from guava21/README.md rename to guava-modules/guava-21/README.md diff --git a/guava21/pom.xml b/guava-modules/guava-21/pom.xml similarity index 89% rename from guava21/pom.xml rename to guava-modules/guava-21/pom.xml index 930def2a67..f5432fb7df 100644 --- a/guava21/pom.xml +++ b/guava-modules/guava-21/pom.xml @@ -4,13 +4,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - guava21 + guava-21 1.0-SNAPSHOT com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java b/guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java similarity index 100% rename from guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java rename to guava-modules/guava-21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java diff --git a/guava21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java b/guava-modules/guava-21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java similarity index 100% rename from guava21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java rename to guava-modules/guava-21/src/test/java/com.baeldung.guava.zip/ZipCollectionTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/AtomicLongMapIntegrationTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/ComparatorsUnitTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/GuavaStreamsUnitTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/InternBuilderUnitTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MonitorUnitTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/MoreCollectorsUnitTest.java diff --git a/guava21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java b/guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java similarity index 100% rename from guava21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java rename to guava-modules/guava-21/src/test/java/com/baeldung/guava/tutorial/StreamUtility.java diff --git a/guava/README.md b/guava/README.md index 7ab70cb01f..924187867e 100644 --- a/guava/README.md +++ b/guava/README.md @@ -19,6 +19,7 @@ - [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering) - [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions) - [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader) +- [Introduction to Guava Memoizer](http://www.baeldung.com/guava-memoizer) - [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus) - [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap) - [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset) diff --git a/guava/pom.xml b/guava/pom.xml index 4afb4da301..ca9e1e528e 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -43,6 +43,8 @@ ${assertj.version} test + + diff --git a/guava/src/main/java/org/baeldung/guava/memoizer/CostlySupplier.java b/guava/src/main/java/org/baeldung/guava/memoizer/CostlySupplier.java new file mode 100644 index 0000000000..63b3fbd438 --- /dev/null +++ b/guava/src/main/java/org/baeldung/guava/memoizer/CostlySupplier.java @@ -0,0 +1,17 @@ +package org.baeldung.guava.memoizer; + +import java.math.BigInteger; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +public class CostlySupplier { + + public static BigInteger generateBigNumber() { + try { + TimeUnit.SECONDS.sleep(2); + } catch (InterruptedException e) { + } + return new BigInteger("12345"); + } + +} diff --git a/guava/src/main/java/org/baeldung/guava/memoizer/Factorial.java b/guava/src/main/java/org/baeldung/guava/memoizer/Factorial.java new file mode 100644 index 0000000000..74fcbdcc14 --- /dev/null +++ b/guava/src/main/java/org/baeldung/guava/memoizer/Factorial.java @@ -0,0 +1,22 @@ +package org.baeldung.guava.memoizer; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.math.BigInteger; + +public class Factorial { + + private static LoadingCache memo = CacheBuilder.newBuilder() + .build(CacheLoader.from(Factorial::getFactorial)); + + public static BigInteger getFactorial(int n) { + if (n == 0) { + return BigInteger.ONE; + } else { + return BigInteger.valueOf(n).multiply(memo.getUnchecked(n - 1)); + } + } + +} diff --git a/guava/src/main/java/org/baeldung/guava/memoizer/FibonacciSequence.java b/guava/src/main/java/org/baeldung/guava/memoizer/FibonacciSequence.java new file mode 100644 index 0000000000..0c70f08c23 --- /dev/null +++ b/guava/src/main/java/org/baeldung/guava/memoizer/FibonacciSequence.java @@ -0,0 +1,26 @@ +package org.baeldung.guava.memoizer; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.math.BigInteger; +import java.util.concurrent.TimeUnit; + +public class FibonacciSequence { + + private static LoadingCache memo = CacheBuilder.newBuilder() + .maximumSize(100) + .build(CacheLoader.from(FibonacciSequence::getFibonacciNumber)); + + public static BigInteger getFibonacciNumber(int n) { + if (n == 0) { + return BigInteger.ZERO; + } else if (n == 1) { + return BigInteger.ONE; + } else { + return memo.getUnchecked(n - 1).add(memo.getUnchecked(n - 2)); + } + } + +} diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCacheUnitTest.java b/guava/src/test/java/org/baeldung/guava/GuavaCacheUnitTest.java index eb67d8af44..49ce6b1a09 100644 --- a/guava/src/test/java/org/baeldung/guava/GuavaCacheUnitTest.java +++ b/guava/src/test/java/org/baeldung/guava/GuavaCacheUnitTest.java @@ -89,7 +89,7 @@ public class GuavaCacheUnitTest { cache.getUnchecked("hello"); assertEquals(1, cache.size()); cache.getUnchecked("hello"); - Thread.sleep(300); + Thread.sleep(3); cache.getUnchecked("test"); assertEquals(1, cache.size()); assertNull(cache.getIfPresent("hello")); @@ -106,7 +106,7 @@ public class GuavaCacheUnitTest { final LoadingCache cache = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.MILLISECONDS).build(loader); cache.getUnchecked("hello"); assertEquals(1, cache.size()); - Thread.sleep(300); + Thread.sleep(3); cache.getUnchecked("test"); assertEquals(1, cache.size()); assertNull(cache.getIfPresent("hello")); @@ -203,8 +203,9 @@ public class GuavaCacheUnitTest { private String getSuffix(final String str) { final int lastIndex = str.lastIndexOf('.'); - if (lastIndex == -1) + if (lastIndex == -1) { return null; + } return str.substring(lastIndex + 1); } diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMemoizerUnitTest.java b/guava/src/test/java/org/baeldung/guava/GuavaMemoizerUnitTest.java new file mode 100644 index 0000000000..1f934347b4 --- /dev/null +++ b/guava/src/test/java/org/baeldung/guava/GuavaMemoizerUnitTest.java @@ -0,0 +1,92 @@ +package org.baeldung.guava; + +import com.google.common.base.Suppliers; +import org.baeldung.guava.memoizer.CostlySupplier; +import org.baeldung.guava.memoizer.Factorial; +import org.baeldung.guava.memoizer.FibonacciSequence; +import org.junit.Test; + +import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.number.IsCloseTo.closeTo; +import static org.junit.Assert.assertThat; + +public class GuavaMemoizerUnitTest { + + @Test + public void givenInteger_whenGetFibonacciNumber_thenShouldCalculateFibonacciNumber() { + // given + int n = 95; + + // when + BigInteger fibonacciNumber = FibonacciSequence.getFibonacciNumber(n); + + // then + BigInteger expectedFibonacciNumber = new BigInteger("31940434634990099905"); + assertThat(fibonacciNumber, is(equalTo(expectedFibonacciNumber))); + } + + @Test + public void givenInteger_whenGetFactorial_thenShouldCalculateFactorial() { + // given + int n = 95; + + // when + BigInteger factorial = Factorial.getFactorial(n); + + // then + BigInteger expectedFactorial = new BigInteger("10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000"); + assertThat(factorial, is(equalTo(expectedFactorial))); + } + + @Test + public void givenMemoizedSupplier_whenGet_thenSubsequentGetsAreFast() { + // given + Supplier memoizedSupplier; + memoizedSupplier = Suppliers.memoize(CostlySupplier::generateBigNumber); + + // when + BigInteger expectedValue = new BigInteger("12345"); + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 2000D); + + // then + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 0D); + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 0D); + } + + @Test + public void givenMemoizedSupplierWithExpiration_whenGet_thenSubsequentGetsBeforeExpiredAreFast() throws InterruptedException { + // given + Supplier memoizedSupplier; + memoizedSupplier = Suppliers.memoizeWithExpiration(CostlySupplier::generateBigNumber, 3, TimeUnit.SECONDS); + + // when + BigInteger expectedValue = new BigInteger("12345"); + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 2000D); + + // then + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 0D); + // add one more second until memoized Supplier is evicted from memory + TimeUnit.SECONDS.sleep(1); + assertSupplierGetExecutionResultAndDuration(memoizedSupplier, expectedValue, 2000D); + } + + private void assertSupplierGetExecutionResultAndDuration(Supplier supplier, + T expectedValue, + double expectedDurationInMs) { + Instant start = Instant.now(); + T value = supplier.get(); + Long durationInMs = Duration.between(start, Instant.now()).toMillis(); + double marginOfErrorInMs = 100D; + + assertThat(value, is(equalTo(expectedValue))); + assertThat(durationInMs.doubleValue(), is(closeTo(expectedDurationInMs, marginOfErrorInMs))); + } + +} diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml index d588df4abc..0e227798af 100644 --- a/guest/core-java-9/pom.xml +++ b/guest/core-java-9/pom.xml @@ -16,7 +16,7 @@ maven-compiler-plugin - 3.6.2 + 3.7.0 1.9 1.9 diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml index 548d5c663b..eda3846c1f 100644 --- a/guest/core-java/pom.xml +++ b/guest/core-java/pom.xml @@ -16,13 +16,31 @@ log4j-core ${log4j2.version} + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-all + ${org.hamcrest.version} + test + maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 @@ -32,5 +50,6 @@ 2.8.2 + 1.3 \ No newline at end of file diff --git a/guest/core-java/src/main/java/com/stackify/stream/Employee.java b/guest/core-java/src/main/java/com/stackify/stream/Employee.java new file mode 100644 index 0000000000..005990c863 --- /dev/null +++ b/guest/core-java/src/main/java/com/stackify/stream/Employee.java @@ -0,0 +1,46 @@ +package com.stackify.stream; + +public class Employee { + private Integer id; + private String name; + private Double salary; + + public Employee(Integer id, String name, Double salary) { + this.id = id; + this.name = name; + this.salary = salary; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getSalary() { + return salary; + } + + public void setSalary(Double salary) { + this.salary = salary; + } + + public void salaryIncrement(Double percentage) { + Double newSalary = salary + percentage * salary / 100; + setSalary(newSalary); + } + + public String toString() { + return "Id: " + id + " Name:" + name + " Price:" + salary; + } +} diff --git a/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java b/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java new file mode 100644 index 0000000000..223fee5e26 --- /dev/null +++ b/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java @@ -0,0 +1,21 @@ +package com.stackify.stream; + +import java.util.List; + +public class EmployeeRepository { + private List empList; + + public EmployeeRepository(List empList) { + this.empList = empList; + + } + public Employee findById(Integer id) { + for (Employee emp : empList) { + if (emp.getId() == id) { + return emp; + } + } + + return null; + } +} diff --git a/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java b/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java new file mode 100644 index 0000000000..cf988d035a --- /dev/null +++ b/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java @@ -0,0 +1,455 @@ +package com.stackify.stream; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.DoubleSummaryStatistics; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.Set; +import java.util.Vector; +import java.util.function.BinaryOperator; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.After; +import org.junit.Test; + +public class EmployeeTest { + private String fileName = "src/test/resources/test.txt"; + + private static Employee[] arrayOfEmps = { + new Employee(1, "Jeff Bezos", 100000.0), + new Employee(2, "Bill Gates", 200000.0), + new Employee(3, "Mark Zuckerberg", 300000.0) + }; + + private static List empList = Arrays.asList(arrayOfEmps); + private static EmployeeRepository employeeRepository = new EmployeeRepository(empList); + + @After + public void cleanup() throws IOException { + Files.deleteIfExists(Paths.get(fileName)); + } + + @Test + public void whenGetStreamFromList_ObtainStream() { + assert(empList.stream() instanceof Stream); + } + + @Test + public void whenGetStreamFromArray_ObtainStream() { + assert(Stream.of(arrayOfEmps) instanceof Stream); + } + + @Test + public void whenGetStreamFromElements_ObtainStream() { + assert(Stream.of(arrayOfEmps[0], arrayOfEmps[1], arrayOfEmps[2]) instanceof Stream); + } + + @Test + public void whenBuildStreamFromElements_ObtainStream() { + Stream.Builder empStreamBuilder = Stream.builder(); + + empStreamBuilder.accept(arrayOfEmps[0]); + empStreamBuilder.accept(arrayOfEmps[1]); + empStreamBuilder.accept(arrayOfEmps[2]); + + Stream empStream = empStreamBuilder.build(); + + assert(empStream instanceof Stream); + } + + @Test + public void whenIncrementSalaryForEachEmployee_thenApplyNewSalary() { + Employee[] arrayOfEmps = { + new Employee(1, "Jeff Bezos", 100000.0), + new Employee(2, "Bill Gates", 200000.0), + new Employee(3, "Mark Zuckerberg", 300000.0) + }; + + List empList = Arrays.asList(arrayOfEmps); + + empList.stream().forEach(e -> e.salaryIncrement(10.0)); + + assertThat(empList, contains( + hasProperty("salary", equalTo(110000.0)), + hasProperty("salary", equalTo(220000.0)), + hasProperty("salary", equalTo(330000.0)) + )); + } + + @Test + public void whenIncrementSalaryUsingPeek_thenApplyNewSalary() { + Employee[] arrayOfEmps = { + new Employee(1, "Jeff Bezos", 100000.0), + new Employee(2, "Bill Gates", 200000.0), + new Employee(3, "Mark Zuckerberg", 300000.0) + }; + + List empList = Arrays.asList(arrayOfEmps); + + empList.stream() + .peek(e -> e.salaryIncrement(10.0)) + .peek(System.out::println) + .collect(Collectors.toList()); + + assertThat(empList, contains( + hasProperty("salary", equalTo(110000.0)), + hasProperty("salary", equalTo(220000.0)), + hasProperty("salary", equalTo(330000.0)) + )); + } + + @Test + public void whenMapIdToEmployees_thenGetEmployeeStream() { + Integer[] empIds = { 1, 2, 3 }; + + List employees = Stream.of(empIds) + .map(employeeRepository::findById) + .collect(Collectors.toList()); + + assertEquals(employees.size(), empIds.length); + } + + @Test + public void whenFlatMapEmployeeNames_thenGetNameStream() { + List> namesNested = Arrays.asList( + Arrays.asList("Jeff", "Bezos"), + Arrays.asList("Bill", "Gates"), + Arrays.asList("Mark", "Zuckerberg")); + + List namesFlatStream = namesNested.stream() + .flatMap(Collection::stream) + .collect(Collectors.toList()); + + assertEquals(namesFlatStream.size(), namesNested.size() * 2); + } + + @Test + public void whenFilterEmployees_thenGetFilteredStream() { + Integer[] empIds = { 1, 2, 3, 4 }; + + List employees = Stream.of(empIds) + .map(employeeRepository::findById) + .filter(e -> e != null) + .filter(e -> e.getSalary() > 200000) + .collect(Collectors.toList()); + + assertEquals(Arrays.asList(arrayOfEmps[2]), employees); + } + + @Test + public void whenFindFirst_thenGetFirstEmployeeInStream() { + Integer[] empIds = { 1, 2, 3, 4 }; + + Employee employee = Stream.of(empIds) + .map(employeeRepository::findById) + .filter(e -> e != null) + .filter(e -> e.getSalary() > 100000) + .findFirst() + .orElse(null); + + assertEquals(employee.getSalary(), new Double(200000)); + } + + @Test + public void whenCollectStreamToList_thenGetList() { + List employees = empList.stream().collect(Collectors.toList()); + + assertEquals(empList, employees); + } + + @Test + public void whenStreamToArray_thenGetArray() { + Employee[] employees = empList.stream().toArray(Employee[]::new); + + assertThat(empList.toArray(), equalTo(employees)); + } + + @Test + public void whenStreamCount_thenGetElementCount() { + Long empCount = empList.stream() + .filter(e -> e.getSalary() > 200000) + .count(); + + assertEquals(empCount, new Long(1)); + } + + @Test + public void whenLimitInfiniteStream_thenGetFiniteElements() { + Stream infiniteStream = Stream.iterate(2, i -> i * 2); + + List collect = infiniteStream + .skip(3) + .limit(5) + .collect(Collectors.toList()); + + assertEquals(collect, Arrays.asList(16, 32, 64, 128, 256)); + } + + @Test + public void whenSortStream_thenGetSortedStream() { + List employees = empList.stream() + .sorted((e1, e2) -> e1.getName().compareTo(e2.getName())) + .collect(Collectors.toList()); + + assertEquals(employees.get(0).getName(), "Bill Gates"); + assertEquals(employees.get(1).getName(), "Jeff Bezos"); + assertEquals(employees.get(2).getName(), "Mark Zuckerberg"); + } + + + @Test + public void whenFindMin_thenGetMinElementFromStream() { + Employee firstEmp = empList.stream() + .min((e1, e2) -> e1.getId() - e2.getId()) + .orElseThrow(NoSuchElementException::new); + + assertEquals(firstEmp.getId(), new Integer(1)); + } + + @Test + public void whenFindMax_thenGetMaxElementFromStream() { + Employee maxSalEmp = empList.stream() + .max(Comparator.comparing(Employee::getSalary)) + .orElseThrow(NoSuchElementException::new); + + assertEquals(maxSalEmp.getSalary(), new Double(300000.0)); + } + + @Test + public void whenApplyDistinct_thenRemoveDuplicatesFromStream() { + List intList = Arrays.asList(2, 5, 3, 2, 4, 3); + List distinctIntList = intList.stream().distinct().collect(Collectors.toList()); + + assertEquals(distinctIntList, Arrays.asList(2, 5, 3, 4)); + } + + @Test + public void whenApplyMatch_thenReturnBoolean() { + List intList = Arrays.asList(2, 4, 5, 6, 8); + + boolean allEven = intList.stream().allMatch(i -> i % 2 == 0); + boolean oneEven = intList.stream().anyMatch(i -> i % 2 == 0); + boolean noneMultipleOfThree = intList.stream().noneMatch(i -> i % 3 == 0); + + assertEquals(allEven, false); + assertEquals(oneEven, true); + assertEquals(noneMultipleOfThree, false); + } + + @Test + public void whenFindMaxOnIntStream_thenGetMaxInteger() { + Integer latestEmpId = empList.stream() + .mapToInt(Employee::getId) + .max() + .orElseThrow(NoSuchElementException::new); + + assertEquals(latestEmpId, new Integer(3)); + } + + @Test + public void whenApplySumOnIntStream_thenGetSum() { + Double avgSal = empList.stream() + .mapToDouble(Employee::getSalary) + .average() + .orElseThrow(NoSuchElementException::new); + + assertEquals(avgSal, new Double(200000)); + } + + @Test + public void whenApplyReduceOnStream_thenGetValue() { + Double sumSal = empList.stream() + .map(Employee::getSalary) + .reduce(0.0, Double::sum); + + assertEquals(sumSal, new Double(600000)); + } + + @Test + public void whenCollectByJoining_thenGetJoinedString() { + String empNames = empList.stream() + .map(Employee::getName) + .collect(Collectors.joining(", ")) + .toString(); + + assertEquals(empNames, "Jeff Bezos, Bill Gates, Mark Zuckerberg"); + } + + @Test + public void whenCollectBySet_thenGetSet() { + Set empNames = empList.stream() + .map(Employee::getName) + .collect(Collectors.toSet()); + + assertEquals(empNames.size(), 3); + } + + @Test + public void whenToVectorCollection_thenGetVector() { + Vector empNames = empList.stream() + .map(Employee::getName) + .collect(Collectors.toCollection(Vector::new)); + + assertEquals(empNames.size(), 3); + } + + @Test + public void whenApplySummarizing_thenGetBasicStats() { + DoubleSummaryStatistics stats = empList.stream() + .collect(Collectors.summarizingDouble(Employee::getSalary)); + + assertEquals(stats.getCount(), 3); + assertEquals(stats.getSum(), 600000.0, 0); + assertEquals(stats.getMin(), 100000.0, 0); + assertEquals(stats.getMax(), 300000.0, 0); + assertEquals(stats.getAverage(), 200000.0, 0); + } + + @Test + public void whenApplySummaryStatistics_thenGetBasicStats() { + DoubleSummaryStatistics stats = empList.stream() + .mapToDouble(Employee::getSalary) + .summaryStatistics(); + + assertEquals(stats.getCount(), 3); + assertEquals(stats.getSum(), 600000.0, 0); + assertEquals(stats.getMin(), 100000.0, 0); + assertEquals(stats.getMax(), 300000.0, 0); + assertEquals(stats.getAverage(), 200000.0, 0); + } + + @Test + public void whenStreamPartition_thenGetMap() { + List intList = Arrays.asList(2, 4, 5, 6, 8); + Map> isEven = intList.stream().collect( + Collectors.partitioningBy(i -> i % 2 == 0)); + + assertEquals(isEven.get(true).size(), 4); + assertEquals(isEven.get(false).size(), 1); + } + + @Test + public void whenStreamGroupingBy_thenGetMap() { + Map> groupByAlphabet = empList.stream().collect( + Collectors.groupingBy(e -> new Character(e.getName().charAt(0)))); + + assertEquals(groupByAlphabet.get('B').get(0).getName(), "Bill Gates"); + assertEquals(groupByAlphabet.get('J').get(0).getName(), "Jeff Bezos"); + assertEquals(groupByAlphabet.get('M').get(0).getName(), "Mark Zuckerberg"); + } + + @Test + public void whenStreamMapping_thenGetMap() { + Map> idGroupedByAlphabet = empList.stream().collect( + Collectors.groupingBy(e -> new Character(e.getName().charAt(0)), + Collectors.mapping(Employee::getId, Collectors.toList()))); + + assertEquals(idGroupedByAlphabet.get('B').get(0), new Integer(2)); + assertEquals(idGroupedByAlphabet.get('J').get(0), new Integer(1)); + assertEquals(idGroupedByAlphabet.get('M').get(0), new Integer(3)); + } + + @Test + public void whenStreamReducing_thenGetValue() { + Double percentage = 10.0; + Double salIncrOverhead = empList.stream().collect(Collectors.reducing( + 0.0, e -> e.getSalary() * percentage / 100, (s1, s2) -> s1 + s2)); + + assertEquals(salIncrOverhead, 60000.0, 0); + } + + @Test + public void whenStreamGroupingAndReducing_thenGetMap() { + Comparator byNameLength = Comparator.comparing(Employee::getName); + + Map> longestNameByAlphabet = empList.stream().collect( + Collectors.groupingBy(e -> new Character(e.getName().charAt(0)), + Collectors.reducing(BinaryOperator.maxBy(byNameLength)))); + + assertEquals(longestNameByAlphabet.get('B').get().getName(), "Bill Gates"); + assertEquals(longestNameByAlphabet.get('J').get().getName(), "Jeff Bezos"); + assertEquals(longestNameByAlphabet.get('M').get().getName(), "Mark Zuckerberg"); + } + + @Test + public void whenParallelStream_thenPerformOperationsInParallel() { + Employee[] arrayOfEmps = { + new Employee(1, "Jeff Bezos", 100000.0), + new Employee(2, "Bill Gates", 200000.0), + new Employee(3, "Mark Zuckerberg", 300000.0) + }; + + List empList = Arrays.asList(arrayOfEmps); + + empList.stream().parallel().forEach(e -> e.salaryIncrement(10.0)); + + assertThat(empList, contains( + hasProperty("salary", equalTo(110000.0)), + hasProperty("salary", equalTo(220000.0)), + hasProperty("salary", equalTo(330000.0)) + )); + } + + @Test + public void whenGenerateStream_thenGetInfiniteStream() { + Stream.generate(Math::random) + .limit(5) + .forEach(System.out::println); + } + + @Test + public void whenIterateStream_thenGetInfiniteStream() { + Stream evenNumStream = Stream.iterate(2, i -> i * 2); + + List collect = evenNumStream + .limit(5) + .collect(Collectors.toList()); + + assertEquals(collect, Arrays.asList(2, 4, 8, 16, 32)); + } + + @Test + public void whenStreamToFile_thenGetFile() throws IOException { + String[] words = { + "hello", + "refer", + "world", + "level" + }; + + try (PrintWriter pw = new PrintWriter( + Files.newBufferedWriter(Paths.get(fileName)))) { + Stream.of(words).forEach(pw::println); + } + } + + private List getPalindrome(Stream stream, int length) { + return stream.filter(s -> s.length() == length) + .filter(s -> s.compareToIgnoreCase( + new StringBuilder(s).reverse().toString()) == 0) + .collect(Collectors.toList()); + } + + @Test + public void whenFileToStream_thenGetStream() throws IOException { + whenStreamToFile_thenGetFile(); + + List str = getPalindrome(Files.lines(Paths.get(fileName)), 5); + assertThat(str, contains("refer", "level")); + } +} diff --git a/guest/core-java/src/test/resources/.keep b/guest/core-java/src/test/resources/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guest/deep-jsf/README.md b/guest/deep-jsf/README.md new file mode 100644 index 0000000000..b5f532535b --- /dev/null +++ b/guest/deep-jsf/README.md @@ -0,0 +1,15 @@ +## Building + +To build the module, use Maven's `package` goal: + +``` +mvn clean package +``` + +The `war` file will be available at `target/deep-jsf.war` + +## Running + +The `war` application is deployed to a Java EE 7 compliant application server, for example, to GlassFish 4 or later. + +The example then will be accessible at http://localhost:8080/deep-jsf/index.xhtml \ No newline at end of file diff --git a/guest/deep-jsf/pom.xml b/guest/deep-jsf/pom.xml new file mode 100644 index 0000000000..68801ba010 --- /dev/null +++ b/guest/deep-jsf/pom.xml @@ -0,0 +1,40 @@ + + 4.0.0 + + com.stackify + deep-jsf + 0.0.1-SNAPSHOT + war + + + false + + + + + + javax + javaee-api + 7.0 + provided + + + + + + deep-jsf + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + \ No newline at end of file diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java new file mode 100644 index 0000000000..7f5cf99781 --- /dev/null +++ b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java @@ -0,0 +1,14 @@ +package com.stackify.deepjsf; + +import javax.faces.bean.ManagedBean; +import javax.faces.bean.RequestScoped; + +@ManagedBean +@RequestScoped +public class GreetControllerBean { + + public String greet() { + return "greet"; + } + +} diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java new file mode 100644 index 0000000000..d4f6a6e815 --- /dev/null +++ b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java @@ -0,0 +1,47 @@ +package com.stackify.deepjsf; + +import javax.faces.bean.ManagedBean; +import javax.faces.bean.RequestScoped; +import javax.faces.component.UIComponent; +import javax.faces.component.UIViewRoot; +import javax.faces.component.visit.VisitContext; +import javax.faces.component.visit.VisitResult; +import javax.faces.event.PhaseEvent; +import javax.faces.event.PhaseId; +import javax.servlet.http.HttpServletRequest; + +@ManagedBean +@RequestScoped +public class PhaseListenerBean { + + public void beforeListener(PhaseEvent event) { + if (!event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) { + return; + } + UIViewRoot root = event.getFacesContext().getViewRoot(); + + boolean showNewFeature = showNewFeatureForIp(event); + + processComponentTree(root, event, showNewFeature); + } + + private boolean showNewFeatureForIp(PhaseEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getFacesContext() + .getExternalContext().getRequest(); + String ip = request.getRemoteAddr(); + return !ip.startsWith("127.0"); + } + + private void processComponentTree(UIComponent component, PhaseEvent event, boolean show) { + component.visitTree(VisitContext.createVisitContext(event.getFacesContext()), + (context, target) -> { + if (target.getId() != null + && target.getId().startsWith("new-feature-") + && !show) { + target.setRendered(false); + } + return VisitResult.ACCEPT; + }); + } + +} diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java new file mode 100644 index 0000000000..f6c94e87b8 --- /dev/null +++ b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java @@ -0,0 +1,48 @@ +package com.stackify.deepjsf; + +import javax.faces.bean.ManagedBean; +import javax.faces.bean.SessionScoped; +import javax.faces.event.ValueChangeEvent; + +@ManagedBean +@SessionScoped +public class UserBean { + + private String name = ""; + + private String lastName = ""; + + private String proposedLogin = ""; + + public void nameChanged(ValueChangeEvent event) { + this.proposedLogin = event.getNewValue() + "-" + lastName; + } + + public void lastNameChanged(ValueChangeEvent event) { + this.proposedLogin = name + "-" + event.getNewValue(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getProposedLogin() { + return proposedLogin; + } + + public void setProposedLogin(String proposedLogin) { + this.proposedLogin = proposedLogin; + } +} diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java new file mode 100644 index 0000000000..c2a46a019a --- /dev/null +++ b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java @@ -0,0 +1,14 @@ +package com.stackify.deepjsf; + +import javax.faces.bean.ManagedBean; +import javax.faces.bean.RequestScoped; + +@ManagedBean +@RequestScoped +public class UserControllerBean { + + public String register() { + return "register-success"; + } + +} diff --git a/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml b/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000000..264e60065c --- /dev/null +++ b/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,15 @@ + + + + + /register.xhtml + + register-success + /hello.xhtml + + + + \ No newline at end of file diff --git a/guest/deep-jsf/src/main/webapp/greet.xhtml b/guest/deep-jsf/src/main/webapp/greet.xhtml new file mode 100644 index 0000000000..50c79c64e1 --- /dev/null +++ b/guest/deep-jsf/src/main/webapp/greet.xhtml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/guest/deep-jsf/src/main/webapp/hello.xhtml b/guest/deep-jsf/src/main/webapp/hello.xhtml new file mode 100644 index 0000000000..f9c3745dca --- /dev/null +++ b/guest/deep-jsf/src/main/webapp/hello.xhtml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/guest/deep-jsf/src/main/webapp/index.xhtml b/guest/deep-jsf/src/main/webapp/index.xhtml new file mode 100644 index 0000000000..de99b89815 --- /dev/null +++ b/guest/deep-jsf/src/main/webapp/index.xhtml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/guest/deep-jsf/src/main/webapp/register.xhtml b/guest/deep-jsf/src/main/webapp/register.xhtml new file mode 100644 index 0000000000..ba1b8e0233 --- /dev/null +++ b/guest/deep-jsf/src/main/webapp/register.xhtml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml index aec7f9228a..37c71e77af 100644 --- a/guest/junit5-example/pom.xml +++ b/guest/junit5-example/pom.xml @@ -41,7 +41,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml index 197f3df2b9..43f1d106f0 100644 --- a/guest/log4j2-example/pom.xml +++ b/guest/log4j2-example/pom.xml @@ -39,7 +39,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/guest/logback-example/pom.xml b/guest/logback-example/pom.xml index 9d88c94197..8ad406fc89 100644 --- a/guest/logback-example/pom.xml +++ b/guest/logback-example/pom.xml @@ -30,7 +30,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml index eada59c5a1..82361779e2 100644 --- a/guest/memory-leaks/pom.xml +++ b/guest/memory-leaks/pom.xml @@ -28,7 +28,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/guest/remote-debugging/README.md b/guest/remote-debugging/README.md new file mode 100644 index 0000000000..cc63e7fd59 --- /dev/null +++ b/guest/remote-debugging/README.md @@ -0,0 +1,16 @@ +## Building + +To build the module, use Maven's `package` goal: + +``` +mvn clean package +``` + +The `war` file will be available at `target/remote-debugging.war` + +## Running + +The `war` application is deployed to Apache Tomcat 8 or any other Java Web or Application server. +To deploy it to the Apache Tomcat 8 server, drop it in the `tomcat/webapps` directory. + +The service then will be accessible at http://localhost:8080/remote-debugging/hello?name=John \ No newline at end of file diff --git a/guest/remote-debugging/pom.xml b/guest/remote-debugging/pom.xml new file mode 100644 index 0000000000..8540347e40 --- /dev/null +++ b/guest/remote-debugging/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + com.stackify + java-remote-debugging + 0.0.1-SNAPSHOT + war + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + remote-debugging + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java b/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java new file mode 100644 index 0000000000..9d1a632638 --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java @@ -0,0 +1,12 @@ +package com.stackify.debug; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JavaRemoteDebuggingApplication { + + public static void main(String[] args) { + SpringApplication.run(JavaRemoteDebuggingApplication.class, args); + } +} diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java b/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java new file mode 100644 index 0000000000..b69e2b6c77 --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java @@ -0,0 +1,12 @@ +package com.stackify.debug.config; + +import com.stackify.debug.JavaRemoteDebuggingApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class WebInitializer extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(JavaRemoteDebuggingApplication.class); + } +} diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java b/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java new file mode 100644 index 0000000000..8c614a36ec --- /dev/null +++ b/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java @@ -0,0 +1,16 @@ +package com.stackify.debug.rest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController("/hello") +public class HelloController { + + @GetMapping + public String hello(@RequestParam("name") String name) { + String message = "Hello, " + name; + return message; + } + +} diff --git a/guest/spring-boot-app/pom.xml b/guest/spring-boot-app/pom.xml index 88b8c229e3..ba57bbd5c5 100644 --- a/guest/spring-boot-app/pom.xml +++ b/guest/spring-boot-app/pom.xml @@ -38,7 +38,7 @@ maven-compiler-plugin - 3.6.1 + 3.7.0 1.8 1.8 diff --git a/guest/spring-security/README.md b/guest/spring-security/README.md new file mode 100644 index 0000000000..9e5cd64a04 --- /dev/null +++ b/guest/spring-security/README.md @@ -0,0 +1,17 @@ +## Building + +To build the module, use Maven's `package` goal: + +``` +mvn clean package +``` + +## Running + +To run the application, use Spring Boot's `run` goal: + +``` +mvn spring-boot:run +``` + +The application will be accessible at [http://localhost:8080/](http://localhost:8080/) diff --git a/guest/spring-security/pom.xml b/guest/spring-security/pom.xml new file mode 100644 index 0000000000..c41637bfc2 --- /dev/null +++ b/guest/spring-security/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + + com.stackify.guest + spring-security + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M6 + + + + spring-security + Spring Security Sample Project + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf + thymeleaf-spring5 + 3.0.8.RELEASE + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.h2database + h2 + runtime + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + + + \ No newline at end of file diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java new file mode 100644 index 0000000000..fbd0eee044 --- /dev/null +++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/Application.java @@ -0,0 +1,15 @@ +package com.stackify.guest.springsecurity; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = {"com.stackify.guest.springsecurity"}) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java new file mode 100644 index 0000000000..b8dfe9050d --- /dev/null +++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebMvcConfiguration.java @@ -0,0 +1,16 @@ +package com.stackify.guest.springsecurity.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfiguration implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/customLogin").setViewName("customLogin"); + registry.addViewController("/loginSuccess").setViewName("index"); + } + +} \ No newline at end of file diff --git a/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java new file mode 100644 index 0000000000..164808d5b3 --- /dev/null +++ b/guest/spring-security/src/main/java/com/stackify/guest/springsecurity/config/WebSecurityConfig.java @@ -0,0 +1,40 @@ +package com.stackify.guest.springsecurity.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.JdbcUserDetailsManager; + +import javax.sql.DataSource; + +@EnableWebSecurity +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Bean + public UserDetailsService jdbcUserDetailsService(DataSource dataSource) { + JdbcUserDetailsManager manager = new JdbcUserDetailsManager(); + manager.setDataSource(dataSource); + return manager; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/css/**").permitAll() + .anyRequest().authenticated() + .and().formLogin() + .loginPage("/customLogin") + .defaultSuccessUrl("/loginSuccess", true) + .permitAll(); + } + +} \ No newline at end of file diff --git a/guest/spring-security/src/main/resources/data.sql b/guest/spring-security/src/main/resources/data.sql new file mode 100644 index 0000000000..b3f7db9105 --- /dev/null +++ b/guest/spring-security/src/main/resources/data.sql @@ -0,0 +1,2 @@ +INSERT INTO users VALUES ('jill', '$2a$04$qUlqAEEYF1YvrpJMosodoewgL6aO.qgHytl2k5L7kdXEWnJsFdxvq', TRUE); +INSERT INTO authorities VALUES ('jill', 'USERS'); diff --git a/guest/spring-security/src/main/resources/schema.sql b/guest/spring-security/src/main/resources/schema.sql new file mode 100644 index 0000000000..3de1b9a29f --- /dev/null +++ b/guest/spring-security/src/main/resources/schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE users ( + username VARCHAR(256) PRIMARY KEY, + password VARCHAR(256), + enabled BOOLEAN +); + +CREATE TABLE authorities ( + username VARCHAR(256) REFERENCES users (username), + authority VARCHAR(256) +); diff --git a/guest/spring-security/src/main/resources/static/css/styles.css b/guest/spring-security/src/main/resources/static/css/styles.css new file mode 100644 index 0000000000..72bcc4934f --- /dev/null +++ b/guest/spring-security/src/main/resources/static/css/styles.css @@ -0,0 +1,3 @@ +.bad-login { + color: red; +} \ No newline at end of file diff --git a/guest/spring-security/src/main/resources/templates/customLogin.html b/guest/spring-security/src/main/resources/templates/customLogin.html new file mode 100644 index 0000000000..c689c78514 --- /dev/null +++ b/guest/spring-security/src/main/resources/templates/customLogin.html @@ -0,0 +1,21 @@ + + + + + + +
+
+ + + + +
+ + + +
Log out successful.
+ + + \ No newline at end of file diff --git a/guest/spring-security/src/main/resources/templates/index.html b/guest/spring-security/src/main/resources/templates/index.html new file mode 100644 index 0000000000..0769f9015f --- /dev/null +++ b/guest/spring-security/src/main/resources/templates/index.html @@ -0,0 +1,11 @@ + + +

Hello, !

+
+ + + + \ No newline at end of file diff --git a/guest/thread-pools/pom.xml b/guest/thread-pools/pom.xml index 72a10213c4..4588f3da4c 100644 --- a/guest/thread-pools/pom.xml +++ b/guest/thread-pools/pom.xml @@ -17,7 +17,7 @@ maven-compiler-plugin - 3.5.1 + 3.7.0 1.8 1.8 diff --git a/guest/tomcat-app/pom.xml b/guest/tomcat-app/pom.xml index e62c6f78d8..2a4bf8ef59 100644 --- a/guest/tomcat-app/pom.xml +++ b/guest/tomcat-app/pom.xml @@ -52,7 +52,7 @@ maven-compiler-plugin - 3.5.1 + 3.7.0 1.8 1.8 diff --git a/guest/webservices/rest-client/pom.xml b/guest/webservices/rest-client/pom.xml index af03ac1948..016fa54af7 100644 --- a/guest/webservices/rest-client/pom.xml +++ b/guest/webservices/rest-client/pom.xml @@ -8,7 +8,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/guest/webservices/rest-server/pom.xml b/guest/webservices/rest-server/pom.xml index 350e7eb9c9..69d370965f 100644 --- a/guest/webservices/rest-server/pom.xml +++ b/guest/webservices/rest-server/pom.xml @@ -33,7 +33,7 @@ maven-compiler-plugin - 3.5.1 + 3.7.0 1.8 1.8 diff --git a/hibernate5/README.md b/hibernate5/README.md index 9ef170a134..5143b097ce 100644 --- a/hibernate5/README.md +++ b/hibernate5/README.md @@ -1,3 +1,9 @@ ## Relevant articles: - [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) +- [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers) +- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time) +- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance) +- [A Guide to Multitenancy in Hibernate 5](http://www.baeldung.com/hibernate-5-multitenancy) +- [Introduction to Hibernate Spatial](http://www.baeldung.com/hibernate-spatial) +- [Hibernate Interceptors](http://www.baeldung.com/hibernate-interceptor) diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml index 8543d1dae3..31fe10ee97 100644 --- a/hibernate5/pom.xml +++ b/hibernate5/pom.xml @@ -16,13 +16,16 @@ UTF-8 - 3.6.0 - + 3.7.0 + 5.2.12.Final + 6.0.6 + 2.2.3 + org.hibernate hibernate-core - 5.2.12.Final + ${hibernate.version} junit @@ -38,7 +41,22 @@ com.h2database h2 - 1.4.194 + 1.4.196 + + + org.hibernate + hibernate-spatial + ${hibernate.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + ch.vorburger.mariaDB4j + mariaDB4j + ${mariaDB4j.version} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/App.java b/hibernate5/src/main/java/com/baeldung/hibernate/App.java deleted file mode 100644 index 26a40bb782..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/App.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.hibernate; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; - -import com.baeldung.hibernate.pojo.Supplier; - -/** - * Hello world! - * - */ -public class App { - public static void main(String[] args) { - try { - // NOTE: this is just for boostrap testing for multitenancy. - System.out.println("Checking the system."); - SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); - Session currentSession = sessionFactory.withOptions().tenantIdentifier("h2db1").openSession(); - Transaction transaction = currentSession.getTransaction(); - transaction.begin(); - currentSession.createCriteria(Supplier.class).list().stream().forEach(System.out::println); - transaction.commit(); - - } catch (Exception e) { - e.printStackTrace(); - } - - } -} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java b/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java deleted file mode 100644 index b9ed2bd139..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.hibernate; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; -import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; - -public class ConfigurableMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { - - private final Map connectionProviderMap = - new HashMap<>(); - - - public ConfigurableMultiTenantConnectionProvider( - Map connectionProviderMap) { - this.connectionProviderMap.putAll( connectionProviderMap ); - } - @Override - protected ConnectionProvider getAnyConnectionProvider() { - System.out.println("Any"); - return connectionProviderMap.values().iterator().next(); - } - - @Override - protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { - System.out.println("Specific"); - return connectionProviderMap.get( tenantIdentifier ); - } - - @Override - public Connection getConnection(String tenantIdentifier) throws SQLException { - Connection connection = super.getConnection(tenantIdentifier); - // uncomment to see option 2 for SCHEMA strategy. - //connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'"); - return connection; - } - -} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java deleted file mode 100644 index 30f3c3cf53..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.baeldung.hibernate; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.MetadataSources; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.cfg.Configuration; -import org.hibernate.cfg.Environment; -import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; -import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; -import org.hibernate.service.ServiceRegistry; - -import com.baeldung.hibernate.pojo.Supplier; - -public class HibernateMultiTenantUtil { - private static SessionFactory sessionFactory; - private static Map connectionProviderMap = new HashMap<>(); - private static final String[] tenantDBNames = { "mydb1", "mydb2" }; - - public static SessionFactory getSessionFactory() throws UnsupportedTenancyException, IOException { - if (sessionFactory == null) { - // Configuration configuration = new Configuration().configure(); - ServiceRegistry serviceRegistry = configureServiceRegistry(); - sessionFactory = makeSessionFactory(serviceRegistry); - - } - return sessionFactory; - } - - private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { - MetadataSources metadataSources = new MetadataSources(serviceRegistry); - for (Class annotatedClasses : getAnnotatedClasses()) { - metadataSources.addAnnotatedClass(annotatedClasses); - } - - Metadata metadata = metadataSources.buildMetadata(); - return metadata.getSessionFactoryBuilder() - .build(); - - } - - private static Class[] getAnnotatedClasses() { - return new Class[] { Supplier.class }; - } - - private static ServiceRegistry configureServiceRegistry() throws UnsupportedTenancyException, IOException { - - // Properties properties = configuration.getProperties(); - Properties properties = getProperties(); - - connectionProviderMap = setUpConnectionProviders(properties, tenantDBNames); - properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, new ConfigurableMultiTenantConnectionProvider(connectionProviderMap)); - - return new StandardServiceRegistryBuilder().applySettings(properties) - .build(); - } - - private static Properties getProperties() throws IOException { - Properties properties = new Properties(); - URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource("hibernate-multitenancy.properties"); - FileInputStream inputStream = new FileInputStream(propertiesURL.getFile()); - properties.load(inputStream); - System.out.println("LOADED PROPERTIES FROM hibernate.properties"); - - return properties; - } - - private static Map setUpConnectionProviders(Properties properties, String[] tenantNames) throws UnsupportedTenancyException { - Map providerMap = new HashMap<>(); - for (String tenant : tenantNames) { - DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); - - String tenantStrategy = properties.getProperty("hibernate.multiTenancy"); - System.out.println("Strategy:" + tenantStrategy); - properties.put(Environment.URL, tenantUrl(properties.getProperty(Environment.URL), tenant, tenantStrategy)); - System.out.println("URL:" + properties.getProperty(Environment.URL)); - connectionProvider.configure(properties); - System.out.println("Tenant:" + tenant); - providerMap.put(tenant, connectionProvider); - - } - System.out.println("Added connections for:"); - providerMap.keySet() - .stream() - .forEach(System.out::println); - return providerMap; - } - - private static Object tenantUrl(String originalUrl, String tenant, String tenantStrategy) throws UnsupportedTenancyException { - if (tenantStrategy.toUpperCase() - .equals("DATABASE")) { - return originalUrl.replace(DEFAULT_DB_NAME, tenant); - } else if (tenantStrategy.toUpperCase() - .equals("SCHEMA")) { - return originalUrl + String.format(SCHEMA_TOKEN, tenant); - } else { - throw new UnsupportedTenancyException("Not yet supported"); - } - } - - public static final String SCHEMA_TOKEN = ";INIT=CREATE SCHEMA IF NOT EXISTS %1$s\\;SET SCHEMA %1$s"; - public static final String DEFAULT_DB_NAME = "mydb1"; - -} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java index 0282673218..130edec8cc 100644 --- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java +++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java @@ -2,8 +2,30 @@ package com.baeldung.hibernate; import com.baeldung.hibernate.pojo.Employee; import com.baeldung.hibernate.pojo.EntityDescription; +import com.baeldung.hibernate.pojo.OrderEntry; +import com.baeldung.hibernate.pojo.OrderEntryIdClass; +import com.baeldung.hibernate.pojo.OrderEntryPK; +import com.baeldung.hibernate.pojo.PointEntity; +import com.baeldung.hibernate.pojo.PolygonEntity; +import com.baeldung.hibernate.pojo.Product; import com.baeldung.hibernate.pojo.Phone; import com.baeldung.hibernate.pojo.TemporalValues; +import com.baeldung.hibernate.pojo.Course; +import com.baeldung.hibernate.pojo.Student; +import com.baeldung.hibernate.pojo.User; +import com.baeldung.hibernate.pojo.UserProfile; +import com.baeldung.hibernate.pojo.inheritance.Animal; +import com.baeldung.hibernate.pojo.inheritance.Bag; +import com.baeldung.hibernate.pojo.inheritance.Book; +import com.baeldung.hibernate.pojo.inheritance.Car; +import com.baeldung.hibernate.pojo.inheritance.MyEmployee; +import com.baeldung.hibernate.pojo.inheritance.MyProduct; +import com.baeldung.hibernate.pojo.inheritance.Pen; +import com.baeldung.hibernate.pojo.inheritance.Person; +import com.baeldung.hibernate.pojo.inheritance.Pet; +import com.baeldung.hibernate.pojo.inheritance.Vehicle; + +import org.apache.commons.lang3.StringUtils; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; @@ -17,8 +39,14 @@ import java.util.Properties; public class HibernateUtil { private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; if (sessionFactory == null) { ServiceRegistry serviceRegistry = configureServiceRegistry(); sessionFactory = makeSessionFactory(serviceRegistry); @@ -33,6 +61,27 @@ public class HibernateUtil { metadataSources.addAnnotatedClass(Phone.class); metadataSources.addAnnotatedClass(EntityDescription.class); metadataSources.addAnnotatedClass(TemporalValues.class); + metadataSources.addAnnotatedClass(User.class); + metadataSources.addAnnotatedClass(Student.class); + metadataSources.addAnnotatedClass(Course.class); + metadataSources.addAnnotatedClass(Product.class); + metadataSources.addAnnotatedClass(OrderEntryPK.class); + metadataSources.addAnnotatedClass(OrderEntry.class); + metadataSources.addAnnotatedClass(OrderEntryIdClass.class); + metadataSources.addAnnotatedClass(UserProfile.class); + metadataSources.addAnnotatedClass(Book.class); + metadataSources.addAnnotatedClass(MyEmployee.class); + metadataSources.addAnnotatedClass(MyProduct.class); + metadataSources.addAnnotatedClass(Pen.class); + metadataSources.addAnnotatedClass(Person.class); + metadataSources.addAnnotatedClass(Animal.class); + metadataSources.addAnnotatedClass(Pet.class); + metadataSources.addAnnotatedClass(Vehicle.class); + metadataSources.addAnnotatedClass(Car.class); + metadataSources.addAnnotatedClass(Bag.class); + metadataSources.addAnnotatedClass(PointEntity.class); + metadataSources.addAnnotatedClass(PolygonEntity.class); + metadataSources.addAnnotatedClass(com.baeldung.hibernate.pojo.Person.class); Metadata metadata = metadataSources.buildMetadata(); return metadata.getSessionFactoryBuilder() @@ -49,12 +98,11 @@ public class HibernateUtil { private static Properties getProperties() throws IOException { Properties properties = new Properties(); URL propertiesURL = Thread.currentThread() - .getContextClassLoader() - .getResource("hibernate.properties"); + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { properties.load(inputStream); } return properties; } - } \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java b/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java new file mode 100644 index 0000000000..506e674984 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/converters/PersonNameConverter.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.converters; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + +import com.baeldung.hibernate.pojo.PersonName; + +@Converter +public class PersonNameConverter implements AttributeConverter { + + private static final String SEPARATOR = ", "; + + @Override + public String convertToDatabaseColumn(PersonName personName) { + if (personName == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + if (personName.getSurname() != null && !personName.getSurname() + .isEmpty()) { + sb.append(personName.getSurname()); + sb.append(SEPARATOR); + } + + if (personName.getName() != null && !personName.getName() + .isEmpty()) { + sb.append(personName.getName()); + } + + return sb.toString(); + } + + @Override + public PersonName convertToEntityAttribute(String dbPersonName) { + if (dbPersonName == null || dbPersonName.isEmpty()) { + return null; + } + + String[] pieces = dbPersonName.split(SEPARATOR); + + if (pieces == null || pieces.length == 0) { + return null; + } + + PersonName personName = new PersonName(); + String firstPiece = !pieces[0].isEmpty() ? pieces[0] : null; + if (dbPersonName.contains(SEPARATOR)) { + personName.setSurname(firstPiece); + + if (pieces.length >= 2 && pieces[1] != null && !pieces[1].isEmpty()) { + personName.setName(pieces[1]); + } + } else { + personName.setName(firstPiece); + } + + return personName; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java deleted file mode 100644 index 85c96d8b10..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.hibernate.dao; - -import java.util.List; - -public interface GenericDao { - - void save (T entity); - void delete (T Entity); - T findByName(String name); - List findAll(); - void populate(); -} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java deleted file mode 100644 index c0397ee5bb..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.baeldung.hibernate.dao; - -import java.util.ArrayList; -import java.util.List; - -import org.hibernate.Criteria; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import org.hibernate.criterion.Expression; - -import com.baeldung.hibernate.pojo.Supplier; - -public class SupplierDao implements GenericDao{ - private SessionFactory sessionFactory; - private String tenant; - - public SupplierDao(SessionFactory sessionFactory, String tenant) { - this.sessionFactory = sessionFactory; - this.tenant = tenant; - populate(); - } - - @Override - public void save(Supplier entity) { - Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); - session.save(entity); - } - - @Override - public void delete(Supplier supplier) { - Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); - session.delete(supplier); - } - - @Override - public Supplier findByName(String name) { - Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); - List fetchedSuppliers = session.createCriteria(Supplier.class).add(Expression.eq("name", name)).list(); - if (fetchedSuppliers.size()>0) { - return fetchedSuppliers.get(0); - }else { - return null; - } - } - - @Override - public List findAll() { - Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); - return session.createCriteria(Supplier.class).list(); - } - - @Override - public void populate() { - System.out.println("Init DB1"); - Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); - Transaction transaction = session.getTransaction(); - - transaction.begin(); - session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); - session - .createSQLQuery( - "create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))") - .executeUpdate(); - Supplier genertedSupplier = generateEntityForTenant(tenant); - System.out.println("Inserting Supplier"+genertedSupplier); - save (genertedSupplier); - - } - - private Supplier generateEntityForTenant(String forTenant) { - if (forTenant.equals("mydb1")) { - return new Supplier ("John","USA"); - } - return new Supplier ("Miller","UK"); - } - - - -} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java new file mode 100644 index 0000000000..1d60ccb6c0 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java @@ -0,0 +1,32 @@ +package com.baeldung.hibernate.interceptors; + +import java.io.Serializable; +import java.util.Date; + +import org.hibernate.EmptyInterceptor; +import org.hibernate.type.Type; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hibernate.interceptors.entity.User; + +public class CustomInterceptor extends EmptyInterceptor { + private static final Logger logger = LoggerFactory.getLogger(CustomInterceptor.class); + + @Override + public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + if (entity instanceof User) { + logger.info(((User) entity).toString()); + } + return super.onSave(entity, id, state, propertyNames, types); + } + + @Override + public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object [] previousState, String[] propertyNames, Type[] types) { + if (entity instanceof User) { + ((User) entity).setLastModified(new Date()); + logger.info(((User) entity).toString()); + } + return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types); + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java new file mode 100644 index 0000000000..6736b39b64 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java @@ -0,0 +1,122 @@ +package com.baeldung.hibernate.interceptors; + +import java.io.Serializable; +import java.util.Iterator; + +import org.hibernate.CallbackException; +import org.hibernate.EntityMode; +import org.hibernate.Interceptor; +import org.hibernate.Transaction; +import org.hibernate.type.Type; + +public class CustomInterceptorImpl implements Interceptor, Serializable { + + @Override + public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException { + // TODO Auto-generated method stub + return false; + } + + @Override + public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public void onCollectionRemove(Object collection, Serializable key) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public void preFlush(Iterator entities) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public void postFlush(Iterator entities) throws CallbackException { + // TODO Auto-generated method stub + + } + + @Override + public Boolean isTransient(Object entity) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getEntityName(Object object) throws CallbackException { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getEntity(String entityName, Serializable id) throws CallbackException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void afterTransactionBegin(Transaction tx) { + // TODO Auto-generated method stub + + } + + @Override + public void beforeTransactionCompletion(Transaction tx) { + // TODO Auto-generated method stub + + } + + @Override + public void afterTransactionCompletion(Transaction tx) { + // TODO Auto-generated method stub + + } + + @Override + public String onPrepareStatement(String sql) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java new file mode 100644 index 0000000000..11dce698ca --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java @@ -0,0 +1,79 @@ +package com.baeldung.hibernate.interceptors; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.Interceptor; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.SessionFactoryBuilder; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.interceptors.entity.User; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = getSessionFactoryBuilder(serviceRegistry).build(); + } + return sessionFactory; + } + + public static SessionFactory getSessionFactoryWithInterceptor(String propertyFileName, Interceptor interceptor) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = getSessionFactoryBuilder(serviceRegistry).applyInterceptor(interceptor) + .build(); + } + return sessionFactory; + } + + public static Session getSessionWithInterceptor(Interceptor interceptor) throws IOException { + return getSessionFactory().withOptions() + .interceptor(interceptor) + .openSession(); + } + + private static SessionFactoryBuilder getSessionFactoryBuilder(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addPackage("com.baeldung.hibernate.interceptors"); + metadataSources.addAnnotatedClass(User.class); + + Metadata metadata = metadataSources.buildMetadata(); + return metadata.getSessionFactoryBuilder(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate-interceptors.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java new file mode 100644 index 0000000000..2b1dbe702b --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java @@ -0,0 +1,64 @@ +package com.baeldung.hibernate.interceptors.entity; + +import java.util.Date; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +@Entity(name = "hbi_user") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + private String name; + private String about; + @Basic + @Temporal(TemporalType.DATE) + private Date lastModified; + + public User() { + } + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getLastModified() { + return lastModified; + } + + public void setLastModified(Date lastModified) { + this.lastModified = lastModified; + } + + public long getId() { + return id; + } + + public String getAbout() { + return about; + } + + public void setAbout(String about) { + this.about = about; + } + + @Override + public String toString() { + return String.format("ID: %d\nName: %s\nLast Modified: %s\nAbout: %s\n", getId(), getName(), getLastModified(), getAbout()); + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java new file mode 100644 index 0000000000..dc5242ee7c --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/lob/HibernateSessionUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.lob; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import com.baeldung.hibernate.lob.model.User; + +public class HibernateSessionUtil { + + private static SessionFactory sessionFactory; + private static String PROPERTY_FILE_NAME; + + public static SessionFactory getSessionFactory() throws IOException { + return getSessionFactory(null); + } + + public static SessionFactory getSessionFactory(String propertyFileName) throws IOException { + PROPERTY_FILE_NAME = propertyFileName; + if (sessionFactory == null) { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + sessionFactory = makeSessionFactory(serviceRegistry); + } + return sessionFactory; + } + + private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) { + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(User.class); + + Metadata metadata = metadataSources.buildMetadata(); + return metadata.getSessionFactoryBuilder() + .build(); + + } + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties")); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java b/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java new file mode 100644 index 0000000000..21f725b388 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/lob/model/User.java @@ -0,0 +1,46 @@ +package com.baeldung.hibernate.lob.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.Table; + +@Entity +@Table(name="user") +public class User { + + @Id + private String id; + + @Column(name = "name", columnDefinition="VARCHAR(128)") + private String name; + + @Lob + @Column(name = "photo", columnDefinition="BLOB") + private byte[] photo; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public byte[] getPhoto() { + return photo; + } + + public void setPhoto(byte[] photo) { + this.photo = photo; + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java new file mode 100644 index 0000000000..97760acd3b --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Course.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo; + +import java.util.UUID; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Course { + + @Id + @GeneratedValue + private UUID courseId; + + public UUID getCourseId() { + return courseId; + } + + public void setCourseId(UUID courseId) { + this.courseId = courseId; + } + + + + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java new file mode 100644 index 0000000000..6dd106b88e --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Department.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.TableGenerator; + +@Entity +public class Department { + @Id + @GeneratedValue(strategy = GenerationType.TABLE, generator="table-generator") + @TableGenerator (name="table-generator", table="dep_ids", pkColumnName="seq_id", valueColumnName="seq_value") + private long depId; + + public long getDepId() { + return depId; + } + + public void setDepId(long depId) { + this.depId = depId; + } + + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java new file mode 100644 index 0000000000..a28b7c8dbe --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntry.java @@ -0,0 +1,20 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; + +@Entity +public class OrderEntry { + + @EmbeddedId + private OrderEntryPK entryId; + + public OrderEntryPK getEntryId() { + return entryId; + } + + public void setEntryId(OrderEntryPK entryId) { + this.entryId = entryId; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java new file mode 100644 index 0000000000..18926640af --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryIdClass.java @@ -0,0 +1,31 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.IdClass; + +@Entity +@IdClass(OrderEntryPK.class) +public class OrderEntryIdClass { + @Id + private long orderId; + @Id + private long productId; + + public long getOrderId() { + return orderId; + } + + public void setOrderId(long orderId) { + this.orderId = orderId; + } + + public long getProductId() { + return productId; + } + + public void setProductId(long productId) { + this.productId = productId; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java new file mode 100644 index 0000000000..637d590629 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/OrderEntryPK.java @@ -0,0 +1,46 @@ +package com.baeldung.hibernate.pojo; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +@Embeddable +public class OrderEntryPK implements Serializable { + + private long orderId; + private long productId; + + public long getOrderId() { + return orderId; + } + + public void setOrderId(long orderId) { + this.orderId = orderId; + } + + public long getProductId() { + return productId; + } + + public void setProductId(long productId) { + this.productId = productId; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OrderEntryPK pk = (OrderEntryPK) o; + return Objects.equals(orderId, pk.orderId) && Objects.equals(productId, pk.productId); + } + + @Override + public int hashCode() { + return Objects.hash(orderId, productId); + } +} \ No newline at end of file diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java new file mode 100644 index 0000000000..390a5954ed --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Person.java @@ -0,0 +1,32 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import com.baeldung.hibernate.converters.PersonNameConverter; + +@Entity(name = "PersonTable") +public class Person { + + @Id + @GeneratedValue + private Long id; + + @Convert(converter = PersonNameConverter.class) + private PersonName personName; + + public PersonName getPersonName() { + return personName; + } + + public void setPersonName(PersonName personName) { + this.personName = personName; + } + + public Long getId() { + return id; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PersonName.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PersonName.java new file mode 100644 index 0000000000..335fe73f75 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PersonName.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.pojo; + +import java.io.Serializable; + +public class PersonName implements Serializable { + + private static final long serialVersionUID = 7883094644631050150L; + + private String name; + + private String surname; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java new file mode 100644 index 0000000000..223f5dcbde --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PointEntity.java @@ -0,0 +1,41 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Point; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PointEntity { + + @Id + @GeneratedValue + private Long id; + + private Point point; + + public PointEntity() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Point getPoint() { + return point; + } + + public void setPoint(Point point) { + this.point = point; + } + + @Override + public String toString() { + return "PointEntity{" + "id=" + id + ", point=" + point + '}'; + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java new file mode 100644 index 0000000000..69208c8cd4 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/PolygonEntity.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo; + +import com.vividsolutions.jts.geom.Polygon; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class PolygonEntity { + + @Id + @GeneratedValue + private Long id; + + private Polygon polygon; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Polygon getPolygon() { + return polygon; + } + + public void setPolygon(Polygon polygon) { + this.polygon = polygon; + } + + @Override + public String toString() { + return "PolygonEntity{" + "id=" + id + ", polygon=" + polygon + '}'; + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java new file mode 100644 index 0000000000..efd6b63dc0 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Product.java @@ -0,0 +1,26 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; + +@Entity +public class Product { + + @Id + @GeneratedValue(generator = "prod-generator") + @GenericGenerator(name = "prod-generator", parameters = @Parameter(name = "prefix", value = "prod"), strategy = "com.baeldung.hibernate.pojo.generator.MyGenerator") + private String prodId; + + public String getProdId() { + return prodId; + } + + public void setProdId(String prodId) { + this.prodId = prodId; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java new file mode 100644 index 0000000000..a6dec4a30d --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Student.java @@ -0,0 +1,23 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + @GeneratedValue (strategy = GenerationType.SEQUENCE) + private long studentId; + + public long getStudentId() { + return studentId; + } + + public void setStudent_id(long studentId) { + this.studentId = studentId; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java deleted file mode 100644 index d0187bba47..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.baeldung.hibernate.pojo; -// Generated Feb 9, 2017 11:31:36 AM by Hibernate Tools 5.1.0.Final - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.junit.runners.Suite.SuiteClasses; - - -/** - * Suppliers generated by hbm2java - */ -@Entity(name = "Supplier") -@Table(name ="Supplier") -public class Supplier implements java.io.Serializable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; - private String name; - private String country; - - public Supplier() { - } - - public Supplier(String name, String country) { - this.name = name; - this.country = country; - } - - public Integer getId() { - return this.id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getCountry() { - return this.country; - } - - public void setCountry(String country) { - this.country = country; - } - - @Override - public String toString() { - return new StringBuffer().append("[").append(id).append(",").append(name).append(",").append(country).append("]").toString(); - } - - @Override - public boolean equals(Object obj) { - return name.equals(((Supplier) obj).getName()); - } -} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java new file mode 100644 index 0000000000..90203d29ec --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/User.java @@ -0,0 +1,24 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; + +@Entity +public class User { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence-generator") + @SequenceGenerator(name = "sequence-generator", sequenceName = "user_sequence", initialValue = 4) + private long userId; + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java new file mode 100644 index 0000000000..ac870c2818 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/UserProfile.java @@ -0,0 +1,34 @@ +package com.baeldung.hibernate.pojo; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.MapsId; +import javax.persistence.OneToOne; + +@Entity +public class UserProfile { + + @Id + private long profileId; + + @OneToOne + @MapsId + private User user; + + public long getProfileId() { + return profileId; + } + + public void setProfileId(long profileId) { + this.profileId = profileId; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java new file mode 100644 index 0000000000..17ffe9b7e1 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/generator/MyGenerator.java @@ -0,0 +1,41 @@ +package com.baeldung.hibernate.pojo.generator; + +import java.io.Serializable; +import java.util.Properties; +import java.util.stream.Stream; + +import org.hibernate.HibernateException; +import org.hibernate.MappingException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.id.Configurable; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; + +public class MyGenerator implements IdentifierGenerator, Configurable { + + private String prefix; + + @Override + public Serializable generate(SharedSessionContractImplementor session, Object obj) throws HibernateException { + + String query = String.format("select %s from %s", + session.getEntityPersister(obj.getClass().getName(), obj).getIdentifierPropertyName(), + obj.getClass().getSimpleName()); + + Stream ids = session.createQuery(query).stream(); + + Long max = ids.map(o -> o.replace(prefix + "-", "")) + .mapToLong(Long::parseLong) + .max() + .orElse(0L); + + return prefix + "-" + (max + 1); + } + + @Override + public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException { + prefix = properties.getProperty("prefix"); + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java new file mode 100644 index 0000000000..6fe7f915fc --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Animal.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +public class Animal { + + @Id + private long animalId; + + private String species; + + public Animal() {} + + public Animal(long animalId, String species) { + this.animalId = animalId; + this.species = species; + } + + public long getAnimalId() { + return animalId; + } + + public void setAnimalId(long animalId) { + this.animalId = animalId; + } + + public String getSpecies() { + return species; + } + + public void setSpecies(String species) { + this.species = species; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java new file mode 100644 index 0000000000..fa6e1b4bef --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Bag.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; + +import org.hibernate.annotations.Polymorphism; +import org.hibernate.annotations.PolymorphismType; + +@Entity +@Polymorphism(type = PolymorphismType.EXPLICIT) +public class Bag implements Item { + + @Id + private long bagId; + + private String type; + + public Bag(long bagId, String type) { + this.bagId = bagId; + this.type = type; + } + + public long getBagId() { + return bagId; + } + + public void setBagId(long bagId) { + this.bagId = bagId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java new file mode 100644 index 0000000000..36ca8dd77c --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Book.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("1") +public class Book extends MyProduct { + private String author; + + public Book() { + } + + public Book(long productId, String name, String author) { + super(productId, name); + this.author = author; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java new file mode 100644 index 0000000000..49d1f7749a --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Car.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; + +@Entity +public class Car extends Vehicle { + private String engine; + + public Car() { + } + + public Car(long vehicleId, String manufacturer, String engine) { + super(vehicleId, manufacturer); + this.engine = engine; + } + + public String getEngine() { + return engine; + } + + public void setEngine(String engine) { + this.engine = engine; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java new file mode 100644 index 0000000000..9656030736 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Item.java @@ -0,0 +1,5 @@ +package com.baeldung.hibernate.pojo.inheritance; + +public interface Item { + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java new file mode 100644 index 0000000000..9a6bce16cf --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyEmployee.java @@ -0,0 +1,22 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; + +@Entity +public class MyEmployee extends Person { + private String company; + + public MyEmployee(long personId, String name, String company) { + super(personId, name); + this.company = company; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java new file mode 100644 index 0000000000..13f04d8904 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/MyProduct.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.DiscriminatorColumn; +import javax.persistence.DiscriminatorType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +import org.hibernate.annotations.DiscriminatorFormula; + +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "product_type", discriminatorType = DiscriminatorType.INTEGER) +// @DiscriminatorFormula("case when author is not null then 1 else 2 end") +public class MyProduct { + @Id + private long productId; + + private String name; + + public MyProduct() { + } + + public MyProduct(long productId, String name) { + super(); + this.productId = productId; + this.name = name; + } + + public long getProductId() { + return productId; + } + + public void setProductId(long productId) { + this.productId = productId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java new file mode 100644 index 0000000000..32b77e52af --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pen.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("2") +public class Pen extends MyProduct { + private String color; + + public Pen() { + } + + public Pen(long productId, String name, String color) { + super(productId, name); + this.color = color; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java new file mode 100644 index 0000000000..99084b88af --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Person.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + +@MappedSuperclass +public class Person { + + @Id + private long personId; + + private String name; + + public Person() { + } + + public Person(long personId, String name) { + this.personId = personId; + this.name = name; + } + + public long getPersonId() { + return personId; + } + + public void setPersonId(long personId) { + this.personId = personId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java new file mode 100644 index 0000000000..870b3cd684 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Pet.java @@ -0,0 +1,27 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; + +@Entity +@PrimaryKeyJoinColumn(name = "petId") +public class Pet extends Animal { + private String name; + + public Pet() { + } + + public Pet(long animalId, String species, String name) { + super(animalId, species); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java new file mode 100644 index 0000000000..b2a920573e --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/inheritance/Vehicle.java @@ -0,0 +1,40 @@ +package com.baeldung.hibernate.pojo.inheritance; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; + +@Entity +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +public class Vehicle { + @Id + private long vehicleId; + + private String manufacturer; + + public Vehicle() { + } + + public Vehicle(long vehicleId, String manufacturer) { + this.vehicleId = vehicleId; + this.manufacturer = manufacturer; + } + + public long getVehicleId() { + return vehicleId; + } + + public void setVehicleId(long vehicleId) { + this.vehicleId = vehicleId; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java new file mode 100644 index 0000000000..10b5cbef4e --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/HibernateSpatialTest.java @@ -0,0 +1,144 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.pojo.PointEntity; +import com.baeldung.hibernate.pojo.PolygonEntity; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.Point; +import com.vividsolutions.jts.geom.Polygon; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; +import com.vividsolutions.jts.util.GeometricShapeFactory; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.persistence.Query; +import java.io.IOException; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; + +import static org.junit.Assert.assertTrue; + +public class HibernateSpatialTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-spatial.properties") + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void shouldConvertWktToGeometry() throws ParseException { + Geometry geometry = wktToGeometry("POINT (2 5)"); + assertEquals("Point", geometry.getGeometryType()); + assertTrue(geometry instanceof Point); + } + + @Test + public void shouldInsertAndSelectPoints() throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry("POINT (1 1)")); + + session.persist(entity); + PointEntity fromDb = session.find(PointEntity.class, entity.getId()); + assertEquals("POINT (1 1)", fromDb.getPoint().toString()); + } + + @Test + public void shouldSelectDisjointPoints() throws ParseException { + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Point point = (Point) wktToGeometry("POINT (3 4)"); + Query query = session.createQuery("select p from PointEntity p " + + "where disjoint(p.point, :point) = true", PointEntity.class); + query.setParameter("point", point); + assertEquals("POINT (1 2)", ((PointEntity) query.getResultList().get(0)).getPoint().toString()); + assertEquals("POINT (5 6)", ((PointEntity) query.getResultList().get(1)).getPoint().toString()); + } + + @Test + public void shouldSelectAllPointsWithinPolygon() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :area) = true", + PointEntity.class); + query.setParameter("area", wktToGeometry("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))")); + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)", "POINT (3 4)"); + } + + @Test + public void shouldSelectAllPointsWithinRadius() throws ParseException { + insertPoint("POINT (1 1)"); + insertPoint("POINT (1 2)"); + insertPoint("POINT (3 4)"); + insertPoint("POINT (5 6)"); + + Query query = session.createQuery("select p from PointEntity p where within(p.point, :circle) = true", + PointEntity.class); + query.setParameter("circle", createCircle(0.0, 0.0, 5)); + + assertThat(query.getResultList().stream().map(p -> ((PointEntity) p).getPoint().toString())) + .containsOnly("POINT (1 1)", "POINT (1 2)"); + } + + @Test + public void shouldSelectAdjacentPolygons() throws ParseException { + insertPolygon("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))"); + insertPolygon("POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + insertPolygon("POLYGON ((2 2, 3 1, 2 5, 4 3, 3 3, 2 2))"); + + Query query = session.createQuery("select p from PolygonEntity p where touches(p.polygon, :polygon) = true", + PolygonEntity.class); + query.setParameter("polygon", wktToGeometry("POLYGON ((5 5, 5 10, 10 10, 10 5, 5 5))")); + assertThat(query.getResultList().stream().map(p -> ((PolygonEntity) p).getPolygon().toString())) + .containsOnly("POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))", "POLYGON ((3 0, 3 5, 8 5, 8 0, 3 0))"); + } + + private void insertPoint(String point) throws ParseException { + PointEntity entity = new PointEntity(); + entity.setPoint((Point) wktToGeometry(point)); + session.persist(entity); + } + + private void insertPolygon(String polygon) throws ParseException { + PolygonEntity entity = new PolygonEntity(); + entity.setPolygon((Polygon) wktToGeometry(polygon)); + session.persist(entity); + } + + private Geometry wktToGeometry(String wellKnownText) throws ParseException { + WKTReader fromText = new WKTReader(); + Geometry geom = null; + geom = fromText.read(wellKnownText); + return geom; + } + + private static Geometry createCircle(double x, double y, double radius) { + GeometricShapeFactory shapeFactory = new GeometricShapeFactory(); + shapeFactory.setNumPoints(32); + shapeFactory.setCentre(new Coordinate(x, y)); + shapeFactory.setSize(radius * 2); + return shapeFactory.createCircle(); + } +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java new file mode 100644 index 0000000000..6b54dc80a8 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/IdentifiersIntegrationTest.java @@ -0,0 +1,100 @@ +package com.baeldung.hibernate; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.hibernate.Transaction; +import java.io.IOException; +import org.hibernate.Session; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.baeldung.hibernate.pojo.Product; +import com.baeldung.hibernate.pojo.Course; +import com.baeldung.hibernate.pojo.OrderEntry; +import com.baeldung.hibernate.pojo.OrderEntryIdClass; +import com.baeldung.hibernate.pojo.OrderEntryPK; +import com.baeldung.hibernate.pojo.Student; +import com.baeldung.hibernate.pojo.User; +import com.baeldung.hibernate.pojo.UserProfile; + +public class IdentifiersIntegrationTest { + private Session session; + + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void whenSaveSimpleIdEntities_thenOk() { + Student student = new Student(); + session.save(student); + User user = new User(); + session.save(user); + + assertThat(student.getStudentId()).isEqualTo(1L); + assertThat(user.getUserId()).isEqualTo(4L); + + Course course = new Course(); + session.save(course); + + } + + @Test + public void whenSaveCustomGeneratedId_thenOk() { + Product product = new Product(); + session.save(product); + Product product2 = new Product(); + session.save(product2); + + assertThat(product2.getProdId()).isEqualTo("prod-2"); + } + + @Test + public void whenSaveCompositeIdEntity_thenOk() { + OrderEntryPK entryPK = new OrderEntryPK(); + entryPK.setOrderId(1L); + entryPK.setProductId(30L); + + OrderEntry entry = new OrderEntry(); + entry.setEntryId(entryPK); + session.save(entry); + + assertThat(entry.getEntryId() + .getOrderId()).isEqualTo(1L); + } + + @Test + public void whenSaveIdClassEntity_thenOk() { + OrderEntryIdClass entry = new OrderEntryIdClass(); + entry.setOrderId(1L); + entry.setProductId(30L); + session.save(entry); + + assertThat(entry.getOrderId()).isEqualTo(1L); + } + + @Test + public void whenSaveDerivedIdEntity_thenOk() { + User user = new User(); + session.save(user); + + UserProfile profile = new UserProfile(); + profile.setUser(user); + session.save(profile); + + assertThat(profile.getProfileId()).isEqualTo(user.getUserId()); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java new file mode 100644 index 0000000000..0f35dbb8af --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/InheritanceMappingIntegrationTest.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.pojo.inheritance.Bag; +import com.baeldung.hibernate.pojo.inheritance.Book; +import com.baeldung.hibernate.pojo.inheritance.Car; +import com.baeldung.hibernate.pojo.inheritance.MyEmployee; +import com.baeldung.hibernate.pojo.inheritance.Pen; +import com.baeldung.hibernate.pojo.inheritance.Pet; + +public class InheritanceMappingIntegrationTest { + private Session session; + + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenSubclasses_whenQuerySingleTableSuperclass_thenOk() { + Book book = new Book(1, "1984", "George Orwell"); + session.save(book); + Pen pen = new Pen(2, "my pen", "blue"); + session.save(pen); + + assertThat(session.createQuery("from MyProduct") + .getResultList() + .size()).isEqualTo(2); + } + + @Test + public void givenSubclasses_whenQueryMappedSuperclass_thenOk() { + MyEmployee emp = new MyEmployee(1, "john", "baeldung"); + session.save(emp); + + assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Person") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryJoinedTableSuperclass_thenOk() { + Pet pet = new Pet(1, "dog", "lassie"); + session.save(pet); + + assertThat(session.createQuery("from Animal") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryTablePerClassSuperclass_thenOk() { + Car car = new Car(1, "audi", "xyz"); + session.save(car); + + assertThat(session.createQuery("from Vehicle") + .getResultList() + .size()).isEqualTo(1); + } + + @Test + public void givenSubclasses_whenQueryNonMappedInterface_thenOk() { + Bag bag = new Bag(1, "large"); + session.save(bag); + + assertThat(session.createQuery("from com.baeldung.hibernate.pojo.inheritance.Item") + .getResultList() + .size()).isEqualTo(0); + } +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java deleted file mode 100644 index 82567690ac..0000000000 --- a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.hibernate; - -import java.io.IOException; - -import org.hibernate.SessionFactory; -import org.junit.Test; - -import com.baeldung.hibernate.dao.SupplierDao; -import com.baeldung.hibernate.pojo.Supplier; - -import static org.junit.Assert.assertNull;; - -public class MultiTenantDaoHibernateIntegrationTest { - @Test - public void givenDBMode_whenFetchingSuppliersByName_thenChecking() throws UnsupportedTenancyException, IOException { - SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); - - SupplierDao myDb1Dao = new SupplierDao(sessionFactory, "mydb1"); - Supplier db1SupplierName = myDb1Dao.findByName("John"); - - // finding the same supplier name in another tenant - // and we should not be able to find in there and both dbs are different. - SupplierDao myDb2Dao = new SupplierDao(sessionFactory, "mydb2"); - Supplier db2SupplierName = myDb2Dao.findByName(db1SupplierName.getName()); - - assertNull(db2SupplierName); - - } - -} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterTest.java new file mode 100644 index 0000000000..204d8775ff --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/converter/PersonNameConverterTest.java @@ -0,0 +1,200 @@ +package com.baeldung.hibernate.converter; + +import java.io.IOException; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Person; +import com.baeldung.hibernate.pojo.PersonName; + +import static org.junit.Assert.assertEquals; + +public class PersonNameConverterTest { + + private Session session; + private Transaction transaction; + + @Before + public void setUp() throws IOException { + session = HibernateUtil.getSessionFactory() + .openSession(); + transaction = session.beginTransaction(); + + session.createNativeQuery("delete from personTable") + .executeUpdate(); + + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenPersonName_WhenSaving_ThenNameAndSurnameConcat() { + final String name = "name"; + final String surname = "surname"; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals(surname + ", " + name, dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameNull_WhenSaving_ThenNullStored() { + final String name = null; + final String surname = null; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName(), null); + } + + @Test + public void givenPersonNameWithoutName_WhenSaving_ThenNotNameStored() { + final String name = null; + final String surname = "surname"; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("surname, ", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameWithoutSurName_WhenSaving_ThenNotSurNameStored() { + final String name = "name"; + final String surname = null; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("name", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName() + .getName(), name); + assertEquals(dbPerson.getPersonName() + .getSurname(), surname); + } + + @Test + public void givenPersonNameEmptyFields_WhenSaving_ThenFielsNotStored() { + final String name = ""; + final String surname = ""; + + PersonName personName = new PersonName(); + personName.setName(name); + personName.setSurname(surname); + + Person person = new Person(); + person.setPersonName(personName); + + Long id = (Long) session.save(person); + + session.flush(); + session.clear(); + + String dbPersonName = (String) session.createNativeQuery("select p.personName from PersonTable p where p.id = :id") + .setParameter("id", id) + .getSingleResult(); + + assertEquals("", dbPersonName); + + Person dbPerson = session.createNativeQuery("select * from PersonTable p where p.id = :id", Person.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(dbPerson.getPersonName(), null); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java new file mode 100644 index 0000000000..cbf28497bb --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java @@ -0,0 +1,62 @@ +package com.baeldung.hibernate.interceptors; + +import java.io.IOException; +import java.io.Serializable; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.interceptors.entity.User; + +public class HibernateInterceptorTest { + private static SessionFactory sessionFactory; + private static Serializable userId; + + @Before + public void init() throws IOException { + sessionFactory = HibernateUtil.getSessionFactoryWithInterceptor(null, new CustomInterceptor()); + } + + @AfterClass + public static void finish() { + if(userId != null) { + Session session = sessionFactory.getCurrentSession(); + Transaction transaction = session.beginTransaction(); + User user = session.load(User.class, userId); + if(user != null) { + session.delete(user); + } + transaction.commit(); + session.close(); + } + } + + @Test + public void givenHibernateInterceptorAndSessionScoped_whenUserCreated_shouldSucceed() { + Session session = sessionFactory.withOptions().interceptor(new CustomInterceptor()).openSession(); + User user = new User("Benjamin Franklin"); + Transaction transaction = session.beginTransaction(); + userId = session.save(user); + transaction.commit(); + session.close(); + } + + @Test + public void givenHibernateInterceptorAndSessionFactoryScoped_whenUserModified_shouldSucceed() { + Session session = sessionFactory.openSession(); + Transaction transaction = session.beginTransaction(); + User user = session.load(User.class, userId); + if(user != null) { + user.setAbout("I am a scientist."); + session.update(user); + } + transaction.commit(); + session.close(); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobTest.java new file mode 100644 index 0000000000..74a94d544b --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/lob/LobTest.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.lob; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import org.apache.commons.io.IOUtils; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.lob.model.User; + +public class LobTest { + + private Session session; + + @Before + public void init(){ + try { + session = HibernateSessionUtil.getSessionFactory("hibernate.properties") + .openSession(); + } catch (HibernateException | IOException e) { + fail("Failed to initiate Hibernate Session [Exception:" + e.toString() + "]"); + } + } + + @After + public void close(){ + if(session != null) session.close(); + } + + @Test + public void givenValidInsertLobObject_whenQueried_returnSameDataAsInserted(){ + User user = new User(); + try(InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("profile.png");) { + // Get Image file from the resource + if(inputStream == null) fail("Unable to get resources"); + user.setId("1"); + user.setName("User"); + user.setPhoto(IOUtils.toByteArray(inputStream)); + + session.persist(user); + } catch (IOException e) { + fail("Unable to read input stream"); + } + + User result = session.find(User.class, "1"); + + assertNotNull("Query result is null", result); + assertEquals("User's name is invalid", user.getName(), result.getName() ); + assertTrue("User's photo is corrupted", Arrays.equals(user.getPhoto(), result.getPhoto()) ); + } +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java new file mode 100644 index 0000000000..1b6cee7e67 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java @@ -0,0 +1,26 @@ +package com.baeldung.hibernate.multitenancy; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity(name = "Car") +@Table(name = "Car") +public class Car implements Serializable { + + private static final long serialVersionUID = 1015320564683423342L; + + private String brand; + + @Id + public String getBrand() { + return brand; + } + + public void setBrand(String brand) { + this.brand = brand; + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java new file mode 100644 index 0000000000..fdc3f9fa81 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java @@ -0,0 +1,104 @@ +package com.baeldung.hibernate.multitenancy; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.util.Properties; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.context.spi.CurrentTenantIdentifierResolver; +import org.hibernate.service.ServiceRegistry; +import org.junit.Before; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import com.baeldung.hibernate.multitenancy.database.TenantIdNames; + +public abstract class MultitenancyIntegrationTest { + + public abstract String getPropertyFile(); + + @Mock + private CurrentTenantIdentifierResolver currentTenantIdentifierResolver; + + private SessionFactory sessionFactory; + + @Before + public void setup() throws IOException { + MockitoAnnotations.initMocks(this); + + Mockito.when(currentTenantIdentifierResolver.validateExistingCurrentSessions()) + .thenReturn(false); + + Properties properties = getHibernateProperties(); + properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver); + + sessionFactory = buildSessionFactory(properties); + + initTenant(TenantIdNames.MYDB1); + initTenant(TenantIdNames.MYDB2); + } + + protected void initTenant(String tenantId) { + whenCurrentTenantIs(tenantId); + createCarTable(); + } + + protected void whenCurrentTenantIs(String tenantId) { + Mockito.when(currentTenantIdentifierResolver.resolveCurrentTenantIdentifier()) + .thenReturn(tenantId); + } + + protected void whenAddCar(String brand) { + Session session = sessionFactory.openSession(); + Transaction tx = session.beginTransaction(); + Car car = new Car(); + car.setBrand(brand); + session.save(car); + tx.commit(); + } + + protected void thenCarFound(String brand) { + Session session = sessionFactory.openSession(); + assertNotNull(session.get(Car.class, brand)); + } + + protected void thenCarNotFound(String brand) { + Session session = sessionFactory.openSession(); + assertNull(session.get(Car.class, brand)); + } + + @SuppressWarnings("deprecation") + private void createCarTable() { + Session session = sessionFactory.openSession(); + Transaction tx = session.beginTransaction(); + session.createSQLQuery("drop table Car if exists") + .executeUpdate(); + session.createSQLQuery("create table Car (brand varchar(255) primary key)") + .executeUpdate(); + tx.commit(); + } + + private Properties getHibernateProperties() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream(getPropertyFile())); + return properties; + } + + private static SessionFactory buildSessionFactory(Properties properties) { + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(Car.class); + return metadataSources.buildMetadata() + .buildSessionFactory(); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java new file mode 100644 index 0000000000..92f477a646 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.multitenancy.database; + +import java.io.IOException; + +import org.junit.Test; + +import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; + +public class DatabaseApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { + + @Override + public String getPropertyFile() { + return "/hibernate-database-multitenancy.properties"; + } + + @Test + public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() throws IOException { + whenCurrentTenantIs(TenantIdNames.MYDB1); + whenAddCar("myCar"); + thenCarFound("myCar"); + whenCurrentTenantIs(TenantIdNames.MYDB2); + thenCarNotFound("myCar"); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java new file mode 100644 index 0000000000..eb1f410622 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java @@ -0,0 +1,42 @@ +package com.baeldung.hibernate.multitenancy.database; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; + +@SuppressWarnings("serial") +public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { + + private final Map connectionProviderMap = new HashMap<>(); + + public MapMultiTenantConnectionProvider() throws IOException { + initConnectionProviderForTenant(TenantIdNames.MYDB1); + initConnectionProviderForTenant(TenantIdNames.MYDB2); + } + + @Override + protected ConnectionProvider getAnyConnectionProvider() { + return connectionProviderMap.values() + .iterator() + .next(); + } + + @Override + protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { + return connectionProviderMap.get(tenantIdentifier); + } + + private void initConnectionProviderForTenant(String tenantId) throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream(String.format("/hibernate-database-%s.properties", tenantId))); + DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); + connectionProvider.configure(properties); + this.connectionProviderMap.put(tenantId, connectionProvider); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java new file mode 100644 index 0000000000..231272fa63 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java @@ -0,0 +1,6 @@ +package com.baeldung.hibernate.multitenancy.database; + +public class TenantIdNames { + public static final String MYDB1 = "mydb1"; + public static final String MYDB2 = "mydb2"; +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java new file mode 100644 index 0000000000..304af65fca --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java @@ -0,0 +1,26 @@ +package com.baeldung.hibernate.multitenancy.schema; + +import java.io.IOException; + +import org.junit.Test; + +import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest; +import com.baeldung.hibernate.multitenancy.database.TenantIdNames; + +public class SchemaApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest { + + @Override + public String getPropertyFile() { + return "/hibernate-schema-multitenancy.properties"; + } + + @Test + public void givenSchemaApproach_whenAddingEntries_thenOnlyAddedToConcreteSchema() throws IOException { + whenCurrentTenantIs(TenantIdNames.MYDB1); + whenAddCar("Ferrari"); + thenCarFound("Ferrari"); + whenCurrentTenantIs(TenantIdNames.MYDB2); + thenCarNotFound("Ferrari"); + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java new file mode 100644 index 0000000000..601eba651c --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java @@ -0,0 +1,48 @@ +package com.baeldung.hibernate.multitenancy.schema; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; + +@SuppressWarnings("serial") +public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { + + private final ConnectionProvider connectionProvider; + + public SchemaMultiTenantConnectionProvider() throws IOException { + connectionProvider = initConnectionProvider(); + } + + @Override + protected ConnectionProvider getAnyConnectionProvider() { + return connectionProvider; + } + + @Override + protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { + return connectionProvider; + } + + @Override + public Connection getConnection(String tenantIdentifier) throws SQLException { + Connection connection = super.getConnection(tenantIdentifier); + connection.createStatement() + .execute(String.format("SET SCHEMA %s;", tenantIdentifier)); + return connection; + } + + private ConnectionProvider initConnectionProvider() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getResourceAsStream("/hibernate-schema-multitenancy.properties")); + + DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); + connectionProvider.configure(properties); + return connectionProvider; + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java new file mode 100644 index 0000000000..2eba94e307 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java @@ -0,0 +1,6 @@ +package com.baeldung.hibernate.multitenancy.schema; + +public class TenantIdNames { + public static final String MYDB1 = "mydb1"; + public static final String MYDB2 = "mydb2"; +} diff --git a/hibernate5/src/test/resources/hibernate-database-multitenancy.properties b/hibernate5/src/test/resources/hibernate-database-multitenancy.properties new file mode 100644 index 0000000000..853fa80dfc --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-database-multitenancy.properties @@ -0,0 +1,2 @@ +hibernate.multiTenancy=DATABASE +hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.database.MapMultiTenantConnectionProvider \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-database-mydb1.properties b/hibernate5/src/test/resources/hibernate-database-mydb1.properties new file mode 100644 index 0000000000..345f1dbbea --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-database-mydb1.properties @@ -0,0 +1,4 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-database-mydb2.properties b/hibernate5/src/test/resources/hibernate-database-mydb2.properties new file mode 100644 index 0000000000..626b7853c6 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-database-mydb2.properties @@ -0,0 +1,4 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb2;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-interceptors.properties b/hibernate5/src/test/resources/hibernate-interceptors.properties new file mode 100644 index 0000000000..58b55d0a09 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-interceptors.properties @@ -0,0 +1,10 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop +hibernate.current_session_context_class=org.hibernate.context.internal.ThreadLocalSessionContext \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties b/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties new file mode 100644 index 0000000000..4abb621355 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties @@ -0,0 +1,7 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS MYDB1\\;CREATE SCHEMA IF NOT EXISTS MYDB2\\; +hibernate.connection.username=sa +hibernate.connection.autocommit=true +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.multiTenancy=SCHEMA +hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.schema.SchemaMultiTenantConnectionProvider \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-spatial.properties b/hibernate5/src/test/resources/hibernate-spatial.properties new file mode 100644 index 0000000000..e85cd49cc3 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-spatial.properties @@ -0,0 +1,10 @@ +hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect +hibernate.connection.driver_class=com.mysql.jdbc.Driver +hibernate.connection.url=jdbc:mysql://localhost:3306/hibernate-spatial +hibernate.connection.username=root +hibernate.connection.password=pass +hibernate.connection.pool_size=5 +hibernate.show_sql=true +hibernate.format_sql=true +hibernate.max_fetch_depth=5 +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/hibernate5/src/test/resources/profile.png b/hibernate5/src/test/resources/profile.png new file mode 100644 index 0000000000..1cd4e978b9 Binary files /dev/null and b/hibernate5/src/test/resources/profile.png differ diff --git a/hystrix/pom.xml b/hystrix/pom.xml index 58e09816ea..19da678eb7 100644 --- a/hystrix/pom.xml +++ b/hystrix/pom.xml @@ -7,10 +7,10 @@ hystrix - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -34,7 +34,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided org.springframework.boot diff --git a/influxdb/README.md b/influxdb/README.md new file mode 100644 index 0000000000..f2c421580e --- /dev/null +++ b/influxdb/README.md @@ -0,0 +1,17 @@ +## Influx SDK Tutorial Project + +### Relevant Article: +- [Introduction to using InfluxDB with Java](http://www.baeldung.com/using-influxdb-with-java/) + +### Overview +This Maven project contains the Java code for the article linked above. + +### Package Organization +Java classes for the intro tutorial are in the +org.baeldung.influxdb package. + + +### Running the tests +The test class expects an InfluxDB server to be available on localhost, at the default port of 8086 and with the default "admin" credentials. + +``` diff --git a/influxdb/pom.xml b/influxdb/pom.xml new file mode 100644 index 0000000000..05a8e00fa0 --- /dev/null +++ b/influxdb/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + influxdb + 0.1-SNAPSHOT + jar + influxdb + InfluxDB SDK Tutorial + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.influxdb + influxdb-java + ${influxdb.sdk.version} + + + + org.projectlombok + lombok + + ${lombok.version} + provided + + + + + + + + 1.8 + UTF-8 + 2.8 + 1.16.18 + + + + diff --git a/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java b/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java new file mode 100644 index 0000000000..fb05a70867 --- /dev/null +++ b/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java @@ -0,0 +1,28 @@ +package com.baeldung.influxdb; + +import lombok.Data; +import org.influxdb.annotation.Column; +import org.influxdb.annotation.Measurement; + +import java.time.Instant; + +@Data +@Measurement(name = "memory") +public class MemoryPoint { + + @Column(name = "time") + private Instant time; + + @Column(name = "name") + private String name; + + @Column(name = "free") + private Long free; + + @Column(name = "used") + private Long used; + + @Column(name = "buffer") + private Long buffer; + +} diff --git a/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java new file mode 100644 index 0000000000..858903a676 --- /dev/null +++ b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java @@ -0,0 +1,178 @@ +package com.baeldung.influxdb; + +import lombok.extern.slf4j.Slf4j; +import org.influxdb.InfluxDB; +import org.influxdb.InfluxDBFactory; +import org.influxdb.InfluxDBIOException; +import org.influxdb.dto.*; +import org.influxdb.impl.InfluxDBResultMapper; +import org.junit.Test; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +@Slf4j +public class InfluxDBConnectionLiveTest { + + @Test + public void whenCorrectInfoDatabaseConnects() { + + InfluxDB connection = connectDatabase(); + assertTrue(pingServer(connection)); + } + + private InfluxDB connectDatabase() { + + // Connect to database assumed on localhost with default credentials. + return InfluxDBFactory.connect("http://127.0.0.1:8086", "admin", "admin"); + + } + + private boolean pingServer(InfluxDB influxDB) { + try { + // Ping and check for version string + Pong response = influxDB.ping(); + if (response.getVersion().equalsIgnoreCase("unknown")) { + log.error("Error pinging server."); + return false; + } else { + log.info("Database version: {}", response.getVersion()); + return true; + } + } catch (InfluxDBIOException idbo) { + log.error("Exception while pinging database: ", idbo); + return false; + } + } + + @Test + public void whenDatabaseCreatedDatabaseChecksOk() { + + InfluxDB connection = connectDatabase(); + + // Create "baeldung" and check for it + connection.createDatabase("baeldung"); + assertTrue(connection.databaseExists("baeldung")); + + // Verify that nonsense databases are not there + assertFalse(connection.databaseExists("foobar")); + + // Drop "baeldung" and check again + connection.deleteDatabase("baeldung"); + assertFalse(connection.databaseExists("baeldung")); + } + + @Test + public void whenPointsWrittenPointsExists() throws Exception { + + InfluxDB connection = connectDatabase(); + + String dbName = "baeldung"; + connection.createDatabase(dbName); + + // Need a retention policy before we can proceed + connection.createRetentionPolicy("defaultPolicy", "baeldung", "30d", 1, true); + + // Since we are doing a batch thread, we need to set this as a default + connection.setRetentionPolicy("defaultPolicy"); + + // Enable batch mode + connection.enableBatch(10, 10, TimeUnit.MILLISECONDS); + + for (int i = 0; i < 10; i++) { + Point point = Point.measurement("memory") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("name", "server1") + .addField("free", 4743656L) + .addField("used", 1015096L) + .addField("buffer", 1010467L) + .build(); + + connection.write(dbName, "defaultPolicy", point); + Thread.sleep(2); + + } + + // Unfortunately, the sleep inside the loop doesn't always add enough time to insure + // that Influx's batch thread flushes all of the writes and this sometimes fails without + // another brief pause. + Thread.sleep(10); + + List memoryPointList = getPoints(connection, "Select * from memory", "baeldung"); + + assertEquals(10, memoryPointList.size()); + + // Turn off batch and clean up + connection.disableBatch(); + connection.deleteDatabase("baeldung"); + connection.close(); + + } + + private List getPoints(InfluxDB connection, String query, String databaseName) { + + // Run the query + Query queryObject = new Query(query, databaseName); + QueryResult queryResult = connection.query(queryObject); + + // Map it + InfluxDBResultMapper resultMapper = new InfluxDBResultMapper(); + return resultMapper.toPOJO(queryResult, MemoryPoint.class); + } + + + + @Test + public void whenBatchWrittenBatchExists() { + + InfluxDB connection = connectDatabase(); + + String dbName = "baeldung"; + connection.createDatabase(dbName); + + // Need a retention policy before we can proceed + // Since we are doing batches, we need not set it + connection.createRetentionPolicy("defaultPolicy", "baeldung", "30d", 1, true); + + + BatchPoints batchPoints = BatchPoints + .database(dbName) + .retentionPolicy("defaultPolicy") + .build(); + Point point1 = Point.measurement("memory") + .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) + .addField("free", 4743656L) + .addField("used", 1015096L) + .addField("buffer", 1010467L) + .build(); + Point point2 = Point.measurement("memory") + .time(System.currentTimeMillis() - 100, TimeUnit.MILLISECONDS) + .addField("free", 4743696L) + .addField("used", 1016096L) + .addField("buffer", 1008467L) + .build(); + batchPoints.point(point1); + batchPoints.point(point2); + connection.write(batchPoints); + + List memoryPointList = getPoints(connection, "Select * from memory", "baeldung"); + + assertEquals(2, memoryPointList.size()); + assertTrue(4743696L == memoryPointList.get(0).getFree()); + + + memoryPointList = getPoints(connection, "Select * from memory order by time desc", "baeldung"); + + assertEquals(2, memoryPointList.size()); + assertTrue(4743656L == memoryPointList.get(0).getFree()); + + // Clean up database + connection.deleteDatabase("baeldung"); + connection.close(); + } + +} diff --git a/influxdb/src/test/resources/logback.xml b/influxdb/src/test/resources/logback.xml new file mode 100644 index 0000000000..f8ebaf1ebd --- /dev/null +++ b/influxdb/src/test/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + \ No newline at end of file diff --git a/intelliJ/README.md b/intelliJ/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/intelliJ/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/jackson/pom.xml b/jackson/pom.xml index 001fde5021..2587e61ac1 100644 --- a/jackson/pom.xml +++ b/jackson/pom.xml @@ -129,7 +129,7 @@ - 2.9.2 + 2.9.4 19.0 diff --git a/java-difference-date/pom.xml b/java-difference-date/pom.xml index 388753de90..ac3f0fa3b5 100644 --- a/java-difference-date/pom.xml +++ b/java-difference-date/pom.xml @@ -41,6 +41,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 1.8 1.8 diff --git a/java-lite/README.md b/java-lite/README.md new file mode 100644 index 0000000000..13dcd5f8c3 --- /dev/null +++ b/java-lite/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [A Guide to JavaLite – Building a RESTful CRUD application](http://www.baeldung.com/javalite-rest) diff --git a/java-lite/pom.xml b/java-lite/pom.xml new file mode 100644 index 0000000000..d7950487ca --- /dev/null +++ b/java-lite/pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + + org.baeldung + java-lite + 1.0-SNAPSHOT + war + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 9.4.8.v20171121 + 1.4.13 + 1.15 + 5.1.45 + 1.7.0 + 1.8.2 + 4.12 + + + + + + src/main/webapp/WEB-INF + + + + + org.eclipse.jetty + jetty-maven-plugin + ${jetty.maven.plugin.version} + + + + activejdbc.log + + + + active_reload + true + + + activeweb.log.request + true + + + + + + + org.javalite + activejdbc-instrumentation + ${activejdbc.version} + + + process-classes + + instrument + + + + + + + + + + org.javalite + activeweb + ${activeweb.version} + + + + mysql + mysql-connector-java + ${mysql.connector.java.version} + + + + com.sun + tools + ${sun.tools.version} + system + ${java.home}/../lib/tools.jar + + + + org.javalite + activeweb-testing + 1.15 + test + + + + junit + junit + ${junit.version} + + + + \ No newline at end of file diff --git a/java-lite/src/main/java/app/config/AppBootstrap.java b/java-lite/src/main/java/app/config/AppBootstrap.java new file mode 100644 index 0000000000..02c8360986 --- /dev/null +++ b/java-lite/src/main/java/app/config/AppBootstrap.java @@ -0,0 +1,17 @@ +package app.config; + +import org.javalite.activeweb.AppContext; +import org.javalite.activeweb.Bootstrap; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +import app.services.ArticleServiceModule; + +public class AppBootstrap extends Bootstrap { + public void init(AppContext context) { + } + public Injector getInjector() { + return Guice.createInjector(new ArticleServiceModule()); + } +} diff --git a/java-lite/src/main/java/app/config/AppControllerConfig.java b/java-lite/src/main/java/app/config/AppControllerConfig.java new file mode 100644 index 0000000000..da30c08ab2 --- /dev/null +++ b/java-lite/src/main/java/app/config/AppControllerConfig.java @@ -0,0 +1,15 @@ +package app.config; + +import app.controllers.ProductsController; +import org.javalite.activeweb.AbstractControllerConfig; +import org.javalite.activeweb.AppContext; +import org.javalite.activeweb.controller_filters.DBConnectionFilter; +import org.javalite.activeweb.controller_filters.TimingFilter; + +public class AppControllerConfig extends AbstractControllerConfig { + @Override + public void init(AppContext appContext) { + addGlobalFilters(new TimingFilter()); + add(new DBConnectionFilter()).to(ProductsController.class); + } +} diff --git a/java-lite/src/main/java/app/config/DbConfig.java b/java-lite/src/main/java/app/config/DbConfig.java new file mode 100644 index 0000000000..75de248619 --- /dev/null +++ b/java-lite/src/main/java/app/config/DbConfig.java @@ -0,0 +1,11 @@ +package app.config; + +import org.javalite.activeweb.AbstractDBConfig; +import org.javalite.activeweb.AppContext; + +public class DbConfig extends AbstractDBConfig { + @Override + public void init(AppContext appContext) { + this.configFile("/database.properties"); + } +} diff --git a/java-lite/src/main/java/app/controllers/ArticleController.java b/java-lite/src/main/java/app/controllers/ArticleController.java new file mode 100755 index 0000000000..2b8dc452bd --- /dev/null +++ b/java-lite/src/main/java/app/controllers/ArticleController.java @@ -0,0 +1,28 @@ +package app.controllers; + +import javax.inject.Inject; + +import org.javalite.activeweb.AppController; + +import app.services.ArticleService; + +public class ArticleController extends AppController { + + @Inject + private ArticleService articleService; + + public void index() { + view("articles", articleService.getArticles()); + } + + public void search() { + + String keyword = param("key"); + if (null != keyword) { + assign("article", articleService.search(keyword)); + } else { + render("/common/error"); + } + + } +} diff --git a/java-lite/src/main/java/app/controllers/HomeController.java b/java-lite/src/main/java/app/controllers/HomeController.java new file mode 100755 index 0000000000..0e284af0ad --- /dev/null +++ b/java-lite/src/main/java/app/controllers/HomeController.java @@ -0,0 +1,11 @@ +package app.controllers; + +import org.javalite.activeweb.AppController; + +public class HomeController extends AppController { + + public void index() { + render("index"); + } + +} diff --git a/java-lite/src/main/java/app/controllers/ProductsController.java b/java-lite/src/main/java/app/controllers/ProductsController.java new file mode 100644 index 0000000000..746d77e24a --- /dev/null +++ b/java-lite/src/main/java/app/controllers/ProductsController.java @@ -0,0 +1,103 @@ +package app.controllers; + +import app.models.Product; +import org.codehaus.jackson.map.ObjectMapper; +import org.javalite.activeweb.AppController; +import org.javalite.activeweb.annotations.RESTful; + +import java.util.Map; + +@RESTful +public class ProductsController extends AppController { + + private ObjectMapper mapper = new ObjectMapper(); + + public void index() { + try { + view("products", Product.findAll()); + render().contentType("application/json"); + } catch (Exception e) { + view("message", "There was an error.", "code", 200); + render("message"); + } + } + + public void create() { + try { + Map payload = mapper.readValue(getRequestString(), Map.class); + Product p = new Product(); + p.fromMap(payload); + p.saveIt(); + view("message", "Successfully saved product id " + p.get("id"), "code", 200); + render("message"); + } catch (Exception e) { + view("message", "There was an error.", "code", 200); + render("message"); + } + } + + public void update() { + try { + Map payload = mapper.readValue(getRequestString(), Map.class); + String id = getId(); + Product p = Product.findById(id); + if (p == null) { + view("message", "Product id " + id + " not found.", "code", 200); + render("message"); + return; + } + p.fromMap(payload); + p.saveIt(); + view("message", "Successfully updated product id " + id, "code", 200); + render("message"); + } catch (Exception e) { + view("message", "There was an error.", "code", 200); + render("message"); + } + } + + public void show() { + try { + String id = getId(); + Product p = Product.findById(id); + if (p == null) { + view("message", "Product id " + id + " not found.", "code", 200); + render("message"); + return; + } + view("product", p); + render("_product"); + } catch (Exception e) { + view("message", "There was an error.", "code", 200); + render("message"); + } + } + + public void destroy() { + try { + String id = getId(); + Product p = Product.findById(id); + if (p == null) { + view("message", "Product id " + id + " not found.", "code", 200); + render("message"); + return; + } + p.delete(); + view("message", "Successfully deleted product id " + id, "code", 200); + render("message"); + } catch (Exception e) { + view("message", "There was an error.", "code", 200); + render("message"); + } + } + + @Override + protected String getContentType() { + return "application/json"; + } + + @Override + protected String getLayout() { + return null; + } +} diff --git a/java-lite/src/main/java/app/models/Article.java b/java-lite/src/main/java/app/models/Article.java new file mode 100755 index 0000000000..db318f4468 --- /dev/null +++ b/java-lite/src/main/java/app/models/Article.java @@ -0,0 +1,50 @@ +package app.models; + +public class Article { + + private String title; + private String author; + private String words; + private String date; + + public Article(String title, String author, String words, String date) { + super(); + this.title = title; + this.author = author; + this.words = words; + this.date = date; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getWords() { + return words; + } + + public void setWords(String words) { + this.words = words; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + +} \ No newline at end of file diff --git a/java-lite/src/main/java/app/models/Product.java b/java-lite/src/main/java/app/models/Product.java new file mode 100644 index 0000000000..7fa32b75d9 --- /dev/null +++ b/java-lite/src/main/java/app/models/Product.java @@ -0,0 +1,7 @@ +package app.models; + +import org.javalite.activejdbc.Model; + +public class Product extends Model { + +} diff --git a/java-lite/src/main/java/app/services/ArticleService.java b/java-lite/src/main/java/app/services/ArticleService.java new file mode 100755 index 0000000000..ddd0b3ed10 --- /dev/null +++ b/java-lite/src/main/java/app/services/ArticleService.java @@ -0,0 +1,13 @@ +package app.services; + +import java.util.List; + +import app.models.Article; + +public interface ArticleService { + + List
getArticles(); + + Article search(String keyword); + +} diff --git a/java-lite/src/main/java/app/services/ArticleServiceImpl.java b/java-lite/src/main/java/app/services/ArticleServiceImpl.java new file mode 100755 index 0000000000..fc81576f91 --- /dev/null +++ b/java-lite/src/main/java/app/services/ArticleServiceImpl.java @@ -0,0 +1,34 @@ +package app.services; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +import app.models.Article; + +public class ArticleServiceImpl implements ArticleService { + + public List
getArticles() { + return fetchArticles(); + } + + public Article search(String keyword) { + Article ar = new Article("Article with " + keyword, "baeldung", "1250", Instant.now() + .toString()); + return ar; + } + + private List
fetchArticles() { + Article ar1 = new Article("Introduction to ActiveWeb", "baeldung", "1650", Instant.now() + .toString()); + + Article ar = new Article("Introduction to Mule", "baeldung", "1650", Instant.now() + .toString()); + List
articles = new ArrayList
(); + articles.add(ar); + articles.add(ar1); + return articles; + + } + +} diff --git a/java-lite/src/main/java/app/services/ArticleServiceModule.java b/java-lite/src/main/java/app/services/ArticleServiceModule.java new file mode 100755 index 0000000000..feae2a2ff7 --- /dev/null +++ b/java-lite/src/main/java/app/services/ArticleServiceModule.java @@ -0,0 +1,12 @@ +package app.services; + +import com.google.inject.AbstractModule; + +public class ArticleServiceModule extends AbstractModule { + + @Override + protected void configure() { + bind(ArticleService.class).to(ArticleServiceImpl.class) + .asEagerSingleton(); + } +} diff --git a/java-lite/src/main/resources/database.properties b/java-lite/src/main/resources/database.properties new file mode 100644 index 0000000000..55b3851d33 --- /dev/null +++ b/java-lite/src/main/resources/database.properties @@ -0,0 +1,4 @@ +development.driver=com.mysql.jdbc.Driver +development.username=user +development.password=password +development.url=jdbc:mysql://localhost/dbname \ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/article/index.ftl b/java-lite/src/main/webapp/WEB-INF/views/article/index.ftl new file mode 100755 index 0000000000..2d5f211427 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/article/index.ftl @@ -0,0 +1,18 @@ +<@content for="title">Articles + +
" + user.getUsername() + "" + user.getEmail() + "
+ + + + + + +<#list articles as article> + + + + + + + +
TitleAuthorWords #Date Published
${article.title}${article.author}${article.words}${article.date}
\ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/article/search.ftl b/java-lite/src/main/webapp/WEB-INF/views/article/search.ftl new file mode 100755 index 0000000000..45a73808ed --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/article/search.ftl @@ -0,0 +1,17 @@ +<@content for="title">Search + + + + + + + + + + + + + + + +
TitleAuthorWords #Date Published
${article.title}${article.author}${article.words}${article.date}
\ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/common/error.ftl b/java-lite/src/main/webapp/WEB-INF/views/common/error.ftl new file mode 100755 index 0000000000..5fbf3c5243 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/common/error.ftl @@ -0,0 +1,3 @@ +<@content for="title">Simple Web App + +

Application error

diff --git a/java-lite/src/main/webapp/WEB-INF/views/home/index.ftl b/java-lite/src/main/webapp/WEB-INF/views/home/index.ftl new file mode 100755 index 0000000000..ae6a7c56a5 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/home/index.ftl @@ -0,0 +1,3 @@ +<@content for="title">Simple Web App + +

Baeldung ActiveWeb Demo Application

diff --git a/java-lite/src/main/webapp/WEB-INF/views/layouts/default_layout.ftl b/java-lite/src/main/webapp/WEB-INF/views/layouts/default_layout.ftl new file mode 100755 index 0000000000..2985e56278 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/layouts/default_layout.ftl @@ -0,0 +1,16 @@ +<#setting url_escaping_charset='ISO-8859-1'> + + + + + + +
+<#include "header.ftl" > +
+ ${page_content} +
+<#include "footer.ftl" > +
+ + diff --git a/java-lite/src/main/webapp/WEB-INF/views/layouts/footer.ftl b/java-lite/src/main/webapp/WEB-INF/views/layouts/footer.ftl new file mode 100755 index 0000000000..1408547424 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/layouts/footer.ftl @@ -0,0 +1,3 @@ + diff --git a/java-lite/src/main/webapp/WEB-INF/views/layouts/header.ftl b/java-lite/src/main/webapp/WEB-INF/views/layouts/header.ftl new file mode 100755 index 0000000000..8187435035 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/layouts/header.ftl @@ -0,0 +1,4 @@ + + diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl new file mode 100644 index 0000000000..41622b4720 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl @@ -0,0 +1 @@ +, \ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl new file mode 100644 index 0000000000..562af0499e --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl @@ -0,0 +1,4 @@ +{ +"id" : ${product.id}, +"name" : "${product.name}" +} \ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl new file mode 100644 index 0000000000..c343f20910 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl @@ -0,0 +1 @@ +[<@render partial="product" collection=products spacer="comma"/>] \ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl new file mode 100644 index 0000000000..3e7faf1459 --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl @@ -0,0 +1,4 @@ +{ +"message" : "${message}", +"code" : ${code} +} \ No newline at end of file diff --git a/java-lite/src/main/webapp/WEB-INF/web.xml b/java-lite/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..23bb8b865e --- /dev/null +++ b/java-lite/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,29 @@ + + + + + + dispatcher + org.javalite.activeweb.RequestDispatcher + + root_controller + home + + + exclusions + css,images,js,ico + + + encoding + UTF-8 + + + + + + dispatcher + /* + + + diff --git a/java-lite/src/test/java/app/controllers/ArticleControllerSpec.java b/java-lite/src/test/java/app/controllers/ArticleControllerSpec.java new file mode 100755 index 0000000000..882441dad3 --- /dev/null +++ b/java-lite/src/test/java/app/controllers/ArticleControllerSpec.java @@ -0,0 +1,31 @@ +package app.controllers; + +import org.javalite.activeweb.ControllerSpec; +import org.junit.Before; +import org.junit.Test; + +import com.google.inject.Guice; + +import app.services.ArticleServiceModule; + +public class ArticleControllerSpec extends ControllerSpec { + + @Before + public void before() { + setInjector(Guice.createInjector(new ArticleServiceModule())); + } + + @Test + public void whenReturnedArticlesThenCorrect() { + request().get("index"); + a(responseContent()).shouldContain("Introduction to Mule"); + } + + @Test + public void givenKeywordWhenFoundArticleThenCorrect() { + request().param("key", "Java") + .get("search"); + a(responseContent()).shouldContain("Article with Java"); + } + +} diff --git a/java-lite/src/test/java/app/models/ProductTest.java b/java-lite/src/test/java/app/models/ProductTest.java new file mode 100644 index 0000000000..5e5c6e8845 --- /dev/null +++ b/java-lite/src/test/java/app/models/ProductTest.java @@ -0,0 +1,25 @@ +package app.models; + +import org.javalite.activejdbc.Base; +import org.junit.Assert; +import org.junit.Test; + +public class ProductTest { + + //@Test + public void givenSavedProduct_WhenFindFirst_ThenSavedProductIsReturned() { + //Open DB connection + Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/dbname", "user", "password"); + + //Create a product and save it + Product toSaveProduct = new Product(); + toSaveProduct.set("name", "Bread"); + toSaveProduct.saveIt(); + + //Find product + Product savedProduct = Product.findFirst("name = ?", "Bread"); + + Assert.assertEquals(toSaveProduct.get("name"), savedProduct.get("name")); + } + +} \ No newline at end of file diff --git a/java-rmi/README.md b/java-rmi/README.md new file mode 100644 index 0000000000..4d12060395 --- /dev/null +++ b/java-rmi/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Getting Started with Java RMI](http://www.baeldung.com/java-rmi) diff --git a/java-rmi/pom.xml b/java-rmi/pom.xml new file mode 100644 index 0000000000..7c08968cbf --- /dev/null +++ b/java-rmi/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + + com.baeldung.rmi + java-rmi + 1.0-SNAPSHOT + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + UTF-8 + + + diff --git a/java-rmi/src/main/java/com/baeldung/rmi/Message.java b/java-rmi/src/main/java/com/baeldung/rmi/Message.java new file mode 100644 index 0000000000..6d21a45fe3 --- /dev/null +++ b/java-rmi/src/main/java/com/baeldung/rmi/Message.java @@ -0,0 +1,36 @@ +package com.baeldung.rmi; + +import java.io.Serializable; + +public class Message implements Serializable { + + private String messageText; + + private String contentType; + + public Message() { + } + + public Message(String messageText, String contentType) { + + this.messageText = messageText; + this.contentType = contentType; + } + + public String getMessageText() { + return messageText; + } + + public void setMessageText(String messageText) { + this.messageText = messageText; + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + +} diff --git a/java-rmi/src/main/java/com/baeldung/rmi/MessengerService.java b/java-rmi/src/main/java/com/baeldung/rmi/MessengerService.java new file mode 100644 index 0000000000..f962e4ad07 --- /dev/null +++ b/java-rmi/src/main/java/com/baeldung/rmi/MessengerService.java @@ -0,0 +1,11 @@ +package com.baeldung.rmi; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface MessengerService extends Remote { + + public String sendMessage(String clientMessage) throws RemoteException; + + public Message sendMessage(Message clientMessage) throws RemoteException; +} \ No newline at end of file diff --git a/java-rmi/src/main/java/com/baeldung/rmi/MessengerServiceImpl.java b/java-rmi/src/main/java/com/baeldung/rmi/MessengerServiceImpl.java new file mode 100644 index 0000000000..ebf03d4b67 --- /dev/null +++ b/java-rmi/src/main/java/com/baeldung/rmi/MessengerServiceImpl.java @@ -0,0 +1,37 @@ +package com.baeldung.rmi; + +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +public class MessengerServiceImpl implements MessengerService { + + public String sendMessage(String clientMessage) { + + String serverMessage = null; + if (clientMessage.equals("Client Message")) { + serverMessage = "Server Message"; + } + + return serverMessage; + } + + public void createStubAndBind() throws RemoteException { + + MessengerService stub = (MessengerService) UnicastRemoteObject.exportObject((MessengerService) this, 0); + Registry registry = LocateRegistry.createRegistry(1099); + registry.rebind("MessengerService", stub); + } + + public Message sendMessage(Message clientMessage) throws RemoteException { + + Message serverMessage = null; + if (clientMessage.getMessageText().equals("Client Message")) { + serverMessage = new Message("Server Message", "text/plain"); + } + + return serverMessage; + } + +} \ No newline at end of file diff --git a/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java new file mode 100644 index 0000000000..66bfbe49eb --- /dev/null +++ b/java-rmi/src/test/java/com/baeldung/rmi/JavaRMIIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.rmi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.rmi.NotBoundException; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class JavaRMIIntegrationTest { + + @BeforeClass + public static void whenRunServer_thenServerStarts() { + + try { + MessengerServiceImpl server = new MessengerServiceImpl(); + server.createStubAndBind(); + } catch (RemoteException e) { + fail("Exception Occurred"); + } + } + + @Test + public void whenClientSendsMessageToServer_thenServerSendsResponseMessage() { + + try { + Registry registry = LocateRegistry.getRegistry(); + MessengerService server = (MessengerService) registry.lookup("MessengerService"); + String responseMessage = server.sendMessage("Client Message"); + + String expectedMessage = "Server Message"; + assertEquals(responseMessage, expectedMessage); + } catch (RemoteException e) { + fail("Exception Occurred"); + } catch (NotBoundException nb) { + fail("Exception Occurred"); + } + } + +} \ No newline at end of file diff --git a/java-spi/exchange-rate-api/pom.xml b/java-spi/exchange-rate-api/pom.xml new file mode 100644 index 0000000000..27651533a9 --- /dev/null +++ b/java-spi/exchange-rate-api/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + + exchange-rate-api + jar + + + com.baeldung + java-spi + 1.0.0-SNAPSHOT + + + diff --git a/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/ExchangeRate.java b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/ExchangeRate.java new file mode 100644 index 0000000000..afc7ef92ce --- /dev/null +++ b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/ExchangeRate.java @@ -0,0 +1,42 @@ +package com.baeldung.rate; + +import com.baeldung.rate.exception.ProviderNotFoundException; +import com.baeldung.rate.spi.ExchangeRateProvider; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; + +public final class ExchangeRate { + + private static final String DEFAULT_PROVIDER = "com.baeldung.rate.spi.YahooFinanceExchangeRateProvider"; + + //All providers + public static List providers() { + List services = new ArrayList<>(); + ServiceLoader loader = ServiceLoader.load(ExchangeRateProvider.class); + loader.forEach(exchangeRateProvider -> { + services.add(exchangeRateProvider); + }); + return services; + } + + //Default provider + public static ExchangeRateProvider provider() { + return provider(DEFAULT_PROVIDER); + } + + //provider by name + public static ExchangeRateProvider provider(String providerName) { + ServiceLoader loader = ServiceLoader.load(ExchangeRateProvider.class); + Iterator it = loader.iterator(); + while (it.hasNext()) { + ExchangeRateProvider provider = it.next(); + if (providerName.equals(provider.getClass().getName())) { + return provider; + } + } + throw new ProviderNotFoundException("Exchange Rate provider " + providerName + " not found"); + } +} diff --git a/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/Quote.java b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/Quote.java new file mode 100644 index 0000000000..577af3b618 --- /dev/null +++ b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/Quote.java @@ -0,0 +1,44 @@ +package com.baeldung.rate.api; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class Quote { + private String currency; + private BigDecimal ask; + private BigDecimal bid; + private LocalDate date; + //... + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public BigDecimal getAsk() { + return ask; + } + + public void setAsk(BigDecimal ask) { + this.ask = ask; + } + + public BigDecimal getBid() { + return bid; + } + + public void setBid(BigDecimal bid) { + this.bid = bid; + } + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } +} \ No newline at end of file diff --git a/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/QuoteManager.java b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/QuoteManager.java new file mode 100644 index 0000000000..16416eaf65 --- /dev/null +++ b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/api/QuoteManager.java @@ -0,0 +1,8 @@ +package com.baeldung.rate.api; + +import java.time.LocalDate; +import java.util.List; + +public interface QuoteManager { + List getQuotes(String baseCurrency, LocalDate date); +} diff --git a/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/exception/ProviderNotFoundException.java b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/exception/ProviderNotFoundException.java new file mode 100644 index 0000000000..3a2d92c4fd --- /dev/null +++ b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/exception/ProviderNotFoundException.java @@ -0,0 +1,13 @@ +package com.baeldung.rate.exception; + +public class ProviderNotFoundException extends RuntimeException { + + public ProviderNotFoundException() { + super(); + } + + public ProviderNotFoundException(String message) { + super(message); + } + +} diff --git a/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/spi/ExchangeRateProvider.java b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/spi/ExchangeRateProvider.java new file mode 100644 index 0000000000..c3157b2b03 --- /dev/null +++ b/java-spi/exchange-rate-api/src/main/java/com/baeldung/rate/spi/ExchangeRateProvider.java @@ -0,0 +1,7 @@ +package com.baeldung.rate.spi; + +import com.baeldung.rate.api.QuoteManager; + +public interface ExchangeRateProvider { + QuoteManager create(); +} \ No newline at end of file diff --git a/java-spi/exchange-rate-app/pom.xml b/java-spi/exchange-rate-app/pom.xml new file mode 100644 index 0000000000..7e64cf7438 --- /dev/null +++ b/java-spi/exchange-rate-app/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + + exchange-rate-app + jar + + + com.baeldung + java-spi + 1.0.0-SNAPSHOT + + + + + com.baeldung + exchange-rate-api + 1.0.0-SNAPSHOT + + + com.baeldung + exchange-rate-impl + 1.0.0-SNAPSHOT + + + + diff --git a/java-spi/exchange-rate-app/src/main/java/com.baeldung.rate.app/MainApp.java b/java-spi/exchange-rate-app/src/main/java/com.baeldung.rate.app/MainApp.java new file mode 100644 index 0000000000..fd43ed3a85 --- /dev/null +++ b/java-spi/exchange-rate-app/src/main/java/com.baeldung.rate.app/MainApp.java @@ -0,0 +1,21 @@ +package com.baeldung.rate.app; + +import com.baeldung.rate.ExchangeRate; +import com.baeldung.rate.api.Quote; + +import java.time.LocalDate; +import java.util.List; + +public class MainApp { + public static void main(String... args) { + ExchangeRate.providers().forEach(provider -> { + System.out.println("Retreiving USD quotes from provider :" + provider); + List quotes = provider.create().getQuotes("USD", LocalDate.now()); + System.out.println(String.format("%14s%12s|%12s", "","Ask", "Bid")); + System.out.println("----------------------------------------"); + quotes.forEach(quote -> { + System.out.println("USD --> " + quote.getCurrency() + " : " + String.format("%12f|%12f", quote.getAsk(), quote.getBid())); + }); + }); + } +} diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml new file mode 100644 index 0000000000..ec22791351 --- /dev/null +++ b/java-spi/exchange-rate-impl/pom.xml @@ -0,0 +1,42 @@ + + 4.0.0 + + exchange-rate-impl + jar + + + com.baeldung + java-spi + 1.0.0-SNAPSHOT + + + + + com.baeldung + exchange-rate-api + 1.0.0-SNAPSHOT + + + com.squareup.okhttp3 + okhttp + 3.10.0 + + + javax.json.bind + javax.json.bind-api + 1.0 + + + org.eclipse + yasson + 1.0.1 + + + org.glassfish + javax.json + 1.1.2 + + + + diff --git a/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponse.java b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponse.java new file mode 100644 index 0000000000..9ba4fb26b0 --- /dev/null +++ b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponse.java @@ -0,0 +1,26 @@ +package com.baeldung.rate.impl; + +import com.baeldung.rate.api.Quote; + +import java.util.List; + +public class QuoteResponse { + private List result; + private String error; + + public List getResult() { + return result; + } + + public void setResult(List result) { + this.result = result; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } +} diff --git a/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponseWrapper.java b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponseWrapper.java new file mode 100644 index 0000000000..6d7be086f0 --- /dev/null +++ b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/QuoteResponseWrapper.java @@ -0,0 +1,13 @@ +package com.baeldung.rate.impl; + +public class QuoteResponseWrapper { + private QuoteResponse quoteResponse; + + public QuoteResponse getQuoteResponse() { + return quoteResponse; + } + + public void setQuoteResponse(QuoteResponse quoteResponse) { + this.quoteResponse = quoteResponse; + } +} diff --git a/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooFinanceExchangeRateProvider.java b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooFinanceExchangeRateProvider.java new file mode 100644 index 0000000000..9a069cfde4 --- /dev/null +++ b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooFinanceExchangeRateProvider.java @@ -0,0 +1,13 @@ +package com.baeldung.rate.impl; + +import com.baeldung.rate.api.QuoteManager; +import com.baeldung.rate.spi.ExchangeRateProvider; + +public class YahooFinanceExchangeRateProvider implements ExchangeRateProvider { + + @Override + public QuoteManager create() { + return new YahooQuoteManagerImpl(); + } + +} \ No newline at end of file diff --git a/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooQuoteManagerImpl.java b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooQuoteManagerImpl.java new file mode 100644 index 0000000000..8cc68259be --- /dev/null +++ b/java-spi/exchange-rate-impl/src/main/java/com/baeldung/rate/impl/YahooQuoteManagerImpl.java @@ -0,0 +1,65 @@ +package com.baeldung.rate.impl; + +import com.baeldung.rate.api.Quote; +import com.baeldung.rate.api.QuoteManager; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import javax.json.bind.JsonbBuilder; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.util.Currency; +import java.util.List; + +public class YahooQuoteManagerImpl implements QuoteManager { + + static final String URL_PROVIDER = "https://query1.finance.yahoo.com/v7/finance/quote"; + OkHttpClient client = new OkHttpClient(); + + @Override + public List getQuotes(String baseCurrency, LocalDate date) { + + StringBuilder sb = new StringBuilder(); + Currency.getAvailableCurrencies().forEach(currency -> { + if (!currency.equals(currency.getCurrencyCode())) { + sb.append(baseCurrency).append(currency.getCurrencyCode()).append("=X").append(","); + } + }); + + String value = ""; + try { + value = URLEncoder.encode(sb.toString().substring(0, sb.toString().length() - 1), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + String queryString = String.format("%s=%s", "symbols", value); + String response = doGetRequest(queryString); + System.out.println(response); + return map(response); + } + + private List map(String response) { + QuoteResponseWrapper qrw = JsonbBuilder.create().fromJson(response, QuoteResponseWrapper.class); + return qrw.getQuoteResponse().getResult(); + } + + String doGetRequest(String queryString) { + String fullUrl = URL_PROVIDER + "?" + queryString; + + System.out.println(fullUrl); + Request request = new Request.Builder() + .url(fullUrl) + .build(); + Response response = null; + try { + response = client.newCall(request).execute(); + return response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/java-spi/exchange-rate-impl/src/main/resources/META-INF/services/com.baeldung.rate.spi.ExchangeRateProvider b/java-spi/exchange-rate-impl/src/main/resources/META-INF/services/com.baeldung.rate.spi.ExchangeRateProvider new file mode 100644 index 0000000000..67ba8a8227 --- /dev/null +++ b/java-spi/exchange-rate-impl/src/main/resources/META-INF/services/com.baeldung.rate.spi.ExchangeRateProvider @@ -0,0 +1 @@ +com.baeldung.rate.impl.YahooFinanceExchangeRateProvider \ No newline at end of file diff --git a/java-spi/pom.xml b/java-spi/pom.xml new file mode 100644 index 0000000000..8eaa184d8d --- /dev/null +++ b/java-spi/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + + java-spi + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + exchange-rate-api + exchange-rate-impl + exchange-rate-app + + + diff --git a/patterns/template-method/pom.xml b/java-vavr-stream/pom.xml similarity index 70% rename from patterns/template-method/pom.xml rename to java-vavr-stream/pom.xml index c3b6a084ac..ca3807cd15 100644 --- a/patterns/template-method/pom.xml +++ b/java-vavr-stream/pom.xml @@ -1,8 +1,8 @@ 4.0.0 - com.baeldung.templatemethodpattern - templatemethodpattern + com.baeldung.samples + java-vavr-stream 1.0 jar @@ -12,10 +12,9 @@ - junit - junit - 4.12 - test + io.vavr + vavr + 0.9.2 \ No newline at end of file diff --git a/java-vavr-stream/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java b/java-vavr-stream/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java new file mode 100644 index 0000000000..d539342f69 --- /dev/null +++ b/java-vavr-stream/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java @@ -0,0 +1,98 @@ +package com.baeldung.samples.java.vavr; + +import io.vavr.collection.Stream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; + +/** + * + * @author baeldung + */ +public class VavrSampler { + + static int[] intArray = new int[]{1, 2, 4}; + static List intList = new ArrayList(); + static int[][] intOfInts = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + + public static void main(String[] args) { + vavrStreamElementAccess(); + System.out.println("===================================="); + vavrParallelStreamAccess(); + System.out.println("===================================="); + jdkFlatMapping(); + System.out.println("===================================="); + vavrStreamManipulation(); + System.out.println("===================================="); + vavrStreamDistinct(); + } + + public static void vavrStreamElementAccess() { + System.out.println("Vavr Element Access"); + System.out.println("===================================="); + Stream vavredStream = Stream.ofAll(intArray); + System.out.println("Vavr index access: " + vavredStream.get(2)); + System.out.println("Vavr head element access: " + vavredStream.get()); + + Stream vavredStringStream = Stream.of("foo", "bar", "baz"); + System.out.println("Find foo " + vavredStringStream.indexOf("foo")); + } + + public static void vavrParallelStreamAccess() { + try { + System.out.println("Vavr Stream Concurrent Modification"); + System.out.println("===================================="); + Stream vavrStream = Stream.ofAll(intList); + intList.add(5); + vavrStream.forEach(i -> System.out.println("in a Vavr Stream: " + i)); + } catch (Exception ex) { + ex.printStackTrace(); + } + + Stream wrapped = Stream.ofAll(intArray); + intArray[2] = 5; + wrapped.forEach(i -> System.out.println("Vavr looped " + i)); + } + + public static void jdkFlatMapping() { + System.out.println("JDK FlatMap -> Uncomment line 68 to test"); + System.out.println("===================================="); + int[][] intOfInts = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + + IntStream mapToInt = Arrays.stream(intOfInts) + .map(intArr -> Arrays.stream(intArr)) + .flatMapToInt(val -> val.map(n -> { + return n * n; + })) + .peek(n -> System.out.println("Peeking at " + n)); + //Uncomment to execute pipeline + //mapToInt.forEach(n -> System.out.println("FlatMapped Result "+n)); + } + + public static void vavrStreamManipulation() { + System.out.println("Vavr Stream Manipulation"); + System.out.println("===================================="); + List stringList = new ArrayList<>(); + stringList.add("foo"); + stringList.add("bar"); + stringList.add("baz"); + Stream vavredStream = Stream.ofAll(stringList); + vavredStream.forEach(item -> System.out.println("Vavr Stream item: " + item)); + Stream vavredStream2 = vavredStream.insert(2, "buzz"); + vavredStream2.forEach(item -> System.out.println("Vavr Stream item after stream addition: " + item)); + stringList.forEach(item -> System.out.println("List item after stream addition: " + item)); + Stream deletionStream = vavredStream.remove("bar"); + deletionStream.forEach(item -> System.out.println("Vavr Stream item after stream item deletion: " + item)); + + } + + public static void vavrStreamDistinct() { + Stream vavredStream = Stream.of("foo", "bar", "baz", "buxx", "bar", "bar", "foo"); + Stream distinctVavrStream = vavredStream.distinctBy((y, z) -> { + return y.compareTo(z); + }); + distinctVavrStream.forEach(item -> System.out.println("Vavr Stream item after distinct query " + item)); + + } +} diff --git a/javax-servlets/src/main/java/com/baeldung/controller/StudentServlet.java b/javax-servlets/src/main/java/com/baeldung/controller/StudentServlet.java new file mode 100644 index 0000000000..b1924198a4 --- /dev/null +++ b/javax-servlets/src/main/java/com/baeldung/controller/StudentServlet.java @@ -0,0 +1,39 @@ +package com.baeldung.controller; + +import com.baeldung.service.StudentService; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "StudentServlet", urlPatterns = "/student-record") +public class StudentServlet extends HttpServlet { + + private final StudentService studentService = new StudentService(); + + private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String studentID = request.getParameter("id"); + if (studentID != null) { + int id = Integer.parseInt(studentID); + studentService.getStudent(id) + .ifPresent(s -> request.setAttribute("studentRecord", s)); + } + + RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/student-record.jsp"); + dispatcher.forward(request, response); + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + processRequest(request, response); + } +} diff --git a/javax-servlets/src/main/java/com/baeldung/model/Student.java b/javax-servlets/src/main/java/com/baeldung/model/Student.java new file mode 100644 index 0000000000..ce8a27375a --- /dev/null +++ b/javax-servlets/src/main/java/com/baeldung/model/Student.java @@ -0,0 +1,39 @@ +package com.baeldung.model; + +public class Student { + + private int id; + private String firstName; + private String lastName; + + public Student(int id, String firstName, String lastName) { + super(); + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/javax-servlets/src/main/java/com/baeldung/service/StudentService.java b/javax-servlets/src/main/java/com/baeldung/service/StudentService.java new file mode 100644 index 0000000000..525d47683f --- /dev/null +++ b/javax-servlets/src/main/java/com/baeldung/service/StudentService.java @@ -0,0 +1,21 @@ +package com.baeldung.service; + +import com.baeldung.model.Student; + +import java.util.Optional; + +public class StudentService { + + public Optional getStudent(int id) { + switch (id) { + case 1: + return Optional.of(new Student(1, "John", "Doe")); + case 2: + return Optional.of(new Student(2, "Jane", "Goodall")); + case 3: + return Optional.of(new Student(3, "Max", "Born")); + default: + return Optional.empty(); + } + } +} diff --git a/javax-servlets/src/main/java/com/baeldung/servlets/FormServlet.java b/javax-servlets/src/main/java/com/baeldung/servlets/FormServlet.java index fcd9143dff..c78129a9cf 100644 --- a/javax-servlets/src/main/java/com/baeldung/servlets/FormServlet.java +++ b/javax-servlets/src/main/java/com/baeldung/servlets/FormServlet.java @@ -1,7 +1,6 @@ package com.baeldung.servlets; import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -13,7 +12,7 @@ public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + throws IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); @@ -25,23 +24,20 @@ public class FormServlet extends HttpServlet { response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); - RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); + RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { - response.sendRedirect("index.jsp"); } } @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) { // do something else here } private Double calculateBMI(Double weight, Double height) { - return weight / (height * height); } } \ No newline at end of file diff --git a/javax-servlets/web/index.jsp b/javax-servlets/src/main/webapp/WEB-INF/jsp/index.jsp similarity index 100% rename from javax-servlets/web/index.jsp rename to javax-servlets/src/main/webapp/WEB-INF/jsp/index.jsp diff --git a/javax-servlets/src/main/webapp/WEB-INF/jsp/student-record.jsp b/javax-servlets/src/main/webapp/WEB-INF/jsp/student-record.jsp new file mode 100644 index 0000000000..4b9d9b378f --- /dev/null +++ b/javax-servlets/src/main/webapp/WEB-INF/jsp/student-record.jsp @@ -0,0 +1,36 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + +<%@ page import="com.baeldung.model.Student"%> + + + + +Student Record + + + <% + if (request.getAttribute("studentRecord") != null) { + Student student = (Student) request.getAttribute("studentRecord"); + %> + +

Student Record

+
+ ID: + <%=student.getId()%>
+
+ First Name: + <%=student.getFirstName()%>
+
+ Last Name: + <%=student.getLastName()%>
+ + <% + } else { + %> +

No student record found.

+ <% + } + %> + + \ No newline at end of file diff --git a/javax-servlets/web/WEB-INF/web.xml b/javax-servlets/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from javax-servlets/web/WEB-INF/web.xml rename to javax-servlets/src/main/webapp/WEB-INF/web.xml diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 6a83a25f01..a05ee43aaf 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -6,10 +6,11 @@ 0.1-SNAPSHOT - 2.0.0.Final - 6.0.2.Final + 2.0.1.Final + 6.0.7.Final 3.0.0 2.2.6 + 5.0.2.RELEASE @@ -21,12 +22,6 @@ - - javax.validation - validation-api - ${validation-api.version} - - org.hibernate hibernate-validator @@ -50,6 +45,16 @@ javax.el ${javax.el.version} + + org.springframework + spring-context + ${org.springframework.version} + + + org.springframework + spring-test + ${org.springframework.version} + diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java new file mode 100644 index 0000000000..206a145337 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java @@ -0,0 +1,38 @@ +package org.baeldung.javaxval.methodvalidation; + +import org.baeldung.javaxval.methodvalidation.model.Customer; +import org.baeldung.javaxval.methodvalidation.model.Reservation; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; + +import java.time.LocalDate; + +@Configuration +@ComponentScan({ "org.baeldung.javaxval.methodvalidation.model" }) +public class MethodValidationConfig { + + @Bean + public MethodValidationPostProcessor methodValidationPostProcessor() { + return new MethodValidationPostProcessor(); + } + + @Bean("customer") + @Scope(BeanDefinition.SCOPE_PROTOTYPE) + public Customer customer(String firstName, String lastName) { + + Customer customer = new Customer(firstName, lastName); + return customer; + } + + @Bean("reservation") + @Scope(BeanDefinition.SCOPE_PROTOTYPE) + public Reservation reservation(LocalDate begin, LocalDate end, Customer customer, int room) { + + Reservation reservation = new Reservation(begin, end, customer, room); + return reservation; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java new file mode 100644 index 0000000000..f1c97760d7 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java @@ -0,0 +1,25 @@ +package org.baeldung.javaxval.methodvalidation.constraints; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import javax.validation.constraintvalidation.SupportedValidationTarget; +import javax.validation.constraintvalidation.ValidationTarget; +import java.time.LocalDate; + +@SupportedValidationTarget(ValidationTarget.PARAMETERS) +public class ConsistentDateParameterValidator implements ConstraintValidator { + + @Override + public boolean isValid(Object[] value, ConstraintValidatorContext context) { + + if (value[0] == null || value[1] == null) { + return true; + } + + if (!(value[0] instanceof LocalDate) || !(value[1] instanceof LocalDate)) { + throw new IllegalArgumentException("Illegal method signature, expected two parameters of type LocalDate."); + } + + return ((LocalDate) value[0]).isAfter(LocalDate.now()) && ((LocalDate) value[0]).isBefore((LocalDate) value[1]); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java new file mode 100644 index 0000000000..6b321f545c --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java @@ -0,0 +1,23 @@ +package org.baeldung.javaxval.methodvalidation.constraints; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Constraint(validatedBy = ConsistentDateParameterValidator.class) +@Target({ METHOD, CONSTRUCTOR }) +@Retention(RUNTIME) +@Documented +public @interface ConsistentDateParameters { + + String message() default "End date must be after begin date and both must be in the future"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java new file mode 100644 index 0000000000..f9cdea1483 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java @@ -0,0 +1,24 @@ +package org.baeldung.javaxval.methodvalidation.constraints; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Constraint(validatedBy = ValidReservationValidator.class) +@Target({ METHOD, CONSTRUCTOR }) +@Retention(RUNTIME) +@Documented +public @interface ValidReservation { + + String message() default "End date must be after begin date and both must be in the future, room number must be bigger than 0"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java new file mode 100644 index 0000000000..7b730480ed --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java @@ -0,0 +1,32 @@ +package org.baeldung.javaxval.methodvalidation.constraints; + +import org.baeldung.javaxval.methodvalidation.model.Reservation; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.time.LocalDate; + +public class ValidReservationValidator implements ConstraintValidator { + + @Override + public boolean isValid(Reservation reservation, ConstraintValidatorContext context) { + + if (reservation == null) { + return true; + } + + if (!(reservation instanceof Reservation)) { + throw new IllegalArgumentException("Illegal method signature, expected parameter of type Reservation."); + } + + if (reservation.getBegin() == null || reservation.getEnd() == null || reservation.getCustomer() == null) { + return false; + } + + return (reservation.getBegin() + .isAfter(LocalDate.now()) + && reservation.getBegin() + .isBefore(reservation.getEnd()) + && reservation.getRoom() > 0); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java new file mode 100644 index 0000000000..fe9ad7080e --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java @@ -0,0 +1,41 @@ +package org.baeldung.javaxval.methodvalidation.model; + +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Validated +public class Customer { + + @Size(min = 5, max = 200) + private String firstName; + + @Size(min = 5, max = 200) + private String lastName; + + public Customer(@Size(min = 5, max = 200) @NotNull String firstName, @Size(min = 5, max = 200) @NotNull String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Customer() { + + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java new file mode 100644 index 0000000000..a8c01d2be1 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java @@ -0,0 +1,64 @@ +package org.baeldung.javaxval.methodvalidation.model; + +import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters; +import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation; +import org.springframework.validation.annotation.Validated; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import java.time.LocalDate; + +@Validated +public class Reservation { + + private LocalDate begin; + + private LocalDate end; + + @Valid + private Customer customer; + + @Positive + private int room; + + @ConsistentDateParameters + @ValidReservation + public Reservation(LocalDate begin, LocalDate end, Customer customer, int room) { + this.begin = begin; + this.end = end; + this.customer = customer; + this.room = room; + } + + public LocalDate getBegin() { + return begin; + } + + public void setBegin(LocalDate begin) { + this.begin = begin; + } + + public LocalDate getEnd() { + return end; + } + + public void setEnd(LocalDate end) { + this.end = end; + } + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public int getRoom() { + return room; + } + + public void setRoom(int room) { + this.room = room; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java new file mode 100644 index 0000000000..f6fec1a15d --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java @@ -0,0 +1,50 @@ +package org.baeldung.javaxval.methodvalidation.model; + +import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters; +import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; + +import javax.validation.Valid; +import javax.validation.constraints.*; +import java.time.LocalDate; +import java.util.List; + +@Controller +@Validated +public class ReservationManagement { + + @Autowired + private ApplicationContext applicationContext; + + @ConsistentDateParameters + public void createReservation(LocalDate begin, LocalDate end, @NotNull Customer customer) { + + // ... + } + + public void createReservation(@NotNull @Future LocalDate begin, @Min(1) int duration, @NotNull Customer customer) { + + // ... + } + + public void createReservation(@Valid Reservation reservation) { + + // ... + } + + @NotNull + @Size(min = 1) + public List<@NotNull Customer> getAllCustomers() { + + return null; + } + + @Valid + public Reservation getReservationById(int id) { + + return null; + } +} diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java new file mode 100644 index 0000000000..2363bf8f5d --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java @@ -0,0 +1,97 @@ +package org.baeldung.javaxval.methodvalidation; + +import org.baeldung.javaxval.methodvalidation.model.Customer; +import org.baeldung.javaxval.methodvalidation.model.Reservation; +import org.baeldung.javaxval.methodvalidation.model.ReservationManagement; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import javax.validation.ConstraintViolationException; +import java.time.LocalDate; +import java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { MethodValidationConfig.class }, loader = AnnotationConfigContextLoader.class) +public class ContainerValidationIntegrationTest { + + @Autowired + ReservationManagement reservationManagement; + + @Rule + public final ExpectedException exception = ExpectedException.none(); + + @Test + public void whenValidationWithInvalidMethodParameters_thenConstraintViolationException() { + + exception.expect(ConstraintViolationException.class); + reservationManagement.createReservation(LocalDate.now(), 0, null); + } + + @Test + public void whenValidationWithValidMethodParameters_thenNoException() { + + reservationManagement.createReservation(LocalDate.now() + .plusDays(1), 1, new Customer("William", "Smith")); + } + + @Test + public void whenCrossParameterValidationWithInvalidParameters_thenConstraintViolationException() { + + exception.expect(ConstraintViolationException.class); + reservationManagement.createReservation(LocalDate.now(), LocalDate.now(), null); + } + + @Test + public void whenCrossParameterValidationWithValidParameters_thenNoException() { + + reservationManagement.createReservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + new Customer("William", "Smith")); + } + + @Test + public void whenValidationWithInvalidReturnValue_thenConstraintViolationException() { + + exception.expect(ConstraintViolationException.class); + List list = reservationManagement.getAllCustomers(); + } + + @Test + public void whenValidationWithInvalidCascadedValue_thenConstraintViolationException() { + + Customer customer = new Customer(); + customer.setFirstName("John"); + customer.setLastName("Doe"); + Reservation reservation = new Reservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + customer, 1); + + exception.expect(ConstraintViolationException.class); + reservationManagement.createReservation(reservation); + } + + @Test + public void whenValidationWithValidCascadedValue_thenCNoException() { + + Customer customer = new Customer(); + customer.setFirstName("William"); + customer.setLastName("Smith"); + Reservation reservation = new Reservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + customer, 1); + + reservationManagement.createReservation(reservation); + } +} diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java new file mode 100644 index 0000000000..6b53d3a107 --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java @@ -0,0 +1,209 @@ +package org.baeldung.javaxval.methodvalidation; + +import org.baeldung.javaxval.methodvalidation.model.Customer; +import org.baeldung.javaxval.methodvalidation.model.Reservation; +import org.baeldung.javaxval.methodvalidation.model.ReservationManagement; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.ValidatorFactory; +import javax.validation.executable.ExecutableValidator; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.time.LocalDate; +import java.util.Collections; +import java.util.Set; + +public class ValidationIntegrationTest { + + private ExecutableValidator executableValidator; + + @Before + public void getExecutableValidator() { + + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + this.executableValidator = factory.getValidator() + .forExecutables(); + } + + @Test + public void whenValidationWithInvalidMethodParameters_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", LocalDate.class, int.class, Customer.class); + Object[] parameterValues = { LocalDate.now(), 0, null }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(3, violations.size()); + } + + @Test + public void whenValidationWithValidMethodParameters_thenZeroVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", LocalDate.class, int.class, Customer.class); + Object[] parameterValues = { LocalDate.now() + .plusDays(1), 1, new Customer("John", "Doe") }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(0, violations.size()); + } + + @Test + public void whenCrossParameterValidationWithInvalidParameters_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", LocalDate.class, LocalDate.class, Customer.class); + Object[] parameterValues = { LocalDate.now(), LocalDate.now(), new Customer("John", "Doe") }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(1, violations.size()); + } + + @Test + public void whenCrossParameterValidationWithValidParameters_thenZeroVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", LocalDate.class, LocalDate.class, Customer.class); + Object[] parameterValues = { LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + new Customer("John", "Doe") }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(0, violations.size()); + } + + @Test + public void whenValidationWithInvalidConstructorParameters_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + Constructor constructor = Customer.class.getConstructor(String.class, String.class); + Object[] parameterValues = { "John", "Doe" }; + Set> violations = executableValidator.validateConstructorParameters(constructor, parameterValues); + + assertEquals(2, violations.size()); + } + + @Test + public void whenValidationWithValidConstructorParameters_thenZeroVoilations() throws NoSuchMethodException { + + Constructor constructor = Customer.class.getConstructor(String.class, String.class); + Object[] parameterValues = { "William", "Smith" }; + Set> violations = executableValidator.validateConstructorParameters(constructor, parameterValues); + + assertEquals(0, violations.size()); + } + + @Test + public void whenCrossParameterValidationWithInvalidConstructorParameters_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + Constructor constructor = Reservation.class.getConstructor(LocalDate.class, LocalDate.class, Customer.class, int.class); + Object[] parameterValues = { LocalDate.now(), LocalDate.now(), new Customer("William", "Smith"), 1 }; + Set> violations = executableValidator.validateConstructorParameters(constructor, parameterValues); + + assertEquals(1, violations.size()); + } + + @Test + public void whenCrossParameterValidationWithValidConstructorParameters_thenZeroVoilations() throws NoSuchMethodException { + + Constructor constructor = Reservation.class.getConstructor(LocalDate.class, LocalDate.class, Customer.class, int.class); + Object[] parameterValues = { LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + new Customer("William", "Smith"), 1 }; + Set> violations = executableValidator.validateConstructorParameters(constructor, parameterValues); + + assertEquals(0, violations.size()); + } + + @Test + public void whenValidationWithInvalidReturnValue_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("getAllCustomers"); + Object returnValue = Collections. emptyList(); + Set> violations = executableValidator.validateReturnValue(object, method, returnValue); + + assertEquals(1, violations.size()); + } + + @Test + public void whenValidationWithValidReturnValue_thenZeroVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("getAllCustomers"); + Object returnValue = Collections.singletonList(new Customer("William", "Smith")); + Set> violations = executableValidator.validateReturnValue(object, method, returnValue); + + assertEquals(0, violations.size()); + } + + @Test + public void whenValidationWithInvalidConstructorReturnValue_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + Constructor constructor = Reservation.class.getConstructor(LocalDate.class, LocalDate.class, Customer.class, int.class); + Reservation createdObject = new Reservation(LocalDate.now(), LocalDate.now(), new Customer("William", "Smith"), 0); + Set> violations = executableValidator.validateConstructorReturnValue(constructor, createdObject); + + assertEquals(1, violations.size()); + } + + @Test + public void whenValidationWithValidConstructorReturnValue_thenZeroVoilations() throws NoSuchMethodException { + + Constructor constructor = Reservation.class.getConstructor(LocalDate.class, LocalDate.class, Customer.class, int.class); + Reservation createdObject = new Reservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + new Customer("William", "Smith"), 1); + Set> violations = executableValidator.validateConstructorReturnValue(constructor, createdObject); + + assertEquals(0, violations.size()); + } + + @Test + public void whenValidationWithInvalidCascadedValue_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", Reservation.class); + Customer customer = new Customer(); + customer.setFirstName("John"); + customer.setLastName("Doe"); + Reservation reservation = new Reservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + customer, 1); + Object[] parameterValues = { reservation }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(2, violations.size()); + } + + @Test + public void whenValidationWithValidCascadedValue_thenCorrectNumberOfVoilations() throws NoSuchMethodException { + + ReservationManagement object = new ReservationManagement(); + Method method = ReservationManagement.class.getMethod("createReservation", Reservation.class); + Customer customer = new Customer(); + customer.setFirstName("William"); + customer.setLastName("Smith"); + Reservation reservation = new Reservation(LocalDate.now() + .plusDays(1), + LocalDate.now() + .plusDays(2), + customer, 1); + Object[] parameterValues = { reservation }; + Set> violations = executableValidator.validateParameters(object, method, parameterValues); + + assertEquals(0, violations.size()); + } + +} diff --git a/jee7/.gitignore b/jee-7/.gitignore similarity index 100% rename from jee7/.gitignore rename to jee-7/.gitignore diff --git a/jee7/README.md b/jee-7/README.md similarity index 100% rename from jee7/README.md rename to jee-7/README.md diff --git a/jee7/pom.xml b/jee-7/pom.xml similarity index 99% rename from jee7/pom.xml rename to jee-7/pom.xml index 6858a05d17..f1d50f55c6 100644 --- a/jee7/pom.xml +++ b/jee-7/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.baeldung - jee7 + jee-7 1.0-SNAPSHOT war JavaEE 7 Arquillian Archetype Sample diff --git a/jee7/src/main/java/com/baeldung/arquillian/CapsConvertor.java b/jee-7/src/main/java/com/baeldung/arquillian/CapsConvertor.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/CapsConvertor.java rename to jee-7/src/main/java/com/baeldung/arquillian/CapsConvertor.java diff --git a/jee7/src/main/java/com/baeldung/arquillian/CapsService.java b/jee-7/src/main/java/com/baeldung/arquillian/CapsService.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/CapsService.java rename to jee-7/src/main/java/com/baeldung/arquillian/CapsService.java diff --git a/jee7/src/main/java/com/baeldung/arquillian/Car.java b/jee-7/src/main/java/com/baeldung/arquillian/Car.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/Car.java rename to jee-7/src/main/java/com/baeldung/arquillian/Car.java diff --git a/jee7/src/main/java/com/baeldung/arquillian/CarEJB.java b/jee-7/src/main/java/com/baeldung/arquillian/CarEJB.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/CarEJB.java rename to jee-7/src/main/java/com/baeldung/arquillian/CarEJB.java diff --git a/jee7/src/main/java/com/baeldung/arquillian/Component.java b/jee-7/src/main/java/com/baeldung/arquillian/Component.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/Component.java rename to jee-7/src/main/java/com/baeldung/arquillian/Component.java diff --git a/jee7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java b/jee-7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java similarity index 100% rename from jee7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java rename to jee-7/src/main/java/com/baeldung/arquillian/ConvertToLowerCase.java diff --git a/jee7/src/main/java/com/baeldung/convListVal/ConvListVal.java b/jee-7/src/main/java/com/baeldung/convListVal/ConvListVal.java similarity index 100% rename from jee7/src/main/java/com/baeldung/convListVal/ConvListVal.java rename to jee-7/src/main/java/com/baeldung/convListVal/ConvListVal.java diff --git a/jee7/src/main/java/com/baeldung/convListVal/MyListener.java b/jee-7/src/main/java/com/baeldung/convListVal/MyListener.java similarity index 100% rename from jee7/src/main/java/com/baeldung/convListVal/MyListener.java rename to jee-7/src/main/java/com/baeldung/convListVal/MyListener.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml similarity index 94% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml index b4bb243559..de69efa43a 100644 --- a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml +++ b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml @@ -34,10 +34,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.2 + 3.7.0 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/LogInFilter.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp similarity index 100% rename from jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp rename to jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/AddEmployeeResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java b/jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployees.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/CountEmployeesResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/DeleteEmployeeResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/Employee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/Employee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/Employee.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/Employee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeAlreadyExists_Exception.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeNotFound_Exception.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeServiceClient.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java b/jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/EmployeeService_Service.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployees.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetAllEmployeesResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/GetEmployeeResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/ObjectFactory.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java b/jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java b/jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/UpdateEmployeeResponse.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/client/package-info.java b/jee-7/src/main/java/com/baeldung/jaxws/client/package-info.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/client/package-info.java rename to jee-7/src/main/java/com/baeldung/jaxws/client/package-info.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeService.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/EmployeeServiceImpl.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeAlreadyExists.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/exception/EmployeeNotFound.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java b/jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/bottomup/model/Employee.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java b/jee-7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/config/EmployeeServicePublisher.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java b/jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepository.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/repository/EmployeeRepositoryImpl.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDownImpl.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/EmployeeServiceTopDown_Service.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java b/jee-7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java rename to jee-7/src/main/java/com/baeldung/jaxws/server/topdown/ObjectFactory.java diff --git a/jee7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl b/jee-7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl similarity index 100% rename from jee7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl rename to jee-7/src/main/java/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl diff --git a/jee7/src/main/java/com/baeldung/json/Person.java b/jee-7/src/main/java/com/baeldung/json/Person.java similarity index 100% rename from jee7/src/main/java/com/baeldung/json/Person.java rename to jee-7/src/main/java/com/baeldung/json/Person.java diff --git a/jee7/src/main/java/com/baeldung/json/PersonBuilder.java b/jee-7/src/main/java/com/baeldung/json/PersonBuilder.java similarity index 100% rename from jee7/src/main/java/com/baeldung/json/PersonBuilder.java rename to jee-7/src/main/java/com/baeldung/json/PersonBuilder.java diff --git a/jee7/src/main/java/com/baeldung/json/PersonWriter.java b/jee-7/src/main/java/com/baeldung/json/PersonWriter.java similarity index 100% rename from jee7/src/main/java/com/baeldung/json/PersonWriter.java rename to jee-7/src/main/java/com/baeldung/json/PersonWriter.java diff --git a/jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java similarity index 100% rename from jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java rename to jee-7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java b/jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java similarity index 100% rename from jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java rename to jee-7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java b/jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java similarity index 100% rename from jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java rename to jee-7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java similarity index 100% rename from jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java rename to jee-7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java b/jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java similarity index 100% rename from jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java rename to jee-7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java diff --git a/jee7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/AutomaticTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/FixedDelayTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/ProgrammaticWithInitialFixedDelayTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java b/jee-7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java rename to jee-7/src/main/java/com/baeldung/timer/ScheduleTimerBean.java diff --git a/jee7/src/main/java/com/baeldung/timer/TimerEvent.java b/jee-7/src/main/java/com/baeldung/timer/TimerEvent.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/TimerEvent.java rename to jee-7/src/main/java/com/baeldung/timer/TimerEvent.java diff --git a/jee7/src/main/java/com/baeldung/timer/TimerEventListener.java b/jee-7/src/main/java/com/baeldung/timer/TimerEventListener.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/TimerEventListener.java rename to jee-7/src/main/java/com/baeldung/timer/TimerEventListener.java diff --git a/jee7/src/main/java/com/baeldung/timer/WorkerBean.java b/jee-7/src/main/java/com/baeldung/timer/WorkerBean.java similarity index 100% rename from jee7/src/main/java/com/baeldung/timer/WorkerBean.java rename to jee-7/src/main/java/com/baeldung/timer/WorkerBean.java diff --git a/jee7/src/main/resources/META-INF/persistence.xml b/jee-7/src/main/resources/META-INF/persistence.xml similarity index 100% rename from jee7/src/main/resources/META-INF/persistence.xml rename to jee-7/src/main/resources/META-INF/persistence.xml diff --git a/jee7/src/main/webapp/ConvListVal.xhtml b/jee-7/src/main/webapp/ConvListVal.xhtml similarity index 100% rename from jee7/src/main/webapp/ConvListVal.xhtml rename to jee-7/src/main/webapp/ConvListVal.xhtml diff --git a/jee-7/src/main/webapp/WEB-INF/beans.xml b/jee-7/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/jee7/src/main/webapp/WEB-INF/faces-config.xml b/jee-7/src/main/webapp/WEB-INF/faces-config.xml similarity index 100% rename from jee7/src/main/webapp/WEB-INF/faces-config.xml rename to jee-7/src/main/webapp/WEB-INF/faces-config.xml diff --git a/jee7/src/main/webapp/WEB-INF/spring/security.xml b/jee-7/src/main/webapp/WEB-INF/spring/security.xml similarity index 100% rename from jee7/src/main/webapp/WEB-INF/spring/security.xml rename to jee-7/src/main/webapp/WEB-INF/spring/security.xml diff --git a/jee7/src/main/webapp/WEB-INF/views/admin.jsp b/jee-7/src/main/webapp/WEB-INF/views/admin.jsp similarity index 100% rename from jee7/src/main/webapp/WEB-INF/views/admin.jsp rename to jee-7/src/main/webapp/WEB-INF/views/admin.jsp diff --git a/jee7/src/main/webapp/WEB-INF/views/home.jsp b/jee-7/src/main/webapp/WEB-INF/views/home.jsp similarity index 100% rename from jee7/src/main/webapp/WEB-INF/views/home.jsp rename to jee-7/src/main/webapp/WEB-INF/views/home.jsp diff --git a/jee7/src/main/webapp/WEB-INF/views/login.jsp b/jee-7/src/main/webapp/WEB-INF/views/login.jsp similarity index 100% rename from jee7/src/main/webapp/WEB-INF/views/login.jsp rename to jee-7/src/main/webapp/WEB-INF/views/login.jsp diff --git a/jee7/src/main/webapp/WEB-INF/views/user.jsp b/jee-7/src/main/webapp/WEB-INF/views/user.jsp similarity index 100% rename from jee7/src/main/webapp/WEB-INF/views/user.jsp rename to jee-7/src/main/webapp/WEB-INF/views/user.jsp diff --git a/jee7/src/main/webapp/WEB-INF/web.xml b/jee-7/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from jee7/src/main/webapp/WEB-INF/web.xml rename to jee-7/src/main/webapp/WEB-INF/web.xml diff --git a/jee7/src/main/webapp/index.jsp b/jee-7/src/main/webapp/index.jsp similarity index 100% rename from jee7/src/main/webapp/index.jsp rename to jee-7/src/main/webapp/index.jsp diff --git a/jee7/src/main/webapp/secure.jsp b/jee-7/src/main/webapp/secure.jsp similarity index 100% rename from jee7/src/main/webapp/secure.jsp rename to jee-7/src/main/webapp/secure.jsp diff --git a/jee7/src/test/java/com/baeldug/json/JsonUnitTest.java b/jee-7/src/test/java/com/baeldug/json/JsonUnitTest.java similarity index 100% rename from jee7/src/test/java/com/baeldug/json/JsonUnitTest.java rename to jee-7/src/test/java/com/baeldug/json/JsonUnitTest.java diff --git a/jee7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java b/jee-7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java rename to jee-7/src/test/java/com/baeldung/arquillan/ArquillianLiveTest.java diff --git a/jee7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java b/jee-7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/convListVal/ConvListValIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java b/jee-7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java rename to jee-7/src/test/java/com/baeldung/jaxws/EmployeeServiceLiveTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/timer/AutomaticTimerBeanIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticAtFixedRateTimerBeanIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticTimerBeanIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/timer/ProgrammaticWithFixedDelayTimerBeanIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java b/jee-7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java rename to jee-7/src/test/java/com/baeldung/timer/ScheduleTimerBeanIntegrationTest.java diff --git a/jee7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java b/jee-7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java similarity index 100% rename from jee7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java rename to jee-7/src/test/java/com/baeldung/timer/WithinWindowMatcher.java diff --git a/jee7/src/test/resources/META-INF/persistence.xml b/jee-7/src/test/resources/META-INF/persistence.xml similarity index 100% rename from jee7/src/test/resources/META-INF/persistence.xml rename to jee-7/src/test/resources/META-INF/persistence.xml diff --git a/jenkins/README.md b/jenkins/README.md new file mode 100644 index 0000000000..da60e556df --- /dev/null +++ b/jenkins/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin) diff --git a/jenkins/hello-world/pom.xml b/jenkins/hello-world/pom.xml new file mode 100644 index 0000000000..15cf2f8e34 --- /dev/null +++ b/jenkins/hello-world/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + org.jenkins-ci.plugins + plugin + 2.33 + + + jenkins-hello-world + 1.0-SNAPSHOT + hpi + + + 2.7.3 + + Hello World Plugin + A sample Jenkins Hello World plugin + https://wiki.jenkins-ci.org/display/JENKINS/TODO+Plugin + + + MIT License + http://opensource.org/licenses/MIT + + + + + org.jenkins-ci.plugins + structs + 1.7 + + + org.jenkins-ci.plugins.workflow + workflow-step-api + 2.12 + test + + + org.jenkins-ci.plugins.workflow + workflow-cps + 2.39 + test + + + org.jenkins-ci.plugins.workflow + workflow-job + 2.11.2 + test + + + org.jenkins-ci.plugins.workflow + workflow-basic-steps + 2.6 + test + + + org.jenkins-ci.plugins.workflow + workflow-durable-task-step + 2.13 + test + + + org.jenkins-ci.plugins.workflow + workflow-api + 2.20 + test + + + org.jenkins-ci.plugins.workflow + workflow-support + 2.14 + test + + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java b/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java new file mode 100644 index 0000000000..67af636bb4 --- /dev/null +++ b/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java @@ -0,0 +1,20 @@ +package com.baeldung.jenkins.helloworld; + +public class ProjectStats { + + private final int classesNumber; + private final int linesNumber; + + public ProjectStats(int classesNumber, int linesNumber) { + this.classesNumber = classesNumber; + this.linesNumber = linesNumber; + } + + public int getClassesNumber() { + return classesNumber; + } + + public int getLinesNumber() { + return linesNumber; + } +} diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java b/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java new file mode 100644 index 0000000000..9a7213c76f --- /dev/null +++ b/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java @@ -0,0 +1,123 @@ +package com.baeldung.jenkins.helloworld; + +import hudson.Extension; +import hudson.FilePath; +import hudson.Launcher; +import hudson.model.AbstractBuild; +import hudson.model.AbstractProject; +import hudson.model.BuildListener; +import hudson.tasks.BuildWrapper; +import hudson.tasks.BuildWrapperDescriptor; +import org.kohsuke.stapler.DataBoundConstructor; + +import javax.annotation.Nonnull; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Stack; + +public class ProjectStatsBuildWrapper extends BuildWrapper { + + private static final String REPORT_TEMPLATE_PATH = "/stats.html"; + private static final String PROJECT_NAME_VAR = "$PROJECT_NAME$"; + private static final String CLASSES_NUMBER_VAR = "$CLASSES_NUMBER$"; + private static final String LINES_NUMBER_VAR = "$LINES_NUMBER$"; + + @DataBoundConstructor + public ProjectStatsBuildWrapper() { + } + + @Override + public Environment setUp(AbstractBuild build, final Launcher launcher, BuildListener listener) { + return new Environment() { + @Override + public boolean tearDown(AbstractBuild build, BuildListener listener) + throws IOException, InterruptedException + { + ProjectStats stats = buildStats(build.getWorkspace()); + String report = generateReport(build.getProject().getDisplayName(), stats); + File artifactsDir = build.getArtifactsDir(); + if (!artifactsDir.isDirectory()) { + boolean success = artifactsDir.mkdirs(); + if (!success) { + listener.getLogger().println("Can't create artifacts directory at " + + artifactsDir.getAbsolutePath()); + } + } + String path = artifactsDir.getCanonicalPath() + REPORT_TEMPLATE_PATH; + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), + StandardCharsets.UTF_8))) { + writer.write(report); + } + return super.tearDown(build, listener); + } + }; + } + + private static ProjectStats buildStats(FilePath root) throws IOException, InterruptedException { + int classesNumber = 0; + int linesNumber = 0; + Stack toProcess = new Stack<>(); + toProcess.push(root); + while (!toProcess.isEmpty()) { + FilePath path = toProcess.pop(); + if (path.isDirectory()) { + toProcess.addAll(path.list()); + } else if (path.getName().endsWith(".java")) { + classesNumber++; + linesNumber += countLines(path); + } + } + return new ProjectStats(classesNumber, linesNumber); + } + + private static int countLines(FilePath path) throws IOException, InterruptedException { + byte[] buffer = new byte[1024]; + int result = 1; + try (InputStream in = path.read()) { + while (true) { + int read = in.read(buffer); + if (read < 0) { + return result; + } + for (int i = 0; i < read; i++) { + if (buffer[i] == '\n') { + result++; + } + } + } + } + } + + private static String generateReport(String projectName, ProjectStats stats) throws IOException { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + try (InputStream in = ProjectStatsBuildWrapper.class.getResourceAsStream(REPORT_TEMPLATE_PATH)) { + byte[] buffer = new byte[1024]; + int read; + while ((read = in.read(buffer)) >= 0) { + bOut.write(buffer, 0, read); + } + } + String content = new String(bOut.toByteArray(), StandardCharsets.UTF_8); + content = content.replace(PROJECT_NAME_VAR, projectName); + content = content.replace(CLASSES_NUMBER_VAR, String.valueOf(stats.getClassesNumber())); + content = content.replace(LINES_NUMBER_VAR, String.valueOf(stats.getLinesNumber())); + return content; + } + + @Extension + public static final class DescriptorImpl extends BuildWrapperDescriptor { + + @Override + public boolean isApplicable(AbstractProject item) { + return true; + } + + @Nonnull + @Override + public String getDisplayName() { + return "Construct project stats during build"; + } + + } + +} diff --git a/jenkins/hello-world/src/main/resources/stats.html b/jenkins/hello-world/src/main/resources/stats.html new file mode 100644 index 0000000000..2a14b5de3f --- /dev/null +++ b/jenkins/hello-world/src/main/resources/stats.html @@ -0,0 +1,20 @@ + + + + + $PROJECT_NAME$ + + +Project $PROJECT_NAME$: + + + + + + + + + +
Classes numberLines number
$CLASSES_NUMBER$$LINES_NUMBER$
+ + \ No newline at end of file diff --git a/jersey/pom.xml b/jersey/pom.xml new file mode 100644 index 0000000000..0c8b6b9281 --- /dev/null +++ b/jersey/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.baeldung + jersey + 0.0.1-SNAPSHOT + war + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + 2.26 + 1.7.25 + 3.2.0 + + + + jersey + + + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + + + + + org.glassfish.jersey.core + jersey-server + ${jersey.version} + + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + + + org.glassfish.jersey.bundles + jaxrs-ri + ${jersey.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + + + diff --git a/jersey/src/main/java/com/baeldung/jersey/client/JerseyClient.java b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClient.java new file mode 100644 index 0000000000..88ad891411 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClient.java @@ -0,0 +1,45 @@ +package com.baeldung.jersey.client; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.Response; + +import org.glassfish.jersey.client.ClientConfig; + +import com.baeldung.jersey.client.filter.RequestClientFilter; +import com.baeldung.jersey.client.filter.ResponseClientFilter; +import com.baeldung.jersey.client.interceptor.RequestClientWriterInterceptor; + +public class JerseyClient { + + private static final String URI_GREETINGS = "http://localhost:8080/jersey/greetings"; + + public static String getHelloGreeting() { + return createClient().target(URI_GREETINGS) + .request() + .get(String.class); + } + + public static String getHiGreeting() { + return createClient().target(URI_GREETINGS + "/hi") + .request() + .get(String.class); + } + + public static Response getCustomGreeting() { + return createClient().target(URI_GREETINGS + "/custom") + .request() + .post(Entity.text("custom")); + } + + private static Client createClient() { + ClientConfig config = new ClientConfig(); + config.register(RequestClientFilter.class); + config.register(ResponseClientFilter.class); + config.register(RequestClientWriterInterceptor.class); + + return ClientBuilder.newClient(config); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/client/filter/RequestClientFilter.java b/jersey/src/main/java/com/baeldung/jersey/client/filter/RequestClientFilter.java new file mode 100644 index 0000000000..8c6ac2c5fb --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/filter/RequestClientFilter.java @@ -0,0 +1,24 @@ +package com.baeldung.jersey.client.filter; + +import java.io.IOException; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.ext.Provider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +public class RequestClientFilter implements ClientRequestFilter { + + private static final Logger LOG = LoggerFactory.getLogger(RequestClientFilter.class); + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + LOG.info("Request client filter"); + + requestContext.setProperty("test", "test client request filter"); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/client/filter/ResponseClientFilter.java b/jersey/src/main/java/com/baeldung/jersey/client/filter/ResponseClientFilter.java new file mode 100644 index 0000000000..1676fa2094 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/filter/ResponseClientFilter.java @@ -0,0 +1,26 @@ +package com.baeldung.jersey.client.filter; + +import java.io.IOException; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.ext.Provider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +public class ResponseClientFilter implements ClientResponseFilter { + + private static final Logger LOG = LoggerFactory.getLogger(ResponseClientFilter.class); + + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { + LOG.info("Response client filter"); + + responseContext.getHeaders() + .add("X-Test-Client", "Test response client filter"); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/client/interceptor/RequestClientWriterInterceptor.java b/jersey/src/main/java/com/baeldung/jersey/client/interceptor/RequestClientWriterInterceptor.java new file mode 100644 index 0000000000..7216cf18cc --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/interceptor/RequestClientWriterInterceptor.java @@ -0,0 +1,28 @@ +package com.baeldung.jersey.client.interceptor; + +import java.io.IOException; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.ext.Provider; +import javax.ws.rs.ext.WriterInterceptor; +import javax.ws.rs.ext.WriterInterceptorContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +public class RequestClientWriterInterceptor implements WriterInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(RequestClientWriterInterceptor.class); + + @Override + public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { + LOG.info("request writer interceptor in the client side"); + + context.getOutputStream() + .write(("Message added in the writer interceptor in the client side").getBytes()); + + context.proceed(); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/Greetings.java b/jersey/src/main/java/com/baeldung/jersey/server/Greetings.java new file mode 100644 index 0000000000..d0ea873db1 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/Greetings.java @@ -0,0 +1,32 @@ +package com.baeldung.jersey.server; + +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import com.baeldung.jersey.server.config.HelloBinding; + +@Path("/greetings") +public class Greetings { + + @GET + @HelloBinding + public String getHelloGreeting() { + return "hello"; + } + + @GET + @Path("/hi") + public String getHiGreeting() { + return "hi"; + } + + @POST + @Path("/custom") + public Response getCustomGreeting(String name) { + return Response.status(Status.OK.getStatusCode()) + .build(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/config/HelloBinding.java b/jersey/src/main/java/com/baeldung/jersey/server/config/HelloBinding.java new file mode 100644 index 0000000000..49b11adeab --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/config/HelloBinding.java @@ -0,0 +1,11 @@ +package com.baeldung.jersey.server.config; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.ws.rs.NameBinding; + +@NameBinding +@Retention(RetentionPolicy.RUNTIME) +public @interface HelloBinding { +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/config/HelloDynamicBinding.java b/jersey/src/main/java/com/baeldung/jersey/server/config/HelloDynamicBinding.java new file mode 100644 index 0000000000..e56cdec140 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/config/HelloDynamicBinding.java @@ -0,0 +1,31 @@ +package com.baeldung.jersey.server.config; + +import javax.ws.rs.container.DynamicFeature; +import javax.ws.rs.container.ResourceInfo; +import javax.ws.rs.core.FeatureContext; +import javax.ws.rs.ext.Provider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.jersey.server.Greetings; +import com.baeldung.jersey.server.filter.ResponseServerFilter; + +@Provider +public class HelloDynamicBinding implements DynamicFeature { + + private static final Logger LOG = LoggerFactory.getLogger(HelloDynamicBinding.class); + + @Override + public void configure(ResourceInfo resourceInfo, FeatureContext context) { + LOG.info("Hello dynamic binding"); + + if (Greetings.class.equals(resourceInfo.getResourceClass()) && resourceInfo.getResourceMethod() + .getName() + .contains("HiGreeting")) { + context.register(ResponseServerFilter.class); + } + + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/config/ServerConfig.java b/jersey/src/main/java/com/baeldung/jersey/server/config/ServerConfig.java new file mode 100644 index 0000000000..4670cc291c --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/config/ServerConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.jersey.server.config; + +import javax.ws.rs.ApplicationPath; + +import org.glassfish.jersey.server.ResourceConfig; + +@ApplicationPath("/*") +public class ServerConfig extends ResourceConfig { + + public ServerConfig() { + packages("com.baeldung.jersey.server"); + } + +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/filter/PrematchingRequestFilter.java b/jersey/src/main/java/com/baeldung/jersey/server/filter/PrematchingRequestFilter.java new file mode 100644 index 0000000000..181fa7f043 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/filter/PrematchingRequestFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.jersey.server.filter; + +import java.io.IOException; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.ext.Provider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +@PreMatching +public class PrematchingRequestFilter implements ContainerRequestFilter { + + private static final Logger LOG = LoggerFactory.getLogger(PrematchingRequestFilter.class); + + @Override + public void filter(ContainerRequestContext ctx) throws IOException { + LOG.info("prematching filter"); + if (ctx.getMethod() + .equals("DELETE")) { + LOG.info("\"Deleting request"); + } + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/filter/ResponseServerFilter.java b/jersey/src/main/java/com/baeldung/jersey/server/filter/ResponseServerFilter.java new file mode 100644 index 0000000000..de0dcbdce7 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/filter/ResponseServerFilter.java @@ -0,0 +1,23 @@ +package com.baeldung.jersey.server.filter; + +import java.io.IOException; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ResponseServerFilter implements ContainerResponseFilter { + + private static final Logger LOG = LoggerFactory.getLogger(ResponseServerFilter.class); + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { + LOG.info("Response server filter"); + + responseContext.getHeaders() + .add("X-Test", "Filter test"); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/filter/RestrictedOperationsRequestFilter.java b/jersey/src/main/java/com/baeldung/jersey/server/filter/RestrictedOperationsRequestFilter.java new file mode 100644 index 0000000000..cb0cd185f7 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/filter/RestrictedOperationsRequestFilter.java @@ -0,0 +1,36 @@ +package com.baeldung.jersey.server.filter; + +import java.io.IOException; + +import javax.annotation.Priority; +import javax.ws.rs.Priorities; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.Provider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.jersey.server.config.HelloBinding; + +@Provider +@Priority(Priorities.AUTHORIZATION) +@HelloBinding +public class RestrictedOperationsRequestFilter implements ContainerRequestFilter { + + private static final Logger LOG = LoggerFactory.getLogger(RestrictedOperationsRequestFilter.class); + + @Override + public void filter(ContainerRequestContext ctx) throws IOException { + LOG.info("Restricted operations filter"); + if (ctx.getLanguage() != null && "EN".equals(ctx.getLanguage() + .getLanguage())) { + LOG.info("Aborting request"); + ctx.abortWith(Response.status(Response.Status.FORBIDDEN) + .entity("Cannot access") + .build()); + } + + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/interceptor/RequestServerReaderInterceptor.java b/jersey/src/main/java/com/baeldung/jersey/server/interceptor/RequestServerReaderInterceptor.java new file mode 100644 index 0000000000..e9cc57fc2a --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/interceptor/RequestServerReaderInterceptor.java @@ -0,0 +1,36 @@ +package com.baeldung.jersey.server.interceptor; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.ext.Provider; +import javax.ws.rs.ext.ReaderInterceptor; +import javax.ws.rs.ext.ReaderInterceptorContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Provider +public class RequestServerReaderInterceptor implements ReaderInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(RequestServerReaderInterceptor.class); + + @Override + public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException { + LOG.info("Request reader interceptor in the server side"); + + InputStream is = context.getInputStream(); + String body = new BufferedReader(new InputStreamReader(is)).lines() + .collect(Collectors.joining("\n")); + + context.setInputStream(new ByteArrayInputStream((body + " message added in server reader interceptor").getBytes())); + + return context.proceed(); + } + +} diff --git a/jersey/src/main/resources/logback.xml b/jersey/src/main/resources/logback.xml new file mode 100644 index 0000000000..d87a87bf53 --- /dev/null +++ b/jersey/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + \ No newline at end of file diff --git a/jersey/src/test/java/com/baeldung/jersey/client/JerseyClientTest.java b/jersey/src/test/java/com/baeldung/jersey/client/JerseyClientTest.java new file mode 100644 index 0000000000..72ba4cc5b9 --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/client/JerseyClientTest.java @@ -0,0 +1,35 @@ +package com.baeldung.jersey.client; + +import javax.ws.rs.core.Response; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore +public class JerseyClientTest { + + private static int HTTP_OK = 200; + + @Test + public void givenGreetingResource_whenCallingHelloGreeting_thenHelloReturned() { + String response = JerseyClient.getHelloGreeting(); + + Assert.assertEquals("hello", response); + } + + @Test + public void givenGreetingResource_whenCallingHiGreeting_thenHiReturned() { + String response = JerseyClient.getHiGreeting(); + + Assert.assertEquals("hi", response); + } + + @Test + public void givenGreetingResource_whenCallingCustomGreeting_thenCustomGreetingReturned() { + Response response = JerseyClient.getCustomGreeting(); + + Assert.assertEquals(HTTP_OK, response.getStatus()); + } + +} diff --git a/jgroups/README.md b/jgroups/README.md new file mode 100644 index 0000000000..bb2813c3d6 --- /dev/null +++ b/jgroups/README.md @@ -0,0 +1,15 @@ +## Reliable Messaging with JGroups Tutorial Project + +### Relevant Article: +- [Reliable Messaging with JGroups](http://www.baeldung.com/reliable-messaging-with-jgroups/) + +### Overview +This Maven project contains the Java code for the article linked above. + +### Package Organization +Java classes for the intro tutorial are in the org.baeldung.jgroups package. + + +### Running the tests + +``` diff --git a/jgroups/pom.xml b/jgroups/pom.xml new file mode 100644 index 0000000000..0e5971875e --- /dev/null +++ b/jgroups/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + jgroups + 0.1-SNAPSHOT + jar + jgroups + Reliable Messaging with JGroups Tutorial + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.jgroups + jgroups + 4.0.10.Final + + + + commons-cli + commons-cli + 1.4 + + + + + 1.8 + UTF-8 + + + diff --git a/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java b/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java new file mode 100644 index 0000000000..70eacabf1e --- /dev/null +++ b/jgroups/src/main/java/com/baeldung/jgroups/JGroupsMessenger.java @@ -0,0 +1,212 @@ +package com.baeldung.jgroups; + +import org.apache.commons.cli.*; +import org.jgroups.*; +import org.jgroups.util.Util; + +import java.io.*; +import java.util.List; +import java.util.Optional; + +public class JGroupsMessenger extends ReceiverAdapter { + + private JChannel channel; + private String userName; + private String clusterName; + private View lastView; + private boolean running = true; + + // Our shared state + private Integer messageCount = 0; + + /** + * Connect to a JGroups cluster using command line options + * @param args command line arguments + * @throws Exception + */ + private void start(String[] args) throws Exception { + processCommandline(args); + + // Create the channel + // This file could be moved, or made a command line option. + channel = new JChannel("src/main/resources/udp.xml"); + + // Set a name + channel.name(userName); + + // Register for callbacks + channel.setReceiver(this); + + // Ignore our messages + channel.setDiscardOwnMessages(true); + + // Connect + channel.connect(clusterName); + + // Start state transfer + channel.getState(null, 0); + + // Do the things + processInput(); + + // Clean up + channel.close(); + + } + + /** + * Quick and dirty implementaton of commons cli for command line args + * @param args the command line args + * @throws ParseException + */ + private void processCommandline(String[] args) throws ParseException { + + // Options, parser, friendly help + Options options = new Options(); + CommandLineParser parser = new DefaultParser(); + HelpFormatter formatter = new HelpFormatter(); + + options.addOption("u", "user", true, "User name") + .addOption("c", "cluster", true, "Cluster name"); + + CommandLine line = parser.parse(options, args); + + if (line.hasOption("user")) { + userName = line.getOptionValue("user"); + } else { + formatter.printHelp("JGroupsMessenger: need a user name.\n", options); + System.exit(-1); + } + + if (line.hasOption("cluster")) { + clusterName = line.getOptionValue("cluster"); + } else { + formatter.printHelp("JGroupsMessenger: need a cluster name.\n", options); + System.exit(-1); + } + } + + // Start it up + public static void main(String[] args) throws Exception { + new JGroupsMessenger().start(args); + } + + + @Override + public void viewAccepted(View newView) { + + // Save view if this is the first + if (lastView == null) { + System.out.println("Received initial view:"); + newView.forEach(System.out::println); + } else { + // Compare to last view + System.out.println("Received new view."); + + List
newMembers = View.newMembers(lastView, newView); + System.out.println("New members: "); + newMembers.forEach(System.out::println); + + List
exMembers = View.leftMembers(lastView, newView); + System.out.println("Exited members:"); + exMembers.forEach(System.out::println); + } + lastView = newView; + } + + /** + * Loop on console input until we see 'x' to exit + */ + private void processInput() throws Exception { + + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + while (running) { + try { + + // Get a destination, means broadcast + Address destination = null; + System.out.print("Enter a destination: "); + System.out.flush(); + String destinationName = in.readLine().toLowerCase(); + + if (destinationName.equals("x")) { + running = false; + continue; + } else if (!destinationName.isEmpty()) { + destination = getAddress(destinationName) + . orElseThrow(() -> new Exception("Destination not found")); + } + + // Accept a string to send + System.out.print("Enter a message: "); + System.out.flush(); + String line = in.readLine().toLowerCase(); + sendMessage(destination, line); + } catch (IOException ioe) { + running = false; + } + } + System.out.println("Exiting."); + } + + /** + * Send message from here + * @param destination the destination + * @param messageString the message + */ + private void sendMessage(Address destination, String messageString) { + try { + System.out.println("Sending " + messageString + " to " + destination); + Message message = new Message(destination, messageString); + channel.send(message); + } catch (Exception exception) { + System.err.println("Exception sending message: " + exception.getMessage()); + running = false; + } + } + + @Override + public void receive(Message message) { + // Print source and dest with message + String line = "Message received from: " + message.getSrc() + " to: " + message.getDest() + " -> " + message.getObject(); + + // Only track the count of broadcast messages + // Tracking direct message would make for a pointless state + if (message.getDest() == null) { + messageCount++; + System.out.println("Message count: " + messageCount); + } + + System.out.println(line); + } + + @Override + public void getState(OutputStream output) throws Exception { + // Serialize into the stream + Util.objectToStream(messageCount, new DataOutputStream(output)); + } + + @Override + public void setState(InputStream input) { + + // NOTE: since we know that incrementing the count and transferring the state + // is done inside the JChannel's thread, we don't have to worry about synchronizing + // messageCount. For production code it should be synchronized! + try { + // Deserialize + messageCount = Util.objectFromStream(new DataInputStream(input)); + } catch (Exception e) { + System.out.println("Error deserialing state!"); + } + System.out.println(messageCount + " is the current messagecount."); + } + + + private Optional
getAddress(String name) { + View view = channel.view(); + return view.getMembers().stream().filter(address -> name.equals(address.toString())).findFirst(); + } + +} + + diff --git a/jgroups/src/main/resources/udp.xml b/jgroups/src/main/resources/udp.xml new file mode 100644 index 0000000000..5a9bfd0851 --- /dev/null +++ b/jgroups/src/main/resources/udp.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + diff --git a/jhipster/jhipster-microservice/car-app/pom.xml b/jhipster/jhipster-microservice/car-app/pom.xml index 23da8767cb..5fd7febd07 100644 --- a/jhipster/jhipster-microservice/car-app/pom.xml +++ b/jhipster/jhipster-microservice/car-app/pom.xml @@ -506,6 +506,8 @@ maven-compiler-plugin ${maven-compiler-plugin.version} + 1.8 + 1.8 org.mapstruct diff --git a/jjwt/pom.xml b/jjwt/pom.xml index 83a1131211..cd2dd9f97e 100644 --- a/jjwt/pom.xml +++ b/jjwt/pom.xml @@ -12,10 +12,10 @@ Exercising the JJWT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java index df147232d9..846445ab2b 100644 --- a/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java +++ b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java @@ -2,12 +2,12 @@ package io.jsonwebtoken.jjwtfun; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = JJWTFunApplication.class) +@SpringBootTest(classes = JJWTFunApplication.class) @WebAppConfiguration public class DemoApplicationIntegrationTest { diff --git a/spring-jmeter-jenkins/.gitignore b/jmeter/.gitignore similarity index 100% rename from spring-jmeter-jenkins/.gitignore rename to jmeter/.gitignore diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar b/jmeter/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.jar rename to jmeter/.mvn/wrapper/maven-wrapper.jar diff --git a/spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties b/jmeter/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from spring-jmeter-jenkins/.mvn/wrapper/maven-wrapper.properties rename to jmeter/.mvn/wrapper/maven-wrapper.properties diff --git a/spring-jmeter-jenkins/README.md b/jmeter/README.md similarity index 58% rename from spring-jmeter-jenkins/README.md rename to jmeter/README.md index 49c18122a2..e3f9d1a4db 100644 --- a/spring-jmeter-jenkins/README.md +++ b/jmeter/README.md @@ -1,20 +1,7 @@ BASIC CRUD API with Spring Boot ================================ -This is the code of a simple API for some CRUD operations realised for a seminar at [FGI](www.fgi-ud.org) using Spring Boot. - -### Demo -* API: The online version **is**/**will be** hosted here: https://fgi-tcheck.herokuapp.com -* Mobile version is also opensource and located here: https://github.com/valdesekamdem/tcheck-mobile - -### Features -#### Currently Implemented -* CRUD - * Student - -#### To DO -* Validations of input with: [Spring Data Rest Validators](http://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter.html) - +This is the code of a simple API for some CRUD operations build using Spring Boot. ### Requirements @@ -49,7 +36,11 @@ Or create a new one via a POST: $ curl -X POST -H "Content-Type:application/json" -d '{ "firstName" : "Dassi", "lastName" : "Orleando", "phoneNumber": "+237 545454545", "email": "mymail@yahoo.fr" }' localhost:8080/students ``` - Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) -Enjoy it :) \ No newline at end of file +Enjoy it :) + +### Relevant Articles: + +- [Intro to Performance Testing using JMeter](http://www.baeldung.com/jmeter) +- [Configure Jenkins to Run and Show JMeter Tests](http://www.baeldung.com/jenkins-and-jmeter) diff --git a/jmeter/jmeter.log b/jmeter/jmeter.log new file mode 100644 index 0000000000..ce55007e74 --- /dev/null +++ b/jmeter/jmeter.log @@ -0,0 +1,68 @@ +2017-12-13 04:50:16,291 INFO o.a.j.u.JMeterUtils: Setting Locale to en_US +2017-12-13 04:50:16,319 INFO o.a.j.JMeter: Loading user properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/user.properties +2017-12-13 04:50:16,392 INFO o.a.j.JMeter: Loading system properties from: /Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3/bin/system.properties +2017-12-13 04:50:16,406 INFO o.a.j.JMeter: Setting JMeter property: jmeter.save.saveservice.output_format=xml +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Copyright (c) 1998-2017 The Apache Software Foundation +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: Version 3.3 r1808647 +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.version=1.8.0_152 +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: java.vm.name=Java HotSpot(TM) 64-Bit Server VM +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.name=Mac OS X +2017-12-13 04:50:16,451 INFO o.a.j.JMeter: os.arch=x86_64 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: os.version=10.12.6 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: file.encoding=UTF-8 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Max memory =536870912 +2017-12-13 04:50:16,452 INFO o.a.j.JMeter: Available Processors =4 +2017-12-13 04:50:16,461 INFO o.a.j.JMeter: Default Locale=English (United States) +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeter Locale=English (United States) +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: JMeterHome=/Users/dassiorleando/projects/biz/baeldung/jmeter/apache-jmeter-3.3 +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: user.dir =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter +2017-12-13 04:50:16,462 INFO o.a.j.JMeter: PWD =/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter +2017-12-13 04:50:16,466 INFO o.a.j.JMeter: IP: 192.168.10.100 Name: MBP FullName: 192.168.10.100 +2017-12-13 04:50:16,472 INFO o.a.j.s.FileServer: Default base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter' +2017-12-13 04:50:16,473 INFO o.a.j.s.FileServer: Set new base='/Users/dassiorleando/projects/biz/baeldung/tutorials/jmeter/src/main/resources' +2017-12-13 04:50:17,022 INFO o.a.j.s.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2 +2017-12-13 04:50:17,134 INFO o.a.j.s.SaveService: Using SaveService properties file encoding UTF-8 +2017-12-13 04:50:17,142 INFO o.a.j.s.SaveService: Using SaveService properties version 3.2 +2017-12-13 04:50:17,168 INFO o.a.j.s.SaveService: Loading file: src/main/resources/JMeter.jmx +2017-12-13 04:50:17,340 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/html is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,351 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xhtml+xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for application/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,352 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/xml is org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser +2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/vnd.wap.wml is org.apache.jmeter.protocol.http.parser.RegexpHTMLParser +2017-12-13 04:50:17,353 INFO o.a.j.p.h.s.HTTPSamplerBase: Parser for text/css is org.apache.jmeter.protocol.http.parser.CssParser +2017-12-13 04:50:17,552 INFO o.a.j.JMeter: Creating summariser +2017-12-13 04:50:17,580 INFO o.a.j.e.StandardJMeterEngine: Running the test! +2017-12-13 04:50:17,581 INFO o.a.j.s.SampleEvent: List of sample_variables: [] +2017-12-13 04:50:17,582 INFO o.a.j.s.SampleEvent: List of sample_variables: [] +2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must contain the string: '.functions.' +2017-12-13 04:50:17,590 INFO o.a.j.e.u.CompoundVariable: Note: Function class names must not contain the string: '.gui.' +2017-12-13 04:50:18,640 INFO o.a.j.JMeter: Running test (1513137018640) +2017-12-13 04:50:18,728 INFO o.a.j.e.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group +2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Starting 5 threads for group Thread Group. +2017-12-13 04:50:18,737 INFO o.a.j.e.StandardJMeterEngine: Thread will continue on error +2017-12-13 04:50:18,738 INFO o.a.j.t.ThreadGroup: Starting thread group... number=1 threads=5 ramp-up=1 perThread=200.0 delayedStart=false +2017-12-13 04:50:18,751 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1 +2017-12-13 04:50:18,753 INFO o.a.j.t.ThreadGroup: Started thread group number 1 +2017-12-13 04:50:18,753 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started +2017-12-13 04:50:18,786 INFO o.a.j.p.h.s.HTTPHCAbstractImpl: Local host = MBP +2017-12-13 04:50:18,797 INFO o.a.j.p.h.s.HTTPHC4Impl: HTTP request retry count = 0 +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: Note: Sample TimeStamps are START times +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.default.encoding is set to ISO-8859-1 +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.useNanoTime=true +2017-12-13 04:50:18,812 INFO o.a.j.s.SampleResult: sampleresult.nanoThreadSleep=5000 +2017-12-13 04:50:18,954 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-2 +2017-12-13 04:50:19,152 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-3 +2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-3 +2017-12-13 04:50:19,257 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-3 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-2 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1 +2017-12-13 04:50:19,264 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-2 +2017-12-13 04:50:19,265 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1 +2017-12-13 04:50:19,353 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-4 +2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-4 +2017-12-13 04:50:19,365 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-4 +2017-12-13 04:50:19,557 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-5 +2017-12-13 04:50:19,573 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test +2017-12-13 04:50:19,575 INFO o.a.j.r.Summariser: summary = 5 in 00:00:01 = 5.4/s Avg: 155 Min: 10 Max: 388 Err: 4 (80.00%) diff --git a/spring-jmeter-jenkins/mvnw b/jmeter/mvnw similarity index 100% rename from spring-jmeter-jenkins/mvnw rename to jmeter/mvnw diff --git a/spring-jmeter-jenkins/mvnw.cmd b/jmeter/mvnw.cmd similarity index 100% rename from spring-jmeter-jenkins/mvnw.cmd rename to jmeter/mvnw.cmd diff --git a/jmeter/pom.xml b/jmeter/pom.xml new file mode 100644 index 0000000000..977e3bbc94 --- /dev/null +++ b/jmeter/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + jmeter + 0.0.1-SNAPSHOT + jar + + jmeter + Intro to Performance testing using JMeter + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + 2.6.0 + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + com.lazerycode.jmeter + jmeter-maven-plugin + ${jmeter.version} + + + jmeter-tests + + jmeter + + + + + ${project.basedir}/src/main/resources + ${project.basedir}/src/main/resources + + + + + diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java b/jmeter/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java rename to jmeter/src/main/java/com/baeldung/SpringJMeterJenkinsApplication.java diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java b/jmeter/src/main/java/com/baeldung/domain/Student.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/domain/Student.java rename to jmeter/src/main/java/com/baeldung/domain/Student.java diff --git a/spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java b/jmeter/src/main/java/com/baeldung/repository/StudentRepository.java similarity index 100% rename from spring-jmeter-jenkins/src/main/java/com/baeldung/repository/StudentRepository.java rename to jmeter/src/main/java/com/baeldung/repository/StudentRepository.java diff --git a/jmeter/src/main/resources/20171213-JMeter.csv b/jmeter/src/main/resources/20171213-JMeter.csv new file mode 100644 index 0000000000..6eb1a37cb0 --- /dev/null +++ b/jmeter/src/main/resources/20171213-JMeter.csv @@ -0,0 +1,6 @@ +timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,Latency,IdleTime,Connect +1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-4,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075 +1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-1,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,935 +1513134869133,1075,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-3,text,false,"The operation lasted too long: It took 1,075 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1075 +1513134869272,935,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-2,text,false,"The operation lasted too long: It took 935 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,934 +1513134869133,1074,HTTP Request,Non HTTP response code: java.net.ConnectException,Non HTTP response message: Connection refused (Connection refused),Thread Group 1-5,text,false,"The operation lasted too long: It took 1,074 milliseconds, but should not have lasted longer than 10 milliseconds.",2058,0,5,5,0,0,1074 diff --git a/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx b/jmeter/src/main/resources/JMeter.jmx similarity index 99% rename from spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx rename to jmeter/src/main/resources/JMeter.jmx index 49ce2dec1d..77bccb2b24 100644 --- a/spring-jmeter-jenkins/src/main/resources/JMeter-Jenkins.jmx +++ b/jmeter/src/main/resources/JMeter.jmx @@ -1,7 +1,7 @@ - + false false diff --git a/jmeter/src/main/resources/JMeter.jtl b/jmeter/src/main/resources/JMeter.jtl new file mode 100644 index 0000000000..f9259ef739 --- /dev/null +++ b/jmeter/src/main/resources/JMeter.jtl @@ -0,0 +1,43 @@ + + + + + Duration Assertion + true + false + The operation lasted too long: It took 83 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + true + false + The operation lasted too long: It took 388 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + true + false + The operation lasted too long: It took 281 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + + Duration Assertion + false + false + + + + + Duration Assertion + true + false + The operation lasted too long: It took 13 milliseconds, but should not have lasted longer than 10 milliseconds. + + + + diff --git a/spring-jmeter-jenkins/src/main/resources/application.properties b/jmeter/src/main/resources/application.properties similarity index 100% rename from spring-jmeter-jenkins/src/main/resources/application.properties rename to jmeter/src/main/resources/application.properties diff --git a/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java b/jmeter/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java similarity index 82% rename from spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java rename to jmeter/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java index b39a5605b1..71eec9cf45 100644 --- a/spring-jmeter-jenkins/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationTests.java +++ b/jmeter/src/test/java/com/baeldung/SpringJMeterJenkinsApplicationIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -public class SpringJMeterJenkinsApplicationTests { +public class SpringJMeterJenkinsApplicationIntegrationTest { @Test public void contextLoads() { diff --git a/json/pom.xml b/json/pom.xml index 958dd32f53..7c74d425af 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -31,6 +31,11 @@ ${fastjson.version} + + org.json + json + 20171018 + diff --git a/json/src/main/java/com/baeldung/jsonjava/CDLDemo.java b/json/src/main/java/com/baeldung/jsonjava/CDLDemo.java new file mode 100644 index 0000000000..f5fee0c4a9 --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/CDLDemo.java @@ -0,0 +1,59 @@ +package com.baeldung.jsonjava; + +import org.json.CDL; +import org.json.JSONArray; +import org.json.JSONTokener; + +public class CDLDemo { + public static void main(String[] args) { + System.out.println("7.1. Producing JSONArray Directly from Comma Delimited Text: "); + jsonArrayFromCDT(); + + System.out.println("\n7.2. Producing Comma Delimited Text from JSONArray: "); + cDTfromJSONArray(); + + System.out.println("\n7.3.1. Producing JSONArray of JSONObjects Using Comma Delimited Text: "); + jaOfJOFromCDT2(); + + System.out.println("\n7.3.2. Producing JSONArray of JSONObjects Using Comma Delimited Text: "); + jaOfJOFromCDT2(); + } + + public static void jsonArrayFromCDT() { + JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada")); + System.out.println(ja); + } + + public static void cDTfromJSONArray() { + JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]"); + String cdt = CDL.rowToString(ja); + System.out.println(cdt); + } + + public static void jaOfJOFromCDT() { + String string = + "name, city, age \n" + + "john, chicago, 22 \n" + + "gary, florida, 35 \n" + + "sal, vegas, 18"; + + JSONArray result = CDL.toJSONArray(string); + System.out.println(result.toString()); + } + + public static void jaOfJOFromCDT2() { + JSONArray ja = new JSONArray(); + ja.put("name"); + ja.put("city"); + ja.put("age"); + + String string = + "john, chicago, 22 \n" + + "gary, florida, 35 \n" + + "sal, vegas, 18"; + + JSONArray result = CDL.toJSONArray(ja, string); + System.out.println(result.toString()); + } + +} diff --git a/json/src/main/java/com/baeldung/jsonjava/CookieDemo.java b/json/src/main/java/com/baeldung/jsonjava/CookieDemo.java new file mode 100644 index 0000000000..bc39d13642 --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/CookieDemo.java @@ -0,0 +1,30 @@ +package com.baeldung.jsonjava; + +import org.json.Cookie; +import org.json.JSONObject; + +public class CookieDemo { + public static void main(String[] args) { + System.out.println("8.1. Converting a Cookie String into a JSONObject"); + cookieStringToJSONObject(); + + System.out.println("\n8.2. Converting a JSONObject into Cookie String"); + jSONObjectToCookieString(); + } + + public static void cookieStringToJSONObject() { + String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/"; + JSONObject cookieJO = Cookie.toJSONObject(cookie); + System.out.println(cookieJO); + } + + public static void jSONObjectToCookieString() { + JSONObject cookieJO = new JSONObject(); + cookieJO.put("name", "username"); + cookieJO.put("value", "John Doe"); + cookieJO.put("expires", "Thu, 18 Dec 2013 12:00:00 UTC"); + cookieJO.put("path", "/"); + String cookie = Cookie.toString(cookieJO); + System.out.println(cookie); + } +} diff --git a/json/src/main/java/com/baeldung/jsonjava/DemoBean.java b/json/src/main/java/com/baeldung/jsonjava/DemoBean.java new file mode 100644 index 0000000000..6d27b329c2 --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/DemoBean.java @@ -0,0 +1,26 @@ +package com.baeldung.jsonjava; + +public class DemoBean { + private int id; + private String name; + private boolean active; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean isActive() { + return active; + } + public void setActive(boolean active) { + this.active = active; + } +} diff --git a/json/src/main/java/com/baeldung/jsonjava/HTTPDemo.java b/json/src/main/java/com/baeldung/jsonjava/HTTPDemo.java new file mode 100644 index 0000000000..800018005c --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/HTTPDemo.java @@ -0,0 +1,27 @@ +package com.baeldung.jsonjava; + +import org.json.HTTP; +import org.json.JSONObject; + +public class HTTPDemo { + public static void main(String[] args) { + System.out.println("9.1. Converting JSONObject to HTTP Header: "); + jSONObjectToHTTPHeader(); + + System.out.println("\n9.2. Converting HTTP Header String Back to JSONObject: "); + hTTPHeaderToJSONObject(); + } + + public static void jSONObjectToHTTPHeader() { + JSONObject jo = new JSONObject(); + jo.put("Method", "POST"); + jo.put("Request-URI", "http://www.example.com/"); + jo.put("HTTP-Version", "HTTP/1.1"); + System.out.println(HTTP.toString(jo)); + } + + public static void hTTPHeaderToJSONObject() { + JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1"); + System.out.println(obj); + } +} diff --git a/json/src/main/java/com/baeldung/jsonjava/JSONArrayDemo.java b/json/src/main/java/com/baeldung/jsonjava/JSONArrayDemo.java new file mode 100644 index 0000000000..2a4fab2eab --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/JSONArrayDemo.java @@ -0,0 +1,52 @@ +package com.baeldung.jsonjava; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class JSONArrayDemo { + public static void main(String[] args) { + System.out.println("5.1. Creating JSON Array: "); + creatingJSONArray(); + + System.out.println("\n5.2. Creating JSON Array from JSON string: "); + jsonArrayFromJSONString(); + + System.out.println("\n5.3. Creating JSON Array from Collection Object: "); + jsonArrayFromCollectionObj(); + } + + public static void creatingJSONArray() { + JSONArray ja = new JSONArray(); + ja.put(Boolean.TRUE); + ja.put("lorem ipsum"); + + // We can also put a JSONObject in JSONArray + JSONObject jo = new JSONObject(); + jo.put("name", "jon doe"); + jo.put("age", "22"); + jo.put("city", "chicago"); + + ja.put(jo); + + System.out.println(ja.toString()); + } + + public static void jsonArrayFromJSONString() { + JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]"); + System.out.println(ja); + } + + public static void jsonArrayFromCollectionObj() { + List list = new ArrayList<>(); + list.add("California"); + list.add("Texas"); + list.add("Hawaii"); + list.add("Alaska"); + + JSONArray ja = new JSONArray(list); + System.out.println(ja); + } +} \ No newline at end of file diff --git a/json/src/main/java/com/baeldung/jsonjava/JSONObjectDemo.java b/json/src/main/java/com/baeldung/jsonjava/JSONObjectDemo.java new file mode 100644 index 0000000000..cfe8467c30 --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/JSONObjectDemo.java @@ -0,0 +1,59 @@ +package com.baeldung.jsonjava; + +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONObject; + +public class JSONObjectDemo { + public static void main(String[] args) { + System.out.println("4.1. Creating JSONObject: "); + jsonFromJSONObject(); + + System.out.println("\n4.2. Creating JSONObject from Map: "); + jsonFromMap(); + + System.out.println("\n4.3. Creating JSONObject from JSON string: "); + jsonFromJSONString(); + + System.out.println("\n4.4. Creating JSONObject from Java Bean: "); + jsonFromDemoBean(); + } + + public static void jsonFromJSONObject() { + JSONObject jo = new JSONObject(); + jo.put("name", "jon doe"); + jo.put("age", "22"); + jo.put("city", "chicago"); + + System.out.println(jo.toString()); + } + + public static void jsonFromMap() { + Map map = new HashMap<>(); + map.put("name", "jon doe"); + map.put("age", "22"); + map.put("city", "chicago"); + JSONObject jo = new JSONObject(map); + + System.out.println(jo.toString()); + } + + public static void jsonFromJSONString() { + JSONObject jo = new JSONObject( + "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}" + ); + + System.out.println(jo.toString()); + } + + public static void jsonFromDemoBean() { + DemoBean demo = new DemoBean(); + demo.setId(1); + demo.setName("lorem ipsum"); + demo.setActive(true); + + JSONObject jo = new JSONObject(demo); + System.out.println(jo); + } +} diff --git a/json/src/main/java/com/baeldung/jsonjava/JSONTokenerDemo.java b/json/src/main/java/com/baeldung/jsonjava/JSONTokenerDemo.java new file mode 100644 index 0000000000..fb9fea959c --- /dev/null +++ b/json/src/main/java/com/baeldung/jsonjava/JSONTokenerDemo.java @@ -0,0 +1,13 @@ +package com.baeldung.jsonjava; + +import org.json.JSONTokener; + +public class JSONTokenerDemo { + public static void main(String[] args) { + JSONTokener jt = new JSONTokener("Sample String"); + + while(jt.more()) { + System.out.println(jt.next()); + } + } +} diff --git a/json/src/test/java/com/baeldung/jsonjava/CDLIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/CDLIntegrationTest.java new file mode 100644 index 0000000000..441c71e78e --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/CDLIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; + +import org.json.CDL; +import org.json.JSONArray; +import org.json.JSONTokener; +import org.junit.Test; + +public class CDLIntegrationTest { + @Test + public void givenCommaDelimitedText_thenConvertToJSONArray() { + JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada")); + assertEquals("[\"England\",\"USA\",\"Canada\"]", ja.toString()); + } + + @Test + public void givenJSONArray_thenConvertToCommaDelimitedText() { + JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]"); + String cdt = CDL.rowToString(ja); + assertEquals("England,USA,Canada", cdt.toString().trim()); + } + + @Test + public void givenCommaDelimitedText_thenGetJSONArrayOfJSONObjects() { + String string = + "name, city, age \n" + + "john, chicago, 22 \n" + + "gary, florida, 35 \n" + + "sal, vegas, 18"; + + JSONArray result = CDL.toJSONArray(string); + assertEquals("[{\"name\":\"john\",\"city\":\"chicago\",\"age\":\"22\"},{\"name\":\"gary\",\"city\":\"florida\",\"age\":\"35\"},{\"name\":\"sal\",\"city\":\"vegas\",\"age\":\"18\"}]", result.toString()); + } + + @Test + public void givenCommaDelimitedText_thenGetJSONArrayOfJSONObjects2() { + JSONArray ja = new JSONArray(); + ja.put("name"); + ja.put("city"); + ja.put("age"); + + String string = + "john, chicago, 22 \n" + + "gary, florida, 35 \n" + + "sal, vegas, 18"; + + JSONArray result = CDL.toJSONArray(ja, string); + assertEquals("[{\"name\":\"john\",\"city\":\"chicago\",\"age\":\"22\"},{\"name\":\"gary\",\"city\":\"florida\",\"age\":\"35\"},{\"name\":\"sal\",\"city\":\"vegas\",\"age\":\"18\"}]", result.toString()); + } + +} diff --git a/json/src/test/java/com/baeldung/jsonjava/CookieIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/CookieIntegrationTest.java new file mode 100644 index 0000000000..c1a3505bbc --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/CookieIntegrationTest.java @@ -0,0 +1,29 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; + +import org.json.Cookie; +import org.json.JSONObject; +import org.junit.Test; + +public class CookieIntegrationTest { + @Test + public void givenCookieString_thenConvertToJSONObject() { + String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/"; + JSONObject cookieJO = Cookie.toJSONObject(cookie); + + assertEquals("{\"path\":\"/\",\"expires\":\"Thu, 18 Dec 2013 12:00:00 UTC\",\"name\":\"username\",\"value\":\"John Doe\"}", cookieJO.toString()); + } + + @Test + public void givenJSONObject_thenConvertToCookieString() { + JSONObject cookieJO = new JSONObject(); + cookieJO.put("name", "username"); + cookieJO.put("value", "John Doe"); + cookieJO.put("expires", "Thu, 18 Dec 2013 12:00:00 UTC"); + cookieJO.put("path", "/"); + String cookie = Cookie.toString(cookieJO); + + assertEquals("username=John Doe;expires=Thu, 18 Dec 2013 12:00:00 UTC;path=/", cookie.toString()); + } +} diff --git a/json/src/test/java/com/baeldung/jsonjava/HTTPIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/HTTPIntegrationTest.java new file mode 100644 index 0000000000..1aa0427c7e --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/HTTPIntegrationTest.java @@ -0,0 +1,25 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; +import org.json.HTTP; +import org.json.JSONObject; +import org.junit.Test; + +public class HTTPIntegrationTest { + @Test + public void givenJSONObject_thenConvertToHTTPHeader() { + JSONObject jo = new JSONObject(); + jo.put("Method", "POST"); + jo.put("Request-URI", "http://www.example.com/"); + jo.put("HTTP-Version", "HTTP/1.1"); + + assertEquals("POST \"http://www.example.com/\" HTTP/1.1"+HTTP.CRLF+HTTP.CRLF, HTTP.toString(jo)); + } + + @Test + public void givenHTTPHeader_thenConvertToJSONObject() { + JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1"); + + assertEquals("{\"Request-URI\":\"http://www.example.com/\",\"Method\":\"POST\",\"HTTP-Version\":\"HTTP/1.1\"}", obj.toString()); + } +} diff --git a/json/src/test/java/com/baeldung/jsonjava/JSONArrayIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/JSONArrayIntegrationTest.java new file mode 100644 index 0000000000..c956232abe --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/JSONArrayIntegrationTest.java @@ -0,0 +1,47 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.junit.Test; + +public class JSONArrayIntegrationTest { + @Test + public void givenJSONJava_thenCreateNewJSONArrayFromScratch() { + JSONArray ja = new JSONArray(); + ja.put(Boolean.TRUE); + ja.put("lorem ipsum"); + + // We can also put a JSONObject in JSONArray + JSONObject jo = new JSONObject(); + jo.put("name", "jon doe"); + jo.put("age", "22"); + jo.put("city", "chicago"); + + ja.put(jo); + + assertEquals("[true,\"lorem ipsum\",{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}]", ja.toString()); + } + + @Test + public void givenJsonString_thenCreateNewJSONArray() { + JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]"); + assertEquals("[true,\"lorem ipsum\",215]", ja.toString()); + } + + @Test + public void givenListObject_thenConvertItToJSONArray() { + List list = new ArrayList<>(); + list.add("California"); + list.add("Texas"); + list.add("Hawaii"); + list.add("Alaska"); + + JSONArray ja = new JSONArray(list); + assertEquals("[\"California\",\"Texas\",\"Hawaii\",\"Alaska\"]", ja.toString()); + } +} \ No newline at end of file diff --git a/json/src/test/java/com/baeldung/jsonjava/JSONObjectIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/JSONObjectIntegrationTest.java new file mode 100644 index 0000000000..70f7921797 --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/JSONObjectIntegrationTest.java @@ -0,0 +1,53 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONObject; +import org.junit.Test; + +public class JSONObjectIntegrationTest { + @Test + public void givenJSONJava_thenCreateNewJSONObject() { + JSONObject jo = new JSONObject(); + jo.put("name", "jon doe"); + jo.put("age", "22"); + jo.put("city", "chicago"); + + assertEquals("{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}", jo.toString()); + + } + + @Test + public void givenMapObject_thenCreateJSONObject() { + Map map = new HashMap<>(); + map.put("name", "jon doe"); + map.put("age", "22"); + map.put("city", "chicago"); + JSONObject jo = new JSONObject(map); + + assertEquals("{\"name\":\"jon doe\",\"city\":\"chicago\",\"age\":\"22\"}", jo.toString()); + } + + @Test + public void givenJsonString_thenCreateJSONObject() { + JSONObject jo = new JSONObject( + "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}" + ); + + assertEquals("{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}", jo.toString()); + } + + @Test + public void givenDemoBean_thenCreateJSONObject() { + DemoBean demo = new DemoBean(); + demo.setId(1); + demo.setName("lorem ipsum"); + demo.setActive(true); + + JSONObject jo = new JSONObject(demo); + assertEquals("{\"name\":\"lorem ipsum\",\"active\":true,\"id\":1}", jo.toString()); + } +} diff --git a/json/src/test/java/com/baeldung/jsonjava/JSONTokenerIntegrationTest.java b/json/src/test/java/com/baeldung/jsonjava/JSONTokenerIntegrationTest.java new file mode 100644 index 0000000000..4fe8f27231 --- /dev/null +++ b/json/src/test/java/com/baeldung/jsonjava/JSONTokenerIntegrationTest.java @@ -0,0 +1,21 @@ +package com.baeldung.jsonjava; + +import static org.junit.Assert.assertEquals; + +import org.json.JSONTokener; +import org.junit.Test; + +public class JSONTokenerIntegrationTest { + @Test + public void givenString_convertItToJSONTokens() { + String str = "Sample String"; + JSONTokener jt = new JSONTokener(str); + + char[] expectedTokens = str.toCharArray(); + int index = 0; + + while(jt.more()) { + assertEquals(expectedTokens[index++], jt.next()); + } + } +} diff --git a/jsonb/.gitignore b/jsonb/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/jsonb/.gitignore @@ -0,0 +1,12 @@ +#folders# +.idea +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/jsonb/README.md b/jsonb/README.md new file mode 100644 index 0000000000..9293a44808 --- /dev/null +++ b/jsonb/README.md @@ -0,0 +1,4 @@ +## JSON B + +## Relevant articles: +- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api) diff --git a/jsonb/pom.xml b/jsonb/pom.xml new file mode 100644 index 0000000000..5058d89c31 --- /dev/null +++ b/jsonb/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + com.baeldung + json-b + 0.0.1-SNAPSHOT + jar + + json-b + json-b sample project + + + yasson + + true + + + + + org.eclipse + yasson + ${yasson.version} + + + org.glassfish + javax.json + ${javax.json.version} + + + + + johnzon + + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + ${johnzon.version} + + + + + + + javax.json.bind + javax.json.bind-api + ${jsonb-api.version} + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.0.0 + 5.0.0 + 2.20 + 1.0 + 1.1.3 + 1.0 + 1.0.1 + 1.1.2 + 4.1 + + + \ No newline at end of file diff --git a/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java b/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java new file mode 100644 index 0000000000..dfab2eb0d2 --- /dev/null +++ b/jsonb/src/main/java/com/baeldung/adapter/PersonAdapter.java @@ -0,0 +1,26 @@ +package com.baeldung.adapter; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.bind.adapter.JsonbAdapter; + +import com.baeldung.jsonb.Person; + +public class PersonAdapter implements JsonbAdapter { + + @Override + public JsonObject adaptToJson(Person p) throws Exception { + return Json.createObjectBuilder() + .add("id", p.getId()) + .add("name", p.getName()) + .build(); + } + + @Override + public Person adaptFromJson(JsonObject adapted) throws Exception { + Person person = new Person(); + person.setId(adapted.getInt("id")); + person.setName(adapted.getString("name")); + return person; + } +} \ No newline at end of file diff --git a/jsonb/src/main/java/com/baeldung/jsonb/Person.java b/jsonb/src/main/java/com/baeldung/jsonb/Person.java new file mode 100644 index 0000000000..a506c1b000 --- /dev/null +++ b/jsonb/src/main/java/com/baeldung/jsonb/Person.java @@ -0,0 +1,127 @@ +package com.baeldung.jsonb; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import javax.json.bind.annotation.JsonbDateFormat; +import javax.json.bind.annotation.JsonbNumberFormat; +import javax.json.bind.annotation.JsonbProperty; +import javax.json.bind.annotation.JsonbTransient; + +public class Person { + + private int id; + @JsonbProperty("person-name") + private String name; + @JsonbProperty(nillable = true) + private String email; + @JsonbTransient + private int age; + @JsonbDateFormat("dd-MM-yyyy") + private LocalDate registeredDate; + private BigDecimal salary; + + public Person() { + this(0, "", "", 0, LocalDate.now(), new BigDecimal(0)); + } + + public Person(int id, String name, String email, int age, LocalDate registeredDate, BigDecimal salary) { + this.id = id; + this.name = name; + this.email = email; + this.age = age; + this.registeredDate = registeredDate; + this.salary = salary; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonbNumberFormat(locale = "en_US", value = "#0.0") + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + public LocalDate getRegisteredDate() { + return registeredDate; + } + + public void setRegisteredDate(LocalDate registeredDate) { + this.registeredDate = registeredDate; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Person [id="); + builder.append(id); + builder.append(", name="); + builder.append(name); + builder.append(", email="); + builder.append(email); + builder.append(", age="); + builder.append(age); + builder.append(", registeredDate="); + builder.append(registeredDate); + builder.append(", salary="); + builder.append(salary); + builder.append("]"); + return builder.toString(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Person other = (Person) obj; + if (id != other.id) + return false; + return true; + } + +} diff --git a/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java b/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java new file mode 100644 index 0000000000..67beda77e1 --- /dev/null +++ b/jsonb/src/test/java/com/baeldung/jsonb/JsonbTest.java @@ -0,0 +1,188 @@ +package com.baeldung.jsonb; + +import static org.junit.Assert.assertTrue; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; +import javax.json.bind.JsonbConfig; +import javax.json.bind.config.PropertyNamingStrategy; +import javax.json.bind.config.PropertyOrderStrategy; + +import org.apache.commons.collections4.ListUtils; +import org.junit.Test; + +import com.baeldung.adapter.PersonAdapter; + +public class JsonbTest { + + @Test + public void givenPersonList_whenSerializeWithJsonb_thenGetPersonJsonArray() { + Jsonb jsonb = JsonbBuilder.create(); + // @formatter:off + List personList = Arrays.asList( + new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500))); + // @formatter:on + String jsonArrayPerson = jsonb.toJson(personList); + // @formatter:off + String jsonExpected = "[" + + "{\"email\":\"jhon@test.com\"," + + "\"id\":1,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1000.0\"}," + + "{\"email\":\"jhon1@test.com\"," + + "\"id\":2,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1500.0\"},{\"email\":null," + + "\"id\":3,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1000.0\"}," + + "{\"email\":\"tom@test.com\"," + + "\"id\":4,\"person-name\":\"Tom\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1500.0\"}" + + "]"; + // @formatter:on + assertTrue(jsonArrayPerson.equals(jsonExpected)); + } + + @Test + public void givenPersonJsonArray_whenDeserializeWithJsonb_thenGetPersonList() { + Jsonb jsonb = JsonbBuilder.create(); + // @formatter:off + String personJsonArray = + "[" + + "{\"email\":\"jhon@test.com\"," + + "\"id\":1,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1000.0\"}," + + "{\"email\":\"jhon1@test.com\"," + + "\"id\":2,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1500.0\"},{\"email\":null," + + "\"id\":3,\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1000.0\"}," + + "{\"email\":\"tom@test.com\"," + + "\"id\":4,\"person-name\":\"Tom\"," + + "\"registeredDate\":\"09-09-2019\"," + + "\"salary\":\"1500.0\"}" + + "]"; + // @formatter:on + @SuppressWarnings("serial") + List personList = jsonb.fromJson(personJsonArray, new ArrayList() { + }.getClass() + .getGenericSuperclass()); + // @formatter:off + List personListExpected = Arrays.asList( + new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500))); + // @formatter:on + assertTrue(ListUtils.isEqualList(personList, personListExpected)); + } + + @Test + public void givenPersonObject_whenNamingStrategy_thenGetCustomPersonJson() { + JsonbConfig config = new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); + Jsonb jsonb = JsonbBuilder.create(config); + Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); + String jsonPerson = jsonb.toJson(person); + // @formatter:off + String jsonExpected = + "{\"email\":\"jhon@test.com\"," + + "\"id\":1," + + "\"person-name\":\"Jhon\"," + + "\"registered_date\":\"07-09-2019\"," + + "\"salary\":\"1000.0\"}"; + // @formatter:on + assertTrue(jsonExpected.equals(jsonPerson)); + } + + @Test + public void givenPersonObject_whenWithPropertyOrderStrategy_thenGetReversePersonJson() { + JsonbConfig config = new JsonbConfig().withPropertyOrderStrategy(PropertyOrderStrategy.REVERSE); + Jsonb jsonb = JsonbBuilder.create(config); + Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); + String jsonPerson = jsonb.toJson(person); + // @formatter:off + String jsonExpected = + "{\"salary\":\"1000.0\","+ + "\"registeredDate\":\"07-09-2019\"," + + "\"person-name\":\"Jhon\"," + + "\"id\":1," + + "\"email\":\"jhon@test.com\"}"; + // @formatter:on + assertTrue(jsonExpected.equals(jsonPerson)); + } + + @Test + public void givenPersonObject_whenSerializeWithJsonb_thenGetPersonJson() { + Jsonb jsonb = JsonbBuilder.create(); + Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); + String jsonPerson = jsonb.toJson(person); + // @formatter:off + String jsonExpected = + "{\"email\":\"jhon@test.com\"," + + "\"id\":1," + + "\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"07-09-2019\"," + + "\"salary\":\"1000.0\"}"; + // @formatter:on + assertTrue(jsonExpected.equals(jsonPerson)); + } + + @Test + public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() { + Jsonb jsonb = JsonbBuilder.create(); + Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0)); + // @formatter:off + String jsonPerson = + "{\"email\":\"jhon@test.com\"," + + "\"id\":1," + + "\"person-name\":\"Jhon\"," + + "\"registeredDate\":\"07-09-2019\"," + + "\"salary\":\"1000.0\"}"; + // @formatter:on + assertTrue(jsonb.fromJson(jsonPerson, Person.class) + .equals(person)); + } + + @Test + public void givenPersonObject_whenSerializeWithAdapter_thenGetPersonJson() { + JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter()); + Jsonb jsonb = JsonbBuilder.create(config); + Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0));// new Person(1, "Jhon"); + String jsonPerson = jsonb.toJson(person); + // @formatter:off + String jsonExpected = + "{\"id\":1," + + "\"name\":\"Jhon\"}"; + // @formatter:on + assertTrue(jsonExpected.equals(jsonPerson)); + } + + @Test + public void givenPersonJson_whenDeserializeWithAdapter_thenGetPersonObject() { + JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter()); + Jsonb jsonb = JsonbBuilder.create(config); + Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0));// new Person(1, "Jhon"); + // @formatter:off + String jsonPerson = + "{\"id\":1," + + "\"name\":\"Jhon\"}"; + // @formatter:on + assertTrue(jsonb.fromJson(jsonPerson, Person.class) + .equals(person)); + } + +} diff --git a/junit5/README.md b/junit5/README.md index d0fa19bd83..fb1685fdd5 100644 --- a/junit5/README.md +++ b/junit5/README.md @@ -1,9 +1,2 @@ -### Relevant Articles: -- [The Basics of JUnit 5 – A Preview](http://www.baeldung.com/junit-5-preview) -- [A Guide to JUnit 5](http://www.baeldung.com/junit-5) -- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) -- [A Guide to @RepeatedTest in Junit 5](http://www.baeldung.com/junit-5-repeated-test) -- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) -- [A Guied to JUnit 5 Extensions](http://www.baeldung.com/junit-5-extensions) -- [Inject Parameters into JUnit Jupiter Unit Tests](http://www.baeldung.com/junit-5-parameters) -- [Mockito and JUnit 5 – Using ExtendWith](http://www.baeldung.com/mockito-junit-5-extension) +## Relevant articles: +- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order) diff --git a/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java new file mode 100644 index 0000000000..15b07ee03a --- /dev/null +++ b/junit5/src/main/java/com/baeldung/junit5/DefaultOrderOfExecutionTest.java @@ -0,0 +1,33 @@ +package com.baeldung.junit5; + +import static org.junit.Assert.assertEquals; + +import org.junit.AfterClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.DEFAULT) +public class DefaultOrderOfExecutionTest { + private static StringBuilder output = new StringBuilder(""); + + @Test + public void secondTest() { + output.append("b"); + } + + @Test + public void thirdTest() { + output.append("c"); + } + + @Test + public void firstTest() { + output.append("a"); + } + + @AfterClass + public static void assertOutput() { + assertEquals(output.toString(), "cab"); + } +} diff --git a/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java new file mode 100644 index 0000000000..189efc8945 --- /dev/null +++ b/junit5/src/main/java/com/baeldung/junit5/JVMOrderOfExecutionTest.java @@ -0,0 +1,26 @@ +package com.baeldung.junit5; + +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.JVM) +public class JVMOrderOfExecutionTest { + + private static StringBuilder output = new StringBuilder(""); + + @Test + public void secondTest() { + output.append("b"); + } + + @Test + public void thirdTest() { + output.append("c"); + } + + @Test + public void firstTest() { + output.append("a"); + } +} \ No newline at end of file diff --git a/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java b/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java new file mode 100644 index 0000000000..88de057fc8 --- /dev/null +++ b/junit5/src/main/java/com/baeldung/junit5/NameAscendingOrderOfExecutionTest.java @@ -0,0 +1,33 @@ +package com.baeldung.junit5; + +import static org.junit.Assert.assertEquals; + +import org.junit.AfterClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class NameAscendingOrderOfExecutionTest { + private static StringBuilder output = new StringBuilder(""); + + @Test + public void secondTest() { + output.append("b"); + } + + @Test + public void thirdTest() { + output.append("c"); + } + + @Test + public void firstTest() { + output.append("a"); + } + + @AfterClass + public static void assertOutput() { + assertEquals(output.toString(), "abc"); + } +} diff --git a/junit5/src/test/java/com/baeldung/AssertionUnitTest.java b/junit5/src/test/java/com/baeldung/AssertionUnitTest.java deleted file mode 100644 index 6fefd4e06d..0000000000 --- a/junit5/src/test/java/com/baeldung/AssertionUnitTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -import org.junit.jupiter.api.Test; - -public class AssertionUnitTest { - - @Test - public void testConvertToDoubleThrowException() { - String age = "eighteen"; - assertThrows(NumberFormatException.class, () -> { - convertToInt(age); - }); - - assertThrows(NumberFormatException.class, () -> { - convertToInt(age); - }); - } - - private static Integer convertToInt(String str) { - if (str == null) { - return null; - } - return Integer.valueOf(str); - } - -} diff --git a/libraries-data/README.md b/libraries-data/README.md index ceb0a1d5f7..9e8d32fa44 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -2,3 +2,4 @@ - [Introduction to Reladomo](http://www.baeldung.com/reladomo) - [Introduction to ORMLite](http://www.baeldung.com/ormlite) - [Introduction To Kryo](http://www.baeldung.com/kryo) +- [Introduction to KafkaStreams in Java](http://www.baeldung.com/java-kafka-streams) diff --git a/libraries-data/file.dat b/libraries-data/file.dat new file mode 100644 index 0000000000..70177cef97 Binary files /dev/null and b/libraries-data/file.dat differ diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 90b1f6bb1d..4727ca2222 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung @@ -15,18 +16,18 @@ kryo ${kryo.version} - + com.h2database h2 ${h2.version} - + junit junit ${junit.version} test - + com.goldmansachs.reladomo reladomo ${reladomo.version} @@ -41,8 +42,31 @@ ormlite-jdbc ${ormlite.version} + + org.apache.kafka + kafka-streams + ${kafka.version} + + + org.apache.kafka + kafka-clients + ${kafka.version} + + + org.slf4j + slf4j-log4j12 + + + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + test + - + @@ -68,24 +92,24 @@ - + + classname="com.gs.fw.common.mithra.generator.MithraGenerator"/> + xml="${project.basedir}/src/main/resources/reladomo/ReladomoClassList.xml" + generateGscListMethod="true" + generatedDir="${project.build.directory}/generated-sources/reladomo" + nonGeneratedDir="${project.basedir}/src/main/java"/> - + classname="com.gs.fw.common.mithra.generator.dbgenerator.MithraDbDefinitionGenerator" + loaderRef="reladomoGenerator"> + + xml="${project.basedir}/src/main/resources/reladomo/ReladomoClassList.xml" + generatedDir="${project.build.directory}/generated-db/sql" + databaseType="postgres"/> @@ -139,16 +163,23 @@ - + - + + + + Apache Staging + https://repository.apache.org/content/groups/staging + + 4.0.1 1.4.196 16.5.1 4.12 - 3.6.2 + 3.7.0 5.0 + 1.0.0 \ No newline at end of file diff --git a/libraries-data/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/libraries-data/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java new file mode 100644 index 0000000000..32568e9ea5 --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java @@ -0,0 +1,62 @@ +package com.baeldung.kafkastreams; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.Serde; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.StreamsConfig; +import org.apache.kafka.streams.kstream.KStream; +import org.apache.kafka.streams.kstream.KStreamBuilder; +import org.apache.kafka.streams.kstream.KTable; +import org.apache.kafka.test.TestUtils; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Properties; +import java.util.regex.Pattern; + +public class KafkaStreamsLiveTest { + private String bootstrapServers = "localhost:9092"; + + @Test + @Ignore("it needs to have kafka broker running on local") + public void shouldTestKafkaStreams() throws InterruptedException { + //given + String inputTopic = "inputTopic"; + + Properties streamsConfiguration = new Properties(); + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-live-test"); + streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + streamsConfiguration.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 1000); + streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + // Use a temporary directory for storing state, which will be automatically removed after the test. + streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, TestUtils.tempDirectory().getAbsolutePath()); + + //when + KStreamBuilder builder = new KStreamBuilder(); + KStream textLines = builder.stream(inputTopic); + Pattern pattern = Pattern.compile("\\W+", Pattern.UNICODE_CHARACTER_CLASS); + + KTable wordCounts = textLines + .flatMapValues(value -> Arrays.asList(pattern.split(value.toLowerCase()))) + .groupBy((key, word) -> word) + .count(); + + wordCounts.foreach((word, count) -> System.out.println("word: " + word + " -> " + count)); + + String outputTopic = "outputTopic"; + final Serde stringSerde = Serdes.String(); + final Serde longSerde = Serdes.Long(); + wordCounts.to(stringSerde, longSerde, outputTopic); + + KafkaStreams streams = new KafkaStreams(builder, streamsConfiguration); + streams.start(); + + //then + Thread.sleep(30000); + streams.close(); + } +} diff --git a/libraries/README.md b/libraries/README.md index c6bbb5634c..5e4ef6a898 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -30,7 +30,7 @@ - [Introduction to Neuroph](http://www.baeldung.com/neuroph) - [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) -- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception) +- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) - [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) @@ -39,7 +39,6 @@ - [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv) - [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference) - [Introduction to NoException](http://www.baeldung.com/no-exception) -- [Introduction to FunctionalJava](http://www.baeldung.com/functional-java) - [Apache Commons IO](http://www.baeldung.com/apache-commons-io) - [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) - [Introduction to javax.measure](http://www.baeldung.com/javax-measure) @@ -53,7 +52,19 @@ - [Using Pairs in Java](http://www.baeldung.com/java-pairs) - [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) -+-[Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) +- [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) +- [Introduction To Docx4J](http://www.baeldung.com/docx4j) +- [Introduction to StreamEx](http://www.baeldung.com/streamex) +- [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle) +- [Intro to JDO Queries 2/2](http://www.baeldung.com/jdo-queries) +- [Guide to google-http-client](http://www.baeldung.com/google-http-client) +- [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client) +- [Programatically Create, Configure, and Run a Tomcat Server] (http://www.baeldung.com/tomcat-programmatic-setup) +- [A Docker Guide for Java](http://www.baeldung.com/docker-java-api) +- [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling) +- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic) + + The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. diff --git a/libraries/helloWorld.docx b/libraries/helloWorld.docx new file mode 100644 index 0000000000..12eba0a6c8 Binary files /dev/null and b/libraries/helloWorld.docx differ diff --git a/libraries/log4j.properties b/libraries/log4j.properties index e69de29bb2..2173c5d96f 100644 --- a/libraries/log4j.properties +++ b/libraries/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries/pom.xml b/libraries/pom.xml index 25c1113fea..e9bfecf527 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,120 +1,22 @@ - + + 4.0.0 + libraries + libraries + parent-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - libraries - libraries - - - - org.apache.maven.plugins - maven-dependency-plugin - - - org.apache.felix - maven-bundle-plugin - 3.3.0 - maven-plugin - - - true - - - maven-failsafe-plugin - 2.20 - - - chromedriver - - - - - net.serenity-bdd.maven.plugins - serenity-maven-plugin - ${serenity.plugin.version} - - - serenity-reports - post-integration-test - - aggregate - - - - - - - org.datanucleus - datanucleus-maven-plugin - 5.0.2 - - JDO - ${basedir}/datanucleus.properties - ${basedir}/log4j.properties - true - false - - - - - process-classes - - enhance - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - **/log4j.properties - - - - com.baeldung.neuroph.NeurophXOR - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - - test - test - - test - - - - test/java/com/baeldung/neuroph/XORTest.java - - - - - - - - maven-compiler-plugin - - 1.8 - 1.8 - - - - + + + + org.asynchttpclient + async-http-client + ${async.http.client.version} + org.beykery @@ -193,6 +95,11 @@ jetty-servlet ${jetty.version} + + org.eclipse.jetty + jetty-webapp + ${jetty.version} + rome rome @@ -612,16 +519,120 @@ caffeine ${caffeine.version} - - org.bouncycastle - bcprov-jdk15on - 1.58 - - - org.bouncycastle - bcpkix-jdk15on - 1.58 - + + org.bouncycastle + bcprov-jdk15on + 1.58 + + + org.bouncycastle + bcpkix-jdk15on + 1.58 + + + com.google.http-client + google-http-client + ${googleclient.version} + + + com.google.http-client + google-http-client-jackson2 + ${googleclient.version} + + + com.google.http-client + google-http-client-gson + ${googleclient.version} + + + org.infinispan + infinispan-core + ${infinispan.version} + + + + + com.github.docker-java + docker-java + ${docker.version} + + + org.slf4j + slf4j-log4j12 + + + org.slf4j + jcl-over-slf4j + + + ch.qos.logback + logback-classic + + + + + com.sun.jersey + jersey-client + 1.19.4 + + + + + + com.google.api-client + google-api-client + ${google-api.version} + + + com.google.oauth-client + google-oauth-client-jetty + ${google-api.version} + + + com.google.apis + google-api-services-sheets + ${google-sheets.version} + + + org.apache.kafka + kafka-streams + ${kafka.version} + + + org.apache.kafka + kafka-clients + ${kafka.version} + + + org.slf4j + slf4j-log4j12 + + + + + org.apache.kafka + kafka-clients + ${kafka.version} + test + test + + + + + org.apache.tomcat + tomcat-catalina + ${tomcat.version} + + + org.milyn + milyn-smooks-all + ${smooks.version} + + + com.mashape.unirest + unirest-java + ${unirest.version} + @@ -637,8 +648,115 @@ bintray http://dl.bintray.com/cuba-platform/main + + Apache Staging + https://repository.apache.org/content/groups/staging + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.apache.felix + maven-bundle-plugin + 3.3.0 + maven-plugin + + + true + + + maven-failsafe-plugin + 2.20 + + + chromedriver + + + + + net.serenity-bdd.maven.plugins + serenity-maven-plugin + ${serenity.plugin.version} + + + serenity-reports + post-integration-test + + aggregate + + + + + + + org.datanucleus + datanucleus-maven-plugin + 5.0.2 + + JDO + ${basedir}/datanucleus.properties + ${basedir}/log4j.properties + true + false + + + + + process-classes + + enhance + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + **/log4j.properties + + + + com.baeldung.neuroph.NeurophXOR + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + 1.23.0 0.1.0 0.7.0 3.2.4 @@ -653,12 +771,11 @@ 3.6.2 1.5.0 3.1.0 - 9.4.3.v20170317 4.5.3 2.5 1.6 1.4.196 - 9.4.2.v20170220 + 9.4.8.v20171121 4.5.3 2.5 1.2.0 @@ -669,7 +786,7 @@ 1.1.3-rc.5 1.4.0 1.1.0 - 4.1.15.Final + 4.1.20.Final 4.1 4.12 0.10 @@ -694,5 +811,15 @@ 1.0.0 3.8.4 2.5.5 + 1.23.0 + v4-rev493-1.21.0 + 1.0.0 + 1.7.0 + 3.0.14 + 8.5.24 + 2.2.0 + 9.1.5.Final + 1.4.9 + diff --git a/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java b/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java index 5d8a7a6643..d7040407db 100644 --- a/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java +++ b/libraries/src/main/java/com/baeldung/bouncycastle/BouncyCastleCrypto.java @@ -42,8 +42,7 @@ import org.bouncycastle.util.Store; public class BouncyCastleCrypto { - public static byte[] signData(byte[] data, final X509Certificate signingCertificate, final PrivateKey signingKey) - throws CertificateEncodingException, OperatorCreationException, CMSException, IOException { + public static byte[] signData(byte[] data, final X509Certificate signingCertificate, final PrivateKey signingKey) throws CertificateEncodingException, OperatorCreationException, CMSException, IOException { byte[] signedMessage = null; List certList = new ArrayList(); CMSTypedData cmsData = new CMSProcessableByteArray(data); @@ -51,17 +50,14 @@ public class BouncyCastleCrypto { Store certs = new JcaCertStore(certList); CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator(); ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256withRSA").build(signingKey); - cmsGenerator.addSignerInfoGenerator( - new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()) - .build(contentSigner, signingCertificate)); + cmsGenerator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(contentSigner, signingCertificate)); cmsGenerator.addCertificates(certs); CMSSignedData cms = cmsGenerator.generate(cmsData, true); signedMessage = cms.getEncoded(); return signedMessage; } - public static boolean verifSignData(final byte[] signedData) - throws CMSException, IOException, OperatorCreationException, CertificateException { + public static boolean verifSignData(final byte[] signedData) throws CMSException, IOException, OperatorCreationException, CertificateException { ByteArrayInputStream bIn = new ByteArrayInputStream(signedData); ASN1InputStream aIn = new ASN1InputStream(bIn); CMSSignedData s = new CMSSignedData(ContentInfo.getInstance(aIn.readObject())); @@ -81,16 +77,14 @@ public class BouncyCastleCrypto { return true; } - public static byte[] encryptData(final byte[] data, X509Certificate encryptionCertificate) - throws CertificateEncodingException, CMSException, IOException { + public static byte[] encryptData(final byte[] data, X509Certificate encryptionCertificate) throws CertificateEncodingException, CMSException, IOException { byte[] encryptedData = null; if (null != data && null != encryptionCertificate) { CMSEnvelopedDataGenerator cmsEnvelopedDataGenerator = new CMSEnvelopedDataGenerator(); JceKeyTransRecipientInfoGenerator jceKey = new JceKeyTransRecipientInfoGenerator(encryptionCertificate); cmsEnvelopedDataGenerator.addRecipientInfoGenerator(jceKey); CMSTypedData msg = new CMSProcessableByteArray(data); - OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider("BC") - .build(); + OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMSAlgorithm.AES128_CBC).setProvider("BC").build(); CMSEnvelopedData cmsEnvelopedData = cmsEnvelopedDataGenerator.generate(msg, encryptor); encryptedData = cmsEnvelopedData.getEncoded(); } diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java b/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java index d0362a6c92..849e363c4b 100644 --- a/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java +++ b/libraries/src/main/java/com/baeldung/bytebuddy/Bar.java @@ -5,12 +5,17 @@ import net.bytebuddy.implementation.bind.annotation.BindingPriority; public class Bar { @BindingPriority(3) - public static String sayHelloBar() { return "Holla in Bar!"; } + public static String sayHelloBar() { + return "Holla in Bar!"; + } @BindingPriority(2) - public static String sayBar() { return "bar"; } - - public String bar() { return Bar.class.getSimpleName() + " - Bar"; } + public static String sayBar() { + return "bar"; + } + public String bar() { + return Bar.class.getSimpleName() + " - Bar"; + } } diff --git a/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java b/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java index 4be06785b1..9410fc6a13 100644 --- a/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java +++ b/libraries/src/main/java/com/baeldung/bytebuddy/Foo.java @@ -2,6 +2,8 @@ package com.baeldung.bytebuddy; public class Foo { - public String sayHelloFoo() { return "Hello in Foo!"; } + public String sayHelloFoo() { + return "Hello in Foo!"; + } } diff --git a/libraries/src/main/java/com/baeldung/caffeine/DataObject.java b/libraries/src/main/java/com/baeldung/caffeine/DataObject.java index a90b3e9f21..65c4c6919f 100644 --- a/libraries/src/main/java/com/baeldung/caffeine/DataObject.java +++ b/libraries/src/main/java/com/baeldung/caffeine/DataObject.java @@ -19,9 +19,7 @@ final class DataObject { @Override public String toString() { - return "DataObject{" + - "data='" + data + '\'' + - '}'; + return "DataObject{" + "data='" + data + '\'' + '}'; } public static DataObject get(String data) { diff --git a/libraries/src/main/java/com/baeldung/chronicle/queue/ChronicleQueue.java b/libraries/src/main/java/com/baeldung/chronicle/queue/ChronicleQueue.java index f6bd25c0fe..354291ebd7 100644 --- a/libraries/src/main/java/com/baeldung/chronicle/queue/ChronicleQueue.java +++ b/libraries/src/main/java/com/baeldung/chronicle/queue/ChronicleQueue.java @@ -7,9 +7,7 @@ import net.openhft.chronicle.ExcerptAppender; public class ChronicleQueue { - static void writeToQueue( - Chronicle chronicle, String stringValue, int intValue, long longValue, double doubleValue) - throws IOException { + static void writeToQueue(Chronicle chronicle, String stringValue, int intValue, long longValue, double doubleValue) throws IOException { ExcerptAppender appender = chronicle.createAppender(); appender.startExcerpt(); appender.writeUTF(stringValue); diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java index 4a0b59404d..b88ee6624d 100644 --- a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java @@ -24,7 +24,7 @@ public class CourseEntity { public void setCodes(List codes) { this.codes = codes; } - + public void setStudent(String id, Student student) { students.put(id, student); } diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java index 1f566a782a..538fa3accb 100644 --- a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java @@ -8,33 +8,27 @@ import org.apache.commons.beanutils.PropertyUtils; public class CourseService { - public static void setValues(Course course, String name, List codes) - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + public static void setValues(Course course, String name, List codes) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { // Setting the simple properties PropertyUtils.setSimpleProperty(course, "name", name); PropertyUtils.setSimpleProperty(course, "codes", codes); } - - public static void setIndexedValue(Course course, int codeIndex, String code) - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + public static void setIndexedValue(Course course, int codeIndex, String code) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { // Setting the indexed properties PropertyUtils.setIndexedProperty(course, "codes[" + codeIndex + "]", code); } - public static void setMappedValue(Course course, String enrollId, Student student) - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + public static void setMappedValue(Course course, String enrollId, Student student) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { // Setting the mapped properties PropertyUtils.setMappedProperty(course, "enrolledStudent(" + enrollId + ")", student); } - - public static String getNestedValue(Course course, String enrollId, String nestedPropertyName) - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { - return (String) PropertyUtils.getNestedProperty( - course, "enrolledStudent(" + enrollId + ")." + nestedPropertyName); + + public static String getNestedValue(Course course, String enrollId, String nestedPropertyName) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + return (String) PropertyUtils.getNestedProperty(course, "enrolledStudent(" + enrollId + ")." + nestedPropertyName); } - - public static void copyProperties(Course course, CourseEntity courseEntity) - throws IllegalAccessException, InvocationTargetException { + + public static void copyProperties(Course course, CourseEntity courseEntity) throws IllegalAccessException, InvocationTargetException { BeanUtils.copyProperties(course, courseEntity); } } diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java b/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java index 973e2d498e..0acb222aa1 100644 --- a/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java +++ b/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java @@ -7,7 +7,7 @@ public class AuditFilter implements Filter { @Override public boolean postprocess(Context context, Exception exception) { - // Send notification to customer & bank. + // Send notification to customer & bank. return false; } diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java index e22f13861e..1c6a8dc4f1 100644 --- a/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java +++ b/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java @@ -73,7 +73,7 @@ public class Customer implements Comparable { this.name = name; this.phone = phone; } - + public Customer(String name) { super(); this.name = name; diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java b/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java index c82798d52d..7f24230c43 100644 --- a/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java +++ b/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java @@ -20,7 +20,6 @@ public class Email { public void setEmployeeId(Integer employeeId) { this.employeeId = employeeId; } - public String getAddress() { return address; diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java index 35cae7426d..74e775383b 100644 --- a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java +++ b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java @@ -26,9 +26,7 @@ public class BuilderMethods { @Override public int hashCode() { - return new HashCodeBuilder().append(this.intValue) - .append(this.strSample) - .toHashCode(); + return new HashCodeBuilder().append(this.intValue).append(this.strSample).toHashCode(); } @Override @@ -41,16 +39,12 @@ public class BuilderMethods { } final BuilderMethods otherObject = (BuilderMethods) obj; - return new EqualsBuilder().append(this.intValue, otherObject.intValue) - .append(this.strSample, otherObject.strSample) - .isEquals(); + return new EqualsBuilder().append(this.intValue, otherObject.intValue).append(this.strSample, otherObject.strSample).isEquals(); } @Override public String toString() { - return new ToStringBuilder(this).append("INTVALUE", this.intValue) - .append("STRINGVALUE", this.strSample) - .toString(); + return new ToStringBuilder(this).append("INTVALUE", this.intValue).append("STRINGVALUE", this.strSample).toString(); } public static void main(final String[] arguments) { @@ -58,21 +52,21 @@ public class BuilderMethods { System.out.println(simple1.getName()); System.out.println(simple1.hashCode()); System.out.println(simple1.toString()); - + SampleLazyInitializer sampleLazyInitializer = new SampleLazyInitializer(); - + try { sampleLazyInitializer.get(); } catch (ConcurrentException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } - + SampleBackgroundInitializer sampleBackgroundInitializer = new SampleBackgroundInitializer(); sampleBackgroundInitializer.start(); - + // Proceed with other tasks instead of waiting for the SampleBackgroundInitializer task to finish. - + try { Object result = sampleBackgroundInitializer.get(); } catch (ConcurrentException e) { @@ -81,13 +75,13 @@ public class BuilderMethods { } } -class SampleBackgroundInitializer extends BackgroundInitializer{ +class SampleBackgroundInitializer extends BackgroundInitializer { @Override protected String initialize() throws Exception { return null; } - + // Any complex task that takes some time - + } diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java b/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java index 56a49d2659..52c6e9c9aa 100644 --- a/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java +++ b/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java @@ -3,7 +3,7 @@ package com.baeldung.commons.lang3; import org.apache.commons.lang3.concurrent.LazyInitializer; public class SampleLazyInitializer extends LazyInitializer { - + @Override protected SampleObject initialize() { return new SampleObject(); diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java b/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java index 0e61176732..4595f4c6d0 100644 --- a/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java +++ b/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java @@ -1,7 +1,7 @@ package com.baeldung.commons.lang3; public class SampleObject { - - //Ignored + + // Ignored } diff --git a/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java b/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java index d9c87b3889..97fbf4adc7 100644 --- a/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java +++ b/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java @@ -53,16 +53,12 @@ class Docx4jExample { File image = new File(imagePath); byte[] fileContent = Files.readAllBytes(image.toPath()); - BinaryPartAbstractImage imagePart = BinaryPartAbstractImage - .createImagePart(wordPackage, fileContent); - Inline inline = imagePart.createImageInline( - "Baeldung Image", "Alt Text", 1, 2, false); + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordPackage, fileContent); + Inline inline = imagePart.createImageInline("Baeldung Image", "Alt Text", 1, 2, false); P Imageparagraph = addImageToParagraph(inline); mainDocumentPart.getContent().add(Imageparagraph); - int writableWidthTwips = wordPackage.getDocumentModel() - .getSections().get(0).getPageDimensions() - .getWritableWidthTwips(); + int writableWidthTwips = wordPackage.getDocumentModel().getSections().get(0).getPageDimensions().getWritableWidthTwips(); int columnNumber = 3; Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips / columnNumber); List rows = tbl.getContent(); diff --git a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java index 069baeab9f..9d1b011e0e 100644 --- a/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java +++ b/libraries/src/main/java/com/baeldung/eclipsecollections/ConvertContainerToAnother.java @@ -2,7 +2,6 @@ package com.baeldung.eclipsecollections; import java.util.List; -import org.eclipse.collections.api.list.MutableList; import org.eclipse.collections.impl.set.mutable.UnifiedSet; public class ConvertContainerToAnother { diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java b/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java index ebf0fa4d2d..eaa201d1ba 100644 --- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java +++ b/libraries/src/main/java/com/baeldung/fj/FunctionalJavaIOMain.java @@ -7,7 +7,7 @@ import fj.data.IO; import fj.data.IOFunctions; public class FunctionalJavaIOMain { - + public static IO printLetters(final String s) { return () -> { for (int i = 0; i < s.length(); i++) { @@ -21,8 +21,7 @@ public class FunctionalJavaIOMain { F> printLetters = i -> printLetters(i); - IO lowerCase = IOFunctions - .stdoutPrintln("What's your first Name ?"); + IO lowerCase = IOFunctions.stdoutPrintln("What's your first Name ?"); IO input = IOFunctions.stdoutPrint("First Name: "); @@ -32,14 +31,11 @@ public class FunctionalJavaIOMain { F toUpperCase = i -> i.toUpperCase(); - F> transformInput = F1Functions - ., String> o(printLetters).f(toUpperCase); + F> transformInput = F1Functions., String> o(printLetters).f(toUpperCase); - IO readAndPrintResult = IOFunctions.bind(readInput, - transformInput); + IO readAndPrintResult = IOFunctions.bind(readInput, transformInput); - IO program = IOFunctions.bind(userInput, - nothing -> readAndPrintResult); + IO program = IOFunctions.bind(userInput, nothing -> readAndPrintResult); IOFunctions.toSafe(program).run(); diff --git a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java b/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java index e4d731454d..c6412f2923 100644 --- a/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java +++ b/libraries/src/main/java/com/baeldung/fj/FunctionalJavaMain.java @@ -11,16 +11,16 @@ import fj.function.Integers; public class FunctionalJavaMain { public static final F isEven = i -> i % 2 == 0; - + public static void main(String[] args) { - + List fList = List.list(3, 4, 5, 6); List evenList = fList.map(isEven); Show.listShow(Show.booleanShow).println(evenList); - + fList = fList.map(i -> i + 1); Show.listShow(Show.intShow).println(fList); - + Array a = Array.array(17, 44, 67, 2, 22, 80, 1, 27); Array b = a.filter(Integers.even); Show.arrayShow(Show.intShow).println(b); @@ -28,11 +28,11 @@ public class FunctionalJavaMain { Array array = Array.array("Welcome", "To", "baeldung"); Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); System.out.println(isExist); - + Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27); int sum = intArray.foldLeft(Integers.add, 0); System.out.println(sum); - + Option n1 = Option.some(1); Option n2 = Option.some(2); diff --git a/libraries/src/main/java/com/baeldung/flink/LineSplitter.java b/libraries/src/main/java/com/baeldung/flink/LineSplitter.java index 8deeeb01c4..f4e322f1e8 100644 --- a/libraries/src/main/java/com/baeldung/flink/LineSplitter.java +++ b/libraries/src/main/java/com/baeldung/flink/LineSplitter.java @@ -13,8 +13,6 @@ public class LineSplitter implements FlatMapFunction> out) { String[] tokens = value.toLowerCase().split("\\W+"); - Stream.of(tokens) - .filter(t -> t.length() > 0) - .forEach(token -> out.collect(new Tuple2<>(token, 1))); + Stream.of(tokens).filter(t -> t.length() > 0).forEach(token -> out.collect(new Tuple2<>(token, 1))); } } \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/flink/WordCount.java b/libraries/src/main/java/com/baeldung/flink/WordCount.java index ab109bdbce..fc5064bafa 100644 --- a/libraries/src/main/java/com/baeldung/flink/WordCount.java +++ b/libraries/src/main/java/com/baeldung/flink/WordCount.java @@ -12,9 +12,7 @@ public class WordCount { public static DataSet> startWordCount(ExecutionEnvironment env, List lines) throws Exception { DataSet text = env.fromCollection(lines); - return text.flatMap(new LineSplitter()) - .groupBy(0) - .aggregate(Aggregations.SUM, 1); + return text.flatMap(new LineSplitter()).groupBy(0).aggregate(Aggregations.SUM, 1); } } \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java new file mode 100644 index 0000000000..641fae42dd --- /dev/null +++ b/libraries/src/main/java/com/baeldung/google/sheets/GoogleAuthorizeUtil.java @@ -0,0 +1,34 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.List; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.store.MemoryDataStoreFactory; +import com.google.api.services.sheets.v4.SheetsScopes; + +public class GoogleAuthorizeUtil { + public static Credential authorize() throws IOException, GeneralSecurityException { + InputStream in = GoogleAuthorizeUtil.class.getResourceAsStream("/google-sheets-client-secret.json"); + GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in)); + + List scopes = Arrays.asList(SheetsScopes.SPREADSHEETS); + + GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), clientSecrets, scopes).setDataStoreFactory(new MemoryDataStoreFactory()) + .setAccessType("offline").build(); + Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); + + return credential; + } + +} diff --git a/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java b/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java new file mode 100644 index 0000000000..8a78d50551 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/google/sheets/SheetsServiceUtil.java @@ -0,0 +1,20 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.sheets.v4.Sheets; + +public class SheetsServiceUtil { + + private static final String APPLICATION_NAME = "Google Sheets Example"; + + public static Sheets getSheetsService() throws IOException, GeneralSecurityException { + Credential credential = GoogleAuthorizeUtil.authorize(); + return new Sheets.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), credential).setApplicationName(APPLICATION_NAME).build(); + } + +} diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java new file mode 100644 index 0000000000..fce47c6ada --- /dev/null +++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubExample.java @@ -0,0 +1,56 @@ +package com.baeldung.googlehttpclientguide; + +import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler; +import com.google.api.client.http.HttpRequest; +import com.google.api.client.http.HttpRequestFactory; +import com.google.api.client.http.HttpResponse; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.json.JsonObjectParser; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.util.ExponentialBackOff; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class GitHubExample { + static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); + // static final HttpTransport HTTP_TRANSPORT = new ApacheHttpTransport(); + static final JsonFactory JSON_FACTORY = new JacksonFactory(); + // static final JsonFactory JSON_FACTORY = new GsonFactory(); + + private static void run() throws Exception { + HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory((HttpRequest request) -> { + request.setParser(new JsonObjectParser(JSON_FACTORY)); + }); + GitHubUrl url = new GitHubUrl("https://api.github.com/users"); + url.per_page = 10; + url.page = 1; + HttpRequest request = requestFactory.buildGetRequest(url); + ExponentialBackOff backoff = new ExponentialBackOff.Builder().setInitialIntervalMillis(500).setMaxElapsedTimeMillis(900000).setMaxIntervalMillis(6000).setMultiplier(1.5).setRandomizationFactor(0.5).build(); + request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff)); + Type type = new TypeToken>() { + }.getType(); + List users = (List) request.execute().parseAs(type); + System.out.println(users); + url.appendRawPath("/eugenp"); + request = requestFactory.buildGetRequest(url); + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future responseFuture = request.executeAsync(executor); + User eugen = responseFuture.get().parseAs(User.class); + System.out.println(eugen); + executor.shutdown(); + } + + public static void main(String[] args) { + try { + run(); + } catch (Exception e) { + System.err.println(e.getMessage()); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java new file mode 100644 index 0000000000..ea1b83e9fb --- /dev/null +++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/GitHubUrl.java @@ -0,0 +1,18 @@ +package com.baeldung.googlehttpclientguide; + +import com.google.api.client.http.GenericUrl; +import com.google.api.client.util.Key; + +public class GitHubUrl extends GenericUrl { + + public GitHubUrl(String encodedUrl) { + super(encodedUrl); + } + + @Key + public int per_page; + + @Key + public int page; + +} diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java b/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java new file mode 100644 index 0000000000..88361e158e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/User.java @@ -0,0 +1,76 @@ +package com.baeldung.googlehttpclientguide; + +import com.google.api.client.json.GenericJson; +import com.google.api.client.util.Key; + +public class User extends GenericJson { + @Key + private String login; + @Key + private long id; + @Key + private String url; + @Key + private String company; + @Key + private String blog; + @Key + private String email; + + @Key("subscriptions_url") + private String subscriptionsUrl; + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public String getBlog() { + return blog; + } + + public void setBlog(String blog) { + this.blog = blog; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User{" + "login=" + login + ", id=" + id + ", url=" + url + ", company=" + company + ", blog=" + blog + ", email=" + email + '}'; + } + +} diff --git a/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties b/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties new file mode 100644 index 0000000000..02489378df --- /dev/null +++ b/libraries/src/main/java/com/baeldung/googlehttpclientguide/logging.properties @@ -0,0 +1,10 @@ +# Properties file which configures the operation of the JDK logging facility. +# The system will look for this config file to be specified as a system property: +# -Djava.util.logging.config.file=${project_loc:dailymotion-simple-cmdline-sample}/logging.properties + +# Set up the console handler (uncomment "level" to show more fine-grained messages) +handlers = java.util.logging.ConsoleHandler +java.util.logging.ConsoleHandler.level = ALL + +# Set up logging of HTTP requests and responses (uncomment "level" to show) +com.google.api.client.http.level = ALL diff --git a/libraries/src/main/java/com/baeldung/hikaricp/DataSource.java b/libraries/src/main/java/com/baeldung/hikaricp/DataSource.java index ff4bc939aa..e8d3b4ff96 100644 --- a/libraries/src/main/java/com/baeldung/hikaricp/DataSource.java +++ b/libraries/src/main/java/com/baeldung/hikaricp/DataSource.java @@ -1,9 +1,7 @@ package com.baeldung.hikaricp; -import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; -import java.util.Properties; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; @@ -14,15 +12,15 @@ public class DataSource { private static HikariDataSource ds; static { -// config = new HikariConfig("datasource.properties"); - -// Properties props = new Properties(); -// props.setProperty("dataSourceClassName", "org.h2.Driver"); -// props.setProperty("dataSource.user", ""); -// props.setProperty("dataSource.password", ""); -// props.put("dataSource.logWriter", new PrintWriter(System.out)); -// config = new HikariConfig(props); - + // config = new HikariConfig("datasource.properties"); + + // Properties props = new Properties(); + // props.setProperty("dataSourceClassName", "org.h2.Driver"); + // props.setProperty("dataSource.user", ""); + // props.setProperty("dataSource.password", ""); + // props.put("dataSource.logWriter", new PrintWriter(System.out)); + // config = new HikariConfig(props); + config.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'"); config.setUsername(""); config.setPassword(""); @@ -30,13 +28,14 @@ public class DataSource { config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); ds = new HikariDataSource(config); - -// ds.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'"); -// ds.setUsername(""); -// ds.setPassword(""); + + // ds.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'"); + // ds.setUsername(""); + // ds.setPassword(""); } - private DataSource() {} + private DataSource() { + } public static Connection getConnection() throws SQLException { return ds.getConnection(); diff --git a/libraries/src/main/java/com/baeldung/hikaricp/HikariCPDemo.java b/libraries/src/main/java/com/baeldung/hikaricp/HikariCPDemo.java index af36ab7508..57d124fd5d 100644 --- a/libraries/src/main/java/com/baeldung/hikaricp/HikariCPDemo.java +++ b/libraries/src/main/java/com/baeldung/hikaricp/HikariCPDemo.java @@ -12,9 +12,7 @@ public class HikariCPDemo { public static List fetchData() { final String SQL_QUERY = "select * from emp"; List employees = null; - try (Connection con = DataSource.getConnection(); - PreparedStatement pst = con.prepareStatement(SQL_QUERY); - ResultSet rs = pst.executeQuery();) { + try (Connection con = DataSource.getConnection(); PreparedStatement pst = con.prepareStatement(SQL_QUERY); ResultSet rs = pst.executeQuery();) { employees = new ArrayList(); Employee employee; while (rs.next()) { @@ -38,5 +36,5 @@ public class HikariCPDemo { public static void main(String[] args) { fetchData(); } - + } diff --git a/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java b/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java new file mode 100644 index 0000000000..eda511d7a7 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/infinispan/CacheConfiguration.java @@ -0,0 +1,70 @@ +package com.baeldung.infinispan; + +import com.baeldung.infinispan.listener.CacheListener; +import org.infinispan.Cache; +import org.infinispan.configuration.cache.Configuration; +import org.infinispan.configuration.cache.ConfigurationBuilder; +import org.infinispan.eviction.EvictionType; +import org.infinispan.manager.DefaultCacheManager; +import org.infinispan.transaction.LockingMode; +import org.infinispan.transaction.TransactionMode; + +import java.util.concurrent.TimeUnit; + +public class CacheConfiguration { + + public static final String SIMPLE_HELLO_WORLD_CACHE = "simple-hello-world-cache"; + public static final String EXPIRING_HELLO_WORLD_CACHE = "expiring-hello-world-cache"; + public static final String EVICTING_HELLO_WORLD_CACHE = "evicting-hello-world-cache"; + public static final String PASSIVATING_HELLO_WORLD_CACHE = "passivating-hello-world-cache"; + public static final String TRANSACTIONAL_CACHE = "transactional-cache"; + + public DefaultCacheManager cacheManager() { + return new DefaultCacheManager(); + } + + public Cache transactionalCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(TRANSACTIONAL_CACHE, cacheManager, listener, transactionalConfiguration()); + } + + public Cache simpleHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(SIMPLE_HELLO_WORLD_CACHE, cacheManager, listener, new ConfigurationBuilder().build()); + } + + public Cache expiringHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(EXPIRING_HELLO_WORLD_CACHE, cacheManager, listener, expiringConfiguration()); + } + + public Cache evictingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(EVICTING_HELLO_WORLD_CACHE, cacheManager, listener, evictingConfiguration()); + } + + public Cache passivatingHelloWorldCache(DefaultCacheManager cacheManager, CacheListener listener) { + return this.buildCache(PASSIVATING_HELLO_WORLD_CACHE, cacheManager, listener, passivatingConfiguration()); + } + + private Cache buildCache(String cacheName, DefaultCacheManager cacheManager, CacheListener listener, Configuration configuration) { + + cacheManager.defineConfiguration(cacheName, configuration); + Cache cache = cacheManager.getCache(cacheName); + cache.addListener(listener); + return cache; + } + + private Configuration expiringConfiguration() { + return new ConfigurationBuilder().expiration().lifespan(1, TimeUnit.SECONDS).build(); + } + + private Configuration evictingConfiguration() { + return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).build(); + } + + private Configuration passivatingConfiguration() { + return new ConfigurationBuilder().memory().evictionType(EvictionType.COUNT).size(1).persistence().passivation(true).addSingleFileStore().purgeOnStartup(true).location(System.getProperty("java.io.tmpdir")).build(); + } + + private Configuration transactionalConfiguration() { + return new ConfigurationBuilder().transaction().transactionMode(TransactionMode.TRANSACTIONAL).lockingMode(LockingMode.PESSIMISTIC).build(); + } + +} diff --git a/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java b/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java new file mode 100644 index 0000000000..942a2fb62d --- /dev/null +++ b/libraries/src/main/java/com/baeldung/infinispan/listener/CacheListener.java @@ -0,0 +1,53 @@ +package com.baeldung.infinispan.listener; + +import org.infinispan.notifications.Listener; +import org.infinispan.notifications.cachelistener.annotation.*; +import org.infinispan.notifications.cachelistener.event.*; + +@Listener +public class CacheListener { + + @CacheEntryCreated + public void entryCreated(CacheEntryCreatedEvent event) { + this.printLog("Adding key '" + event.getKey() + "' to cache", event); + } + + @CacheEntryExpired + public void entryExpired(CacheEntryExpiredEvent event) { + this.printLog("Expiring key '" + event.getKey() + "' from cache", event); + } + + @CacheEntryVisited + public void entryVisited(CacheEntryVisitedEvent event) { + this.printLog("Key '" + event.getKey() + "' was visited", event); + } + + @CacheEntryActivated + public void entryActivated(CacheEntryActivatedEvent event) { + this.printLog("Activating key '" + event.getKey() + "' on cache", event); + } + + @CacheEntryPassivated + public void entryPassivated(CacheEntryPassivatedEvent event) { + this.printLog("Passivating key '" + event.getKey() + "' from cache", event); + } + + @CacheEntryLoaded + public void entryLoaded(CacheEntryLoadedEvent event) { + this.printLog("Loading key '" + event.getKey() + "' to cache", event); + } + + @CacheEntriesEvicted + public void entriesEvicted(CacheEntriesEvictedEvent event) { + final StringBuilder builder = new StringBuilder(); + event.getEntries().forEach((key, value) -> builder.append(key).append(", ")); + System.out.println("Evicting following entries from cache: " + builder.toString()); + } + + private void printLog(String log, CacheEntryEvent event) { + if (!event.isPre()) { + System.out.println(log); + } + } + +} diff --git a/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java b/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java new file mode 100644 index 0000000000..85c0d539a3 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/infinispan/repository/HelloWorldRepository.java @@ -0,0 +1,15 @@ +package com.baeldung.infinispan.repository; + +public class HelloWorldRepository { + + public String getHelloWorld() { + try { + System.out.println("Executing some heavy query"); + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "Hello World!"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java b/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java new file mode 100644 index 0000000000..de30cd5c8e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/infinispan/service/HelloWorldService.java @@ -0,0 +1,77 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.listener.CacheListener; +import com.baeldung.infinispan.repository.HelloWorldRepository; +import org.infinispan.Cache; + +import java.util.concurrent.TimeUnit; + +public class HelloWorldService { + + private final HelloWorldRepository repository; + + private final Cache simpleHelloWorldCache; + private final Cache expiringHelloWorldCache; + private final Cache evictingHelloWorldCache; + private final Cache passivatingHelloWorldCache; + + public HelloWorldService(HelloWorldRepository repository, CacheListener listener, Cache simpleHelloWorldCache, Cache expiringHelloWorldCache, Cache evictingHelloWorldCache, + Cache passivatingHelloWorldCache) { + + this.repository = repository; + + this.simpleHelloWorldCache = simpleHelloWorldCache; + this.expiringHelloWorldCache = expiringHelloWorldCache; + this.evictingHelloWorldCache = evictingHelloWorldCache; + this.passivatingHelloWorldCache = passivatingHelloWorldCache; + } + + public String findSimpleHelloWorld() { + String cacheKey = "simple-hello"; + return simpleHelloWorldCache.computeIfAbsent(cacheKey, k -> repository.getHelloWorld()); + } + + public String findExpiringHelloWorld() { + String cacheKey = "expiring-hello"; + String helloWorld = simpleHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + simpleHelloWorldCache.put(cacheKey, helloWorld, 1, TimeUnit.SECONDS); + } + return helloWorld; + } + + public String findIdleHelloWorld() { + String cacheKey = "idle-hello"; + String helloWorld = simpleHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + simpleHelloWorldCache.put(cacheKey, helloWorld, -1, TimeUnit.SECONDS, 10, TimeUnit.SECONDS); + } + return helloWorld; + } + + public String findSimpleHelloWorldInExpiringCache() { + String cacheKey = "simple-hello"; + String helloWorld = expiringHelloWorldCache.get(cacheKey); + if (helloWorld == null) { + helloWorld = repository.getHelloWorld(); + expiringHelloWorldCache.put(cacheKey, helloWorld); + } + return helloWorld; + } + + public String findEvictingHelloWorld(String key) { + String value = evictingHelloWorldCache.get(key); + if (value == null) { + value = repository.getHelloWorld(); + evictingHelloWorldCache.put(key, value); + } + return value; + } + + public String findPassivatingHelloWorld(String key) { + return passivatingHelloWorldCache.computeIfAbsent(key, k -> repository.getHelloWorld()); + } + +} diff --git a/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java b/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java new file mode 100644 index 0000000000..26862b8d65 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/infinispan/service/TransactionalService.java @@ -0,0 +1,55 @@ +package com.baeldung.infinispan.service; + +import org.infinispan.Cache; +import org.springframework.util.StopWatch; + +import javax.transaction.TransactionManager; + +public class TransactionalService { + + private final Cache transactionalCache; + + private static final String KEY = "key"; + + public TransactionalService(Cache transactionalCache) { + this.transactionalCache = transactionalCache; + + transactionalCache.put(KEY, 0); + } + + public Integer getQuickHowManyVisits() { + try { + TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); + tm.begin(); + Integer howManyVisits = transactionalCache.get(KEY); + howManyVisits++; + System.out.println("Ill try to set HowManyVisits to " + howManyVisits); + StopWatch watch = new StopWatch(); + watch.start(); + transactionalCache.put(KEY, howManyVisits); + watch.stop(); + System.out.println("I was able to set HowManyVisits to " + howManyVisits + " after waiting " + watch.getTotalTimeSeconds() + " seconds"); + + tm.commit(); + return howManyVisits; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + public void startBackgroundBatch() { + try { + TransactionManager tm = transactionalCache.getAdvancedCache().getTransactionManager(); + tm.begin(); + transactionalCache.put(KEY, 1000); + System.out.println("HowManyVisits should now be 1000, " + "but we are holding the transaction"); + Thread.sleep(1000L); + tm.rollback(); + System.out.println("The slow batch suffered a rollback"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/libraries/src/main/java/com/baeldung/javasisst/Point.java b/libraries/src/main/java/com/baeldung/javasisst/Point.java index 7e5c1cedd5..7f10e8c371 100644 --- a/libraries/src/main/java/com/baeldung/javasisst/Point.java +++ b/libraries/src/main/java/com/baeldung/javasisst/Point.java @@ -1,6 +1,5 @@ package com.baeldung.javasisst; - public class Point { public int x = 0; public int y = 0; diff --git a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java b/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java index fb24d4b85d..780604738e 100644 --- a/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java +++ b/libraries/src/main/java/com/baeldung/javasisst/ThreeDimensionalPoint.java @@ -1,6 +1,5 @@ package com.baeldung.javasisst; - public class ThreeDimensionalPoint { public int x = 0; public int y = 0; diff --git a/libraries/src/main/java/com/baeldung/javers/Address.java b/libraries/src/main/java/com/baeldung/javers/Address.java index 14f5907ef6..9b0c119046 100644 --- a/libraries/src/main/java/com/baeldung/javers/Address.java +++ b/libraries/src/main/java/com/baeldung/javers/Address.java @@ -1,6 +1,5 @@ package com.baeldung.javers; - public class Address { private String country; diff --git a/libraries/src/main/java/com/baeldung/javers/PersonWithAddress.java b/libraries/src/main/java/com/baeldung/javers/PersonWithAddress.java index 0b4e33fcb5..16be083d83 100644 --- a/libraries/src/main/java/com/baeldung/javers/PersonWithAddress.java +++ b/libraries/src/main/java/com/baeldung/javers/PersonWithAddress.java @@ -1,6 +1,5 @@ package com.baeldung.javers; - import java.util.List; public class PersonWithAddress { diff --git a/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java index ec2c52d3b5..8da601b0cf 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/FilterDemo.java @@ -7,9 +7,9 @@ import org.jdeferred.impl.DeferredObject; class FilterDemo { private static String modifiedMsg; - + static String filter(String msg) { - + Deferred d = new DeferredObject<>(); Promise p = d.promise(); Promise filtered = p.then((result) -> { diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java index 95250cff76..94fe0b70a6 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/PipeDemo.java @@ -19,14 +19,11 @@ class PipeDemo { p.then((DonePipe) result -> { if (result < 90) { - return new DeferredObject() - .resolve(result); + return new DeferredObject().resolve(result); } else { - return new DeferredObject() - .reject(new Exception("Unacceptable value")); + return new DeferredObject().reject(new Exception("Unacceptable value")); } - }).done(r -> status = Result.SUCCESS) - .fail(r -> status = Result.FAILURE); + }).done(r -> status = Result.SUCCESS).fail(r -> status = Result.FAILURE); d.resolve(num); diff --git a/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java index 2a9f83dc35..4efb1ad997 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/PromiseDemo.java @@ -11,10 +11,7 @@ class PromiseDemo { Deferred deferred = new DeferredObject<>(); Promise promise = deferred.promise(); - promise.done(result -> System.out.println("Job done")) - .fail(rejection -> System.out.println("Job fail")) - .progress(progress -> System.out.println("Job is in progress")) - .always((state, result, rejection) -> System.out.println("Job execution started")); + promise.done(result -> System.out.println("Job done")).fail(rejection -> System.out.println("Job fail")).progress(progress -> System.out.println("Job is in progress")).always((state, result, rejection) -> System.out.println("Job execution started")); deferred.resolve(jobName); // deferred.notify(""); diff --git a/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java index 22fd51ed92..c48b916b4b 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/ThreadSafeDemo.java @@ -12,9 +12,7 @@ public class ThreadSafeDemo { DeferredManager dm = new DefaultDeferredManager(); Deferred deferred = new DeferredObject<>(); Promise p1 = deferred.promise(); - Promise p = dm.when(p1) - .done(r -> System.out.println("done")) - .fail(r -> System.out.println("fail")); + Promise p = dm.when(p1).done(r -> System.out.println("done")).fail(r -> System.out.println("fail")); synchronized (p) { while (p.isPending()) { diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java index 2abe9bc10f..68a113d6a2 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/manager/DeferredManagerWithExecutorDemo.java @@ -16,9 +16,7 @@ class DeferredManagerWithExecutorDemo { Deferred deferred = new DeferredObject<>(); DeferredManager dm = new DefaultDeferredManager(executor); Promise p1 = deferred.promise(), p2 = deferred.promise(), p3 = deferred.promise(); - dm.when(p1, p2, p3) - .done(r -> System.out.println("done")) - .fail(r -> System.out.println("fail")); + dm.when(p1, p2, p3).done(r -> System.out.println("done")).fail(r -> System.out.println("fail")); deferred.resolve("done"); } } diff --git a/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java b/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java index dc2e82495f..e1ffa3b6bc 100644 --- a/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java +++ b/libraries/src/main/java/com/baeldung/jdeffered/manager/SimpleDeferredManagerDemo.java @@ -7,8 +7,6 @@ class SimpleDeferredManagerDemo { public static void initiate() { DeferredManager dm = new DefaultDeferredManager(); - dm.when(() -> 1) - .done(r -> System.out.println("done")) - .fail(Throwable::printStackTrace); + dm.when(() -> 1).done(r -> System.out.println("done")).fail(Throwable::printStackTrace); } } diff --git a/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java b/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java index 387c8c4e00..bd459f963c 100644 --- a/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java +++ b/libraries/src/main/java/com/baeldung/jdo/GuideToJDO.java @@ -42,8 +42,8 @@ public class GuideToJDO { listXMLProducts(); } - public void CreateH2Properties(){ - + public void CreateH2Properties() { + pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); pumd.addClassName("com.baeldung.jdo.Product"); pumd.setExcludeUnlistedClasses(); @@ -51,18 +51,18 @@ public class GuideToJDO { pumd.addProperty("javax.jdo.option.ConnectionURL", "jdbc:h2:mem:mypersistence"); pumd.addProperty("javax.jdo.option.ConnectionUserName", "sa"); pumd.addProperty("javax.jdo.option.ConnectionPassword", ""); - pumd.addProperty("datanucleus.autoCreateSchema", "true"); - + pumd.addProperty("datanucleus.autoCreateSchema", "true"); + } - - public void CreateXMLProperties(){ + + public void CreateXMLProperties() { pumdXML = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); pumdXML.addClassName("com.baeldung.jdo.ProductXML"); pumdXML.setExcludeUnlistedClasses(); pumdXML.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myPersistence.xml"); - pumdXML.addProperty("datanucleus.autoCreateSchema", "true"); + pumdXML.addProperty("datanucleus.autoCreateSchema", "true"); } - + public void CreateProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); @@ -91,7 +91,7 @@ public class GuideToJDO { } @SuppressWarnings("rawtypes") - public void UpdateProducts(){ + public void UpdateProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); @@ -105,13 +105,13 @@ public class GuideToJDO { } finally { if (tx.isActive()) { tx.rollback(); - } + } pm.close(); } } - + @SuppressWarnings("rawtypes") - public void DeleteProducts(){ + public void DeleteProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); @@ -125,11 +125,11 @@ public class GuideToJDO { } finally { if (tx.isActive()) { tx.rollback(); - } + } pm.close(); } } - + @SuppressWarnings({ "rawtypes", "unchecked" }) public void ListProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); @@ -155,9 +155,9 @@ public class GuideToJDO { pm.close(); } } - + @SuppressWarnings({ "rawtypes", "unchecked" }) - public void QueryJDOQL (){ + public void QueryJDOQL() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); @@ -177,7 +177,7 @@ public class GuideToJDO { LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); } LOGGER.log(Level.INFO, "--------------------------------------------------------------"); - + tx.commit(); } finally { if (tx.isActive()) { @@ -187,28 +187,28 @@ public class GuideToJDO { pm.close(); } } - + @SuppressWarnings({ "rawtypes", "unchecked" }) - public void QuerySQL (){ + public void QuerySQL() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); try { tx.begin(); - //SQL : + // SQL : LOGGER.log(Level.INFO, "SQL --------------------------------------------------------------"); Query query = pm.newQuery("javax.jdo.query.SQL", "SELECT * FROM PRODUCT"); query.setClass(Product.class); List results = query.executeList(); - + Iterator iter = results.iterator(); while (iter.hasNext()) { Product p = iter.next(); LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); } LOGGER.log(Level.INFO, "--------------------------------------------------------------"); - + tx.commit(); } finally { if (tx.isActive()) { @@ -218,27 +218,27 @@ public class GuideToJDO { pm.close(); } } - + @SuppressWarnings({ "rawtypes", "unchecked" }) - public void QueryJPQL (){ + public void QueryJPQL() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); try { tx.begin(); - //JPQL : + // JPQL : LOGGER.log(Level.INFO, "JPQL --------------------------------------------------------------"); - Query q = pm.newQuery("JPQL", "SELECT p FROM "+Product.class.getName()+" p WHERE p.name = 'Laptop'"); - List results = (List)q.execute(); - + Query q = pm.newQuery("JPQL", "SELECT p FROM " + Product.class.getName() + " p WHERE p.name = 'Laptop'"); + List results = (List) q.execute(); + Iterator iter = results.iterator(); while (iter.hasNext()) { Product p = iter.next(); LOGGER.log(Level.WARNING, "Product name: {0} - Price: {1}", new Object[] { p.name, p.price }); } LOGGER.log(Level.INFO, "--------------------------------------------------------------"); - + tx.commit(); } finally { if (tx.isActive()) { @@ -248,18 +248,18 @@ public class GuideToJDO { pm.close(); } } - - public void persistXML(){ + + public void persistXML() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumdXML, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); try { tx.begin(); - ProductXML productXML = new ProductXML(0,"Tablet", 80.0); + ProductXML productXML = new ProductXML(0, "Tablet", 80.0); pm.makePersistent(productXML); - ProductXML productXML2 = new ProductXML(1,"Phone", 20.0); + ProductXML productXML2 = new ProductXML(1, "Phone", 20.0); pm.makePersistent(productXML2); - ProductXML productXML3 = new ProductXML(2,"Laptop", 200.0); + ProductXML productXML3 = new ProductXML(2, "Laptop", 200.0); pm.makePersistent(productXML3); tx.commit(); } finally { @@ -269,9 +269,9 @@ public class GuideToJDO { pm.close(); } } - + @SuppressWarnings({ "rawtypes", "unchecked" }) - public void listXMLProducts(){ + public void listXMLProducts() { PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumdXML, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); diff --git a/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java b/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java index 384dde48d1..235142d16e 100644 --- a/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java +++ b/libraries/src/main/java/com/baeldung/jdo/query/MyApp.java @@ -26,19 +26,19 @@ public class MyApp { } - public static void createTestData(){ - ProductItem item1 = new ProductItem("supportedItem", "price less than 10", "SoldOut",5); - ProductItem item2 = new ProductItem("pro2", "price less than 10","InStock", 8); - ProductItem item3 = new ProductItem("pro3", "price more than 10","SoldOut", 15); + public static void createTestData() { + ProductItem item1 = new ProductItem("supportedItem", "price less than 10", "SoldOut", 5); + ProductItem item2 = new ProductItem("pro2", "price less than 10", "InStock", 8); + ProductItem item3 = new ProductItem("pro3", "price more than 10", "SoldOut", 15); - if( pm != null ){ + if (pm != null) { pm.makePersistent(item1); pm.makePersistent(item2); - pm.makePersistent(item3); + pm.makePersistent(item3); } } - public static void defineDynamicPersistentUnit(){ + public static void defineDynamicPersistentUnit() { PersistenceUnitMetaData pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); pumd.addProperty("javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/jdo_db"); @@ -51,53 +51,45 @@ public class MyApp { pm = pmf.getPersistenceManager(); } - public static void queryUsingJDOQL(){ + public static void queryUsingJDOQL() { - Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem " - + "WHERE price < threshold PARAMETERS double threshold"); - List explicitParamResults = (List)query.execute(10); + Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem " + "WHERE price < threshold PARAMETERS double threshold"); + List explicitParamResults = (List) query.execute(10); - query = pm.newQuery("SELECT FROM " - + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold"); + query = pm.newQuery("SELECT FROM " + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold"); query.setParameters("double threshold"); - List explicitParamResults2 = (List)query.execute(10); + List explicitParamResults2 = (List) query.execute(10); - query = pm.newQuery("SELECT FROM " - + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold"); - List implicitParamResults = (List)query.execute(10); + query = pm.newQuery("SELECT FROM " + "com.baeldung.jdo.query.ProductItem WHERE price < :threshold"); + List implicitParamResults = (List) query.execute(10); } - public static void queryUsingTypedJDOQL(){ - + public static void queryUsingTypedJDOQL() { JDOQLTypedQuery tq = pm.newJDOQLTypedQuery(ProductItem.class); QProductItem cand = QProductItem.candidate(); - tq=tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro"))); + tq = tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro"))); List results = tq.executeList(); } - public static void queryUsingSQL(){ + public static void queryUsingSQL() { - Query query = pm.newQuery("javax.jdo.query.SQL","select * from " - + "product_item where price < ? and status = ?"); + Query query = pm.newQuery("javax.jdo.query.SQL", "select * from " + "product_item where price < ? and status = ?"); query.setClass(ProductItem.class); - query.setParameters(10,"InStock"); + query.setParameters(10, "InStock"); List results = query.executeList(); } - public static void queryUsingJPQL(){ - Query query = pm.newQuery("JPQL","select i from " - + "com.baeldung.jdo.query.ProductItem i where i.price < 10" - + " and i.status = 'InStock'"); + public static void queryUsingJPQL() { + Query query = pm.newQuery("JPQL", "select i from " + "com.baeldung.jdo.query.ProductItem i where i.price < 10" + " and i.status = 'InStock'"); List results = (List) query.execute(); } - public static void namedQuery(){ - Query query = pm.newNamedQuery( - ProductItem.class, "PriceBelow10"); + public static void namedQuery() { + Query query = pm.newNamedQuery(ProductItem.class, "PriceBelow10"); List results = query.executeList(); } diff --git a/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java b/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java index 52221a7d97..fbe999ba2a 100644 --- a/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java +++ b/libraries/src/main/java/com/baeldung/jdo/query/ProductItem.java @@ -1,7 +1,6 @@ package com.baeldung.jdo.query; import javax.jdo.annotations.IdGeneratorStrategy; -import javax.jdo.annotations.PersistenceAware; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @@ -10,25 +9,24 @@ import javax.jdo.annotations.PrimaryKey; public class ProductItem { @PrimaryKey - @Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT) + @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT) int id; String name; String description; String status; double price; - public ProductItem(){ + public ProductItem() { } - public ProductItem(String name,String description,String status,double price){ - this.name=name; + public ProductItem(String name, String description, String status, double price) { + this.name = name; this.description = description; this.status = status; this.price = price; } - public int getId() { return id; } @@ -40,18 +38,23 @@ public class ProductItem { public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + public double getPrice() { return price; } + public void setPrice(double price) { this.price = price; } @@ -64,5 +67,4 @@ public class ProductItem { this.status = status; } - } diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java b/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java index 53e86524a5..acfc26627a 100644 --- a/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java +++ b/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java @@ -1,9 +1,7 @@ package com.baeldung.jdo.xml; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.jdo.annotations.Element; import javax.jdo.annotations.PersistenceCapable; @@ -12,10 +10,7 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; -@PersistenceCapable( - schema="/myproduct/people", - table="person" - ) +@PersistenceCapable(schema = "/myproduct/people", table = "person") public class AnnotadedPerson { @XmlAttribute private long personNum; @@ -24,12 +19,11 @@ public class AnnotadedPerson { private String firstName; private String lastName; - @XmlElementWrapper(name="phone-numbers") - @XmlElement(name="phone-number") - @Element(types=String.class) + @XmlElementWrapper(name = "phone-numbers") + @XmlElement(name = "phone-number") + @Element(types = String.class) private List phoneNumbers = new ArrayList(); - public AnnotadedPerson(long personNum, String firstName, String lastName) { super(); this.personNum = personNum; diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java b/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java index 97ec49eec1..c75d3695f7 100644 --- a/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java +++ b/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java @@ -17,35 +17,35 @@ public class MyApp { private static PersistenceManagerFactory pmf; private static PersistenceManager pm; - public static void main( String[] args ) { - - //persist product object using dynamic persistence unit + public static void main(String[] args) { + + // persist product object using dynamic persistence unit defineDynamicPersistentUnit(); - Product product = new Product("id1","Sony Discman", "A standard discman from Sony", 49.99); + Product product = new Product("id1", "Sony Discman", "A standard discman from Sony", 49.99); persistObject(product); closePersistenceManager(); - - //persist AnnotatedPerson object using named pmf + + // persist AnnotatedPerson object using named pmf defineNamedPersistenceManagerFactory("XmlDatastore"); - AnnotadedPerson annotatedPerson = new AnnotadedPerson(654320,"annotated","person"); + AnnotadedPerson annotatedPerson = new AnnotadedPerson(654320, "annotated", "person"); annotatedPerson.getPhoneNumbers().add("999999999"); annotatedPerson.getPhoneNumbers().add("000000000"); persistObject(annotatedPerson); queryAnnotatedPersonsInXML(); closePersistenceManager(); - - //persist Person object using PMF created by properties file + + // persist Person object using PMF created by properties file definePersistenceManagerFactoryUsingPropertiesFile("META-INF\\datanucleus.properties"); - Person person = new Person(654321,"bealdung","author"); + Person person = new Person(654321, "bealdung", "author"); person.getPhoneNumbers().add("123456789"); person.getPhoneNumbers().add("987654321"); persistObject(person); queryPersonsInXML(); closePersistenceManager(); - } + } + + public static void defineDynamicPersistentUnit() { - public static void defineDynamicPersistentUnit(){ - PersistenceUnitMetaData pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); pumd.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myfile_dynamicPMF.xml"); pumd.addProperty("datanucleus.schema.autoCreateAll", "true"); @@ -55,27 +55,27 @@ public class MyApp { pm = pmf.getPersistenceManager(); } - public static void defineNamedPersistenceManagerFactory(String pmfName){ - + public static void defineNamedPersistenceManagerFactory(String pmfName) { + pmf = JDOHelper.getPersistenceManagerFactory("XmlDatastore"); pm = pmf.getPersistenceManager(); } - public static void definePersistenceManagerFactoryUsingPropertiesFile(String filePath){ - + public static void definePersistenceManagerFactoryUsingPropertiesFile(String filePath) { + pmf = JDOHelper.getPersistenceManagerFactory(filePath); pm = pmf.getPersistenceManager(); } - public static void closePersistenceManager(){ - - if(pm!=null && !pm.isClosed()){ + public static void closePersistenceManager() { + + if (pm != null && !pm.isClosed()) { pm.close(); } } - public static void persistObject(Object obj){ - + public static void persistObject(Object obj) { + Transaction tx = pm.currentTransaction(); try { @@ -88,18 +88,18 @@ public class MyApp { } } } - - public static void queryPersonsInXML(){ - + + public static void queryPersonsInXML() { + Query query = pm.newQuery(Person.class); List result = query.executeList(); - System.out.println("name: "+result.get(0).getFirstName()); + System.out.println("name: " + result.get(0).getFirstName()); } - - public static void queryAnnotatedPersonsInXML(){ - + + public static void queryAnnotatedPersonsInXML() { + Query query = pm.newQuery(AnnotadedPerson.class); List result = query.executeList(); - System.out.println("name: "+result.get(0).getFirstName()); + System.out.println("name: " + result.get(0).getFirstName()); } } diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/Person.java b/libraries/src/main/java/com/baeldung/jdo/xml/Person.java index e3ec5c6bab..0678201afd 100644 --- a/libraries/src/main/java/com/baeldung/jdo/xml/Person.java +++ b/libraries/src/main/java/com/baeldung/jdo/xml/Person.java @@ -1,17 +1,10 @@ package com.baeldung.jdo.xml; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import javax.jdo.annotations.Element; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.PrimaryKey; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; - @PersistenceCapable public class Person { diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/Product.java b/libraries/src/main/java/com/baeldung/jdo/xml/Product.java index d8d3bb17b2..1e46f212cb 100644 --- a/libraries/src/main/java/com/baeldung/jdo/xml/Product.java +++ b/libraries/src/main/java/com/baeldung/jdo/xml/Product.java @@ -1,9 +1,6 @@ package com.baeldung.jdo.xml; -import javax.jdo.annotations.IdGeneratorStrategy; -import javax.jdo.annotations.PersistenceAware; import javax.jdo.annotations.PersistenceCapable; -import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @PersistenceCapable @@ -14,19 +11,18 @@ public class Product { String name; String description; double price; - - public Product(){ - + + public Product() { + } - - public Product(String id,String name,String description,double price){ + + public Product(String id, String name, String description, double price) { this.id = id; - this.name=name; + this.name = name; this.description = description; this.price = price; } - - + public String getId() { return id; } @@ -38,21 +34,25 @@ public class Product { public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } + public double getPrice() { return price; } + public void setPrice(double price) { this.price = price; } - - + } diff --git a/libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java b/libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java index f1de71beeb..6bc73b055a 100644 --- a/libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java +++ b/libraries/src/main/java/com/baeldung/jetty/BlockingServlet.java @@ -14,4 +14,3 @@ public class BlockingServlet extends HttpServlet { response.getWriter().println("{ \"status\": \"ok\"}"); } } - diff --git a/libraries/src/main/java/com/baeldung/jetty/JettyServer.java b/libraries/src/main/java/com/baeldung/jetty/JettyServer.java index 364b05473a..82428642c1 100644 --- a/libraries/src/main/java/com/baeldung/jetty/JettyServer.java +++ b/libraries/src/main/java/com/baeldung/jetty/JettyServer.java @@ -21,7 +21,7 @@ class JettyServer { server = new Server(threadPool); ServerConnector connector = new ServerConnector(server); connector.setPort(8090); - server.setConnectors(new Connector[]{connector}); + server.setConnectors(new Connector[] { connector }); ServletHandler servletHandler = new ServletHandler(); server.setHandler(servletHandler); diff --git a/libraries/src/main/java/com/baeldung/jetty/JettyServerFactory.java b/libraries/src/main/java/com/baeldung/jetty/JettyServerFactory.java new file mode 100644 index 0000000000..46a2e8102a --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jetty/JettyServerFactory.java @@ -0,0 +1,92 @@ +package com.baeldung.jetty; + +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * Simple factory for creating Jetty basic instances. + * + * @author Donato Rimenti + * + */ +public class JettyServerFactory { + + /** + * Exposed context of the app. + */ + public final static String APP_PATH = "/myApp"; + + /** + * The server port. + */ + public final static int SERVER_PORT = 13133; + + /** + * Private constructor to avoid instantiation. + */ + private JettyServerFactory() { + } + + /** + * Returns a simple server listening on port 80 with a timeout of 30 seconds + * for connections and no handlers. + * + * @return a server + */ + public static Server createBaseServer() { + Server server = new Server(); + + // Adds a connector for port 80 with a timeout of 30 seconds. + ServerConnector connector = new ServerConnector(server); + connector.setPort(SERVER_PORT); + connector.setHost("127.0.0.1"); + connector.setIdleTimeout(30000); + server.addConnector(connector); + + return server; + } + + /** + * Creates a server which delegates the request handling to a web + * application. + * + * @return a server + */ + public static Server createWebAppServer() { + // Adds an handler to a server and returns it. + Server server = createBaseServer(); + String webAppFolderPath = JettyServerFactory.class.getClassLoader().getResource("jetty-embedded-demo-app.war").getPath(); + Handler webAppHandler = new WebAppContext(webAppFolderPath, APP_PATH); + server.setHandler(webAppHandler); + + return server; + } + + /** + * Creates a server which delegates the request handling to both a logging + * handler and to a web application, in this order. + * + * @return a server + */ + public static Server createMultiHandlerServer() { + Server server = createBaseServer(); + + // Creates the handlers and adds them to the server. + HandlerCollection handlers = new HandlerCollection(); + + String webAppFolderPath = JettyServerFactory.class.getClassLoader().getResource("jetty-embedded-demo-app.war").getPath(); + Handler customRequestHandler = new WebAppContext(webAppFolderPath, APP_PATH); + handlers.addHandler(customRequestHandler); + + Handler loggingRequestHandler = new LoggingRequestHandler(); + handlers.addHandler(loggingRequestHandler); + + server.setHandler(handlers); + + return server; + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java b/libraries/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java new file mode 100644 index 0000000000..a5c6d09c16 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jetty/LoggingRequestHandler.java @@ -0,0 +1,167 @@ +package com.baeldung.jetty; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Handler implementation which simply logs that a request has been received. + * + * @author Donato Rimenti + */ +public class LoggingRequestHandler implements Handler { + + /** + * Logger. + */ + private final static Logger LOG = LoggerFactory.getLogger(LoggingRequestHandler.class); + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#addLifeCycleListener(org. + * eclipse.jetty.util.component.LifeCycle.Listener) + */ + @Override + public void addLifeCycleListener(Listener arg0) { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isFailed() + */ + @Override + public boolean isFailed() { + return false; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isRunning() + */ + @Override + public boolean isRunning() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isStarted() + */ + @Override + public boolean isStarted() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isStarting() + */ + @Override + public boolean isStarting() { + return false; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isStopped() + */ + @Override + public boolean isStopped() { + return false; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#isStopping() + */ + @Override + public boolean isStopping() { + return false; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jetty.util.component.LifeCycle#removeLifeCycleListener(org. + * eclipse.jetty.util.component.LifeCycle.Listener) + */ + @Override + public void removeLifeCycleListener(Listener arg0) { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#start() + */ + @Override + public void start() throws Exception { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.util.component.LifeCycle#stop() + */ + @Override + public void stop() throws Exception { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.server.Handler#destroy() + */ + @Override + public void destroy() { + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.server.Handler#getServer() + */ + @Override + public Server getServer() { + return null; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.server.Handler#handle(java.lang.String, + * org.eclipse.jetty.server.Request, javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) + */ + @Override + public void handle(String arg0, Request arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws IOException, ServletException { + LOG.info("Received a new request"); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jetty.server.Handler#setServer(org.eclipse.jetty.server. + * Server) + */ + @Override + public void setServer(Server server) { + } + +} diff --git a/libraries/src/main/java/com/baeldung/netty/ChannelHandlerA.java b/libraries/src/main/java/com/baeldung/netty/ChannelHandlerA.java new file mode 100644 index 0000000000..c919bdb09c --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ChannelHandlerA.java @@ -0,0 +1,22 @@ +package com.baeldung.netty; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.util.logging.Logger; + +public class ChannelHandlerA extends ChannelInboundHandlerAdapter { + + private Logger logger = Logger.getLogger(getClass().getName()); + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + throw new Exception("Ooops"); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + logger.info("Exception Occurred in ChannelHandler A"); + ctx.fireExceptionCaught(cause); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/ChannelHandlerB.java b/libraries/src/main/java/com/baeldung/netty/ChannelHandlerB.java new file mode 100644 index 0000000000..abb6bf7dd9 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ChannelHandlerB.java @@ -0,0 +1,19 @@ +package com.baeldung.netty; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.util.logging.Logger; + +public class ChannelHandlerB extends ChannelInboundHandlerAdapter { + + private Logger logger = Logger.getLogger(getClass().getName()); + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + logger.info("Exception Handled in ChannelHandler B"); + logger.info(cause.getLocalizedMessage()); + // do more exception handling + ctx.close(); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/NettyServerB.java b/libraries/src/main/java/com/baeldung/netty/NettyServerB.java new file mode 100644 index 0000000000..49a6aa6bfd --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/NettyServerB.java @@ -0,0 +1,43 @@ +package com.baeldung.netty; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class NettyServerB { + + private int port; + + private NettyServerB(int port) { + this.port = port; + } + + private void run() throws Exception { + + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer() { + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new ChannelHandlerA(), new ChannelHandlerB()); + } + }).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true); + ChannelFuture f = b.bind(port).sync(); // (7) + f.channel().closeFuture().sync(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } + + public static void main(String[] args) throws Exception { + new NettyServerB(8080).run(); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/RequestData.java b/libraries/src/main/java/com/baeldung/netty/RequestData.java index 402aa1ef91..475c0a4dc1 100644 --- a/libraries/src/main/java/com/baeldung/netty/RequestData.java +++ b/libraries/src/main/java/com/baeldung/netty/RequestData.java @@ -22,9 +22,6 @@ public class RequestData { @Override public String toString() { - return "RequestData{" + - "intValue=" + intValue + - ", stringValue='" + stringValue + '\'' + - '}'; + return "RequestData{" + "intValue=" + intValue + ", stringValue='" + stringValue + '\'' + '}'; } } diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseData.java b/libraries/src/main/java/com/baeldung/netty/ResponseData.java index 51d1adaafb..8849e8a4cb 100644 --- a/libraries/src/main/java/com/baeldung/netty/ResponseData.java +++ b/libraries/src/main/java/com/baeldung/netty/ResponseData.java @@ -13,8 +13,6 @@ public class ResponseData { @Override public String toString() { - return "ResponseData{" + - "intValue=" + intValue + - '}'; + return "ResponseData{" + "intValue=" + intValue + '}'; } } diff --git a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java b/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java index fb6a01d4c1..4cb11c3c05 100644 --- a/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java +++ b/libraries/src/main/java/com/baeldung/neuroph/NeurophXOR.java @@ -41,7 +41,7 @@ public class NeurophXOR { ConnectionFactory.fullConnect(ann.getLayerAt(1), ann.getLayerAt(2)); ann.addLayer(3, outputLayer); ConnectionFactory.fullConnect(ann.getLayerAt(2), ann.getLayerAt(3)); - ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(ann.getLayersCount()-1), false); + ConnectionFactory.fullConnect(ann.getLayerAt(0), ann.getLayerAt(ann.getLayersCount() - 1), false); ann.setInputNeurons(inputLayer.getNeurons()); ann.setOutputNeurons(outputLayer.getNeurons()); @@ -55,13 +55,13 @@ public class NeurophXOR { int outputSize = 1; DataSet ds = new DataSet(inputSize, outputSize); - DataSetRow rOne = new DataSetRow(new double[] {0, 1}, new double[] {1}); + DataSetRow rOne = new DataSetRow(new double[] { 0, 1 }, new double[] { 1 }); ds.addRow(rOne); - DataSetRow rTwo = new DataSetRow(new double[] {1, 1}, new double[] {0}); + DataSetRow rTwo = new DataSetRow(new double[] { 1, 1 }, new double[] { 0 }); ds.addRow(rTwo); - DataSetRow rThree = new DataSetRow(new double[] {0, 0}, new double[] {0}); + DataSetRow rThree = new DataSetRow(new double[] { 0, 0 }, new double[] { 0 }); ds.addRow(rThree); - DataSetRow rFour = new DataSetRow(new double[] {1, 0}, new double[] {1}); + DataSetRow rFour = new DataSetRow(new double[] { 1, 0 }, new double[] { 1 }); ds.addRow(rFour); BackPropagation backPropagation = new BackPropagation(); diff --git a/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java b/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java index 59e13efaa0..48abe35287 100644 --- a/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java +++ b/libraries/src/main/java/com/baeldung/noexception/CustomExceptionHandler.java @@ -11,10 +11,7 @@ public class CustomExceptionHandler extends ExceptionHandler { @Override public boolean handle(Throwable throwable) { - if (throwable.getClass() - .isAssignableFrom(RuntimeException.class) - || throwable.getClass() - .isAssignableFrom(Error.class)) { + if (throwable.getClass().isAssignableFrom(RuntimeException.class) || throwable.getClass().isAssignableFrom(Error.class)) { return false; } else { logger.error("Caught Exception ", throwable); diff --git a/libraries/src/main/java/com/baeldung/protonpack/StreamUtilsExample.java b/libraries/src/main/java/com/baeldung/protonpack/StreamUtilsExample.java index eead34af71..b872696510 100644 --- a/libraries/src/main/java/com/baeldung/protonpack/StreamUtilsExample.java +++ b/libraries/src/main/java/com/baeldung/protonpack/StreamUtilsExample.java @@ -20,18 +20,14 @@ public class StreamUtilsExample { public void zipAStreamWithIndex() { Stream source = Stream.of("Foo", "Bar", "Baz"); - List> zipped = StreamUtils - .zipWithIndex(source) - .collect(Collectors.toList()); + List> zipped = StreamUtils.zipWithIndex(source).collect(Collectors.toList()); } public void zipAPairOfStreams() { Stream streamA = Stream.of("A", "B", "C"); Stream streamB = Stream.of("Apple", "Banana", "Carrot"); - List zipped = StreamUtils - .zip(streamA, streamB, (a, b) -> a + " is for " + b) - .collect(Collectors.toList()); + List zipped = StreamUtils.zip(streamA, streamB, (a, b) -> a + " is for " + b).collect(Collectors.toList()); } public void zipThreeStreams() { @@ -39,9 +35,7 @@ public class StreamUtilsExample { Stream streamB = Stream.of("aggravating", "banausic", "complaisant"); Stream streamC = Stream.of("Apple", "Banana", "Carrot"); - List zipped = StreamUtils - .zip(streamA, streamB, streamC, (a, b, c) -> a + " is for " + b + " " + c) - .collect(Collectors.toList()); + List zipped = StreamUtils.zip(streamA, streamB, streamC, (a, b, c) -> a + " is for " + b + " " + c).collect(Collectors.toList()); } public void mergeThreeStreams() { @@ -79,24 +73,16 @@ public class StreamUtilsExample { public void windowedStream() { Stream integerStream = Stream.of(1, 2, 3, 4, 5); - List> windows = StreamUtils - .windowed(integerStream, 2) - .collect(toList()); - List> windowsWithSkipIndex = StreamUtils - .windowed(integerStream, 3, 2) - .collect(toList()); - List> windowsWithSkipIndexAndAllowLowerSize = StreamUtils - .windowed(integerStream, 2, 2, true) - .collect(toList()); + List> windows = StreamUtils.windowed(integerStream, 2).collect(toList()); + List> windowsWithSkipIndex = StreamUtils.windowed(integerStream, 3, 2).collect(toList()); + List> windowsWithSkipIndexAndAllowLowerSize = StreamUtils.windowed(integerStream, 2, 2, true).collect(toList()); } public void groupRunsStreams() { Stream integerStream = Stream.of(1, 1, 2, 2, 3, 4, 5); - List> runs = StreamUtils - .groupRuns(integerStream) - .collect(toList()); + List> runs = StreamUtils.groupRuns(integerStream).collect(toList()); } public void aggreagateOnBiElementPredicate() { diff --git a/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java b/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java index 4757d912f8..b55517b6d1 100644 --- a/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java +++ b/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java @@ -19,45 +19,17 @@ public class QuartzExample { Scheduler sched = schedFact.getScheduler(); - JobDetail job = JobBuilder.newJob(SimpleJob.class) - .withIdentity("myJob", "group1") - .usingJobData("jobSays", "Hello World!") - .usingJobData("myFloatValue", 3.141f) - .build(); + JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("myJob", "group1").usingJobData("jobSays", "Hello World!").usingJobData("myFloatValue", 3.141f).build(); - Trigger trigger = TriggerBuilder.newTrigger() - .withIdentity("myTrigger", "group1") - .startNow() - .withSchedule(SimpleScheduleBuilder.simpleSchedule() - .withIntervalInSeconds(40) - .repeatForever()) - .build(); + Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build(); - JobDetail jobA = JobBuilder.newJob(JobA.class) - .withIdentity("jobA", "group2") - .build(); + JobDetail jobA = JobBuilder.newJob(JobA.class).withIdentity("jobA", "group2").build(); - JobDetail jobB = JobBuilder.newJob(JobB.class) - .withIdentity("jobB", "group2") - .build(); + JobDetail jobB = JobBuilder.newJob(JobB.class).withIdentity("jobB", "group2").build(); - Trigger triggerA = TriggerBuilder.newTrigger() - .withIdentity("triggerA", "group2") - .startNow() - .withPriority(15) - .withSchedule(SimpleScheduleBuilder.simpleSchedule() - .withIntervalInSeconds(40) - .repeatForever()) - .build(); + Trigger triggerA = TriggerBuilder.newTrigger().withIdentity("triggerA", "group2").startNow().withPriority(15).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build(); - Trigger triggerB = TriggerBuilder.newTrigger() - .withIdentity("triggerB", "group2") - .startNow() - .withPriority(10) - .withSchedule(SimpleScheduleBuilder.simpleSchedule() - .withIntervalInSeconds(20) - .repeatForever()) - .build(); + Trigger triggerB = TriggerBuilder.newTrigger().withIdentity("triggerB", "group2").startNow().withPriority(10).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(20).repeatForever()).build(); sched.scheduleJob(job, trigger); sched.scheduleJob(jobA, triggerA); diff --git a/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java b/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java index 554d3b9358..03730ee6e5 100644 --- a/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java +++ b/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java @@ -8,8 +8,7 @@ import org.quartz.JobExecutionException; public class SimpleJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { - JobDataMap dataMap = context.getJobDetail() - .getJobDataMap(); + JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String jobSays = dataMap.getString("jobSays"); float myFloatValue = dataMap.getFloat("myFloatValue"); diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java index 4e071d3384..2b5c1f6f62 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java +++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApi.java @@ -18,7 +18,7 @@ public interface GitHubBasicApi { */ @GET("users/{user}/repos") Call> listRepos(@Path("user") String user); - + /** * List Contributors of a GitHub Repository * @param user GitHub Account @@ -26,8 +26,6 @@ public interface GitHubBasicApi { * @return GitHub Repository Contributors */ @GET("repos/{user}/{repo}/contributors") - Call> listRepoContributors( - @Path("user") String user, - @Path("repo") String repo); - + Call> listRepoContributors(@Path("user") String user, @Path("repo") String repo); + } diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java index 6b2cd14252..df0d90af7f 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java +++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicApp.java @@ -7,8 +7,7 @@ public class GitHubBasicApp { public static void main(String[] args) throws IOException { String userName = "eugenp"; - List topContributors = new GitHubBasicService() - .getTopContributors(userName); + List topContributors = new GitHubBasicService().getTopContributors(userName); topContributors.forEach(System.out::println); } } diff --git a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java index 20256fb540..ff6ef82183 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java +++ b/libraries/src/main/java/com/baeldung/retrofit/basic/GitHubBasicService.java @@ -16,45 +16,29 @@ class GitHubBasicService { private GitHubBasicApi gitHubApi; GitHubBasicService() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.github.com/") - .addConverterFactory(GsonConverterFactory.create()) - .build(); + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build(); gitHubApi = retrofit.create(GitHubBasicApi.class); } List getTopContributors(String userName) throws IOException { - List repos = gitHubApi - .listRepos(userName) - .execute() - .body(); + List repos = gitHubApi.listRepos(userName).execute().body(); repos = repos != null ? repos : Collections.emptyList(); - return repos.stream() - .flatMap(repo -> getContributors(userName, repo)) - .sorted((a, b) -> b.getContributions() - a.getContributions()) - .map(Contributor::getName) - .distinct() - .sorted() - .collect(Collectors.toList()); + return repos.stream().flatMap(repo -> getContributors(userName, repo)).sorted((a, b) -> b.getContributions() - a.getContributions()).map(Contributor::getName).distinct().sorted().collect(Collectors.toList()); } private Stream getContributors(String userName, Repository repo) { List contributors = null; try { - contributors = gitHubApi - .listRepoContributors(userName, repo.getName()) - .execute() - .body(); + contributors = gitHubApi.listRepoContributors(userName, repo.getName()).execute().body(); } catch (IOException e) { e.printStackTrace(); } contributors = contributors != null ? contributors : Collections.emptyList(); - return contributors.stream() - .filter(c -> c.getContributions() > 100); + return contributors.stream().filter(c -> c.getContributions() > 100); } } diff --git a/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java b/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java index 2f8697f603..f98b19de96 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java +++ b/libraries/src/main/java/com/baeldung/retrofit/models/Contributor.java @@ -3,28 +3,31 @@ package com.baeldung.retrofit.models; import com.google.gson.annotations.SerializedName; public class Contributor { - + @SerializedName("login") private String name; - + private Integer contributions; - + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public Integer getContributions() { return contributions; } + public void setContributions(Integer contributions) { this.contributions = contributions; } - + @Override public String toString() { return "Contributer [name=" + name + ", contributions=" + contributions + "]"; } - + } diff --git a/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java b/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java index f12fcdf8f2..6bc91eb772 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java +++ b/libraries/src/main/java/com/baeldung/retrofit/models/Repository.java @@ -1,20 +1,23 @@ package com.baeldung.retrofit.models; public class Repository { - + private String name; - + private String description; - + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getDescription() { return description; } + public void setDescription(String description) { this.description = description; } diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java index 4e40aff448..aa0f550115 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java +++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApi.java @@ -18,7 +18,7 @@ public interface GitHubRxApi { */ @GET("users/{user}/repos") Observable> listRepos(@Path("user") String user); - + /** * List Contributors of a GitHub Repository * @param user GitHub Account @@ -26,8 +26,6 @@ public interface GitHubRxApi { * @return GitHub Repository Contributors */ @GET("repos/{user}/{repo}/contributors") - Observable> listRepoContributors( - @Path("user") String user, - @Path("repo") String repo); - + Observable> listRepoContributors(@Path("user") String user, @Path("repo") String repo); + } diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java index b136a1e40b..4941a65717 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java +++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxApp.java @@ -6,7 +6,6 @@ public class GitHubRxApp { public static void main(String[] args) throws IOException { String userName = "eugenp"; - new GitHubRxService().getTopContributors(userName) - .subscribe(System.out::println); + new GitHubRxService().getTopContributors(userName).subscribe(System.out::println); } } diff --git a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java index 2ad50a9f39..f2c5114149 100644 --- a/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java +++ b/libraries/src/main/java/com/baeldung/retrofit/rx/GitHubRxService.java @@ -11,23 +11,13 @@ class GitHubRxService { private GitHubRxApi gitHubApi; GitHubRxService() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.github.com/") - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) - .build(); + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); gitHubApi = retrofit.create(GitHubRxApi.class); } Observable getTopContributors(String userName) { - return gitHubApi.listRepos(userName) - .flatMapIterable(x -> x) - .flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName())) - .flatMapIterable(x -> x) - .filter(c -> c.getContributions() > 100) - .sorted((a, b) -> b.getContributions() - a.getContributions()) - .map(Contributor::getName) - .distinct(); + return gitHubApi.listRepos(userName).flatMapIterable(x -> x).flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName())).flatMapIterable(x -> x).filter(c -> c.getContributions() > 100) + .sorted((a, b) -> b.getContributions() - a.getContributions()).map(Contributor::getName).distinct(); } } diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java b/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java index d32891be9e..dc6bfbddb1 100644 --- a/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java +++ b/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java @@ -13,19 +13,13 @@ public class GitHubServiceGenerator { private static final String BASE_URL = "https://api.github.com/"; - private static Retrofit.Builder builder - = new Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()); + private static Retrofit.Builder builder = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()); private static Retrofit retrofit = builder.build(); - private static OkHttpClient.Builder httpClient - = new OkHttpClient.Builder(); + private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); - private static HttpLoggingInterceptor logging - = new HttpLoggingInterceptor() - .setLevel(HttpLoggingInterceptor.Level.BASIC); + private static HttpLoggingInterceptor logging = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC); public static S createService(Class serviceClass) { if (!httpClient.interceptors().contains(logging)) { @@ -43,8 +37,7 @@ public class GitHubServiceGenerator { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); - Request.Builder builder = original.newBuilder() - .header("Authorization", token); + Request.Builder builder = original.newBuilder().header("Authorization", token); Request request = builder.build(); return chain.proceed(request); } diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/Main.java b/libraries/src/main/java/com/baeldung/retrofitguide/Main.java index 8a674f634b..be7e15e3c9 100644 --- a/libraries/src/main/java/com/baeldung/retrofitguide/Main.java +++ b/libraries/src/main/java/com/baeldung/retrofitguide/Main.java @@ -11,15 +11,11 @@ import retrofit2.converter.gson.GsonConverterFactory; public class Main { public static void main(String[] args) { - //Manual creation + // Manual creation OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.github.com/") - .addConverterFactory(GsonConverterFactory.create()) - .client(httpClient.build()) - .build(); + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).client(httpClient.build()).build(); UserService service = retrofit.create(UserService.class); - //Using GitHubServiceGenerator + // Using GitHubServiceGenerator service = GitHubServiceGenerator.createService(UserService.class); Call callSync = service.getUser("eugenp"); Call callAsync = service.getUser("eugenp"); diff --git a/libraries/src/main/java/com/baeldung/serenity/membership/Commodity.java b/libraries/src/main/java/com/baeldung/serenity/membership/Commodity.java index 208b73d4af..c889871b3d 100644 --- a/libraries/src/main/java/com/baeldung/serenity/membership/Commodity.java +++ b/libraries/src/main/java/com/baeldung/serenity/membership/Commodity.java @@ -9,7 +9,7 @@ public enum Commodity { public final int price; - Commodity(int price){ + Commodity(int price) { this.price = price; } diff --git a/libraries/src/main/java/com/baeldung/serenity/membership/Member.java b/libraries/src/main/java/com/baeldung/serenity/membership/Member.java index 6e7c4db08e..f2f443020d 100644 --- a/libraries/src/main/java/com/baeldung/serenity/membership/Member.java +++ b/libraries/src/main/java/com/baeldung/serenity/membership/Member.java @@ -12,7 +12,8 @@ public class Member { private int points; private Member(int points) { - if (points < 0) throw new IllegalArgumentException("points must not be negative!"); + if (points < 0) + throw new IllegalArgumentException("points must not be negative!"); this.points = points; } @@ -22,9 +23,12 @@ public class Member { } public MemberGrade getGrade() { - if (points < 1000) return Bronze; - else if (points >= 1000 && points < 5000) return Silver; - else return Gold; + if (points < 1000) + return Bronze; + else if (points >= 1000 && points < 5000) + return Silver; + else + return Gold; } public void spend(int moneySpent) { diff --git a/libraries/src/main/java/com/baeldung/serenity/membership/MemberGrade.java b/libraries/src/main/java/com/baeldung/serenity/membership/MemberGrade.java index 7bb6f76495..389749c2ca 100644 --- a/libraries/src/main/java/com/baeldung/serenity/membership/MemberGrade.java +++ b/libraries/src/main/java/com/baeldung/serenity/membership/MemberGrade.java @@ -3,7 +3,7 @@ package com.baeldung.serenity.membership; /** * @author aiet */ -public enum MemberGrade { +public enum MemberGrade { Bronze, Silver, Gold; diff --git a/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java b/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java new file mode 100644 index 0000000000..fa317f93b7 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/converter/OrderConverter.java @@ -0,0 +1,44 @@ +package com.baeldung.smooks.converter; + +import com.baeldung.smooks.model.Order; +import org.milyn.Smooks; +import org.milyn.payload.JavaResult; +import org.milyn.payload.StringResult; +import org.xml.sax.SAXException; + +import javax.xml.transform.stream.StreamSource; +import java.io.IOException; + +public class OrderConverter { + + public Order convertOrderXMLToOrderObject(String path) throws IOException, SAXException { + Smooks smooks = new Smooks(OrderConverter.class.getResourceAsStream("/smooks/smooks-mapping.xml")); + try { + JavaResult javaResult = new JavaResult(); + smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), javaResult); + return (Order) javaResult.getBean("order"); + } finally { + smooks.close(); + } + } + + public String convertOrderXMLtoEDIFACT(String path) throws IOException, SAXException { + return convertDocumentWithTempalte(path, "/smooks/smooks-transform-edi.xml"); + } + + public String convertOrderXMLtoEmailMessage(String path) throws IOException, SAXException { + return convertDocumentWithTempalte(path, "/smooks/smooks-transform-email.xml"); + } + + private String convertDocumentWithTempalte(String path, String config) throws IOException, SAXException { + Smooks smooks = new Smooks(config); + + try { + StringResult stringResult = new StringResult(); + smooks.filterSource(new StreamSource(OrderConverter.class.getResourceAsStream(path)), stringResult); + return stringResult.toString(); + } finally { + smooks.close(); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java b/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java new file mode 100644 index 0000000000..3975921da0 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/converter/OrderValidator.java @@ -0,0 +1,27 @@ +package com.baeldung.smooks.converter; + +import org.milyn.Smooks; +import org.milyn.payload.JavaResult; +import org.milyn.payload.StringResult; +import org.milyn.validation.ValidationResult; +import org.xml.sax.SAXException; + +import javax.xml.transform.stream.StreamSource; +import java.io.IOException; + +public class OrderValidator { + + public ValidationResult validate(String path) throws IOException, SAXException { + Smooks smooks = new Smooks(OrderValidator.class.getResourceAsStream("/smooks/smooks-validation.xml")); + + try { + StringResult xmlResult = new StringResult(); + JavaResult javaResult = new JavaResult(); + ValidationResult validationResult = new ValidationResult(); + smooks.filterSource(new StreamSource(OrderValidator.class.getResourceAsStream(path)), xmlResult, javaResult, validationResult); + return validationResult; + } finally { + smooks.close(); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Item.java b/libraries/src/main/java/com/baeldung/smooks/model/Item.java new file mode 100644 index 0000000000..3e1f4a7ef4 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/model/Item.java @@ -0,0 +1,70 @@ +package com.baeldung.smooks.model; + +public class Item { + + public Item() { + } + + public Item(String code, Double price, Integer quantity) { + this.code = code; + this.price = price; + this.quantity = quantity; + } + + private String code; + private Double price; + private Integer quantity; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + Item item = (Item) o; + + if (code != null ? !code.equals(item.code) : item.code != null) + return false; + if (price != null ? !price.equals(item.price) : item.price != null) + return false; + return quantity != null ? quantity.equals(item.quantity) : item.quantity == null; + } + + @Override + public int hashCode() { + int result = code != null ? code.hashCode() : 0; + result = 31 * result + (price != null ? price.hashCode() : 0); + result = 31 * result + (quantity != null ? quantity.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "Item{" + "code='" + code + '\'' + ", price=" + price + ", quantity=" + quantity + '}'; + } +} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Order.java b/libraries/src/main/java/com/baeldung/smooks/model/Order.java new file mode 100644 index 0000000000..047e1fe8a3 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/model/Order.java @@ -0,0 +1,52 @@ +package com.baeldung.smooks.model; + +import java.util.Date; +import java.util.List; + +public class Order { + private Date creationDate; + private Long number; + private Status status; + private Supplier supplier; + private List items; + + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public Supplier getSupplier() { + return supplier; + } + + public void setSupplier(Supplier supplier) { + this.supplier = supplier; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Status.java b/libraries/src/main/java/com/baeldung/smooks/model/Status.java new file mode 100644 index 0000000000..53c50bdf46 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/model/Status.java @@ -0,0 +1,5 @@ +package com.baeldung.smooks.model; + +public enum Status { + NEW, IN_PROGRESS, FINISHED +} diff --git a/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java b/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java new file mode 100644 index 0000000000..827a0fc907 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/smooks/model/Supplier.java @@ -0,0 +1,52 @@ +package com.baeldung.smooks.model; + +public class Supplier { + + private String name; + private String phoneNumber; + + public Supplier() { + } + + public Supplier(String name, String phoneNumber) { + this.name = name; + this.phoneNumber = phoneNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + Supplier supplier = (Supplier) o; + + if (name != null ? !name.equals(supplier.name) : supplier.name != null) + return false; + return phoneNumber != null ? phoneNumber.equals(supplier.phoneNumber) : supplier.phoneNumber == null; + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (phoneNumber != null ? phoneNumber.hashCode() : 0); + return result; + } +} diff --git a/libraries/src/main/java/com/baeldung/stm/Account.java b/libraries/src/main/java/com/baeldung/stm/Account.java index 8b17f87120..4dc2c492df 100644 --- a/libraries/src/main/java/com/baeldung/stm/Account.java +++ b/libraries/src/main/java/com/baeldung/stm/Account.java @@ -44,7 +44,6 @@ public class Account { @Override public String toString() { - return StmUtils.atomic((TxnCallable) - txn -> "Balance: " + balance.get(txn) + " lastUpdateDate: " + lastUpdate.get(txn)); + return StmUtils.atomic((TxnCallable) txn -> "Balance: " + balance.get(txn) + " lastUpdateDate: " + lastUpdate.get(txn)); } } \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/streamex/StreamEX.java b/libraries/src/main/java/com/baeldung/streamex/StreamEX.java index 7cbfec4421..56a3860f05 100644 --- a/libraries/src/main/java/com/baeldung/streamex/StreamEX.java +++ b/libraries/src/main/java/com/baeldung/streamex/StreamEX.java @@ -15,69 +15,43 @@ import one.util.streamex.StreamEx; public class StreamEX { public static void main(String[] args) { - //Collector shortcut methods (toList, toSet, groupingBy, joining, etc.) - List users = Arrays.asList( - new User("name"), new User(), new User()); - users.stream() - .map(User::getName) - .collect(Collectors.toList()); - List userNames = StreamEx.of(users) - .map(User::getName) - .toList(); - Map> role2users = StreamEx.of(users) - .groupingBy(User::getRole); - StreamEx.of(1, 2, 3).joining("; "); // "1; 2; 3" - //Selecting stream elements of specific type + // Collector shortcut methods (toList, toSet, groupingBy, joining, etc.) + List users = Arrays.asList(new User("name"), new User(), new User()); + users.stream().map(User::getName).collect(Collectors.toList()); + List userNames = StreamEx.of(users).map(User::getName).toList(); + Map> role2users = StreamEx.of(users).groupingBy(User::getRole); + StreamEx.of(1, 2, 3).joining("; "); // "1; 2; 3" + // Selecting stream elements of specific type List usersAndRoles = Arrays.asList(new User(), new Role()); - List roles = IntStreamEx.range(usersAndRoles.size()) - .mapToObj(usersAndRoles::get) - .select(Role.class) - .toList(); + List roles = IntStreamEx.range(usersAndRoles.size()).mapToObj(usersAndRoles::get).select(Role.class).toList(); System.out.println(roles); - //adding elements to Stream - List appendedUsers = StreamEx.of(users) - .map(User::getName) - .prepend("(none)") - .append("LAST") - .toList(); + // adding elements to Stream + List appendedUsers = StreamEx.of(users).map(User::getName).prepend("(none)").append("LAST").toList(); System.out.println(appendedUsers); - //Removing unwanted elements and using the stream as Iterable: - for (String line : StreamEx.of(users).map(User::getName) - .nonNull()) { + // Removing unwanted elements and using the stream as Iterable: + for (String line : StreamEx.of(users).map(User::getName).nonNull()) { System.out.println(line); } - //Selecting map keys by value predicate: + // Selecting map keys by value predicate: Map nameToRole = new HashMap<>(); nameToRole.put("first", new Role()); nameToRole.put("second", null); - Set nonNullRoles = StreamEx. - ofKeys(nameToRole, Objects::nonNull) - .toSet(); + Set nonNullRoles = StreamEx.ofKeys(nameToRole, Objects::nonNull).toSet(); System.out.println(nonNullRoles); - //Operating on key-value pairs: + // Operating on key-value pairs: Map> users2roles = transformMap(role2users); - Map mapToString = EntryStream.of(users2roles) - .mapKeys(String::valueOf) - .mapValues(String::valueOf) - .toMap(); - //Support of byte/char/short/float types: - short[] src = {1, 2, 3}; - char[] output = IntStreamEx.of(src) - .map(x -> x * 5) - .toCharArray(); + Map mapToString = EntryStream.of(users2roles).mapKeys(String::valueOf).mapValues(String::valueOf).toMap(); + // Support of byte/char/short/float types: + short[] src = { 1, 2, 3 }; + char[] output = IntStreamEx.of(src).map(x -> x * 5).toCharArray(); } public double[] getDiffBetweenPairs(double... numbers) { - return DoubleStreamEx.of(numbers) - .pairMap((a, b) -> b - a).toArray(); + return DoubleStreamEx.of(numbers).pairMap((a, b) -> b - a).toArray(); } - public static Map> transformMap( - Map> role2users) { - Map> users2roles = EntryStream.of(role2users) - .flatMapValues(List::stream) - .invert() - .grouping(); + public static Map> transformMap(Map> role2users) { + Map> users2roles = EntryStream.of(role2users).flatMapValues(List::stream).invert().grouping(); return users2roles; } diff --git a/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java b/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java index 430759f3a0..d9097188b3 100644 --- a/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java +++ b/libraries/src/main/java/com/baeldung/streamutils/CopyStream.java @@ -9,14 +9,14 @@ import org.apache.commons.io.IOUtils; import org.springframework.util.StreamUtils; public class CopyStream { - public static String getStringFromInputStream(InputStream input) throws IOException { - StringWriter writer = new StringWriter(); - IOUtils.copy(input, writer, "UTF-8"); - return writer.toString(); - } + public static String getStringFromInputStream(InputStream input) throws IOException { + StringWriter writer = new StringWriter(); + IOUtils.copy(input, writer, "UTF-8"); + return writer.toString(); + } - public InputStream getNonClosingInputStream() throws IOException { - InputStream in = new FileInputStream("src/test/resources/input.txt"); - return StreamUtils.nonClosing(in); - } + public InputStream getNonClosingInputStream() throws IOException { + InputStream in = new FileInputStream("src/test/resources/input.txt"); + return StreamUtils.nonClosing(in); + } } diff --git a/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java b/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java index 6ee4a1ef3a..1ce67a075a 100644 --- a/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java +++ b/libraries/src/main/java/com/baeldung/streamutils/DrainStream.java @@ -5,7 +5,7 @@ import java.io.InputStream; import org.springframework.util.StreamUtils; public class DrainStream { - public InputStream getInputStream() { - return StreamUtils.emptyInput(); - } + public InputStream getInputStream() { + return StreamUtils.emptyInput(); + } } diff --git a/libraries/src/main/java/com/baeldung/tomcat/MyFilter.java b/libraries/src/main/java/com/baeldung/tomcat/MyFilter.java new file mode 100644 index 0000000000..9cf4a0ed95 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/tomcat/MyFilter.java @@ -0,0 +1,31 @@ +package com.baeldung.tomcat; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Created by adi on 1/14/18. + */ +@WebFilter(urlPatterns = "/my-servlet/*") +public class MyFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + System.out.println("Filtering stuff..."); + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.addHeader("myHeader", "myHeaderValue"); + chain.doFilter(request, httpResponse); + } + + @Override + public void destroy() { + + } +} diff --git a/libraries/src/main/java/com/baeldung/tomcat/MyServlet.java b/libraries/src/main/java/com/baeldung/tomcat/MyServlet.java new file mode 100644 index 0000000000..1b48e2d90b --- /dev/null +++ b/libraries/src/main/java/com/baeldung/tomcat/MyServlet.java @@ -0,0 +1,22 @@ +package com.baeldung.tomcat; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Created by adi on 1/10/18. + */ +@WebServlet(name = "com.baeldung.tomcat.programmatic.MyServlet", urlPatterns = { "/my-servlet" }) +public class MyServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setStatus(HttpServletResponse.SC_OK); + resp.getWriter().write("test"); + resp.getWriter().flush(); + resp.getWriter().close(); + } +} diff --git a/libraries/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java b/libraries/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java new file mode 100644 index 0000000000..6c4fed6d07 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java @@ -0,0 +1,61 @@ +package com.baeldung.tomcat; + +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.startup.Tomcat; +import org.apache.tomcat.util.descriptor.web.FilterDef; +import org.apache.tomcat.util.descriptor.web.FilterMap; + +import java.io.File; + +/** + * Created by adi on 1/10/18. + */ +public class ProgrammaticTomcat { + + private Tomcat tomcat = null; + + // uncomment for live test + // public static void main(String[] args) throws LifecycleException, ServletException, URISyntaxException, IOException { + // startTomcat(); + // } + + public void startTomcat() throws LifecycleException { + tomcat = new Tomcat(); + tomcat.setPort(8080); + tomcat.setHostname("localhost"); + String appBase = "."; + tomcat.getHost().setAppBase(appBase); + + File docBase = new File(System.getProperty("java.io.tmpdir")); + Context context = tomcat.addContext("", docBase.getAbsolutePath()); + + // add a servlet + Class servletClass = MyServlet.class; + Tomcat.addServlet(context, servletClass.getSimpleName(), servletClass.getName()); + context.addServletMappingDecoded("/my-servlet/*", servletClass.getSimpleName()); + + // add a filter and filterMapping + Class filterClass = MyFilter.class; + FilterDef myFilterDef = new FilterDef(); + myFilterDef.setFilterClass(filterClass.getName()); + myFilterDef.setFilterName(filterClass.getSimpleName()); + context.addFilterDef(myFilterDef); + + FilterMap myFilterMap = new FilterMap(); + myFilterMap.setFilterName(filterClass.getSimpleName()); + myFilterMap.addURLPattern("/my-servlet/*"); + context.addFilterMap(myFilterMap); + + tomcat.start(); + // uncomment for live test + // tomcat + // .getServer() + // .await(); + } + + public void stopTomcat() throws LifecycleException { + tomcat.stop(); + tomcat.destroy(); + } +} diff --git a/libraries/src/main/java/com/baeldung/yarg/DocumentController.java b/libraries/src/main/java/com/baeldung/yarg/DocumentController.java index 0e1bbca561..ff0d452108 100644 --- a/libraries/src/main/java/com/baeldung/yarg/DocumentController.java +++ b/libraries/src/main/java/com/baeldung/yarg/DocumentController.java @@ -30,25 +30,17 @@ public class DocumentController { @RequestMapping(path = "/generate/doc", method = RequestMethod.GET) public void generateDocument(HttpServletResponse response) throws IOException { ReportBuilder reportBuilder = new ReportBuilder(); - ReportTemplateBuilder reportTemplateBuilder = new ReportTemplateBuilder() - .documentPath("./src/main/resources/Letter.docx") - .documentName("Letter.docx") - .outputType(ReportOutputType.docx) - .readFileFromPath(); + ReportTemplateBuilder reportTemplateBuilder = new ReportTemplateBuilder().documentPath("./src/main/resources/Letter.docx").documentName("Letter.docx").outputType(ReportOutputType.docx).readFileFromPath(); reportBuilder.template(reportTemplateBuilder.build()); BandBuilder bandBuilder = new BandBuilder(); String json = FileUtils.readFileToString(new File("./src/main/resources/Data.json")); - ReportBand main = bandBuilder.name("Main") - .query("Main", "parameter=param1 $.main", "json") - .build(); + ReportBand main = bandBuilder.name("Main").query("Main", "parameter=param1 $.main", "json").build(); reportBuilder.band(main); Report report = reportBuilder.build(); Reporting reporting = new Reporting(); reporting.setFormatterFactory(new DefaultFormatterFactory()); - reporting.setLoaderFactory( - new DefaultLoaderFactory() - .setJsonDataLoader(new JsonDataLoader())); + reporting.setLoaderFactory(new DefaultLoaderFactory().setJsonDataLoader(new JsonDataLoader())); response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); reporting.runReport(new RunParams(report).param("param1", json), response.getOutputStream()); } diff --git a/libraries/src/main/resources/Greeting.sol b/libraries/src/main/resources/Greeting.sol new file mode 100644 index 0000000000..dde7b36cc3 --- /dev/null +++ b/libraries/src/main/resources/Greeting.sol @@ -0,0 +1,19 @@ +pragma solidity ^0.4.0; + +contract Greeting { + address creator; + string message; + + function Greeting(string _message) { + message = _message; + creator = msg.sender; + } + + function greet() constant returns (string) { + return message; + } + + function setGreeting(string _message) { + message = _message; + } +} \ No newline at end of file diff --git a/libraries/src/main/resources/google-sheets-client-secret.json b/libraries/src/main/resources/google-sheets-client-secret.json new file mode 100644 index 0000000000..c92ccd6b9b --- /dev/null +++ b/libraries/src/main/resources/google-sheets-client-secret.json @@ -0,0 +1 @@ +{"installed":{"client_id":"394827218507-2ev02b2ha8plt7g2lh5nqse02ee737cf.apps.googleusercontent.com","project_id":"decisive-octane-187810","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"2MnN1DfenoCGWMay3v8Bf7eI","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}} \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/email.ftl b/libraries/src/main/resources/smooks/email.ftl new file mode 100644 index 0000000000..8413046508 --- /dev/null +++ b/libraries/src/main/resources/smooks/email.ftl @@ -0,0 +1,8 @@ +<#setting locale="en_US"> +Hi, +Order number #${order.number} created on ${order.creationDate?string["yyyy-MM-dd"]} is currently in ${order.status} status. +Consider contact supplier "${supplier.name}" with phone number: "${supplier.phoneNumber}". +Order items: +<#list items as item> +${item.quantity} X ${item.code} (total price ${item.price * item.quantity}) + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/item-rules.csv b/libraries/src/main/resources/smooks/item-rules.csv new file mode 100644 index 0000000000..c93c453f25 --- /dev/null +++ b/libraries/src/main/resources/smooks/item-rules.csv @@ -0,0 +1 @@ +"max_total","item.quantity * item.price < 300.00" diff --git a/libraries/src/main/resources/smooks/order.ftl b/libraries/src/main/resources/smooks/order.ftl new file mode 100644 index 0000000000..9d40eb55c7 --- /dev/null +++ b/libraries/src/main/resources/smooks/order.ftl @@ -0,0 +1,7 @@ +<#setting locale="en_US"> +UNA:+.? ' +UNH+${order.number}+${order.status}+${order.creationDate?string["yyyy-MM-dd"]}' +CTA+${supplier.name}+${supplier.phoneNumber}' +<#list items as item> +LIN+${item.quantity}+${item.code}+${item.price}' + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/order.json b/libraries/src/main/resources/smooks/order.json new file mode 100644 index 0000000000..bf6bc5fe93 --- /dev/null +++ b/libraries/src/main/resources/smooks/order.json @@ -0,0 +1,21 @@ +{ + "creationDate":"2018-01-14", + "orderNumber":771, + "orderStatus":"IN_PROGRESS", + "supplier":{ + "name":"CompanyX", + "phone":"1234567" + }, + "orderItems":[ + { + "quantity":1, + "code":"PX1234", + "price":9.99 + }, + { + "quantity":2, + "code":"RX1990", + "price":120.32 + } + ] +} \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/order.xml b/libraries/src/main/resources/smooks/order.xml new file mode 100644 index 0000000000..343c5cab38 --- /dev/null +++ b/libraries/src/main/resources/smooks/order.xml @@ -0,0 +1,20 @@ + + 771 + IN_PROGRESS + + CompanyX + 1234567 + + + + 1 + PX1234 + 9.99 + + + 2 + RX990 + 120.32 + + + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/smooks-mapping.xml b/libraries/src/main/resources/smooks/smooks-mapping.xml new file mode 100644 index 0000000000..7996834e38 --- /dev/null +++ b/libraries/src/main/resources/smooks/smooks-mapping.xml @@ -0,0 +1,29 @@ + + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/smooks-transform-edi.xml b/libraries/src/main/resources/smooks/smooks-transform-edi.xml new file mode 100644 index 0000000000..1dae4055a8 --- /dev/null +++ b/libraries/src/main/resources/smooks/smooks-transform-edi.xml @@ -0,0 +1,11 @@ + + + + + + + /smooks/order.ftl + + + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/smooks-transform-email.xml b/libraries/src/main/resources/smooks/smooks-transform-email.xml new file mode 100644 index 0000000000..101aa67f0d --- /dev/null +++ b/libraries/src/main/resources/smooks/smooks-transform-email.xml @@ -0,0 +1,12 @@ + + + + + + + + /smooks/email.ftl + + + \ No newline at end of file diff --git a/libraries/src/main/resources/smooks/smooks-validation.xml b/libraries/src/main/resources/smooks/smooks-validation.xml new file mode 100644 index 0000000000..b66722ffc5 --- /dev/null +++ b/libraries/src/main/resources/smooks/smooks-validation.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/libraries/src/main/resources/smooks/supplier.properties b/libraries/src/main/resources/smooks/supplier.properties new file mode 100644 index 0000000000..cc17e45eb4 --- /dev/null +++ b/libraries/src/main/resources/smooks/supplier.properties @@ -0,0 +1,2 @@ +supplierName=[A-Za-z0-9]* +supplierPhone=^[0-9\\-\\+]{9,15}$ diff --git a/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java b/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java new file mode 100644 index 0000000000..7ff81c20c3 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/asynchttpclient/AsyncHttpClientTestCase.java @@ -0,0 +1,204 @@ +package com.baeldung.asynchttpclient; + +import io.netty.handler.codec.http.HttpHeaders; +import org.asynchttpclient.AsyncCompletionHandler; +import org.asynchttpclient.AsyncHandler; +import org.asynchttpclient.AsyncHttpClient; +import org.asynchttpclient.AsyncHttpClientConfig; +import org.asynchttpclient.BoundRequestBuilder; +import org.asynchttpclient.Dsl; +import org.asynchttpclient.HttpResponseBodyPart; +import org.asynchttpclient.HttpResponseStatus; +import org.asynchttpclient.ListenableFuture; +import org.asynchttpclient.Request; +import org.asynchttpclient.Response; +import org.asynchttpclient.ws.WebSocket; +import org.asynchttpclient.ws.WebSocketListener; +import org.asynchttpclient.ws.WebSocketUpgradeHandler; +import org.junit.Before; +import org.junit.Test; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class AsyncHttpClientTestCase { + + private static AsyncHttpClient HTTP_CLIENT; + + @Before + public void setup() { + AsyncHttpClientConfig clientConfig = Dsl.config().setConnectTimeout(15000).setRequestTimeout(15000).build(); + HTTP_CLIENT = Dsl.asyncHttpClient(clientConfig); + } + + @Test + public void givenHttpClient_executeSyncGetRequest() { + + BoundRequestBuilder boundGetRequest = HTTP_CLIENT.prepareGet("http://www.baeldung.com"); + + Future responseFuture = boundGetRequest.execute(); + try { + Response response = responseFuture.get(5000, TimeUnit.MILLISECONDS); + assertNotNull(response); + assertEquals(200, response.getStatusCode()); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + } + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Test + public void givenHttpClient_executeAsyncGetRequest() { + + // execute an unbound GET request + Request unboundGetRequest = Dsl.get("http://www.baeldung.com").build(); + + HTTP_CLIENT.executeRequest(unboundGetRequest, new AsyncCompletionHandler() { + @Override + public Integer onCompleted(Response response) { + + int resposeStatusCode = response.getStatusCode(); + assertEquals(200, resposeStatusCode); + return resposeStatusCode; + } + }); + + // execute a bound GET request + BoundRequestBuilder boundGetRequest = HTTP_CLIENT.prepareGet("http://www.baeldung.com"); + + boundGetRequest.execute(new AsyncCompletionHandler() { + @Override + public Integer onCompleted(Response response) { + int resposeStatusCode = response.getStatusCode(); + assertEquals(200, resposeStatusCode); + return resposeStatusCode; + } + }); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Test + public void givenHttpClient_executeAsyncGetRequestWithAsyncHandler() { + + // execute an unbound GET request + Request unboundGetRequest = Dsl.get("http://www.baeldung.com").build(); + + HTTP_CLIENT.executeRequest(unboundGetRequest, new AsyncHandler() { + + int responseStatusCode = -1; + + @Override + public State onStatusReceived(HttpResponseStatus responseStatus) { + responseStatusCode = responseStatus.getStatusCode(); + return State.CONTINUE; + } + + @Override + public State onHeadersReceived(HttpHeaders headers) { + return State.CONTINUE; + } + + @Override + public State onBodyPartReceived(HttpResponseBodyPart bodyPart) { + return State.CONTINUE; + } + + @Override + public void onThrowable(Throwable t) { + + } + + @Override + public Integer onCompleted() { + assertEquals(200, responseStatusCode); + return responseStatusCode; + } + }); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Test + public void givenHttpClient_executeAsyncGetRequestWithListanableFuture() { + // execute an unbound GET request + Request unboundGetRequest = Dsl.get("http://www.baeldung.com").build(); + + ListenableFuture listenableFuture = HTTP_CLIENT.executeRequest(unboundGetRequest); + listenableFuture.addListener(() -> { + Response response; + try { + response = listenableFuture.get(5000, TimeUnit.MILLISECONDS); + assertEquals(200, response.getStatusCode()); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + } + }, Executors.newCachedThreadPool()); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Test + public void givenWebSocketClient_tryToConnect() { + + WebSocketUpgradeHandler.Builder upgradeHandlerBuilder = new WebSocketUpgradeHandler.Builder(); + WebSocketUpgradeHandler wsHandler = upgradeHandlerBuilder.addWebSocketListener(new WebSocketListener() { + @Override + public void onOpen(WebSocket websocket) { + // WebSocket connection opened + } + + @Override + public void onClose(WebSocket websocket, int code, String reason) { + // WebSocket connection closed + } + + @Override + public void onError(Throwable t) { + // WebSocket connection error + assertTrue(t.getMessage().contains("Request timeout")); + } + }).build(); + + WebSocket WEBSOCKET_CLIENT = null; + try { + WEBSOCKET_CLIENT = Dsl.asyncHttpClient().prepareGet("ws://localhost:5590/websocket").addHeader("header_name", "header_value").addQueryParam("key", "value").setRequestTimeout(5000).execute(wsHandler).get(); + + if (WEBSOCKET_CLIENT.isOpen()) { + WEBSOCKET_CLIENT.sendPingFrame(); + WEBSOCKET_CLIENT.sendTextFrame("test message"); + WEBSOCKET_CLIENT.sendBinaryFrame(new byte[] { 't', 'e', 's', 't' }); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } finally { + if (WEBSOCKET_CLIENT != null && WEBSOCKET_CLIENT.isOpen()) { + WEBSOCKET_CLIENT.sendCloseFrame(200, "OK"); + } + } + } +} diff --git a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java index 7ca656efbf..87c0b13bcc 100644 --- a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java +++ b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceLongRunningUnitTest.java @@ -35,10 +35,7 @@ public class AsyncServiceLongRunningUnitTest { public void givenAsyncService_whenInitialize_thenInitOccurs2() { asyncService.initialize(); Callable isInitialized = asyncService::isInitialized; - await().atLeast(Duration.ONE_HUNDRED_MILLISECONDS) - .atMost(Duration.FIVE_SECONDS) - .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) - .until(isInitialized); + await().atLeast(Duration.ONE_HUNDRED_MILLISECONDS).atMost(Duration.FIVE_SECONDS).with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS).until(isInitialized); } @Test @@ -60,9 +57,7 @@ public class AsyncServiceLongRunningUnitTest { @Test public void givenAsyncService_whenInitialize_thenInitOccurs3() { asyncService.initialize(); - await().until(fieldIn(asyncService) - .ofType(boolean.class) - .andWithName("initialized"), equalTo(true)); + await().until(fieldIn(asyncService).ofType(boolean.class).andWithName("initialized"), equalTo(true)); } @Test @@ -77,10 +72,6 @@ public class AsyncServiceLongRunningUnitTest { @Test public void givenAsyncService_whenGetValue_thenExceptionIgnored() { asyncService.initialize(); - given().ignoreException(IllegalStateException.class) - .await() - .atMost(Duration.FIVE_SECONDS) - .atLeast(Duration.FIVE_HUNDRED_MILLISECONDS) - .until(asyncService::getValue, equalTo(0L)); + given().ignoreException(IllegalStateException.class).await().atMost(Duration.FIVE_SECONDS).atLeast(Duration.FIVE_HUNDRED_MILLISECONDS).until(asyncService::getValue, equalTo(0L)); } } diff --git a/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java b/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java index 3965eeecd4..009119d97a 100644 --- a/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java +++ b/libraries/src/test/java/com/baeldung/bouncycastle/BouncyCastleLiveTest.java @@ -28,14 +28,11 @@ public class BouncyCastleLiveTest { char[] keyPassword = "password".toCharArray(); @Test - public void givenCryptographicResource_whenOperationSuccess_returnTrue() - throws CertificateException, NoSuchProviderException, NoSuchAlgorithmException, IOException, - KeyStoreException, UnrecoverableKeyException, CMSException, OperatorCreationException { + public void givenCryptographicResource_whenOperationSuccess_returnTrue() throws CertificateException, NoSuchProviderException, NoSuchAlgorithmException, IOException, KeyStoreException, UnrecoverableKeyException, CMSException, OperatorCreationException { Security.addProvider(new BouncyCastleProvider()); CertificateFactory certFactory = CertificateFactory.getInstance("X.509", "BC"); - X509Certificate certificate = (X509Certificate) certFactory - .generateCertificate(new FileInputStream(certificatePath)); + X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(new FileInputStream(certificatePath)); KeyStore keystore = KeyStore.getInstance("PKCS12"); keystore.load(new FileInputStream(privateKeyPath), p12Password); PrivateKey privateKey = (PrivateKey) keystore.getKey("baeldung", keyPassword); diff --git a/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java b/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java index 6b7364a0a5..5f721025c3 100644 --- a/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java +++ b/libraries/src/test/java/com/baeldung/bytebuddy/ByteBuddyUnitTest.java @@ -21,14 +21,9 @@ public class ByteBuddyUnitTest { @Test public void givenObject_whenToString_thenReturnHelloWorldString() throws InstantiationException, IllegalAccessException { - DynamicType.Unloaded unloadedType = new ByteBuddy() - .subclass(Object.class) - .method(ElementMatchers.isToString()) - .intercept(FixedValue.value("Hello World ByteBuddy!")) - .make(); + DynamicType.Unloaded unloadedType = new ByteBuddy().subclass(Object.class).method(ElementMatchers.isToString()).intercept(FixedValue.value("Hello World ByteBuddy!")).make(); - Class dynamicType = unloadedType.load(getClass().getClassLoader()) - .getLoaded(); + Class dynamicType = unloadedType.load(getClass().getClassLoader()).getLoaded(); assertEquals(dynamicType.newInstance().toString(), "Hello World ByteBuddy!"); } @@ -36,12 +31,7 @@ public class ByteBuddyUnitTest { @Test public void givenFoo_whenRedefined_thenReturnFooRedefined() throws Exception { ByteBuddyAgent.install(); - new ByteBuddy() - .redefine(Foo.class) - .method(named("sayHelloFoo")) - .intercept(FixedValue.value("Hello Foo Redefined")) - .make() - .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); + new ByteBuddy().redefine(Foo.class).method(named("sayHelloFoo")).intercept(FixedValue.value("Hello Foo Redefined")).make().load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); Foo f = new Foo(); assertEquals(f.sayHelloFoo(), "Hello Foo Redefined"); } @@ -49,34 +39,16 @@ public class ByteBuddyUnitTest { @Test public void givenSayHelloFoo_whenMethodDelegation_thenSayHelloBar() throws IllegalAccessException, InstantiationException { - String r = new ByteBuddy() - .subclass(Foo.class) - .method( - named("sayHelloFoo") - .and(isDeclaredBy(Foo.class) - .and(returns(String.class))) - ) - .intercept(MethodDelegation.to(Bar.class)) - .make() - .load(getClass().getClassLoader()) - .getLoaded() - .newInstance() - .sayHelloFoo(); + String r = new ByteBuddy().subclass(Foo.class).method(named("sayHelloFoo").and(isDeclaredBy(Foo.class).and(returns(String.class)))).intercept(MethodDelegation.to(Bar.class)).make().load(getClass().getClassLoader()).getLoaded().newInstance() + .sayHelloFoo(); assertEquals(r, Bar.sayHelloBar()); } @Test public void givenMethodName_whenDefineMethod_thenCreateMethod() throws Exception { - Class type = new ByteBuddy() - .subclass(Object.class) - .name("MyClassName") - .defineMethod("custom", String.class, Modifier.PUBLIC) - .intercept(MethodDelegation.to(Bar.class)) - .defineField("x", String.class, Modifier.PUBLIC) - .make() - .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) - .getLoaded(); + Class type = new ByteBuddy().subclass(Object.class).name("MyClassName").defineMethod("custom", String.class, Modifier.PUBLIC).intercept(MethodDelegation.to(Bar.class)).defineField("x", String.class, Modifier.PUBLIC).make() + .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER).getLoaded(); Method m = type.getDeclaredMethod("custom", null); @@ -85,5 +57,4 @@ public class ByteBuddyUnitTest { } - } diff --git a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java b/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java index 56dbda5974..d523d0ff8b 100644 --- a/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java +++ b/libraries/src/test/java/com/baeldung/caffeine/CaffeineUnitTest.java @@ -16,10 +16,7 @@ public class CaffeineUnitTest { @Test public void givenCache_whenPopulate_thenValueStored() { - Cache cache = Caffeine.newBuilder() - .expireAfterWrite(1, TimeUnit.MINUTES) - .maximumSize(100) - .build(); + Cache cache = Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).maximumSize(100).build(); String key = "A"; DataObject dataObject = cache.getIfPresent(key); @@ -44,10 +41,7 @@ public class CaffeineUnitTest { @Test public void givenLoadingCache_whenGet_thenValuePopulated() { - LoadingCache cache = Caffeine.newBuilder() - .maximumSize(100) - .expireAfterWrite(1, TimeUnit.MINUTES) - .build(k -> DataObject.get("Data for " + k)); + LoadingCache cache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k)); String key = "A"; DataObject dataObject = cache.get(key); @@ -63,10 +57,7 @@ public class CaffeineUnitTest { @Test public void givenAsyncLoadingCache_whenGet_thenValuePopulated() { - AsyncLoadingCache cache = Caffeine.newBuilder() - .maximumSize(100) - .expireAfterWrite(1, TimeUnit.MINUTES) - .buildAsync(k -> DataObject.get("Data for " + k)); + AsyncLoadingCache cache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.MINUTES).buildAsync(k -> DataObject.get("Data for " + k)); String key = "A"; cache.get(key).thenAccept(dataObject -> { @@ -74,16 +65,12 @@ public class CaffeineUnitTest { assertEquals("Data for " + key, dataObject.getData()); }); - cache.getAll(Arrays.asList("A", "B", "C")) - .thenAccept(dataObjectMap -> assertEquals(3, dataObjectMap.size())); + cache.getAll(Arrays.asList("A", "B", "C")).thenAccept(dataObjectMap -> assertEquals(3, dataObjectMap.size())); } @Test public void givenLoadingCacheWithSmallSize_whenPut_thenSizeIsConstant() { - LoadingCache cache = Caffeine.newBuilder() - .maximumSize(1) - .refreshAfterWrite(10, TimeUnit.MINUTES) - .build(k -> DataObject.get("Data for " + k)); + LoadingCache cache = Caffeine.newBuilder().maximumSize(1).refreshAfterWrite(10, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k)); assertEquals(0, cache.estimatedSize()); @@ -99,10 +86,7 @@ public class CaffeineUnitTest { @Test public void givenLoadingCacheWithWeigher_whenPut_thenSizeIsConstant() { - LoadingCache cache = Caffeine.newBuilder() - .maximumWeight(10) - .weigher((k,v) -> 5) - .build(k -> DataObject.get("Data for " + k)); + LoadingCache cache = Caffeine.newBuilder().maximumWeight(10).weigher((k, v) -> 5).build(k -> DataObject.get("Data for " + k)); assertEquals(0, cache.estimatedSize()); @@ -122,20 +106,11 @@ public class CaffeineUnitTest { @Test public void givenTimeEvictionCache_whenTimeLeft_thenValueEvicted() { - LoadingCache cache = Caffeine.newBuilder() - .expireAfterAccess(5, TimeUnit.MINUTES) - .build(k -> DataObject.get("Data for " + k)); + LoadingCache cache = Caffeine.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k)); - cache = Caffeine.newBuilder() - .expireAfterWrite(10, TimeUnit.SECONDS) - .weakKeys() - .weakValues() - .build(k -> DataObject.get("Data for " + k)); + cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).weakKeys().weakValues().build(k -> DataObject.get("Data for " + k)); - cache = Caffeine.newBuilder() - .expireAfterWrite(10, TimeUnit.SECONDS) - .softValues() - .build(k -> DataObject.get("Data for " + k)); + cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).softValues().build(k -> DataObject.get("Data for " + k)); cache = Caffeine.newBuilder().expireAfter(new Expiry() { @Override @@ -154,17 +129,12 @@ public class CaffeineUnitTest { } }).build(k -> DataObject.get("Data for " + k)); - cache = Caffeine.newBuilder() - .refreshAfterWrite(1, TimeUnit.MINUTES) - .build(k -> DataObject.get("Data for " + k)); + cache = Caffeine.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES).build(k -> DataObject.get("Data for " + k)); } @Test public void givenCache_whenStatsEnabled_thenStatsRecorded() { - LoadingCache cache = Caffeine.newBuilder() - .maximumSize(100) - .recordStats() - .build(k -> DataObject.get("Data for " + k)); + LoadingCache cache = Caffeine.newBuilder().maximumSize(100).recordStats().build(k -> DataObject.get("Data for " + k)); cache.get("A"); cache.get("A"); diff --git a/libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorIntegrationTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorIntegrationTest.java index 1224d73724..080444d7b1 100644 --- a/libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/cglib/proxy/BeanGeneratorIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.cglib.proxy; - import net.sf.cglib.beans.BeanGenerator; import org.junit.Test; @@ -12,21 +11,17 @@ public class BeanGeneratorIntegrationTest { @Test public void givenBeanCreator_whenAddProperty_thenClassShouldHaveFieldValue() throws Exception { - //given + // given BeanGenerator beanGenerator = new BeanGenerator(); - //when + // when beanGenerator.addProperty("name", String.class); Object myBean = beanGenerator.create(); - Method setter = myBean - .getClass() - .getMethod("setName", String.class); + Method setter = myBean.getClass().getMethod("setName", String.class); setter.invoke(myBean, "some string value set by a cglib"); - //then - Method getter = myBean - .getClass() - .getMethod("getName"); + // then + Method getter = myBean.getClass().getMethod("getName"); assertEquals("some string value set by a cglib", getter.invoke(myBean)); } } diff --git a/libraries/src/test/java/com/baeldung/cglib/proxy/MixinUnitTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/MixinUnitTest.java index 93b34bf92b..fc2f6cc1e1 100644 --- a/libraries/src/test/java/com/baeldung/cglib/proxy/MixinUnitTest.java +++ b/libraries/src/test/java/com/baeldung/cglib/proxy/MixinUnitTest.java @@ -14,14 +14,11 @@ public class MixinUnitTest { @Test public void givenTwoClasses_whenMixedIntoOne_thenMixinShouldHaveMethodsFromBothClasses() throws Exception { - //when - Mixin mixin = Mixin.create( - new Class[]{Interface1.class, Interface2.class, MixinInterface.class}, - new Object[]{new Class1(), new Class2()} - ); + // when + Mixin mixin = Mixin.create(new Class[] { Interface1.class, Interface2.class, MixinInterface.class }, new Object[] { new Class1(), new Class2() }); MixinInterface mixinDelegate = (MixinInterface) mixin; - //then + // then assertEquals("first behaviour", mixinDelegate.first()); assertEquals("second behaviour", mixinDelegate.second()); } diff --git a/libraries/src/test/java/com/baeldung/cglib/proxy/ProxyIntegrationTest.java b/libraries/src/test/java/com/baeldung/cglib/proxy/ProxyIntegrationTest.java index c22a148d4f..d5c8a1b589 100644 --- a/libraries/src/test/java/com/baeldung/cglib/proxy/ProxyIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/cglib/proxy/ProxyIntegrationTest.java @@ -10,34 +10,34 @@ import static org.junit.Assert.assertEquals; public class ProxyIntegrationTest { @Test public void givenPersonService_whenSayHello_thenReturnResult() { - //given + // given PersonService personService = new PersonService(); - //when + // when String res = personService.sayHello("Tom"); - //then + // then assertEquals(res, "Hello Tom"); } @Test public void givenEnhancerProxy_whenExtendPersonService_thenInterceptMethod() throws Exception { - //given + // given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); enhancer.setCallback((FixedValue) () -> "Hello Tom!"); PersonService proxy = (PersonService) enhancer.create(); - //when + // when String res = proxy.sayHello(null); - //then + // then assertEquals("Hello Tom!", res); } @Test public void givenEnhancer_whenExecuteMethodOnProxy_thenInterceptOnlyStringReturnTypeMethod() throws Exception { - //given + // given Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(PersonService.class); enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> { @@ -48,10 +48,10 @@ public class ProxyIntegrationTest { } }); - //when + // when PersonService proxy = (PersonService) enhancer.create(); - //then + // then assertEquals("Hello Tom!", proxy.sayHello(null)); int lengthOfName = proxy.lengthOfName("Mary"); assertEquals(4, lengthOfName); diff --git a/libraries/src/test/java/com/baeldung/chronicle/queue/ChronicleQueueIntegrationTest.java b/libraries/src/test/java/com/baeldung/chronicle/queue/ChronicleQueueIntegrationTest.java index 9c0a0ac910..00e9500318 100644 --- a/libraries/src/test/java/com/baeldung/chronicle/queue/ChronicleQueueIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/chronicle/queue/ChronicleQueueIntegrationTest.java @@ -14,12 +14,12 @@ import net.openhft.chronicle.ExcerptTailer; import net.openhft.chronicle.tools.ChronicleTools; public class ChronicleQueueIntegrationTest { - + @Test public void givenSetOfValues_whenWriteToQueue_thenWriteSuccesfully() throws IOException { File queueDir = Files.createTempDirectory("chronicle-queue").toFile(); ChronicleTools.deleteOnExit(queueDir.getPath()); - + Chronicle chronicle = ChronicleQueueBuilder.indexed(queueDir).build(); String stringVal = "Hello World"; int intVal = 101; @@ -37,7 +37,7 @@ public class ChronicleQueueIntegrationTest { } tailer.finish(); tailer.close(); - chronicle.close(); + chronicle.close(); } } diff --git a/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java b/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java similarity index 86% rename from libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java rename to libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java index 5407477a00..833d91b2c4 100644 --- a/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java +++ b/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java @@ -7,11 +7,10 @@ import java.util.List; import org.junit.Assert; import org.junit.Test; -public class CourseServiceTest { +public class CourseServiceUnitTest { @Test - public void givenCourse_whenSetValuesUsingPropertyUtil_thenReturnSetValues() - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + public void givenCourse_whenSetValuesUsingPropertyUtil_thenReturnSetValues() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { Course course = new Course(); String name = "Computer Science"; List codes = Arrays.asList("CS", "CS01"); @@ -36,8 +35,7 @@ public class CourseServiceTest { } @Test - public void givenCopyProperties_whenCopyCourseToCourseEntity_thenCopyPropertyWithSameName() - throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + public void givenCopyProperties_whenCopyCourseToCourseEntity_thenCopyPropertyWithSameName() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { Course course = new Course(); course.setName("Computer Science"); course.setCodes(Arrays.asList("CS")); diff --git a/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java b/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java index aa8b799c9d..f34f431d8e 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java +++ b/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java @@ -1,6 +1,5 @@ package com.baeldung.commons.collections; - import com.baeldung.commons.collectionutil.Address; import com.baeldung.commons.collectionutil.Customer; import org.apache.commons.collections4.CollectionUtils; @@ -21,7 +20,6 @@ import static org.junit.Assert.assertTrue; public class CollectionUtilsGuideTest { - Customer customer1 = new Customer(1, "Daniel", 123456l, "locality1", "city1", "1234"); Customer customer4 = new Customer(4, "Bob", 456789l, "locality4", "city4", "4567"); List list1, list2, list3, linkedList1; @@ -77,8 +75,8 @@ public class CollectionUtilsGuideTest { } }); - //filterInverse does the opposite. It removes the element from the list if the Predicate returns true - //select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection + // filterInverse does the opposite. It removes the element from the list if the Predicate returns true + // select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection assertTrue(isModified && linkedList1.size() == 2); } @@ -88,8 +86,8 @@ public class CollectionUtilsGuideTest { List emptyList = new ArrayList<>(); List nullList = null; - //Very handy at times where we want to check if a collection is not null and not empty too. - //isNotEmpty does the opposite. Handy because using ! operator on isEmpty makes it missable while reading + // Very handy at times where we want to check if a collection is not null and not empty too. + // isNotEmpty does the opposite. Handy because using ! operator on isEmpty makes it missable while reading assertTrue(CollectionUtils.isNotEmpty(list1)); assertTrue(CollectionUtils.isEmpty(nullList)); assertTrue(CollectionUtils.isEmpty(emptyList)); diff --git a/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsTest.java b/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsTest.java index 4685d84781..988335b7d1 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsTest.java +++ b/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsTest.java @@ -1,6 +1,5 @@ package com.baeldung.commons.collections; -import org.apache.commons.collections4.MapIterator; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.PredicateUtils; import org.apache.commons.collections4.TransformerUtils; @@ -8,35 +7,20 @@ import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.collection.IsMapContaining.hasEntry; import static org.hamcrest.collection.IsMapWithSize.aMapWithSize; import static org.hamcrest.collection.IsMapWithSize.anEmptyMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; public class MapUtilsTest { - private String[][] color2DArray = new String[][]{ - {"RED", "#FF0000"}, - {"GREEN", "#00FF00"}, - {"BLUE", "#0000FF"} - }; - private String[] color1DArray = new String[]{ - "RED", "#FF0000", - "GREEN", "#00FF00", - "BLUE", "#0000FF" - }; + private String[][] color2DArray = new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } }; + private String[] color1DArray = new String[] { "RED", "#FF0000", "GREEN", "#00FF00", "BLUE", "#0000FF" }; private Map colorMap; @Before @@ -92,34 +76,26 @@ public class MapUtilsTest { Map invColorMap = MapUtils.invertMap(this.colorMap); int size = invColorMap.size(); - Assertions.assertThat(invColorMap) - .hasSameSizeAs(colorMap) - .containsKeys(this.colorMap.values().toArray(new String[size])) - .containsValues(this.colorMap.keySet().toArray(new String[size])); + Assertions.assertThat(invColorMap).hasSameSizeAs(colorMap).containsKeys(this.colorMap.values().toArray(new String[size])).containsValues(this.colorMap.keySet().toArray(new String[size])); } @Test(expected = IllegalArgumentException.class) public void whenCreateFixedSizedMapAndAdd_thenMustThrowException() { - Map rgbMap = MapUtils.fixedSizeMap(MapUtils.putAll( - new HashMap(), - this.color1DArray)); + Map rgbMap = MapUtils.fixedSizeMap(MapUtils.putAll(new HashMap(), this.color1DArray)); rgbMap.put("ORANGE", "#FFA500"); } @Test(expected = IllegalArgumentException.class) public void whenAddDuplicateToUniqueValuesPredicateMap_thenMustThrowException() { - Map uniqValuesMap - = MapUtils.predicatedMap(this.colorMap, null, PredicateUtils.uniquePredicate()); + Map uniqValuesMap = MapUtils.predicatedMap(this.colorMap, null, PredicateUtils.uniquePredicate()); uniqValuesMap.put("NEW_RED", "#FF0000"); } @Test public void whenCreateLazyMap_theMapIsCreated() { - Map intStrMap = MapUtils.lazyMap( - new HashMap(), - TransformerUtils.stringValueTransformer()); + Map intStrMap = MapUtils.lazyMap(new HashMap(), TransformerUtils.stringValueTransformer()); assertThat(intStrMap, is(anEmptyMap())); diff --git a/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java index 7d214bc5c5..aa73ed6109 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java @@ -17,8 +17,7 @@ public class SetUtilsUnitTest { public void givenSetAndPredicate_whenPredicatedSet_thenValidateSet_and_throw_IllegalArgumentException() { Set sourceSet = new HashSet<>(); sourceSet.addAll(Arrays.asList("London", "Lagos", "Err Source1")); - Set validatingSet - = SetUtils.predicatedSet(sourceSet, (s) -> s.startsWith("L")); + Set validatingSet = SetUtils.predicatedSet(sourceSet, (s) -> s.startsWith("L")); validatingSet.add("Err Source2"); } diff --git a/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java index 7a05228e51..c64143cba7 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java @@ -14,8 +14,8 @@ import static org.junit.Assert.assertEquals; public class OrderedMapUnitTest { - private String[] names = {"Emily", "Mathew", "Rose", "John", "Anna"}; - private Integer[] ages = {37, 28, 40, 36, 21}; + private String[] names = { "Emily", "Mathew", "Rose", "John", "Anna" }; + private Integer[] ages = { 37, 28, 40, 36, 21 }; private int RUNNERS_COUNT = names.length; diff --git a/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java b/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java index 55fadcbf85..4408dcc195 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java +++ b/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java @@ -15,94 +15,88 @@ import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; public class BagTests { - + @Test public void givenMultipleCopies_whenAdded_theCountIsKept() { - Bag bag = new HashBag<>( - Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); - + Bag bag = new HashBag<>(Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); + assertThat(bag.getCount(1), equalTo(2)); } - + @Test public void givenBag_whenBagAddAPILikeCollectionAPI_thenFalse() { Collection collection = new ArrayList<>(); - + // Collection contract defines that add() should return true assertThat(collection.add(9), is(true)); - + // Even when element is already in the collection collection.add(1); assertThat(collection.add(1), is(true)); - + Bag bag = new HashBag<>(); - + // Bag returns true on adding a new element assertThat(bag.add(9), is(true)); - + bag.add(1); // But breaks the contract with false when it has to increment the count assertThat(bag.add(1), is(not(true))); } - + @Test public void givenDecoratedBag_whenBagAddAPILikeCollectionAPI_thenTrue() { Bag bag = CollectionBag.collectionBag(new HashBag<>()); - + bag.add(1); // This time the behavior is compliant to the Java Collection assertThat(bag.add(1), is((true))); } - + @Test public void givenAdd_whenCountOfElementsDefined_thenCountAreAdded() { Bag bag = new HashBag<>(); - + // Adding 1 for 5 times bag.add(1, 5); assertThat(bag.getCount(1), equalTo(5)); } - + @Test public void givenMultipleCopies_whenRemove_allAreRemoved() { - Bag bag = new HashBag<>( - Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); - + Bag bag = new HashBag<>(Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); + // From 3 we delete 1, 2 remain bag.remove(3, 1); assertThat(bag.getCount(3), equalTo(2)); - + // From 2 we delete all bag.remove(1); assertThat(bag.getCount(1), equalTo(0)); } - + @Test public void givenTree_whenDuplicateElementsAdded_thenSort() { - TreeBag bag = new TreeBag<>( - Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 })); - + TreeBag bag = new TreeBag<>(Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 })); + assertThat(bag.first(), equalTo(1)); assertThat(bag.getCount(bag.first()), equalTo(2)); assertThat(bag.last(), equalTo(7)); assertThat(bag.getCount(bag.last()), equalTo(3)); } - + @Test public void givenDecoratedTree_whenTreeAddAPILikeCollectionAPI_thenTrue() { - SortedBag bag = CollectionSortedBag - .collectionSortedBag(new TreeBag<>()); - + SortedBag bag = CollectionSortedBag.collectionSortedBag(new TreeBag<>()); + bag.add(1); assertThat(bag.add(1), is((true))); } - + @Test public void givenSortedBag_whenDuplicateElementsAdded_thenSort() { - SynchronizedSortedBag bag = SynchronizedSortedBag - .synchronizedSortedBag(new TreeBag<>( - Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 }))); - + SynchronizedSortedBag bag = SynchronizedSortedBag.synchronizedSortedBag(new TreeBag<>(Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 }))); + assertThat(bag.first(), equalTo(1)); assertThat(bag.getCount(bag.first()), equalTo(2)); assertThat(bag.last(), equalTo(7)); diff --git a/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterTest.java b/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterTest.java index 6f47b89396..6210bb51a9 100644 --- a/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterTest.java +++ b/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterTest.java @@ -29,10 +29,7 @@ public class CSVReaderWriterTest { @Test public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException { Reader in = new FileReader("src/test/resources/book.csv"); - Iterable records = CSVFormat.DEFAULT - .withHeader(HEADERS) - .withFirstRecordAsHeader() - .parse(in); + Iterable records = CSVFormat.DEFAULT.withHeader(HEADERS).withFirstRecordAsHeader().parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); @@ -52,9 +49,7 @@ public class CSVReaderWriterTest { } }); } - assertEquals(EXPECTED_FILESTREAM, sw - .toString() - .trim()); + assertEquals(EXPECTED_FILESTREAM, sw.toString().trim()); } } diff --git a/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java index bc7623589c..02cec7d53a 100644 --- a/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java @@ -47,10 +47,8 @@ public class DbUtilsUnitTest { List> list = runner.query(connection, "SELECT * FROM employee", beanListHandler); assertEquals(list.size(), 5); - assertEquals(list.get(0) - .get("firstname"), "John"); - assertEquals(list.get(4) - .get("firstname"), "Christian"); + assertEquals(list.get(0).get("firstname"), "John"); + assertEquals(list.get(4).get("firstname"), "Christian"); } @Test @@ -61,10 +59,8 @@ public class DbUtilsUnitTest { List employeeList = runner.query(connection, "SELECT * FROM employee", beanListHandler); assertEquals(employeeList.size(), 5); - assertEquals(employeeList.get(0) - .getFirstName(), "John"); - assertEquals(employeeList.get(4) - .getFirstName(), "Christian"); + assertEquals(employeeList.get(0).getFirstName(), "John"); + assertEquals(employeeList.get(4).getFirstName(), "Christian"); } @Test @@ -85,12 +81,8 @@ public class DbUtilsUnitTest { QueryRunner runner = new QueryRunner(); List employees = runner.query(connection, "SELECT * FROM employee", employeeHandler); - assertEquals(employees.get(0) - .getEmails() - .size(), 2); - assertEquals(employees.get(2) - .getEmails() - .size(), 3); + assertEquals(employees.get(0).getEmails().size(), 2); + assertEquals(employees.get(2).getEmails().size(), 3); assertNotNull(employees.get(0).getEmails().get(0).getEmployeeId()); } diff --git a/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java b/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java index 3c82c30d9b..7481e5a1a3 100644 --- a/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java @@ -25,30 +25,23 @@ import java.nio.charset.Charset; public class CommonsIOUnitTest { @Test - public void whenCopyANDReadFileTesttxt_thenMatchExpectedData() - throws IOException { + public void whenCopyANDReadFileTesttxt_thenMatchExpectedData() throws IOException { String expectedData = "Hello World from fileTest.txt!!!"; - File file = FileUtils.getFile(getClass().getClassLoader() - .getResource("fileTest.txt") - .getPath()); + File file = FileUtils.getFile(getClass().getClassLoader().getResource("fileTest.txt").getPath()); File tempDir = FileUtils.getTempDirectory(); FileUtils.copyFileToDirectory(file, tempDir); File newTempFile = FileUtils.getFile(tempDir, file.getName()); - String data = FileUtils.readFileToString(newTempFile, - Charset.defaultCharset()); + String data = FileUtils.readFileToString(newTempFile, Charset.defaultCharset()); Assert.assertEquals(expectedData, data.trim()); } @Test - public void whenUsingFileNameUtils_thenshowdifferentFileOperations() - throws IOException { + public void whenUsingFileNameUtils_thenshowdifferentFileOperations() throws IOException { - String path = getClass().getClassLoader() - .getResource("fileTest.txt") - .getPath(); + String path = getClass().getClassLoader().getResource("fileTest.txt").getPath(); String fullPath = FilenameUtils.getFullPath(path); String extension = FilenameUtils.getExtension(path); @@ -60,70 +53,54 @@ public class CommonsIOUnitTest { } @Test - public void whenUsingFileSystemUtils_thenDriveFreeSpace() - throws IOException { + public void whenUsingFileSystemUtils_thenDriveFreeSpace() throws IOException { long freeSpace = FileSystemUtils.freeSpaceKb("/"); } @SuppressWarnings("resource") @Test - public void whenUsingTeeInputOutputStream_thenWriteto2OutputStreams() - throws IOException { + public void whenUsingTeeInputOutputStream_thenWriteto2OutputStreams() throws IOException { final String str = "Hello World."; ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream(); - - FilterOutputStream teeOutputStream = new TeeOutputStream(outputStream1,outputStream2); + + FilterOutputStream teeOutputStream = new TeeOutputStream(outputStream1, outputStream2); new TeeInputStream(inputStream, teeOutputStream, true).read(new byte[str.length()]); - + Assert.assertEquals(str, String.valueOf(outputStream1)); Assert.assertEquals(str, String.valueOf(outputStream2)); - } + } @Test - public void whenGetFilewithNameFileFilter_thenFindfileTesttxt() - throws IOException { + public void whenGetFilewithNameFileFilter_thenFindfileTesttxt() throws IOException { final String testFile = "fileTest.txt"; - String path = getClass().getClassLoader() - .getResource(testFile) - .getPath(); + String path = getClass().getClassLoader().getResource(testFile).getPath(); File dir = FileUtils.getFile(FilenameUtils.getFullPath(path)); String[] possibleNames = { "NotThisOne", testFile }; - Assert.assertEquals(testFile, - dir.list(new NameFileFilter(possibleNames, IOCase.INSENSITIVE))[0]); + Assert.assertEquals(testFile, dir.list(new NameFileFilter(possibleNames, IOCase.INSENSITIVE))[0]); } @Test - public void whenGetFilewith_ANDFileFilter_thenFindsampletxt() - throws IOException { + public void whenGetFilewith_ANDFileFilter_thenFindsampletxt() throws IOException { - String path = getClass().getClassLoader() - .getResource("fileTest.txt") - .getPath(); + String path = getClass().getClassLoader().getResource("fileTest.txt").getPath(); File dir = FileUtils.getFile(FilenameUtils.getFullPath(path)); - Assert.assertEquals("sample.txt", - dir.list(new AndFileFilter( - new WildcardFileFilter("*ple*", IOCase.INSENSITIVE), - new SuffixFileFilter("txt")))[0]); + Assert.assertEquals("sample.txt", dir.list(new AndFileFilter(new WildcardFileFilter("*ple*", IOCase.INSENSITIVE), new SuffixFileFilter("txt")))[0]); } @Test - public void whenSortDirWithPathFileComparator_thenFirstFileaaatxt() - throws IOException { + public void whenSortDirWithPathFileComparator_thenFirstFileaaatxt() throws IOException { - PathFileComparator pathFileComparator = new PathFileComparator( - IOCase.INSENSITIVE); - String path = FilenameUtils.getFullPath(getClass().getClassLoader() - .getResource("fileTest.txt") - .getPath()); + PathFileComparator pathFileComparator = new PathFileComparator(IOCase.INSENSITIVE); + String path = FilenameUtils.getFullPath(getClass().getClassLoader().getResource("fileTest.txt").getPath()); File dir = new File(path); File[] files = dir.listFiles(); @@ -133,16 +110,11 @@ public class CommonsIOUnitTest { } @Test - public void whenSizeFileComparator_thenLargerFile() - throws IOException { + public void whenSizeFileComparator_thenLargerFile() throws IOException { SizeFileComparator sizeFileComparator = new SizeFileComparator(); - File largerFile = FileUtils.getFile(getClass().getClassLoader() - .getResource("fileTest.txt") - .getPath()); - File smallerFile = FileUtils.getFile(getClass().getClassLoader() - .getResource("sample.txt") - .getPath()); + File largerFile = FileUtils.getFile(getClass().getClassLoader().getResource("fileTest.txt").getPath()); + File smallerFile = FileUtils.getFile(getClass().getClassLoader().getResource("sample.txt").getPath()); int i = sizeFileComparator.compare(largerFile, smallerFile); diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java index 97db4ddbe4..f34008fb1f 100644 --- a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java @@ -9,71 +9,71 @@ import static org.junit.Assert.assertEquals; public class ArrayUtilsUnitTest { @Test public void givenArray_whenAddingElementAtSpecifiedPosition_thenCorrect() { - int[] oldArray = {2, 3, 4, 5}; + int[] oldArray = { 2, 3, 4, 5 }; int[] newArray = ArrayUtils.add(oldArray, 0, 1); - int[] expectedArray = {1, 2, 3, 4, 5}; + int[] expectedArray = { 1, 2, 3, 4, 5 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenAddingElementAtTheEnd_thenCorrect() { - int[] oldArray = {2, 3, 4, 5}; + int[] oldArray = { 2, 3, 4, 5 }; int[] newArray = ArrayUtils.add(oldArray, 1); - int[] expectedArray = {2, 3, 4, 5, 1}; + int[] expectedArray = { 2, 3, 4, 5, 1 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenAddingAllElementsAtTheEnd_thenCorrect() { - int[] oldArray = {0, 1, 2}; + int[] oldArray = { 0, 1, 2 }; int[] newArray = ArrayUtils.addAll(oldArray, 3, 4, 5); - int[] expectedArray = {0, 1, 2, 3, 4, 5}; + int[] expectedArray = { 0, 1, 2, 3, 4, 5 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingElementAtSpecifiedPosition_thenCorrect() { - int[] oldArray = {1, 2, 3, 4, 5}; + int[] oldArray = { 1, 2, 3, 4, 5 }; int[] newArray = ArrayUtils.remove(oldArray, 1); - int[] expectedArray = {1, 3, 4, 5}; + int[] expectedArray = { 1, 3, 4, 5 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAllElementsAtSpecifiedPositions_thenCorrect() { - int[] oldArray = {1, 2, 3, 4, 5}; + int[] oldArray = { 1, 2, 3, 4, 5 }; int[] newArray = ArrayUtils.removeAll(oldArray, 1, 3); - int[] expectedArray = {1, 3, 5}; + int[] expectedArray = { 1, 3, 5 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAnElement_thenCorrect() { - int[] oldArray = {1, 2, 3, 3, 4}; + int[] oldArray = { 1, 2, 3, 3, 4 }; int[] newArray = ArrayUtils.removeElement(oldArray, 3); - int[] expectedArray = {1, 2, 3, 4}; + int[] expectedArray = { 1, 2, 3, 4 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingElements_thenCorrect() { - int[] oldArray = {1, 2, 3, 3, 4}; + int[] oldArray = { 1, 2, 3, 3, 4 }; int[] newArray = ArrayUtils.removeElements(oldArray, 2, 3, 5); - int[] expectedArray = {1, 3, 4}; + int[] expectedArray = { 1, 3, 4 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAllElementOccurences_thenCorrect() { - int[] oldArray = {1, 2, 2, 2, 3}; + int[] oldArray = { 1, 2, 2, 2, 3 }; int[] newArray = ArrayUtils.removeAllOccurences(oldArray, 2); - int[] expectedArray = {1, 3}; + int[] expectedArray = { 1, 3 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenCheckingExistingElement_thenCorrect() { - int[] array = {1, 3, 5, 7, 9}; + int[] array = { 1, 3, 5, 7, 9 }; boolean evenContained = ArrayUtils.contains(array, 2); boolean oddContained = ArrayUtils.contains(array, 7); assertEquals(false, evenContained); @@ -82,57 +82,57 @@ public class ArrayUtilsUnitTest { @Test public void givenArray_whenReversingElementsWithinARange_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.reverse(originalArray, 1, 4); - int[] expectedArray = {1, 4, 3, 2, 5}; + int[] expectedArray = { 1, 4, 3, 2, 5 }; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenReversingAllElements_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.reverse(originalArray); - int[] expectedArray = {5, 4, 3, 2, 1}; + int[] expectedArray = { 5, 4, 3, 2, 1 }; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenShiftingElementsWithinARange_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.shift(originalArray, 1, 4, 1); - int[] expectedArray = {1, 4, 2, 3, 5}; + int[] expectedArray = { 1, 4, 2, 3, 5 }; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenShiftingAllElements_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.shift(originalArray, 1); - int[] expectedArray = {5, 1, 2, 3, 4}; + int[] expectedArray = { 5, 1, 2, 3, 4 }; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenExtractingElements_thenCorrect() { - int[] oldArray = {1, 2, 3, 4, 5}; + int[] oldArray = { 1, 2, 3, 4, 5 }; int[] newArray = ArrayUtils.subarray(oldArray, 2, 7); - int[] expectedArray = {3, 4, 5}; + int[] expectedArray = { 3, 4, 5 }; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenSwapingElementsWithinARange_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.swap(originalArray, 0, 3, 2); - int[] expectedArray = {4, 5, 3, 1, 2}; + int[] expectedArray = { 4, 5, 3, 1, 2 }; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenSwapingElementsAtSpecifiedPositions_thenCorrect() { - int[] originalArray = {1, 2, 3, 4, 5}; + int[] originalArray = { 1, 2, 3, 4, 5 }; ArrayUtils.swap(originalArray, 0, 3); - int[] expectedArray = {4, 2, 3, 1, 5}; + int[] expectedArray = { 4, 2, 3, 1, 5 }; assertArrayEquals(expectedArray, originalArray); } } diff --git a/libraries/src/test/java/com/baeldung/commons/math/IntegrationTest.java b/libraries/src/test/java/com/baeldung/commons/math/IntegrationTest.java index 65c1a0db8e..7e047577e5 100644 --- a/libraries/src/test/java/com/baeldung/commons/math/IntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/commons/math/IntegrationTest.java @@ -15,7 +15,7 @@ public class IntegrationTest { final double i = integrator.integrate(100, function, 0, 10); - Assert.assertEquals(16 + 2d/3d, i, 1e-7); + Assert.assertEquals(16 + 2d / 3d, i, 1e-7); } } diff --git a/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java b/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java index 278f54a67f..49bf33baa5 100644 --- a/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java @@ -8,9 +8,7 @@ public class LinearAlgebraUnitTest { @Test public void whenDecompositionSolverSolve_thenCorrect() { - RealMatrix a = - new Array2DRowRealMatrix(new double[][] { { 2, 3, -2 }, { -1, 7, 6 }, { 4, -3, -5 } }, - false); + RealMatrix a = new Array2DRowRealMatrix(new double[][] { { 2, 3, -2 }, { -1, 7, 6 }, { 4, -3, -5 } }, false); RealVector b = new ArrayRealVector(new double[] { 1, -2, 1 }, false); DecompositionSolver solver = new LUDecomposition(a).getSolver(); diff --git a/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java index 025880fc12..3069446c3c 100644 --- a/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java @@ -12,10 +12,10 @@ public class StatisticsUnitTest { @Before public void setUp() { - values = new double[] {65, 51 , 16, 11 , 6519, 191 ,0 , 98, 19854, 1, 32}; + values = new double[] { 65, 51, 16, 11, 6519, 191, 0, 98, 19854, 1, 32 }; descriptiveStatistics = new DescriptiveStatistics(); - for(double v : values) { + for (double v : values) { descriptiveStatistics.addValue(v); } } diff --git a/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java b/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java index 8309e755ce..3d3c952863 100644 --- a/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java +++ b/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java @@ -13,42 +13,41 @@ public class CRDTTest { @Test public void givenGrowOnlySet_whenTwoReplicasDiverge_thenShouldMergeItWithoutAConflict() { - //given + // given final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); crdtStore1.connect(crdtStore2); final GSet replica1 = crdtStore1.createGSet("ID_1"); - final GSet replica2 = crdtStore2.findGSet("ID_1").get(); + final GSet replica2 = crdtStore2. findGSet("ID_1").get(); - //when + // when replica1.add("apple"); replica2.add("banana"); - //then + // then assertThat(replica1).contains("apple", "banana"); assertThat(replica2).contains("apple", "banana"); - //when + // when crdtStore1.disconnect(crdtStore2); replica1.add("strawberry"); replica2.add("pear"); - assertThat(replica1).contains("apple", "banana", "strawberry"); assertThat(replica2).contains("apple", "banana", "pear"); crdtStore1.connect(crdtStore2); - //then + // then assertThat(replica1).contains("apple", "banana", "strawberry", "pear"); assertThat(replica2).contains("apple", "banana", "strawberry", "pear"); } @Test public void givenIncrementOnlyCounter_whenTwoReplicasDiverge_thenShouldMergeIt() { - //given + // given final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); crdtStore1.connect(crdtStore2); @@ -56,21 +55,20 @@ public class CRDTTest { final GCounter replica1 = crdtStore1.createGCounter("ID_1"); final GCounter replica2 = crdtStore2.findGCounter("ID_1").get(); - //when + // when replica1.increment(); replica2.increment(2L); - //then + // then assertThat(replica1.get()).isEqualTo(3L); assertThat(replica2.get()).isEqualTo(3L); - //when + // when crdtStore1.disconnect(crdtStore2); replica1.increment(3L); replica2.increment(5L); - assertThat(replica1.get()).isEqualTo(6L); assertThat(replica2.get()).isEqualTo(8L); @@ -91,15 +89,15 @@ public class CRDTTest { final PNCounter replica1 = crdtStore1.createPNCounter("ID_1"); final PNCounter replica2 = crdtStore2.findPNCounter("ID_1").get(); - //when + // when replica1.increment(); replica2.decrement(2L); - //then + // then assertThat(replica1.get()).isEqualTo(-1L); assertThat(replica2.get()).isEqualTo(-1L); - //when + // when crdtStore1.disconnect(crdtStore2); replica1.decrement(3L); @@ -110,22 +108,22 @@ public class CRDTTest { crdtStore1.connect(crdtStore2); - //then + // then assertThat(replica1.get()).isEqualTo(1L); assertThat(replica2.get()).isEqualTo(1L); } @Test public void givenLastWriteWinsStrategy_whenReplicasDiverge_thenAfterMergeShouldKeepOnlyLastValue() { - //given + // given final LocalCrdtStore crdtStore1 = new LocalCrdtStore("N_1"); final LocalCrdtStore crdtStore2 = new LocalCrdtStore("N_2"); crdtStore1.connect(crdtStore2); final LWWRegister replica1 = crdtStore1.createLWWRegister("ID_1"); - final LWWRegister replica2 = crdtStore2.findLWWRegister("ID_1").get(); + final LWWRegister replica2 = crdtStore2. findLWWRegister("ID_1").get(); - //when + // when replica1.set("apple"); replica2.set("banana"); @@ -133,20 +131,18 @@ public class CRDTTest { assertThat(replica1.get()).isEqualTo("banana"); assertThat(replica2.get()).isEqualTo("banana"); - // when crdtStore1.disconnect(crdtStore2); replica1.set("strawberry"); replica2.set("pear"); - assertThat(replica1.get()).isEqualTo("strawberry"); assertThat(replica2.get()).isEqualTo("pear"); crdtStore1.connect(crdtStore2); - //then + // then assertThat(replica1.get()).isEqualTo("pear"); assertThat(replica2.get()).isEqualTo("pear"); } diff --git a/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 14d3f925f5..545009a2a9 100644 --- a/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java +++ b/libraries/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -5,7 +5,6 @@ import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Duration; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.Locale; diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java b/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java index 68775fac66..936fd3e839 100644 --- a/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java +++ b/libraries/src/test/java/com/baeldung/distinct/DistinctWithJavaFunctionUnitTest.java @@ -19,25 +19,19 @@ public class DistinctWithJavaFunctionUnitTest { @Test public void whenFilterListByName_thenSizeShouldBe4() { - List personListFiltered = personList.stream() - .filter(distinctByKey(p -> p.getName())) - .collect(Collectors.toList()); + List personListFiltered = personList.stream().filter(distinctByKey(p -> p.getName())).collect(Collectors.toList()); assertTrue(personListFiltered.size() == 4); } @Test public void whenFilterListByAge_thenSizeShouldBe2() { - List personListFiltered = personList.stream() - .filter(distinctByKey(p -> p.getAge())) - .collect(Collectors.toList()); + List personListFiltered = personList.stream().filter(distinctByKey(p -> p.getAge())).collect(Collectors.toList()); assertTrue(personListFiltered.size() == 2); } @Test public void whenFilterListWithDefaultDistinct_thenSizeShouldBe5() { - List personListFiltered = personList.stream() - .distinct() - .collect(Collectors.toList()); + List personListFiltered = personList.stream().distinct().collect(Collectors.toList()); assertTrue(personListFiltered.size() == 5); } diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java b/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java index f50c76a486..c06a5d7e8b 100644 --- a/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java +++ b/libraries/src/test/java/com/baeldung/distinct/DistinctWithStreamexUnitTest.java @@ -19,17 +19,13 @@ public class DistinctWithStreamexUnitTest { @Test public void whenFilterListByName_thenSizeShouldBe4() { - List personListFiltered = StreamEx.of(personList) - .distinct(Person::getName) - .toList(); + List personListFiltered = StreamEx.of(personList).distinct(Person::getName).toList(); assertTrue(personListFiltered.size() == 4); } @Test public void whenFilterListByAge_thenSizeShouldBe2() { - List personListFiltered = StreamEx.of(personList) - .distinct(Person::getAge) - .toList(); + List personListFiltered = StreamEx.of(personList).distinct(Person::getAge).toList(); assertTrue(personListFiltered.size() == 2); } diff --git a/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java b/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java index b4025cd313..24593273a1 100644 --- a/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java +++ b/libraries/src/test/java/com/baeldung/distinct/DistinctWithVavrUnitTest.java @@ -17,17 +17,13 @@ public class DistinctWithVavrUnitTest { @Test public void whenFilterListByName_thenSizeShouldBe4() { - List personListFiltered = io.vavr.collection.List.ofAll(personList) - .distinctBy(Person::getName) - .toJavaList(); + List personListFiltered = io.vavr.collection.List.ofAll(personList).distinctBy(Person::getName).toJavaList(); assertTrue(personListFiltered.size() == 4); } @Test public void whenFilterListByAge_thenSizeShouldBe2() { - List personListFiltered = io.vavr.collection.List.ofAll(personList) - .distinctBy(Person::getAge) - .toJavaList(); + List personListFiltered = io.vavr.collection.List.ofAll(personList).distinctBy(Person::getAge).toJavaList(); assertTrue(personListFiltered.size() == 2); } diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java b/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java new file mode 100644 index 0000000000..e6f0fd1c31 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/dockerapi/ContainerLiveTest.java @@ -0,0 +1,123 @@ +package com.baeldung.dockerapi; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Container; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.core.DockerClientBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; + +public class ContainerLiveTest { + + private static DockerClient dockerClient; + + @BeforeClass + public static void setup() { + dockerClient = DockerClientBuilder.getInstance().build(); + } + + @Test + public void whenListingRunningContainers_thenReturnNonEmptyList() { + + // when + List containers = dockerClient.listContainersCmd().exec(); + + // then + assertThat(containers.size(), is(not(0))); + } + + @Test + public void whenListingExitedContainers_thenReturnNonEmptyList() { + + // when + List containers = dockerClient.listContainersCmd().withShowSize(true).withShowAll(true).withStatusFilter("exited").exec(); + + // then + assertThat(containers.size(), is(not(0))); + } + + @Test + public void whenCreatingContainer_thenMustReturnContainerId() { + + // when + CreateContainerResponse container = dockerClient.createContainerCmd("mongo:3.6").withCmd("--bind_ip_all").withName("mongo").withHostName("baeldung").withEnv("MONGO_LATEST_VERSION=3.6").withPortBindings(PortBinding.parse("9999:27017")).exec(); + + // then + assertThat(container.getId(), is(not(null))); + } + + @Test + public void whenHavingContainer_thenRunContainer() throws InterruptedException { + + // when + CreateContainerResponse container = dockerClient.createContainerCmd("alpine:3.6").withCmd("sleep", "10000").exec(); + + Thread.sleep(3000); + // then + dockerClient.startContainerCmd(container.getId()).exec(); + + dockerClient.stopContainerCmd(container.getId()).exec(); + } + + @Test + public void whenRunningContainer_thenStopContainer() throws InterruptedException { + + // when + CreateContainerResponse container = dockerClient.createContainerCmd("alpine:3.6").withCmd("sleep", "10000").exec(); + + Thread.sleep(3000); + dockerClient.startContainerCmd(container.getId()).exec(); + + // then + dockerClient.stopContainerCmd(container.getId()).exec(); + } + + @Test + public void whenRunningContainer_thenKillContainer() throws InterruptedException { + + // when + CreateContainerResponse container = dockerClient.createContainerCmd("alpine:3.6").withCmd("sleep", "10000").exec(); + + dockerClient.startContainerCmd(container.getId()).exec(); + + Thread.sleep(3000); + dockerClient.stopContainerCmd(container.getId()).exec(); + + // then + dockerClient.killContainerCmd(container.getId()).exec(); + } + + @Test + public void whenHavingContainer_thenInspectContainer() { + + // when + CreateContainerResponse container = dockerClient.createContainerCmd("alpine:3.6").withCmd("sleep", "10000").exec(); + + // then + InspectContainerResponse containerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); + + assertThat(containerResponse.getId(), is(container.getId())); + } + + @Test + public void givenContainer_whenCommittingContainer_thenMustReturnImageId() { + + // given + CreateContainerResponse container = dockerClient.createContainerCmd("alpine:3.6").withCmd("sleep", "10000").exec(); + + // when + String imageId = dockerClient.commitCmd(container.getId()).withEnv("SNAPSHOT_YEAR=2018").withMessage("add git support").withCmd("sleep", "10000").withRepository("alpine").withTag("3.6.v2").exec(); + + // then + assertThat(imageId, is(not(null))); + } + +} diff --git a/libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java b/libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java new file mode 100644 index 0000000000..bedcc66c53 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/dockerapi/DockerClientLiveTest.java @@ -0,0 +1,68 @@ +package com.baeldung.dockerapi; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientBuilder; +import org.junit.Test; + +import java.util.Properties; + +import static org.junit.Assert.assertNotNull; + +public class DockerClientLiveTest { + + @Test + public void whenCreatingDockerClient_thenReturnDefaultInstance() { + + // when + DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder(); + DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); + + // then + assertNotNull(dockerClient); + } + + @Test + public void whenCreatingDockerClientWithDockerHost_thenReturnInstance() { + // when + DockerClient dockerClient = DockerClientBuilder.getInstance("tcp://docker.bealdung.com:2375").build(); + + // then + assertNotNull(dockerClient); + } + + @Test + public void whenCreatingAdvanceDockerClient_thenReturnInstance() { + + // when + DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().withRegistryEmail("info@bealdung.com").withRegistryUrl("register.bealdung.io/v2/").withRegistryPassword("strongpassword").withRegistryUsername("bealdung") + .withDockerCertPath("/home/bealdung/public/.docker/certs").withDockerConfig("/home/bealdung/public/.docker/").withDockerTlsVerify("1").withDockerHost("tcp://docker.beauldung.com:2376").build(); + + DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); + + // then + assertNotNull(dockerClient); + } + + @Test + public void whenCreatingDockerClientWithProperties_thenReturnInstance() { + + // when + Properties properties = new Properties(); + properties.setProperty("registry.email", "info@bealdung.com"); + properties.setProperty("registry.url", "register.bealdung.io/v2/"); + properties.setProperty("registry.password", "strongpassword"); + properties.setProperty("registry.username", "bealdung"); + properties.setProperty("DOCKER_CERT_PATH", "/home/bealdung/public/.docker/certs"); + properties.setProperty("DOCKER_CONFIG", "/home/bealdung/public/.docker/"); + properties.setProperty("DOCKER_TLS_VERIFY", "1"); + properties.setProperty("DOCKER_HOST", "tcp://docker.bealdung.com:2376"); + + DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder().withProperties(properties).build(); + + DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); + + // then + assertNotNull(dockerClient); + } +} diff --git a/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java b/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java new file mode 100644 index 0000000000..7e8cd6a354 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/dockerapi/ImageLiveTest.java @@ -0,0 +1,140 @@ +package com.baeldung.dockerapi; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.api.model.Image; +import com.github.dockerjava.api.model.SearchItem; +import com.github.dockerjava.core.DockerClientBuilder; +import com.github.dockerjava.core.command.BuildImageResultCallback; +import com.github.dockerjava.core.command.PullImageResultCallback; +import com.github.dockerjava.core.command.PushImageResultCallback; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; + +public class ImageLiveTest { + + private static DockerClient dockerClient; + + @BeforeClass + public static void setup() { + dockerClient = DockerClientBuilder.getInstance().build(); + } + + @Test + public void whenListingImages_thenReturnNonEmptyList() { + + // when + List images = dockerClient.listImagesCmd().exec(); + + // then + assertThat(images.size(), is(not(0))); + } + + @Test + public void whenListingImagesWithIntermediateImages_thenReturnNonEmptyList() { + + // when + List images = dockerClient.listImagesCmd().withShowAll(true).exec(); + + // then + assertThat(images.size(), is(not(0))); + } + + @Test + public void whenListingDanglingImages_thenReturnNonNullList() { + + // when + List images = dockerClient.listImagesCmd().withDanglingFilter(true).exec(); + + // then + assertThat(images, is(not(null))); + } + + @Test + public void whenBuildingImage_thenMustReturnImageId() { + + // when + String imageId = dockerClient.buildImageCmd().withDockerfile(new File("src/test/resources/dockerapi/Dockerfile")).withPull(true).withNoCache(true).withTag("alpine:git").exec(new BuildImageResultCallback()).awaitImageId(); + + // then + assertThat(imageId, is(not(null))); + } + + @Test + public void givenListOfImages_whenInspectImage_thenMustReturnObject() { + + // given + List images = dockerClient.listImagesCmd().exec(); + Image image = images.get(0); + + // when + InspectImageResponse imageResponse = dockerClient.inspectImageCmd(image.getId()).exec(); + + // then + assertThat(imageResponse.getId(), is(image.getId())); + } + + @Test + public void givenListOfImages_whenTagImage_thenListMustIncrement() { + + // given + List images = dockerClient.listImagesCmd().exec(); + Image image = images.get(0); + + // when + dockerClient.tagImageCmd(image.getId(), "baeldung/alpine", "3.6.v2").exec(); + + // then + List imagesNow = dockerClient.listImagesCmd().exec(); + assertThat(imagesNow.size(), is(greaterThan(images.size()))); + } + + public void pushingAnImage() throws InterruptedException { + + dockerClient.pushImageCmd("baeldung/alpine").withTag("3.6.v2").exec(new PushImageResultCallback()).awaitCompletion(90, TimeUnit.SECONDS); + } + + @Test + public void whenPullingImage_thenImageListNotEmpty() throws InterruptedException { + + // when + dockerClient.pullImageCmd("alpine").withTag("latest").exec(new PullImageResultCallback()).awaitCompletion(30, TimeUnit.SECONDS); + + // then + List images = dockerClient.listImagesCmd().exec(); + assertThat(images.size(), is(not(0))); + } + + @Test + public void whenRemovingImage_thenImageListDecrease() { + + // when + List images = dockerClient.listImagesCmd().exec(); + Image image = images.get(0); + dockerClient.removeImageCmd(image.getId()).exec(); + + // then + List imagesNow = dockerClient.listImagesCmd().exec(); + assertThat(imagesNow.size(), is(lessThan(images.size()))); + } + + @Test + public void whenSearchingImage_thenMustReturn25Items() { + + // when + List items = dockerClient.searchImagesCmd("Java").exec(); + + // then + assertThat(items.size(), is(25)); + } +} diff --git a/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java b/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java new file mode 100644 index 0000000000..d3abbe2e7e --- /dev/null +++ b/libraries/src/test/java/com/baeldung/dockerapi/NetworkLiveTest.java @@ -0,0 +1,80 @@ +package com.baeldung.dockerapi; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateNetworkResponse; +import com.github.dockerjava.api.model.Network; +import com.github.dockerjava.api.model.Network.Ipam; +import com.github.dockerjava.core.DockerClientBuilder; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; + +public class NetworkLiveTest { + + private static DockerClient dockerClient; + + @BeforeClass + public static void setup() { + dockerClient = DockerClientBuilder.getInstance().build(); + } + + @Test + @Ignore("temporarily") + public void whenListingNetworks_thenSizeMustBeGreaterThanZero() { + + // when + List networks = dockerClient.listNetworksCmd().exec(); + + // then + assertThat(networks.size(), is(greaterThan(0))); + } + + @Test + public void whenCreatingNetwork_thenRetrieveResponse() { + + // when + CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd().withName("baeldungDefault").withDriver("bridge").exec(); + + // then + assertThat(networkResponse, is(not(null))); + } + + @Test + public void whenCreatingAdvanceNetwork_thenRetrieveResponse() { + + // when + CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd().withName("baeldungAdvanced").withIpam(new Ipam().withConfig(new Ipam.Config().withSubnet("172.36.0.0/16").withIpRange("172.36.5.0/24"))).withDriver("bridge").exec(); + + // then + assertThat(networkResponse, is(not(null))); + } + + @Test + public void whenInspectingNetwork_thenSizeMustBeGreaterThanZero() { + + // when + String networkName = "bridge"; + Network network = dockerClient.inspectNetworkCmd().withNetworkId(networkName).exec(); + + // then + assertThat(network.getName(), is(networkName)); + } + + @Test + public void whenCreatingNetwork_thenRemove() throws InterruptedException { + + // when + CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd().withName("baeldungDefault").withDriver("bridge").exec(); + + // then + Thread.sleep(4000); + dockerClient.removeNetworkCmd(networkResponse.getId()).exec(); + } +} diff --git a/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java b/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java new file mode 100644 index 0000000000..9e60a76b33 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/dockerapi/VolumeLiveTest.java @@ -0,0 +1,83 @@ +package com.baeldung.dockerapi; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateVolumeResponse; +import com.github.dockerjava.api.command.InspectVolumeResponse; +import com.github.dockerjava.api.command.ListVolumesResponse; +import com.github.dockerjava.core.DockerClientBuilder; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; + +public class VolumeLiveTest { + + private static DockerClient dockerClient; + + @BeforeClass + public static void setup() { + dockerClient = DockerClientBuilder.getInstance().build(); + } + + @Test + public void whenListingVolumes_thenSizeMustBeGreaterThanZero() { + + // when + ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd().exec(); + + // then + List volumes = volumesResponse.getVolumes(); + assertThat(volumes.size(), is(greaterThan(0))); + } + + @Test + public void givenVolumes_whenInspectingVolume_thenReturnNonNullResponse() { + + // given + ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd().exec(); + List volumes = volumesResponse.getVolumes(); + InspectVolumeResponse volume = volumes.get(0); + + // when + InspectVolumeResponse volumeResponse = dockerClient.inspectVolumeCmd(volume.getName()).exec(); + + // then + assertThat(volumeResponse, is(not(null))); + } + + @Test + public void whenCreatingUnnamedVolume_thenGetVolumeId() { + + // when + CreateVolumeResponse unnamedVolume = dockerClient.createVolumeCmd().exec(); + + // then + assertThat(unnamedVolume.getName(), is(not(null))); + } + + @Test + public void whenCreatingNamedVolume_thenGetVolumeId() { + + // when + CreateVolumeResponse namedVolume = dockerClient.createVolumeCmd().withName("myNamedVolume").exec(); + + // then + assertThat(namedVolume.getName(), is(not(null))); + } + + @Test + public void whenGettingNamedVolume_thenRemove() throws InterruptedException { + + // when + CreateVolumeResponse namedVolume = dockerClient.createVolumeCmd().withName("anotherNamedVolume").exec(); + + // then + Thread.sleep(4000); + dockerClient.removeVolumeCmd(namedVolume.getName()).exec(); + } +} diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java index ee384c2f9d..b1aaceb09b 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/CollectPatternTest.java @@ -17,7 +17,6 @@ public class CollectPatternTest { MutableList lastNames = students.collect(Student::getLastName); - Assertions.assertThat(lastNames) - .containsExactly("Hopkins", "Adams"); + Assertions.assertThat(lastNames).containsExactly("Hopkins", "Adams"); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java index 4655431872..e279314034 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ConvertContainerToAnotherTest.java @@ -12,7 +12,6 @@ public class ConvertContainerToAnotherTest { public void whenConvertContainerToAnother_thenCorrect() { MutableList cars = (MutableList) ConvertContainerToAnother.convertToList(); - Assertions.assertThat(cars) - .containsExactlyElementsOf(FastList.newListWith("Volkswagen", "Toyota", "Mercedes")); + Assertions.assertThat(cars).containsExactlyElementsOf(FastList.newListWith("Volkswagen", "Toyota", "Mercedes")); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java index c5b5e1c412..4ef7348a0d 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/DetectPatternTest.java @@ -20,7 +20,6 @@ public class DetectPatternTest { public void whenDetect_thenCorrect() { Integer result = list.detect(Predicates.greaterThan(30)); - Assertions.assertThat(result) - .isEqualTo(41); + Assertions.assertThat(result).isEqualTo(41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java index 021c72e91e..3091f90908 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/FlatCollectTest.java @@ -44,7 +44,6 @@ public class FlatCollectTest { public void whenFlatCollect_thenCorrect() { MutableList addresses = students.flatCollect(Student::getAddresses); - Assertions.assertThat(addresses) - .containsExactlyElementsOf(this.expectedAddresses); + Assertions.assertThat(addresses).containsExactlyElementsOf(this.expectedAddresses); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java index bcd34021b1..01a8fcaef4 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/InjectIntoPatternTest.java @@ -17,7 +17,7 @@ public class InjectIntoPatternTest { Integer v = list.get(i); result = result + v.intValue(); } - + assertEquals(15, result); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java index 9c216ecc87..bcb816c34a 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/LazyIterationTest.java @@ -18,7 +18,6 @@ public class LazyIterationTest { LazyIterable lazyStudents = students.asLazy(); LazyIterable lastNames = lazyStudents.collect(Student::getLastName); - Assertions.assertThat(lastNames) - .containsAll(Lists.mutable.with("Hopkins", "Adams", "Rodriguez")); + Assertions.assertThat(lastNames).containsAll(Lists.mutable.with("Hopkins", "Adams", "Rodriguez")); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java index c055413cd9..8ef18004aa 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/PartitionPatternTest.java @@ -31,14 +31,10 @@ public class PartitionPatternTest { return each > 30; } }); - MutableList greaterThanThirty = partitionedFolks.getSelected() - .sortThis(); - MutableList smallerThanThirty = partitionedFolks.getRejected() - .sortThis(); + MutableList greaterThanThirty = partitionedFolks.getSelected().sortThis(); + MutableList smallerThanThirty = partitionedFolks.getRejected().sortThis(); - Assertions.assertThat(smallerThanThirty) - .containsExactly(1, 5, 8, 17, 23); - Assertions.assertThat(greaterThanThirty) - .containsExactly(31, 38, 41); + Assertions.assertThat(smallerThanThirty).containsExactly(1, 5, 8, 17, 23); + Assertions.assertThat(greaterThanThirty).containsExactly(31, 38, 41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java index 1666c86333..bd743d56e8 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/RejectPatternTest.java @@ -20,10 +20,8 @@ public class RejectPatternTest { @Test public void whenReject_thenCorrect() { - MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30)) - .sortThis(); + MutableList notGreaterThanThirty = list.reject(Predicates.greaterThan(30)).sortThis(); - Assertions.assertThat(notGreaterThanThirty) - .containsExactlyElementsOf(this.expectedList); + Assertions.assertThat(notGreaterThanThirty).containsExactlyElementsOf(this.expectedList); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java index d79c864fc5..154be08f08 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/SelectPatternTest.java @@ -18,17 +18,14 @@ public class SelectPatternTest { @Test public void givenListwhenSelect_thenCorrect() { - MutableList greaterThanThirty = list.select(Predicates.greaterThan(30)) - .sortThis(); + MutableList greaterThanThirty = list.select(Predicates.greaterThan(30)).sortThis(); - Assertions.assertThat(greaterThanThirty) - .containsExactly(31, 38, 41); + Assertions.assertThat(greaterThanThirty).containsExactly(31, 38, 41); } @SuppressWarnings("rawtypes") public MutableList selectUsingLambda() { - return list.select(each -> each > 30) - .sortThis(); + return list.select(each -> each > 30).sortThis(); } @SuppressWarnings("unchecked") @@ -36,7 +33,6 @@ public class SelectPatternTest { public void givenListwhenSelectUsingLambda_thenCorrect() { MutableList greaterThanThirty = selectUsingLambda(); - Assertions.assertThat(greaterThanThirty) - .containsExactly(31, 38, 41); + Assertions.assertThat(greaterThanThirty).containsExactly(31, 38, 41); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java index 29f0c23954..2b5aa06289 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipTest.java @@ -28,7 +28,6 @@ public class ZipTest { MutableList cars = Lists.mutable.with("Porsche", "Volvo", "Toyota"); MutableList> pairs = numbers.zip(cars); - Assertions.assertThat(pairs) - .containsExactlyElementsOf(this.expectedPairs); + Assertions.assertThat(pairs).containsExactlyElementsOf(this.expectedPairs); } } diff --git a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java index a2d8be44ec..724f693011 100644 --- a/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java +++ b/libraries/src/test/java/com/baeldung/eclipsecollections/ZipWithIndexTest.java @@ -27,7 +27,6 @@ public class ZipWithIndexTest { MutableList cars = FastList.newListWith("Porsche", "Volvo", "Toyota"); MutableList> pairs = cars.zipWithIndex(); - Assertions.assertThat(pairs) - .containsExactlyElementsOf(this.expectedPairs); + Assertions.assertThat(pairs).containsExactlyElementsOf(this.expectedPairs); } } diff --git a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaTest.java b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaTest.java index 04ab6e43be..33952c8669 100644 --- a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaTest.java +++ b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaTest.java @@ -12,49 +12,49 @@ import fj.function.Characters; import fj.function.Integers; public class FunctionalJavaTest { - - public static final F isEven = i -> i % 2 == 0; - + + public static final F isEven = i -> i % 2 == 0; + @Test public void calculateEvenNumbers_givenIntList_returnTrue() { - List fList = List.list(3, 4, 5, 6); + List fList = List.list(3, 4, 5, 6); List evenList = fList.map(isEven); List evenListTrueResult = List.list(false, true, false, true); List evenListFalseResult = List.list(true, false, false, true); assertEquals(evenList.equals(evenListTrueResult), true); assertEquals(evenList.equals(evenListFalseResult), false); } - + @Test public void mapList_givenIntList_returnResult() { - List fList = List.list(3, 4, 5, 6); - fList = fList.map(i -> i + 100); - List resultList = List.list(103, 104, 105, 106); - List falseResultList = List.list(15, 504, 105, 106); - assertEquals(fList.equals(resultList), true); - assertEquals(fList.equals(falseResultList), false); + List fList = List.list(3, 4, 5, 6); + fList = fList.map(i -> i + 100); + List resultList = List.list(103, 104, 105, 106); + List falseResultList = List.list(15, 504, 105, 106); + assertEquals(fList.equals(resultList), true); + assertEquals(fList.equals(falseResultList), false); } - + @Test public void filterList_givenIntList_returnResult() { - Array array = Array.array(3, 4, 5, 6); - Array filteredArray = array.filter(Integers.even); - Array result = Array.array(4, 6); - Array wrongResult = Array.array(3, 5); - assertEquals(filteredArray.equals(result), true); - assertEquals(filteredArray.equals(wrongResult), false); + Array array = Array.array(3, 4, 5, 6); + Array filteredArray = array.filter(Integers.even); + Array result = Array.array(4, 6); + Array wrongResult = Array.array(3, 5); + assertEquals(filteredArray.equals(result), true); + assertEquals(filteredArray.equals(wrongResult), false); } - + @Test public void checkForLowerCase_givenStringArray_returnResult() { - Array array = Array.array("Welcome", "To", "baeldung"); - Array array2 = Array.array("Welcome", "To", "Baeldung"); + Array array = Array.array("Welcome", "To", "baeldung"); + Array array2 = Array.array("Welcome", "To", "Baeldung"); Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); Boolean isExist2 = array2.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); assertEquals(isExist, true); assertEquals(isExist2, false); } - + @Test public void checkOptions_givenOptions_returnResult() { Option n1 = Option.some(1); @@ -64,16 +64,16 @@ public class FunctionalJavaTest { Option result1 = n1.bind(f1); Option result2 = n2.bind(f1); - + assertEquals(result1, Option.none()); assertEquals(result2, Option.some(102)); } - + @Test public void foldLeft_givenArray_returnResult() { Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27); int sum = intArray.foldLeft(Integers.add, 0); assertEquals(sum, 260); } - + } diff --git a/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java b/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java index f864c5f017..5c788e86d6 100644 --- a/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java @@ -20,51 +20,45 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; - public class WordCountIntegrationTest { private final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); @Test public void givenDataSet_whenExecuteWordCount_thenReturnWordCount() throws Exception { - //given + // given List lines = Arrays.asList("This is a first sentence", "This is a second sentence with a one word"); - //when + // when DataSet> result = WordCount.startWordCount(env, lines); - //then + // then List> collect = result.collect(); - assertThat(collect).containsExactlyInAnyOrder( - new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), - new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), - new Tuple2<>("first", 1), new Tuple2<>("with", 1), new Tuple2<>("one", 1)); + assertThat(collect).containsExactlyInAnyOrder(new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), new Tuple2<>("first", 1), new Tuple2<>("with", 1), + new Tuple2<>("one", 1)); } @Test public void givenListOfAmounts_whenUseMapReduce_thenSumAmountsThatAreOnlyAboveThreshold() throws Exception { - //given + // given DataSet amounts = env.fromElements(1, 29, 40, 50); int threshold = 30; - //when - List collect = amounts - .filter(a -> a > threshold) - .reduce((integer, t1) -> integer + t1) - .collect(); + // when + List collect = amounts.filter(a -> a > threshold).reduce((integer, t1) -> integer + t1).collect(); - //then + // then assertThat(collect.get(0)).isEqualTo(90); } @Test public void givenDataSetOfComplexObjects_whenMapToGetOneField_thenReturnedListHaveProperElements() throws Exception { - //given + // given DataSet personDataSource = env.fromCollection(Arrays.asList(new Person(23, "Tom"), new Person(75, "Michael"))); - //when + // when List ages = personDataSource.map(p -> p.age).collect(); - //then + // then assertThat(ages).hasSize(2); assertThat(ages).contains(23, 75); @@ -72,44 +66,33 @@ public class WordCountIntegrationTest { @Test public void givenDataSet_whenSortItByOneField_thenShouldReturnSortedDataSet() throws Exception { - //given + // given Tuple2 secondPerson = new Tuple2<>(4, "Tom"); Tuple2 thirdPerson = new Tuple2<>(5, "Scott"); Tuple2 fourthPerson = new Tuple2<>(200, "Michael"); Tuple2 firstPerson = new Tuple2<>(1, "Jack"); - DataSet> transactions = env.fromElements(fourthPerson, secondPerson, - thirdPerson, firstPerson); + DataSet> transactions = env.fromElements(fourthPerson, secondPerson, thirdPerson, firstPerson); + // when + List> sorted = transactions.sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING).collect(); - //when - List> sorted = transactions - .sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING) - .collect(); - - //then + // then assertThat(sorted).containsExactly(firstPerson, secondPerson, thirdPerson, fourthPerson); } - @Test public void giveTwoDataSets_whenJoinUsingId_thenProduceJoinedData() throws Exception { - //given + // given Tuple3 address = new Tuple3<>(1, "5th Avenue", "London"); DataSet> addresses = env.fromElements(address); Tuple2 firstTransaction = new Tuple2<>(1, "Transaction_1"); - DataSet> transactions = - env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); + DataSet> transactions = env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); + // when + List, Tuple3>> joined = transactions.join(addresses).where(new IdKeySelectorTransaction()).equalTo(new IdKeySelectorAddress()).collect(); - //when - List, Tuple3>> joined = - transactions.join(addresses) - .where(new IdKeySelectorTransaction()) - .equalTo(new IdKeySelectorAddress()) - .collect(); - - //then + // then assertThat(joined).hasSize(1); assertThat(joined).contains(new Tuple2<>(firstTransaction, address)); @@ -117,48 +100,40 @@ public class WordCountIntegrationTest { @Test public void givenStreamOfEvents_whenProcessEvents_thenShouldPrintResultsOnSinkOperation() throws Exception { - //given + // given final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - DataStream text - = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); - + DataStream text = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); SingleOutputStreamOperator upperCase = text.map(String::toUpperCase); upperCase.print(); - //when + // when env.execute(); } - @Test public void givenStreamOfEvents_whenProcessEvents_thenShouldApplyWindowingOnTransformation() throws Exception { - //given + // given final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - SingleOutputStreamOperator> windowed = env.fromElements( - new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), - new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond()) - ).assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(20)) { - @Override - public long extractTimestamp(Tuple2 element) { - return element.f1 * 1000; - } - }); + SingleOutputStreamOperator> windowed = env.fromElements(new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond())) + .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(20)) { + @Override + public long extractTimestamp(Tuple2 element) { + return element.f1 * 1000; + } + }); - SingleOutputStreamOperator> reduced = windowed - .windowAll(TumblingEventTimeWindows.of(Time.seconds(5))) - .maxBy(0, true); + SingleOutputStreamOperator> reduced = windowed.windowAll(TumblingEventTimeWindows.of(Time.seconds(5))).maxBy(0, true); reduced.print(); - //when + // when env.execute(); } - private static class IdKeySelectorTransaction implements KeySelector, Integer> { @Override public Integer getKey(Tuple2 value) { diff --git a/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java new file mode 100644 index 0000000000..ba1861937b --- /dev/null +++ b/libraries/src/test/java/com/baeldung/google/sheets/GoogleSheetsIntegrationTest.java @@ -0,0 +1,96 @@ +package com.baeldung.google.sheets; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.api.services.sheets.v4.Sheets; +import com.google.api.services.sheets.v4.model.AppendValuesResponse; +import com.google.api.services.sheets.v4.model.BatchGetValuesResponse; +import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesRequest; +import com.google.api.services.sheets.v4.model.BatchUpdateValuesResponse; +import com.google.api.services.sheets.v4.model.CopyPasteRequest; +import com.google.api.services.sheets.v4.model.GridRange; +import com.google.api.services.sheets.v4.model.Request; +import com.google.api.services.sheets.v4.model.Spreadsheet; +import com.google.api.services.sheets.v4.model.SpreadsheetProperties; +import com.google.api.services.sheets.v4.model.UpdateSpreadsheetPropertiesRequest; +import com.google.api.services.sheets.v4.model.UpdateValuesResponse; +import com.google.api.services.sheets.v4.model.ValueRange; + +import static org.assertj.core.api.Assertions.*; + +public class GoogleSheetsIntegrationTest { + + private static Sheets sheetsService; + + // this id can be replaced with your spreadsheet id + // otherwise be advised that multiple people may run this test and update the public spreadsheet + private static final String SPREADSHEET_ID = "1sILuxZUnyl_7-MlNThjt765oWshN3Xs-PPLfqYe4DhI"; + + @BeforeClass + public static void setup() throws GeneralSecurityException, IOException { + sheetsService = SheetsServiceUtil.getSheetsService(); + } + + @Test + public void whenWriteSheet_thenReadSheetOk() throws IOException { + ValueRange body = new ValueRange().setValues(Arrays.asList(Arrays.asList("Expenses January"), Arrays.asList("books", "30"), Arrays.asList("pens", "10"), Arrays.asList("Expenses February"), Arrays.asList("clothes", "20"), Arrays.asList("shoes", "5"))); + UpdateValuesResponse result = sheetsService.spreadsheets().values().update(SPREADSHEET_ID, "A1", body).setValueInputOption("RAW").execute(); + + List data = new ArrayList<>(); + data.add(new ValueRange().setRange("D1").setValues(Arrays.asList(Arrays.asList("January Total", "=B2+B3")))); + data.add(new ValueRange().setRange("D4").setValues(Arrays.asList(Arrays.asList("February Total", "=B5+B6")))); + + BatchUpdateValuesRequest batchBody = new BatchUpdateValuesRequest().setValueInputOption("USER_ENTERED").setData(data); + BatchUpdateValuesResponse batchResult = sheetsService.spreadsheets().values().batchUpdate(SPREADSHEET_ID, batchBody).execute(); + + List ranges = Arrays.asList("E1", "E4"); + BatchGetValuesResponse readResult = sheetsService.spreadsheets().values().batchGet(SPREADSHEET_ID).setRanges(ranges).execute(); + + ValueRange januaryTotal = readResult.getValueRanges().get(0); + assertThat(januaryTotal.getValues().get(0).get(0)).isEqualTo("40"); + + ValueRange febTotal = readResult.getValueRanges().get(1); + assertThat(febTotal.getValues().get(0).get(0)).isEqualTo("25"); + + ValueRange appendBody = new ValueRange().setValues(Arrays.asList(Arrays.asList("Total", "=E1+E4"))); + AppendValuesResponse appendResult = sheetsService.spreadsheets().values().append(SPREADSHEET_ID, "A1", appendBody).setValueInputOption("USER_ENTERED").setInsertDataOption("INSERT_ROWS").setIncludeValuesInResponse(true).execute(); + + ValueRange total = appendResult.getUpdates().getUpdatedData(); + assertThat(total.getValues().get(0).get(1)).isEqualTo("65"); + } + + @Test + public void whenUpdateSpreadSheetTitle_thenOk() throws IOException { + + UpdateSpreadsheetPropertiesRequest updateRequest = new UpdateSpreadsheetPropertiesRequest().setFields("*").setProperties(new SpreadsheetProperties().setTitle("Expenses")); + + CopyPasteRequest copyRequest = new CopyPasteRequest().setSource(new GridRange().setSheetId(0).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)) + .setDestination(new GridRange().setSheetId(1).setStartColumnIndex(0).setEndColumnIndex(2).setStartRowIndex(0).setEndRowIndex(1)).setPasteType("PASTE_VALUES"); + + List requests = new ArrayList<>(); + + requests.add(new Request().setCopyPaste(copyRequest)); + requests.add(new Request().setUpdateSpreadsheetProperties(updateRequest)); + + BatchUpdateSpreadsheetRequest body = new BatchUpdateSpreadsheetRequest().setRequests(requests); + + sheetsService.spreadsheets().batchUpdate(SPREADSHEET_ID, body).execute(); + } + + @Test + public void whenCreateSpreadSheet_thenIdOk() throws IOException { + Spreadsheet spreadSheet = new Spreadsheet().setProperties(new SpreadsheetProperties().setTitle("My Spreadsheet")); + Spreadsheet result = sheetsService.spreadsheets().create(spreadSheet).execute(); + + assertThat(result.getSpreadsheetId()).isNotNull(); + } + +} diff --git a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java b/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java index 5ecd4442d8..f762096811 100644 --- a/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java +++ b/libraries/src/test/java/com/baeldung/hll/HLLLongRunningUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.hll; - import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; import net.agkn.hll.HLL; @@ -15,47 +14,44 @@ public class HLLLongRunningUnitTest { @Test public void givenHLL_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinality() { - //given + // given long numberOfElements = 100_000_000; long toleratedDifference = 1_000_000; HashFunction hashFunction = Hashing.murmur3_128(); HLL hll = new HLL(14, 5); - //when + // when LongStream.range(0, numberOfElements).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - hll.addRaw(hashedValue); - } - ); + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + hll.addRaw(hashedValue); + }); - //then + // then long cardinality = hll.cardinality(); assertThat(cardinality).isCloseTo(numberOfElements, Offset.offset(toleratedDifference)); } @Test public void givenTwoHLLs_whenAddHugeAmountOfNumbers_thenShouldReturnEstimatedCardinalityForUnionOfHLLs() { - //given + // given long numberOfElements = 100_000_000; long toleratedDifference = 1_000_000; HashFunction hashFunction = Hashing.murmur3_128(); HLL firstHll = new HLL(15, 5); HLL secondHLL = new HLL(15, 5); - //when + // when LongStream.range(0, numberOfElements).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - firstHll.addRaw(hashedValue); - } - ); + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + firstHll.addRaw(hashedValue); + }); LongStream.range(numberOfElements, numberOfElements * 2).forEach(element -> { - long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); - secondHLL.addRaw(hashedValue); - } - ); + long hashedValue = hashFunction.newHasher().putLong(element).hash().asLong(); + secondHLL.addRaw(hashedValue); + }); - //then + // then firstHll.union(secondHLL); long cardinality = firstHll.cardinality(); assertThat(cardinality).isCloseTo(numberOfElements * 2, Offset.offset(toleratedDifference * 2)); diff --git a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java index 167aef5ec6..09d31eac21 100644 --- a/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/hoverfly/HoverflyApiIntegrationTest.java @@ -33,38 +33,21 @@ import io.specto.hoverfly.junit.rule.HoverflyRule; public class HoverflyApiIntegrationTest { - private static final SimulationSource source = dsl( - service("http://www.baeldung.com") - .get("/api/courses/1") - .willReturn(success().body( - jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))) - - .post("/api/courses") - .willReturn(success()) - - .andDelay(3, TimeUnit.SECONDS) - .forMethod("POST"), - - service(matches("www.*dung.com")) - .get(startsWith("/api/student")) - .queryParam("page", any()) - .willReturn(success()) - - .post(equalsTo("/api/student")) - .body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}"))) - .willReturn(success()) - - .put("/api/student/1") - .body(matchesJsonPath("$.name")) - .willReturn(success()) - - .post("/api/student") - .body(equalsToXml("2John")) - .willReturn(success()) - - .put("/api/student/2") - .body(matchesXPath("/student/name")) - .willReturn(success())); + private static final SimulationSource source = dsl(service("http://www.baeldung.com").get("/api/courses/1").willReturn(success().body(jsonWithSingleQuotes("{'id':'1','name':'HCI'}"))) + + .post("/api/courses").willReturn(success()) + + .andDelay(3, TimeUnit.SECONDS).forMethod("POST"), + + service(matches("www.*dung.com")).get(startsWith("/api/student")).queryParam("page", any()).willReturn(success()) + + .post(equalsTo("/api/student")).body(equalsToJson(jsonWithSingleQuotes("{'id':'1','name':'Joe'}"))).willReturn(success()) + + .put("/api/student/1").body(matchesJsonPath("$.name")).willReturn(success()) + + .post("/api/student").body(equalsToXml("2John")).willReturn(success()) + + .put("/api/student/2").body(matchesXPath("/student/name")).willReturn(success())); @ClassRule public static final HoverflyRule rule = HoverflyRule.inSimulationMode(source); @@ -72,19 +55,17 @@ public class HoverflyApiIntegrationTest { @Test public void givenGetCourseById_whenRequestSimulated_thenAPICalledSuccessfully() throws URISyntaxException { - final ResponseEntity courseResponse = restTemplate.getForEntity( - "http://www.baeldung.com/api/courses/1", String.class); - + final ResponseEntity courseResponse = restTemplate.getForEntity("http://www.baeldung.com/api/courses/1", String.class); + assertEquals(HttpStatus.OK, courseResponse.getStatusCode()); assertEquals("{\"id\":\"1\",\"name\":\"HCI\"}", courseResponse.getBody()); } - + @Test public void givenPostCourse_whenDelayInRequest_thenResponseIsDelayed() throws URISyntaxException { StopWatch stopWatch = new StopWatch(); stopWatch.start(); - final ResponseEntity postResponse = restTemplate.postForEntity( - "http://www.baeldung.com/api/courses", null, Void.class); + final ResponseEntity postResponse = restTemplate.postForEntity("http://www.baeldung.com/api/courses", null, Void.class); stopWatch.stop(); long postTime = stopWatch.getTime(); @@ -94,45 +75,36 @@ public class HoverflyApiIntegrationTest { @Test public void givenGetStudent_whenRequestMatcher_thenAPICalledSuccessfully() throws URISyntaxException { - final ResponseEntity courseResponse = restTemplate.getForEntity( - "http://www.baeldung.com/api/student?page=3", Void.class); - + final ResponseEntity courseResponse = restTemplate.getForEntity("http://www.baeldung.com/api/student?page=3", Void.class); + assertEquals(HttpStatus.OK, courseResponse.getStatusCode()); } - + @Test public void givenPostStudent_whenBodyRequestMatcherJson_thenResponseContainsEqualJson() throws URISyntaxException { - final ResponseEntity postResponse = restTemplate.postForEntity( - "http://www.baeldung.com/api/student", "{\"id\":\"1\",\"name\":\"Joe\"}", Void.class); + final ResponseEntity postResponse = restTemplate.postForEntity("http://www.baeldung.com/api/student", "{\"id\":\"1\",\"name\":\"Joe\"}", Void.class); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); } - + @Test public void givenPutStudent_whenJsonPathMatcher_thenRequestJsonContainsElementInPath() throws URISyntaxException { - RequestEntity putRequest = RequestEntity - .put(new URI("http://www.baeldung.com/api/student/1")) - .body("{\"id\":\"1\",\"name\":\"Trevor\"}"); + RequestEntity putRequest = RequestEntity.put(new URI("http://www.baeldung.com/api/student/1")).body("{\"id\":\"1\",\"name\":\"Trevor\"}"); ResponseEntity putResponse = restTemplate.exchange(putRequest, String.class); assertEquals(HttpStatus.OK, putResponse.getStatusCode()); } - + @Test public void givenPostStudent_whenBodyRequestMatcherXml_thenResponseContainsEqualXml() throws URISyntaxException { - final ResponseEntity postResponse = restTemplate.postForEntity( - "http://www.baeldung.com/api/student", "2John", Void.class); + final ResponseEntity postResponse = restTemplate.postForEntity("http://www.baeldung.com/api/student", "2John", Void.class); assertEquals(HttpStatus.OK, postResponse.getStatusCode()); } - - + @Test public void givenPutStudent_whenXPathMatcher_thenRequestXmlContainsElementInXPath() throws URISyntaxException { - RequestEntity putRequest = RequestEntity - .put(new URI("http://www.baeldung.com/api/student/2")) - .body("" - + "2Monica"); + RequestEntity putRequest = RequestEntity.put(new URI("http://www.baeldung.com/api/student/2")).body("" + "2Monica"); ResponseEntity putResponse = restTemplate.exchange(putRequest, String.class); assertEquals(HttpStatus.OK, putResponse.getStatusCode()); diff --git a/libraries/src/test/java/com/baeldung/infinispan/ConfigurationTest.java b/libraries/src/test/java/com/baeldung/infinispan/ConfigurationTest.java new file mode 100644 index 0000000000..9210b18f0c --- /dev/null +++ b/libraries/src/test/java/com/baeldung/infinispan/ConfigurationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.infinispan; + +import com.baeldung.infinispan.listener.CacheListener; +import com.baeldung.infinispan.repository.HelloWorldRepository; +import com.baeldung.infinispan.service.HelloWorldService; +import com.baeldung.infinispan.service.TransactionalService; +import org.infinispan.Cache; +import org.infinispan.manager.DefaultCacheManager; +import org.junit.After; +import org.junit.Before; + +import java.util.function.Supplier; + +public class ConfigurationTest { + + private DefaultCacheManager cacheManager; + + private HelloWorldRepository repository = new HelloWorldRepository(); + + protected HelloWorldService helloWorldService; + protected TransactionalService transactionalService; + + @Before + public void setup() { + CacheConfiguration configuration = new CacheConfiguration(); + CacheListener listener = new CacheListener(); + + cacheManager = configuration.cacheManager(); + + Cache transactionalCache = configuration.transactionalCache(cacheManager, listener); + + Cache simpleHelloWorldCache = configuration.simpleHelloWorldCache(cacheManager, listener); + + Cache expiringHelloWorldCache = configuration.expiringHelloWorldCache(cacheManager, listener); + + Cache evictingHelloWorldCache = configuration.evictingHelloWorldCache(cacheManager, listener); + + Cache passivatingHelloWorldCache = configuration.passivatingHelloWorldCache(cacheManager, listener); + + this.helloWorldService = new HelloWorldService(repository, listener, simpleHelloWorldCache, expiringHelloWorldCache, evictingHelloWorldCache, passivatingHelloWorldCache); + + this.transactionalService = new TransactionalService(transactionalCache); + } + + @After + public void tearDown() { + cacheManager.stop(); + } + + protected long timeThis(Supplier supplier) { + long millis = System.currentTimeMillis(); + supplier.get(); + return System.currentTimeMillis() - millis; + } +} diff --git a/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java b/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java new file mode 100644 index 0000000000..0a2ace9ca0 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/infinispan/service/HelloWorldServiceIntegrationTest.java @@ -0,0 +1,51 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.ConfigurationTest; +import org.junit.Test; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class HelloWorldServiceIntegrationTest extends ConfigurationTest { + + @Test + public void whenGetIsCalledTwoTimes_thenTheSecondShouldHitTheCache() { + assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findSimpleHelloWorld())).isLessThan(100); + } + + @Test + public void whenGetIsCalledTwoTimesQuickly_thenTheSecondShouldHitTheCache() { + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isLessThan(100); + } + + @Test + public void whenGetIsCalledTwoTimesSparsely_thenNeitherShouldHitTheCache() throws InterruptedException { + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + + Thread.sleep(1100); + + assertThat(timeThis(() -> helloWorldService.findExpiringHelloWorld())).isGreaterThanOrEqualTo(1000); + } + + @Test + public void givenOneEntryIsConfigured_whenTwoAreAdded_thenFirstShouldntBeAvailable() { + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findEvictingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + } + + @Test + public void givenOneEntryIsConfigured_whenTwoAreAdded_thenTheFirstShouldBeAvailable() { + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 2"))).isGreaterThanOrEqualTo(1000); + + assertThat(timeThis(() -> helloWorldService.findPassivatingHelloWorld("key 1"))).isLessThan(100); + } + +} diff --git a/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java b/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java new file mode 100644 index 0000000000..ace99eef36 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/infinispan/service/TransactionalServiceIntegrationTest.java @@ -0,0 +1,21 @@ +package com.baeldung.infinispan.service; + +import com.baeldung.infinispan.ConfigurationTest; +import org.junit.Test; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class TransactionalServiceIntegrationTest extends ConfigurationTest { + + @Test + public void whenLockingAnEntry_thenItShouldBeInaccessible() throws InterruptedException { + Runnable backGroundJob = () -> transactionalService.startBackgroundBatch(); + Thread backgroundThread = new Thread(backGroundJob); + transactionalService.getQuickHowManyVisits(); + backgroundThread.start(); + Thread.sleep(100); // lets wait our thread warm up + + assertThat(timeThis(() -> transactionalService.getQuickHowManyVisits())).isGreaterThan(500).isLessThan(1000); + } + +} diff --git a/libraries/src/test/java/com/baeldung/jasypt/JasyptUnitTest.java b/libraries/src/test/java/com/baeldung/jasypt/JasyptUnitTest.java index 5e65c585aa..d67c2a5cb2 100644 --- a/libraries/src/test/java/com/baeldung/jasypt/JasyptUnitTest.java +++ b/libraries/src/test/java/com/baeldung/jasypt/JasyptUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.jasypt; - import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.util.password.BasicPasswordEncryptor; @@ -17,16 +16,16 @@ public class JasyptUnitTest { @Test public void givenTextPrivateData_whenDecrypt_thenCompareToEncrypted() { - //given + // given BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); String privateData = "secret-data"; textEncryptor.setPasswordCharArray("some-random-data".toCharArray()); - //when + // when String myEncryptedText = textEncryptor.encrypt(privateData); - assertNotSame(privateData, myEncryptedText); //myEncryptedText can be save in db + assertNotSame(privateData, myEncryptedText); // myEncryptedText can be save in db - //then + // then String plainText = textEncryptor.decrypt(myEncryptedText); assertEquals(plainText, privateData); } @@ -37,10 +36,10 @@ public class JasyptUnitTest { BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor(); String encryptedPassword = passwordEncryptor.encryptPassword(password); - //when + // when boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword); - //then + // then assertTrue(result); } @@ -50,28 +49,27 @@ public class JasyptUnitTest { BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor(); String encryptedPassword = passwordEncryptor.encryptPassword(password); - //when + // when boolean result = passwordEncryptor.checkPassword("secret-pass-not-same", encryptedPassword); - //then + // then assertFalse(result); } - @Test @Ignore("should have installed local_policy.jar") public void givenTextPrivateData_whenDecrypt_thenCompareToEncryptedWithCustomAlgorithm() { - //given + // given StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); String privateData = "secret-data"; encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); - //when + // when String encryptedText = encryptor.encrypt("secret-pass"); assertNotSame(privateData, encryptedText); - //then + // then String plainText = encryptor.decrypt(encryptedText); assertEquals(plainText, privateData); } @@ -79,18 +77,18 @@ public class JasyptUnitTest { @Test @Ignore("should have installed local_policy.jar") public void givenTextPrivateData_whenDecryptOnHighPerformance_thenDecrypt() { - //given + // given String privateData = "secret-data"; PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setPoolSize(4); encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); - //when + // when String encryptedText = encryptor.encrypt(privateData); assertNotSame(privateData, encryptedText); - //then + // then String plainText = encryptor.decrypt(encryptedText); assertEquals(plainText, privateData); } diff --git a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java b/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java index 1cd390b873..53d9d11bbb 100644 --- a/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java +++ b/libraries/src/test/java/com/baeldung/java/io/JavaDirectoryDeleteUnitTest.java @@ -110,10 +110,7 @@ public class JavaDirectoryDeleteUnitTest { public void givenDirectory_whenDeletedWithFilesWalk_thenIsGone() throws IOException { Path pathToBeDeleted = TEMP_DIRECTORY.resolve(DIRECTORY_NAME); - Files.walk(pathToBeDeleted) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); + Files.walk(pathToBeDeleted).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); assertFalse("Directory still exists", Files.exists(pathToBeDeleted)); } diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java b/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java index 30c034aa5e..2dae2adc51 100644 --- a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.javassist; - import javassist.CannotCompileException; import javassist.ClassPool; import javassist.NotFoundException; @@ -33,20 +32,20 @@ import static org.junit.Assert.assertTrue; public class JavasisstUnitTest { @Test public void givenJavasisstAPI_whenConstructClass_thenGenerateAClassFile() throws CannotCompileException, IOException, ClassNotFoundException, IllegalAccessException, InstantiationException { - //given + // given String classNameWithPackage = "com.baeldung.JavassistGeneratedClass"; ClassFile cf = new ClassFile(false, classNameWithPackage, null); - cf.setInterfaces(new String[]{"java.lang.Cloneable"}); + cf.setInterfaces(new String[] { "java.lang.Cloneable" }); FieldInfo f = new FieldInfo(cf.getConstPool(), "id", "I"); f.setAccessFlags(AccessFlag.PUBLIC); cf.addField(f); - //when + // when String className = "JavassistGeneratedClass.class"; cf.write(new DataOutputStream(new FileOutputStream(className))); - //then + // then ClassPool classPool = ClassPool.getDefault(); Field[] fields = classPool.makeClass(cf).toClass().getFields(); assertEquals(fields[0].getName(), "id"); @@ -57,14 +56,14 @@ public class JavasisstUnitTest { @Test public void givenJavaClass_whenLoadAtByJavassist_thenTraversWholeClass() throws NotFoundException, CannotCompileException, BadBytecode { - //given + // given ClassPool cp = ClassPool.getDefault(); ClassFile cf = cp.get("com.baeldung.javasisst.Point").getClassFile(); MethodInfo minfo = cf.getMethod("move"); CodeAttribute ca = minfo.getCodeAttribute(); CodeIterator ci = ca.iterator(); - //when + // when List operations = new LinkedList<>(); while (ci.hasNext()) { int index = ci.next(); @@ -72,23 +71,21 @@ public class JavasisstUnitTest { operations.add(Mnemonic.OPCODE[op]); } - //then - assertEquals(operations, - Arrays.asList("aload_0", "iload_1", "putfield", "aload_0", "iload_2", "putfield", "return")); + // then + assertEquals(operations, Arrays.asList("aload_0", "iload_1", "putfield", "aload_0", "iload_2", "putfield", "return")); } @Test public void givenTableOfInstructions_whenAddNewInstruction_thenShouldConstructProperSequence() throws NotFoundException, BadBytecode, CannotCompileException, IllegalAccessException, InstantiationException { - //given + // given ClassFile cf = ClassPool.getDefault().get("com.baeldung.javasisst.ThreeDimensionalPoint").getClassFile(); - //when + // when FieldInfo f = new FieldInfo(cf.getConstPool(), "id", "I"); f.setAccessFlags(AccessFlag.PUBLIC); cf.addField(f); - ClassPool classPool = ClassPool.getDefault(); Field[] fields = classPool.makeClass(cf).toClass().getFields(); List fieldsList = Stream.of(fields).map(Field::getName).collect(Collectors.toList()); @@ -98,19 +95,19 @@ public class JavasisstUnitTest { @Test public void givenLoadedClass_whenAddConstructorToClass_shouldCreateClassWithConstructor() throws NotFoundException, CannotCompileException, BadBytecode { - //given + // given ClassFile cf = ClassPool.getDefault().get("com.baeldung.javasisst.Point").getClassFile(); Bytecode code = new Bytecode(cf.getConstPool()); code.addAload(0); code.addInvokespecial("java/lang/Object", MethodInfo.nameInit, "()V"); code.addReturn(null); - //when + // when MethodInfo minfo = new MethodInfo(cf.getConstPool(), MethodInfo.nameInit, "()V"); minfo.setCodeAttribute(code.toCodeAttribute()); cf.addMethod(minfo); - //then + // then CodeIterator ci = code.toCodeAttribute().iterator(); List operations = new LinkedList<>(); while (ci.hasNext()) { @@ -119,9 +116,7 @@ public class JavasisstUnitTest { operations.add(Mnemonic.OPCODE[op]); } - assertEquals(operations, - Arrays.asList("aload_0", "invokespecial", "return")); - + assertEquals(operations, Arrays.asList("aload_0", "invokespecial", "return")); } } diff --git a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java index a341d5957a..73dfbae3b2 100644 --- a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java @@ -26,7 +26,7 @@ public class JavaTuplesUnitTest { Pair pairFromList = Pair.fromIterable(collectionOfNames, 2); - String[] names = new String[]{"john", "doe", "anne"}; + String[] names = new String[] { "john", "doe", "anne" }; Triplet triplet2 = Triplet.fromArray(names); } diff --git a/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java b/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java index 3cdb833953..a8a7df659b 100644 --- a/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.javers; - import org.javers.common.collections.Lists; import org.javers.core.Javers; import org.javers.core.JaversBuilder; @@ -21,16 +20,16 @@ public class JaversUnitTest { @Test public void givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange() { - //given + // given Javers javers = JaversBuilder.javers().build(); Person person = new Person(1, "Michael Program"); Person personAfterModification = new Person(1, "Michael Java"); - //when + // when Diff diff = javers.compare(person, personAfterModification); - //then + // then ValueChange change = diff.getChangesByType(ValueChange.class).get(0); assertThat(diff.getChanges()).hasSize(1); @@ -39,22 +38,20 @@ public class JaversUnitTest { assertThat(change.getRight()).isEqualTo("Michael Java"); } - @Test public void givenListOfPersons_whenCompare_ThenShouldDetectChanges() { - //given + // given Javers javers = JaversBuilder.javers().build(); Person personThatWillBeRemoved = new Person(2, "Thomas Link"); List oldList = Lists.asList(new Person(1, "Michael Program"), personThatWillBeRemoved); List newList = Lists.asList(new Person(1, "Michael Not Program")); - //when + // when Diff diff = javers.compareCollections(oldList, newList, Person.class); - //then + // then assertThat(diff.getChanges()).hasSize(3); - ValueChange valueChange = diff.getChangesByType(ValueChange.class).get(0); assertThat(valueChange.getPropertyName()).isEqualTo("name"); assertThat(valueChange.getLeft()).isEqualTo("Michael Program"); @@ -70,43 +67,36 @@ public class JaversUnitTest { @Test public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange() { - //given + // given Javers javers = JaversBuilder.javers().build(); - PersonWithAddress person = - new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); + PersonWithAddress person = new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); - PersonWithAddress personWithNewAddress = - new PersonWithAddress(1, "Tom", - Arrays.asList(new Address("England"), new Address("USA"))); + PersonWithAddress personWithNewAddress = new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"), new Address("USA"))); - - //when + // when Diff diff = javers.compare(person, personWithNewAddress); List objectsByChangeType = diff.getObjectsByChangeType(NewObject.class); - //then + // then assertThat(objectsByChangeType).hasSize(1); assertThat(objectsByChangeType.get(0).equals(new Address("USA"))); } @Test public void givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange() { - //given + // given Javers javers = JaversBuilder.javers().build(); - PersonWithAddress person = - new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); + PersonWithAddress person = new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); - PersonWithAddress personWithNewAddress = - new PersonWithAddress(1, "Tom", Collections.emptyList()); + PersonWithAddress personWithNewAddress = new PersonWithAddress(1, "Tom", Collections.emptyList()); - - //when + // when Diff diff = javers.compare(person, personWithNewAddress); List objectsByChangeType = diff.getObjectsByChangeType(ObjectRemoved.class); - //then + // then assertThat(objectsByChangeType).hasSize(1); assertThat(objectsByChangeType.get(0).equals(new Address("England"))); } diff --git a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java index da4f51674f..a4747785cd 100644 --- a/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/CacheLoaderTest.java @@ -23,15 +23,13 @@ public class CacheLoaderTest { public void setup() { CachingProvider cachingProvider = Caching.getCachingProvider(); CacheManager cacheManager = cachingProvider.getCacheManager(); - MutableConfiguration config = new MutableConfiguration().setReadThrough(true) - .setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(new SimpleCacheLoader())); + MutableConfiguration config = new MutableConfiguration().setReadThrough(true).setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(new SimpleCacheLoader())); this.cache = cacheManager.createCache("SimpleCache", config); } @After public void tearDown() { - Caching.getCachingProvider() - .getCacheManager().destroyCache(CACHE_NAME); + Caching.getCachingProvider().getCacheManager().destroyCache(CACHE_NAME); } @Test diff --git a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java similarity index 89% rename from libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java rename to libraries/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java index eb40e63ef0..61c98d0126 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EntryProcessorTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java @@ -12,7 +12,7 @@ import javax.cache.spi.CachingProvider; import static org.junit.Assert.assertEquals; -public class EntryProcessorTest { +public class EntryProcessorIntegrationTest { private static final String CACHE_NAME = "MyCache"; @@ -29,8 +29,7 @@ public class EntryProcessorTest { @After public void tearDown() { - Caching.getCachingProvider() - .getCacheManager().destroyCache(CACHE_NAME); + Caching.getCachingProvider().getCacheManager().destroyCache(CACHE_NAME); } @Test diff --git a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java index be83e572d8..e32e4ad3cc 100644 --- a/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/EventListenerTest.java @@ -33,14 +33,12 @@ public class EventListenerTest { @After public void tearDown() { - Caching.getCachingProvider() - .getCacheManager().destroyCache(CACHE_NAME); + Caching.getCachingProvider().getCacheManager().destroyCache(CACHE_NAME); } @Test public void whenRunEvent_thenCorrect() throws InterruptedException { - this.listenerConfiguration = new MutableCacheEntryListenerConfiguration<>(FactoryBuilder - .factoryOf(this.listener), null, false, true); + this.listenerConfiguration = new MutableCacheEntryListenerConfiguration<>(FactoryBuilder.factoryOf(this.listener), null, false, true); this.cache.registerCacheEntryListener(this.listenerConfiguration); assertEquals(false, this.listener.getCreated()); diff --git a/libraries/src/test/java/com/baeldung/jcache/JCacheTest.java b/libraries/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java similarity index 95% rename from libraries/src/test/java/com/baeldung/jcache/JCacheTest.java rename to libraries/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java index c98539a9ec..fac3d32bcb 100644 --- a/libraries/src/test/java/com/baeldung/jcache/JCacheTest.java +++ b/libraries/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java @@ -10,7 +10,7 @@ import javax.cache.spi.CachingProvider; import static org.junit.Assert.assertEquals; -public class JCacheTest { +public class JCacheIntegrationTest { @Test public void instantiateCache() { diff --git a/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java b/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java index e916a229f7..03e63c2580 100644 --- a/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java @@ -106,5 +106,4 @@ public class GuideToJDOIntegrationTest { } } - } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java b/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java index 28d4f57e77..b47d3a2e19 100644 --- a/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java @@ -1,14 +1,11 @@ package com.baeldung.jetty; - import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.After; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -32,26 +29,26 @@ public class JettyIntegrationTest { @Test public void givenServer_whenSendRequestToBlockingServlet_thenReturnStatusOK() throws Exception { - //given + // given String url = "http://localhost:8090/status"; HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); - //then + // then assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); } @Test public void givenServer_whenSendRequestToNonBlockingServlet_thenReturnStatusOK() throws Exception { - //when + // when String url = "http://localhost:8090/heavy/async"; HttpClient client = HttpClientBuilder.create().build(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); - //then + // then assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); String responseContent = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8); assertThat(responseContent).isEqualTo("This is some heavy resource that will be served in an async way"); diff --git a/libraries/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java b/libraries/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java new file mode 100644 index 0000000000..75b86e46b2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jetty/JettyServerFactoryUnitTest.java @@ -0,0 +1,86 @@ +package com.baeldung.jetty; + +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.eclipse.jetty.server.Server; +import org.junit.Assert; +import org.junit.Test; + +/** + * Test for {@link JettyServerFactory}. + * + * @author Donato Rimenti + * + */ +public class JettyServerFactoryUnitTest { + + /** + * Tests that when a base server is provided a request returns a status 404. + * + * @throws Exception + */ + @Test + public void givenBaseServer_whenHttpRequest_thenStatus404() throws Exception { + Server server = JettyServerFactory.createBaseServer(); + server.start(); + + int statusCode = sendGetRequest(); + + Assert.assertEquals(404, statusCode); + server.stop(); + } + + /** + * Tests that when a web app server is provided a request returns a status + * 200. + * + * @throws Exception + */ + @Test + public void givenWebAppServer_whenHttpRequest_thenStatus200() throws Exception { + Server server = JettyServerFactory.createWebAppServer(); + server.start(); + + int statusCode = sendGetRequest(); + + Assert.assertEquals(200, statusCode); + server.stop(); + } + + /** + * Tests that when a multi handler server is provided a request returns a + * status 200. + * + * @throws Exception + */ + @Test + public void givenMultiHandlerServerServer_whenHttpRequest_thenStatus200() throws Exception { + Server server = JettyServerFactory.createMultiHandlerServer(); + server.start(); + + int statusCode = sendGetRequest(); + + Assert.assertEquals(200, statusCode); + server.stop(); + } + + /** + * Sends a default HTTP GET request to the server and returns the response + * status code. + * + * @return the status code of the response + * @throws Exception + */ + private int sendGetRequest() throws Exception { + HttpHost target = new HttpHost("localhost", JettyServerFactory.SERVER_PORT); + HttpRequest request = new HttpGet(JettyServerFactory.APP_PATH); + HttpClient client = HttpClientBuilder.create().build(); + HttpResponse response = client.execute(target, request); + return response.getStatusLine().getStatusCode(); + } + +} diff --git a/libraries/src/test/java/com/baeldung/jool/JOOLTest.java b/libraries/src/test/java/com/baeldung/jool/JOOLTest.java index ba20e153fd..2cb393abd3 100644 --- a/libraries/src/test/java/com/baeldung/jool/JOOLTest.java +++ b/libraries/src/test/java/com/baeldung/jool/JOOLTest.java @@ -28,86 +28,53 @@ public class JOOLTest { assertEquals(concat, Arrays.asList(1, 2, 3, 4, 5, 6)); - assertTrue(Seq.of(1, 2, 3, 4).contains(2)); - assertTrue(Seq.of(1, 2, 3, 4).containsAll(2, 3)); - assertTrue(Seq.of(1, 2, 3, 4).containsAny(2, 5)); } @Test public void givenStreams_whenJoin_shouldHaveElementsFromTwoStreams() { - //given + // given Stream left = Stream.of(1, 2, 4); Stream right = Stream.of(1, 2, 3); - //when + // when List rightCollected = right.collect(Collectors.toList()); List collect = left.filter(rightCollected::contains).collect(Collectors.toList()); - //then + // then assertEquals(collect, Arrays.asList(1, 2)); } @Test public void givenSeq_whenJoin_shouldHaveElementsFromBothSeq() { - assertEquals( - Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), Objects::equals).toList(), - Arrays.asList(tuple(1, 1), tuple(2, 2)) - ); + assertEquals(Seq.of(1, 2, 4).innerJoin(Seq.of(1, 2, 3), Objects::equals).toList(), Arrays.asList(tuple(1, 1), tuple(2, 2))); + assertEquals(Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(), Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(4, null))); - assertEquals( - Seq.of(1, 2, 4).leftOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(), - Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(4, null)) - ); + assertEquals(Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(), Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3))); - assertEquals( - Seq.of(1, 2, 4).rightOuterJoin(Seq.of(1, 2, 3), Objects::equals).toList(), - Arrays.asList(tuple(1, 1), tuple(2, 2), tuple(null, 3)) - ); - - assertEquals( - Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(), - Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B")) - ); + assertEquals(Seq.of(1, 2).crossJoin(Seq.of("A", "B")).toList(), Arrays.asList(tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B"))); } @Test public void givenSeq_whenManipulateSeq_seqShouldHaveNewElementsInIt() { - assertEquals( - Seq.of(1, 2, 3).cycle().limit(9).toList(), - Arrays.asList(1, 2, 3, 1, 2, 3, 1, 2, 3) - ); + assertEquals(Seq.of(1, 2, 3).cycle().limit(9).toList(), Arrays.asList(1, 2, 3, 1, 2, 3, 1, 2, 3)); - assertEquals( - Seq.of(1, 2, 3).duplicate().map((first, second) -> tuple(first.toList(), second.toList())), - tuple(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3)) - ); + assertEquals(Seq.of(1, 2, 3).duplicate().map((first, second) -> tuple(first.toList(), second.toList())), tuple(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3))); - assertEquals( - Seq.of(1, 2, 3, 4).intersperse(0).toList(), - Arrays.asList(1, 0, 2, 0, 3, 0, 4) - ); + assertEquals(Seq.of(1, 2, 3, 4).intersperse(0).toList(), Arrays.asList(1, 0, 2, 0, 3, 0, 4)); - assertEquals( - Seq.of(1, 2, 3, 4, 5).shuffle().toList().size(), - 5 - ); + assertEquals(Seq.of(1, 2, 3, 4, 5).shuffle().toList().size(), 5); - assertEquals( - Seq.of(1, 2, 3, 4).partition(i -> i > 2).map((first, second) -> tuple(first.toList(), second.toList())), - tuple(Arrays.asList(3, 4), Arrays.asList(1, 2)) + assertEquals(Seq.of(1, 2, 3, 4).partition(i -> i > 2).map((first, second) -> tuple(first.toList(), second.toList())), tuple(Arrays.asList(3, 4), Arrays.asList(1, 2)) ); - assertEquals( - Seq.of(1, 2, 3, 4).reverse().toList(), - Arrays.asList(4, 3, 2, 1) - ); + assertEquals(Seq.of(1, 2, 3, 4).reverse().toList(), Arrays.asList(4, 3, 2, 1)); } @Test @@ -117,66 +84,38 @@ public class JOOLTest { expectedAfterGroupBy.put(1, Arrays.asList(1, 3)); expectedAfterGroupBy.put(0, Arrays.asList(2, 4)); - assertEquals( - Seq.of(1, 2, 3, 4).groupBy(i -> i % 2), - expectedAfterGroupBy - ); + assertEquals(Seq.of(1, 2, 3, 4).groupBy(i -> i % 2), expectedAfterGroupBy); + assertEquals(Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t), "!abc"); - assertEquals( - Seq.of("a", "b", "c").foldLeft("!", (u, t) -> u + t), - "!abc" - ); - - - assertEquals( - Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u), - "abc!" - ); + assertEquals(Seq.of("a", "b", "c").foldRight("!", (t, u) -> t + u), "abc!"); } @Test public void givenSeq_whenUsingSeqWhile_shouldBehaveAsWhileLoop() { - assertEquals( - Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3).toList(), - Arrays.asList(3, 4, 5) - ); + assertEquals(Seq.of(1, 2, 3, 4, 5).skipWhile(i -> i < 3).toList(), Arrays.asList(3, 4, 5)); - assertEquals( - Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3).toList(), - Arrays.asList(3, 4, 5) - ); + assertEquals(Seq.of(1, 2, 3, 4, 5).skipUntil(i -> i == 3).toList(), Arrays.asList(3, 4, 5)); } @Test public void givenSeq_whenZip_shouldHaveZippedSeq() { - assertEquals( - Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c")).toList(), - Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c")) - ); + assertEquals(Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c")).toList(), Arrays.asList(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))); - assertEquals( - Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(), - Arrays.asList("1:a", "2:b", "3:c") - ); + assertEquals(Seq.of(1, 2, 3).zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y).toList(), Arrays.asList("1:a", "2:b", "3:c")); - - assertEquals( - Seq.of("a", "b", "c").zipWithIndex().toList(), - Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L)) - ); + assertEquals(Seq.of("a", "b", "c").zipWithIndex().toList(), Arrays.asList(tuple("a", 0L), tuple("b", 1L), tuple("c", 2L))); } - public Integer methodThatThrowsChecked(String arg) throws Exception { return arg.length(); } @Test public void givenOperationThatThrowsCheckedException_whenExecuteAndNeedToWrapCheckedIntoUnchecked_shouldPass() { - //when + // when List collect = Stream.of("a", "b", "c").map(elem -> { try { return methodThatThrowsChecked(elem); @@ -186,55 +125,43 @@ public class JOOLTest { } }).collect(Collectors.toList()); - //then - assertEquals( - collect, - Arrays.asList(1, 1, 1) - ); + // then + assertEquals(collect, Arrays.asList(1, 1, 1)); } - @Test public void givenOperationThatThrowsCheckedException_whenExecuteUsingUncheckedFuction_shouldPass() { - //when - List collect = Stream.of("a", "b", "c") - .map(Unchecked.function(this::methodThatThrowsChecked)) - .collect(Collectors.toList()); + // when + List collect = Stream.of("a", "b", "c").map(Unchecked.function(this::methodThatThrowsChecked)).collect(Collectors.toList()); - //then - assertEquals( - collect, - Arrays.asList(1, 1, 1) - ); + // then + assertEquals(collect, Arrays.asList(1, 1, 1)); } @Test public void givenFunction_whenAppliedPartially_shouldAddNumberToPartialArgument() { - //given + // given Function2 addTwoNumbers = (v1, v2) -> v1 + v2; addTwoNumbers.toBiFunction(); Function1 addToTwo = addTwoNumbers.applyPartially(2); - //when + // when Integer result = addToTwo.apply(5); - //then + // then assertEquals(result, (Integer) 7); } @Test public void givenSeqOfTuples_whenTransformToLowerNumberOfTuples_shouldHaveProperResult() { - //given + // given Seq> personDetails = Seq.of(tuple("michael", "similar", 49), tuple("jodie", "variable", 43)); Tuple2 tuple = tuple("winter", "summer"); - //when + // when List> result = personDetails.map(t -> t.limit2().concat(tuple)).toList(); - //then - assertEquals( - result, - Arrays.asList(tuple("michael", "similar", "winter", "summer"), tuple("jodie", "variable", "winter", "summer")) - ); + // then + assertEquals(result, Arrays.asList(tuple("michael", "similar", "winter", "summer"), tuple("jodie", "variable", "winter", "summer"))); } } diff --git a/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java index bdbc101b15..ce9638c4af 100644 --- a/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java +++ b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.jsonassert; - import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; @@ -62,10 +61,8 @@ public class JsonAssertUnitTest { @Test public void givenNestedObjects_whenAssertEquals_thenPass() throws JSONException { - String result = "{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " - + "state:\"LA\", zip:91601}}"; - JSONAssert.assertEquals("{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " - + "state:\"LA\", zip:91601}}", result, false); + String result = "{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " + "state:\"LA\", zip:91601}}"; + JSONAssert.assertEquals("{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " + "state:\"LA\", zip:91601}}", result, false); } @Test @@ -98,32 +95,19 @@ public class JsonAssertUnitTest { @Test public void whenComparingSizeOfArray_thenPass() throws JSONException { String names = "{names:[Alex, Barbera, Charlie, Xavier]}"; - JSONAssert.assertEquals( - "{names:[4]}", - names, - new ArraySizeComparator(JSONCompareMode.LENIENT)); + JSONAssert.assertEquals("{names:[4]}", names, new ArraySizeComparator(JSONCompareMode.LENIENT)); } @Test public void whenComparingContentsOfArray_thenPass() throws JSONException { String ratings = "{ratings:[3.2,3.5,4.1,5,1]}"; - JSONAssert.assertEquals( - "{ratings:[1,5]}", - ratings, - new ArraySizeComparator(JSONCompareMode.LENIENT)); + JSONAssert.assertEquals("{ratings:[1,5]}", ratings, new ArraySizeComparator(JSONCompareMode.LENIENT)); } @Test public void givenValueMatcher_whenComparingUsingRegex_thenPass() throws IllegalArgumentException, JSONException { - JSONAssert.assertEquals("{entry:{id:x}}", "{entry:{id:1, id:2}}", - new CustomComparator( - JSONCompareMode.STRICT, - new Customization("entry.id", - new RegularExpressionValueMatcher("\\d")))); + JSONAssert.assertEquals("{entry:{id:x}}", "{entry:{id:1, id:2}}", new CustomComparator(JSONCompareMode.STRICT, new Customization("entry.id", new RegularExpressionValueMatcher("\\d")))); - JSONAssert.assertNotEquals("{entry:{id:x}}", "{entry:{id:1, id:as}}", - new CustomComparator(JSONCompareMode.STRICT, - new Customization("entry.id", - new RegularExpressionValueMatcher("\\d")))); + JSONAssert.assertNotEquals("{entry:{id:x}}", "{entry:{id:1, id:as}}", new CustomComparator(JSONCompareMode.STRICT, new Customization("entry.id", new RegularExpressionValueMatcher("\\d")))); } } diff --git a/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java b/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java index 1c95956761..c8718aef8d 100644 --- a/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java +++ b/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java @@ -14,7 +14,7 @@ public class SafeAdditionUtilTest { private SafeAdditionUtil serviceUnderTest = new SafeAdditionUtil(); @Test - @Parameters({"1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15"}) + @Parameters({ "1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15" }) public void whenCalledWithAnnotationProvidedParams_thenSafeAddAndReturn(int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } @@ -26,7 +26,7 @@ public class SafeAdditionUtilTest { } private Object[] parametersToTestAdd() { - return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; + return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; } @Test @@ -36,7 +36,7 @@ public class SafeAdditionUtilTest { } private Object[] parametersForWhenCalledWithnoParam_thenLoadByNameSafeAddAndReturn() { - return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; + return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; } @Test diff --git a/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java index 08a472502e..d318345a56 100644 --- a/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java +++ b/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java @@ -3,11 +3,11 @@ package com.baeldung.junitparams; public class TestDataProvider { public static Object[] provideBasicData() { - return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{15, -5, 10}, new Object[]{-5, -10, -15}}; + return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { 15, -5, 10 }, new Object[] { -5, -10, -15 } }; } public static Object[] provideEdgeCaseData() { - return new Object[]{new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -2, Integer.MIN_VALUE},}; + return new Object[] { new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -2, Integer.MIN_VALUE }, }; } } diff --git a/libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java b/libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java new file mode 100644 index 0000000000..4406494d30 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/kafkastreams/KafkaStreamsLiveTest.java @@ -0,0 +1,59 @@ +package com.baeldung.kafkastreams; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.Serde; +import org.apache.kafka.common.serialization.Serdes; +import org.apache.kafka.streams.KafkaStreams; +import org.apache.kafka.streams.StreamsConfig; +import org.apache.kafka.streams.kstream.KStream; +import org.apache.kafka.streams.kstream.KStreamBuilder; +import org.apache.kafka.streams.kstream.KTable; +import org.apache.kafka.test.TestUtils; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Properties; +import java.util.regex.Pattern; + +public class KafkaStreamsLiveTest { + private String bootstrapServers = "localhost:9092"; + + @Test + @Ignore("it needs to have kafka broker running on local") + public void shouldTestKafkaStreams() throws InterruptedException { + // given + String inputTopic = "inputTopic"; + + Properties streamsConfiguration = new Properties(); + streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "wordcount-live-test"); + streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + streamsConfiguration.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName()); + streamsConfiguration.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 1000); + streamsConfiguration.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + // Use a temporary directory for storing state, which will be automatically removed after the test. + streamsConfiguration.put(StreamsConfig.STATE_DIR_CONFIG, TestUtils.tempDirectory().getAbsolutePath()); + + // when + KStreamBuilder builder = new KStreamBuilder(); + KStream textLines = builder.stream(inputTopic); + Pattern pattern = Pattern.compile("\\W+", Pattern.UNICODE_CHARACTER_CLASS); + + KTable wordCounts = textLines.flatMapValues(value -> Arrays.asList(pattern.split(value.toLowerCase()))).groupBy((key, word) -> word).count(); + + wordCounts.foreach((word, count) -> System.out.println("word: " + word + " -> " + count)); + + String outputTopic = "outputTopic"; + final Serde stringSerde = Serdes.String(); + final Serde longSerde = Serdes.Long(); + wordCounts.to(stringSerde, longSerde, outputTopic); + + KafkaStreams streams = new KafkaStreams(builder, streamsConfiguration); + streams.start(); + + // then + Thread.sleep(30000); + streams.close(); + } +} diff --git a/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java b/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java index fbcda2a70d..5928765aaa 100644 --- a/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java +++ b/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java @@ -8,16 +8,15 @@ import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; - public class LocalSensitiveHashingUnitTest { @Ignore("for simplicity of the example number of input vectors is very low, that's why LSH may yield non deterministic results") @Test() public void givenNVectors_whenPerformLSH_thenShouldCalculateSameHashForSimilarVectors() { - //given - boolean[] vector1 = new boolean[]{true, true, true, true, true}; - boolean[] vector2 = new boolean[]{false, false, false, true, false}; - boolean[] vector3 = new boolean[]{false, false, true, true, false}; + // given + boolean[] vector1 = new boolean[] { true, true, true, true, true }; + boolean[] vector2 = new boolean[] { false, false, false, true, false }; + boolean[] vector3 = new boolean[] { false, false, true, true, false }; int sizeOfVectors = 5; int numberOfBuckets = 10; @@ -25,7 +24,7 @@ public class LocalSensitiveHashingUnitTest { LSHMinHash lsh = new LSHMinHash(stages, numberOfBuckets, sizeOfVectors); - //when + // when int[] firstHash = lsh.hash(vector1); int[] secondHash = lsh.hash(vector2); int[] thirdHash = lsh.hash(vector3); @@ -34,7 +33,7 @@ public class LocalSensitiveHashingUnitTest { System.out.println(Arrays.toString(secondHash)); System.out.println(Arrays.toString(thirdHash)); - //then + // then int lastIndexOfResult = stages - 1; assertThat(firstHash[lastIndexOfResult]).isNotEqualTo(secondHash[lastIndexOfResult]); assertThat(firstHash[lastIndexOfResult]).isNotEqualTo(thirdHash[lastIndexOfResult]); @@ -45,4 +44,3 @@ public class LocalSensitiveHashingUnitTest { return Math.abs(secondHash - thirdHash) < numberOfBuckets / 2; } } - diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationTest.java b/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationTest.java index d0b1cafd71..99ea1aab71 100644 --- a/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationTest.java +++ b/libraries/src/test/java/com/baeldung/mbassador/MBassadorAsyncInvocationTest.java @@ -5,8 +5,6 @@ import net.engio.mbassy.listener.Handler; import net.engio.mbassy.listener.Invoke; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationTest.java b/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationTest.java index fe9c130d93..9d9a58aee9 100644 --- a/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationTest.java +++ b/libraries/src/test/java/com/baeldung/mbassador/MBassadorConfigurationTest.java @@ -6,8 +6,6 @@ import net.engio.mbassy.bus.error.PublicationError; import net.engio.mbassy.listener.Handler; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.*; @@ -25,8 +23,8 @@ public class MBassadorConfigurationTest implements IPublicationErrorHandler { @Before public void prepareTests() { - dispatcher = new MBassador(this); - dispatcher.subscribe(this); + dispatcher = new MBassador(this); + dispatcher.subscribe(this); } @Test diff --git a/libraries/src/test/java/com/baeldung/neuroph/XORTest.java b/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java similarity index 92% rename from libraries/src/test/java/com/baeldung/neuroph/XORTest.java rename to libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java index 4a6ecf8e46..ea5c09a4d8 100644 --- a/libraries/src/test/java/com/baeldung/neuroph/XORTest.java +++ b/libraries/src/test/java/com/baeldung/neuroph/XORIntegrationTest.java @@ -7,10 +7,10 @@ import org.neuroph.core.NeuralNetwork; import static org.junit.Assert.*; -public class XORTest { +public class XORIntegrationTest { private NeuralNetwork ann = null; - private void print(String input, double output, double actual) { + private void print(String input, double output, double actual) { System.out.println("Testing: " + input + " Expected: " + actual + " Result: " + output); } diff --git a/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java index b152b22964..70d3e41579 100644 --- a/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java +++ b/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.pact; - import au.com.dius.pact.consumer.Pact; import au.com.dius.pact.consumer.PactProviderRuleMk2; import au.com.dius.pact.consumer.PactVerification; @@ -23,63 +22,37 @@ import static org.assertj.core.api.Assertions.assertThat; public class PactConsumerDrivenContractUnitTest { @Rule - public PactProviderRuleMk2 mockProvider - = new PactProviderRuleMk2("test_provider", "localhost", 8080, this); + public PactProviderRuleMk2 mockProvider = new PactProviderRuleMk2("test_provider", "localhost", 8080, this); @Pact(consumer = "test_consumer") public RequestResponsePact createPact(PactDslWithProvider builder) { Map headers = new HashMap(); headers.put("Content-Type", "application/json"); - return builder - .given("test GET ") - .uponReceiving("GET REQUEST") - .path("/") - .method("GET") - .willRespondWith() - .status(200) - .headers(headers) - .body("{\"condition\": true, \"name\": \"tom\"}") - .given("test POST") - .uponReceiving("POST REQUEST") - .method("POST") - .headers(headers) - .body("{\"name\": \"Michael\"}") - .path("/create") - .willRespondWith() - .status(201) - .headers(headers) - .body("") - .toPact(); + return builder.given("test GET").uponReceiving("GET REQUEST").path("/pact").method("GET").willRespondWith().status(200).headers(headers).body("{\"condition\": true, \"name\": \"tom\"}").given("test POST").uponReceiving("POST REQUEST").method("POST") + .headers(headers).body("{\"name\": \"Michael\"}").path("/pact").willRespondWith().status(201).toPact(); } - @Test @PactVerification() public void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody() { - //when - ResponseEntity response - = new RestTemplate().getForEntity(mockProvider.getUrl(), String.class); + // when + ResponseEntity response = new RestTemplate().getForEntity(mockProvider.getUrl() + "/pact", String.class); - //then + // then assertThat(response.getStatusCode().value()).isEqualTo(200); assertThat(response.getHeaders().get("Content-Type").contains("application/json")).isTrue(); assertThat(response.getBody()).contains("condition", "true", "name", "tom"); - //and + // and HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); String jsonBody = "{\"name\": \"Michael\"}"; - //when - ResponseEntity postResponse = new RestTemplate().exchange( - mockProvider.getUrl() + "/create", - HttpMethod.POST, - new HttpEntity<>(jsonBody, httpHeaders), - String.class - ); + // when + ResponseEntity postResponse = new RestTemplate().exchange(mockProvider.getUrl() + "/pact", HttpMethod.POST, new HttpEntity<>(jsonBody, httpHeaders), String.class); - //then + // then assertThat(postResponse.getStatusCode().value()).isEqualTo(201); } diff --git a/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java b/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java index 0e6242b8a3..205f0e545e 100644 --- a/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java +++ b/libraries/src/test/java/com/baeldung/pairs/ApacheCommonsPairUnitTest.java @@ -46,5 +46,4 @@ public class ApacheCommonsPairUnitTest { immutablePair.setValue("Another One"); } - } diff --git a/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java b/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java index ca425339fa..4271d4e003 100644 --- a/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java +++ b/libraries/src/test/java/com/baeldung/pairs/CoreJavaSimpleEntryUnitTest.java @@ -17,15 +17,15 @@ public class CoreJavaSimpleEntryUnitTest { assertEquals(key.intValue(), 1); assertEquals(value, "one"); } - + @Test(expected = UnsupportedOperationException.class) public void givenSimpleImmutableEntry_whenSetValue_thenException() { AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one"); - + entry.setValue("two"); - + } - + @Test public void givenSimpleImmutableEntry_whenGetValue_thenOk() { AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one"); diff --git a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java b/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java index acc7718ea8..1a75624439 100644 --- a/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/pcollections/PCollectionsUnitTest.java @@ -86,8 +86,7 @@ public class PCollectionsUnitTest { @Test public void whenMapPSetMethods_thenPerformOperations() { - MapPSet pSet = HashTreePSet.empty() - .plusAll(Arrays.asList("e1", "e2", "e3", "e4")); + MapPSet pSet = HashTreePSet.empty().plusAll(Arrays.asList("e1", "e2", "e3", "e4")); assertEquals(pSet.size(), 4); MapPSet pSet1 = pSet.minus("e4"); diff --git a/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java b/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java index cf6a1e5ec5..e9d5b8ede5 100644 --- a/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java +++ b/libraries/src/test/java/com/baeldung/protonpack/CollectorUtilsTests.java @@ -35,32 +35,21 @@ public class CollectorUtilsTests { @Test public void givenEmptyStream_withCollectorUnique_shouldReturnEmpty() { - assertThat(Stream - .empty() - .collect(CollectorUtils.unique()), equalTo(Optional.empty())); + assertThat(Stream.empty().collect(CollectorUtils.unique()), equalTo(Optional.empty())); } @Test public void givenIntegerStream_withCollectorUnique_shouldReturnUniqueValue() { - assertThat(Stream - .of(1, 2, 3) - .filter(i -> i > 2) - .collect(CollectorUtils.unique()), equalTo(Optional.of(3))); + assertThat(Stream.of(1, 2, 3).filter(i -> i > 2).collect(CollectorUtils.unique()), equalTo(Optional.of(3))); } @Test public void givenIntegerStream_withUniqueNullable_shouldReturnUniqueValue() { - assertThat(Stream - .of(1, 2, 3) - .filter(i -> i > 2) - .collect(CollectorUtils.uniqueNullable()), equalTo(3)); + assertThat(Stream.of(1, 2, 3).filter(i -> i > 2).collect(CollectorUtils.uniqueNullable()), equalTo(3)); } @Test(expected = NonUniqueValueException.class) public void givenIntegerStream_withCollectorUnique_shouldThrowNonUniqueValueException() { - Stream - .of(1, 2, 3) - .filter(i -> i > 1) - .collect(CollectorUtils.unique()); + Stream.of(1, 2, 3).filter(i -> i > 1).collect(CollectorUtils.unique()); } } diff --git a/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java b/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java index 37ca71287f..ccd43b7777 100644 --- a/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java +++ b/libraries/src/test/java/com/baeldung/protonpack/StreamUtilsTests.java @@ -24,9 +24,7 @@ public class StreamUtilsTests { public void givenStream_whenZipWithIndex_shouldReturnZippedStreamWithIndex() { Stream source = Stream.of("Foo", "Bar", "Baz"); - List> zipped = StreamUtils - .zipWithIndex(source) - .collect(Collectors.toList()); + List> zipped = StreamUtils.zipWithIndex(source).collect(Collectors.toList()); assertThat(zipped, contains(Indexed.index(0, "Foo"), Indexed.index(1, "Bar"), Indexed.index(2, "Baz"))); } @@ -36,9 +34,7 @@ public class StreamUtilsTests { Stream streamA = Stream.of("A", "B", "C"); Stream streamB = Stream.of("Apple", "Banana", "Carrot"); - List zipped = StreamUtils - .zip(streamA, streamB, (a, b) -> a + " is for " + b) - .collect(Collectors.toList()); + List zipped = StreamUtils.zip(streamA, streamB, (a, b) -> a + " is for " + b).collect(Collectors.toList()); assertThat(zipped, contains("A is for Apple", "B is for Banana", "C is for Carrot")); } @@ -49,15 +45,13 @@ public class StreamUtilsTests { Stream streamB = Stream.of("aggravating", "banausic", "complaisant"); Stream streamC = Stream.of("Apple", "Banana", "Carrot"); - List zipped = StreamUtils - .zip(streamA, streamB, streamC, (a, b, c) -> a + " is for " + b + " " + c) - .collect(Collectors.toList()); + List zipped = StreamUtils.zip(streamA, streamB, streamC, (a, b, c) -> a + " is for " + b + " " + c).collect(Collectors.toList()); assertThat(zipped, contains("A is for aggravating Apple", "B is for banausic Banana", "C is for complaisant Carrot")); } @Test - //givenThreeStreams_whenMerge_shouldReturnMergedStream + // givenThreeStreams_whenMerge_shouldReturnMergedStream public void givenThreeStreams_whenMerge_shouldReturnMergedStream() { Stream streamA = Stream.of("A", "B", "C"); Stream streamB = Stream.of("apple", "banana", "carrot", "date"); @@ -69,7 +63,7 @@ public class StreamUtilsTests { } @Test - //givenThreeStreams_whenInterleave_shouldReturnRoundRobinInterleavingStream + // givenThreeStreams_whenInterleave_shouldReturnRoundRobinInterleavingStream public void givenThreeStreams_whenInterleave_shouldReturnRoundRobinInterleavingStream() { Stream streamA = Stream.of("Peter", "Paul", "Mary"); Stream streamB = Stream.of("A", "B", "C", "D", "E"); @@ -81,7 +75,7 @@ public class StreamUtilsTests { } @Test - //givenInfiniteStream_whenTakeWhile10_shouldReturnStreamOfSize10 + // givenInfiniteStream_whenTakeWhile10_shouldReturnStreamOfSize10 public void givenInfiniteStream_whenTakeWhile10_shouldReturnStream() { Stream infiniteInts = Stream.iterate(0, i -> i + 1); Stream finiteInts = StreamUtils.takeWhile(infiniteInts, i -> i < 10); @@ -125,9 +119,7 @@ public class StreamUtilsTests { @Test public void giveIntegerStream_whenGroupRuns_shouldReturnListGroupItems() { Stream integerStream = Stream.of(1, 1, 2, 2, 3, 4, 5); - List> runs = StreamUtils - .groupRuns(integerStream) - .collect(toList()); + List> runs = StreamUtils.groupRuns(integerStream).collect(toList()); assertThat(runs, contains(asList(1, 1), asList(2, 2), asList(3), asList(4), asList(5))); } @@ -143,21 +135,17 @@ public class StreamUtilsTests { public void givenIntegerStream_whenWindowed_shouldReturnListOfListOfItemsOfWindowSize() { Stream integerStream = Stream.of(1, 2, 3, 4, 5); - List> windows = StreamUtils - .windowed(integerStream, 2) - .collect(toList()); + List> windows = StreamUtils.windowed(integerStream, 2).collect(toList()); assertThat(windows, contains(asList(1, 2), asList(2, 3), asList(3, 4), asList(4, 5))); } @Test - //givenIntegerStream_whenWindowedWithWindowSizeAndSkip_shouldReturnListOfListOfWindowSizeAddingASkip + // givenIntegerStream_whenWindowedWithWindowSizeAndSkip_shouldReturnListOfListOfWindowSizeAddingASkip public void givenIntegerStream_whenWindowedWithWindowSizeAndSkip_shouldReturnListOfListOfWindowSizeAddingASkip() { Stream integerStream = Stream.of(1, 2, 3, 4, 5); - List> windows = StreamUtils - .windowed(integerStream, 3, 2) - .collect(toList()); + List> windows = StreamUtils.windowed(integerStream, 3, 2).collect(toList()); assertThat(windows, contains(asList(1, 2, 3), asList(3, 4, 5))); } @@ -166,15 +154,9 @@ public class StreamUtilsTests { public void givenEmptyStream_whenWindowed_shouldReturnIterableWithSizeZero() { ArrayList ints = new ArrayList<>(); - ints - .stream() - .collect(maxBy((a, b) -> a - .toString() - .compareTo(b.toString()))); + ints.stream().collect(maxBy((a, b) -> a.toString().compareTo(b.toString()))); - List> windows = StreamUtils - .windowed(ints.stream(), 2) - .collect(toList()); + List> windows = StreamUtils.windowed(ints.stream(), 2).collect(toList()); assertThat(windows, iterableWithSize(0)); } @@ -183,18 +165,14 @@ public class StreamUtilsTests { public void givenIntegerStream_whenWindowedWithWindowSizeAndSkipAndAllowLesserSize_shouldReturnListOfListOfInteger() { Stream integerStream = Stream.of(1, 2, 3, 4, 5); - List> windows = StreamUtils - .windowed(integerStream, 2, 2, true) - .collect(toList()); + List> windows = StreamUtils.windowed(integerStream, 2, 2, true).collect(toList()); assertThat(windows, contains(asList(1, 2), asList(3, 4), asList(5))); } @Test public void givenLimit_withIndices_shouldReturnLongStreamUptoLimit() { - LongStream indices = StreamUtils - .indices() - .limit(500); + LongStream indices = StreamUtils.indices().limit(500); assertThat(indices.count(), equalTo(500)); } diff --git a/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiLiveTest.java b/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiLiveTest.java index 7170d35aa5..46325d4d23 100644 --- a/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiLiveTest.java +++ b/libraries/src/test/java/com/baeldung/retrofit/basic/GitHubBasicApiLiveTest.java @@ -17,46 +17,33 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class GitHubBasicApiLiveTest { - + GitHubBasicApi gitHub; - + @Before public void init() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.github.com/") - .addConverterFactory(GsonConverterFactory.create()) - .build(); - + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build(); + gitHub = retrofit.create(GitHubBasicApi.class); } - + @Test public void whenListRepos_thenExpectReposThatContainTutorials() { try { - List repos = gitHub - .listRepos("eugenp") - .execute() - .body(); - - assertThat(repos) - .isNotEmpty() - .extracting(Repository::getName).contains("tutorials"); + List repos = gitHub.listRepos("eugenp").execute().body(); + + assertThat(repos).isNotEmpty().extracting(Repository::getName).contains("tutorials"); } catch (IOException e) { fail("Can not communicate with GitHub API"); } } - + @Test public void whenListRepoContributers_thenExpectContributorsThatContainEugenp() { try { - List contributors = gitHub - .listRepoContributors("eugenp", "tutorials") - .execute() - .body(); - - assertThat(contributors) - .isNotEmpty() - .extracting(Contributor::getName).contains("eugenp"); + List contributors = gitHub.listRepoContributors("eugenp", "tutorials").execute().body(); + + assertThat(contributors).isNotEmpty().extracting(Contributor::getName).contains("eugenp"); } catch (IOException e) { fail("Can not communicate with GitHub API"); } diff --git a/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java b/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java deleted file mode 100644 index c2fbd9bf60..0000000000 --- a/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxApiTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.baeldung.retrofit.rx; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.retrofit.models.Contributor; -import com.baeldung.retrofit.models.Repository; -import com.baeldung.retrofit.rx.GitHubRxApi; - -import retrofit2.Retrofit; -import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; -import retrofit2.converter.gson.GsonConverterFactory; - -public class GitHubRxApiTest { - - GitHubRxApi gitHub; - - @Before - public void init() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("https://api.github.com/") - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) - .build(); - - gitHub = retrofit.create(GitHubRxApi.class); - } - - @Test - public void whenListRepos_thenExpectReposThatContainTutorials() { - gitHub - .listRepos("eugenp") - .subscribe( repos -> { - assertThat(repos) - .isNotEmpty() - .extracting(Repository::getName).contains("tutorials"); - }); - } - - @Test - public void whenListRepoContributers_thenExpectContributorsThatContainEugenp() { - gitHub - .listRepoContributors("eugenp", "tutorials") - .subscribe(contributors -> { - assertThat(contributors) - .isNotEmpty() - .extracting(Contributor::getName).contains("eugenp"); - }); - } - -} diff --git a/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxLiveTest.java b/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxLiveTest.java new file mode 100644 index 0000000000..7ab4af3af2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/retrofit/rx/GitHubRxLiveTest.java @@ -0,0 +1,41 @@ +package com.baeldung.retrofit.rx; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.retrofit.models.Contributor; +import com.baeldung.retrofit.models.Repository; +import com.baeldung.retrofit.rx.GitHubRxApi; + +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +public class GitHubRxLiveTest { + + GitHubRxApi gitHub; + + @Before + public void init() { + Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); + + gitHub = retrofit.create(GitHubRxApi.class); + } + + @Test + public void whenListRepos_thenExpectReposThatContainTutorials() { + gitHub.listRepos("eugenp").subscribe(repos -> { + assertThat(repos).isNotEmpty().extracting(Repository::getName).contains("tutorials"); + }); + } + + @Test + public void whenListRepoContributers_thenExpectContributorsThatContainEugenp() { + gitHub.listRepoContributors("eugenp", "tutorials").subscribe(contributors -> { + assertThat(contributors).isNotEmpty().extracting(Contributor::getName).contains("eugenp"); + }); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java index 1ebbd49e79..57bb7c1242 100644 --- a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java @@ -23,15 +23,11 @@ public class GoogleSearchLiveTest { public void whenGoogleBaeldungThenShouldSeeEugen() { browser.get("https://www.google.com/ncr"); - browser - .findElement(By.name("q")) - .sendKeys("baeldung", Keys.ENTER); + browser.findElement(By.name("q")).sendKeys("baeldung", Keys.ENTER); new WebDriverWait(browser, 5).until(visibilityOfElementLocated(By.cssSelector("._ksh"))); - assertThat(browser - .findElement(By.cssSelector("._ksh")) - .getText(), containsString("Eugen (Baeldung)")); + assertThat(browser.findElement(By.cssSelector("._ksh")).getText(), containsString("Eugen (Baeldung)")); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java index 18488f9380..e95b63aa96 100644 --- a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java @@ -51,7 +51,6 @@ public class MemberStatusIntegrationTest { /** * This test should fail, comment out @Ignore to see how failed test can be reflected in Serenity report.
- * Remember to add <testFailureIgnore>true</testFailureIgnore> under maven-surefire-plugin configuration. */ @Test @Ignore diff --git a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java index 2ba5b1c8ed..887b4cde7d 100644 --- a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java @@ -43,9 +43,6 @@ public class GithubRestUserAPISteps { private static HttpResponse getGithubUserProfile(String api, String username) throws IOException { HttpUriRequest request = new HttpGet(String.format(api, username)); - return HttpClientBuilder - .create() - .build() - .execute(request); + return HttpClientBuilder.create().build().execute(request); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java b/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java index 49ed8cae7d..a398c614c4 100644 --- a/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java @@ -33,7 +33,7 @@ public class MemberStatusSteps { @Pending @Step("When the member exchange {}") public void aMemberExchangeA(Commodity commodity) { - //TODO + // TODO } @Pending diff --git a/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java index bdba8a69bc..d922ea8c85 100644 --- a/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java +++ b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java @@ -24,9 +24,7 @@ public class GoogleSearchPageObject extends PageObject { } public void resultMatches(String expected) { - withTimeoutOf(5, SECONDS) - .waitFor(result) - .waitUntilVisible(); + withTimeoutOf(5, SECONDS).waitFor(result).waitUntilVisible(); assertThat(result.getText(), containsString(expected)); } diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java index b60c929c05..5663484a5b 100644 --- a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java @@ -10,12 +10,8 @@ import net.thucydides.core.annotations.DefaultUrl; @DefaultUrl("https://www.google.com/ncr") class GoogleSearchPage extends PageObject { - static final Target SEARCH_RESULT_TITLES = Target - .the("search results") - .locatedBy("._ksh"); + static final Target SEARCH_RESULT_TITLES = Target.the("search results").locatedBy("._ksh"); - static final Target SEARCH_INPUT_BOX = Target - .the("search input box") - .locatedBy("#lst-ib"); + static final Target SEARCH_INPUT_BOX = Target.the("search input box").locatedBy("#lst-ib"); } diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java index 38990e13b6..67a27e5855 100644 --- a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java @@ -13,9 +13,6 @@ public class GoogleSearchResults implements Question> { } public List answeredBy(Actor actor) { - return Text - .of(GoogleSearchPage.SEARCH_RESULT_TITLES) - .viewedBy(actor) - .asList(); + return Text.of(GoogleSearchPage.SEARCH_RESULT_TITLES).viewedBy(actor).asList(); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java index 1628ef8ed7..2464c439cf 100644 --- a/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java @@ -11,10 +11,7 @@ public class SearchForKeyword implements Task { @Step("{0} searches for '#keyword'") public void performAs(T actor) { - actor.attemptsTo(Enter - .theValue(keyword) - .into(GoogleSearchPage.SEARCH_INPUT_BOX) - .thenHit(Keys.RETURN)); + actor.attemptsTo(Enter.theValue(keyword).into(GoogleSearchPage.SEARCH_INPUT_BOX).thenHit(Keys.RETURN)); } private String keyword; @@ -24,9 +21,7 @@ public class SearchForKeyword implements Task { } public static Task of(String keyword) { - return Instrumented - .instanceOf(SearchForKeyword.class) - .withProperties(keyword); + return Instrumented.instanceOf(SearchForKeyword.class).withProperties(keyword); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java index 52c6d07fda..d6e45beb26 100644 --- a/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java @@ -17,9 +17,7 @@ public class StartWith implements Task { @Step("{0} starts a google search") public void performAs(T t) { - t.attemptsTo(Open - .browserOn() - .the(googleSearchPage)); + t.attemptsTo(Open.browserOn().the(googleSearchPage)); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java index 82dbad0f11..07b60df264 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java @@ -15,9 +15,7 @@ import static com.baeldung.serenity.spring.RandomNumberUtil.randomInt; import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_CLASS; @RunWith(Suite.class) -@Suite.SuiteClasses({ - AdderClassDirtiesContextIntegrationTest.DirtiesContextTest.class, AdderClassDirtiesContextIntegrationTest.AnotherDirtiesContextTest.class -}) +@Suite.SuiteClasses({ AdderClassDirtiesContextIntegrationTest.DirtiesContextIntegrationTest.class, AdderClassDirtiesContextIntegrationTest.AnotherDirtiesContextIntegrationTest.class }) public class AdderClassDirtiesContextIntegrationTest { @RunWith(SerenityRunner.class) @@ -48,11 +46,11 @@ public class AdderClassDirtiesContextIntegrationTest { } @DirtiesContext(classMode = AFTER_CLASS) - public static class AnotherDirtiesContextTest extends Base { + public static class AnotherDirtiesContextIntegrationTest extends Base { @Test public void givenNumber_whenAdd_thenSumWrong() { - super.whenAdd_thenSummedUp(); //expecting zero + super.whenAdd_thenSummedUp(); // expecting zero adderServiceSteps.givenBaseAndAdder(randomInt(), randomInt()); super.whenAccumulate_thenSummedUp(); super.whenAdd_thenSumWrong(); @@ -60,11 +58,11 @@ public class AdderClassDirtiesContextIntegrationTest { } @DirtiesContext(classMode = AFTER_CLASS) - public static class DirtiesContextTest extends Base { + public static class DirtiesContextIntegrationTest extends Base { @Test public void givenNumber_whenAdd_thenSumWrong() { - super.whenAdd_thenSummedUp(); //expecting zero + super.whenAdd_thenSummedUp(); // expecting zero adderServiceSteps.givenBaseAndAdder(randomInt(), randomInt()); super.whenAccumulate_thenSummedUp(); super.whenAdd_thenSumWrong(); diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderIntegrationTest.java similarity index 78% rename from libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java rename to libraries/src/test/java/com/baeldung/serenity/spring/AdderIntegrationTest.java index 771f389cb1..b30496462e 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderIntegrationTest.java @@ -6,8 +6,8 @@ import org.jbehave.core.annotations.BeforeStory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; -@ContextConfiguration(classes = {AdderController.class, AdderService.class}) -public class AdderTest extends SerenityStory { +@ContextConfiguration(classes = { AdderController.class, AdderService.class }) +public class AdderIntegrationTest extends SerenityStory { @Autowired private AdderService adderService; diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest.java index 6524ade190..ecb601b94b 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest.java @@ -25,7 +25,8 @@ public class AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest { private AdderConstructorDependencySteps adderSteps; - @Autowired private AdderService adderService; + @Autowired + private AdderService adderService; @Before public void init() { @@ -38,7 +39,8 @@ public class AdderMethodDirtiesContextDependencyWorkaroundIntegrationTest { adderSteps.summedUp(); } - @Rule public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); + @Rule + public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); @DirtiesContext @Test diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextInitWorkaroundIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextInitWorkaroundIntegrationTest.java index 87c66f03d9..7221aa7a17 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextInitWorkaroundIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextInitWorkaroundIntegrationTest.java @@ -23,7 +23,8 @@ import static com.baeldung.serenity.spring.RandomNumberUtil.randomInt; @ContextConfiguration(classes = AdderService.class) public class AdderMethodDirtiesContextInitWorkaroundIntegrationTest { - @Steps private AdderServiceSteps adderServiceSteps; + @Steps + private AdderServiceSteps adderServiceSteps; @Before public void init() { @@ -36,7 +37,8 @@ public class AdderMethodDirtiesContextInitWorkaroundIntegrationTest { adderServiceSteps.summedUp(); } - @Rule public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); + @Rule + public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); @DirtiesContext @Test diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextIntegrationTest.java index 263ffc9854..fc7067520d 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodDirtiesContextIntegrationTest.java @@ -22,7 +22,8 @@ import static com.baeldung.serenity.spring.RandomNumberUtil.randomInt; @ContextConfiguration(classes = AdderService.class) public class AdderMethodDirtiesContextIntegrationTest { - @Steps private AdderServiceSteps adderServiceSteps; + @Steps + private AdderServiceSteps adderServiceSteps; @Test public void _1_givenNumber_whenAdd_thenSumWrong() { @@ -30,7 +31,8 @@ public class AdderMethodDirtiesContextIntegrationTest { adderServiceSteps.sumWrong(); } - @Rule public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); + @Rule + public SpringIntegrationMethodRule springIntegration = new SpringIntegrationMethodRule(); @DirtiesContext @Test diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodRuleIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodRuleIntegrationTest.java index bbf07a2b95..1b3668b756 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodRuleIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMethodRuleIntegrationTest.java @@ -41,11 +41,14 @@ public class AdderMethodRuleIntegrationTest { LOG.info("adder after test: {}", adder); } - @Rule public SpringIntegrationMethodRule springMethodIntegration = new SpringIntegrationMethodRule(); + @Rule + public SpringIntegrationMethodRule springMethodIntegration = new SpringIntegrationMethodRule(); - @Steps private AdderSteps adderSteps; + @Steps + private AdderSteps adderSteps; - @Value("#{props['adder']}") private int adder; + @Value("#{props['adder']}") + private int adder; private static int staticAdder; diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMockMvcIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMockMvcIntegrationTest.java index 2b2777f0ed..d4cf9fc924 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderMockMvcIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderMockMvcIntegrationTest.java @@ -21,7 +21,8 @@ public class AdderMockMvcIntegrationTest { RestAssuredMockMvc.standaloneSetup(new PlainAdderController()); } - @Steps AdderRestSteps steps; + @Steps + AdderRestSteps steps; @Test public void givenNumber_whenAdd_thenSummedUp() throws Exception { diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderServiceIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderServiceIntegrationTest.java index 5f2aae8e3f..8b307973ba 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderServiceIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderServiceIntegrationTest.java @@ -14,7 +14,8 @@ import static com.baeldung.serenity.spring.RandomNumberUtil.randomInt; @RunWith(SerenityRunner.class) public class AdderServiceIntegrationTest { - @Steps private AdderServiceSteps adderServiceSteps; + @Steps + private AdderServiceSteps adderServiceSteps; @Test public void givenNumber_whenAdd_thenSummedUp() { diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderSpringSerenityRunnerIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderSpringSerenityRunnerIntegrationTest.java index cdabc17980..ddbfd0cfc2 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderSpringSerenityRunnerIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderSpringSerenityRunnerIntegrationTest.java @@ -15,9 +15,11 @@ import org.springframework.test.context.ContextConfiguration; @ContextConfiguration(locations = "classpath:adder-beans.xml") public class AdderSpringSerenityRunnerIntegrationTest { - @Steps private AdderSteps adderSteps; + @Steps + private AdderSteps adderSteps; - @Value("#{props['adder']}") private int adder; + @Value("#{props['adder']}") + private int adder; @Test public void givenNumber_whenAdd_thenSummedUp() { diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderRestSteps.java b/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderRestSteps.java index 0d77ed0849..a38a584645 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderRestSteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderRestSteps.java @@ -18,29 +18,18 @@ public class AdderRestSteps { @Step("get the current number") public void givenCurrentNumber() throws UnsupportedEncodingException { - currentNum = Integer.valueOf(given() - .when() - .get("/adder/current") - .mvcResult() - .getResponse() - .getContentAsString()); + currentNum = Integer.valueOf(given().when().get("/adder/current").mvcResult().getResponse().getContentAsString()); } @Step("adding {0}") public void whenAddNumber(int num) { - mockMvcResponse = given() - .queryParam("num", num) - .when() - .post("/adder"); + mockMvcResponse = given().queryParam("num", num).when().post("/adder"); currentNum += num; } @Step("got the sum") public void thenSummedUp() { - mockMvcResponse - .then() - .statusCode(200) - .body(equalTo(currentNum + "")); + mockMvcResponse.then().statusCode(200).body(equalTo(currentNum + "")); } } diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderServiceSteps.java b/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderServiceSteps.java index b8c2854bf0..227526b8b4 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderServiceSteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/steps/AdderServiceSteps.java @@ -13,7 +13,8 @@ import static org.junit.Assert.assertNotEquals; @ContextConfiguration(classes = AdderService.class) public class AdderServiceSteps { - @Autowired private AdderService adderService; + @Autowired + private AdderService adderService; private int givenNumber; private int base; diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/stories/AdderStory.java b/libraries/src/test/java/com/baeldung/serenity/spring/stories/AdderStory.java index b9fa8f1ae0..491c11a38c 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/stories/AdderStory.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/stories/AdderStory.java @@ -11,7 +11,8 @@ import org.jbehave.core.annotations.When; */ public class AdderStory { - @Steps AdderRestSteps restSteps; + @Steps + AdderRestSteps restSteps; @Given("a number") public void givenANumber() throws Exception { diff --git a/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java b/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java new file mode 100644 index 0000000000..69af042427 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/smooks/converter/SmooksIntegrationTest.java @@ -0,0 +1,56 @@ +package com.baeldung.smooks.converter; + +import com.baeldung.smooks.model.Item; +import com.baeldung.smooks.model.Order; +import com.baeldung.smooks.model.Status; +import com.baeldung.smooks.model.Supplier; +import org.junit.Test; +import org.milyn.validation.ValidationResult; +import java.text.SimpleDateFormat; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +public class SmooksIntegrationTest { + + private static final String EDIFACT_MESSAGE = "UNA:+.? '\r\n" + "UNH+771+IN_PROGRESS+2018-01-14'\r\n" + "CTA+CompanyX+1234567'\r\n" + "LIN+1+PX1234+9.99'\r\n" + "LIN+2+RX990+120.32'\r\n"; + private static final String EMAIL_MESSAGE = "Hi,\r\n" + "Order number #771 created on 2018-01-14 is currently in IN_PROGRESS status.\r\n" + "Consider contact supplier \"CompanyX\" with phone number: \"1234567\".\r\n" + "Order items:\r\n" + + "1 X PX1234 (total price 9.99)\r\n" + "2 X RX990 (total price 240.64)\r\n"; + + @Test + public void givenOrderXML_whenConvert_thenPOJOsConstructedCorrectly() throws Exception { + + OrderConverter xmlToJavaOrderConverter = new OrderConverter(); + Order order = xmlToJavaOrderConverter.convertOrderXMLToOrderObject("/smooks/order.xml"); + + assertThat(order.getNumber(), is(771L)); + assertThat(order.getStatus(), is(Status.IN_PROGRESS)); + assertThat(order.getCreationDate(), is(new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-14"))); + assertThat(order.getSupplier(), is(new Supplier("CompanyX", "1234567"))); + assertThat(order.getItems(), containsInAnyOrder(new Item("PX1234", 9.99, 1), new Item("RX990", 120.32, 2))); + + } + + @Test + public void givenIncorrectOrderXML_whenValidate_thenExpectValidationErrors() throws Exception { + OrderValidator orderValidator = new OrderValidator(); + ValidationResult validationResult = orderValidator.validate("/smooks/order.xml"); + + assertThat(validationResult.getErrors(), hasSize(1)); + // 1234567 didn't match ^[0-9\\-\\+]{9,15}$ + assertThat(validationResult.getErrors().get(0).getFailRuleResult().getRuleName(), is("supplierPhone")); + } + + @Test + public void givenOrderXML_whenApplyEDITemplate_thenConvertedToEDIFACT() throws Exception { + OrderConverter orderConverter = new OrderConverter(); + String edifact = orderConverter.convertOrderXMLtoEDIFACT("/smooks/order.xml"); + assertThat(edifact, is(EDIFACT_MESSAGE)); + } + + @Test + public void givenOrderXML_whenApplyEmailTemplate_thenConvertedToEmailMessage() throws Exception { + OrderConverter orderConverter = new OrderConverter(); + String emailMessage = orderConverter.convertOrderXMLtoEmailMessage("/smooks/order.xml"); + assertThat(emailMessage, is(EMAIL_MESSAGE)); + } +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stm/AccountTest.java b/libraries/src/test/java/com/baeldung/stm/AccountTest.java index be3edf058c..eb8693b096 100644 --- a/libraries/src/test/java/com/baeldung/stm/AccountTest.java +++ b/libraries/src/test/java/com/baeldung/stm/AccountTest.java @@ -1,6 +1,5 @@ package com.baeldung.stm; - import org.junit.Test; import java.util.concurrent.CountDownLatch; @@ -16,34 +15,34 @@ public class AccountTest { @Test public void givenAccount_whenDecrement_thenShouldReturnProperValue() { - //given + // given Account a = new Account(10); - //when + // when a.adjustBy(-5); - //then + // then assertThat(a.getBalance()).isEqualTo(5); } @Test(expected = IllegalArgumentException.class) public void givenAccount_whenDecrementTooMuch_thenShouldThrow() { - //given + // given Account a = new Account(10); - //when + // when a.adjustBy(-11); } @Test public void givenTwoThreads_whenBothApplyOperation_thenShouldThrow() throws InterruptedException { - //given + // given ExecutorService ex = Executors.newFixedThreadPool(2); Account a = new Account(10); CountDownLatch countDownLatch = new CountDownLatch(1); AtomicBoolean exceptionThrown = new AtomicBoolean(false); - //when + // when ex.submit(() -> { try { countDownLatch.await(); @@ -74,44 +73,44 @@ public class AccountTest { ex.awaitTermination(1, TimeUnit.SECONDS); ex.shutdown(); - //then + // then assertTrue(exceptionThrown.get()); } @Test public void givenTwoAccounts_whenFailedWhileTransferring_thenShouldRollbackTransaction() { - //given + // given final Account a = new Account(10); final Account b = new Account(10); - //when + // when a.transferTo(b, 5); - //then + // then assertThat(a.getBalance()).isEqualTo(5); assertThat(b.getBalance()).isEqualTo(15); - //and + // and try { a.transferTo(b, 20); } catch (final IllegalArgumentException e) { System.out.println("failed to transfer money"); } - //then + // then assertThat(a.getBalance()).isEqualTo(5); assertThat(b.getBalance()).isEqualTo(15); } @Test public void givenTwoThreads_whenBothTryToTransfer_thenShouldNotDeadlock() throws InterruptedException { - //given + // given ExecutorService ex = Executors.newFixedThreadPool(2); final Account a = new Account(10); final Account b = new Account(10); CountDownLatch countDownLatch = new CountDownLatch(1); - //when + // when ex.submit(() -> { try { countDownLatch.await(); @@ -134,10 +133,9 @@ public class AccountTest { ex.awaitTermination(1, TimeUnit.SECONDS); ex.shutdown(); - //then + // then assertThat(a.getBalance()).isEqualTo(1); assertThat(b.getBalance()).isEqualTo(19); } - } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java index e14a91ce67..4cda0b5940 100644 --- a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java @@ -16,11 +16,9 @@ public class JoolMergeStreamsTest { Stream seq1 = Stream.of(1, 3, 5); Stream seq2 = Stream.of(2, 4, 6); - Stream resultingSeq = Seq.ofType(seq1, Integer.class) - .append(seq2); + Stream resultingSeq = Seq.ofType(seq1, Integer.class).append(seq2); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingSeq.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), resultingSeq.collect(Collectors.toList())); } @Test @@ -29,11 +27,8 @@ public class JoolMergeStreamsTest { Stream openingBracketSeq = Stream.of("["); Stream closingBracketSeq = Stream.of("]"); - Stream resultingStream = Seq.ofType(seq, String.class) - .append(closingBracketSeq) - .prepend(openingBracketSeq); + Stream resultingStream = Seq.ofType(seq, String.class).append(closingBracketSeq).prepend(openingBracketSeq); - Assert.assertEquals(Arrays.asList("[", "foo", "bar", "]"), - resultingStream.collect(Collectors.toList())); + Assert.assertEquals(Arrays.asList("[", "foo", "bar", "]"), resultingStream.collect(Collectors.toList())); } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java index 23110947b6..b8748abe03 100644 --- a/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java @@ -16,11 +16,9 @@ public class MergeStreamsTest { Stream stream1 = Stream.of(1, 3, 5); Stream stream2 = Stream.of(2, 4, 6); - Stream resultingStream = Stream.concat(stream1, - stream2); + Stream resultingStream = Stream.concat(stream1, stream2); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), resultingStream.collect(Collectors.toList())); } @Test @@ -29,12 +27,9 @@ public class MergeStreamsTest { Stream stream2 = Stream.of(2, 4, 6); Stream stream3 = Stream.of(18, 15, 36); - Stream resultingStream = Stream.concat(Stream.concat(stream1, - stream2), - stream3); + Stream resultingStream = Stream.concat(Stream.concat(stream1, stream2), stream3); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36), resultingStream.collect(Collectors.toList())); } @Test @@ -46,8 +41,7 @@ public class MergeStreamsTest { Stream resultingStream = Stream.of(stream1, stream2, stream3, stream4).flatMap(Function.identity()); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), resultingStream.collect(Collectors.toList())); } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java index 5104ec0682..e5392dff2a 100644 --- a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java @@ -18,8 +18,7 @@ public class StreamExMergeStreamsTest { Stream resultingStream = StreamEx.of(stream1).append(stream2); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), resultingStream.collect(Collectors.toList())); } @Test @@ -29,13 +28,9 @@ public class StreamExMergeStreamsTest { Stream stream3 = Stream.of(18, 15, 36); Stream stream4 = Stream.of(99); - Stream resultingStream = StreamEx.of(stream1) - .append(stream2) - .append(stream3) - .append(stream4); + Stream resultingStream = StreamEx.of(stream1).append(stream2).append(stream3).append(stream4); - assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), resultingStream.collect(Collectors.toList())); } @@ -45,11 +40,8 @@ public class StreamExMergeStreamsTest { Stream openingBracketStream = Stream.of("["); Stream closingBracketStream = Stream.of("]"); - Stream resultingStream = StreamEx.of(stream1) - .append(closingBracketStream) - .prepend(openingBracketStream); + Stream resultingStream = StreamEx.of(stream1).append(closingBracketStream).prepend(openingBracketStream); - assertEquals(Arrays.asList("[", "foo", "bar", "]"), - resultingStream.collect(Collectors.toList())); + assertEquals(Arrays.asList("[", "foo", "bar", "]"), resultingStream.collect(Collectors.toList())); } } diff --git a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java index 9a65075e5b..3ed797ccaa 100644 --- a/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java +++ b/libraries/src/test/java/com/baeldung/streamutils/CopyStreamTest.java @@ -18,83 +18,83 @@ import static com.baeldung.streamutils.CopyStream.getStringFromInputStream; public class CopyStreamTest { - @Test - public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - InputStream in = new FileInputStream(inputFileName); - OutputStream out = new FileOutputStream(outputFileName); + @Test + public void whenCopyInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); - StreamUtils.copy(in, out); + StreamUtils.copy(in, out); - assertTrue(outputFile.exists()); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent, outputFileContent); - } + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent, outputFileContent); + } - @Test - public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - InputStream in = new FileInputStream(inputFileName); - OutputStream out = new FileOutputStream(outputFileName); + @Test + public void whenCopyRangeOfInputStreamToOutputStream_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + InputStream in = new FileInputStream(inputFileName); + OutputStream out = new FileOutputStream(outputFileName); - StreamUtils.copyRange(in, out, 1, 10); + StreamUtils.copyRange(in, out, 1, 10); - assertTrue(outputFile.exists()); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); - } + assertTrue(outputFile.exists()); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(inputFileContent.substring(1, 11), outputFileContent); + } - @Test - public void whenCopyStringToOutputStream_thenCorrect() throws IOException { - String string = "Should be copied to OutputStream."; - String outputFileName = "src/test/resources/output.txt"; - File outputFile = new File(outputFileName); - OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + @Test + public void whenCopyStringToOutputStream_thenCorrect() throws IOException { + String string = "Should be copied to OutputStream."; + String outputFileName = "src/test/resources/output.txt"; + File outputFile = new File(outputFileName); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); - StreamUtils.copy(string, StandardCharsets.UTF_8, out); + StreamUtils.copy(string, StandardCharsets.UTF_8, out); - assertTrue(outputFile.exists()); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); - } + assertTrue(outputFile.exists()); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } - @Test - public void whenCopyInputStreamToString_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - InputStream is = new FileInputStream(inputFileName); - String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); + @Test + public void whenCopyInputStreamToString_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream is = new FileInputStream(inputFileName); + String content = StreamUtils.copyToString(is, StandardCharsets.UTF_8); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); - } + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } - @Test - public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException { - String outputFileName = "src/test/resources/output.txt"; - String string = "Should be copied to OutputStream."; - byte[] byteArray = string.getBytes(); - OutputStream out = new FileOutputStream("src/test/resources/output.txt"); + @Test + public void whenCopyByteArrayToOutputStream_thenCorrect() throws IOException { + String outputFileName = "src/test/resources/output.txt"; + String string = "Should be copied to OutputStream."; + byte[] byteArray = string.getBytes(); + OutputStream out = new FileOutputStream("src/test/resources/output.txt"); - StreamUtils.copy(byteArray, out); - String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); - Assert.assertEquals(outputFileContent, string); - } + StreamUtils.copy(byteArray, out); + String outputFileContent = getStringFromInputStream(new FileInputStream(outputFileName)); + Assert.assertEquals(outputFileContent, string); + } - @Test - public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException { - String inputFileName = "src/test/resources/input.txt"; - InputStream in = new FileInputStream(inputFileName); - byte[] out = StreamUtils.copyToByteArray(in); + @Test + public void whenCopyInputStreamToByteArray_thenCorrect() throws IOException { + String inputFileName = "src/test/resources/input.txt"; + InputStream in = new FileInputStream(inputFileName); + byte[] out = StreamUtils.copyToByteArray(in); - String content = new String(out); - String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); - Assert.assertEquals(inputFileContent, content); - } + String content = new String(out); + String inputFileContent = getStringFromInputStream(new FileInputStream(inputFileName)); + Assert.assertEquals(inputFileContent, content); + } } diff --git a/libraries/src/test/java/com/baeldung/text/DiffTest.java b/libraries/src/test/java/com/baeldung/text/DiffTest.java index 95370013b6..932fc96f21 100644 --- a/libraries/src/test/java/com/baeldung/text/DiffTest.java +++ b/libraries/src/test/java/com/baeldung/text/DiffTest.java @@ -6,13 +6,13 @@ import org.junit.Assert; import org.junit.Test; public class DiffTest { - + @Test public void whenEditScript_thenCorrect() { StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG"); EditScript script = cmp.getScript(); int mod = script.getModifications(); - + Assert.assertEquals(4, mod); } } diff --git a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java index 80ca0cfbba..e0a00afd84 100644 --- a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java +++ b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java @@ -11,15 +11,15 @@ public class LongestCommonSubsequenceTest { public void whenCompare_thenCorrect() { LongestCommonSubsequence lcs = new LongestCommonSubsequence(); int countLcs = lcs.apply("New York", "New Hampshire"); - + Assert.assertEquals(5, countLcs); } - + @Test public void whenCalculateDistance_thenCorrect() { LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance(); int countLcsd = lcsd.apply("New York", "New Hampshire"); - + Assert.assertEquals(11, countLcsd); } } diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java index f08b43f69b..4ebf00e1ed 100644 --- a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java +++ b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java @@ -13,12 +13,12 @@ public class StrBuilderTest { Assert.assertEquals(new StrBuilder("new StrBuilder!"), strBuilder); } - + @Test public void whenCleared_thenEmpty() { StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); strBuilder.clear(); - + Assert.assertEquals(new StrBuilder(""), strBuilder); } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java b/libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java similarity index 94% rename from libraries/src/test/java/com/baeldung/text/WordUtilsTest.java rename to libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java index fafba2fbb5..23712a2a3d 100644 --- a/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java +++ b/libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java @@ -4,7 +4,7 @@ import org.apache.commons.text.WordUtils; import org.junit.Assert; import org.junit.Test; -public class WordUtilsTest { +public class WordUtilsUnitTest { @Test public void whenCapitalized_thenCorrect() { diff --git a/libraries/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java b/libraries/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java new file mode 100644 index 0000000000..9224561341 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.tomcat; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Created by adi on 1/14/18. + */ +@RunWith(BlockJUnit4ClassRunner.class) +public class ProgrammaticTomcatIntegrationTest { + + private ProgrammaticTomcat tomcat = new ProgrammaticTomcat(); + + @Before + public void setUp() throws Exception { + tomcat.startTomcat(); + } + + @After + public void tearDown() throws Exception { + tomcat.stopTomcat(); + } + + @Test + public void givenTomcatStarted_whenAccessServlet_responseIsTestAndResponseHeaderIsSet() throws Exception { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + HttpGet getServlet = new HttpGet("http://localhost:8080/my-servlet"); + + HttpResponse response = httpClient.execute(getServlet); + assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); + + String myHeaderValue = response.getFirstHeader("myHeader").getValue(); + assertEquals("myHeaderValue", myHeaderValue); + + HttpEntity responseEntity = response.getEntity(); + assertNotNull(responseEntity); + + String responseString = EntityUtils.toString(responseEntity, "UTF-8"); + assertEquals("test", responseString); + } + +} diff --git a/libraries/src/test/java/com/baeldung/unirest/Article.java b/libraries/src/test/java/com/baeldung/unirest/Article.java new file mode 100644 index 0000000000..03fd4959b2 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/unirest/Article.java @@ -0,0 +1,39 @@ +package com.baeldung.unirest; + +public class Article { + + private String id; + private String title; + private String author; + + public Article(String id, String title, String author) { + super(); + this.id = id; + this.title = title; + this.author = author; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/unirest/HttpClientTest.java b/libraries/src/test/java/com/baeldung/unirest/HttpClientTest.java new file mode 100644 index 0000000000..3e919f031c --- /dev/null +++ b/libraries/src/test/java/com/baeldung/unirest/HttpClientTest.java @@ -0,0 +1,172 @@ +package com.baeldung.unirest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.apache.http.entity.ContentType; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.unirest.Article; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.JsonNode; +import com.mashape.unirest.http.ObjectMapper; +import com.mashape.unirest.http.Unirest; +import com.mashape.unirest.http.async.Callback; +import com.mashape.unirest.http.exceptions.UnirestException; + +public class HttpClientTest { + + @BeforeClass + public static void setup() { + // Unirest.setProxy(new HttpHost("localhost", 8080)); + Unirest.setTimeouts(20000, 15000); + Unirest.setDefaultHeader("X-app-name", "baeldung-unirest"); + Unirest.setDefaultHeader("X-request-id", "100004f00ab5"); + Unirest.setConcurrency(20, 5); + Unirest.setObjectMapper(new ObjectMapper() { + com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); + + public String writeValue(Object value) { + try { + return mapper.writeValueAsString(value); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + } + + public T readValue(String value, Class valueType) { + + try { + return mapper.readValue(value, valueType); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + }); + } + + @AfterClass + public static void tearDown() throws IOException { + Unirest.clearDefaultHeaders(); + Unirest.shutdown(); + } + + @Test + public void shouldReturnStatusOkay() throws UnirestException { + HttpResponse jsonResponse = Unirest.get("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154") + .header("accept", "application/json") + .queryString("apiKey", "123") + .asJson(); + assertNotNull(jsonResponse.getBody()); + assertEquals(200, jsonResponse.getStatus()); + } + + @Test + public void shouldReturnStatusAccepted() throws UnirestException { + + Map headers = new HashMap(); + headers.put("accept", "application/json"); + headers.put("Authorization", "Bearer 5a9ce37b3100004f00ab5154"); + + Map fields = new HashMap(); + fields.put("name", "Sam Baeldung"); + fields.put("id", "PSP123"); + + HttpResponse jsonResponse = Unirest.put("http://www.mocky.io/v2/5a9ce7853100002a00ab515e") + .headers(headers) + .fields(fields) + .asJson(); + assertNotNull(jsonResponse.getBody()); + assertEquals(202, jsonResponse.getStatus()); + } + + @Test + public void givenRequestBodyWhenCreatedThenCorrect() throws UnirestException { + + HttpResponse jsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") + .body("{\"name\":\"Sam Baeldung\", \"city\":\"viena\"}") + .asJson(); + assertEquals(201, jsonResponse.getStatus()); + } + + @Test + public void whenAysncRequestShouldReturnOk() throws InterruptedException, ExecutionException { + Future> future = Unirest.post("http://www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms") + .header("accept", "application/json") + .asJsonAsync(new Callback() { + + public void failed(UnirestException e) { + // Do something if the request failed + } + + public void completed(HttpResponse response) { + // Do something if the request is successful + } + + public void cancelled() { + // Do something if the request is cancelled + } + + }); + assertEquals(200, future.get() + .getStatus()); + + } + + @Test + public void givenArticleWhenCreatedThenCorrect() throws UnirestException { + Article article = new Article("ID1213", "Guide to Rest", "baeldung"); + HttpResponse jsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") + .body(article) + .asJson(); + assertEquals(201, jsonResponse.getStatus()); + } + + // @Test + public void givenFileWhenUploadedThenCorrect() throws UnirestException { + + HttpResponse jsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") + .field("file", new File("/path/to/file")) + .asJson(); + assertEquals(201, jsonResponse.getStatus()); + } + + // @Test + public void givenByteStreamWhenUploadedThenCorrect() throws IOException, UnirestException { + try (InputStream inputStream = new FileInputStream(new File("/path/to/file/artcile.txt"))) { + byte[] bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + HttpResponse jsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") + .field("file", bytes, "article.txt") + .asJson(); + assertEquals(201, jsonResponse.getStatus()); + } + + } + + // @Test + public void givenInputStreamWhenUploadedThenCorrect() throws UnirestException, IOException { + try (InputStream inputStream = new FileInputStream(new File("/path/to/file/artcile.txt"))) { + + HttpResponse jsonResponse = Unirest.post("http://www.mocky.io/v2/5a9ce7663100006800ab515d") + .field("file", inputStream, ContentType.APPLICATION_OCTET_STREAM, "article.txt") + .asJson(); + assertEquals(201, jsonResponse.getStatus()); + + } + } +} diff --git a/libraries/src/test/resources/dockerapi/Dockerfile b/libraries/src/test/resources/dockerapi/Dockerfile new file mode 100644 index 0000000000..f9ad47f032 --- /dev/null +++ b/libraries/src/test/resources/dockerapi/Dockerfile @@ -0,0 +1,8 @@ +FROM alpine:3.6 + +RUN apk --update add git openssh && \ + rm -rf /var/lib/apt/lists/* && \ + rm /var/cache/apk/* + +ENTRYPOINT ["git"] +CMD ["--help"] \ No newline at end of file diff --git a/libraries/src/test/resources/jetty-embedded-demo-app.war b/libraries/src/test/resources/jetty-embedded-demo-app.war new file mode 100644 index 0000000000..7f8bc37df0 Binary files /dev/null and b/libraries/src/test/resources/jetty-embedded-demo-app.war differ diff --git a/linkrest/pom.xml b/linkrest/pom.xml index aa2f0f8bda..0363f0bc4c 100644 --- a/linkrest/pom.xml +++ b/linkrest/pom.xml @@ -33,7 +33,7 @@ maven-compiler-plugin - 3.5 + 3.7.0 1.8 1.8 diff --git a/logging-modules/README.md b/logging-modules/README.md new file mode 100644 index 0000000000..6de71adb43 --- /dev/null +++ b/logging-modules/README.md @@ -0,0 +1,7 @@ + +## Logging Modules + +### Relevant Articles: + +- [Creating a Custom Logback Appender](http://www.baeldung.com/custom-logback-appender) +- [Get Log Output in JSON Format](http://www.baeldung.com/java-log-json-output) diff --git a/log-mdc/README.md b/logging-modules/log-mdc/README.md similarity index 100% rename from log-mdc/README.md rename to logging-modules/log-mdc/README.md diff --git a/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml similarity index 98% rename from log-mdc/pom.xml rename to logging-modules/log-mdc/pom.xml index e91d4e231e..5551585372 100644 --- a/log-mdc/pom.xml +++ b/logging-modules/log-mdc/pom.xml @@ -12,6 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java b/logging-modules/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/config/AppConfiguration.java diff --git a/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java b/logging-modules/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/config/AppInitializer.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/config/AppInitializer.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransactionFactory.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/Transfer.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/Transfer.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferDemo.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/TransferService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/TransferService.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JRunnable.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j/Log4JTransferService.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2Runnable.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/log4j2/Log4J2TransferService.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4TransferService.java diff --git a/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java b/logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/mdc/slf4j/Slf4jRunnable.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/Investment.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/Investment.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/Investment.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/Investment.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/JBossLoggingController.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4J2Controller.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/controller/Log4JController.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/InvestmentService.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/JBossLoggingInvestmentService.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4J2InvestmentService.java diff --git a/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java b/logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java similarity index 100% rename from log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java rename to logging-modules/log-mdc/src/main/java/com/baeldung/ndc/service/Log4JInvestmentService.java diff --git a/log-mdc/src/main/resources/log4j.properties b/logging-modules/log-mdc/src/main/resources/log4j.properties similarity index 100% rename from log-mdc/src/main/resources/log4j.properties rename to logging-modules/log-mdc/src/main/resources/log4j.properties diff --git a/log-mdc/src/main/resources/log4j2.xml b/logging-modules/log-mdc/src/main/resources/log4j2.xml similarity index 100% rename from log-mdc/src/main/resources/log4j2.xml rename to logging-modules/log-mdc/src/main/resources/log4j2.xml diff --git a/log-mdc/src/main/resources/logback.xml b/logging-modules/log-mdc/src/main/resources/logback.xml similarity index 100% rename from log-mdc/src/main/resources/logback.xml rename to logging-modules/log-mdc/src/main/resources/logback.xml diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java similarity index 100% rename from log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j/DemoIntegrationTest.java diff --git a/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java similarity index 100% rename from log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/log4j2/DemoIntegrationTest.java diff --git a/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java similarity index 100% rename from log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java rename to logging-modules/log-mdc/src/test/java/com/baeldung/mdc/slf4j/DemoIntegrationTest.java diff --git a/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java b/logging-modules/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java similarity index 100% rename from log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java rename to logging-modules/log-mdc/src/test/java/com/baeldung/ndc/NDCLogIntegrationTest.java diff --git a/log4j/README.md b/logging-modules/log4j/README.md similarity index 83% rename from log4j/README.md rename to logging-modules/log4j/README.md index 3c0258142c..8aae1b5826 100644 --- a/log4j/README.md +++ b/logging-modules/log4j/README.md @@ -2,6 +2,5 @@ - [Introduction to Java Logging](http://www.baeldung.com/java-logging-intro) - [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) - [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) -- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) - [A Guide to Rolling File Appenders](http://www.baeldung.com/java-logging-rolling-file-appenders) diff --git a/log4j/pom.xml b/logging-modules/log4j/pom.xml similarity index 96% rename from log4j/pom.xml rename to logging-modules/log4j/pom.xml index 20906c4c05..6a3fbde393 100644 --- a/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -11,6 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/log4j/Log4jExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jExample.java diff --git a/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/log4j/Log4jRollingExample.java diff --git a/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java similarity index 100% rename from log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java rename to logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2Example.java diff --git a/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/log4j2/Log4j2RollingExample.java diff --git a/log4j/src/main/java/com/baeldung/logback/LogbackExample.java b/logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/logback/LogbackExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackExample.java diff --git a/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/logback/LogbackRollingExample.java diff --git a/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java b/logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jExample.java diff --git a/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java similarity index 100% rename from log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java rename to logging-modules/log4j/src/main/java/com/baeldung/slf4j/Slf4jRollingExample.java diff --git a/log4j/src/main/resources/log4j.xml b/logging-modules/log4j/src/main/resources/log4j.xml similarity index 100% rename from log4j/src/main/resources/log4j.xml rename to logging-modules/log4j/src/main/resources/log4j.xml diff --git a/log4j/src/main/resources/log4j2.xml b/logging-modules/log4j/src/main/resources/log4j2.xml similarity index 100% rename from log4j/src/main/resources/log4j2.xml rename to logging-modules/log4j/src/main/resources/log4j2.xml diff --git a/log4j/src/main/resources/logback.xml b/logging-modules/log4j/src/main/resources/logback.xml similarity index 98% rename from log4j/src/main/resources/logback.xml rename to logging-modules/log4j/src/main/resources/logback.xml index f567962cb6..097f6694f0 100644 --- a/log4j/src/main/resources/logback.xml +++ b/logging-modules/log4j/src/main/resources/logback.xml @@ -78,7 +78,7 @@ - + diff --git a/log4j2/README.md b/logging-modules/log4j2/README.md similarity index 100% rename from log4j2/README.md rename to logging-modules/log4j2/README.md diff --git a/log4j2/pom.xml b/logging-modules/log4j2/pom.xml similarity index 93% rename from log4j2/pom.xml rename to logging-modules/log4j2/pom.xml index ea398af845..46b8b80597 100644 --- a/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -9,7 +9,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - .. + ../../ @@ -59,10 +59,10 @@ - 2.8.5 + 2.9.3 1.4.193 2.1.1 - 2.7 + 2.10.0 diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java similarity index 100% rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/CustomLoggingIntegrationTest.java diff --git a/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutTest.java new file mode 100644 index 0000000000..9493c32094 --- /dev/null +++ b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/JSONLayoutTest.java @@ -0,0 +1,45 @@ +package com.baeldung.logging.log4j2.tests; + +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JSONLayoutTest { + + private static Logger logger; + private ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); + private PrintStream ps = new PrintStream(consoleOutput); + + @Before + public void setUp() { + // Redirect console output to our stream + System.setOut(ps); + logger = LogManager.getLogger("CONSOLE_JSON_APPENDER"); + } + + @Test + public void whenLogLayoutInJSON_thenOutputIsCorrectJSON() { + logger.debug("Debug message"); + String currentLog = consoleOutput.toString(); + assertTrue(!currentLog.isEmpty() && isValidJSON(currentLog)); + } + + public static boolean isValidJSON(String jsonInString) { + try { + final ObjectMapper mapper = new ObjectMapper(); + mapper.readTree(jsonInString); + return true; + } catch (IOException e) { + return false; + } + } +} \ No newline at end of file diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java similarity index 100% rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/LambdaExpressionsIntegrationTest.java diff --git a/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java b/logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java similarity index 100% rename from log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java rename to logging-modules/log4j2/src/test/java/com/baeldung/logging/log4j2/tests/jdbc/ConnectionFactory.java diff --git a/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml b/logging-modules/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml similarity index 100% rename from log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml rename to logging-modules/log4j2/src/test/resources/log4j2-includes/console-appender_pattern-layout_colored.xml diff --git a/log4j2/src/test/resources/log4j2.xml b/logging-modules/log4j2/src/test/resources/log4j2.xml similarity index 50% rename from log4j2/src/test/resources/log4j2.xml rename to logging-modules/log4j2/src/test/resources/log4j2.xml index 21fd1da446..4dcb7cce5a 100644 --- a/log4j2/src/test/resources/log4j2.xml +++ b/logging-modules/log4j2/src/test/resources/log4j2.xml @@ -1,16 +1,25 @@ - + - + - + - + + + + + + @@ -19,53 +28,58 @@ - + - + - + - + - + - + - + - + - + + + + diff --git a/logging-modules/logback/README.md b/logging-modules/logback/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml new file mode 100644 index 0000000000..cd0d3758cc --- /dev/null +++ b/logging-modules/logback/pom.xml @@ -0,0 +1,51 @@ + + + + 4.0.0 + + logback + logback + 0.1-SNAPSHOT + + + UTF-8 + 1.2.3 + 0.1.5 + 2.9.3 + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + ch.qos.logback.contrib + logback-json-classic + ${logback.contrib.version} + + + ch.qos.logback.contrib + logback-jackson + ${logback.contrib.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java b/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java new file mode 100644 index 0000000000..e3d09dc321 --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/Example.java @@ -0,0 +1,14 @@ +package com.baeldung.logback; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Example { + + private static final Logger logger = LoggerFactory.getLogger(Example.class); + + public static void main(String[] args) { + logger.info("Example log from {}", Example.class.getSimpleName()); + } + +} diff --git a/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java new file mode 100644 index 0000000000..a25c54b96e --- /dev/null +++ b/logging-modules/logback/src/main/java/com/baeldung/logback/MapAppender.java @@ -0,0 +1,39 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public class MapAppender extends AppenderBase { + + private final ConcurrentMap eventMap + = new ConcurrentHashMap<>(); + + private String prefix; + + @Override + protected void append(final ILoggingEvent event) { + if (prefix == null || "".equals(prefix)) { + addError("Prefix is not set for MapAppender."); + return; + } + + eventMap.put(prefix + System.currentTimeMillis(), event); + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + public Map getEventMap() { + return eventMap; + } + +} diff --git a/logging-modules/logback/src/main/resources/logback.xml b/logging-modules/logback/src/main/resources/logback.xml new file mode 100644 index 0000000000..37ae2adbb0 --- /dev/null +++ b/logging-modules/logback/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + test + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutTest.java new file mode 100644 index 0000000000..ca3c4b3457 --- /dev/null +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/JSONLayoutTest.java @@ -0,0 +1,45 @@ +package com.baeldung.logback; + +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JSONLayoutTest { + + private static Logger logger; + private ByteArrayOutputStream consoleOutput = new ByteArrayOutputStream(); + private PrintStream ps = new PrintStream(consoleOutput); + + @Before + public void setUp() { + // Redirect console output to our stream + System.setOut(ps); + logger = LoggerFactory.getLogger("jsonLogger"); + } + + @Test + public void whenLogLayoutInJSON_thenOutputIsCorrectJSON() { + logger.debug("Debug message"); + String currentLog = consoleOutput.toString(); + assertTrue(!currentLog.isEmpty() && isValidJSON(currentLog)); + } + + public static boolean isValidJSON(String jsonInString) { + try { + final ObjectMapper mapper = new ObjectMapper(); + mapper.readTree(jsonInString); + return true; + } catch (IOException e) { + return false; + } + } +} diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java new file mode 100644 index 0000000000..20366a229d --- /dev/null +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.Logger; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +import static org.junit.Assert.assertEquals; + +public class MapAppenderIntegrationTest { + + private Logger rootLogger; + + @Before + public void setUp() throws Exception { + rootLogger = (Logger) LoggerFactory.getLogger("ROOT"); + } + + @Test + public void whenLoggerEmitsLoggingEvent_thenAppenderReceivesEvent() throws Exception { + rootLogger.info("Test from {}", this.getClass().getSimpleName()); + MapAppender appender = (MapAppender) rootLogger.getAppender("map"); + assertEquals(appender.getEventMap().size(), 1); + } + + @Test + public void givenNoPrefixSet_whenLoggerEmitsEvent_thenAppenderReceivesNoEvent() throws Exception { + rootLogger.info("Test from {}", this.getClass().getSimpleName()); + MapAppender appender = (MapAppender) rootLogger.getAppender("badMap"); + assertEquals(appender.getEventMap().size(), 0); + } + +} diff --git a/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java new file mode 100644 index 0000000000..a5a938a923 --- /dev/null +++ b/logging-modules/logback/src/test/java/com/baeldung/logback/MapAppenderTest.java @@ -0,0 +1,60 @@ +package com.baeldung.logback; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.BasicStatusManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class MapAppenderTest { + + private LoggerContext ctx; + + private MapAppender mapAppender = new MapAppender(); + + private LoggingEvent event; + + @Before + public void setUp() throws Exception { + ctx = new LoggerContext(); + ctx.setName("test context"); + ctx.setStatusManager(new BasicStatusManager()); + mapAppender.setContext(ctx); + mapAppender.setPrefix("prefix"); + event = new LoggingEvent("fqcn", ctx.getLogger("logger"), Level.INFO, "Test message for logback appender", null, new Object[0]); + ctx.start(); + } + + @After + public void tearDown() throws Exception { + ctx.stop(); + mapAppender.stop(); + } + + @Test + public void whenPrefixIsNull_thenMapAppenderDoesNotLog() throws Exception { + mapAppender.setPrefix(null); + mapAppender.append(event); + assertTrue(mapAppender.getEventMap().isEmpty()); + } + + @Test + public void whenPrefixIsEmpty_thenMapAppenderDoesNotLog() throws Exception { + mapAppender.setPrefix(""); + mapAppender.append(event); + assertTrue(mapAppender.getEventMap().isEmpty()); + } + + @Test + public void whenLogMessageIsEmitted_thenMapAppenderReceivesMessage() throws Exception { + mapAppender.append(event); + assertEquals(mapAppender.getEventMap().size(), 1); + mapAppender.getEventMap().forEach((k, v) -> assertTrue(k.startsWith("prefix"))); + } + +} diff --git a/logging-modules/logback/src/test/resources/logback-test.xml b/logging-modules/logback/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..df81f18cc2 --- /dev/null +++ b/logging-modules/logback/src/test/resources/logback-test.xml @@ -0,0 +1,31 @@ + + + + + + test + + + + + # JSON appender + + + + true + + yyyy-MM-dd' 'HH:mm:ss.SSS + + + + + + + + + + + + + \ No newline at end of file diff --git a/lucene/.gitignore b/lucene/.gitignore new file mode 100644 index 0000000000..3ed87faec7 --- /dev/null +++ b/lucene/.gitignore @@ -0,0 +1 @@ +/index/ diff --git a/lucene/README.md b/lucene/README.md new file mode 100644 index 0000000000..b1d33472f4 --- /dev/null +++ b/lucene/README.md @@ -0,0 +1,4 @@ +### Relevant Articles: + +- [Introduction to Apache Lucene](http://www.baeldung.com/lucene) +- [A Simple File Search with Lucene](http://www.baeldung.com/lucene-file-search) diff --git a/lucene/pom.xml b/lucene/pom.xml new file mode 100644 index 0000000000..6659d9ac32 --- /dev/null +++ b/lucene/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + lucene + 0.0.1-SNAPSHOT + lucene + An Apache Lucene demo application + + + + + org.apache.lucene + lucene-core + 7.1.0 + + + + org.apache.lucene + lucene-queryparser + 7.1.0 + + + + junit + junit + 4.12 + test + + + \ No newline at end of file diff --git a/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java new file mode 100644 index 0000000000..97b1ec7b5d --- /dev/null +++ b/lucene/src/main/java/com/baeldung/lucene/InMemoryLuceneIndex.java @@ -0,0 +1,128 @@ +package com.baeldung.lucene; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.SortedDocValuesField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.index.Term; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.Sort; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; +import org.apache.lucene.util.BytesRef; + +public class InMemoryLuceneIndex { + + private Directory memoryIndex; + private StandardAnalyzer analyzer; + + public InMemoryLuceneIndex(Directory memoryIndex, StandardAnalyzer analyzer) { + super(); + this.memoryIndex = memoryIndex; + this.analyzer = analyzer; + } + + /** + * + * @param title + * @param body + */ + public void indexDocument(String title, String body) { + + IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); + try { + IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig); + Document document = new Document(); + + document.add(new TextField("title", title, Field.Store.YES)); + document.add(new TextField("body", body, Field.Store.YES)); + document.add(new SortedDocValuesField("title", new BytesRef(title))); + + writter.addDocument(document); + writter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public List searchIndex(String inField, String queryString) { + try { + Query query = new QueryParser(inField, analyzer).parse(queryString); + + IndexReader indexReader = DirectoryReader.open(memoryIndex); + IndexSearcher searcher = new IndexSearcher(indexReader); + TopDocs topDocs = searcher.search(query, 10); + List documents = new ArrayList<>(); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + documents.add(searcher.doc(scoreDoc.doc)); + } + + return documents; + } catch (IOException | ParseException e) { + e.printStackTrace(); + } + return null; + + } + + public void deleteDocument(Term term) { + try { + IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); + IndexWriter writter = new IndexWriter(memoryIndex, indexWriterConfig); + writter.deleteDocuments(term); + writter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public List searchIndex(Query query) { + try { + IndexReader indexReader = DirectoryReader.open(memoryIndex); + IndexSearcher searcher = new IndexSearcher(indexReader); + TopDocs topDocs = searcher.search(query, 10); + List documents = new ArrayList<>(); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + documents.add(searcher.doc(scoreDoc.doc)); + } + + return documents; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + + } + + public List searchIndex(Query query, Sort sort) { + try { + IndexReader indexReader = DirectoryReader.open(memoryIndex); + IndexSearcher searcher = new IndexSearcher(indexReader); + TopDocs topDocs = searcher.search(query, 10, sort); + List documents = new ArrayList<>(); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + documents.add(searcher.doc(scoreDoc.doc)); + } + + return documents; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + + } + +} diff --git a/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java b/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java new file mode 100644 index 0000000000..1d090d55fc --- /dev/null +++ b/lucene/src/main/java/com/baeldung/lucene/LuceneFileSearch.java @@ -0,0 +1,80 @@ +package com.baeldung.lucene; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; + +public class LuceneFileSearch { + + private Directory indexDirectory; + private StandardAnalyzer analyzer; + + public LuceneFileSearch(Directory fsDirectory, StandardAnalyzer analyzer) { + super(); + this.indexDirectory = fsDirectory; + this.analyzer = analyzer; + } + + public void addFileToIndex(String filepath) throws IOException, URISyntaxException { + + Path path = Paths.get(getClass().getClassLoader().getResource(filepath).toURI()); + File file = path.toFile(); + IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); + IndexWriter indexWriter = new IndexWriter(indexDirectory, indexWriterConfig); + Document document = new Document(); + + FileReader fileReader = new FileReader(file); + document.add(new TextField("contents", fileReader)); + document.add(new StringField("path", file.getPath(), Field.Store.YES)); + document.add(new StringField("filename", file.getName(), Field.Store.YES)); + + indexWriter.addDocument(document); + + indexWriter.close(); + } + + public List searchFiles(String inField, String queryString) { + try { + Query query = new QueryParser(inField, analyzer).parse(queryString); + + IndexReader indexReader = DirectoryReader.open(indexDirectory); + IndexSearcher searcher = new IndexSearcher(indexReader); + TopDocs topDocs = searcher.search(query, 10); + List documents = new ArrayList<>(); + for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + documents.add(searcher.doc(scoreDoc.doc)); + } + + return documents; + } catch (IOException | ParseException e) { + e.printStackTrace(); + } + return null; + + } + +} + + diff --git a/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java b/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java new file mode 100644 index 0000000000..4345057ff7 --- /dev/null +++ b/lucene/src/test/java/com/baeldung/lucene/LuceneFileSearchTest.java @@ -0,0 +1,32 @@ +package com.baeldung.lucene; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.junit.Assert; +import org.junit.Test; + +public class LuceneFileSearchTest { + + @Test + public void givenSearchQueryWhenFetchedFileNamehenCorrect() throws IOException, URISyntaxException { + String indexPath = "index"; + String dataPath = "data/file1.txt"; + + Directory directory = FSDirectory.open(Paths.get(indexPath)); + LuceneFileSearch luceneFileSearch = new LuceneFileSearch(directory, new StandardAnalyzer()); + + luceneFileSearch.addFileToIndex(dataPath); + + List docs = luceneFileSearch.searchFiles("contents", "consectetur"); + + Assert.assertEquals("file1.txt", docs.get(0).get("filename")); + } + +} \ No newline at end of file diff --git a/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java new file mode 100644 index 0000000000..acf688cb99 --- /dev/null +++ b/lucene/src/test/java/com/baeldung/lucene/LuceneInMemorySearchTest.java @@ -0,0 +1,152 @@ +package com.baeldung.lucene; + +import java.util.List; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.BooleanClause; +import org.apache.lucene.search.BooleanQuery; +import org.apache.lucene.search.FuzzyQuery; +import org.apache.lucene.search.PhraseQuery; +import org.apache.lucene.search.PrefixQuery; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Sort; +import org.apache.lucene.search.SortField; +import org.apache.lucene.search.TermQuery; +import org.apache.lucene.search.WildcardQuery; +import org.apache.lucene.store.RAMDirectory; +import org.apache.lucene.util.BytesRef; +import org.junit.Assert; +import org.junit.Test; + +public class LuceneInMemorySearchTest { + + @Test + public void givenSearchQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("Hello world", "Some hello world "); + + List documents = inMemoryLuceneIndex.searchIndex("body", "world"); + + Assert.assertEquals("Hello world", documents.get(0).get("title")); + } + + @Test + public void givenTermQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("activity", "running in track"); + inMemoryLuceneIndex.indexDocument("activity", "Cars are running on road"); + + Term term = new Term("body", "running"); + Query query = new TermQuery(term); + + List documents = inMemoryLuceneIndex.searchIndex(query); + Assert.assertEquals(2, documents.size()); + } + + @Test + public void givenPrefixQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("article", "Lucene introduction"); + inMemoryLuceneIndex.indexDocument("article", "Introduction to Lucene"); + + Term term = new Term("body", "intro"); + Query query = new PrefixQuery(term); + + List documents = inMemoryLuceneIndex.searchIndex(query); + Assert.assertEquals(2, documents.size()); + } + + @Test + public void givenBooleanQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("Destination", "Las Vegas singapore car"); + inMemoryLuceneIndex.indexDocument("Commutes in singapore", "Bus Car Bikes"); + + Term term1 = new Term("body", "singapore"); + Term term2 = new Term("body", "car"); + + TermQuery query1 = new TermQuery(term1); + TermQuery query2 = new TermQuery(term2); + + BooleanQuery booleanQuery = new BooleanQuery.Builder().add(query1, BooleanClause.Occur.MUST) + .add(query2, BooleanClause.Occur.MUST).build(); + + List documents = inMemoryLuceneIndex.searchIndex(booleanQuery); + Assert.assertEquals(1, documents.size()); + } + + @Test + public void givenPhraseQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("quotes", "A rose by any other name would smell as sweet."); + + Query query = new PhraseQuery(1, "body", new BytesRef("smell"), new BytesRef("sweet")); + List documents = inMemoryLuceneIndex.searchIndex(query); + + Assert.assertEquals(1, documents.size()); + } + + @Test + public void givenFuzzyQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("article", "Halloween Festival"); + inMemoryLuceneIndex.indexDocument("decoration", "Decorations for Halloween"); + + Term term = new Term("body", "hallowen"); + Query query = new FuzzyQuery(term); + + List documents = inMemoryLuceneIndex.searchIndex(query); + Assert.assertEquals(2, documents.size()); + } + + @Test + public void givenWildCardQueryWhenFetchedDocumentThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("article", "Lucene introduction"); + inMemoryLuceneIndex.indexDocument("article", "Introducing Lucene with Spring"); + + Term term = new Term("body", "intro*"); + Query query = new WildcardQuery(term); + + List documents = inMemoryLuceneIndex.searchIndex(query); + Assert.assertEquals(2, documents.size()); + } + + @Test + public void givenSortFieldWhenSortedThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("Ganges", "River in India"); + inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia"); + inMemoryLuceneIndex.indexDocument("Amazon", "Rain forest river"); + inMemoryLuceneIndex.indexDocument("Rhine", "Belongs to Europe"); + inMemoryLuceneIndex.indexDocument("Nile", "Longest River"); + + Term term = new Term("body", "river"); + Query query = new WildcardQuery(term); + + SortField sortField = new SortField("title", SortField.Type.STRING_VAL, false); + Sort sortByTitle = new Sort(sortField); + + List documents = inMemoryLuceneIndex.searchIndex(query, sortByTitle); + Assert.assertEquals(4, documents.size()); + Assert.assertEquals("Amazon", documents.get(0).getField("title").stringValue()); + } + + @Test + public void whenDocumentDeletedThenCorrect() { + InMemoryLuceneIndex inMemoryLuceneIndex = new InMemoryLuceneIndex(new RAMDirectory(), new StandardAnalyzer()); + inMemoryLuceneIndex.indexDocument("Ganges", "River in India"); + inMemoryLuceneIndex.indexDocument("Mekong", "This river flows in south Asia"); + + Term term = new Term("title", "ganges"); + inMemoryLuceneIndex.deleteDocument(term); + + Query query = new TermQuery(term); + + List documents = inMemoryLuceneIndex.searchIndex(query); + Assert.assertEquals(0, documents.size()); + } + +} \ No newline at end of file diff --git a/lucene/src/test/resources/data/file1.txt b/lucene/src/test/resources/data/file1.txt new file mode 100644 index 0000000000..6f915d3927 --- /dev/null +++ b/lucene/src/test/resources/data/file1.txt @@ -0,0 +1,3 @@ +Cras auctor viverra arcu, id consequat diam posuere id. Pellentesque hendrerit felis tortor, et ornare nibh ullamcorper sed. Aenean sed mauris vitae purus auctor gravida. Nam aliquam egestas orci, sit amet imperdiet leo porttitor quis. Integer commodo sodales orci, ultrices vulputate arcu vestibulum non. Nunc at tellus id urna tristique ultrices in in massa. Vestibulum laoreet ullamcorper nulla vel porttitor. Duis blandit commodo elit at consequat. Vestibulum faucibus lectus eget mi tincidunt, quis molestie lacus mollis. Duis elementum urna eros, non iaculis est facilisis in. Praesent et neque vel ipsum viverra euismod ac ac metus. Ut vitae libero ex. + +Proin consectetur, neque nec feugiat facilisis, metus libero mollis arcu, id pharetra nibh sapien in elit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam pulvinar fringilla orci in posuere. Duis ut turpis dignissim nisl eleifend posuere nec a massa. Cras fringilla iaculis ipsum a aliquet. Nunc ultrices nisl ipsum, vitae consectetur tellus vehicula in. Aliquam lacinia elit nec scelerisque dapibus. Duis pharetra mauris vitae quam tincidunt, viverra iaculis orci iaculis. Nunc gravida sem arcu, et mollis leo porttitor nec. Ut dictum tempor est, at fringilla ex feugiat sed. Nullam purus mi, aliquet eu libero ut, finibus efficitur metus. \ No newline at end of file diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md index 3223eb2478..1d4d4995a8 100644 --- a/mesos-marathon/README.md +++ b/mesos-marathon/README.md @@ -1,3 +1,5 @@ ### Relevant articles - [Simple Jenkins Pipeline with Marathon and Mesos](http://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) + + To run the pipeline, please modify the dockerise.sh file with your own useranema and password for docker login. diff --git a/metrics/README.md b/metrics/README.md index 09fe925604..c7772bffa0 100644 --- a/metrics/README.md +++ b/metrics/README.md @@ -2,3 +2,4 @@ - [Intro to Dropwizard Metrics](http://www.baeldung.com/dropwizard-metrics) - [Introduction to Netflix Servo](http://www.baeldung.com/netflix-servo) +- [Quick Guide to Micrometer](http://www.baeldung.com/micrometer) diff --git a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasTest.java b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasTest.java index 826e06d598..b76dc40ba0 100644 --- a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasTest.java @@ -1,27 +1,40 @@ package com.baeldung.metrics.micrometer; -import com.netflix.spectator.atlas.AtlasConfig; +import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import io.micrometer.atlas.AtlasMeterRegistry; -import io.micrometer.core.instrument.*; +import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.DistributionSummary; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.LongTaskTimer; +import io.micrometer.core.instrument.Measurement; +import io.micrometer.core.instrument.Meter.Type; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.core.instrument.stats.hist.Histogram; import io.micrometer.core.instrument.stats.quantile.WindowSketchQuantiles; -import org.junit.Before; -import org.junit.Test; import java.time.Duration; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static io.micrometer.core.instrument.Meter.Type; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.collection.IsMapContaining.hasEntry; -import static org.hamcrest.core.IsCollectionContaining.hasItems; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; +import org.junit.Before; +import org.junit.Test; + +import com.netflix.spectator.atlas.AtlasConfig; /** * @author aiet @@ -135,15 +148,15 @@ public class MicrometerAtlasTest { Timer timer = registry.timer("app.event"); timer.record(() -> { try { - TimeUnit.MILLISECONDS.sleep(1500); + TimeUnit.MILLISECONDS.sleep(15); } catch (InterruptedException ignored) { } }); - timer.record(3000, TimeUnit.MILLISECONDS); + timer.record(30, TimeUnit.MILLISECONDS); assertTrue(2 == timer.count()); - assertTrue(4510 > timer.totalTime(TimeUnit.MILLISECONDS) && 4500 <= timer.totalTime(TimeUnit.MILLISECONDS)); + assertTrue(50 > timer.totalTime(TimeUnit.MILLISECONDS) && 45 <= timer.totalTime(TimeUnit.MILLISECONDS)); } @Test @@ -155,12 +168,12 @@ public class MicrometerAtlasTest { long currentTaskId = longTaskTimer.start(); try { - TimeUnit.SECONDS.sleep(2); + TimeUnit.MILLISECONDS.sleep(2); } catch (InterruptedException ignored) { } long timeElapsed = longTaskTimer.stop(currentTaskId); - assertTrue(timeElapsed / (int) 1e9 == 2); + assertTrue(timeElapsed / (int) 1e6 == 2); } @Test diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java index 99009f8d84..237092b1c3 100644 --- a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java @@ -1,5 +1,19 @@ package com.baeldung.metrics.servo; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.stream.Collectors.toMap; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasEntry; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.util.Map; + +import org.junit.Ignore; +import org.junit.Test; + import com.netflix.servo.monitor.BasicCounter; import com.netflix.servo.monitor.BasicGauge; import com.netflix.servo.monitor.BasicInformational; @@ -17,18 +31,6 @@ import com.netflix.servo.monitor.StatsTimer; import com.netflix.servo.monitor.StepCounter; import com.netflix.servo.monitor.Stopwatch; import com.netflix.servo.stats.StatsConfig; -import org.junit.Ignore; -import org.junit.Test; - -import java.util.Map; - -import static java.util.concurrent.TimeUnit.SECONDS; -import static java.util.stream.Collectors.toMap; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasEntry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; public class MetricTypeTest { @@ -104,17 +106,18 @@ public class MetricTypeTest { public void givenTimer_whenExecuteTask_thenTimerUpdated() throws Exception { BasicTimer timer = new BasicTimer(MonitorConfig .builder("test") - .build(), SECONDS); + .build(), MILLISECONDS); Stopwatch stopwatch = timer.start(); - SECONDS.sleep(1); - timer.record(2, SECONDS); + MILLISECONDS.sleep(1); + timer.record(2, MILLISECONDS); stopwatch.stop(); - assertEquals("timer should count 1 second", 1, timer + assertEquals("timer should count 1 millisecond", 1, timer .getValue() .intValue()); - assertEquals("timer should count 3 seconds in total", 3.0, timer.getTotalTime(), 0.01); + assertEquals("timer should count 3 millisecond in total", 3, timer.getTotalTime() + .intValue()); assertEquals("timer should record 2 updates", 2, timer .getCount() .intValue()); @@ -158,6 +161,7 @@ public class MetricTypeTest { } @Test + //== public void givenStatsTimer_whenExecuteTask_thenStatsCalculated() throws Exception { System.setProperty("netflix.servo", "1000"); StatsTimer timer = new StatsTimer(MonitorConfig @@ -171,20 +175,20 @@ public class MetricTypeTest { .withPublishMean(true) .withPublishStdDev(true) .withPublishVariance(true) - .build(), SECONDS); + .build(), MILLISECONDS); Stopwatch stopwatch = timer.start(); - SECONDS.sleep(1); - timer.record(3, SECONDS); + MILLISECONDS.sleep(1); + timer.record(3, MILLISECONDS); stopwatch.stop(); stopwatch = timer.start(); - timer.record(6, SECONDS); - SECONDS.sleep(2); + timer.record(6, MILLISECONDS); + MILLISECONDS.sleep(2); stopwatch.stop(); - assertEquals("timer should count 12 seconds in total", 12, timer.getTotalTime()); - assertEquals("timer should count 12 seconds in total", 12, timer.getTotalMeasurement()); + assertEquals("timer should count 12 milliseconds in total", 12, timer.getTotalTime()); + assertEquals("timer should count 12 milliseconds in total", 12, timer.getTotalMeasurement()); assertEquals("timer should record 4 updates", 4, timer.getCount()); assertEquals("stats timer value time-cost/update should be 2", 3, timer .getValue() diff --git a/microprofile/pom.xml b/microprofile/pom.xml new file mode 100644 index 0000000000..ce8a2d13ca --- /dev/null +++ b/microprofile/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + com.baeldung + microprofile + 1.0-SNAPSHOT + war + + + UTF-8 + UTF-8 + 1.8 + 1.8 + library + ${project.build.directory}/${app.name}-service.jar + runnable + + + + + org.eclipse.microprofile + microprofile + 1.2 + provided + pom + + + + + + + maven-war-plugin + + false + pom.xml + + + + net.wasdev.wlp.maven.plugins + liberty-maven-plugin + 2.1.2 + + + io.openliberty + openliberty-runtime + 17.0.0.4 + zip + + ${basedir}/src/main/liberty/config/server.xml + ${package.file} + ${packaging.type} + false + project + + / + ${project.artifactId}-${project.version}.war + 9080 + 9443 + + + + + install-server + prepare-package + + install-server + create-server + install-feature + + + + package-server-with-apps + package + + install-apps + package-server + + + + + + + + diff --git a/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java b/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java new file mode 100644 index 0000000000..f5eccf969e --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/LibraryApplication.java @@ -0,0 +1,8 @@ +package com.baeldung.microprofile; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +@ApplicationPath("/library") +public class LibraryApplication extends Application { +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/model/Book.java b/microprofile/src/main/java/com/baeldung/microprofile/model/Book.java new file mode 100644 index 0000000000..44b7f5428d --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/model/Book.java @@ -0,0 +1,50 @@ +package com.baeldung.microprofile.model; + +public class Book { + + private String id; + private String isbn; + private String name; + private String author; + private Integer pages; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java new file mode 100644 index 0000000000..f7d0bfc5f7 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookListMessageBodyWriter.java @@ -0,0 +1,42 @@ +package com.baeldung.microprofile.providers; + +import com.baeldung.microprofile.model.Book; +import com.baeldung.microprofile.util.BookMapper; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonWriter; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.List; + +@Provider +@Produces(MediaType.APPLICATION_JSON) +public class BookListMessageBodyWriter implements MessageBodyWriter> { + + @Override + public boolean isWriteable(Class clazz, Type genericType, Annotation[] annotations, MediaType mediaType) { + return true; + } + + @Override + public long getSize(List books, Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return 0; + } + + @Override + public void writeTo(List books, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { + JsonWriter jsonWriter = Json.createWriter(entityStream); + JsonArray jsonArray = BookMapper.map(books); + jsonWriter.writeArray(jsonArray); + jsonWriter.close(); + } +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java new file mode 100644 index 0000000000..26ce4c1b64 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyReader.java @@ -0,0 +1,30 @@ +package com.baeldung.microprofile.providers; + +import com.baeldung.microprofile.model.Book; +import com.baeldung.microprofile.util.BookMapper; + +import javax.ws.rs.Consumes; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +@Provider +@Consumes(MediaType.APPLICATION_JSON) +public class BookMessageBodyReader implements MessageBodyReader { + + @Override + public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return type.equals(Book.class); + } + + @Override + public Book readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { + return BookMapper.map(entityStream); + } +} \ No newline at end of file diff --git a/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java new file mode 100644 index 0000000000..9bc6e89958 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/providers/BookMessageBodyWriter.java @@ -0,0 +1,57 @@ +package com.baeldung.microprofile.providers; + +import com.baeldung.microprofile.model.Book; +import com.baeldung.microprofile.util.BookMapper; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonWriter; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Provider; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +@Provider +@Produces(MediaType.APPLICATION_JSON) +public class BookMessageBodyWriter implements MessageBodyWriter { + @Override + public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return type.equals(Book.class); + } + + /* + Deprecated in JAX RS 2.0 + */ + @Override + public long getSize(Book book, Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { + return 0; + } + + /** + * Marsahl Book to OutputStream + * + * @param book + * @param type + * @param genericType + * @param annotations + * @param mediaType + * @param httpHeaders + * @param entityStream + * @throws IOException + * @throws WebApplicationException + */ + @Override + public void writeTo(Book book, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { + JsonWriter jsonWriter = Json.createWriter(entityStream); + JsonObject jsonObject = BookMapper.map(book); + jsonWriter.writeObject(jsonObject); + jsonWriter.close(); + } + +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java b/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java new file mode 100644 index 0000000000..924cf0ce71 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/repo/BookManager.java @@ -0,0 +1,53 @@ +package com.baeldung.microprofile.repo; + +import com.baeldung.microprofile.model.Book; + +import javax.enterprise.context.ApplicationScoped; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicInteger; + +@ApplicationScoped +public class BookManager { + + private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM"); + private AtomicInteger bookIdGenerator = new AtomicInteger(0); + + private ConcurrentMap inMemoryStore = new ConcurrentHashMap<>(); + + public BookManager() { + Book book = new Book(); + book.setId(getNextId()); + book.setName("Building Microservice With Eclipse MicroProfile"); + book.setIsbn("1"); + book.setAuthor("baeldung"); + book.setPages(420); + inMemoryStore.put(book.getId(), book); + } + + private String getNextId() { + String date = LocalDate.now().format(formatter); + return String.format("%04d-%s", bookIdGenerator.incrementAndGet(), date); + } + + public String add(Book book) { + String id = getNextId(); + book.setId(id); + inMemoryStore.put(id, book); + return id; + } + + public Book get(String id) { + return inMemoryStore.get(id); + } + + public List getAll() { + List books = new ArrayList<>(); + books.addAll(inMemoryStore.values()); + return books; + } +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java b/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java new file mode 100644 index 0000000000..861b172299 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/util/BookMapper.java @@ -0,0 +1,72 @@ +package com.baeldung.microprofile.util; + +import com.baeldung.microprofile.model.Book; + +import javax.json.*; +import java.io.InputStream; +import java.util.List; + +public class BookMapper { + + public static JsonObject map(Book book) { + JsonObjectBuilder builder = Json.createObjectBuilder(); + addValue(builder, "id", book.getId()); + addValue(builder, "isbn", book.getIsbn()); + addValue(builder, "name", book.getName()); + addValue(builder, "author", book.getAuthor()); + addValue(builder, "pages", book.getPages()); + return builder.build(); + } + + private static void addValue(JsonObjectBuilder builder, String key, Object value) { + if (value != null) { + builder.add(key, value.toString()); + } else { + builder.addNull(key); + } + } + + public static JsonArray map(List books) { + final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + books.forEach(book -> { + JsonObject jsonObject = map(book); + arrayBuilder.add(jsonObject); + }); + return arrayBuilder.build(); + } + + public static Book map(InputStream is) { + try(JsonReader jsonReader = Json.createReader(is)) { + JsonObject jsonObject = jsonReader.readObject(); + Book book = new Book(); + book.setId(getStringFromJson("id", jsonObject)); + book.setIsbn(getStringFromJson("isbn", jsonObject)); + book.setName(getStringFromJson("name", jsonObject)); + book.setAuthor(getStringFromJson("author", jsonObject)); + book.setPages(getIntFromJson("pages",jsonObject)); + return book; + } + } + + private static String getStringFromJson(String key, JsonObject json) { + String returnedString = null; + if (json.containsKey(key)) { + JsonString value = json.getJsonString(key); + if (value != null) { + returnedString = value.getString(); + } + } + return returnedString; + } + + private static Integer getIntFromJson(String key, JsonObject json) { + Integer returnedValue = null; + if (json.containsKey(key)) { + JsonNumber value = json.getJsonNumber(key); + if (value != null) { + returnedValue = value.intValue(); + } + } + return returnedValue; + } +} diff --git a/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java b/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java new file mode 100644 index 0000000000..13143a5644 --- /dev/null +++ b/microprofile/src/main/java/com/baeldung/microprofile/web/BookEndpoint.java @@ -0,0 +1,42 @@ +package com.baeldung.microprofile.web; + +import com.baeldung.microprofile.model.Book; +import com.baeldung.microprofile.repo.BookManager; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; + +@Path("books") +@RequestScoped +public class BookEndpoint { + + @Inject + private BookManager bookManager; + + @GET + @Path("{id}") + @Produces(MediaType.APPLICATION_JSON) + public Response getBook(@PathParam("id") String id) { + Book book = bookManager.get(id); + return Response.ok(book).build(); + } + + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getAllBooks() { + return Response.ok(bookManager.getAll()).build(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + public Response add(Book book) { + String bookId = bookManager.add(book); + return Response.created( + UriBuilder.fromResource(this.getClass()).path(bookId).build()) + .build(); + } +} diff --git a/microprofile/src/main/liberty/config/server.xml b/microprofile/src/main/liberty/config/server.xml new file mode 100644 index 0000000000..2b855bee05 --- /dev/null +++ b/microprofile/src/main/liberty/config/server.xml @@ -0,0 +1,11 @@ + + + jaxrs-2.0 + cdi-1.2 + jsonp-1.0 + + + + + diff --git a/muleesb/.gitignore b/muleesb/.gitignore new file mode 100644 index 0000000000..541f92c42e --- /dev/null +++ b/muleesb/.gitignore @@ -0,0 +1 @@ +# Add any directories, files, or patterns you don't want to be tracked by version control \ No newline at end of file diff --git a/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor b/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor new file mode 100644 index 0000000000..0b8060f303 --- /dev/null +++ b/muleesb/.mule/objectstore/b2fe1a90-c473-11e7-8eb5-98e7f44e8ac8/partition-descriptor @@ -0,0 +1 @@ +DEFAULT_PARTITION \ No newline at end of file diff --git a/muleesb/.mule/queue-tx-log/tx1.log b/muleesb/.mule/queue-tx-log/tx1.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/muleesb/.mule/queue-tx-log/tx2.log b/muleesb/.mule/queue-tx-log/tx2.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/muleesb/.mule/queue-xa-tx-log/tx1.log b/muleesb/.mule/queue-xa-tx-log/tx1.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/muleesb/.mule/queue-xa-tx-log/tx2.log b/muleesb/.mule/queue-xa-tx-log/tx2.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/muleesb/README.md b/muleesb/README.md new file mode 100644 index 0000000000..8da4e595e3 --- /dev/null +++ b/muleesb/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Getting Started With Mule ESB](http://www.baeldung.com/mule-esb) diff --git a/muleesb/mule-project.xml b/muleesb/mule-project.xml new file mode 100644 index 0000000000..0d522b0141 --- /dev/null +++ b/muleesb/mule-project.xml @@ -0,0 +1,5 @@ + + + muleesb + + diff --git a/muleesb/pom.xml b/muleesb/pom.xml new file mode 100644 index 0000000000..2c88bf83da --- /dev/null +++ b/muleesb/pom.xml @@ -0,0 +1,214 @@ + + + + 4.0.0 + com.mycompany + muleesb + 1.0.0-SNAPSHOT + mule + Mule muleesb Application + + + UTF-8 + UTF-8 + + 3.8.1 + 1.2 + 1.3.6 + 3.9.0 + + + + + + org.mule.tools.maven + mule-app-maven-plugin + ${mule.tools.version} + true + + true + + + + org.mule.tools + muleesb-maven-plugin + 1.0 + + 3.7.0 + /home/abir/AnypointStudio/workspace/variablescopetest + + + + deploy + + start + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + add-resource + generate-resources + + add-resource + + + + + src/main/app/ + + + mappings/ + + + src/main/api/ + + + + + + + + com.mulesoft.munit.tools + munit-maven-plugin + ${munit.version} + + + test + test + + test + + + + + + true + + html + + + + + + + + src/test/munit + + + src/test/resources + + + + + + + + + org.mule.modules + mule-module-spring-config + ${mule.version} + provided + + + + org.mule.transports + mule-transport-file + ${mule.version} + provided + + + org.mule.transports + mule-transport-http + ${mule.version} + provided + + + org.mule.transports + mule-transport-jdbc + ${mule.version} + provided + + + org.mule.transports + mule-transport-jms + ${mule.version} + provided + + + org.mule.transports + mule-transport-vm + ${mule.version} + provided + + + + org.mule.modules + mule-module-scripting + ${mule.version} + provided + + + org.mule.modules + mule-module-xml + ${mule.version} + provided + + + + org.mule.tests + mule-tests-functional + ${mule.version} + test + + + org.mule.modules + mule-module-apikit + ${mule.version} + provided + + + com.mulesoft.munit + mule-munit-support + ${mule.munit.support.version} + test + + + com.mulesoft.munit + munit-runner + ${munit.version} + test + + + + + + Central + Central + http://repo1.maven.org/maven2/ + default + + + mulesoft-releases + MuleSoft Releases Repository + http://repository.mulesoft.org/releases/ + default + + + + + mulesoft-release + mulesoft release repository + default + http://repository.mulesoft.org/releases/ + + false + + + + diff --git a/muleesb/src/main/app/mule-app.properties b/muleesb/src/main/app/mule-app.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/muleesb/src/main/app/mule-deploy.properties b/muleesb/src/main/app/mule-deploy.properties new file mode 100644 index 0000000000..07eabe9cc6 --- /dev/null +++ b/muleesb/src/main/app/mule-deploy.properties @@ -0,0 +1,6 @@ +#** GENERATED CONTENT ** Mule Application Deployment Descriptor +#Mon Nov 06 15:54:37 BDT 2017 +redeployment.enabled=true +encoding=UTF-8 +domain=default +config.resources=variablescopetest.xml diff --git a/muleesb/src/main/app/variablescopetest.xml b/muleesb/src/main/app/variablescopetest.xml new file mode 100644 index 0000000000..518b901084 --- /dev/null +++ b/muleesb/src/main/app/variablescopetest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java b/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java new file mode 100644 index 0000000000..0e180062a7 --- /dev/null +++ b/muleesb/src/main/java/com/baeldung/transformer/FromFlow2Component.java @@ -0,0 +1,18 @@ +package com.baeldung.transformer; + +import org.mule.api.MuleEventContext; +import org.mule.api.MuleMessage; +import org.mule.api.lifecycle.Callable; + +public class FromFlow2Component implements Callable { + + @Override + public Object onCall(MuleEventContext eventContext) throws Exception { + + MuleMessage message = eventContext.getMessage(); + message.setPayload("Converted in flow 2"); + + return message; + } + +} diff --git a/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java b/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java new file mode 100644 index 0000000000..1e1ad15be8 --- /dev/null +++ b/muleesb/src/main/java/com/baeldung/transformer/InitializationTransformer.java @@ -0,0 +1,29 @@ +package com.baeldung.transformer; + +import org.mule.api.MuleMessage; +import org.mule.api.transformer.TransformerException; +import org.mule.api.transport.PropertyScope; +import org.mule.transformer.AbstractMessageTransformer; + +public class InitializationTransformer extends AbstractMessageTransformer { + + @Override + public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException { + // TODO Auto-generated method stub + + String payload = null; + + try { + payload = message.getPayloadAsString(); + }catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("Logged Payload: "+payload); + message.setPayload("Payload from Initialization"); + message.setProperty("outboundKey", "outboundpropertyvalue",PropertyScope.OUTBOUND); + + + return message; + } +} \ No newline at end of file diff --git a/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java b/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java new file mode 100644 index 0000000000..105522e5b4 --- /dev/null +++ b/muleesb/src/main/java/com/baeldung/transformer/InvokingMessageComponent.java @@ -0,0 +1,16 @@ +package com.baeldung.transformer; + +import org.mule.api.MuleMessage; +import org.mule.api.transformer.TransformerException; +import org.mule.transformer.AbstractMessageTransformer; + +public class InvokingMessageComponent extends AbstractMessageTransformer { + + @Override + public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException { + // TODO Auto-generated method stub + String InboundProp = (String) message.getInboundProperty("outboundKey"); + System.out.println("InboundProp:" + InboundProp); + return InboundProp; + } +} \ No newline at end of file diff --git a/muleesb/src/main/resources/log4j2.xml b/muleesb/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..98c4b02433 --- /dev/null +++ b/muleesb/src/main/resources/log4j2.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/muleesb/src/test/munit/variablescopetest-test-suite.xml b/muleesb/src/test/munit/variablescopetest-test-suite.xml new file mode 100644 index 0000000000..43e410a327 --- /dev/null +++ b/muleesb/src/test/munit/variablescopetest-test-suite.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/muleesb/src/test/resources/log4j2-test.xml b/muleesb/src/test/resources/log4j2-test.xml new file mode 100644 index 0000000000..6351ae041c --- /dev/null +++ b/muleesb/src/test/resources/log4j2-test.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mustache/pom.xml b/mustache/pom.xml index 8aab038313..1c64dbdb0b 100644 --- a/mustache/pom.xml +++ b/mustache/pom.xml @@ -85,7 +85,6 @@ **/JdbcTest.java **/*LiveTest.java - true @@ -170,7 +169,7 @@ UTF-8 - 3.6.0 + 3.7.0 2.19.1 1.8 diff --git a/mvn-wrapper/.gitignore b/mvn-wrapper/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/mvn-wrapper/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar b/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar new file mode 100755 index 0000000000..f775b1c04c Binary files /dev/null and b/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar differ diff --git a/mvn-wrapper/.mvn/wrapper/maven-wrapper.properties b/mvn-wrapper/.mvn/wrapper/maven-wrapper.properties new file mode 100755 index 0000000000..a447c9fa81 --- /dev/null +++ b/mvn-wrapper/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/mvn-wrapper/README.md b/mvn-wrapper/README.md new file mode 100644 index 0000000000..bd299d41ed --- /dev/null +++ b/mvn-wrapper/README.md @@ -0,0 +1,22 @@ +Setting up the Maven Wrapper on an Application +============================================== + +This is the code that shows the configurations of maven wrapper on a SpringBoot project. + +### Requirements + +- Maven +- JDK 7 + +### Running + +To build and start the server simply type + +```bash +$ ./mvn clean install +$ ./mvn spring-boot:run +``` + +Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) + +Enjoy it :) \ No newline at end of file diff --git a/mvn-wrapper/mvnw b/mvn-wrapper/mvnw new file mode 100755 index 0000000000..e96ccd5fbb --- /dev/null +++ b/mvn-wrapper/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvn-wrapper/mvnw.cmd b/mvn-wrapper/mvnw.cmd new file mode 100755 index 0000000000..4f0b068a03 --- /dev/null +++ b/mvn-wrapper/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/mvn-wrapper/pom.xml b/mvn-wrapper/pom.xml new file mode 100644 index 0000000000..209c4b9403 --- /dev/null +++ b/mvn-wrapper/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + mvn-wrapper + 0.0.1-SNAPSHOT + jar + + mvn-wrapper + Setting up the Maven Wrapper + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java b/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java new file mode 100644 index 0000000000..3007d24ed0 --- /dev/null +++ b/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MvnWrapperApplication { + public static void main(String[] args) { + SpringApplication.run(MvnWrapperApplication.class, args); + } +} diff --git a/mvn-wrapper/src/main/resources/application.properties b/mvn-wrapper/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/noexception/README.md b/noexception/README.md index d840191369..9dd4c11190 100644 --- a/noexception/README.md +++ b/noexception/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to NoException](http://www.baeldung.com/intrduction-to-noexception) +- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) diff --git a/orientdb/.gitignore b/orientdb/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/orientdb/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/orientdb/.mvn/wrapper/maven-wrapper.jar b/orientdb/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..5fd4d5023f Binary files /dev/null and b/orientdb/.mvn/wrapper/maven-wrapper.jar differ diff --git a/orientdb/.mvn/wrapper/maven-wrapper.properties b/orientdb/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/orientdb/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/orientdb/README.md b/orientdb/README.md new file mode 100644 index 0000000000..56dfe0ab11 --- /dev/null +++ b/orientdb/README.md @@ -0,0 +1,28 @@ +Introduction to the OrientDB Java APIs +====================================== + +This is a simple maven project that shows how to use OrientDB's Java APIs. + +### Requirements + +- Maven +- Java 7 or higher +- OrientDB + +### Build + +To build and start the server simply type + +```bash +$ mvn clean install +``` + +### Run Tests + +Before launching unit tests: +- Install OrientDB +- Create BaeldungDB, BaeldungDBTwo and BaeldungDBThree databases +- Uncomment annotations on the test files + +### Relevant Articles: +- [Introduction to the OrientDB Java APIs](http://www.baeldung.com/java-orientdb) diff --git a/orientdb/mvnw b/orientdb/mvnw new file mode 100755 index 0000000000..a1ba1bf554 --- /dev/null +++ b/orientdb/mvnw @@ -0,0 +1,233 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} "$@" diff --git a/orientdb/mvnw.cmd b/orientdb/mvnw.cmd new file mode 100644 index 0000000000..2b934e89dd --- /dev/null +++ b/orientdb/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% \ No newline at end of file diff --git a/orientdb/pom.xml b/orientdb/pom.xml new file mode 100644 index 0000000000..3d3cb36a91 --- /dev/null +++ b/orientdb/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + orientdb + 0.0.1-SNAPSHOT + jar + + intro-orientdb + introduction to the OrientDB Java APIs + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + 2.2.31 + 2.6.0 + 4.12 + + + + + com.orientechnologies + orientdb-core + ${orientdb.version} + + + com.orientechnologies + orientdb-graphdb + ${orientdb.version} + + + com.orientechnologies + orientdb-object + ${orientdb.version} + + + com.tinkerpop.blueprints + blueprints-core + ${blueprints.version} + + + + junit + junit + ${junit.version} + test + + + diff --git a/orientdb/src/main/java/com/baeldung/orientdb/Author.java b/orientdb/src/main/java/com/baeldung/orientdb/Author.java new file mode 100644 index 0000000000..8366fa301f --- /dev/null +++ b/orientdb/src/main/java/com/baeldung/orientdb/Author.java @@ -0,0 +1,54 @@ +package com.baeldung.orientdb; + +import javax.persistence.Id; + +public class Author { + @Id + private Object id; + + private String firstName; + private String lastName; + private int level; + + public Author() { + } + + public Author(String firstName, String lastName, int level) { + this.firstName = firstName; + this.lastName = lastName; + this.level = level; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + @java.lang.Override + public java.lang.String toString() { + return "Author{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", level=" + level + + '}'; + } +} diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPITest.java b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPITest.java new file mode 100644 index 0000000000..c51ff6928f --- /dev/null +++ b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPITest.java @@ -0,0 +1,60 @@ +package com.baeldung.orientdb; + +import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; +import com.orientechnologies.orient.core.record.impl.ODocument; +import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static junit.framework.Assert.assertEquals; + +public class OrientDBDocumentAPITest { + private static ODatabaseDocumentTx db = null; + + // @BeforeClass + public static void setup() { + String orientDBFolder = System.getenv("ORIENTDB_HOME"); + db = new ODatabaseDocumentTx("plocal:" + orientDBFolder + "/databases/BaeldungDBTwo").open("admin", "admin"); + } + + // @Test + public void givenDB_whenSavingDocument_thenClassIsAutoCreated() { + ODocument author = new ODocument("Author"); + author.field("firstName", "Paul"); + author.field("lastName", "Smith"); + author.field("country", "USA"); + author.field("publicProfile", false); + author.field("level", 7); + author.save(); + + assertEquals("Author", author.getSchemaClass().getName()); + } + + // @Test + public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() { + for (ODocument author : db.browseClass("Author")) author.delete(); + + ODocument authorOne = new ODocument("Author"); + authorOne.field("firstName", "Leo"); + authorOne.field("level", 7); + authorOne.save(); + + ODocument authorTwo = new ODocument("Author"); + authorTwo.field("firstName", "Lucien"); + authorTwo.field("level", 9); + authorTwo.save(); + + List result = db.query( + new OSQLSynchQuery("select * from Author where level = 7")); + + assertEquals(1, result.size()); + } + + // @AfterClass + public static void closeDB() { + db.close(); + } +} diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPITest.java b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPITest.java new file mode 100644 index 0000000000..fe16564755 --- /dev/null +++ b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPITest.java @@ -0,0 +1,89 @@ +package com.baeldung.orientdb; + +import com.orientechnologies.orient.core.metadata.schema.OType; +import com.tinkerpop.blueprints.Vertex; +import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx; +import com.tinkerpop.blueprints.impls.orient.OrientVertexType; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +public class OrientDBGraphAPITest { + private static OrientGraphNoTx graph = null; + + // @BeforeClass + public static void setup() { + String orientDBFolder = System.getenv("ORIENTDB_HOME"); + graph = new OrientGraphNoTx("plocal:" + orientDBFolder + "/databases/BaeldungDB", "admin", "admin"); + } + + // @BeforeClass + public static void init() { + graph.createVertexType("Article"); + + OrientVertexType writerType = graph.createVertexType("Writer"); + writerType.setStrictMode(true); + writerType.createProperty("firstName", OType.STRING); + writerType.createProperty("lastName", OType.STRING); + writerType.createProperty("country", OType.STRING); + + OrientVertexType authorType = graph.createVertexType("Author", "Writer"); + authorType.createProperty("level", OType.INTEGER).setMax("3"); + + OrientVertexType editorType = graph.createVertexType("Editor", "Writer"); + editorType.createProperty("level", OType.INTEGER).setMin("3"); + + Vertex vEditor = graph.addVertex("class:Editor"); + vEditor.setProperty("firstName", "Maxim"); + vEditor.setProperty("lastName", "Mink's"); + vEditor.setProperty("country", "Cameroon"); + vEditor.setProperty("publicProfile", true); + vEditor.setProperty("level", "7"); + + Vertex vAuthor = graph.addVertex("class:Author"); + vAuthor.setProperty("firstName", "Jerome"); + vAuthor.setProperty("country", "Romania"); + vAuthor.setProperty("publicProfile", false); + vAuthor.setProperty("level", "3"); + + Vertex vArticle = graph.addVertex("class:Article"); + vArticle.setProperty("title", "Introduction to the OrientDB Java APIs."); + vArticle.setProperty("priority", "High"); + vArticle.setProperty("type", "Article"); + vArticle.setProperty("level", "+L4"); + + graph.addEdge(null, vAuthor, vEditor, "has"); + graph.addEdge(null, vAuthor, vArticle, "wrote"); + } + + // @Test + public void givenBaeldungDB_checkWeHaveThreeRecords() { + long size = graph.countVertices(); + + assertEquals(3, size); + } + + // @Test + public void givenBaeldungDB_checkWeHaveTwoWriters() { + long size = graph.countVertices("Writer"); + + assertEquals(2, size); + } + + // @Test + public void givenBaeldungDB_getEditorWithLevelSeven() { + String onlyEditor = ""; + for(Vertex v : graph.getVertices("Editor.level", 7)) { + onlyEditor = v.getProperty("firstName").toString(); + } + + assertEquals("Maxim", onlyEditor); + } + + // @AfterClass + public static void closeDB() { + graph.getRawGraph().getStorage().close(true, false); + } +} diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPITest.java b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPITest.java new file mode 100644 index 0000000000..71be159107 --- /dev/null +++ b/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPITest.java @@ -0,0 +1,56 @@ +package com.baeldung.orientdb; + +import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; +import com.orientechnologies.orient.object.db.OObjectDatabaseTx; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static junit.framework.Assert.assertEquals; + +public class OrientDBObjectAPITest { + private static OObjectDatabaseTx db = null; + + // @BeforeClass + public static void setup() { + String orientDBFolder = System.getenv("ORIENTDB_HOME"); + db = new OObjectDatabaseTx("plocal:" + orientDBFolder + "/databases/BaeldungDBThree").open("admin", "admin"); + db.setSaveOnlyDirty(true); + db.getEntityManager().registerEntityClass(Author.class); + } + + // @Test + public void givenDB_whenSavingObject_thenHisIdExists() { + Author author = db.newInstance(Author.class); + author.setFirstName("Luke"); + author.setLastName("Sky"); + author.setLevel(9); + + long authors = db.countClass(Author.class); + + db.save(author); + } + + // @Test + public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() { + for (Author author : db.browseClass(Author.class)) db.delete(author); + + Author authorOne = db.newInstance(Author.class, "Leo", "Marta", 7); + db.save(authorOne); + + Author authorTwo = db.newInstance(Author.class, "Lucien", "Aurelien", 9); + db.save(authorTwo); + + List result = db.query( + new OSQLSynchQuery("select * from Author where level = 7")); + + assertEquals(1, result.size()); + } + + // @AfterClass + public static void closeDB() { + db.close(); + } +} diff --git a/osgi/osgi-intro-sample-activator/pom.xml b/osgi/osgi-intro-sample-activator/pom.xml new file mode 100644 index 0000000000..1584913627 --- /dev/null +++ b/osgi/osgi-intro-sample-activator/pom.xml @@ -0,0 +1,55 @@ + + + + + + osgi-intro + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + + bundle + + osgi-intro-sample-activator + + + + org.osgi + org.osgi.core + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.groupId}.${project.artifactId} + ${project.artifactId} + ${project.version} + + + com.baeldung.osgi.sample.activator.HelloWorld + + + + com.baeldung.osgi.sample.activator + + + + + + + + diff --git a/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java b/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java new file mode 100644 index 0000000000..72fe624bac --- /dev/null +++ b/osgi/osgi-intro-sample-activator/src/main/java/com/baeldung/osgi/sample/activator/HelloWorld.java @@ -0,0 +1,16 @@ +package com.baeldung.osgi.sample.activator; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class HelloWorld implements BundleActivator { + + public void start(BundleContext ctx) { + System.out.println("Hello World."); + } + + public void stop(BundleContext bundleContext) { + System.out.println("Goodbye World."); + } + +} \ No newline at end of file diff --git a/osgi/osgi-intro-sample-client/pom.xml b/osgi/osgi-intro-sample-client/pom.xml new file mode 100644 index 0000000000..4096674d7d --- /dev/null +++ b/osgi/osgi-intro-sample-client/pom.xml @@ -0,0 +1,49 @@ + + + + osgi-intro + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + + osgi-intro-sample-client + + bundle + + + + com.baeldung + osgi-intro-sample-service + 1.0-SNAPSHOT + + + org.osgi + org.osgi.core + + + + + + + org.apache.felix + maven-bundle-plugin + + + ${project.groupId}.${project.artifactId} + ${project.artifactId} + ${project.version} + com.baeldung.osgi.sample.client.Client + + com.baeldung.osgi.sample.client + + + + + + + + \ No newline at end of file diff --git a/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java b/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java new file mode 100644 index 0000000000..a82ed63fa7 --- /dev/null +++ b/osgi/osgi-intro-sample-client/src/main/java/com/baeldung/osgi/sample/client/Client.java @@ -0,0 +1,44 @@ +package com.baeldung.osgi.sample.client; + +import com.baeldung.osgi.sample.service.definition.Greeter; +import org.osgi.framework.*; + +public class Client implements BundleActivator, ServiceListener { + + private BundleContext ctx; + private ServiceReference serviceReference; + + public void start(BundleContext ctx) { + this.ctx = ctx; + try { + ctx.addServiceListener(this, "(objectclass=" + Greeter.class.getName() + ")"); + } catch (InvalidSyntaxException ise) { + ise.printStackTrace(); + } + } + + public void stop(BundleContext bundleContext) { + if (serviceReference != null) { + ctx.ungetService(serviceReference); + } + this.ctx = null; + } + + public void serviceChanged(ServiceEvent serviceEvent) { + int type = serviceEvent.getType(); + switch (type) { + case (ServiceEvent.REGISTERED): + System.out.println("Notification of service registered."); + serviceReference = serviceEvent.getServiceReference(); + Greeter service = (Greeter) (ctx.getService(serviceReference)); + System.out.println(service.sayHiTo("John")); + break; + case (ServiceEvent.UNREGISTERING): + System.out.println("Notification of service unregistered."); + ctx.ungetService(serviceEvent.getServiceReference()); + break; + default: + break; + } + } +} diff --git a/osgi/osgi-intro-sample-service/pom.xml b/osgi/osgi-intro-sample-service/pom.xml new file mode 100644 index 0000000000..cbc660bb74 --- /dev/null +++ b/osgi/osgi-intro-sample-service/pom.xml @@ -0,0 +1,46 @@ + + + + + + osgi-intro + com.baeldung + 1.0-SNAPSHOT + + 4.0.0 + + osgi-intro-sample-service + + + bundle + + + + org.osgi + org.osgi.core + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.groupId}.${project.artifactId} + ${project.artifactId} + ${project.version} + com.baeldung.osgi.sample.service.implementation.GreeterImpl + com.baeldung.osgi.sample.service.implementation + com.baeldung.osgi.sample.service.definition + + + + + + + \ No newline at end of file diff --git a/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java new file mode 100644 index 0000000000..f1e82a3465 --- /dev/null +++ b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/definition/Greeter.java @@ -0,0 +1,7 @@ +package com.baeldung.osgi.sample.service.definition; + +public interface Greeter { + + public String sayHiTo(String name); + +} diff --git a/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java new file mode 100644 index 0000000000..48e26e3e6b --- /dev/null +++ b/osgi/osgi-intro-sample-service/src/main/java/com/baeldung/osgi/sample/service/implementation/GreeterImpl.java @@ -0,0 +1,30 @@ +package com.baeldung.osgi.sample.service.implementation; + +import com.baeldung.osgi.sample.service.definition.Greeter; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; + +import java.util.Hashtable; + +public class GreeterImpl implements Greeter, BundleActivator { + + private ServiceReference reference; + private ServiceRegistration registration; + + @Override public String sayHiTo(String name) { + return "Hello " + name; + } + + @Override public void start(BundleContext context) throws Exception { + System.out.println("Registering service."); + registration = context.registerService(Greeter.class, new GreeterImpl(), new Hashtable()); + reference = registration.getReference(); + } + + @Override public void stop(BundleContext context) throws Exception { + System.out.println("Unregistering service."); + registration.unregister(); + } +} diff --git a/osgi/pom.xml b/osgi/pom.xml new file mode 100644 index 0000000000..e6ef9c3192 --- /dev/null +++ b/osgi/pom.xml @@ -0,0 +1,87 @@ + + + 4.0.0 + + osgi-intro + pom + 1.0-SNAPSHOT + + osgi-intro-sample-activator + osgi-intro-sample-service + osgi-intro-sample-client + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + .. + + + + + + + ${project.groupId} + osgi-intro-client + ${project.version} + + + + ${project.groupId} + osgi-intro-service + ${project.version} + + + + ${project.groupId} + osgi-intro-gxyz + ${project.version} + + + + ${project.groupId} + osgi-intro-mapquest + ${project.version} + + + + com.squareup.okhttp3 + okhttp + 3.9.0 + + + javax.json + javax.json-api + 1.1 + + + org.glassfish + javax.json + 1.1 + + + org.osgi + org.osgi.core + 6.0.0 + provided + + + + + + + + + org.apache.felix + maven-bundle-plugin + 3.3.0 + true + + + + + + \ No newline at end of file diff --git a/osgi/readme.md b/osgi/readme.md new file mode 100644 index 0000000000..e380ae06c3 --- /dev/null +++ b/osgi/readme.md @@ -0,0 +1,94 @@ +OSGi +==== + +Info +--- + +com.baeldung.osgi +com.baeldung.osgi.sample.activator + +Apache Felix +--- + + +### Start + +Download Apache Felix Framework Distribution +from +org.apache.felix.main.distribution-5.6.8 + +No! The Apache Karaf container is best. +Download it from: + +Download a binary distribution and unzip wherever you prefer. + +Then run + + bin\karaf.bat start + + +Unzip, pay attention to the files not being clipped(!). + + system:exit + +exit! + + shutdown -h + +or `^D` + +### clean start + +full clean, remove "data directory " + +or... + + bin\karaf.bat clean + + bin\start.bat clean + +### run mode + +can be launched in + +- the "regular" mode starts Apache Karaf in foreground, including the shell console. +- the "server" mode starts Apache Karaf in foreground, without the shell console. +- the "background" mode starts Apache Karaf in background. + +### Logging + +https://karaf.apache.org/manual/latest/#_log + +can be logged to console + + +### Bundle deploy + + bundle:install mvn:com.baeldung/osgi-intro-sample-activator/1.0-SNAPSHOT + + install mvn:com.baeldung/osgi-intro-sample-service/1.0-SNAPSHOT + install mvn:com.baeldung/osgi-intro-sample-client/1.0-SNAPSHOT + +Eclipse's Equinox +==== + +Eclipse's OSGi platform +http://www.eclipse.org/equinox/ + +http://www.eclipse.org/equinox/documents/quickstart-framework.php + +click on "download" + +Latest Release +Oxygen.1 Wed, 6 Sep 2017 -- 17:00 (-0400) + +org.eclipse.osgi_3.12.1.v20170821-1548.jar + + = = NOT GOOD = = + + ## Relevant articles: + - [Introduction to OSGi](http://www.baeldung.com/osgi) + + + + diff --git a/out/production/generated-sources8/src.main.resources.reladomo.ReladomoClassList.xml.log b/out/production/generated-sources8/src.main.resources.reladomo.ReladomoClassList.xml.log new file mode 100644 index 0000000000..0bd4e29a45 --- /dev/null +++ b/out/production/generated-sources8/src.main.resources.reladomo.ReladomoClassList.xml.log @@ -0,0 +1,2 @@ +f5a6ba3b942a82fcbfb72e61502d5c30 +9201deea diff --git a/out/production/introduction/views/index.scala.html b/out/production/introduction/views/index.scala.html new file mode 100644 index 0000000000..4539f5a10b --- /dev/null +++ b/out/production/introduction/views/index.scala.html @@ -0,0 +1,20 @@ +@* + * This template takes a single argument, a String containing a + * message to display. + *@ +@(message: String) + +@* + * Call the `main` template with two arguments. The first + * argument is a `String` with the title of the page, the second + * argument is an `Html` object containing the body of the page. + *@ +@main("Welcome to Play") { + + @* + * Get an `Html` object by calling the built-in Play welcome + * template and passing a `String` message. + *@ + @play20.welcome(message, style = "Java") + +} diff --git a/out/production/introduction/views/main.scala.html b/out/production/introduction/views/main.scala.html new file mode 100644 index 0000000000..9414f4be6e --- /dev/null +++ b/out/production/introduction/views/main.scala.html @@ -0,0 +1,23 @@ +@* + * This template is called from the `index` template. This template + * handles the rendering of the page header and body tags. It takes + * two arguments, a `String` for the title of the page and an `Html` + * object to insert into the body of the page. + *@ +@(title: String)(content: Html) + + + + + @* Here's where we render the page title `String`. *@ + @title + + + + + + @* And here's where we render the `Html` object containing + * the page content. *@ + @content + + diff --git a/out/production/main122/.gitignore b/out/production/main122/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/out/production/main122/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/out/production/main151/com/baeldung/.gitignore b/out/production/main151/com/baeldung/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/out/production/main151/com/baeldung/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/out/production/main151/com/baeldung/README.md b/out/production/main151/com/baeldung/README.md new file mode 100644 index 0000000000..51809b2882 --- /dev/null +++ b/out/production/main151/com/baeldung/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) diff --git a/out/production/main155/com/baeldung/git/README.md b/out/production/main155/com/baeldung/git/README.md new file mode 100644 index 0000000000..7e6a597c28 --- /dev/null +++ b/out/production/main155/com/baeldung/git/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Injecting Git Information Into Spring](http://www.baeldung.com/spring-git-information) diff --git a/out/production/main173/log4j.properties b/out/production/main173/log4j.properties new file mode 100644 index 0000000000..5fe42d854c --- /dev/null +++ b/out/production/main173/log4j.properties @@ -0,0 +1,9 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt new file mode 100644 index 0000000000..bffe24e485 --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/README.txt @@ -0,0 +1,76 @@ +About the application +--------------------- +This application demonstrates the usage of JavaEE Web Annotations. + + +Contents of the application +--------------------------- +1. AccountServlet.java - Demonstrates the @WebServlet and @ServletSecurity annotation. + +NOTES: @WebServlet annotation designates the AccountServlet class as a Servlet component. + The usage of its parameters 'urlPatterns' & 'initParams' can be observed. + An initialization parameter 'type' is being set to denote the type of the bank account. + + @ServletSecurity annotation imposes security constraints on the AccountServlet based on + the tomcat-users.xml. +   + This code assumes that your tomcat-users.xml looks as follows: + + + + + + + +   +N.B : To see @ServletSecurity annotation in action, please uncomment the annotation code + for @ServletSecurity. + + +2. BankAppServletContextListener.java - Demonstrates the @WebListener annotation for denoting a class as a ServletContextListener. + +NOTES: Sets a Servlet context attribute ATTR_DEFAULT_LANGUAGE to 'english' on web application start up, + which can then be used throughout the application. + + +3. LogInFilter.java - Demonstrates the @WebFilter annotation. + +NOTES: @WebFilter annotation designates the LogInFilter class as a Filter component. + It filters all requests to the bank account servlet and redirects them to + the login page. + +N.B : To see @WebFilter annotation in action, please uncomment the annotation code for @WebFilter. + + +4. UploadCustomerDocumentsServlet.java - Demonstrates the @MultipartConfig annotation. + +NOTES: @MultipartConfig anotation designates the UploadCustomerDocumentsServlet Servlet component, + to handle multipart/form-data requests. + To see it in action, deploy the web application an access the url: http://:/JavaEEAnnotationsSample/upload.jsp + Once you upload a file from here, it will get uploaded to D:/custDocs (assuming such a folder exists). + + +5. index.jsp - This is the welcome page. + +NOTES: You can enter a deposit amount here and click on the 'Deposit' button to see the AccountServlet in action. + +6. login.jsp - All requests to the AccountServlet are redirected to this page, if the LogInFilter is imposed. + +7. upload.jsp - Demonstrates the usage of handling multipart/form-data requests by the UploadCustomerDocumentsServlet. + + +Building and Running the application +------------------------------------ +To build the application: + +1. Open the project in eclipse +2. Right click on it in eclispe and choose Run As > Maven build +3. Give 'clean install' under Goals +4. This should build the WAR file of the application + +To run the application: + +1. Right click on the project +2. Run as > Run on Server +3. This will start you Tomcat server and deploy the application (Provided that you have configured Tomcat in your eclipse) +4. You should now be able to access the url : http://:/JavaEEAnnotationsSample diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml new file mode 100644 index 0000000000..de69efa43a --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + com.baeldung.javaeeannotations + JavaEEAnnotationsSample + 0.0.1-SNAPSHOT + war + JavaEEAnnotationsSample + JavaEEAnnotationsSample + + + + + javax.annotation + javax.annotation-api + 1.3 + + + + javax.servlet + javax.servlet-api + 3.1.0 + + + + javax.servlet.jsp + jsp-api + 2.1 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + src/main/webapp + SpringFieldConstructorInjection + false + + + + + JavaEEAnnotationsSample + + \ No newline at end of file diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..a92885ec11 --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,10 @@ + + + + BASIC + default + + diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp new file mode 100644 index 0000000000..c49dec859e --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/index.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +My Account + + +
+ Amount: +    + +
+ + \ No newline at end of file diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp new file mode 100644 index 0000000000..6892cb0420 --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/login.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Login + + +Login Here... + + \ No newline at end of file diff --git a/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp new file mode 100644 index 0000000000..3601322ef0 --- /dev/null +++ b/out/production/main180/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/webapp/upload.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Insert title here + + +
+ +
+ +
+ + \ No newline at end of file diff --git a/out/production/main180/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl b/out/production/main180/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl new file mode 100644 index 0000000000..426717f90e --- /dev/null +++ b/out/production/main180/com/baeldung/jaxws/wsdl/employeeservicetopdown.wsdl @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/out/production/main195/com/baeldung/java/nio/selector/README.md b/out/production/main195/com/baeldung/java/nio/selector/README.md new file mode 100644 index 0000000000..b28aae1397 --- /dev/null +++ b/out/production/main195/com/baeldung/java/nio/selector/README.md @@ -0,0 +1,2 @@ +###Relevant Articles: +- [Introduction to the Java NIO Selector](http://www.baeldung.com/java-nio-selector) diff --git a/out/production/main216/com/baeldung/googlehttpclientguide/logging.properties b/out/production/main216/com/baeldung/googlehttpclientguide/logging.properties new file mode 100644 index 0000000000..02489378df --- /dev/null +++ b/out/production/main216/com/baeldung/googlehttpclientguide/logging.properties @@ -0,0 +1,10 @@ +# Properties file which configures the operation of the JDK logging facility. +# The system will look for this config file to be specified as a system property: +# -Djava.util.logging.config.file=${project_loc:dailymotion-simple-cmdline-sample}/logging.properties + +# Set up the console handler (uncomment "level" to show more fine-grained messages) +handlers = java.util.logging.ConsoleHandler +java.util.logging.ConsoleHandler.level = ALL + +# Set up logging of HTTP requests and responses (uncomment "level" to show) +com.google.api.client.http.level = ALL diff --git a/out/production/main231/com/baeldung/wicket/examples/HelloWorld.html b/out/production/main231/com/baeldung/wicket/examples/HelloWorld.html new file mode 100644 index 0000000000..497e98e01a --- /dev/null +++ b/out/production/main231/com/baeldung/wicket/examples/HelloWorld.html @@ -0,0 +1,52 @@ + + + + +Wicket Intro Examples + + + +
+
+
+

Wicket Introduction Examples:

+ + Hello World! +
+
+ Cafes +
+
+
+
+ + diff --git a/out/production/main231/com/baeldung/wicket/examples/cafeaddress/CafeAddress.html b/out/production/main231/com/baeldung/wicket/examples/cafeaddress/CafeAddress.html new file mode 100644 index 0000000000..c5ada2323d --- /dev/null +++ b/out/production/main231/com/baeldung/wicket/examples/cafeaddress/CafeAddress.html @@ -0,0 +1,15 @@ + + + + +Cafes + + +
+ +

+ Address: address +

+
+ + diff --git a/out/production/main231/com/baeldung/wicket/examples/helloworld/HelloWorld.html b/out/production/main231/com/baeldung/wicket/examples/helloworld/HelloWorld.html new file mode 100644 index 0000000000..c56d07fc10 --- /dev/null +++ b/out/production/main231/com/baeldung/wicket/examples/helloworld/HelloWorld.html @@ -0,0 +1,5 @@ + + + + + diff --git a/out/production/main234/com/baeldung/activiti/security.rar b/out/production/main234/com/baeldung/activiti/security.rar new file mode 100644 index 0000000000..38c4946168 Binary files /dev/null and b/out/production/main234/com/baeldung/activiti/security.rar differ diff --git a/out/production/main237/com/baeldung/datetime/README.md b/out/production/main237/com/baeldung/datetime/README.md new file mode 100644 index 0000000000..1e4adbb612 --- /dev/null +++ b/out/production/main237/com/baeldung/datetime/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) diff --git a/out/production/main291/xml-bean-config.xml b/out/production/main291/xml-bean-config.xml new file mode 100644 index 0000000000..3b880bbd70 --- /dev/null +++ b/out/production/main291/xml-bean-config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/out/production/main30/com/baeldung/factorybean/README.md b/out/production/main30/com/baeldung/factorybean/README.md new file mode 100644 index 0000000000..13f9f379e0 --- /dev/null +++ b/out/production/main30/com/baeldung/factorybean/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) diff --git a/out/production/main330/com/baeldung/.gitignore b/out/production/main330/com/baeldung/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/out/production/main330/com/baeldung/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/out/production/main330/com/baeldung/README.md b/out/production/main330/com/baeldung/README.md new file mode 100644 index 0000000000..51809b2882 --- /dev/null +++ b/out/production/main330/com/baeldung/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) diff --git a/out/production/main330/com/baeldung/enums/README.md b/out/production/main330/com/baeldung/enums/README.md new file mode 100644 index 0000000000..6ccfa725f5 --- /dev/null +++ b/out/production/main330/com/baeldung/enums/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums) diff --git a/out/production/main330/com/baeldung/networking/README.md b/out/production/main330/com/baeldung/networking/README.md new file mode 100644 index 0000000000..b9e827f085 --- /dev/null +++ b/out/production/main330/com/baeldung/networking/README.md @@ -0,0 +1,5 @@ +### Relevant Articles: +- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) +- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) +- [A Guide to the Java URL](http://www.baeldung.com/java-url) +- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) diff --git a/out/production/main330/com/baeldung/printscreen/README.md b/out/production/main330/com/baeldung/printscreen/README.md new file mode 100644 index 0000000000..7b3b40c102 --- /dev/null +++ b/out/production/main330/com/baeldung/printscreen/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) diff --git a/out/production/main330/log4j.properties b/out/production/main330/log4j.properties new file mode 100644 index 0000000000..5fe42d854c --- /dev/null +++ b/out/production/main330/log4j.properties @@ -0,0 +1,9 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/out/production/main351/com/baeldung/produceimage/README.md b/out/production/main351/com/baeldung/produceimage/README.md new file mode 100644 index 0000000000..acd546598d --- /dev/null +++ b/out/production/main351/com/baeldung/produceimage/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Returning an Image or a File with Spring](http://www.baeldung.com/spring-controller-return-image-file) diff --git a/out/production/main96/com/baeldung/git/README.md b/out/production/main96/com/baeldung/git/README.md new file mode 100644 index 0000000000..7e6a597c28 --- /dev/null +++ b/out/production/main96/com/baeldung/git/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Injecting Git Information Into Spring](http://www.baeldung.com/spring-git-information) diff --git a/out/production/routing-in-play/views/index.scala.html b/out/production/routing-in-play/views/index.scala.html new file mode 100644 index 0000000000..4539f5a10b --- /dev/null +++ b/out/production/routing-in-play/views/index.scala.html @@ -0,0 +1,20 @@ +@* + * This template takes a single argument, a String containing a + * message to display. + *@ +@(message: String) + +@* + * Call the `main` template with two arguments. The first + * argument is a `String` with the title of the page, the second + * argument is an `Html` object containing the body of the page. + *@ +@main("Welcome to Play") { + + @* + * Get an `Html` object by calling the built-in Play welcome + * template and passing a `String` message. + *@ + @play20.welcome(message, style = "Java") + +} diff --git a/out/production/routing-in-play/views/main.scala.html b/out/production/routing-in-play/views/main.scala.html new file mode 100644 index 0000000000..9414f4be6e --- /dev/null +++ b/out/production/routing-in-play/views/main.scala.html @@ -0,0 +1,23 @@ +@* + * This template is called from the `index` template. This template + * handles the rendering of the page header and body tags. It takes + * two arguments, a `String` for the title of the page and an `Html` + * object to insert into the body of the page. + *@ +@(title: String)(content: Html) + + + + + @* Here's where we render the page title `String`. *@ + @title + + + + + + @* And here's where we render the `Html` object containing + * the page content. *@ + @content + + diff --git a/out/test/test105/com/baeldung/cglib/proxy/README.md b/out/test/test105/com/baeldung/cglib/proxy/README.md new file mode 100644 index 0000000000..abeabc6162 --- /dev/null +++ b/out/test/test105/com/baeldung/cglib/proxy/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to cglib](http://www.baeldung.com/cglib) diff --git a/out/test/test143/com/baeldung/java9/README.MD b/out/test/test143/com/baeldung/java9/README.MD new file mode 100644 index 0000000000..2f44a2336b --- /dev/null +++ b/out/test/test143/com/baeldung/java9/README.MD @@ -0,0 +1,2 @@ +### Relevant Artiles: +- [Filtering a Stream of Optionals in Java](http://www.baeldung.com/java-filter-stream-of-optional) diff --git a/out/test/test174/org/baeldung/hamcrest/README.md b/out/test/test174/org/baeldung/hamcrest/README.md new file mode 100644 index 0000000000..7266ecda3a --- /dev/null +++ b/out/test/test174/org/baeldung/hamcrest/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) diff --git a/out/test/test191/com/baeldung/web/controller/README.md b/out/test/test191/com/baeldung/web/controller/README.md new file mode 100644 index 0000000000..9923962dde --- /dev/null +++ b/out/test/test191/com/baeldung/web/controller/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [WebAppConfiguration in Spring Tests](http://www.baeldung.com/spring-webappconfiguration) diff --git a/out/test/test197/com/baeldung/java/nio2/README.md b/out/test/test197/com/baeldung/java/nio2/README.md new file mode 100644 index 0000000000..569be82d27 --- /dev/null +++ b/out/test/test197/com/baeldung/java/nio2/README.md @@ -0,0 +1,11 @@ +### Relevant Articles: +- [Introduction to the Java NIO2 File API](http://www.baeldung.com/java-nio-2-file-api) +- [Java NIO2 Path API](http://www.baeldung.com/java-nio-2-path) +- [A Guide To NIO2 Asynchronous File Channel](http://www.baeldung.com/java-nio2-async-file-channel) +- [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng) +- [A Guide to NIO2 Asynchronous Socket Channel](http://www.baeldung.com/java-nio2-async-socket-channel) +- [A Guide To NIO2 FileVisitor](http://www.baeldung.com/java-nio2-file-visitor) +- [A Guide To NIO2 File Attribute APIs](http://www.baeldung.com/java-nio2-file-attribute) +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) +- [A Guide to WatchService in Java NIO2](http://www.baeldung.com/java-nio2-watchservice) +- [Guide to Java NIO2 Asynchronous Channel APIs](http://www.baeldung.com/java-nio-2-async-channels) diff --git a/spring-jpa/src/test/java/META-INF/persistence.xml b/out/test/test237/META-INF/persistence.xml similarity index 100% rename from spring-jpa/src/test/java/META-INF/persistence.xml rename to out/test/test237/META-INF/persistence.xml diff --git a/out/test/test95/com/baeldung/hexToAscii/README.md b/out/test/test95/com/baeldung/hexToAscii/README.md new file mode 100644 index 0000000000..c6d5826333 --- /dev/null +++ b/out/test/test95/com/baeldung/hexToAscii/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Convert Hex to ASCII in Java](http://www.baeldung.com/java-convert-hex-to-ascii) diff --git a/out/test/test95/com/baeldung/java/conversion/README.md b/out/test/test95/com/baeldung/java/conversion/README.md new file mode 100644 index 0000000000..7c81180249 --- /dev/null +++ b/out/test/test95/com/baeldung/java/conversion/README.md @@ -0,0 +1,2 @@ +Relevant Articles: +- [Java String Conversions](http://www.baeldung.com/java-string-conversions) diff --git a/out/test/test95/org/baeldung/java/collections/README.md b/out/test/test95/org/baeldung/java/collections/README.md new file mode 100644 index 0000000000..317d81fae7 --- /dev/null +++ b/out/test/test95/org/baeldung/java/collections/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) diff --git a/out/test/test95/org/baeldung/java/lists/README.md b/out/test/test95/org/baeldung/java/lists/README.md new file mode 100644 index 0000000000..2a1e8aeeaa --- /dev/null +++ b/out/test/test95/org/baeldung/java/lists/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) diff --git a/out/test/test98/com/baeldung/applicationcontext/README.md b/out/test/test98/com/baeldung/applicationcontext/README.md new file mode 100644 index 0000000000..211007e0cf --- /dev/null +++ b/out/test/test98/com/baeldung/applicationcontext/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) +- [Intro to the Spring ClassPathXmlApplicationContext](http://www.baeldung.com/spring-classpathxmlapplicationcontext) diff --git a/out/test/test98/com/baeldung/beanfactory/README.md b/out/test/test98/com/baeldung/beanfactory/README.md new file mode 100644 index 0000000000..cff20a184b --- /dev/null +++ b/out/test/test98/com/baeldung/beanfactory/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to the Spring BeanFactory](http://www.baeldung.com/spring-beanfactory) diff --git a/parent-boot-4/README.md b/parent-boot-4/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/parent-boot-4/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/parent-boot-4/pom.xml b/parent-boot-4/pom.xml deleted file mode 100644 index 2af36e9365..0000000000 --- a/parent-boot-4/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - 4.0.0 - com.baeldung - parent-boot-4 - 0.0.1-SNAPSHOT - pom - Parent Boot 4 - Parent for all spring boot 1.4 modules - - - UTF-8 - UTF-8 - 1.8 - 3.0.1 - - 2.19.1 - 3.6.0 - - - - spring-boot-starter-parent - org.springframework.boot - 1.4.4.RELEASE - - - - - - junit - junit - test - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - 3 - true - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/JdbcTest.java - **/*LiveTest.java - - true - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - - - - - \ No newline at end of file diff --git a/parent-boot-5/pom.xml b/parent-boot-5/pom.xml index 57e9ed3c67..0e3936a73a 100644 --- a/parent-boot-5/pom.xml +++ b/parent-boot-5/pom.xml @@ -12,16 +12,16 @@ UTF-8 UTF-8 1.8 - 3.0.1 + 3.0.6 - 2.19.1 - 3.6.0 + 2.20.1 + 3.7.0 spring-boot-starter-parent org.springframework.boot - 1.5.3.RELEASE + 1.5.10.RELEASE @@ -60,12 +60,8 @@ **/*IntegrationTest.java **/*LongRunningUnitTest.java **/*ManualTest.java - **/JdbcTest.java - **/AutoconfigurationTest.java - **/*EntryPointsTest.java **/*LiveTest.java - true diff --git a/patterns/README.md b/patterns/README.md index bcd54a64b1..26099ae34f 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -1,3 +1,5 @@ ###Relevant Articles: - [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) - [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java) +- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern) + diff --git a/patterns/behavioral-patterns/pom.xml b/patterns/behavioral-patterns/pom.xml new file mode 100644 index 0000000000..3c40520ce1 --- /dev/null +++ b/patterns/behavioral-patterns/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + com.baeldung.pattern.templatemethod + pattern.templatemethod + 1.0 + jar + + com.baeldung.patterns + patterns-parent + 1.0.0-SNAPSHOT + .. + + + + + junit + junit + 4.12 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + + + + UTF-8 + 1.8 + 1.8 + + \ No newline at end of file diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProcessor.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProcessor.java new file mode 100644 index 0000000000..374de31ba9 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProcessor.java @@ -0,0 +1,13 @@ +package com.baeldung.pattern.chainofresponsibility; + +public abstract class AuthenticationProcessor { + + // next element in chain or responsibility + public AuthenticationProcessor nextProcessor; + + public AuthenticationProcessor(AuthenticationProcessor nextProcessor) { + this.nextProcessor = nextProcessor; + } + + public abstract boolean isAuthorized(AuthenticationProvider authProvider); +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProvider.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProvider.java new file mode 100644 index 0000000000..7b8771ca41 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/AuthenticationProvider.java @@ -0,0 +1,5 @@ +package com.baeldung.pattern.chainofresponsibility; + +public interface AuthenticationProvider { + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthAuthenticationProcessor.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthAuthenticationProcessor.java new file mode 100644 index 0000000000..3bf20cfc85 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthAuthenticationProcessor.java @@ -0,0 +1,21 @@ +package com.baeldung.pattern.chainofresponsibility; + +public class OAuthAuthenticationProcessor extends AuthenticationProcessor { + + public OAuthAuthenticationProcessor(AuthenticationProcessor nextProcessor) { + super(nextProcessor); + } + + @Override + public boolean isAuthorized(AuthenticationProvider authProvider) { + + if (authProvider instanceof OAuthTokenProvider) { + return Boolean.TRUE; + } else if (nextProcessor != null) { + return nextProcessor.isAuthorized(authProvider); + } else { + return Boolean.FALSE; + } + } + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthTokenProvider.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthTokenProvider.java new file mode 100644 index 0000000000..92d5f94245 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/OAuthTokenProvider.java @@ -0,0 +1,5 @@ +package com.baeldung.pattern.chainofresponsibility; + +public class OAuthTokenProvider implements AuthenticationProvider { + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/SamlAuthenticationProvider.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/SamlAuthenticationProvider.java new file mode 100644 index 0000000000..cd927932ad --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/SamlAuthenticationProvider.java @@ -0,0 +1,5 @@ +package com.baeldung.pattern.chainofresponsibility; + +public class SamlAuthenticationProvider implements AuthenticationProvider { + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java new file mode 100644 index 0000000000..3885b2b79b --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung.pattern.chainofresponsibility; + +public class UsernamePasswordAuthenticationProcessor extends AuthenticationProcessor { + + public UsernamePasswordAuthenticationProcessor(AuthenticationProcessor nextProcessor) { + super(nextProcessor); + } + + @Override + public boolean isAuthorized(AuthenticationProvider authProvider) { + if (authProvider instanceof UsernamePasswordProvider) { + return Boolean.TRUE; + } else if (nextProcessor != null) { + return nextProcessor.isAuthorized(authProvider); + } else { + return Boolean.FALSE; + } + } + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordProvider.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordProvider.java new file mode 100644 index 0000000000..9877039446 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/chainofresponsibility/UsernamePasswordProvider.java @@ -0,0 +1,5 @@ +package com.baeldung.pattern.chainofresponsibility; + +public class UsernamePasswordProvider implements AuthenticationProvider { + +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java new file mode 100644 index 0000000000..9ab34c3cd8 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/application/Application.java @@ -0,0 +1,21 @@ +package com.baeldung.pattern.templatemethod.application; + +import com.baeldung.pattern.templatemethod.model.Computer; +import com.baeldung.pattern.templatemethod.model.StandardComputer; +import com.baeldung.pattern.templatemethod.model.HighEndComputer; +import com.baeldung.pattern.templatemethod.model.ComputerBuilder; +import com.baeldung.pattern.templatemethod.model.HighEndComputerBuilder; +import com.baeldung.pattern.templatemethod.model.StandardComputerBuilder; + +public class Application { + + public static void main(String[] args) { + ComputerBuilder standardComputerBuilder = new StandardComputerBuilder(); + Computer standardComputer = standardComputerBuilder.buildComputer(); + standardComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); + + ComputerBuilder highEndComputerBuilder = new HighEndComputerBuilder(); + Computer highEndComputer = highEndComputerBuilder.buildComputer(); + highEndComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java new file mode 100644 index 0000000000..1419398f62 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/Computer.java @@ -0,0 +1,17 @@ +package com.baeldung.pattern.templatemethod.model; + +import java.util.HashMap; +import java.util.Map; + +public class Computer { + + private Map computerParts = new HashMap<>(); + + public Computer(Map computerParts) { + this.computerParts = computerParts; + } + + public Map getComputerParts() { + return computerParts; + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java new file mode 100644 index 0000000000..515a6940f5 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/ComputerBuilder.java @@ -0,0 +1,38 @@ +package com.baeldung.pattern.templatemethod.model; + +import com.baeldung.pattern.templatemethod.model.Computer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class ComputerBuilder { + + protected Map computerParts = new HashMap<>(); + protected List motherboardSetupStatus = new ArrayList<>(); + + public final Computer buildComputer() { + addMotherboard(); + setupMotherboard(); + addProcessor(); + return getComputer(); + } + + public abstract void addMotherboard(); + + public abstract void setupMotherboard(); + + public abstract void addProcessor(); + + public List getMotherboardSetupStatus() { + return motherboardSetupStatus; + } + + public Map getComputerParts() { + return computerParts; + } + + private Computer getComputer() { + return new Computer(computerParts); + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java new file mode 100644 index 0000000000..0684b1b233 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputer.java @@ -0,0 +1,11 @@ +package com.baeldung.pattern.templatemethod.model; + +import com.baeldung.pattern.templatemethod.model.Computer; +import java.util.Map; + +public class HighEndComputer extends Computer { + + public HighEndComputer(Map computerParts) { + super(computerParts); + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java new file mode 100644 index 0000000000..c992aa2bff --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/HighEndComputerBuilder.java @@ -0,0 +1,21 @@ +package com.baeldung.pattern.templatemethod.model; + +public class HighEndComputerBuilder extends ComputerBuilder { + + @Override + public void addMotherboard() { + computerParts.put("Motherboard", "High-end Motherboard"); + } + + @Override + public void setupMotherboard() { + motherboardSetupStatus.add("Screwing the high-end motherboard to the case."); + motherboardSetupStatus.add("Pluging in the power supply connectors."); + motherboardSetupStatus.forEach(step -> System.out.println(step)); + } + + @Override + public void addProcessor() { + computerParts.put("Processor", "High-end Processor"); + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java new file mode 100644 index 0000000000..4e1d857016 --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputer.java @@ -0,0 +1,11 @@ +package com.baeldung.pattern.templatemethod.model; + +import com.baeldung.pattern.templatemethod.model.Computer; +import java.util.Map; + +public class StandardComputer extends Computer { + + public StandardComputer(Map computerParts) { + super(computerParts); + } +} diff --git a/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java new file mode 100644 index 0000000000..cc81dddc1b --- /dev/null +++ b/patterns/behavioral-patterns/src/main/java/com/baeldung/pattern/templatemethod/model/StandardComputerBuilder.java @@ -0,0 +1,21 @@ +package com.baeldung.pattern.templatemethod.model; + +public class StandardComputerBuilder extends ComputerBuilder { + + @Override + public void addMotherboard() { + computerParts.put("Motherboard", "Standard Motherboard"); + } + + @Override + public void setupMotherboard() { + motherboardSetupStatus.add("Screwing the standard motherboard to the case."); + motherboardSetupStatus.add("Pluging in the power supply connectors."); + motherboardSetupStatus.forEach(step -> System.out.println(step)); + } + + @Override + public void addProcessor() { + computerParts.put("Processor", "Standard Processor"); + } +} diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/chainofresponsibility/ChainOfResponsibilityTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/chainofresponsibility/ChainOfResponsibilityTest.java new file mode 100644 index 0000000000..a84f9dd8e5 --- /dev/null +++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/chainofresponsibility/ChainOfResponsibilityTest.java @@ -0,0 +1,37 @@ +package com.baeldung.pattern.chainofresponsibility; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class ChainOfResponsibilityTest { + + private static AuthenticationProcessor getChainOfAuthProcessor() { + + AuthenticationProcessor oAuthProcessor = new OAuthAuthenticationProcessor(null); + AuthenticationProcessor unamePasswordProcessor = new UsernamePasswordAuthenticationProcessor(oAuthProcessor); + return unamePasswordProcessor; + } + + @Test + public void givenOAuthProvider_whenCheckingAuthorized_thenSuccess() { + AuthenticationProcessor authProcessorChain = getChainOfAuthProcessor(); + boolean isAuthorized = authProcessorChain.isAuthorized(new OAuthTokenProvider()); + assertTrue(isAuthorized); + } + + @Test + public void givenUsernamePasswordProvider_whenCheckingAuthorized_thenSuccess() { + AuthenticationProcessor authProcessorChain = getChainOfAuthProcessor(); + boolean isAuthorized = authProcessorChain.isAuthorized(new UsernamePasswordProvider()); + assertTrue(isAuthorized); + } + + @Test + public void givenSamlAuthProvider_whenCheckingAuthorized_thenFailure() { + AuthenticationProcessor authProcessorChain = getChainOfAuthProcessor(); + boolean isAuthorized = authProcessorChain.isAuthorized(new SamlAuthenticationProvider()); + assertTrue(!isAuthorized); + } + +} diff --git a/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java new file mode 100644 index 0000000000..679559af9f --- /dev/null +++ b/patterns/behavioral-patterns/src/test/java/com/baeldung/pattern/templatemethod/test/TemplateMethodPatternTest.java @@ -0,0 +1,87 @@ +package com.baeldung.pattern.templatemethod.test; + +import com.baeldung.pattern.templatemethod.model.Computer; +import com.baeldung.pattern.templatemethod.model.HighEndComputerBuilder; +import com.baeldung.pattern.templatemethod.model.StandardComputerBuilder; +import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertThat; + +public class TemplateMethodPatternTest { + + private static StandardComputerBuilder standardComputerBuilder; + private static HighEndComputerBuilder highEndComputerBuilder; + + @BeforeClass + public static void setUpStandardComputerBuilderInstance() { + standardComputerBuilder = new StandardComputerBuilder(); + } + + @BeforeClass + public static void setUpHighEndComputerBuilderInstance() { + highEndComputerBuilder = new HighEndComputerBuilder(); + } + + @Test + public void givenStandardMotherBoard_whenAddingMotherBoard_thenEqualAssertion() { + standardComputerBuilder.addMotherboard(); + assertEquals("Standard Motherboard", standardComputerBuilder.getComputerParts().get("Motherboard")); + } + + @Test + public void givenStandardMotherboard_whenSetup_thenTwoEqualAssertions() { + standardComputerBuilder.setupMotherboard(); + assertEquals("Screwing the standard motherboard to the case.", standardComputerBuilder.getMotherboardSetupStatus().get(0)); + assertEquals("Pluging in the power supply connectors.", standardComputerBuilder.getMotherboardSetupStatus().get(1)); + } + + @Test + public void givenStandardProcessor_whenAddingProcessor_thenEqualAssertion() { + standardComputerBuilder.addProcessor(); + assertEquals("Standard Processor", standardComputerBuilder.getComputerParts().get("Processor")); + } + + @Test + public void givenAllStandardParts_whenBuildingComputer_thenTwoParts() { + standardComputerBuilder.buildComputer(); + assertEquals(2, standardComputerBuilder.getComputerParts().size()); + } + + @Test + public void givenAllStandardParts_whenComputerisBuilt_thenComputerInstance() { + assertThat(standardComputerBuilder.buildComputer(), instanceOf(Computer.class)); + } + + @Test + public void givenHighEnddMotherBoard_whenAddingMotherBoard_thenEqualAssertion() { + highEndComputerBuilder.addMotherboard(); + Assert.assertEquals("High-end Motherboard", highEndComputerBuilder.getComputerParts().get("Motherboard")); + } + + @Test + public void givenHighEnddMotheroboard_whenSetup_thenTwoEqualAssertions() { + highEndComputerBuilder.setupMotherboard(); + assertEquals("Screwing the high-end motherboard to the case.", highEndComputerBuilder.getMotherboardSetupStatus().get(0)); + assertEquals("Pluging in the power supply connectors.", highEndComputerBuilder.getMotherboardSetupStatus().get(1)); + } + + @Test + public void givenHightEndProcessor_whenAddingProcessor_thenEqualAssertion() { + highEndComputerBuilder.addProcessor(); + assertEquals("High-end Processor", highEndComputerBuilder.getComputerParts().get("Processor")); + } + + @Test + public void givenAllHighEnddParts_whenBuildingComputer_thenTwoParts() { + highEndComputerBuilder.buildComputer(); + assertEquals(2, highEndComputerBuilder.getComputerParts().size()); + } + + @Test + public void givenAllHighEndParts_whenComputerisBuilt_thenComputerInstance() { + assertThat(standardComputerBuilder.buildComputer(), instanceOf(Computer.class)); + } +} diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml index 7887af5430..b746d5dc6c 100644 --- a/patterns/front-controller/pom.xml +++ b/patterns/front-controller/pom.xml @@ -25,6 +25,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.apache.maven.plugins diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml index 5b7eb48a86..b26b993d69 100644 --- a/patterns/intercepting-filter/pom.xml +++ b/patterns/intercepting-filter/pom.xml @@ -30,6 +30,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.apache.maven.plugins diff --git a/patterns/pom.xml b/patterns/pom.xml index c40d7c58b7..1462952e37 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -9,6 +9,7 @@ front-controller intercepting-filter + behavioral-patterns @@ -51,4 +52,4 @@ 3.0.0 9.4.0.v20161208 - + \ No newline at end of file diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java deleted file mode 100644 index 581c774f52..0000000000 --- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/application/Application.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.templatemethodpattern.application; - -import com.baeldung.templatemethodpattern.model.Computer; -import com.baeldung.templatemethodpattern.model.HighEndComputer; -import com.baeldung.templatemethodpattern.model.StandardComputer; - -public class Application { - - public static void main(String[] args) { - Computer standardComputer = new StandardComputer(); - standardComputer.buildComputer(); - standardComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); - - Computer highEndComputer = new HighEndComputer(); - highEndComputer.buildComputer(); - highEndComputer.getComputerParts().forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); - } -} diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java deleted file mode 100644 index c5d1a2cde8..0000000000 --- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/Computer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.templatemethodpattern.model; - -import java.util.HashMap; -import java.util.Map; - -public abstract class Computer { - - protected Map computerParts = new HashMap<>(); - - public final void buildComputer() { - addMotherboard(); - addProcessor(); - addMemory(); - addHardDrive(); - addGraphicCard(); - addSoundCard(); - } - - public abstract void addProcessor(); - - public abstract void addMotherboard(); - - public abstract void addMemory(); - - public abstract void addHardDrive(); - - public abstract void addGraphicCard(); - - public abstract void addSoundCard(); - - public Map getComputerParts() { - return computerParts; - } -} diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java deleted file mode 100644 index 11baeca6f7..0000000000 --- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/HighEndComputer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.templatemethodpattern.model; - -public class HighEndComputer extends Computer { - - @Override - public void addProcessor() { - computerParts.put("Processor", "High End Processor"); - } - - @Override - public void addMotherboard() { - computerParts.put("Motherboard", "High End Motherboard"); - } - - @Override - public void addMemory() { - computerParts.put("Memory", "16GB"); - } - - @Override - public void addHardDrive() { - computerParts.put("Hard Drive", "2TB Hard Drive"); - } - - @Override - public void addGraphicCard() { - computerParts.put("Graphic Card", "High End Graphic Card"); - } - - @Override - public void addSoundCard() { - computerParts.put("Sound Card", "High End Sound Card"); - } -} diff --git a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java b/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java deleted file mode 100644 index 22ff370203..0000000000 --- a/patterns/template-method/src/main/java/com/baeldung/templatemethodpattern/model/StandardComputer.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.templatemethodpattern.model; - -public class StandardComputer extends Computer { - - @Override - public void addProcessor() { - computerParts.put("Processor", "Standard Processor"); - } - - @Override - public void addMotherboard() { - computerParts.put("Motherboard", "Standard Motherboard"); - } - - @Override - public void addMemory() { - computerParts.put("Memory", "8GB"); - } - - @Override - public void addHardDrive() { - computerParts.put("Hard Drive", "1TB Hard Drive"); - } - - @Override - public void addGraphicCard() { - computerParts.put("Graphic Card", "Standard Graphic Card"); - } - - @Override - public void addSoundCard() { - computerParts.put("Sound Card", "Standard Sound Card"); - } -} diff --git a/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java b/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java deleted file mode 100644 index afe66883ac..0000000000 --- a/patterns/template-method/src/test/java/com/baeldung/templatemethodpatterntest/TemplateMethodPatternTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.baeldung.templatemethodpatterntest; - -import com.baeldung.templatemethodpattern.model.HighEndComputer; -import com.baeldung.templatemethodpattern.model.StandardComputer; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -public class TemplateMethodPatternTest { - - private static StandardComputer standardComputer; - private static HighEndComputer highEndComputer; - - @BeforeClass - public static void setUpStandardComputerInstance() { - standardComputer = new StandardComputer(); - } - - @BeforeClass - public static void setUpHighEndComputerInstance() { - highEndComputer = new HighEndComputer(); - } - - @Test - public void givenStandardProcessor_whenAddingProcessor_thenEqualAssertion() { - standardComputer.addProcessor(); - Assert.assertEquals("Standard Processor", standardComputer - .getComputerParts().get("Processor")); - } - - @Test - public void givenStandardMotherBoard_whenAddingMotherBoard_thenEqualAssertion() { - standardComputer.addMotherboard(); - Assert.assertEquals("Standard Motherboard", standardComputer - .getComputerParts().get("Motherboard")); - } - - @Test - public void givenStandardMemory_whenAddingMemory_thenEqualAssertion() { - standardComputer.addMemory(); - Assert.assertEquals("8GB", standardComputer - .getComputerParts().get("Memory")); - } - - @Test - public void givenStandardHardDrive_whenAddingHardDrive_thenEqualAssertion() { - standardComputer.addHardDrive(); - Assert.assertEquals("1TB Hard Drive", standardComputer - .getComputerParts().get("Hard Drive")); - } - - @Test - public void givenStandardGraphicaCard_whenAddingGraphicCard_thenEqualAssertion() { - standardComputer.addGraphicCard(); - Assert.assertEquals("Standard Graphic Card", standardComputer - .getComputerParts().get("Graphic Card")); - } - - @Test - public void givenStandardSoundCard_whenAddingSoundCard_thenEqualAssertion() { - standardComputer.addSoundCard(); - Assert.assertEquals("Standard Sound Card", standardComputer - .getComputerParts().get("Sound Card")); - } - - @Test - public void givenAllStandardParts_whenBuildingComputer_thenSixParts() { - standardComputer.buildComputer(); - Assert.assertEquals(6, standardComputer - .getComputerParts().size()); - } - - @Test - public void givenHightEndProcessor_whenAddingProcessor_thenEqualAssertion() { - highEndComputer.addProcessor(); - Assert.assertEquals("High End Processor", highEndComputer - .getComputerParts().get("Processor")); - } - - @Test - public void givenHighEnddMotherBoard_whenAddingMotherBoard_thenEqualAssertion() { - highEndComputer.addMotherboard(); - Assert.assertEquals("High End Motherboard", highEndComputer - .getComputerParts().get("Motherboard")); - } - - @Test - public void givenHighEndMemory_whenAddingMemory_thenEqualAssertion() { - highEndComputer.addMemory(); - Assert.assertEquals("16GB", highEndComputer - .getComputerParts().get("Memory")); - } - - @Test - public void givenHighEndHardDrive_whenAddingHardDrive_thenEqualAssertion() { - highEndComputer.addHardDrive(); - Assert.assertEquals("2TB Hard Drive", highEndComputer - .getComputerParts().get("Hard Drive")); - } - - @Test - public void givenHighEndGraphicCard_whenAddingGraphicCard_thenEqualAssertion() { - highEndComputer.addGraphicCard(); - Assert.assertEquals("High End Graphic Card", highEndComputer - .getComputerParts().get("Graphic Card")); - } - - @Test - public void givenHighEndSoundCard_whenAddingSoundCard_thenEqualAssertion() { - highEndComputer.addSoundCard(); - Assert.assertEquals("High End Sound Card", highEndComputer - .getComputerParts().get("Sound Card")); - } - - @Test - public void givenAllHighEndParts_whenBuildingComputer_thenSixParts() { - highEndComputer.buildComputer(); - Assert.assertEquals(6, highEndComputer.getComputerParts().size()); - } -} diff --git a/persistence-modules/README.md b/persistence-modules/README.md new file mode 100644 index 0000000000..f05a822c30 --- /dev/null +++ b/persistence-modules/README.md @@ -0,0 +1,9 @@ + +## Persistence Modules + + +### Relevant Articles: + +- [Introduction to Hibernate Search](http://www.baeldung.com/hibernate-search) +- [Bootstrapping Hibernate 5 with Spring](http://www.baeldung.com/hibernate-5-spring) +- [Introduction to Lettuce – the Java Redis Client](http://www.baeldung.com/java-redis-lettuce) diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index faaabb9e2e..81e072c3a7 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/java-cockroachdb/README.md b/persistence-modules/java-cockroachdb/README.md new file mode 100644 index 0000000000..3bab6faa29 --- /dev/null +++ b/persistence-modules/java-cockroachdb/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to CockroachDB in Java](http://www.baeldung.com/cockroachdb-java) diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml new file mode 100644 index 0000000000..2b6f9651bc --- /dev/null +++ b/persistence-modules/java-cockroachdb/pom.xml @@ -0,0 +1,74 @@ + + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../ + + + 4.0.0 + + com.baeldung + java-cockroachdb + 1.0-SNAPSHOT + + + 42.1.4 + + + + + org.postgresql + postgresql + ${postgresql.version} + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + + + + + Central + Central + http://repo1.maven.org/maven2/ + default + + + \ No newline at end of file diff --git a/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/domain/Article.java b/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/domain/Article.java new file mode 100644 index 0000000000..dcc9dfb5b7 --- /dev/null +++ b/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/domain/Article.java @@ -0,0 +1,43 @@ +package com.baeldung.cockroachdb.domain; + +import java.util.UUID; + +public class Article { + + private UUID id; + + private String title; + + private String author; + + public Article(UUID id, String title, String author) { + this.id = id; + this.title = title; + this.author = author; + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + +} diff --git a/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/repository/ArticleRepository.java b/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/repository/ArticleRepository.java new file mode 100644 index 0000000000..a37c19e397 --- /dev/null +++ b/persistence-modules/java-cockroachdb/src/main/java/com/baeldung/cockroachdb/repository/ArticleRepository.java @@ -0,0 +1,172 @@ +package com.baeldung.cockroachdb.repository; + +import com.baeldung.cockroachdb.domain.Article; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * Repository for the articles table related operations + */ +public class ArticleRepository { + + private static final String TABLE_NAME = "articles"; + private Connection connection; + + public ArticleRepository(Connection connection) { + this.connection = connection; + } + + /** + * Creates the articles table. + */ + public void createTable() throws SQLException { + StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME) + .append("(id uuid PRIMARY KEY, ") + .append("title string,") + .append("author string)"); + + final String query = sb.toString(); + Statement stmt = connection.createStatement(); + stmt.execute(query); + } + + /** + * Alter the articles table adding a column + * + * @param columnName Column name of the additional column + * @param columnType Column type of the additional column + * @throws SQLException + */ + public void alterTable(String columnName, String columnType) throws SQLException { + StringBuilder sb = new StringBuilder("ALTER TABLE ").append(TABLE_NAME) + .append(" ADD ") + .append(columnName) + .append(" ") + .append(columnType); + + final String query = sb.toString(); + Statement stmt = connection.createStatement(); + stmt.execute(query); + } + + /** + * Insert a new article in the articles table + * + * @param article New article to insert + * @throws SQLException + */ + public void insertArticle(Article article) throws SQLException { + StringBuilder sb = new StringBuilder("INSERT INTO ").append(TABLE_NAME) + .append("(id, title, author) ") + .append("VALUES (?,?,?)"); + + final String query = sb.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(query); + preparedStatement.setString(1, article.getId().toString()); + preparedStatement.setString(2, article.getTitle()); + preparedStatement.setString(3, article.getAuthor()); + preparedStatement.execute(); + } + + /** + * Select article by Title + * + * @param title title of the article to retrieve + * @return article with the given title + * @throws SQLException + */ + public Article selectByTitle(String title) throws SQLException { + StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME) + .append(" WHERE title = ?"); + + final String query = sb.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(query); + preparedStatement.setString(1, title); + + try (ResultSet rs = preparedStatement.executeQuery()) { + + List
articles = new ArrayList<>(); + + while (rs.next()) { + Article article = new Article( + UUID.fromString(rs.getString("id")), + rs.getString("title"), + rs.getString("author") + ); + articles.add(article); + } + return articles.get(0); + } + + } + + /** + * Select all the articles + * + * @return list of all articles + * @throws SQLException + */ + public List
selectAll() throws SQLException { + StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME); + + final String query = sb.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(query); + try (ResultSet rs = preparedStatement.executeQuery()) { + + List
articles = new ArrayList<>(); + + while (rs.next()) { + Article article = new Article( + UUID.fromString(rs.getString("id")), + rs.getString("title"), + rs.getString("author") + ); + articles.add(article); + } + return articles; + } + } + + /** + * Delete article by title + * + * @param title title of the article to delete + * @throws SQLException + */ + public void deleteArticleByTitle(String title) throws SQLException { + StringBuilder sb = new StringBuilder("DELETE FROM ").append(TABLE_NAME) + .append(" WHERE title = ?"); + + final String query = sb.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(query); + preparedStatement.setString(1, title); + preparedStatement.execute(); + } + + /** + * Delete all rows in the table + * + * @throws SQLException + */ + public void truncateTable() throws SQLException { + StringBuilder sb = new StringBuilder("TRUNCATE TABLE ").append(TABLE_NAME); + + final String query = sb.toString(); + Statement stmt = connection.createStatement(); + stmt.execute(query); + } + + /** + * Delete table + */ + public void deleteTable() throws SQLException { + StringBuilder sb = new StringBuilder("DROP TABLE IF EXISTS ").append(TABLE_NAME); + + final String query = sb.toString(); + Statement stmt = connection.createStatement(); + stmt.execute(query); + } +} diff --git a/persistence-modules/java-cockroachdb/src/test/java/com/baeldung/cockroachdb/ArticleRepositoryIntegrationTest.java b/persistence-modules/java-cockroachdb/src/test/java/com/baeldung/cockroachdb/ArticleRepositoryIntegrationTest.java new file mode 100644 index 0000000000..9eb00b3651 --- /dev/null +++ b/persistence-modules/java-cockroachdb/src/test/java/com/baeldung/cockroachdb/ArticleRepositoryIntegrationTest.java @@ -0,0 +1,208 @@ +package com.baeldung.cockroachdb; + +import com.baeldung.cockroachdb.domain.Article; +import com.baeldung.cockroachdb.repository.ArticleRepository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.postgresql.util.PSQLException; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ArticleRepositoryIntegrationTest { + + private static final String TABLE_NAME = "articles"; + + private Connection con; + private ArticleRepository articleRepository; + + @Before + public void connect() throws Exception { + Class.forName("org.postgresql.Driver"); + con = DriverManager.getConnection("jdbc:postgresql://localhost:26257/testdb", "user17", "qwerty"); + + articleRepository = new ArticleRepository(con); + } + + @Test + public void whenCreatingTable_thenCreatedCorrectly() throws Exception { + articleRepository.deleteTable(); + articleRepository.createTable(); + + PreparedStatement preparedStatement = con.prepareStatement("SHOW TABLES"); + ResultSet resultSet = preparedStatement.executeQuery(); + List tables = new ArrayList<>(); + while (resultSet.next()) { + tables.add(resultSet.getString("Table")); + } + + assertTrue(tables.stream().anyMatch(t -> t.equals(TABLE_NAME))); + } + + @Test + public void whenAlteringTheTable_thenColumnAddedCorrectly() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + String columnName = "creationdate"; + articleRepository.alterTable(columnName, "DATE"); + + String query = "SHOW COLUMNS FROM " + TABLE_NAME; + PreparedStatement preparedStatement = con.prepareStatement(query); + ResultSet resultSet = preparedStatement.executeQuery(); + List columns = new ArrayList<>(); + while (resultSet.next()) { + columns.add(resultSet.getString("Field")); + } + + assertTrue(columns.stream().anyMatch(c -> c.equals(columnName))); + } + + @Test + public void whenInsertingNewArticle_thenArticleExists() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + String title = "Guide to CockroachDB in Java"; + String author = "baeldung"; + Article article = new Article(UUID.randomUUID(), title, author); + articleRepository.insertArticle(article); + + Article savedArticle = articleRepository.selectByTitle(title); + assertEquals(article.getTitle(), savedArticle.getTitle()); + } + + @Test + public void whenSelectingAllArticles_thenAllArticlesAreReturned() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + Article article = new Article(UUID.randomUUID(), "Guide to CockroachDB in Java", "baeldung"); + articleRepository.insertArticle(article); + + article = new Article(UUID.randomUUID(), "A Guide to MongoDB with Java", "baeldung"); + articleRepository.insertArticle(article); + + List
savedArticles = articleRepository.selectAll(); + + assertEquals(2, savedArticles.size()); + assertTrue(savedArticles.stream().anyMatch(a -> a.getTitle().equals("Guide to CockroachDB in Java"))); + assertTrue(savedArticles.stream().anyMatch(a -> a.getTitle().equals("A Guide to MongoDB with Java"))); + } + + @Test + public void whenDeletingArticleByTtile_thenArticleIsDeleted() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + Article article = new Article(UUID.randomUUID(), "Guide to CockroachDB in Java", "baeldung"); + articleRepository.insertArticle(article); + + article = new Article(UUID.randomUUID(), "A Guide to MongoDB with Java", "baeldung"); + articleRepository.insertArticle(article); + + articleRepository.deleteArticleByTitle("A Guide to MongoDB with Java"); + + List
savedArticles = articleRepository.selectAll(); + assertEquals(1, savedArticles.size()); + assertTrue(savedArticles.stream().anyMatch(a -> a.getTitle().equals("Guide to CockroachDB in Java"))); + assertFalse(savedArticles.stream().anyMatch(a -> a.getTitle().equals("A Guide to MongoDB with Java"))); + } + + @Test(expected = PSQLException.class) + public void whenDeletingATable_thenExceptionIfAccessed() throws SQLException { + articleRepository.createTable(); + articleRepository.deleteTable(); + + StringBuilder sb = new StringBuilder("SELECT * FROM ").append(TABLE_NAME); + + final String query = sb.toString(); + PreparedStatement preparedStatement = con.prepareStatement(query); + preparedStatement.executeQuery(); + } + + @Test + public void whenTruncatingATable_thenEmptyTable() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + Article article = new Article(UUID.randomUUID(), "Guide to CockroachDB in Java", "baeldung"); + articleRepository.insertArticle(article); + + article = new Article(UUID.randomUUID(), "A Guide to MongoDB with Java", "baeldung"); + articleRepository.insertArticle(article); + + articleRepository.truncateTable(); + + List
savedArticles = articleRepository.selectAll(); + assertEquals(0, savedArticles.size()); + } + + @Test + public void whenInsertingTwoArticlesWithSamePrimaryKeyInASingleTransaction_thenRollback() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + try { + con.setAutoCommit(false); + + UUID articleId = UUID.randomUUID(); + + Article article = new Article(articleId, "Guide to CockroachDB in Java", "baeldung"); + articleRepository.insertArticle(article); + + article = new Article(articleId, "A Guide to MongoDB with Java", "baeldung"); + articleRepository.insertArticle(article); + + con.commit(); + } catch (Exception e) { + con.rollback(); + } finally { + con.setAutoCommit(true); + } + + List
savedArticles = articleRepository.selectAll(); + assertEquals(0, savedArticles.size()); + } + + @Test + public void whenInsertingTwoArticlesInASingleTransaction_thenInserted() throws SQLException { + articleRepository.deleteTable(); + articleRepository.createTable(); + + try { + con.setAutoCommit(false); + + Article article = new Article(UUID.randomUUID(), "Guide to CockroachDB in Java", "baeldung"); + articleRepository.insertArticle(article); + + article = new Article(UUID.randomUUID(), "A Guide to MongoDB with Java", "baeldung"); + articleRepository.insertArticle(article); + + con.commit(); + } catch (Exception e) { + con.rollback(); + } finally { + con.setAutoCommit(true); + } + + List
savedArticles = articleRepository.selectAll(); + assertEquals(2, savedArticles.size()); + assertTrue(savedArticles.stream().anyMatch(a -> a.getTitle().equals("Guide to CockroachDB in Java"))); + assertTrue(savedArticles.stream().anyMatch(a -> a.getTitle().equals("A Guide to MongoDB with Java"))); + } + + @After + public void disconnect() throws SQLException { + articleRepository = null; + con.close(); + con = null; + } +} diff --git a/persistence-modules/java-jdbi/README.md b/persistence-modules/java-jdbi/README.md new file mode 100644 index 0000000000..3bab6faa29 --- /dev/null +++ b/persistence-modules/java-jdbi/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Guide to CockroachDB in Java](http://www.baeldung.com/cockroachdb-java) diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml new file mode 100644 index 0000000000..392f0bdcbf --- /dev/null +++ b/persistence-modules/java-jdbi/pom.xml @@ -0,0 +1,40 @@ + + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../ + + + 4.0.0 + + java-jdbi + 1.0-SNAPSHOT + + + + org.jdbi + jdbi3-core + 3.1.0 + + + org.hsqldb + hsqldb + 2.4.0 + test + + + + + + Central + Central + http://repo1.maven.org/maven2/ + default + + + \ No newline at end of file diff --git a/persistence-modules/java-jdbi/src/test/java/com/baeldung/persistence/jdbi/JdbiTest.java b/persistence-modules/java-jdbi/src/test/java/com/baeldung/persistence/jdbi/JdbiTest.java new file mode 100644 index 0000000000..503bf90fdb --- /dev/null +++ b/persistence-modules/java-jdbi/src/test/java/com/baeldung/persistence/jdbi/JdbiTest.java @@ -0,0 +1,338 @@ +package com.baeldung.persistence.jdbi; + +import org.jdbi.v3.core.Handle; +import org.jdbi.v3.core.Jdbi; +import org.jdbi.v3.core.result.ResultBearing; +import org.jdbi.v3.core.result.ResultProducer; +import org.jdbi.v3.core.statement.Query; +import org.jdbi.v3.core.statement.StatementContext; +import org.jdbi.v3.core.statement.Update; +import org.junit.Test; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import static org.junit.Assert.*; + +public class JdbiTest { + + @Test + public void whenJdbiCreated_thenSuccess() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + + Jdbi.create("WRONG"); + } + + @Test + public void whenJdbiWithProperties_thenSuccess() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.open().close(); + Properties properties = new Properties(); + properties.setProperty("username", "sa"); + properties.setProperty("password", ""); + jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", properties); + jdbi.open().close(); + } + + @Test + public void whenHandle_thenBoh() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + final Handle[] handleRef = new Handle[1]; + boolean closed = jdbi.withHandle(handle -> { + handleRef[0] = handle; + return handle.isClosed(); + }); + + assertFalse(closed); + assertTrue(handleRef[0].isClosed()); + } + + @Test + public void whenTableCreated_thenInsertIsPossible() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + int updateCount = handle.execute("create table PROJECT_1 (id integer identity, name varchar(50), url varchar(100))"); + + assertEquals(0, updateCount); + + updateCount = handle.execute("INSERT INTO PROJECT_1 VALUES (1, 'tutorials', 'github.com/eugenp/tutorials')"); + + assertEquals(1, updateCount); + }); + } + + @Test + public void whenIdentityColumn_thenInsertReturnsNewId() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_2 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + Update update = handle.createUpdate( + "INSERT INTO PROJECT_2 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + ResultBearing generatedKeys = update.executeAndReturnGeneratedKeys(); + + assertEquals(0, generatedKeys.mapToMap().findOnly().get("id")); + + update = handle.createUpdate( + "INSERT INTO PROJECT_2 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + + assertEquals(1, generatedKeys.mapToMap().findOnly().get("id")); + }); + } + + @Test + public void whenSelectMapToMap_thenResultsAreMapEntries() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_3 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_3 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + Query query = handle.createQuery("select * from PROJECT_3 order by id"); + List> list = query.mapToMap().list(); + + assertEquals("tutorials", list.get(0).get("name")); + assertEquals("REST with Spring", list.get(1).get("name")); + }); + } + + @Test + public void whenSelectMapToString_thenResultIsString() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_4 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_4 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + Query query = handle.createQuery("select name, url from PROJECT_4 order by id"); + List list = query.mapTo(String.class).list(); + + assertEquals("tutorials", list.get(0)); + assertEquals("REST with Spring", list.get(1)); + }); + } + + @Test + public void whenSelectMapToString_thenStream() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_5 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_5 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + Query query = handle.createQuery("select name, url from PROJECT_5 order by id"); + query.mapTo(String.class).useStream((Stream stream) -> assertEquals("tutorials", stream.findFirst().get())); + }); + } + + @Test + public void whenNoResults_thenFindFirstReturnsNone() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_6 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + + assertFalse(handle.createQuery("select * from project_6").mapToMap().findFirst().isPresent()); + }); + } + + @Test + public void whenMultipleResults_thenFindFirstReturnsFirst() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_7 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_7 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_7 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + + Query query = handle.createQuery("select * from project_7 order by id"); + Optional> first = query.mapToMap().findFirst(); + + assertTrue(first.isPresent()); + assertEquals("tutorials", first.get().get("name")); + }); + } + + @Test + public void whenNoResults_thenFindOnlyThrows() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_8 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + + try { + handle.createQuery("select * from project_8").mapToMap().findOnly(); + + fail("Exception expected"); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + @Test + public void whenMultipleResults_thenFindOnlyThrows() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_9 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('tutorials', 'github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_9 (NAME, URL) VALUES ('REST with Spring', 'github.com/eugenp/REST-With-Spring')"); + + try { + Query query = handle.createQuery("select * from project_9"); + Map onlyResult = query.mapToMap().findOnly(); + + fail("Exception expected"); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + @Test + public void whenParameters_thenReplacement() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_10 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + Update update1 = handle.createUpdate("INSERT INTO PROJECT_10 (NAME, URL) VALUES (?, ?)"); + update1.bind(0, "tutorials"); + update1.bind(1, "github.com/eugenp/tutorials"); + int rows = update1.execute(); + + assertEquals(1, rows); + + Update update2 = handle.createUpdate("INSERT INTO PROJECT_10 (NAME, URL) VALUES (:name, :url)"); + update2.bind("name", "REST with Spring"); + update2.bind("url", "github.com/eugenp/REST-With-Spring"); + rows = update2.execute(); + + assertEquals(1, rows); + + List> list = + handle.select("SELECT * FROM PROJECT_10 WHERE NAME = 'tutorials'").mapToMap().list(); + + assertEquals(1, list.size()); + + list = handle.select("SELECT * FROM PROJECT_10 WHERE NAME = 'REST with Spring'").mapToMap().list(); + + assertEquals(1, list.size()); + }); + } + + @Test + public void whenMultipleParameters_thenReplacement() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.execute("create table PROJECT_11 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + Update update = handle.createUpdate("INSERT INTO PROJECT_11 (NAME, URL) VALUES (:name, :url)"); + Map params = new HashMap<>(); + params.put("name", "REST with Spring"); + params.put("url", "github.com/eugenp/REST-With-Spring"); + update.bindMap(params); + int rows = update.execute(); + + assertEquals(1, rows); + + List> list = + handle.select("SELECT * FROM PROJECT_11").mapToMap().list(); + + assertEquals(1, list.size()); + + class Params { + private String name; + private String url; + + public Params(String name, String url) { + this.name = name; + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + + update.bindBean(new Params("tutorials", "github.com/eugenp/tutorials")); + rows = update.execute(); + + assertEquals(1, rows); + + list = handle.select("SELECT * FROM PROJECT_11").mapToMap().list(); + + assertEquals(2, list.size()); + }); + } + + @Test + public void whenTransactionRollback_thenNoDataInserted() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.useTransaction(h -> { + handle.execute("create table PROJECT_12 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_12 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_12 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')"); + handle.rollback(); + List> list = handle.select("SELECT * FROM PROJECT_12").mapToMap().list(); + + assertEquals(0, list.size()); + }); + }); + } + + @Test + public void whenTransactionRollbackThenCommit_thenOnlyLastInserted() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + handle.useTransaction((Handle h) -> { + assertEquals(handle, h); + + handle.execute("create table PROJECT_13 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + handle.execute("INSERT INTO PROJECT_13 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')"); + handle.rollback(); + handle.begin(); + handle.execute("INSERT INTO PROJECT_13 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')"); + handle.rollback(); + handle.begin(); + handle.execute("INSERT INTO PROJECT_13 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')"); + handle.execute("INSERT INTO PROJECT_13 (NAME, URL) VALUES ('REST with Spring', 'https://github.com/eugenp/REST-With-Spring')"); + handle.commit(); + }); + List> list = handle.select("SELECT * FROM PROJECT_13").mapToMap().list(); + + assertEquals(2, list.size()); + }); + } + + + @Test + public void whenException_thenTransactionIsRolledBack() { + Jdbi jdbi = Jdbi.create("jdbc:hsqldb:mem:testDB", "sa", ""); + jdbi.useHandle(handle -> { + try { + handle.useTransaction(h -> { + h.execute("create table PROJECT_14 (ID IDENTITY, NAME VARCHAR (50), URL VARCHAR (100))"); + h.execute("INSERT INTO PROJECT_14 (NAME, URL) VALUES ('tutorials', 'https://github.com/eugenp/tutorials')"); + List> list = handle.select("SELECT * FROM PROJECT_14").mapToMap().list(); + + assertTrue(h.isInTransaction()); + assertEquals(1, list.size()); + + throw new Exception("rollback"); + }); + } catch (Exception ignored) {} + List> list = handle.select("SELECT * FROM PROJECT_14").mapToMap().list(); + + assertFalse(handle.isInTransaction()); + assertEquals(0, list.size()); + }); + } + +} diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml index aab48921a6..9784b2c5a8 100644 --- a/persistence-modules/java-mongodb/pom.xml +++ b/persistence-modules/java-mongodb/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index 020c2516a2..a70483437f 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -6,7 +6,7 @@ parent-modules com.baeldung 1.0.0-SNAPSHOT - ../ + ../../ 4.0.0 @@ -26,7 +26,7 @@ org.apache.maven.plugins maven-compiler-plugin - 2.5.1 + 3.7.0 1.8 1.8 diff --git a/persistence-modules/querydsl/pom.xml b/persistence-modules/querydsl/pom.xml index 27f383e0c6..c2943875f1 100644 --- a/persistence-modules/querydsl/pom.xml +++ b/persistence-modules/querydsl/pom.xml @@ -15,7 +15,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/redis/README.md b/persistence-modules/redis/README.md index d179b80c33..dd655ca7aa 100644 --- a/persistence-modules/redis/README.md +++ b/persistence-modules/redis/README.md @@ -1,3 +1,5 @@ ### Relevant Articles: - [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) - [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson) +- [Intro to Lettuce – the Java Redis Client Library](http://www.baeldung.com/lettuce-java-redis-client-library) + diff --git a/persistence-modules/redis/pom.xml b/persistence-modules/redis/pom.xml index ef081a2c69..1f27faa09a 100644 --- a/persistence-modules/redis/pom.xml +++ b/persistence-modules/redis/pom.xml @@ -15,7 +15,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ @@ -36,6 +36,13 @@ redisson 3.3.0 + + + io.lettuce + lettuce-core + 5.0.1.RELEASE + + diff --git a/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java b/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java new file mode 100644 index 0000000000..eb879d1d21 --- /dev/null +++ b/persistence-modules/redis/src/test/java/com/baeldung/LettuceIntegrationLiveTest.java @@ -0,0 +1,312 @@ +package com.baeldung; + +import io.lettuce.core.LettuceFutures; +import io.lettuce.core.RedisClient; +import io.lettuce.core.RedisFuture; +import io.lettuce.core.TransactionResult; +import io.lettuce.core.api.StatefulRedisConnection; +import io.lettuce.core.api.async.RedisAsyncCommands; +import io.lettuce.core.api.sync.RedisCommands; +import io.lettuce.core.pubsub.RedisPubSubListener; +import io.lettuce.core.pubsub.StatefulRedisPubSubConnection; +import io.lettuce.core.pubsub.api.async.RedisPubSubAsyncCommands; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertTrue; + +public class LettuceIntegrationLiveTest { + + private static Logger log = LoggerFactory.getLogger(LettuceIntegrationLiveTest.class); + + private static StatefulRedisConnection redisConnection; + + private static RedisClient redisClient; + + @BeforeClass + public static void setUp() { + // Docker defaults to mapping redis port to 32768 + redisClient = RedisClient.create("redis://localhost:32768/"); + redisConnection = redisClient.connect(); + } + + @AfterClass + public static void destroy() { + redisConnection.close(); + } + + @Test + public void givenAString_thenSaveItAsRedisStringsSync() { + + RedisCommands syncCommands = redisConnection.sync(); + + String key = "key"; + String value = "value"; + + syncCommands.set(key, value); + String response = syncCommands.get(key); + + Assert.assertEquals(value, response); + } + + @Test + public void givenValues_thenSaveAsRedisHashSync() { + + RedisCommands syncCommands = redisConnection.sync(); + + String recordName = "record1"; + String name = "FirstName"; + String value = "John"; + String surname = "LastName"; + String value1 = "Smith"; + + syncCommands.hset(recordName, name, value); + syncCommands.hset(recordName, surname, value1); + Map record = syncCommands.hgetall(recordName); + + Assert.assertEquals(record.get(name), value); + Assert.assertEquals(record.get(surname), value1); + } + + @Test + public void givenAString_thenSaveItAsRedisStringsAsync() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + String key = "key"; + String value = "value"; + + asyncCommands.set(key, value); + RedisFuture redisFuture = asyncCommands.get(key); + + String response = redisFuture.get(); + + Assert.assertEquals(value, response); + } + + @Test + public void givenValues_thenSaveAsRedisHashAsync() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + String recordName = "record1"; + String name = "FirstName"; + String value = "John"; + String surname = "LastName"; + String value1 = "Smith"; + + asyncCommands.hset(recordName, name, value); + asyncCommands.hset(recordName, surname, value1); + RedisFuture> redisFuture = asyncCommands.hgetall(recordName); + + Map record = redisFuture.get(); + + Assert.assertEquals(record.get(name), value); + Assert.assertEquals(record.get(surname), value1); + } + + @Test + public void givenValues_thenSaveAsRedisListAsync() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + String listName = "tasks"; + String firstTask = "firstTask"; + String secondTask = "secondTask"; + + asyncCommands.del(listName); + + asyncCommands.lpush(listName, firstTask); + asyncCommands.lpush(listName, secondTask); + RedisFuture redisFuture = asyncCommands.rpop(listName); + + String nextTask = redisFuture.get(); + + Assert.assertEquals(firstTask, nextTask); + + asyncCommands.del(listName); + + asyncCommands.lpush(listName, firstTask); + asyncCommands.lpush(listName, secondTask); + + redisFuture = asyncCommands.lpop(listName); + + nextTask = redisFuture.get(); + + Assert.assertEquals(secondTask, nextTask); + + } + + @Test + public void givenSetElements_thenSaveThemInRedisSetAsync() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + String countries = "countries"; + + String countryOne = "Spain"; + String countryTwo = "Ireland"; + String countryThree = "Ireland"; + + asyncCommands.sadd(countries, countryOne); + + RedisFuture> countriesSetFuture = asyncCommands.smembers(countries); + Assert.assertEquals(2, countriesSetFuture.get().size()); + + asyncCommands.sadd(countries, countryTwo); + countriesSetFuture = asyncCommands.smembers(countries); + Assert.assertEquals(2, countriesSetFuture.get().size()); + + asyncCommands.sadd(countries, countryThree); + countriesSetFuture = asyncCommands.smembers(countries); + Assert.assertEquals(2, countriesSetFuture.get().size()); + + RedisFuture exists = asyncCommands.sismember(countries, countryThree); + assertTrue(exists.get()); + } + + @Test + public void givenARanking_thenSaveItInRedisSortedSetAsync() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + String key = "sortedset"; + + asyncCommands.zadd(key, 1, "one"); + asyncCommands.zadd(key, 4, "zero"); + asyncCommands.zadd(key, 2, "two"); + + RedisFuture> values = asyncCommands.zrevrange(key, 0, 3); + Assert.assertEquals("zero", values.get().get(0)); + + values = asyncCommands.zrange(key, 0, 3); + Assert.assertEquals("one", values.get().get(0)); + } + + @Test + public void givenMultipleOperationsThatNeedToBeExecutedAtomically_thenWrapThemInATransaction() throws Exception { + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + // Start a transaction + asyncCommands.multi(); + + // Add three sets to it, and save the future responses + RedisFuture result1 = asyncCommands.set("key1", "value1"); + RedisFuture result2 = asyncCommands.set("key2", "value2"); + RedisFuture result3 = asyncCommands.set("key3", "value3"); + + // Execute it + RedisFuture execResult = asyncCommands.exec(); + + TransactionResult transactionResult = execResult.get(); + + // Get the three results in the transaction return + String firstResult = transactionResult.get(0); + String secondResult = transactionResult.get(0); + String thirdResult = transactionResult.get(0); + + // Our results are in both! + assertTrue(firstResult.equals("OK")); + assertTrue(secondResult.equals("OK")); + assertTrue(thirdResult.equals("OK")); + + assertTrue(result1.get().equals("OK")); + assertTrue(result2.get().equals("OK")); + assertTrue(result3.get().equals("OK")); + } + + @Test + public void givenMultipleIndependentOperations_whenNetworkOptimizationIsImportant_thenFlushManually() throws Exception { + + int iterations = 50; + + RedisAsyncCommands asyncCommands = redisConnection.async(); + + asyncCommands.setAutoFlushCommands(false); + + List> futures = new ArrayList<>(); + for (int i = 0; i < iterations; i++) { + futures.add(asyncCommands.set("key" + i, "value" + i)); + } + + asyncCommands.flushCommands(); + + // Wait until all futures complete + boolean result = LettuceFutures.awaitAll(5, TimeUnit.SECONDS, futures.toArray(new RedisFuture[futures.size()])); + + asyncCommands.setAutoFlushCommands(true); + + } + + @Test + public void givenPubSubChannel_whenMessage_thenMessageReceived() throws Exception { + + Listener listener = new Listener(); + StatefulRedisPubSubConnection connection = redisClient.connectPubSub(); + StatefulRedisPubSubConnection pubconnection = redisClient.connectPubSub(); + connection.addListener(listener); + + RedisPubSubAsyncCommands async = connection.async(); + async.subscribe("channel"); + + RedisPubSubAsyncCommands pubasync = pubconnection.async(); + RedisFuture result = pubasync.publish("channel", "hithere"); + + // Need a long wait for publish to complete, depending on system. + result.get(15, TimeUnit.SECONDS); + assertTrue(listener.getMessage().equals("hithere")); + + } + + private static class Listener implements RedisPubSubListener { + + private String message; + + String getMessage() { + return message; + } + + @Override + public void message(String channel, String message) { + log.debug("Got {} on {}", message, channel); + this.message = message; + } + + @Override + public void message(String pattern, String channel, String message) { + + } + + @Override + public void subscribed(String channel, long count) { + log.debug("Subscribed to {}", channel); + } + + @Override + public void psubscribed(String pattern, long count) { + + } + + @Override + public void unsubscribed(String channel, long count) { + + } + + @Override + public void punsubscribed(String pattern, long count) { + + } + } + +} diff --git a/persistence-modules/solr/pom.xml b/persistence-modules/solr/pom.xml index 2fd0bdd721..966bd8755b 100644 --- a/persistence-modules/solr/pom.xml +++ b/persistence-modules/solr/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-cassandra/pom.xml b/persistence-modules/spring-data-cassandra/pom.xml index 607d7b90ba..1358210a45 100644 --- a/persistence-modules/spring-data-cassandra/pom.xml +++ b/persistence-modules/spring-data-cassandra/pom.xml @@ -13,7 +13,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml index bf90779c29..c3ea9abf08 100644 --- a/persistence-modules/spring-data-dynamodb/pom.xml +++ b/persistence-modules/spring-data-dynamodb/pom.xml @@ -23,6 +23,10 @@ 4.4.1 1.11.64 3.3.7-1 + 1.0.392 + 1.11.106 + 1.11.86 + https://s3-us-west-2.amazonaws.com/dynamodb-local/release @@ -103,6 +107,57 @@ httpclient ${httpclient.version} + + + + + com.amazonaws + DynamoDBLocal + ${dynamodblocal.version} + test + + + com.almworks.sqlite4java + sqlite4java + ${sqlite4java.version} + test + + + com.almworks.sqlite4java + sqlite4java-win32-x86 + ${sqlite4java.version} + dll + test + + + com.almworks.sqlite4java + sqlite4java-win32-x64 + ${sqlite4java.version} + dll + test + + + com.almworks.sqlite4java + libsqlite4java-osx + ${sqlite4java.version} + dylib + test + + + com.almworks.sqlite4java + libsqlite4java-linux-i386 + ${sqlite4java.version} + so + test + + + com.almworks.sqlite4java + libsqlite4java-linux-amd64 + ${sqlite4java.version} + so + test + + @@ -120,6 +175,25 @@ org.apache.maven.plugins maven-war-plugin + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + copy-dependencies + test-compile + + copy-dependencies + + + test + so,dll,dylib + ${project.basedir}/native-libs + + + + @@ -142,6 +216,11 @@ false + + dynamodb-local + DynamoDB Local Release Repository + ${dynamodblocal.repository.url} + diff --git a/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java index 2ff418b4ec..6cbd5b0a5a 100644 --- a/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/ProductInfoRepositoryIntegrationTest.java @@ -8,8 +8,9 @@ import com.amazonaws.services.dynamodbv2.model.ResourceInUseException; import com.baeldung.Application; import com.baeldung.spring.data.dynamodb.model.ProductInfo; import com.baeldung.spring.data.dynamodb.repositories.ProductInfoRepository; +import com.baeldung.spring.data.dynamodb.repository.rule.LocalDbCreationRule; import org.junit.Before; -import org.junit.Ignore; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +22,10 @@ import org.springframework.test.context.web.WebAppConfiguration; import java.util.List; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @@ -30,6 +34,9 @@ import static org.junit.Assert.assertTrue; @TestPropertySource(properties = { "amazon.dynamodb.endpoint=http://localhost:8000/", "amazon.aws.accesskey=test1", "amazon.aws.secretkey=test231" }) public class ProductInfoRepositoryIntegrationTest { + @ClassRule + public static LocalDbCreationRule dynamoDB = new LocalDbCreationRule(); + private DynamoDBMapper dynamoDBMapper; @Autowired @@ -42,7 +49,6 @@ public class ProductInfoRepositoryIntegrationTest { private static final String EXPECTED_PRICE = "50"; @Before - @Ignore // TODO Remove Ignore annotations when running locally with Local DynamoDB instance public void setup() throws Exception { try { @@ -57,19 +63,18 @@ public class ProductInfoRepositoryIntegrationTest { // Do nothing, table already created } - // TODO How to handle different environments. i.e. AVOID deleting all entries in ProductInfoion table + // TODO How to handle different environments. i.e. AVOID deleting all entries in ProductInfo on table dynamoDBMapper.batchDelete((List) repository.findAll()); } @Test - @Ignore // TODO Remove Ignore annotations when running locally with Local DynamoDB instance public void givenItemWithExpectedCost_whenRunFindAll_thenItemIsFound() { ProductInfo productInfo = new ProductInfo(EXPECTED_COST, EXPECTED_PRICE); repository.save(productInfo); List result = (List) repository.findAll(); - assertTrue("Not empty", result.size() > 0); - assertTrue("Contains item with expected cost", result.get(0).getCost().equals(EXPECTED_COST)); + assertThat(result.size(), is(greaterThan(0))); + assertThat(result.get(0).getCost(), is(equalTo(EXPECTED_COST))); } } diff --git a/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/rule/LocalDbCreationRule.java b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/rule/LocalDbCreationRule.java new file mode 100644 index 0000000000..555d558b06 --- /dev/null +++ b/persistence-modules/spring-data-dynamodb/src/test/java/com/baeldung/spring/data/dynamodb/repository/rule/LocalDbCreationRule.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.data.dynamodb.repository.rule; + +import com.amazonaws.services.dynamodbv2.local.main.ServerRunner; +import com.amazonaws.services.dynamodbv2.local.server.DynamoDBProxyServer; +import org.junit.rules.ExternalResource; + +import java.util.Optional; + +public class LocalDbCreationRule extends ExternalResource { + + protected DynamoDBProxyServer server; + + public LocalDbCreationRule() { + System.setProperty("sqlite4java.library.path", "native-libs"); + } + + @Override + protected void before() throws Exception { + String port = "8000"; + this.server = ServerRunner.createServerFromCommandLineArgs(new String[]{"-inMemory", "-port", port}); + server.start(); + } + + @Override + protected void after() { + this.stopUnchecked(server); + } + + protected void stopUnchecked(DynamoDBProxyServer dynamoDbServer) { + try { + dynamoDbServer.stop(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} diff --git a/persistence-modules/spring-data-eclipselink/README.md b/persistence-modules/spring-data-eclipselink/README.md new file mode 100644 index 0000000000..7981470488 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [A Guide to EclipseLink with Spring](http://www.baeldung.com/spring-eclipselink) diff --git a/persistence-modules/spring-data-eclipselink/pom.xml b/persistence-modules/spring-data-eclipselink/pom.xml new file mode 100644 index 0000000000..65793fd1e0 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + com.baeldung + spring-data-eclipselink + 1.0.0-SNAPSHOT + + spring-data-eclipselink + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + UTF-8 + UTF-8 + 1.8 + 1.5.9.RELEASE + 2.7.0 + 1.4.196 + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.version} + pom + import + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring.version} + + + org.hibernate + hibernate-entitymanager + + + org.hibernate + hibernate-core + + + + + org.springframework.boot + spring-boot-starter-test + ${spring.version} + test + + + org.eclipse.persistence + org.eclipse.persistence.jpa + ${eclipselink.version} + + + com.h2database + h2 + runtime + ${h2.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.version} + + + + + diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java new file mode 100644 index 0000000000..63ce778022 --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/EclipselinkSpringDataApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.eclipselink.springdata; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class EclipselinkSpringDataApplication { + + public static void main(String[] args) { + SpringApplication.run(EclipselinkSpringDataApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java new file mode 100644 index 0000000000..60ff7909be --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/JpaConfiguration.java @@ -0,0 +1,44 @@ +package com.baeldung.eclipselink.springdata; + +import org.eclipse.persistence.config.PersistenceUnitProperties; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; +import org.springframework.context.annotation.Configuration; +import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver; +import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter; +import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter; +import org.springframework.transaction.jta.JtaTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by adam. + */ +@Configuration +public class JpaConfiguration extends JpaBaseConfiguration { + + protected JpaConfiguration(DataSource dataSource, JpaProperties properties, ObjectProvider jtaTransactionManager, ObjectProvider transactionManagerCustomizers) { + super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers); + } + + @Override + protected AbstractJpaVendorAdapter createJpaVendorAdapter() { + return new EclipseLinkJpaVendorAdapter(); + } + + @Override + protected Map getVendorProperties() { + HashMap map = new HashMap<>(); + map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode()); + map.put(PersistenceUnitProperties.DDL_GENERATION, "drop-and-create-tables"); + return map; + } + + private String detectWeavingMode() { + return InstrumentationLoadTimeWeaver.isInstrumentationAvailable() ? "true" : "static"; + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java new file mode 100644 index 0000000000..75161875bd --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/model/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.eclipselink.springdata.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * Created by adam. + */ +@Entity +public class Person { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private Long id; + private String firstName; + private String lastName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java new file mode 100644 index 0000000000..86cd85d5fe --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/java/com/baeldung/eclipselink/springdata/repo/PersonsRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.eclipselink.springdata.repo; + +import org.springframework.data.repository.CrudRepository; + +import com.baeldung.eclipselink.springdata.model.Person; + +/** + * Created by adam. + */ +public interface PersonsRepository extends CrudRepository { + + Person findByFirstName(String firstName); + +} diff --git a/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties new file mode 100644 index 0000000000..549c0b4ada --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.datasource.url=jdbc:h2:mem:test +spring.jpa.show-sql=true \ No newline at end of file diff --git a/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryIntegrationTest.java b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryIntegrationTest.java new file mode 100644 index 0000000000..636f91cf8e --- /dev/null +++ b/persistence-modules/spring-data-eclipselink/src/test/java/com/baeldung/eclipselink/springdata/repo/PersonsRepositoryIntegrationTest.java @@ -0,0 +1,48 @@ +package com.baeldung.eclipselink.springdata.repo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.eclipselink.springdata.model.Person; +import com.baeldung.eclipselink.springdata.repo.PersonsRepository; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.IsNull.notNullValue; + +@RunWith(SpringRunner.class) +@SpringBootTest +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class PersonsRepositoryIntegrationTest { + + @Autowired + private PersonsRepository personsRepository; + + @Test + public void givenPerson_whenSave_thenAddOnePersonToDB() { + personsRepository.save(new Person()); + assertThat(personsRepository.findAll().spliterator().getExactSizeIfKnown(), equalTo(1l)); + } + + @Test + public void givenPersons_whenSearch_thenFindOk() { + Person person1 = new Person(); + person1.setFirstName("Adam"); + + Person person2 = new Person(); + person2.setFirstName("Dave"); + + personsRepository.save(person1); + personsRepository.save(person2); + + Person foundPerson = personsRepository.findByFirstName("Adam"); + + assertThat(foundPerson.getFirstName(), equalTo("Adam")); + assertThat(foundPerson.getId(), notNullValue()); + } + +} diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml index 9108865b4c..3f7fcd03e5 100644 --- a/persistence-modules/spring-data-gemfire/pom.xml +++ b/persistence-modules/spring-data-gemfire/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 0055850ec3..bdd51e9659 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -10,7 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index b184d7e369..0b9075147d 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -11,16 +11,18 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ UTF-8 - 4.3.7.RELEASE - 1.8.1.RELEASE + 5.0.3.RELEASE + 2.0.3.RELEASE 3.2.4 2.9.0 0.10.0 + 2.0.3.RELEASE + @@ -73,6 +75,12 @@ nosqlunit-redis ${nosqlunit.version} + + + org.springframework.data + spring-data-commons + ${spring-data-commons.version} + diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java index 4fd83a2bb6..4ea8bb4bc0 100644 --- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java +++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java @@ -1,8 +1,5 @@ package com.baeldung.spring.data.redis.config; -import com.baeldung.spring.data.redis.queue.MessagePublisher; -import com.baeldung.spring.data.redis.queue.RedisMessagePublisher; -import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -11,10 +8,16 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; import org.springframework.data.redis.serializer.GenericToStringSerializer; +import com.baeldung.spring.data.redis.queue.MessagePublisher; +import com.baeldung.spring.data.redis.queue.RedisMessagePublisher; +import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber; + @Configuration @ComponentScan("com.baeldung.spring.data.redis") +@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo") public class RedisConfig { @Bean diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java index 10ba0f5ef4..b97ed23387 100644 --- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java +++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/model/Student.java @@ -2,6 +2,9 @@ package com.baeldung.spring.data.redis.model; import java.io.Serializable; +import org.springframework.data.redis.core.RedisHash; + +@RedisHash("Student") public class Student implements Serializable { public enum Gender { diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java index 250c227f00..39f13bb6a7 100644 --- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java +++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepository.java @@ -1,18 +1,9 @@ package com.baeldung.spring.data.redis.repo; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + import com.baeldung.spring.data.redis.model.Student; -import java.util.Map; - -public interface StudentRepository { - - void saveStudent(Student person); - - void updateStudent(Student student); - - Student findStudent(String id); - - Map findAllStudents(); - - void deleteStudent(String id); -} +@Repository +public interface StudentRepository extends CrudRepository {} diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java deleted file mode 100644 index f13bef0f54..0000000000 --- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/repo/StudentRepositoryImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.spring.data.redis.repo; - -import com.baeldung.spring.data.redis.model.Student; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Repository; - -import javax.annotation.PostConstruct; -import java.util.Map; - -@Repository -public class StudentRepositoryImpl implements StudentRepository { - - private static final String KEY = "Student"; - - private RedisTemplate redisTemplate; - private HashOperations hashOperations; - - @Autowired - public StudentRepositoryImpl(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @PostConstruct - private void init() { - hashOperations = redisTemplate.opsForHash(); - } - - public void saveStudent(final Student student) { - hashOperations.put(KEY, student.getId(), student); - } - - public void updateStudent(final Student student) { - hashOperations.put(KEY, student.getId(), student); - } - - public Student findStudent(final String id) { - return (Student) hashOperations.get(KEY, id); - } - - public Map findAllStudents() { - return hashOperations.entries(KEY); - } - - public void deleteStudent(final String id) { - hashOperations.delete(KEY, id); - } -} diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java index 1028c0bc24..66ef3c21b2 100644 --- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java @@ -1,17 +1,20 @@ package com.baeldung.spring.data.redis.repo; -import com.baeldung.spring.data.redis.config.RedisConfig; -import com.baeldung.spring.data.redis.model.Student; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import com.baeldung.spring.data.redis.config.RedisConfig; +import com.baeldung.spring.data.redis.model.Student; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = RedisConfig.class) @@ -23,18 +26,18 @@ public class StudentRepositoryIntegrationTest { @Test public void whenSavingStudent_thenAvailableOnRetrieval() throws Exception { final Student student = new Student("Eng2015001", "John Doe", Student.Gender.MALE, 1); - studentRepository.saveStudent(student); - final Student retrievedStudent = studentRepository.findStudent(student.getId()); + studentRepository.save(student); + final Student retrievedStudent = studentRepository.findById(student.getId()).get(); assertEquals(student.getId(), retrievedStudent.getId()); } @Test public void whenUpdatingStudent_thenAvailableOnRetrieval() throws Exception { final Student student = new Student("Eng2015001", "John Doe", Student.Gender.MALE, 1); - studentRepository.saveStudent(student); + studentRepository.save(student); student.setName("Richard Watson"); - studentRepository.saveStudent(student); - final Student retrievedStudent = studentRepository.findStudent(student.getId()); + studentRepository.save(student); + final Student retrievedStudent = studentRepository.findById(student.getId()).get(); assertEquals(student.getName(), retrievedStudent.getName()); } @@ -42,18 +45,19 @@ public class StudentRepositoryIntegrationTest { public void whenSavingStudents_thenAllShouldAvailableOnRetrieval() throws Exception { final Student engStudent = new Student("Eng2015001", "John Doe", Student.Gender.MALE, 1); final Student medStudent = new Student("Med2015001", "Gareth Houston", Student.Gender.MALE, 2); - studentRepository.saveStudent(engStudent); - studentRepository.saveStudent(medStudent); - final Map retrievedStudent = studentRepository.findAllStudents(); - assertEquals(retrievedStudent.size(), 2); + studentRepository.save(engStudent); + studentRepository.save(medStudent); + List students = new ArrayList<>(); + studentRepository.findAll().forEach(students::add); + assertEquals(students.size(), 2); } @Test public void whenDeletingStudent_thenNotAvailableOnRetrieval() throws Exception { final Student student = new Student("Eng2015001", "John Doe", Student.Gender.MALE, 1); - studentRepository.saveStudent(student); - studentRepository.deleteStudent(student.getId()); - final Student retrievedStudent = studentRepository.findStudent(student.getId()); + studentRepository.save(student); + studentRepository.deleteById(student.getId()); + final Student retrievedStudent = studentRepository.findById(student.getId()).orElse(null); assertNull(retrievedStudent); } } \ No newline at end of file diff --git a/persistence-modules/spring-data-solr/pom.xml b/persistence-modules/spring-data-solr/pom.xml index 0759c1dbc0..e24d8314ba 100644 --- a/persistence-modules/spring-data-solr/pom.xml +++ b/persistence-modules/spring-data-solr/pom.xml @@ -12,7 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-hibernate-3/pom.xml b/persistence-modules/spring-hibernate-3/pom.xml index 8eee819572..f1873a84d3 100644 --- a/persistence-modules/spring-hibernate-3/pom.xml +++ b/persistence-modules/spring-hibernate-3/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index f1f3d10347..86e952c0e4 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../ + ../../ @@ -57,6 +57,11 @@ jta ${jta.version} + + org.hibernate + hibernate-search-orm + ${hibernatesearch.version} + org.apache.tomcat @@ -174,7 +179,7 @@ - 4.3.10.RELEASE + 5.0.2.RELEASE 1.10.6.RELEASE @@ -184,6 +189,7 @@ 5.2.10.Final + 5.8.2.Final 8.0.7-dmr 9.0.0.M26 1.1 @@ -214,7 +220,7 @@ 2.9.0 - 3.6.0 + 3.7.0 2.19.1 2.7 1.6.1 diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/BarHibernateDAO.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/BarHibernateDAO.java new file mode 100644 index 0000000000..5fc932b256 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/BarHibernateDAO.java @@ -0,0 +1,39 @@ +package com.baeldung.hibernate.bootstrap; + +import com.baeldung.hibernate.bootstrap.model.TestEntity; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; + +public abstract class BarHibernateDAO { + + @Autowired + private SessionFactory sessionFactory; + + public TestEntity findEntity(int id) { + + return getCurrentSession().find(TestEntity.class, 1); + } + + public void createEntity(TestEntity entity) { + + getCurrentSession().save(entity); + } + + public void createEntity(int id, String newDescription) { + + TestEntity entity = findEntity(id); + entity.setDescription(newDescription); + getCurrentSession().save(entity); + } + + public void deleteEntity(int id) { + + TestEntity entity = findEntity(id); + getCurrentSession().delete(entity); + } + + protected Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateConf.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateConf.java new file mode 100644 index 0000000000..150e3778af --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateConf.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.bootstrap; + +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.orm.hibernate5.HibernateTransactionManager; +import org.springframework.orm.hibernate5.LocalSessionFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableTransactionManagement +@PropertySource({ "classpath:persistence-h2.properties" }) +public class HibernateConf { + + @Autowired + private Environment env; + + @Bean + public LocalSessionFactoryBean sessionFactory() { + final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); + sessionFactory.setDataSource(dataSource()); + sessionFactory.setPackagesToScan(new String[] { "com.baeldung.hibernate.bootstrap.model" }); + sessionFactory.setHibernateProperties(hibernateProperties()); + + return sessionFactory; + } + + @Bean + public DataSource dataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); + dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager hibernateTransactionManager() { + final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); + transactionManager.setSessionFactory(sessionFactory().getObject()); + return transactionManager; + } + + private final Properties hibernateProperties() { + final Properties hibernateProperties = new Properties(); + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + + return hibernateProperties; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java new file mode 100644 index 0000000000..b3e979478f --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/HibernateXMLConf.java @@ -0,0 +1,24 @@ +package com.baeldung.hibernate.bootstrap; + +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.orm.hibernate5.HibernateTransactionManager; +import org.springframework.orm.hibernate5.LocalSessionFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableTransactionManagement +@ImportResource({ "classpath:hibernate5Configuration.xml" }) +public class HibernateXMLConf { + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java new file mode 100644 index 0000000000..cae41db831 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/bootstrap/model/TestEntity.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.bootstrap.model; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class TestEntity { + + private int id; + + private String description; + + @Id + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java new file mode 100644 index 0000000000..6bbd2625fc --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/HibernateSearchConfig.java @@ -0,0 +1,76 @@ +package com.baeldung.hibernatesearch; + +import com.google.common.base.Preconditions; +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@EnableTransactionManagement +@Configuration +@PropertySource({ "classpath:persistence-h2.properties" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.hibernatesearch" }) +@ComponentScan({ "com.baeldung.hibernatesearch" }) +public class HibernateSearchConfig { + + @Autowired + private Environment env; + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.hibernatesearch.model" }); + + JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + em.setJpaProperties(additionalProperties()); + + return em; + } + + @Bean + public DataSource dataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); + dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); + + return dataSource; + } + + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + Properties additionalProperties() { + Properties properties = new Properties(); + properties.setProperty("hibernate.hbm2ddl.auto", Preconditions.checkNotNull(env.getProperty("hibernate.hbm2ddl.auto"))); + properties.setProperty("hibernate.dialect", Preconditions.checkNotNull(env.getProperty("hibernate.dialect"))); + return properties; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java new file mode 100644 index 0000000000..210c1c58b3 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/ProductSearchDao.java @@ -0,0 +1,195 @@ +package com.baeldung.hibernatesearch; + +import com.baeldung.hibernatesearch.model.Product; +import org.apache.lucene.search.Query; +import org.hibernate.search.engine.ProjectionConstants; +import org.hibernate.search.jpa.FullTextEntityManager; +import org.hibernate.search.jpa.FullTextQuery; +import org.hibernate.search.jpa.Search; +import org.hibernate.search.query.dsl.QueryBuilder; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + +@Repository +public class ProductSearchDao { + + @PersistenceContext + private EntityManager entityManager; + + public List searchProductNameByKeywordQuery(String text) { + + Query keywordQuery = getQueryBuilder() + .keyword() + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(keywordQuery).getResultList(); + + return results; + } + + public List searchProductNameByFuzzyQuery(String text) { + + Query fuzzyQuery = getQueryBuilder() + .keyword() + .fuzzy() + .withEditDistanceUpTo(2) + .withPrefixLength(0) + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(fuzzyQuery).getResultList(); + + return results; + } + + public List searchProductNameByWildcardQuery(String text) { + + Query wildcardQuery = getQueryBuilder() + .keyword() + .wildcard() + .onField("productName") + .matching(text) + .createQuery(); + + List results = getJpaQuery(wildcardQuery).getResultList(); + + return results; + } + + public List searchProductDescriptionByPhraseQuery(String text) { + + Query phraseQuery = getQueryBuilder() + .phrase() + .withSlop(1) + .onField("description") + .sentence(text) + .createQuery(); + + List results = getJpaQuery(phraseQuery).getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionBySimpleQueryStringQuery(String text) { + + Query simpleQueryStringQuery = getQueryBuilder() + .simpleQueryString() + .onFields("productName", "description") + .matching(text) + .createQuery(); + + List results = getJpaQuery(simpleQueryStringQuery).getResultList(); + + return results; + } + + public List searchProductNameByRangeQuery(int low, int high) { + + Query rangeQuery = getQueryBuilder() + .range() + .onField("memory") + .from(low) + .to(high) + .createQuery(); + + List results = getJpaQuery(rangeQuery).getResultList(); + + return results; + } + + public List searchProductNameByMoreLikeThisQuery(Product entity) { + + Query moreLikeThisQuery = getQueryBuilder() + .moreLikeThis() + .comparingField("productName") + .toEntity(entity) + .createQuery(); + + List results = getJpaQuery(moreLikeThisQuery).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE) + .getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByKeywordQuery(String text) { + + Query keywordQuery = getQueryBuilder() + .keyword() + .onFields("productName", "description") + .matching(text) + .createQuery(); + + List results = getJpaQuery(keywordQuery).getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByMoreLikeThisQuery(Product entity) { + + Query moreLikeThisQuery = getQueryBuilder() + .moreLikeThis() + .comparingField("productName") + .toEntity(entity) + .createQuery(); + + List results = getJpaQuery(moreLikeThisQuery).setProjection(ProjectionConstants.THIS, ProjectionConstants.SCORE) + .getResultList(); + + return results; + } + + public List searchProductNameAndDescriptionByCombinedQuery(String manufactorer, int memoryLow, int memoryTop, String extraFeature, String exclude) { + + Query combinedQuery = getQueryBuilder() + .bool() + .must(getQueryBuilder().keyword() + .onField("productName") + .matching(manufactorer) + .createQuery()) + .must(getQueryBuilder() + .range() + .onField("memory") + .from(memoryLow) + .to(memoryTop) + .createQuery()) + .should(getQueryBuilder() + .phrase() + .onField("description") + .sentence(extraFeature) + .createQuery()) + .must(getQueryBuilder() + .keyword() + .onField("productName") + .matching(exclude) + .createQuery()) + .not() + .createQuery(); + + List results = getJpaQuery(combinedQuery).getResultList(); + + return results; + } + + private FullTextQuery getJpaQuery(org.apache.lucene.search.Query luceneQuery) { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + + return fullTextEntityManager.createFullTextQuery(luceneQuery, Product.class); + } + + private QueryBuilder getQueryBuilder() { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + + return fullTextEntityManager.getSearchFactory() + .buildQueryBuilder() + .forEntity(Product.class) + .get(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java new file mode 100644 index 0000000000..3ca020fe57 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernatesearch/model/Product.java @@ -0,0 +1,94 @@ +package com.baeldung.hibernatesearch.model; + +import org.hibernate.search.annotations.*; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Indexed +@Table(name = "product") +public class Product { + + @Id + private int id; + + @Field(termVector = TermVector.YES) + private String productName; + + @Field(termVector = TermVector.YES) + private String description; + + @Field + private int memory; + + public Product(int id, String productName, int memory, String description) { + this.id = id; + this.productName = productName; + this.memory = memory; + this.description = description; + } + + public Product() { + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof Product)) + return false; + + Product product = (Product) o; + + if (id != product.id) + return false; + if (memory != product.memory) + return false; + if (!productName.equals(product.productName)) + return false; + return description.equals(product.description); + } + + @Override + public int hashCode() { + int result = id; + result = 31 * result + productName.hashCode(); + result = 31 * result + memory; + result = 31 * result + description.hashCode(); + return result; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public int getMemory() { + return memory; + } + + public void setMemory(int memory) { + this.memory = memory; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java index 6f359054b6..5dace1f742 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java @@ -10,8 +10,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; -import org.springframework.orm.hibernate4.HibernateTransactionManager; -import org.springframework.orm.hibernate4.LocalSessionFactoryBean; +import org.springframework.orm.hibernate5.HibernateTransactionManager; +import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java index 74ac0a269e..e64f0a4efe 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceConfig.java @@ -21,7 +21,7 @@ import java.util.Properties; @Configuration @EnableTransactionManagement -@PropertySource({ "classpath:persistence-h2.properties" }) +@PropertySource({ "classpath:persistence-mysql.properties" }) @ComponentScan({ "com.baeldung.persistence" }) public class PersistenceConfig { diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/hibernate5Configuration.xml b/persistence-modules/spring-hibernate-5/src/main/resources/hibernate5Configuration.xml new file mode 100644 index 0000000000..cb6cf0aa5c --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/resources/hibernate5Configuration.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + ${hibernate.hbm2ddl.auto} + ${hibernate.dialect} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml index 8a10fc1580..3c753a89af 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml +++ b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml @@ -4,24 +4,12 @@ "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd"> - - com.mysql.jdbc.Driver - - - buddhinisam123 - - - jdbc:mysql://localhost:3306/spring_hibernate_many_to_many - - - root - - - org.hibernate.dialect.MySQLDialect - - - thread - + com.mysql.jdbc.Driver + tutorialmy5ql + jdbc:mysql://localhost:3306/spring_hibernate_many_to_many + tutorialuser + org.hibernate.dialect.MySQLDialect + thread true diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties index 696e805cff..0325174b67 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties +++ b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties @@ -2,6 +2,7 @@ jdbc.driverClassName=org.h2.Driver jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 jdbc.eventGeneratedId=sa +jdbc.user=sa jdbc.pass=sa # hibernate.X @@ -9,5 +10,9 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop +# hibernate.search.X +hibernate.search.default.directory_provider = filesystem +hibernate.search.default.indexBase = /data/index/default + # envers.X envers.audit_table_suffix=_audit_log diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java new file mode 100644 index 0000000000..c41423643a --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateBootstrapIntegrationTest.java @@ -0,0 +1,185 @@ +package com.baeldung.hibernate.bootstrap; + +import com.baeldung.hibernate.bootstrap.model.TestEntity; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Commit; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.test.context.transaction.TestTransaction; +import org.springframework.transaction.annotation.Transactional; + +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { HibernateConf.class }) +@Transactional +public class HibernateBootstrapIntegrationTest { + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void whenBootstrapHibernateSession_thenNoException() { + + Session session = sessionFactory.getCurrentSession(); + + TestEntity newEntity = new TestEntity(); + newEntity.setId(1); + session.save(newEntity); + + TestEntity searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + } + + @Test + public void whenProgrammaticTransactionCommit_thenEntityIsInDatabase() { + assertTrue(TestTransaction.isActive()); + + //Save an entity and commit. + Session session = sessionFactory.getCurrentSession(); + + TestEntity newEntity = new TestEntity(); + newEntity.setId(1); + session.save(newEntity); + + TestEntity searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + assertTrue(TestTransaction.isFlaggedForRollback()); + + TestTransaction.flagForCommit(); + TestTransaction.end(); + + assertFalse(TestTransaction.isFlaggedForRollback()); + assertFalse(TestTransaction.isActive()); + + //Check that the entity is still there in a new transaction, + //then delete it, but don't commit. + TestTransaction.start(); + + assertTrue(TestTransaction.isFlaggedForRollback()); + assertTrue(TestTransaction.isActive()); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + + session.delete(searchEntity); + session.flush(); + + TestTransaction.end(); + + assertFalse(TestTransaction.isActive()); + + //Check that the entity is still there in a new transaction, + //then delete it and commit. + TestTransaction.start(); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + + session.delete(searchEntity); + session.flush(); + + assertTrue(TestTransaction.isActive()); + + TestTransaction.flagForCommit(); + TestTransaction.end(); + + assertFalse(TestTransaction.isActive()); + + //Check that the entity is no longer there in a new transaction. + TestTransaction.start(); + + assertTrue(TestTransaction.isActive()); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNull(searchEntity); + } + + @Test + @Commit + public void givenTransactionCommitDefault_whenProgrammaticTransactionCommit_thenEntityIsInDatabase() { + assertTrue(TestTransaction.isActive()); + + //Save an entity and commit. + Session session = sessionFactory.getCurrentSession(); + + TestEntity newEntity = new TestEntity(); + newEntity.setId(1); + session.save(newEntity); + + TestEntity searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + assertFalse(TestTransaction.isFlaggedForRollback()); + + TestTransaction.end(); + + assertFalse(TestTransaction.isFlaggedForRollback()); + assertFalse(TestTransaction.isActive()); + + //Check that the entity is still there in a new transaction, + //then delete it, but don't commit. + TestTransaction.start(); + + assertFalse(TestTransaction.isFlaggedForRollback()); + assertTrue(TestTransaction.isActive()); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + + session.delete(searchEntity); + session.flush(); + + TestTransaction.flagForRollback(); + TestTransaction.end(); + + assertFalse(TestTransaction.isActive()); + + //Check that the entity is still there in a new transaction, + //then delete it and commit. + TestTransaction.start(); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + + session.delete(searchEntity); + session.flush(); + + assertTrue(TestTransaction.isActive()); + + TestTransaction.end(); + + assertFalse(TestTransaction.isActive()); + + //Check that the entity is no longer there in a new transaction. + TestTransaction.start(); + + assertTrue(TestTransaction.isActive()); + + session = sessionFactory.getCurrentSession(); + searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNull(searchEntity); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java new file mode 100644 index 0000000000..5b811ad576 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/bootstrap/HibernateXMLBootstrapIntegrationTest.java @@ -0,0 +1,36 @@ +package com.baeldung.hibernate.bootstrap; + +import com.baeldung.hibernate.bootstrap.model.TestEntity; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { HibernateXMLConf.class }) +@Transactional +public class HibernateXMLBootstrapIntegrationTest { + + @Autowired + private SessionFactory sessionFactory; + + @Test + public void whenBootstrapHibernateSession_thenNoException() { + + Session session = sessionFactory.getCurrentSession(); + + TestEntity newEntity = new TestEntity(); + newEntity.setId(1); + session.save(newEntity); + + TestEntity searchEntity = session.find(TestEntity.class, 1); + + Assert.assertNotNull(searchEntity); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index d6ecdb29d6..1572f23ed1 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -4,7 +4,6 @@ import com.baeldung.hibernate.immutable.entities.Event; import com.baeldung.hibernate.immutable.entities.EventGeneratedId; import com.baeldung.hibernate.immutable.util.HibernateUtil; import com.google.common.collect.Sets; -import org.hibernate.CacheMode; import org.hibernate.Session; import org.junit.*; import org.junit.rules.ExpectedException; @@ -14,6 +13,9 @@ import javax.persistence.PersistenceException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; +/** + * Configured in: immutable.cfg.xml + */ public class HibernateImmutableIntegrationTest { private static Session session; @@ -98,6 +100,7 @@ public class HibernateImmutableIntegrationTest { public void updateEventGenerated() { createEventGenerated(); EventGeneratedId eventGeneratedId = (EventGeneratedId) session.createQuery("FROM EventGeneratedId WHERE name LIKE '%John%'").list().get(0); + eventGeneratedId.setName("Mike"); session.update(eventGeneratedId); session.flush(); @@ -115,7 +118,6 @@ public class HibernateImmutableIntegrationTest { private static void createEventGenerated() { EventGeneratedId eventGeneratedId = new EventGeneratedId("John", "Doe"); - eventGeneratedId.setId(4L); session.save(eventGeneratedId); } diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java index 61d821e85e..614de6d3ad 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.hibernate.manytomany; - import java.util.HashSet; import java.util.Set; import org.hibernate.Session; @@ -17,10 +16,8 @@ import com.baeldung.hibernate.manytomany.model.Employee; import com.baeldung.hibernate.manytomany.model.Project; import com.baeldung.manytomany.spring.PersistenceConfig; - - @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest { @Autowired @@ -28,7 +25,6 @@ public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest { private Session session; - @Before public final void before() { session = sessionFactory.openSession(); @@ -43,11 +39,11 @@ public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest { @Test public final void whenEntitiesAreCreated_thenNoExceptions() { - Set projects = new HashSet(); - projects.add(new Project("IT Project")); - projects.add(new Project("Networking Project")); - session.persist(new Employee("Peter", "Oven", projects)); - session.persist(new Employee("Allan", "Norman", projects)); + Set projects = new HashSet(); + projects.add(new Project("IT Project")); + projects.add(new Project("Networking Project")); + session.persist(new Employee("Peter", "Oven", projects)); + session.persist(new Employee("Allan", "Norman", projects)); } } diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java index 9a536a0f80..0073e181cc 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java @@ -17,6 +17,9 @@ import com.baeldung.hibernate.manytomany.util.HibernateUtil; import com.baeldung.hibernate.manytomany.model.Employee; import com.baeldung.hibernate.manytomany.model.Project; +/** + * Configured in: manytomany.cfg.xml + */ public class HibernateManyToManyAnnotationMainIntegrationTest { private static SessionFactory sessionFactory; diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java new file mode 100644 index 0000000000..b69f8d3a60 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernatesearch/HibernateSearchIntegrationTest.java @@ -0,0 +1,187 @@ +package com.baeldung.hibernatesearch; + +import com.baeldung.hibernatesearch.model.Product; + +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.junit.Assert.*; + +import org.hibernate.search.jpa.FullTextEntityManager; +import org.hibernate.search.jpa.Search; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Commit; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { HibernateSearchConfig.class }, loader = AnnotationConfigContextLoader.class) +@Transactional +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class HibernateSearchIntegrationTest { + + @Autowired + ProductSearchDao dao; + + @PersistenceContext + private EntityManager entityManager; + + private List products; + + @Before + public void setupTestData() { + + products = Arrays.asList(new Product(1, "Apple iPhone X 256 GB", 256, "The current high-end smartphone from Apple, with lots of memory and also Face ID"), + new Product(2, "Apple iPhone X 128 GB", 128, "The current high-end smartphone from Apple, with Face ID"), new Product(3, "Apple iPhone 8 128 GB", 128, "The latest smartphone from Apple within the regular iPhone line, supporting wireless charging"), + new Product(4, "Samsung Galaxy S7 128 GB", 64, "A great Android smartphone"), new Product(5, "Microsoft Lumia 650 32 GB", 32, "A cheaper smartphone, coming with Windows Mobile"), + new Product(6, "Microsoft Lumia 640 32 GB", 32, "A cheaper smartphone, coming with Windows Mobile"), new Product(7, "Microsoft Lumia 630 16 GB", 16, "A cheaper smartphone, coming with Windows Mobile")); + } + + @Commit + @Test + public void testA_whenInitialTestDataInserted_thenSuccess() { + + for (int i = 0; i < products.size() - 1; i++) { + entityManager.persist(products.get(i)); + } + } + + @Test + public void testB_whenIndexInitialized_thenCorrectIndexSize() throws InterruptedException { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + fullTextEntityManager.createIndexer() + .startAndWait(); + int indexSize = fullTextEntityManager.getSearchFactory() + .getStatistics() + .getNumberOfIndexedEntities(Product.class.getName()); + + assertEquals(products.size() - 1, indexSize); + } + + @Commit + @Test + public void testC_whenAdditionalTestDataInserted_thenSuccess() { + + entityManager.persist(products.get(products.size() - 1)); + } + + @Test + public void testD_whenAdditionalTestDataInserted_thenIndexUpdatedAutomatically() { + + FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager); + int indexSize = fullTextEntityManager.getSearchFactory() + .getStatistics() + .getNumberOfIndexedEntities(Product.class.getName()); + + assertEquals(products.size(), indexSize); + } + + @Test + public void testE_whenKeywordSearchOnName_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameByKeywordQuery("iphone"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testF_whenFuzzySearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameByFuzzyQuery("iPhaen"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testG_whenWildcardSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(4), products.get(5), products.get(6)); + List results = dao.searchProductNameByWildcardQuery("6*"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testH_whenPhraseSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(2)); + List results = dao.searchProductDescriptionByPhraseQuery("with wireless charging"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testI_whenSimpleQueryStringSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1)); + List results = dao.searchProductNameAndDescriptionBySimpleQueryStringQuery("Aple~2 + \"iPhone X\" + (256 | 128)"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testJ_whenRangeSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2), products.get(3)); + List results = dao.searchProductNameByRangeQuery(64, 256); + + assertThat(results, containsInAnyOrder(expected.toArray())); + + } + + @Test + public void testK_whenMoreLikeThisSearch_thenCorrectMatchesInOrder() { + List expected = products; + List resultsWithScore = dao.searchProductNameByMoreLikeThisQuery(products.get(0)); + List results = new LinkedList(); + + for (Object[] resultWithScore : resultsWithScore) { + results.add((Product) resultWithScore[0]); + } + + assertThat(results, contains(expected.toArray())); + + } + + @Test + public void testL_whenKeywordSearchOnNameAndDescription_thenCorrectMatches() { + List expected = Arrays.asList(products.get(0), products.get(1), products.get(2)); + List results = dao.searchProductNameAndDescriptionByKeywordQuery("iphone"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } + + @Test + public void testM_whenMoreLikeThisSearchOnProductNameAndDescription_thenCorrectMatchesInOrder() { + List expected = products; + List resultsWithScore = dao.searchProductNameAndDescriptionByMoreLikeThisQuery(products.get(0)); + List results = new LinkedList(); + + for (Object[] resultWithScore : resultsWithScore) { + results.add((Product) resultWithScore[0]); + } + + assertThat(results, contains(expected.toArray())); + } + + @Test + public void testN_whenCombinedSearch_thenCorrectMatches() { + List expected = Arrays.asList(products.get(1), products.get(2)); + List results = dao.searchProductNameAndDescriptionByCombinedQuery("apple", 64, 128, "face id", "samsung"); + + assertThat(results, containsInAnyOrder(expected.toArray())); + } +} diff --git a/persistence-modules/spring-jpa/.gitignore b/persistence-modules/spring-jpa/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/persistence-modules/spring-jpa/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md similarity index 93% rename from spring-jpa/README.md rename to persistence-modules/spring-jpa/README.md index d93271164c..4bfe2a1d25 100644 --- a/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -15,6 +15,7 @@ - [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) - [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database) - [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories) +- [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml similarity index 99% rename from spring-jpa/pom.xml rename to persistence-modules/spring-jpa/pom.xml index 960dcbc588..bc0b2381f3 100644 --- a/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -13,6 +13,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfig.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigXml.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/SpringWebConfig.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJPAH2Config.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java similarity index 94% rename from spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java index 8021691716..17047cbab2 100644 --- a/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/StudentJpaConfig.java @@ -25,7 +25,7 @@ public class StudentJpaConfig { @Autowired private Environment env; - + @Bean public DataSource dataSource() { final DriverManagerDataSource dataSource = new DriverManagerDataSource(); @@ -36,7 +36,7 @@ public class StudentJpaConfig { return dataSource; } - + @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); @@ -46,23 +46,23 @@ public class StudentJpaConfig { em.setJpaProperties(additionalProperties()); return em; } - + @Bean JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory); return transactionManager; } - + final Properties additionalProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); - hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); + hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache")); hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache")); - + return hibernateProperties; } } diff --git a/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/UserConfig.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/UserConfig.java diff --git a/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/config/WebInitializer.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java new file mode 100644 index 0000000000..9e19cf4ed9 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDao.java @@ -0,0 +1,28 @@ +package org.baeldung.dsrouting; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; + +/** + * Database access code for datasource routing example. + */ +public class ClientDao { + + private static final String SQL_GET_CLIENT_NAME = "select name from client"; + + private final JdbcTemplate jdbcTemplate; + + public ClientDao(DataSource datasource) { + this.jdbcTemplate = new JdbcTemplate(datasource); + } + + public String getClientName() { + return this.jdbcTemplate.query(SQL_GET_CLIENT_NAME, rowMapper).get(0); + } + + private static RowMapper rowMapper = (rs, rowNum) -> { + return rs.getString("name"); + }; +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java new file mode 100644 index 0000000000..997e461cde --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDataSourceRouter.java @@ -0,0 +1,14 @@ +package org.baeldung.dsrouting; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * Returns thread bound client lookup key for current context. + */ +public class ClientDataSourceRouter extends AbstractRoutingDataSource { + + @Override + protected Object determineCurrentLookupKey() { + return ClientDatabaseContextHolder.getClientDatabase(); + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java new file mode 100644 index 0000000000..619b8707d8 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabase.java @@ -0,0 +1,7 @@ +package org.baeldung.dsrouting; + +public enum ClientDatabase { + + CLIENT_A, CLIENT_B + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java new file mode 100644 index 0000000000..c08559e877 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientDatabaseContextHolder.java @@ -0,0 +1,26 @@ +package org.baeldung.dsrouting; + +import org.springframework.util.Assert; + +/** + * Thread shared context to point to the datasource which should be used. This + * enables context switches between different clients. + */ +public class ClientDatabaseContextHolder { + + private static final ThreadLocal CONTEXT = new ThreadLocal<>(); + + public static void set(ClientDatabase clientDatabase) { + Assert.notNull(clientDatabase, "clientDatabase cannot be null"); + CONTEXT.set(clientDatabase); + } + + public static ClientDatabase getClientDatabase() { + return CONTEXT.get(); + } + + public static void clear() { + CONTEXT.remove(); + } + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java new file mode 100644 index 0000000000..4b63c6333c --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/dsrouting/ClientService.java @@ -0,0 +1,21 @@ +package org.baeldung.dsrouting; + +/** + * Service layer code for datasource routing example. Here, the service methods are responsible + * for setting and clearing the context. + */ +public class ClientService { + + private final ClientDao clientDao; + + public ClientService(ClientDao clientDao) { + this.clientDao = clientDao; + } + + public String getClientName(ClientDatabase clientDb) { + ClientDatabaseContextHolder.set(clientDb); + String clientName = this.clientDao.getClientName(); + ClientDatabaseContextHolder.clear(); + return clientName; + } +} diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepository.java diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java similarity index 92% rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java index 0dd32757d7..7ed652dc4d 100644 --- a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedRepositoryImpl.java @@ -27,8 +27,7 @@ public class ExtendedRepositoryImpl extends SimpleJp CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery(getDomainClass()); Root root = query.from(getDomainClass()); - query.select(root) - .where(builder.like(root. get(attributeName), "%" + text + "%")); + query.select(root).where(builder.like(root. get(attributeName), "%" + text + "%")); TypedQuery q = entityManager.createQuery(query); return q.getResultList(); } diff --git a/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/extended/persistence/dao/ExtendedStudentRepository.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyStudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyStudentRepository.java new file mode 100644 index 0000000000..a03b2950a0 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyStudentRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.inmemory.persistence.dao; + +import org.baeldung.inmemory.persistence.model.ManyStudent; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ManyStudentRepository extends JpaRepository { + List findByManyTags_Name(String name); +} diff --git a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyTagRepository.java similarity index 50% rename from spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyTagRepository.java index bfcf6f5cdc..b7d991de32 100644 --- a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/ManyTagRepository.java @@ -1,7 +1,7 @@ package org.baeldung.inmemory.persistence.dao; -import org.baeldung.inmemory.persistence.model.Student; +import org.baeldung.inmemory.persistence.model.ManyTag; import org.springframework.data.jpa.repository.JpaRepository; -public interface StudentRepository extends JpaRepository { +public interface ManyTagRepository extends JpaRepository { } diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java new file mode 100644 index 0000000000..ffe1a68558 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/dao/StudentRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.inmemory.persistence.dao; + +import org.baeldung.inmemory.persistence.model.Student; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface StudentRepository extends JpaRepository { + + @Query("SELECT s FROM Student s JOIN s.tags t WHERE t = LOWER(:tag)") + List retrieveByTag(@Param("tag") String tag); + + @Query("SELECT s FROM Student s JOIN s.tags t WHERE s.name = LOWER(:name) AND t = LOWER(:tag)") + List retrieveByNameFilterByTag(@Param("name") String name, @Param("tag") String tag); + + @Query("SELECT s FROM Student s JOIN s.skillTags t WHERE t.name = LOWER(:tagName) AND t.value > :tagValue") + List retrieveByNameFilterByMinimumSkillTag(@Param("tagName") String tagName, @Param("tagValue") int tagValue); + + @Query("SELECT s FROM Student s JOIN s.kvTags t WHERE t.key = LOWER(:key)") + List retrieveByKeyTag(@Param("key") String key); + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java new file mode 100644 index 0000000000..1522744116 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/KVTag.java @@ -0,0 +1,34 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.Embeddable; + +@Embeddable +public class KVTag { + private String key; + private String value; + + public KVTag() { + } + + public KVTag(String key, String value) { + super(); + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/LocationTag.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/LocationTag.java new file mode 100644 index 0000000000..3acdbbe6fe --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/LocationTag.java @@ -0,0 +1,40 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.Embeddable; + +@Embeddable +public class LocationTag { + private String name; + private int xPos; + private int yPos; + + public LocationTag() { + } + + public LocationTag(String name, int xPos, int yPos) { + super(); + this.name = name; + this.xPos = xPos; + this.yPos = yPos; + } + + public String getName() { + return name; + } + + public int getxPos() { + return xPos; + } + + public void setxPos(int xPos) { + this.xPos = xPos; + } + + public int getyPos() { + return yPos; + } + + public void setyPos(int yPos) { + this.yPos = yPos; + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyStudent.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyStudent.java new file mode 100644 index 0000000000..8343edc9cd --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyStudent.java @@ -0,0 +1,33 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class ManyStudent { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + private String name; + + @ManyToMany(cascade = CascadeType.ALL) + @JoinTable(name = "manystudent_manytags", joinColumns = @JoinColumn(name = "manystudent_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "manytag_id", referencedColumnName = "id")) + private Set manyTags = new HashSet<>(); + + public ManyStudent() { + } + + public ManyStudent(String name) { + this.name = name; + } + + public Set getManyTags() { + return manyTags; + } + + public void setManyTags(Set manyTags) { + this.manyTags.addAll(manyTags); + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyTag.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyTag.java new file mode 100644 index 0000000000..e820506544 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/ManyTag.java @@ -0,0 +1,40 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class ManyTag { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + private String name; + + @ManyToMany(mappedBy = "manyTags") + private Set students = new HashSet<>(); + + public ManyTag() { + } + + public ManyTag(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getStudents() { + return students; + } + + public void setStudents(Set students) { + this.students.addAll(students); + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java new file mode 100644 index 0000000000..490ee0a18e --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/SkillTag.java @@ -0,0 +1,30 @@ +package org.baeldung.inmemory.persistence.model; + +import javax.persistence.Embeddable; + +@Embeddable +public class SkillTag { + private String name; + private int value; + + public SkillTag() { + } + + public SkillTag(String name, int value) { + super(); + this.name = name; + this.value = value; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public String getName() { + return name; + } +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java new file mode 100644 index 0000000000..07aa3ef9ef --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java @@ -0,0 +1,74 @@ +package org.baeldung.inmemory.persistence.model; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Student { + + @Id + private long id; + private String name; + + @ElementCollection + private List tags = new ArrayList<>(); + + @ElementCollection + private List skillTags = new ArrayList<>(); + + @ElementCollection + private List kvTags = new ArrayList<>(); + + public Student() { + } + + public Student(long id, String name) { + super(); + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags.addAll(tags); + } + + public List getSkillTags() { + return skillTags; + } + + public void setSkillTags(List skillTags) { + this.skillTags.addAll(skillTags); + } + + public List getKVTags() { + return this.kvTags; + } + + public void setKVTags(List kvTags) { + this.kvTags.addAll(kvTags); + } + +} diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/dao/IFooDao.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Bar.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/product/ProductRepository.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/PossessionRepository.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/dao/user/UserRepository.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/Possession.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/persistence/service/FooService.java diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java new file mode 100644 index 0000000000..922f55cbf6 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/java/org/baeldung/sqlfiles/Country.java @@ -0,0 +1,36 @@ +package org.baeldung.sqlfiles; + +import static javax.persistence.GenerationType.IDENTITY; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Country { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Integer id; + + @Column(nullable = false) + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/spring-jpa/src/main/java/org/baeldung/web/MainController.java b/persistence-modules/spring-jpa/src/main/java/org/baeldung/web/MainController.java similarity index 100% rename from spring-jpa/src/main/java/org/baeldung/web/MainController.java rename to persistence-modules/spring-jpa/src/main/java/org/baeldung/web/MainController.java diff --git a/spring-jpa/src/main/resources/context.xml b/persistence-modules/spring-jpa/src/main/resources/context.xml similarity index 100% rename from spring-jpa/src/main/resources/context.xml rename to persistence-modules/spring-jpa/src/main/resources/context.xml diff --git a/rest-testing/src/main/resources/logback.xml b/persistence-modules/spring-jpa/src/main/resources/logback.xml similarity index 100% rename from rest-testing/src/main/resources/logback.xml rename to persistence-modules/spring-jpa/src/main/resources/logback.xml diff --git a/spring-jpa/src/main/resources/persistence-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-h2.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties diff --git a/spring-jpa/src/main/resources/persistence-jndi.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-jndi.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties diff --git a/spring-jpa/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-multiple-db.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-multiple-db.properties diff --git a/spring-jpa/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-mysql.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-mysql.properties diff --git a/spring-jpa/src/main/resources/persistence-student-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-student-h2.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-student-h2.properties diff --git a/spring-jpa/src/main/resources/persistence-student.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-student.properties similarity index 100% rename from spring-jpa/src/main/resources/persistence-student.properties rename to persistence-modules/spring-jpa/src/main/resources/persistence-student.properties diff --git a/spring-jpa/src/main/resources/persistence.xml b/persistence-modules/spring-jpa/src/main/resources/persistence.xml similarity index 100% rename from spring-jpa/src/main/resources/persistence.xml rename to persistence-modules/spring-jpa/src/main/resources/persistence.xml diff --git a/spring-jpa/src/main/resources/server.xml b/persistence-modules/spring-jpa/src/main/resources/server.xml similarity index 100% rename from spring-jpa/src/main/resources/server.xml rename to persistence-modules/spring-jpa/src/main/resources/server.xml diff --git a/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties b/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties new file mode 100644 index 0000000000..0bea6adad1 --- /dev/null +++ b/persistence-modules/spring-jpa/src/main/resources/sqlfiles.properties @@ -0,0 +1 @@ +spring.jpa.hibernate.ddl-auto=none \ No newline at end of file diff --git a/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp b/persistence-modules/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp similarity index 100% rename from spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp rename to persistence-modules/spring-jpa/src/main/webapp/WEB-INF/views/jsp/index.jsp diff --git a/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml b/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml new file mode 100644 index 0000000000..922aedbc39 --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/java/META-INF/persistence.xml @@ -0,0 +1,20 @@ + + + + org.baeldung.persistence.model.Foo + org.baeldung.persistence.model.Bar + + + + + + + + + + + + + diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java new file mode 100644 index 0000000000..f81247e3cd --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingIntegrationTest.java @@ -0,0 +1,53 @@ +package org.baeldung.dsrouting; + +import static org.junit.Assert.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = DataSourceRoutingTestConfiguration.class) +public class DataSourceRoutingIntegrationTest { + + @Autowired + DataSource routingDatasource; + + @Autowired + ClientService clientService; + + @Before + public void setup() { + final String SQL_CLIENT_A = "insert into client (id, name) values (1, 'CLIENT A')"; + final String SQL_CLIENT_B = "insert into client (id, name) values (2, 'CLIENT B')"; + + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(routingDatasource); + + ClientDatabaseContextHolder.set(ClientDatabase.CLIENT_A); + jdbcTemplate.execute(SQL_CLIENT_A); + ClientDatabaseContextHolder.clear(); + + ClientDatabaseContextHolder.set(ClientDatabase.CLIENT_B); + jdbcTemplate.execute(SQL_CLIENT_B); + ClientDatabaseContextHolder.clear(); + } + + @Test + public void givenClientDbs_whenContextsSwitch_thenRouteToCorrectDatabase() throws Exception { + + // test ACME WIDGETS + String clientName = clientService.getClientName(ClientDatabase.CLIENT_A); + assertEquals(clientName, "CLIENT A"); + + // test WIDGETS_ARE_US + clientName = clientService.getClientName(ClientDatabase.CLIENT_B); + assertEquals(clientName, "CLIENT B"); + } +} diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java new file mode 100644 index 0000000000..faad1695f4 --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/dsrouting/DataSourceRoutingTestConfiguration.java @@ -0,0 +1,44 @@ +package org.baeldung.dsrouting; + +import java.util.HashMap; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +@Configuration +public class DataSourceRoutingTestConfiguration { + + @Bean + public ClientService clientService() { + return new ClientService(new ClientDao(clientDatasource())); + } + + @Bean + public DataSource clientDatasource() { + Map targetDataSources = new HashMap<>(); + DataSource clientADatasource = clientADatasource(); + DataSource clientBDatasource = clientBDatasource(); + targetDataSources.put(ClientDatabase.CLIENT_A, clientADatasource); + targetDataSources.put(ClientDatabase.CLIENT_B, clientBDatasource); + + ClientDataSourceRouter clientRoutingDatasource = new ClientDataSourceRouter(); + clientRoutingDatasource.setTargetDataSources(targetDataSources); + clientRoutingDatasource.setDefaultTargetDataSource(clientADatasource); + return clientRoutingDatasource; + } + + private DataSource clientADatasource() { + EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder(); + return dbBuilder.setType(EmbeddedDatabaseType.H2).setName("CLIENT_A").addScript("classpath:dsrouting-db.sql").build(); + } + + private DataSource clientBDatasource() { + EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder(); + return dbBuilder.setType(EmbeddedDatabaseType.H2).setName("CLIENT_B").addScript("classpath:dsrouting-db.sql").build(); + } +} diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java similarity index 92% rename from spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java index 37388d1c51..09d118fedc 100644 --- a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java @@ -2,8 +2,6 @@ package org.baeldung.persistence.deletion.config; import org.baeldung.config.PersistenceJPAConfigL2Cache; -import java.util.Properties; - public class PersistenceJPAConfigDeletion extends PersistenceJPAConfigL2Cache { public PersistenceJPAConfigDeletion() { diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java similarity index 97% rename from spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java index 2dad3e6654..4fb3f8965e 100644 --- a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java @@ -1,7 +1,6 @@ package org.baeldung.persistence.deletion.model; import javax.persistence.*; -import java.util.List; @Entity @Table(name = "BAZ") diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java new file mode 100644 index 0000000000..9432420878 --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/AdvancedTaggingIntegrationTest.java @@ -0,0 +1,81 @@ +package org.baeldung.persistence.repository; + +import org.baeldung.config.StudentJpaConfig; +import org.baeldung.inmemory.persistence.dao.ManyStudentRepository; +import org.baeldung.inmemory.persistence.dao.ManyTagRepository; +import org.baeldung.inmemory.persistence.dao.StudentRepository; +import org.baeldung.inmemory.persistence.model.KVTag; +import org.baeldung.inmemory.persistence.model.ManyStudent; +import org.baeldung.inmemory.persistence.model.ManyTag; +import org.baeldung.inmemory.persistence.model.SkillTag; +import org.baeldung.inmemory.persistence.model.Student; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class) +@Transactional +public class AdvancedTaggingIntegrationTest { + @Resource + private StudentRepository studentRepository; + + @Resource + private ManyStudentRepository manyStudentRepository; + + @Resource + private ManyTagRepository manyTagRepository; + + @Test + public void givenStudentWithSkillTags_whenSave_thenGetByNameAndSkillTag() { + Student student = new Student(1, "Will"); + SkillTag skill1 = new SkillTag("java", 5); + student.setSkillTags(Arrays.asList(skill1)); + studentRepository.save(student); + + Student student2 = new Student(2, "Joe"); + SkillTag skill2 = new SkillTag("java", 1); + student2.setSkillTags(Arrays.asList(skill2)); + studentRepository.save(student2); + + List students = studentRepository.retrieveByNameFilterByMinimumSkillTag("java", 3); + assertEquals("size incorrect", 1, students.size()); + } + + @Test + public void givenStudentWithKVTags_whenSave_thenGetByTagOk() { + Student student = new Student(0, "John"); + student.setKVTags(Arrays.asList(new KVTag("department", "computer science"))); + studentRepository.save(student); + + Student student2 = new Student(1, "James"); + student2.setKVTags(Arrays.asList(new KVTag("department", "humanities"))); + studentRepository.save(student2); + + List students = studentRepository.retrieveByKeyTag("department"); + assertEquals("size incorrect", 2, students.size()); + } + + @Test + public void givenStudentWithManyTags_whenSave_theyGetByTagOk() { + ManyTag tag = new ManyTag("full time"); + manyTagRepository.save(tag); + + ManyStudent student = new ManyStudent("John"); + student.setManyTags(Collections.singleton(tag)); + manyStudentRepository.save(student); + + List students = manyStudentRepository.findByManyTags_Name("full time"); + assertEquals("size incorrect", 1, students.size()); + } +} diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java similarity index 84% rename from spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java index 0970daa0ee..7c6ec9b6da 100644 --- a/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/ExtendedStudentRepositoryIntegrationTest.java @@ -16,13 +16,13 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { StudentJPAH2Config.class}) +@ContextConfiguration(classes = { StudentJPAH2Config.class }) public class ExtendedStudentRepositoryIntegrationTest { @Resource private ExtendedStudentRepository extendedStudentRepository; - + @Before - public void setup(){ + public void setup() { Student student = new Student(1, "john"); extendedStudentRepository.save(student); Student student2 = new Student(2, "johnson"); @@ -30,10 +30,10 @@ public class ExtendedStudentRepositoryIntegrationTest { Student student3 = new Student(3, "tom"); extendedStudentRepository.save(student3); } - + @Test - public void givenStudents_whenFindByName_thenGetOk(){ + public void givenStudents_whenFindByName_thenGetOk() { List students = extendedStudentRepository.findByAttributeContainsText("name", "john"); - assertThat(students.size()).isEqualTo(2); + assertThat(students.size()).isEqualTo(2); } } diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java new file mode 100644 index 0000000000..3d9e376e81 --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java @@ -0,0 +1,82 @@ +package org.baeldung.persistence.repository; + +import org.baeldung.config.StudentJpaConfig; +import org.baeldung.inmemory.persistence.dao.StudentRepository; +import org.baeldung.inmemory.persistence.model.Student; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class) +@Transactional +public class InMemoryDBIntegrationTest { + + @Resource + private StudentRepository studentRepository; + + private static final long ID = 1; + private static final String NAME = "john"; + + @Test + public void givenStudent_whenSave_thenGetOk() { + Student student = new Student(ID, NAME); + studentRepository.save(student); + + Student student2 = studentRepository.findOne(ID); + assertEquals("name incorrect", NAME, student2.getName()); + } + + @Test + public void givenStudentWithTags_whenSave_thenGetByTagOk() { + Student student = new Student(ID, NAME); + student.setTags(Arrays.asList("full time", "computer science")); + studentRepository.save(student); + + Student student2 = studentRepository.retrieveByTag("full time").get(0); + assertEquals("name incorrect", NAME, student2.getName()); + } + + @Test + public void givenMultipleStudentsWithTags_whenSave_thenGetByTagReturnsCorrectCount() { + Student student = new Student(0, "Larry"); + student.setTags(Arrays.asList("full time", "computer science")); + studentRepository.save(student); + + Student student2 = new Student(1, "Curly"); + student2.setTags(Arrays.asList("part time", "rocket science")); + studentRepository.save(student2); + + Student student3 = new Student(2, "Moe"); + student3.setTags(Arrays.asList("full time", "philosophy")); + studentRepository.save(student3); + + Student student4 = new Student(3, "Shemp"); + student4.setTags(Arrays.asList("part time", "mathematics")); + studentRepository.save(student4); + + List students = studentRepository.retrieveByTag("full time"); + assertEquals("size incorrect", 2, students.size()); + } + + @Test + public void givenStudentWithTags_whenSave_thenGetByNameAndTagOk() { + Student student = new Student(ID, NAME); + student.setTags(Arrays.asList("full time", "computer science")); + studentRepository.save(student); + + Student student2 = studentRepository.retrieveByNameFilterByTag("John", "full time").get(0); + assertEquals("name incorrect", NAME, student2.getName()); + } + +} diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java similarity index 96% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java index 9e5c5fa07a..f42a4e9be1 100644 --- a/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java @@ -117,9 +117,7 @@ public class DeletionIntegrationTest { entityManager.persist(foo); flushAndClear(); - entityManager.createQuery("delete from Foo where id = :id") - .setParameter("id", foo.getId()) - .executeUpdate(); + entityManager.createQuery("delete from Foo where id = :id").setParameter("id", foo.getId()).executeUpdate(); assertThat(entityManager.find(Foo.class, foo.getId()), nullValue()); } @@ -131,9 +129,7 @@ public class DeletionIntegrationTest { entityManager.persist(foo); flushAndClear(); - entityManager.createNativeQuery("delete from FOO where ID = :id") - .setParameter("id", foo.getId()) - .executeUpdate(); + entityManager.createNativeQuery("delete from FOO where ID = :id").setParameter("id", foo.getId()).executeUpdate(); assertThat(entityManager.find(Foo.class, foo.getId()), nullValue()); } diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/JpaMultipleDBIntegrationTest.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/PersistenceTestSuite.java diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java similarity index 100% rename from spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java rename to persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java diff --git a/persistence-modules/spring-jpa/src/test/resources/.gitignore b/persistence-modules/spring-jpa/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/resources/dsrouting-db.sql b/persistence-modules/spring-jpa/src/test/resources/dsrouting-db.sql new file mode 100644 index 0000000000..c9ca52907a --- /dev/null +++ b/persistence-modules/spring-jpa/src/test/resources/dsrouting-db.sql @@ -0,0 +1,5 @@ +create table client ( + id numeric, + name varchar(50), + constraint pk_client primary key (id) +); \ No newline at end of file diff --git a/spring-jpa/src/test/resources/persistence-student.properties b/persistence-modules/spring-jpa/src/test/resources/persistence-student.properties similarity index 100% rename from spring-jpa/src/test/resources/persistence-student.properties rename to persistence-modules/spring-jpa/src/test/resources/persistence-student.properties diff --git a/pom.xml b/pom.xml index 9aa45b1d5d..6118e81288 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 com.baeldung parent-modules @@ -15,7 +14,7 @@ true false false - + 4.12 1.3 2.8.9 @@ -24,11 +23,12 @@ 1.1.7 2.19.1 - 3.6.0 + 3.7.0 - asm + parent-boot-5 + asm atomix apache-cayenne aws @@ -38,7 +38,10 @@ apache-cxf apache-fop apache-poi + apache-tika apache-thrift + apache-curator + apache-zookeeper autovalue axon bootique @@ -46,51 +49,57 @@ cdi core-java + core-java-io core-java-8 + core-groovy core-java-concurrency + couchbase - cas/cas-server - cas/cas-secured-app deltaspike dozer ethereumj - + feign - flyway - + geotools - groovy-spock + testing-modules/groovy-spock + google-cloud gson guava - guava18 - guava19 - guava21 + guava-modules/guava-18 + guava-modules/guava-19 + guava-modules/guava-21 guice disruptor handling-spring-static-resources hazelcast hbase - + httpclient hystrix - image-processing + immutables + influxdb jackson - + vavr + java-lite + java-rmi + java-vavr-stream javax-servlets javaxval jaxb - jee7 + jgroups + jee-7 jjwt jpa-storedprocedure @@ -98,26 +107,29 @@ json-path json jsoup - junit5 + testing-modules/junit-5 jws libraries libraries-data - linkrest - log-mdc - log4j - log4j2 + linkrest + logging-modules/log-mdc + logging-modules/log4j + logging-modules/log4j2 + logging-modules/logback lombok - + mapstruct - metrics + mesos-marathon - mockito - mockito2 - mocks + testing-modules/mockito + testing-modules/mockito-2 + testing-modules/mocks mustache + mvn-wrapper noexception - + orientdb + osgi orika patterns @@ -129,17 +141,18 @@ reactor-core persistence-modules/redis - rest-assured - rest-testing + testing-modules/rest-assured + testing-modules/rest-testing resteasy rxjava spring-swagger-codegen - - selenium-junit-testng + testing-modules/selenium-junit-testng persistence-modules/solr spark-java - + spring-5 + spring-5-reactive spring-5-mvc + spring-activiti spring-akka spring-amqp @@ -149,11 +162,15 @@ spring-batch spring-bom spring-boot + spring-boot-keycloak spring-boot-bootstrap + spring-boot-admin + spring-boot-security spring-cloud-data-flow spring-cloud spring-core spring-cucumber + spring-ejb spring-aop persistence-modules/spring-data-cassandra spring-data-couchbase-2 @@ -170,18 +187,21 @@ persistence-modules/spring-hibernate-3 spring-hibernate4 persistence-modules/spring-hibernate-5 + persistence-modules/spring-data-eclipselink spring-integration + spring-jenkins-pipeline spring-jersey - spring-jmeter-jenkins + spring-jms spring-jooq - spring-jpa + persistence-modules/spring-jpa spring-kafka spring-katharsis spring-ldap spring-mockito spring-mvc-email - spring-mvc-forms + spring-mvc-forms-jsp + spring-mvc-forms-thymeleaf spring-mvc-java spring-mvc-tiles spring-mvc-velocity @@ -193,11 +213,11 @@ spring-protobuf spring-quartz spring-rest-angular - spring-rest-docs spring-rest-full spring-rest-query-language spring-rest spring-rest-simple + spring-security-acl spring-security-cache-control spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize @@ -230,16 +250,19 @@ spring-zuul spring-reactor spring-vertx - + spring-jinq - testing - testng + spring-rest-embedded-tomcat + + + testing-modules/testing + testing-modules/testng video-tutorials xml - xmlunit2 - struts2 + xmlunit-2 + struts-2 apache-velocity apache-solrj @@ -251,13 +274,18 @@ drools persistence-modules/liquibase spring-boot-property-exp - mockserver + testing-modules/mockserver undertow vertx-and-rxjava saas deeplearning4j - spring-boot-admin - + lucene + vraptor + persistence-modules/java-cockroachdb + persistence-modules/java-jdbi + jersey + java-spi + @@ -282,7 +310,7 @@ ${org.slf4j.version} - + junit junit @@ -339,7 +367,7 @@ **/JdbcTest.java **/*LiveTest.java - true + diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml index 12f481c96f..d387471d56 100644 --- a/reactor-core/pom.xml +++ b/reactor-core/pom.xml @@ -26,11 +26,17 @@ ${assertj.version} test - + + + io.projectreactor + reactor-test + ${reactor-core.version} + test + - 3.0.5.RELEASE + 3.1.3.RELEASE 3.6.1 diff --git a/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java new file mode 100644 index 0000000000..41769b1b35 --- /dev/null +++ b/reactor-core/src/test/java/com/baeldung/reactor/core/CombiningPublishersTest.java @@ -0,0 +1,180 @@ +package com.baeldung.reactor.core; + +import java.time.Duration; + +import org.junit.Test; + +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +public class CombiningPublishersTest { + + private static Integer min = 1; + private static Integer max = 5; + + private static Flux evenNumbers = Flux.range(min, max).filter(x -> x % 2 == 0); + private static Flux oddNumbers = Flux.range(min, max).filter(x -> x % 2 > 0); + + @Test + public void givenFluxes_whenMergeDelayErrorIsInvoked_thenMergeDelayError() { + Flux fluxOfIntegers = Flux.mergeDelayError(1, + evenNumbers.delayElements(Duration.ofMillis(2000L)), + oddNumbers.delayElements(Duration.ofMillis(1000L))); + + StepVerifier.create(fluxOfIntegers) + .expectNext(1) + .expectNext(2) + .expectNext(3) + .expectNext(5) + .expectNext(4) + .expectComplete() + .verify(); + } + + + @Test + public void givenFluxes_whenMergeWithDelayedElementsIsInvoked_thenMergeWithDelayedElements() { + Flux fluxOfIntegers = Flux.merge( + evenNumbers.delayElements(Duration.ofMillis(2000L)), + oddNumbers.delayElements(Duration.ofMillis(1000L))); + + StepVerifier.create(fluxOfIntegers) + .expectNext(1) + .expectNext(2) + .expectNext(3) + .expectNext(5) + .expectNext(4) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenConcatIsInvoked_thenConcat() { + Flux fluxOfIntegers = Flux.concat( + evenNumbers.delayElements(Duration.ofMillis(2000L)), + oddNumbers.delayElements(Duration.ofMillis(1000L))); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(4) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenMergeIsInvoked_thenMerge() { + Flux fluxOfIntegers = Flux.merge( + evenNumbers, + oddNumbers); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(4) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenConcatWithIsInvoked_thenConcatWith() { + Flux fluxOfIntegers = evenNumbers + .concatWith(oddNumbers); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(4) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenCombineLatestIsInvoked_thenCombineLatest() { + Flux fluxOfIntegers = Flux.combineLatest( + evenNumbers, + oddNumbers, + (a, b) -> a + b); + + StepVerifier.create(fluxOfIntegers) + .expectNext(5) + .expectNext(7) + .expectNext(9) + .expectComplete() + .verify(); + + } + + @Test + public void givenFluxes_whenCombineLatestIsInvoked_thenCombineLatest1() { + StepVerifier.create(Flux.combineLatest(obj -> (int) obj[1], evenNumbers, oddNumbers)) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .verifyComplete(); + } + + @Test + public void givenFluxes_whenMergeSequentialIsInvoked_thenMergeSequential() { + Flux fluxOfIntegers = Flux.mergeSequential( + evenNumbers, + oddNumbers); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(4) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .expectComplete() + .verify(); + } + + + @Test + public void givenFluxes_whenMergeWithIsInvoked_thenMergeWith() { + Flux fluxOfIntegers = evenNumbers.mergeWith(oddNumbers); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(4) + .expectNext(1) + .expectNext(3) + .expectNext(5) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenZipIsInvoked_thenZip() { + Flux fluxOfIntegers = Flux.zip( + evenNumbers, + oddNumbers, + (a, b) -> a + b); + + StepVerifier.create(fluxOfIntegers) + .expectNext(3) + .expectNext(7) + .expectComplete() + .verify(); + } + + @Test + public void givenFluxes_whenZipWithIsInvoked_thenZipWith() { + Flux fluxOfIntegers = evenNumbers + .zipWith(oddNumbers, + (a, b) -> a * b); + + StepVerifier.create(fluxOfIntegers) + .expectNext(2) + .expectNext(12) + .expectComplete() + .verify(); + } +} \ No newline at end of file diff --git a/rxjava/README.md b/rxjava/README.md index 71231cc391..c88ec36991 100644 --- a/rxjava/README.md +++ b/rxjava/README.md @@ -8,3 +8,4 @@ - [Observable Utility Operators in RxJava](http://www.baeldung.com/rxjava-observable-operators) - [Introduction to rxjava-jdbc](http://www.baeldung.com/rxjava-jdbc) - [Schedulers in RxJava](http://www.baeldung.com/rxjava-schedulers) +- [Mathematical and Aggregate Operators in RxJava](http://www.baeldung.com/rxjava-math) diff --git a/rxjava/pom.xml b/rxjava/pom.xml index 0f950914ff..d88dfcaa9b 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -31,6 +31,19 @@ 1.0.0 + + io.reactivex + rxjava-string + 1.1.1 + + + + junit + junit + 4.12 + test + + com.jayway.awaitility awaitility diff --git a/rxjava/src/test/java/com/baeldung/rxjava/FlowableTest.java b/rxjava/src/test/java/com/baeldung/rxjava/FlowableTest.java new file mode 100644 index 0000000000..b9d1d64c24 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/FlowableTest.java @@ -0,0 +1,93 @@ +package com.baeldung.rxjava; + +import io.reactivex.BackpressureStrategy; +import io.reactivex.Flowable; +import io.reactivex.FlowableOnSubscribe; +import io.reactivex.Observable; +import io.reactivex.exceptions.MissingBackpressureException; +import io.reactivex.schedulers.Schedulers; +import io.reactivex.subscribers.TestSubscriber; + +import org.junit.Test; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class FlowableTest { + + @Test public void whenFlowableIsCreated_thenItIsProperlyInitialized() { + Flowable integerFlowable = Flowable.just(1, 2, 3, 4); + assertNotNull(integerFlowable); + } + + @Test public void whenFlowableIsCreatedFromObservable_thenItIsProperlyInitialized() throws InterruptedException { + Observable integerObservable = Observable.just(1, 2, 3); + Flowable integerFlowable = integerObservable.toFlowable(BackpressureStrategy.BUFFER); + assertNotNull(integerFlowable); + + } + + @Test public void whenFlowableIsCreatedFromFlowableOnSubscribe_thenItIsProperlyInitialized() throws InterruptedException { + FlowableOnSubscribe flowableOnSubscribe = flowableEmitter -> flowableEmitter.onNext(1); + Flowable integerFlowable = Flowable.create(flowableOnSubscribe, BackpressureStrategy.BUFFER); + assertNotNull(integerFlowable); + } + + @Test public void thenAllValuesAreBufferedAndReceived() { + List testList = IntStream.range(0, 100000).boxed().collect(Collectors.toList()); + Observable observable = Observable.fromIterable(testList); + TestSubscriber testSubscriber = observable.toFlowable(BackpressureStrategy.BUFFER).observeOn(Schedulers.computation()).test(); + + testSubscriber.awaitTerminalEvent(); + + List receivedInts = testSubscriber.getEvents().get(0).stream().mapToInt(object -> (int) object).boxed().collect(Collectors.toList()); + + assertEquals(testList, receivedInts); + } + + @Test public void whenDropStrategyUsed_thenOnBackpressureDropped() { + List testList = IntStream.range(0, 100000).boxed().collect(Collectors.toList()); + + Observable observable = Observable.fromIterable(testList); + TestSubscriber testSubscriber = observable.toFlowable(BackpressureStrategy.DROP).observeOn(Schedulers.computation()).test(); + testSubscriber.awaitTerminalEvent(); + List receivedInts = testSubscriber.getEvents().get(0).stream().mapToInt(object -> (int) object).boxed().collect(Collectors.toList()); + + assertThat(receivedInts.size() < testList.size()); + assertThat(!receivedInts.contains(100000)); + } + + @Test public void whenMissingStrategyUsed_thenException() { + Observable observable = Observable.range(1, 100000); + TestSubscriber subscriber = observable.toFlowable(BackpressureStrategy.MISSING).observeOn(Schedulers.computation()).test(); + + subscriber.awaitTerminalEvent(); + subscriber.assertError(MissingBackpressureException.class); + } + + @Test public void whenErrorStrategyUsed_thenExceptionIsThrown() { + Observable observable = Observable.range(1, 100000); + TestSubscriber subscriber = observable.toFlowable(BackpressureStrategy.ERROR).observeOn(Schedulers.computation()).test(); + + subscriber.awaitTerminalEvent(); + subscriber.assertError(MissingBackpressureException.class); + } + + @Test public void whenLatestStrategyUsed_thenTheLastElementReceived() { + List testList = IntStream.range(0, 100000).boxed().collect(Collectors.toList()); + Observable observable = Observable.fromIterable(testList); + TestSubscriber testSubscriber = observable.toFlowable(BackpressureStrategy.LATEST).observeOn(Schedulers.computation()).test(); + + testSubscriber.awaitTerminalEvent(); + List receivedInts = testSubscriber.getEvents().get(0).stream().mapToInt(object -> (int) object).boxed().collect(Collectors.toList()); + + assertThat(receivedInts.size() < testList.size()); + assertThat(receivedInts.contains(100000)); + } + +} \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/MaybeTest.java b/rxjava/src/test/java/com/baeldung/rxjava/MaybeTest.java new file mode 100644 index 0000000000..501ee1f196 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/MaybeTest.java @@ -0,0 +1,40 @@ +package com.baeldung.rxjava; + +import org.junit.Test; + +import io.reactivex.Flowable; +import io.reactivex.Maybe; + +public class MaybeTest { + @Test + public void whenEmitsSingleValue_thenItIsObserved() { + Maybe maybe = Flowable.just(1, 2, 3, 4, 5) + .firstElement(); + + maybe.map(x -> x + 7) + .filter(x -> x > 0) + .test() + .assertResult(8) + .assertComplete(); + } + + @Test + public void whenEmitsNoValue_thenSignalsCompletionAndNoValueObserved() { + Maybe maybe = Flowable.just(1, 2, 3, 4, 5) + .skip(5) + .firstElement(); + + maybe.test() + .assertComplete() + .assertNoValues(); + } + + @Test + public void whenThrowsError_thenErrorIsRaised() { + Maybe maybe = Flowable. error(new Exception("msg")) + .firstElement(); + + maybe.test() + .assertErrorMessage("msg"); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java index 712f07324c..bc59f72fd9 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersLiveTest.java @@ -194,6 +194,7 @@ public class SchedulersLiveTest { } @Test + @Ignore public void givenObservable_whenComputationScheduling_thenReturnThreadName() throws InterruptedException { System.out.println("computation"); Observable.just("computation") diff --git a/rxjava/src/test/java/com/baeldung/rxjava/combine/ObservableCombineUnitTest.java b/rxjava/src/test/java/com/baeldung/rxjava/combine/ObservableCombineUnitTest.java new file mode 100644 index 0000000000..693608d116 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/combine/ObservableCombineUnitTest.java @@ -0,0 +1,121 @@ +package com.baeldung.rxjava.combine; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import rx.Observable; +import rx.observers.TestSubscriber; + +public class ObservableCombineUnitTest { + + private static ExecutorService executor; + + @BeforeClass + public static void setupClass() { + executor = Executors.newFixedThreadPool(10); + } + + @AfterClass + public static void tearDownClass() { + executor.shutdown(); + } + + @Test + public void givenTwoObservables_whenMerged_shouldEmitCombinedResults() { + List results = new ArrayList<>(); + + //@formatter:off + Observable.merge( + Observable.from(new String[] {"Hello", "World"}), + Observable.from(new String[]{ "I love", "RxJava"}) + ).subscribe(data -> { + results.add(data); + }); + //@formatter:on + + assertThat(results).isNotEmpty(); + assertThat(results.size()).isEqualTo(4); + assertThat(results).contains("Hello", "World", "I love", "RxJava"); + } + + @Test + public void givenAnObservable_whenStartWith_thenPrependEmittedResults() { + StringBuffer buffer = new StringBuffer(); + + //@formatter:off + Observable + .from(new String[] { "RxJava", "Observables" }) + .startWith("Buzzwords of Reactive Programming") + .subscribe(data -> { + buffer.append(data).append(" "); + }); + //@formatter:on + + assertThat(buffer.toString().trim()).isEqualTo("Buzzwords of Reactive Programming RxJava Observables"); + } + + @Test + public void givenTwoObservables_whenZipped_thenReturnCombinedResults() { + List zippedStrings = new ArrayList<>(); + + //@formatter:off + Observable.zip( + Observable.from(new String[] { "Simple", "Moderate", "Complex" }), + Observable.from(new String[] { "Solutions", "Success", "Heirarchy"}), + (str1, str2) -> { + return str1 + " " + str2; + }).subscribe(zipped -> { + zippedStrings.add(zipped); + }); + //formatter:on + + assertThat(zippedStrings).isNotEmpty(); + assertThat(zippedStrings.size()).isEqualTo(3); + assertThat(zippedStrings).contains("Simple Solutions", "Moderate Success", "Complex Heirarchy"); + } + + @Test + public void givenMutipleObservablesOneThrows_whenMerged_thenCombineBeforePropagatingError() { + Future f1 = executor.submit(createCallable("Hello")); + Future f2 = executor.submit(createCallable("World")); + Future f3 = executor.submit(createCallable(null)); + Future f4 = executor.submit(createCallable("RxJava")); + + TestSubscriber testSubscriber = new TestSubscriber<>(); + + //@formatter:off + Observable.mergeDelayError( + Observable.from(f1), + Observable.from(f2), + Observable.from(f3), + Observable.from(f4) + ).subscribe(testSubscriber); + //@formatter:on + + testSubscriber.assertValues("hello", "world", "rxjava"); + testSubscriber.assertError(ExecutionException.class); + } + + private Callable createCallable(final String data) { + return new Callable() { + @Override + public String call() throws Exception { + if (data == null) { + throw new IllegalArgumentException("Data should not be null."); + } + return data.toLowerCase(); + } + }; + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/operators/RxStringOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/operators/RxStringOperatorsTest.java new file mode 100644 index 0000000000..5e58b32d8b --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/operators/RxStringOperatorsTest.java @@ -0,0 +1,145 @@ +package com.baeldung.rxjava.operators; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import org.junit.Assert; +import org.junit.Test; + +import rx.Observable; +import rx.observables.StringObservable; +import rx.observers.TestSubscriber; + + +public class RxStringOperatorsTest +{ + + @Test + public void givenStringObservable_whenFromInputStream_ThenSuccessfull() + { + //given + ByteArrayInputStream is = new ByteArrayInputStream("Lorem ipsum loream, Lorem ipsum lore".getBytes(StandardCharsets.UTF_8)); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.decode(StringObservable.from(is), StandardCharsets.UTF_8) + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValues("Lorem ipsum loream, Lorem ipsum lore"); + } + @Test + public void givenStringObservable_whenEncodingString_ThenSuccessfullObtainingByteStream() + { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream"); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.encode(sourceObservable, StandardCharsets.UTF_8) + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.getOnNextEvents() + .stream() + .forEach(bytes -> Assert.assertTrue(Arrays.equals(bytes, "Lorem ipsum loream".getBytes(StandardCharsets.UTF_8)))); + } + + @Test + public void givenStringObservable_whenConcatenatingStrings_ThenSuccessfullObtainingSingleString() + { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream","Lorem ipsum lore"); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.stringConcat(sourceObservable) + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValues("Lorem ipsum loreamLorem ipsum lore"); + } + + + @Test + public void givenStringObservable_whenDecodingByteArray_ThenSuccessfullObtainingStringStream() + { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream".getBytes(StandardCharsets.UTF_8)); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.decode(sourceObservable, StandardCharsets.UTF_8) + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValues("Lorem ipsum loream"); + } + + @Test + public void givenStringObservable_whenStringSplitted_ThenSuccessfullObtainingStringsStream() + { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream,Lorem ipsum lore"); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.split(sourceObservable,",") + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(2); + subscriber.assertValues("Lorem ipsum loream", "Lorem ipsum lore"); + } + + @Test + public void givenStringObservable_whenSplittingByLine_ThenSuccessfullObtainingStringsStream() { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream\nLorem ipsum lore"); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.byLine(sourceObservable) + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(2); + subscriber.assertValues("Lorem ipsum loream", "Lorem ipsum lore"); + } + + + @Test + public void givenStringObservable_whenJoiningStrings_ThenSuccessfullObtainingSingleString() { + //given + Observable sourceObservable = Observable.just("Lorem ipsum loream","Lorem ipsum lore"); + TestSubscriber subscriber = TestSubscriber.create(); + + // when + StringObservable.join(sourceObservable,",") + .subscribe(subscriber); + + // then + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValues("Lorem ipsum loream,Lorem ipsum lore"); + } + +} diff --git a/saas/pom.xml b/saas/pom.xml index 7c8745910f..b76b27011a 100644 --- a/saas/pom.xml +++ b/saas/pom.xml @@ -79,6 +79,6 @@ - 3.6.0 + 3.7.0 \ No newline at end of file diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 7b7ddcba88..850661836b 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.M3 + 2.0.0.M7 @@ -152,7 +152,7 @@ org.apache.maven.plugins maven-surefire-plugin - true + false **/*IntegrationTest.java @@ -190,6 +190,7 @@ UTF-8 UTF-8 1.8 + 5.0.2.RELEASE 1.1.2 diff --git a/spring-5-reactive-client/.gitignore b/spring-5-reactive-client/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/spring-5-reactive-client/.gitignore @@ -0,0 +1,12 @@ +#folders# +.idea +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md new file mode 100644 index 0000000000..400e343263 --- /dev/null +++ b/spring-5-reactive-client/README.md @@ -0,0 +1,15 @@ +## Spring REST Example Project + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) +- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) +- [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) +- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) +- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](https://github.com/eugenp/tutorials/tree/master/spring-5) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml new file mode 100644 index 0000000000..8e84c0f364 --- /dev/null +++ b/spring-5-reactive-client/pom.xml @@ -0,0 +1,201 @@ + + + 4.0.0 + + com.baeldung + spring-5-reactive-client + 0.0.1-SNAPSHOT + jar + + spring-5-reactive-client + spring 5 sample project about new features + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M7 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + javax.json.bind + javax.json.bind-api + + + + + + + + + + + + + + + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + + + + org.apache.commons + commons-lang3 + + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Spring5Application + JAR + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + 1.0.0 + 5.0.0 + 2.20 + 5.0.2.RELEASE + 1.0.1.RELEASE + 1.1.3 + 1.0 + 1.0 + + + diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java new file mode 100644 index 0000000000..2c49e6146a --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Foo.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Foo { + + private long id; + private String name; + +} diff --git a/spring-5-reactive-client/src/main/resources/application.properties b/spring-5-reactive-client/src/main/resources/application.properties new file mode 100644 index 0000000000..2d93456aeb --- /dev/null +++ b/spring-5-reactive-client/src/main/resources/application.properties @@ -0,0 +1,3 @@ +logging.level.root=INFO + +server.port=8081 \ No newline at end of file diff --git a/spring-5-reactive-client/src/main/resources/logback.xml b/spring-5-reactive-client/src/main/resources/logback.xml new file mode 100644 index 0000000000..8bbe8c1d67 --- /dev/null +++ b/spring-5-reactive-client/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + # Pattern of log message for console appender + %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n + + + + + + + + + + \ No newline at end of file diff --git a/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml b/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..bfcf43dad2 --- /dev/null +++ b/spring-5-reactive-client/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + Spring Functional Application + + + functional + com.baeldung.functional.RootServlet + 1 + true + + + functional + / + + + + \ No newline at end of file diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java new file mode 100644 index 0000000000..394ff42e5f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/ReactiveIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.reactive; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.reactive.model.Foo; + +import reactor.core.publisher.Mono; + +@SpringBootTest +public class ReactiveIntegrationTest { + + private WebClient client; + + @BeforeEach + public void before() { + client = WebClient.create("http://localhost:8080"); + } + + // + + @Test + public void whenMonoReactiveEndpointIsConsumed_thenCorrectOutput() { + final Mono fooMono = client.get().uri("/foos/123").exchange().log(); + + System.out.println(fooMono.subscribe()); + } + + @Test + public void whenFluxReactiveEndpointIsConsumed_thenCorrectOutput() throws InterruptedException { + client.get().uri("/foos") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + + System.out.println(); + } + +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java new file mode 100644 index 0000000000..c884ace323 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/Spring5ReactiveTestApplication.java @@ -0,0 +1,35 @@ +package com.baeldung.reactive; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.reactive.model.Foo; + +@SpringBootApplication +public class Spring5ReactiveTestApplication { + + @Bean + public WebClient client() { + return WebClient.create("http://localhost:8080"); + } + + @Bean + CommandLineRunner cmd(WebClient client) { + return args -> { + client.get().uri("/foos2") + .retrieve() + .bodyToFlux(Foo.class).log() + .subscribe(System.out::println); + }; + } + + // + + public static void main(String[] args) { + SpringApplication.run(Spring5ReactiveTestApplication.class, args); + } + +} diff --git a/spring-5-reactive-client/src/test/resources/logback-test.xml b/spring-5-reactive-client/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8bbe8c1d67 --- /dev/null +++ b/spring-5-reactive-client/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + # Pattern of log message for console appender + %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n + + + + + + + + + + \ No newline at end of file diff --git a/spring-5-reactive/.gitignore b/spring-5-reactive/.gitignore new file mode 100644 index 0000000000..dec013dfa4 --- /dev/null +++ b/spring-5-reactive/.gitignore @@ -0,0 +1,12 @@ +#folders# +.idea +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md new file mode 100644 index 0000000000..d8b9f89223 --- /dev/null +++ b/spring-5-reactive/README.md @@ -0,0 +1,16 @@ +## Spring REST Example Project + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles + +- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) +- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) +- [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) +- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) +- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](https://github.com/eugenp/tutorials/tree/master/spring-5) +- [Reactive WebSockets with Spring 5](http://www.baeldung.com/spring-5-reactive-websockets) diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml new file mode 100644 index 0000000000..abd8e42cf5 --- /dev/null +++ b/spring-5-reactive/pom.xml @@ -0,0 +1,212 @@ + + + 4.0.0 + + com.baeldung + spring-5-reactive + 0.0.1-SNAPSHOT + jar + + spring-5-reactive + spring 5 sample project about new features + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M7 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + javax.json.bind + javax.json.bind-api + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + + + + + + + + + + + org.projectlombok + lombok + compile + + + + org.apache.geronimo.specs + geronimo-json_1.1_spec + ${geronimo-json_1.1_spec.version} + + + org.apache.johnzon + johnzon-jsonb + + + + org.apache.commons + commons-lang3 + + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + com.h2database + h2 + runtime + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + org.projectlombok + lombok + + + org.apache.commons + commons-lang3 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.Spring5Application + JAR + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + 1.0.0 + 5.0.0 + 2.20 + 5.0.2.RELEASE + 1.0.1.RELEASE + 1.1.3 + 1.0 + 1.0 + + + + diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java new file mode 100644 index 0000000000..a9308124fa --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Spring5ReactiveApplication { + + public static void main(String[] args) { + SpringApplication.run(Spring5ReactiveApplication.class, args); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceReactiveHealthIndicator.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceReactiveHealthIndicator.java new file mode 100644 index 0000000000..7360def71e --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/DownstreamServiceReactiveHealthIndicator.java @@ -0,0 +1,23 @@ +package com.baeldung.reactive.actuator; + +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.ReactiveHealthIndicator; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +@Component +public class DownstreamServiceReactiveHealthIndicator implements ReactiveHealthIndicator { + + @Override + public Mono health() { + return checkDownstreamServiceHealth().onErrorResume( + ex -> Mono.just(new Health.Builder().down(ex).build()) + ); + } + + private Mono checkDownstreamServiceHealth() { + // we could use WebClient to check health reactively + return Mono.just(new Health.Builder().up().build()); + } + +} \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java new file mode 100644 index 0000000000..b2bc1e037f --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/FeaturesEndpoint.java @@ -0,0 +1,47 @@ +package com.baeldung.reactive.actuator; + +import org.springframework.boot.actuate.endpoint.annotation.*; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +@Endpoint(id = "features", enableByDefault = true) +public class FeaturesEndpoint { + + private Map features = new ConcurrentHashMap<>(); + + @ReadOperation + public Map features() { + return features; + } + + @ReadOperation + public Feature feature(@Selector String name) { + return features.get(name); + } + + @WriteOperation + public void configureFeature(@Selector String name, Feature feature) { + features.put(name, feature); + } + + @DeleteOperation + public void deleteFeature(@Selector String name) { + features.remove(name); + } + + public static class Feature { + private Boolean enabled; + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java new file mode 100644 index 0000000000..86502f0ab3 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/actuator/InfoWebEndpointExtension.java @@ -0,0 +1,32 @@ +package com.baeldung.reactive.actuator; + +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; +import org.springframework.boot.actuate.endpoint.web.WebEndpointResponse; +import org.springframework.boot.actuate.endpoint.web.annotation.EndpointWebExtension; +import org.springframework.boot.actuate.info.InfoEndpoint; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Component +@EndpointWebExtension(endpoint = InfoEndpoint.class) +public class InfoWebEndpointExtension { + + private final InfoEndpoint delegate; + + public InfoWebEndpointExtension(InfoEndpoint infoEndpoint) { + this.delegate = infoEndpoint; + } + + @ReadOperation + public WebEndpointResponse info() { + Map info = this.delegate.info(); + Integer status = getStatus(info); + return new WebEndpointResponse<>(info, status); + } + + private Integer getStatus(Map info) { + // return 5xx if this is a snapshot + return 200; + } +} \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java new file mode 100644 index 0000000000..933d469f65 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/FooReactiveController.java @@ -0,0 +1,46 @@ +package com.baeldung.reactive.controller; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; + +import java.time.Duration; +import java.util.Random; +import java.util.stream.Stream; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.reactive.model.Foo; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +@RestController +public class FooReactiveController { + + @GetMapping("/foos/{id}") + public Mono getFoo(@PathVariable("id") long id) { + return Mono.just(new Foo(id, randomAlphabetic(6))); + } + + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/foos") + public Flux getAllFoos2() { + final Flux foosFlux = Flux.fromStream(Stream.generate(() -> new Foo(new Random().nextLong(), randomAlphabetic(6)))); + final Flux emmitFlux = Flux.interval(Duration.ofSeconds(1)); + return Flux.zip(foosFlux, emmitFlux).map(Tuple2::getT1); + } + + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/foos2") + public Flux getAllFoos() { + final Flux flux = Flux. create(fluxSink -> { + while (true) { + fluxSink.next(new Foo(new Random().nextLong(), randomAlphabetic(6))); + } + }).sample(Duration.ofSeconds(1)).log(); + + return flux; + } + +} diff --git a/spring-5/src/main/java/com/baeldung/web/PathPatternController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/PathPatternController.java similarity index 89% rename from spring-5/src/main/java/com/baeldung/web/PathPatternController.java rename to spring-5-reactive/src/main/java/com/baeldung/reactive/controller/PathPatternController.java index 15b689257a..f5a5d9e769 100644 --- a/spring-5/src/main/java/com/baeldung/web/PathPatternController.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/PathPatternController.java @@ -1,8 +1,7 @@ -package com.baeldung.web; +package com.baeldung.reactive.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java new file mode 100644 index 0000000000..2c49e6146a --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Foo.java @@ -0,0 +1,13 @@ +package com.baeldung.reactive.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@AllArgsConstructor +@Data +public class Foo { + + private long id; + private String name; + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/Actor.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/Actor.java new file mode 100644 index 0000000000..ee06b94be7 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/Actor.java @@ -0,0 +1,23 @@ +package com.baeldung.reactive.urlmatch; + +class Actor { + private String firstname; + private String lastname; + + public Actor() { + } + + public Actor(String firstname, String lastname) { + this.firstname = firstname; + this.lastname = lastname; + } + + public String getFirstname() { + return firstname; + } + + public String getLastname() { + return lastname; + } + +} diff --git a/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java similarity index 98% rename from spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java rename to spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java index 2a6d04538c..78f40be57a 100644 --- a/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctions.java @@ -1,4 +1,4 @@ -package com.baeldung.functional; +package com.baeldung.reactive.urlmatch; import static org.springframework.web.reactive.function.BodyInserters.fromObject; import static org.springframework.web.reactive.function.server.RequestPredicates.GET; diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java new file mode 100644 index 0000000000..0781230379 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FormHandler.java @@ -0,0 +1,41 @@ +package com.baeldung.reactive.urlmatch; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.util.MultiValueMap; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; + +import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; +import static org.springframework.web.reactive.function.BodyExtractors.toFormData; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +public class FormHandler { + + Mono handleLogin(ServerRequest request) { + return request.body(toFormData()) + .map(MultiValueMap::toSingleValueMap) + .filter(formData -> "baeldung".equals(formData.get("user"))) + .filter(formData -> "you_know_what_to_do".equals(formData.get("token"))) + .flatMap(formData -> ok().body(Mono.just("welcome back!"), String.class)) + .switchIfEmpty(ServerResponse.badRequest() + .build()); + } + + Mono handleUpload(ServerRequest request) { + return request.body(toDataBuffers()) + .collectList() + .flatMap(dataBuffers -> ok().body(fromObject(extractData(dataBuffers).toString()))); + } + + private AtomicLong extractData(List dataBuffers) { + AtomicLong atomicLong = new AtomicLong(0); + dataBuffers.forEach(d -> atomicLong.addAndGet(d.asByteBuffer() + .array().length)); + return atomicLong; + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java new file mode 100644 index 0000000000..2ea5420a2b --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/FunctionalWebApplication.java @@ -0,0 +1,80 @@ +package com.baeldung.reactive.urlmatch; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; +import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +import reactor.core.publisher.Flux; + +public class FunctionalWebApplication { + + private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); + private static final Actor TOM_HANKS = new Actor("Tom", "Hanks"); + private static final List actors = new CopyOnWriteArrayList<>(Arrays.asList(BRAD_PITT, TOM_HANKS)); + + private RouterFunction routingFunction() { + FormHandler formHandler = new FormHandler(); + + RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) + .doOnNext(actors::add) + .then(ok().build())); + + return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) + .andRoute(POST("/upload"), formHandler::handleUpload) + .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) + .andNest(path("/actor"), restfulRouter) + .filter((request, next) -> { + System.out.println("Before handler invocation: " + request.path()); + return next.handle(request); + }); + } + + WebServer start() throws Exception { + WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); + HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) + .filter(new IndexRewriteFilter()) + .build(); + + Tomcat tomcat = new Tomcat(); + tomcat.setHostname("localhost"); + tomcat.setPort(9090); + Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); + ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); + Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); + rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); + + TomcatWebServer server = new TomcatWebServer(tomcat); + server.start(); + return server; + + } + + public static void main(String[] args) { + try { + new FunctionalWebApplication().start(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java new file mode 100644 index 0000000000..2eb252ed2b --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/urlmatch/IndexRewriteFilter.java @@ -0,0 +1,27 @@ +package com.baeldung.reactive.urlmatch; + +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +class IndexRewriteFilter implements WebFilter { + + @Override + public Mono filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { + ServerHttpRequest request = serverWebExchange.getRequest(); + if (request.getURI() + .getPath() + .equals("/")) { + return webFilterChain.filter(serverWebExchange.mutate() + .request(builder -> builder.method(request.getMethod()) + .contextPath(request.getPath() + .toString()) + .path("/test")) + .build()); + } + return webFilterChain.filter(serverWebExchange); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/Event.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/Event.java new file mode 100644 index 0000000000..90f83a566f --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/Event.java @@ -0,0 +1,11 @@ +package com.baeldung.reactive.websocket; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Event { + private String eventId; + private String eventDt; +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveJavaClientWebSocket.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveJavaClientWebSocket.java new file mode 100644 index 0000000000..c9a333c044 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveJavaClientWebSocket.java @@ -0,0 +1,26 @@ +package com.baeldung.reactive.websocket; + +import java.net.URI; +import java.time.Duration; +import org.springframework.web.reactive.socket.WebSocketMessage; +import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient; +import org.springframework.web.reactive.socket.client.WebSocketClient; + +import reactor.core.publisher.Mono; + +public class ReactiveJavaClientWebSocket { + public static void main(String[] args) throws InterruptedException { + + WebSocketClient client = new ReactorNettyWebSocketClient(); + client.execute( + URI.create("ws://localhost:8080/event-emitter"), + session -> session.send( + Mono.just(session.textMessage("event-spring-reactive-client-websocket"))) + .thenMany(session.receive() + .map(WebSocketMessage::getPayloadAsText) + .log()) + .then()) + .block(Duration.ofSeconds(10L)); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketApplication.java new file mode 100644 index 0000000000..43b5e50387 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.reactive.websocket; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReactiveWebSocketApplication { + public static void main(String[] args) { + SpringApplication.run(ReactiveWebSocketApplication.class, args); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketConfiguration.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketConfiguration.java new file mode 100644 index 0000000000..974def5a91 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketConfiguration.java @@ -0,0 +1,34 @@ +package com.baeldung.reactive.websocket; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.HandlerMapping; +import org.springframework.web.reactive.handler.SimpleUrlHandlerMapping; +import org.springframework.web.reactive.socket.WebSocketHandler; +import org.springframework.web.reactive.socket.server.support.WebSocketHandlerAdapter; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class ReactiveWebSocketConfiguration { + + @Autowired + private WebSocketHandler webSocketHandler; + + @Bean + public HandlerMapping webSocketHandlerMapping() { + Map map = new HashMap<>(); + map.put("/event-emitter", webSocketHandler); + + SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping(); + handlerMapping.setOrder(1); + handlerMapping.setUrlMap(map); + return handlerMapping; + } + + @Bean + public WebSocketHandlerAdapter handlerAdapter() { + return new WebSocketHandlerAdapter(); + } +} \ No newline at end of file diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketHandler.java new file mode 100644 index 0000000000..2e93c0c0dc --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/websocket/ReactiveWebSocketHandler.java @@ -0,0 +1,41 @@ +package com.baeldung.reactive.websocket; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.socket.WebSocketHandler; +import org.springframework.web.reactive.socket.WebSocketMessage; +import org.springframework.web.reactive.socket.WebSocketSession; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.time.Duration; + +import static java.time.LocalDateTime.now; +import static java.util.UUID.randomUUID; + +@Component +public class ReactiveWebSocketHandler implements WebSocketHandler { + + private static final ObjectMapper json = new ObjectMapper(); + + private Flux eventFlux = Flux.generate(sink -> { + Event event = new Event(randomUUID().toString(), now().toString()); + try { + sink.next(json.writeValueAsString(event)); + } catch (JsonProcessingException e) { + sink.error(e); + } + }); + + private Flux intervalFlux = Flux.interval(Duration.ofMillis(1000L)) + .zipWith(eventFlux, (time, event) -> event); + + @Override + public Mono handle(WebSocketSession webSocketSession) { + return webSocketSession.send(intervalFlux + .map(webSocketSession::textMessage)) + .and(webSocketSession.receive() + .map(WebSocketMessage::getPayloadAsText).log()); + } +} diff --git a/spring-5-reactive/src/main/resources/application.properties b/spring-5-reactive/src/main/resources/application.properties new file mode 100644 index 0000000000..5b9a0ae1ce --- /dev/null +++ b/spring-5-reactive/src/main/resources/application.properties @@ -0,0 +1,4 @@ +logging.level.root=INFO + +management.endpoints.web.expose=* +info.app.name=Spring Boot 2 actuator Application \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/files/hello.txt b/spring-5-reactive/src/main/resources/files/hello.txt new file mode 100644 index 0000000000..b6fc4c620b --- /dev/null +++ b/spring-5-reactive/src/main/resources/files/hello.txt @@ -0,0 +1 @@ +hello \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/files/test/test.txt b/spring-5-reactive/src/main/resources/files/test/test.txt new file mode 100644 index 0000000000..30d74d2584 --- /dev/null +++ b/spring-5-reactive/src/main/resources/files/test/test.txt @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/spring-5-reactive/src/main/resources/static/client-websocket.html b/spring-5-reactive/src/main/resources/static/client-websocket.html new file mode 100644 index 0000000000..3f840e8bd4 --- /dev/null +++ b/spring-5-reactive/src/main/resources/static/client-websocket.html @@ -0,0 +1,34 @@ + + + + +Baeldung: Spring 5 Reactive Client WebSocket (Browser) + + + +
+ + + \ No newline at end of file diff --git a/spring-5-reactive/src/main/webapp/WEB-INF/web.xml b/spring-5-reactive/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..bfcf43dad2 --- /dev/null +++ b/spring-5-reactive/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + Spring Functional Application + + + functional + com.baeldung.functional.RootServlet + 1 + true + + + functional + / + + + + \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java new file mode 100644 index 0000000000..bad5fc5f22 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/FluxUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.reactive; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertNotNull; + +import java.time.Duration; +import java.util.Random; + +import org.junit.jupiter.api.Test; + +import com.baeldung.reactive.model.Foo; + +import reactor.core.publisher.Flux; + +public class FluxUnitTest { + + @Test + public void whenFluxIsConstructed_thenCorrect() { + final Flux flux = Flux. create(fluxSink -> { + while (true) { + fluxSink.next(new Foo(new Random().nextLong(), randomAlphabetic(6))); + } + }).sample(Duration.ofSeconds(1)).log(); + + flux.subscribe(); + + assertNotNull(flux); + } + +} diff --git a/spring-boot-actuator/src/test/java/org/baeldung/config/ActuatorInfoIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java similarity index 56% rename from spring-boot-actuator/src/test/java/org/baeldung/config/ActuatorInfoIntegrationTest.java rename to spring-5-reactive/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java index 0b5e3b3eef..3020e86723 100644 --- a/spring-boot-actuator/src/test/java/org/baeldung/config/ActuatorInfoIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/actuator/ActuatorInfoIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.reactive.actuator; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,26 +7,30 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; -import static org.junit.Assert.*; + +import com.baeldung.reactive.Spring5ReactiveApplication; + import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = MainConfig.class) -@TestPropertySource(properties = { "security.basic.enabled=false" }) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Spring5ReactiveApplication.class) public class ActuatorInfoIntegrationTest { @Autowired private TestRestTemplate restTemplate; @Test - public void whenGetInfo_thenAdditionalInfoReturned() throws IOException { - final String expectedResponse = new String(Files.readAllBytes(Paths.get("src/test/resources/expectedResponse.json"))); - final ResponseEntity responseEntity = this.restTemplate.getForEntity("/info", String.class); + public void whenGetInfo_thenReturns200() throws IOException { + final ResponseEntity responseEntity = this.restTemplate.getForEntity("/actuator/info", String.class); + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + } + + @Test + public void whenFeatures_thenReturns200() throws IOException { + final ResponseEntity responseEntity = this.restTemplate.getForEntity("/actuator/features", String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - assertEquals(expectedResponse, responseEntity.getBody()); } } \ No newline at end of file diff --git a/spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java similarity index 93% rename from spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java rename to spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java index 7a38fa697f..21ba11616d 100644 --- a/spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.functional; +package com.baeldung.reactive.urlmatch; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -6,7 +6,9 @@ import org.junit.Test; import org.springframework.boot.web.server.WebServer; import org.springframework.test.web.reactive.server.WebTestClient; -public class ExploreSpring5URLPatternUsingRouterFunctionsTest { +import com.baeldung.reactive.urlmatch.ExploreSpring5URLPatternUsingRouterFunctions; + +public class ExploreSpring5URLPatternUsingRouterFunctionsIntegrationTest { private static WebTestClient client; private static WebServer server; diff --git a/spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java similarity index 92% rename from spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java rename to spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java index c2ed8ff071..9f31608ff7 100644 --- a/spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -1,6 +1,5 @@ -package com.baeldung.web; +package com.baeldung.reactive.urlmatch; -import com.baeldung.Spring5Application; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; @@ -8,8 +7,11 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; +import com.baeldung.reactive.Spring5ReactiveApplication; +import com.baeldung.reactive.controller.PathPatternController; + @RunWith(SpringRunner.class) -@SpringBootTest(classes = Spring5Application.class) +@SpringBootTest(classes = Spring5ReactiveApplication.class) public class PathPatternsUsingHandlerMethodIntegrationTest { private static WebTestClient client; diff --git a/spring-5-security/README.md b/spring-5-security/README.md new file mode 100644 index 0000000000..d6573ef8b0 --- /dev/null +++ b/spring-5-security/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) +- [Extra Login Fields with Spring Security](https://github.com/eugenp/tutorials/tree/master/spring-5-security) diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml new file mode 100644 index 0000000000..ffe6865704 --- /dev/null +++ b/spring-5-security/pom.xml @@ -0,0 +1,114 @@ + + 4.0.0 + com.baeldung + spring-5-security + 0.0.1-SNAPSHOT + jar + + spring-5-security + spring 5 security sample project + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RC2 + + + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity4 + + + + + org.springframework.security + spring-security-oauth2-client + + + org.springframework.security + spring-security-oauth2-jose + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + UTF-8 + UTF-8 + 1.8 + + \ No newline at end of file diff --git a/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingConfigurer.java b/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingConfigurer.java new file mode 100644 index 0000000000..5a9479b664 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingConfigurer.java @@ -0,0 +1,32 @@ +package com.baeldung.dsl; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.access.intercept.FilterSecurityInterceptor; + +public class ClientErrorLoggingConfigurer extends AbstractHttpConfigurer { + + private List errorCodes; + + public ClientErrorLoggingConfigurer(List errorCodes) { + this.errorCodes = errorCodes; + } + + public ClientErrorLoggingConfigurer() { + + } + + @Override + public void init(HttpSecurity http) throws Exception { + // initialization code + } + + @Override + public void configure(HttpSecurity http) throws Exception { + http.addFilterAfter(new ClientErrorLoggingFilter(errorCodes), FilterSecurityInterceptor.class); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingFilter.java b/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingFilter.java new file mode 100644 index 0000000000..56f7cea3b8 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/dsl/ClientErrorLoggingFilter.java @@ -0,0 +1,54 @@ +package com.baeldung.dsl; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.GenericFilterBean; + +public class ClientErrorLoggingFilter extends GenericFilterBean { + + private static final Logger logger = LogManager.getLogger(ClientErrorLoggingFilter.class); + + private List errorCodes; + + public ClientErrorLoggingFilter(List errorCodes) { + this.errorCodes = errorCodes; + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + + if (auth != null) { + int status = ((HttpServletResponse) response).getStatus(); + if (status >= 400 && status < 500) { + if (errorCodes == null) { + logger.debug("User " + auth.getName() + " encountered error " + status); + } else { + if (errorCodes.stream() + .filter(s -> s.value() == status) + .findFirst() + .isPresent()) { + logger.debug("User " + auth.getName() + " encountered error " + status); + } + } + } + } + + chain.doFilter(request, response); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/dsl/CustomConfigurerApplication.java b/spring-5-security/src/main/java/com/baeldung/dsl/CustomConfigurerApplication.java new file mode 100644 index 0000000000..2cd3d7fc7f --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/dsl/CustomConfigurerApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.dsl; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CustomConfigurerApplication { + + public static void main(String[] args) { + SpringApplication.run(CustomConfigurerApplication.class, args); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/dsl/MyController.java b/spring-5-security/src/main/java/com/baeldung/dsl/MyController.java new file mode 100644 index 0000000000..c69046afb5 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/dsl/MyController.java @@ -0,0 +1,14 @@ +package com.baeldung.dsl; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MyController { + + @GetMapping("/admin") + public String getAdminPage() { + return "Hello Admin"; + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/dsl/SecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/dsl/SecurityConfig.java new file mode 100644 index 0000000000..382e222f64 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/dsl/SecurityConfig.java @@ -0,0 +1,50 @@ +package com.baeldung.dsl; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/admin*") + .hasAnyRole("ADMIN") + .anyRequest() + .authenticated() + .and() + .formLogin() + .and() + .apply(clientErrorLogging()); + } + + @Bean + public ClientErrorLoggingConfigurer clientErrorLogging() { + return new ClientErrorLoggingConfigurer(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication() + .passwordEncoder(passwordEncoder()) + .withUser("user1") + .password(passwordEncoder().encode("user")) + .roles("USER") + .and() + .withUser("admin") + .password(passwordEncoder().encode("admin")) + .roles("ADMIN"); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java new file mode 100644 index 0000000000..2a5c5f0368 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java @@ -0,0 +1,50 @@ +package com.baeldung.loginextrafieldscustom; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { + + if (!request.getMethod().equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + + request.getMethod()); + } + + CustomAuthenticationToken authRequest = getAuthRequest(request); + setDetails(request, authRequest); + return this.getAuthenticationManager().authenticate(authRequest); + } + + private CustomAuthenticationToken getAuthRequest(HttpServletRequest request) { + String username = obtainUsername(request); + String password = obtainPassword(request); + String domain = obtainDomain(request); + + if (username == null) { + username = ""; + } + if (password == null) { + password = ""; + } + if (domain == null) { + domain = ""; + } + + return new CustomAuthenticationToken(username, password, domain); + } + + private String obtainDomain(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java new file mode 100644 index 0000000000..50995169a1 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java @@ -0,0 +1,28 @@ +package com.baeldung.loginextrafieldscustom; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +public class CustomAuthenticationToken extends UsernamePasswordAuthenticationToken { + + private String domain; + + public CustomAuthenticationToken(Object principal, Object credentials, String domain) { + super(principal, credentials); + this.domain = domain; + super.setAuthenticated(false); + } + + public CustomAuthenticationToken(Object principal, Object credentials, String domain, + Collection authorities) { + super(principal, credentials, authorities); + this.domain = domain; + super.setAuthenticated(true); // must use super, as we override + } + + public String getDomain() { + return this.domain; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java new file mode 100644 index 0000000000..693900d843 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java @@ -0,0 +1,92 @@ +package com.baeldung.loginextrafieldscustom; + +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InternalAuthenticationServiceException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.util.Assert; + +public class CustomUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + /** + * The plaintext password used to perform + * PasswordEncoder#matches(CharSequence, String)} on when the user is + * not found to avoid SEC-2056. + */ + private static final String USER_NOT_FOUND_PASSWORD = "userNotFoundPassword"; + + private PasswordEncoder passwordEncoder; + private CustomUserDetailsService userDetailsService; + + /** + * The password used to perform + * {@link PasswordEncoder#matches(CharSequence, String)} on when the user is + * not found to avoid SEC-2056. This is necessary, because some + * {@link PasswordEncoder} implementations will short circuit if the password is not + * in a valid format. + */ + private String userNotFoundEncodedPassword; + + public CustomUserDetailsAuthenticationProvider(PasswordEncoder passwordEncoder, CustomUserDetailsService userDetailsService) { + this.passwordEncoder = passwordEncoder; + this.userDetailsService = userDetailsService; + } + + @Override + protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + + if (authentication.getCredentials() == null) { + logger.debug("Authentication failed: no credentials provided"); + throw new BadCredentialsException( + messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + + String presentedPassword = authentication.getCredentials() + .toString(); + + if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { + logger.debug("Authentication failed: password does not match stored value"); + throw new BadCredentialsException( + messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + + @Override + protected void doAfterPropertiesSet() throws Exception { + Assert.notNull(this.userDetailsService, "A UserDetailsService must be set"); + this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD); + } + + @Override + protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + CustomAuthenticationToken auth = (CustomAuthenticationToken) authentication; + UserDetails loadedUser; + + try { + loadedUser = this.userDetailsService.loadUserByUsernameAndDomain(auth.getPrincipal() + .toString(), auth.getDomain()); + } catch (UsernameNotFoundException notFound) { + if (authentication.getCredentials() != null) { + String presentedPassword = authentication.getCredentials() + .toString(); + passwordEncoder.matches(presentedPassword, userNotFoundEncodedPassword); + } + throw notFound; + } catch (Exception repositoryProblem) { + throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem); + } + + if (loadedUser == null) { + throw new InternalAuthenticationServiceException("UserDetailsService returned null, " + + "which is an interface contract violation"); + } + return loadedUser; + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java new file mode 100644 index 0000000000..358129173d --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java @@ -0,0 +1,10 @@ +package com.baeldung.loginextrafieldscustom; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public interface CustomUserDetailsService { + + UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException; + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java new file mode 100644 index 0000000000..ea979e2fab --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java @@ -0,0 +1,30 @@ +package com.baeldung.loginextrafieldscustom; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service("userDetailsService") +public class CustomUserDetailsServiceImpl implements CustomUserDetailsService { + + private UserRepository userRepository; + + public CustomUserDetailsServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException { + if (StringUtils.isAnyBlank(username, domain)) { + throw new UsernameNotFoundException("Username and domain must be provided"); + } + User user = userRepository.findUser(username, domain); + if (user == null) { + throw new UsernameNotFoundException( + String.format("Username not found for domain, username=%s, domain=%s", + username, domain)); + } + return user; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java new file mode 100644 index 0000000000..428c8bf532 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java @@ -0,0 +1,26 @@ +package com.baeldung.loginextrafieldscustom; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Repository; + +@Repository("userRepository") +public class CustomUserRepository implements UserRepository { + + @Override + public User findUser(String username, String domain) { + if (StringUtils.isAnyBlank(username, domain)) { + return null; + } else { + Collection authorities = new ArrayList<>(); + User user = new User(username, domain, + "$2a$10$U3GhSMpsMSOE8Kqsbn58/edxDBKlVuYMh7qk/7ErApYFjJzi2VG5K", true, + true, true, true, authorities); + return user; + } + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java new file mode 100644 index 0000000000..0cf934f288 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.loginextrafieldscustom; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExtraLoginFieldsApplication { + + public static void main(String[] args) { + SpringApplication.run(ExtraLoginFieldsApplication.class, args); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java new file mode 100644 index 0000000000..def85ab978 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java @@ -0,0 +1,62 @@ +package com.baeldung.loginextrafieldscustom; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@PropertySource("classpath:/application-extrafields.properties") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private CustomUserDetailsService userDetailsService; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http + .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) + .authorizeRequests() + .antMatchers("/css/**", "/index").permitAll() + .antMatchers("/user/**").authenticated() + .and() + .formLogin().loginPage("/login") + .and() + .logout() + .logoutUrl("/logout"); + } + + public CustomAuthenticationFilter authenticationFilter() throws Exception { + CustomAuthenticationFilter filter = new CustomAuthenticationFilter(); + filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationFailureHandler(failureHandler()); + return filter; + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authProvider()); + } + + public AuthenticationProvider authProvider() { + CustomUserDetailsAuthenticationProvider provider + = new CustomUserDetailsAuthenticationProvider(passwordEncoder(), userDetailsService); + return provider; + } + + public SimpleUrlAuthenticationFailureHandler failureHandler() { + return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); + } + + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java new file mode 100644 index 0000000000..aa03f15b6a --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java @@ -0,0 +1,23 @@ +package com.baeldung.loginextrafieldscustom; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; + +public class User extends org.springframework.security.core.userdetails.User { + + private static final long serialVersionUID = 1L; + + private String domain; + + public User(String username, String domain, String password, boolean enabled, + boolean accountNonExpired, boolean credentialsNonExpired, + boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.domain = domain; + } + + public String getDomain() { + return domain; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java new file mode 100644 index 0000000000..e2358e055b --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.loginextrafieldscustom; + +public interface UserRepository { + + public User findUser(String username, String domain); + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java new file mode 100644 index 0000000000..b5e0b511ac --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java @@ -0,0 +1,51 @@ +package com.baeldung.loginextrafieldscustom; + +import java.util.Optional; + +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class WebController { + + @RequestMapping("/") + public String root() { + return "redirect:/index"; + } + + @RequestMapping("/index") + public String index(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "index"; + } + + @RequestMapping("/user/index") + public String userIndex(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "user/index"; + } + + @RequestMapping("/login") + public String login() { + return "login"; + } + + private Optional getDomain() { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + String domain = null; + if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { + User user = (User) auth.getPrincipal(); + domain = user.getDomain(); + } + return Optional.ofNullable(domain); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java new file mode 100644 index 0000000000..c82a13de1a --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.loginextrafieldssimple; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExtraLoginFieldsApplication { + + public static void main(String[] args) { + SpringApplication.run(ExtraLoginFieldsApplication.class, args); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java new file mode 100644 index 0000000000..d8c5ea8147 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java @@ -0,0 +1,65 @@ +package com.baeldung.loginextrafieldssimple; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@PropertySource("classpath:/application-extrafields.properties") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private UserDetailsService userDetailsService; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http + .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) + .authorizeRequests() + .antMatchers("/css/**", "/index").permitAll() + .antMatchers("/user/**").authenticated() + .and() + .formLogin().loginPage("/login") + .and() + .logout() + .logoutUrl("/logout"); + } + + public SimpleAuthenticationFilter authenticationFilter() throws Exception { + SimpleAuthenticationFilter filter = new SimpleAuthenticationFilter(); + filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationFailureHandler(failureHandler()); + return filter; + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authProvider()); + } + + public AuthenticationProvider authProvider() { + DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); + provider.setUserDetailsService(userDetailsService); + provider.setPasswordEncoder(passwordEncoder()); + return provider; + } + + public SimpleUrlAuthenticationFailureHandler failureHandler() { + return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); + } + + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java new file mode 100644 index 0000000000..9dcb524157 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java @@ -0,0 +1,54 @@ +package com.baeldung.loginextrafieldssimple; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class SimpleAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { + + if (!request.getMethod() + .equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); + } + + UsernamePasswordAuthenticationToken authRequest = getAuthRequest(request); + setDetails(request, authRequest); + return this.getAuthenticationManager() + .authenticate(authRequest); + } + + private UsernamePasswordAuthenticationToken getAuthRequest(HttpServletRequest request) { + String username = obtainUsername(request); + String password = obtainPassword(request); + String domain = obtainDomain(request); + + if (username == null) { + username = ""; + } + if (password == null) { + password = ""; + } + if (domain == null) { + domain = ""; + } + + String usernameDomain = String.format("%s%s%s", username.trim(), + String.valueOf(Character.LINE_SEPARATOR), domain); + return new UsernamePasswordAuthenticationToken(usernameDomain, password); + } + + private String obtainDomain(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java new file mode 100644 index 0000000000..2fad50ad01 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java @@ -0,0 +1,32 @@ +package com.baeldung.loginextrafieldssimple; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service("userDetailsService") +public class SimpleUserDetailsService implements UserDetailsService { + + private UserRepository userRepository; + + public SimpleUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + String[] usernameAndDomain = StringUtils.split(username, String.valueOf(Character.LINE_SEPARATOR)); + if (usernameAndDomain == null || usernameAndDomain.length != 2) { + throw new UsernameNotFoundException("Username and domain must be provided"); + } + User user = userRepository.findUser(usernameAndDomain[0], usernameAndDomain[1]); + if (user == null) { + throw new UsernameNotFoundException( + String.format("Username not found for domain, username=%s, domain=%s", + usernameAndDomain[0], usernameAndDomain[1])); + } + return user; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java new file mode 100644 index 0000000000..e8aaa774a1 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java @@ -0,0 +1,26 @@ +package com.baeldung.loginextrafieldssimple; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Repository; + +@Repository("userRepository") +public class SimpleUserRepository implements UserRepository { + + @Override + public User findUser(String username, String domain) { + if (StringUtils.isAnyBlank(username, domain)) { + return null; + } else { + Collection authorities = new ArrayList<>(); + User user = new User(username, domain, + "$2a$10$U3GhSMpsMSOE8Kqsbn58/edxDBKlVuYMh7qk/7ErApYFjJzi2VG5K", true, + true, true, true, authorities); + return user; + } + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java new file mode 100644 index 0000000000..b76da65638 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java @@ -0,0 +1,21 @@ +package com.baeldung.loginextrafieldssimple; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; + +public class User extends org.springframework.security.core.userdetails.User { + + private String domain; + + public User(String username, String domain, String password, boolean enabled, + boolean accountNonExpired, boolean credentialsNonExpired, + boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.domain = domain; + } + + public String getDomain() { + return domain; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java new file mode 100644 index 0000000000..919e611b9c --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.loginextrafieldssimple; + +public interface UserRepository { + + public User findUser(String username, String domain); + +} diff --git a/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java new file mode 100644 index 0000000000..1b17de7bec --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java @@ -0,0 +1,51 @@ +package com.baeldung.loginextrafieldssimple; + +import java.util.Optional; + +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class WebController { + + @RequestMapping("/") + public String root() { + return "redirect:/index"; + } + + @RequestMapping("/index") + public String index(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "index"; + } + + @RequestMapping("/user/index") + public String userIndex(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "user/index"; + } + + @RequestMapping("/login") + public String login() { + return "login"; + } + + private Optional getDomain() { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + String domain = null; + if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { + User user = (User) auth.getPrincipal(); + domain = user.getDomain(); + } + return Optional.ofNullable(domain); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java b/spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java new file mode 100644 index 0000000000..5d6c13bb0e --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java @@ -0,0 +1,75 @@ +package com.baeldung.oauth2; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.ResolvableType; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.client.RestTemplate; + +@Controller +public class LoginController { + + private static final String authorizationRequestBaseUri = "oauth2/authorize-client"; + Map oauth2AuthenticationUrls = new HashMap<>(); + + @Autowired + private ClientRegistrationRepository clientRegistrationRepository; + @Autowired + private OAuth2AuthorizedClientService authorizedClientService; + + @GetMapping("/oauth_login") + public String getLoginPage(Model model) { + Iterable clientRegistrations = null; + ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository) + .as(Iterable.class); + if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) { + clientRegistrations = (Iterable) clientRegistrationRepository; + } + + clientRegistrations.forEach(registration -> oauth2AuthenticationUrls.put(registration.getClientName(), authorizationRequestBaseUri + "/" + registration.getRegistrationId())); + model.addAttribute("urls", oauth2AuthenticationUrls); + + return "oauth_login"; + } + + @GetMapping("/loginSuccess") + public String getLoginInfo(Model model, OAuth2AuthenticationToken authentication) { + + OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient(authentication.getAuthorizedClientRegistrationId(), authentication.getName()); + + String userInfoEndpointUri = client.getClientRegistration() + .getProviderDetails() + .getUserInfoEndpoint() + .getUri(); + + if (!StringUtils.isEmpty(userInfoEndpointUri)) { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + client.getAccessToken() + .getTokenValue()); + + HttpEntity entity = new HttpEntity("", headers); + + ResponseEntity response = restTemplate.exchange(userInfoEndpointUri, HttpMethod.GET, entity, Map.class); + Map userAttributes = response.getBody(); + model.addAttribute("name", userAttributes.get("name")); + } + + return "loginSuccess"; + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java b/spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java new file mode 100644 index 0000000000..07d783b63d --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.oauth2; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class MvcConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("securedPage"); + registry.addViewController("loginFailure"); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java new file mode 100644 index 0000000000..b45f325767 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java @@ -0,0 +1,102 @@ +package com.baeldung.oauth2; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; +import org.springframework.security.oauth2.client.endpoint.NimbusAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; +import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; + +@Configuration +@PropertySource("application-oauth2.properties") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/oauth_login", "/loginFailure", "/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .oauth2Login() + .loginPage("/oauth_login") + .authorizationEndpoint() + .baseUri("/oauth2/authorize-client") + .authorizationRequestRepository(authorizationRequestRepository()) + .and() + .tokenEndpoint() + .accessTokenResponseClient(accessTokenResponseClient()) + .and() + .defaultSuccessUrl("/loginSuccess") + .failureUrl("/loginFailure"); + } + + @Bean + public AuthorizationRequestRepository authorizationRequestRepository() { + return new HttpSessionOAuth2AuthorizationRequestRepository(); + } + + @Bean + public OAuth2AccessTokenResponseClient accessTokenResponseClient() { + return new NimbusAuthorizationCodeTokenResponseClient(); + } + + + // additional configuration for non-Spring Boot projects + private static List clients = Arrays.asList("google", "facebook"); + + //@Bean + public ClientRegistrationRepository clientRegistrationRepository() { + List registrations = clients.stream() + .map(c -> getRegistration(c)) + .filter(registration -> registration != null) + .collect(Collectors.toList()); + + return new InMemoryClientRegistrationRepository(registrations); + } + + private static String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration."; + + @Autowired + private Environment env; + + private ClientRegistration getRegistration(String client) { + String clientId = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-id"); + + if (clientId == null) { + return null; + } + + String clientSecret = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-secret"); + if (client.equals("google")) { + return CommonOAuth2Provider.GOOGLE.getBuilder(client) + .clientId(clientId) + .clientSecret(clientSecret) + .build(); + } + if (client.equals("facebook")) { + return CommonOAuth2Provider.FACEBOOK.getBuilder(client) + .clientId(clientId) + .clientSecret(clientSecret) + .build(); + } + return null; + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java b/spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java new file mode 100644 index 0000000000..557c23b368 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.oauth2; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringOAuthApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringOAuthApplication.class, args); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/passwordstorage/BaeldungPasswordEncoderSetup.java b/spring-5-security/src/main/java/com/baeldung/passwordstorage/BaeldungPasswordEncoderSetup.java new file mode 100644 index 0000000000..94987029db --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/passwordstorage/BaeldungPasswordEncoderSetup.java @@ -0,0 +1,35 @@ +package com.baeldung.passwordstorage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.event.AuthenticationSuccessEvent; +import org.springframework.security.core.Authentication; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class BaeldungPasswordEncoderSetup { + + private final static Logger LOG = LoggerFactory.getLogger(BaeldungPasswordEncoderSetup.class); + + @Bean + public ApplicationListener authenticationSuccessListener(final PasswordEncoder encoder) { + + return (AuthenticationSuccessEvent event) -> { + final Authentication auth = event.getAuthentication(); + + if (auth instanceof UsernamePasswordAuthenticationToken && auth.getCredentials() != null) { + + final CharSequence clearTextPass = (CharSequence) auth.getCredentials(); // 1 + final String newPasswordHash = encoder.encode(clearTextPass); // 2 + + LOG.info("New password hash {} for user {}", newPasswordHash, auth.getName()); + + ((UsernamePasswordAuthenticationToken) auth).eraseCredentials(); // 3 + } + }; + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageApplication.java b/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageApplication.java new file mode 100644 index 0000000000..173d979a45 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.passwordstorage; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PasswordStorageApplication { + + public static void main(String[] args) { + SpringApplication.run(PasswordStorageApplication.class, args); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java b/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java new file mode 100644 index 0000000000..22ef2f0835 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java @@ -0,0 +1,53 @@ +package com.baeldung.passwordstorage; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.DelegatingPasswordEncoder; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.crypto.password.StandardPasswordEncoder; +import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class PasswordStorageWebSecurityConfigurer extends WebSecurityConfigurerAdapter { + + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.eraseCredentials(false) // 4 + .userDetailsService(getUserDefaultDetailsService()) + .passwordEncoder(passwordEncoder()); + } + + @Bean + public UserDetailsService getUserDefaultDetailsService() { + User testUser = new User("baeldung", "{noop}SpringSecurity5", Collections.emptyList()); + return new InMemoryUserDetailsManager(testUser); + } + + @Bean + public PasswordEncoder passwordEncoder() { + // set up the list of supported encoders and their prefixes + PasswordEncoder defaultEncoder = new StandardPasswordEncoder(); + Map encoders = new HashMap<>(); + encoders.put("bcrypt", new BCryptPasswordEncoder()); + encoders.put("scrypt", new SCryptPasswordEncoder()); + encoders.put("noop", NoOpPasswordEncoder.getInstance()); + + DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder("bcrypt", encoders); + passwordEncoder.setDefaultPasswordEncoderForMatches(defaultEncoder); + + return passwordEncoder; + } + +} diff --git a/spring-5-security/src/main/resources/application-extrafields.properties b/spring-5-security/src/main/resources/application-extrafields.properties new file mode 100644 index 0000000000..ab4134ce3e --- /dev/null +++ b/spring-5-security/src/main/resources/application-extrafields.properties @@ -0,0 +1 @@ +spring.thymeleaf.prefix = classpath:/templatesextrafields/ \ No newline at end of file diff --git a/spring-5-security/src/main/resources/application-oauth2.properties b/spring-5-security/src/main/resources/application-oauth2.properties new file mode 100644 index 0000000000..5365bf8542 --- /dev/null +++ b/spring-5-security/src/main/resources/application-oauth2.properties @@ -0,0 +1,5 @@ +spring.security.oauth2.client.registration.google.client-id=368238083842-3d4gc7p54rs6bponn0qhn4nmf6apf24a.apps.googleusercontent.com +spring.security.oauth2.client.registration.google.client-secret=2RM2QkEaf3A8-iCNqSfdG8wP + +spring.security.oauth2.client.registration.facebook.client-id=151640435578187 +spring.security.oauth2.client.registration.facebook.client-secret=3724fb293d401245b1ce7b2d70e97571 \ No newline at end of file diff --git a/spring-5-security/src/main/resources/application.properties b/spring-5-security/src/main/resources/application.properties new file mode 100644 index 0000000000..781ee76826 --- /dev/null +++ b/spring-5-security/src/main/resources/application.properties @@ -0,0 +1,5 @@ +server.port=8081 + +logging.level.root=INFO + +logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG diff --git a/spring-5-security/src/main/resources/static/css/main.css b/spring-5-security/src/main/resources/static/css/main.css new file mode 100644 index 0000000000..febc353af7 --- /dev/null +++ b/spring-5-security/src/main/resources/static/css/main.css @@ -0,0 +1,8 @@ +p.error { + font-weight: bold; + color: red; +} + +div.logout { + margin-right: 2em;; +} diff --git a/spring-5-security/src/main/resources/templates/index.html b/spring-5-security/src/main/resources/templates/index.html new file mode 100644 index 0000000000..4216d74037 --- /dev/null +++ b/spring-5-security/src/main/resources/templates/index.html @@ -0,0 +1,11 @@ + + + + Home + + + + Home + Welcome! + + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templates/loginFailure.html b/spring-5-security/src/main/resources/templates/loginFailure.html new file mode 100644 index 0000000000..75007a9aec --- /dev/null +++ b/spring-5-security/src/main/resources/templates/loginFailure.html @@ -0,0 +1,10 @@ + + + + Login Failure + + + + Login Failure + + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templates/loginSuccess.html b/spring-5-security/src/main/resources/templates/loginSuccess.html new file mode 100644 index 0000000000..3923297d03 --- /dev/null +++ b/spring-5-security/src/main/resources/templates/loginSuccess.html @@ -0,0 +1,16 @@ + + + + Login Success + + + + +

+
+ Welcome, user! +
+

+ + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templates/oauth_login.html b/spring-5-security/src/main/resources/templates/oauth_login.html new file mode 100644 index 0000000000..7017d2a75c --- /dev/null +++ b/spring-5-security/src/main/resources/templates/oauth_login.html @@ -0,0 +1,22 @@ + + + + +Oauth2 Login + + + + +
+
+

Login with:

+
+

+ Client +

+
+
+
+ + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templates/securedPage.html b/spring-5-security/src/main/resources/templates/securedPage.html new file mode 100644 index 0000000000..8fb5986a36 --- /dev/null +++ b/spring-5-security/src/main/resources/templates/securedPage.html @@ -0,0 +1,10 @@ + + + + +Secured Page + + +Secured Page - Welcome + + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templatesextrafields/index.html b/spring-5-security/src/main/resources/templatesextrafields/index.html new file mode 100644 index 0000000000..37833ff0d2 --- /dev/null +++ b/spring-5-security/src/main/resources/templatesextrafields/index.html @@ -0,0 +1,32 @@ + + + + Spring Security with Extra Fields + + + + + + + + + +
+
+

Logged in: | Some Domain +

+
+
+ +
+
+
+ +

Hello Spring Security

+

This is an unsecured page, but you can access the secured pages after authenticating.

+ +
+ + diff --git a/spring-5-security/src/main/resources/templatesextrafields/login.html b/spring-5-security/src/main/resources/templatesextrafields/login.html new file mode 100644 index 0000000000..5c51ea3b2c --- /dev/null +++ b/spring-5-security/src/main/resources/templatesextrafields/login.html @@ -0,0 +1,36 @@ + + + + Login page + + + + + + + + + +
+ +
+ + diff --git a/spring-5-security/src/main/resources/templatesextrafields/user/index.html b/spring-5-security/src/main/resources/templatesextrafields/user/index.html new file mode 100644 index 0000000000..9c41f0e78c --- /dev/null +++ b/spring-5-security/src/main/resources/templatesextrafields/user/index.html @@ -0,0 +1,20 @@ + + + + Secured Page + + + + + + + + + +
+
+

This is a secured page!

+

Back to home page

+
+ + diff --git a/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsTest.java b/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsTest.java new file mode 100644 index 0000000000..30b869714f --- /dev/null +++ b/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsTest.java @@ -0,0 +1,46 @@ +package com.baeldung.loginextrafields; + +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.web.FilterChainProxy; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +public abstract class AbstractExtraLoginFieldsTest { + + @Autowired + private FilterChainProxy springSecurityFilterChain; + + @Autowired + private WebApplicationContext wac; + + protected MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(wac) + .apply(springSecurity(springSecurityFilterChain)) + .build(); + } + + @Test + public void givenRootPathAccess_thenRedirectToIndex() throws Exception { + this.mockMvc.perform(get("/")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("/index*")); + } + + @Test + public void givenSecuredResource_whenAccessUnauthenticated_thenRequiresAuthentication() throws Exception { + this.mockMvc.perform(get("/user/index")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/login")); + } +} diff --git a/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullTest.java b/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullTest.java new file mode 100644 index 0000000000..38c219cb5e --- /dev/null +++ b/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullTest.java @@ -0,0 +1,72 @@ +package com.baeldung.loginextrafields; + +import static org.junit.Assert.assertEquals; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import com.baeldung.loginextrafieldscustom.ExtraLoginFieldsApplication; +import com.baeldung.loginextrafieldscustom.User; + +@RunWith(SpringRunner.class) +@SpringJUnitWebConfig +@SpringBootTest(classes = ExtraLoginFieldsApplication.class) +public class LoginFieldsFullTest extends AbstractExtraLoginFieldsTest { + + @Test + public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { + MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); + MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() + .getSession(); + String loginUrl = unauthenticatedResult.getResponse() + .getRedirectedUrl(); + + User user = getUser(); + + mockMvc.perform(post(loginUrl) + .param("username", user.getUsername()) + .param("password", user.getPassword()) + .param("domain", user.getDomain()) + .session(session) + .with(csrf())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/user/index")) + .andReturn(); + + mockMvc.perform(securedResourceAccess.session(session)) + .andExpect(status().isOk()); + + SecurityContext securityContext + = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + Authentication auth = securityContext.getAuthentication(); + assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); + } + + private User getUser() { + Collection authorities = new ArrayList<>(); + return new User("myusername", "mydomain", "password", true, true, true, true, authorities); + } + +} diff --git a/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleTest.java b/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleTest.java new file mode 100644 index 0000000000..5c0d462772 --- /dev/null +++ b/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleTest.java @@ -0,0 +1,72 @@ +package com.baeldung.loginextrafields; + +import static org.junit.Assert.assertEquals; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import com.baeldung.loginextrafieldssimple.ExtraLoginFieldsApplication; +import com.baeldung.loginextrafieldssimple.User; + +@RunWith(SpringRunner.class) +@SpringJUnitWebConfig +@SpringBootTest(classes = ExtraLoginFieldsApplication.class) +public class LoginFieldsSimpleTest extends AbstractExtraLoginFieldsTest { + + @Test + public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { + MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); + MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() + .getSession(); + String loginUrl = unauthenticatedResult.getResponse() + .getRedirectedUrl(); + + User user = getUser(); + + mockMvc.perform(post(loginUrl) + .param("username", user.getUsername()) + .param("password", user.getPassword()) + .param("domain", user.getDomain()) + .session(session) + .with(csrf())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/user/index")) + .andReturn(); + + mockMvc.perform(securedResourceAccess.session(session)) + .andExpect(status().isOk()); + + SecurityContext securityContext + = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + Authentication auth = securityContext.getAuthentication(); + assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); + } + + private User getUser() { + Collection authorities = new ArrayList<>(); + return new User("myusername", "mydomain", "password", true, true, true, true, authorities); + } + +} diff --git a/spring-5/README.md b/spring-5/README.md index 15e12cb5dc..1ac3cf4577 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -10,4 +10,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Exploring the Spring 5 MVC URL Matching Improvements](http://www.baeldung.com/spring-5-mvc-url-matching) - [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) - [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) - +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) +- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) +- [Spring 5 Testing with @EnabledIf Annotation](http://www.baeldung.com/sring-5-enabledif) +- [Introduction to Spring REST Docs](http://www.baeldung.com/spring-rest-docs) +- [Spring Security 5 – OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 4dfede4dab..f8bad72c51 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.M3 + 2.0.0.RELEASE @@ -39,6 +39,10 @@ org.springframework.boot spring-boot-starter-webflux + + org.springframework.boot + spring-boot-starter-hateoas + org.projectreactor reactor-spring @@ -47,8 +51,19 @@ javax.json.bind javax.json.bind-api - ${jsonb-api.version} + + + + + + + + + + + + org.apache.geronimo.specs geronimo-json_1.1_spec @@ -57,7 +72,6 @@ org.apache.johnzon johnzon-jsonb - ${johnzon.version} @@ -87,16 +101,26 @@ spring-boot-starter-test test + + org.springframework.security + spring-security-test + test + + + + org.apache.commons + commons-collections4 + 4.1 + test + org.junit.jupiter junit-jupiter-api - ${junit.jupiter.version} org.junit.jupiter junit-jupiter-engine - ${junit.jupiter.version} test @@ -111,6 +135,23 @@ ${junit.platform.version} test + + + org.springframework.restdocs + spring-restdocs-mockmvc + test + + + org.springframework.restdocs + spring-restdocs-webtestclient + test + + + org.springframework.restdocs + spring-restdocs-restassured + test + +
@@ -139,42 +180,43 @@ + + org.asciidoctor + asciidoctor-maven-plugin + ${asciidoctor-plugin.version} + + + generate-docs + package + + process-asciidoc + + + html + book + + ${snippetsDirectory} + + src/docs/asciidocs + target/generated-docs + + + +
- - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - UTF-8 UTF-8 1.8 1.0.0 - 5.0.0 2.20 - 5.0.0.RELEASE + 5.0.2.RELEASE 1.0.1.RELEASE - 1.1.3 - 1.0 1.0 + 1.5.6 + ${project.build.directory}/generated-snippets diff --git a/spring-rest-docs/src/docs/asciidocs/api-guide.adoc b/spring-5/src/docs/asciidocs/api-guide.adoc similarity index 82% rename from spring-rest-docs/src/docs/asciidocs/api-guide.adoc rename to spring-5/src/docs/asciidocs/api-guide.adoc index 9fbe74c072..6eadfb5efd 100644 --- a/spring-rest-docs/src/docs/asciidocs/api-guide.adoc +++ b/spring-5/src/docs/asciidocs/api-guide.adoc @@ -55,13 +55,6 @@ use of HTTP status codes. | The requested resource did not exist |=== -[[overview-headers]] -== Headers - -Every response has the following header(s): - -include::{snippets}/headers-example/response-headers.adoc[] - [[overview-hypermedia]] == Hypermedia @@ -86,18 +79,14 @@ The index provides the entry point into the service. A `GET` request is used to access the index -==== Response structure +==== Request structure -include::{snippets}/index-example/http-response.adoc[] +include::{snippets}/index-example/http-request.adoc[] ==== Example response include::{snippets}/index-example/http-response.adoc[] -==== Example request - -include::{snippets}/index-example/http-request.adoc[] - ==== CURL request include::{snippets}/index-example/curl-request.adoc[] @@ -113,12 +102,12 @@ include::{snippets}/index-example/links.adoc[] The CRUD provides the entry point into the service. -[[resources-crud-access]] +[[resources-crud-get]] === Accessing the crud GET -A `GET` request is used to access the CRUD read +A `GET` request is used to access the CRUD read. -==== Response structure +==== Request structure include::{snippets}/crud-get-example/http-request.adoc[] @@ -130,12 +119,12 @@ include::{snippets}/crud-get-example/http-response.adoc[] include::{snippets}/crud-get-example/curl-request.adoc[] -[[resources-crud-access]] +[[resources-crud-post]] === Accessing the crud POST -A `POST` request is used to access the CRUD create +A `POST` request is used to access the CRUD create. -==== Response structure +==== Request structure include::{snippets}/crud-create-example/http-request.adoc[] @@ -147,15 +136,18 @@ include::{snippets}/crud-create-example/http-response.adoc[] include::{snippets}/crud-create-example/curl-request.adoc[] -[[resources-crud-access]] +[[resources-crud-delete]] === Accessing the crud DELETE -A `DELETE` request is used to access the CRUD create +A `DELETE` request is used to access the CRUD delete. -==== Response structure +==== Request structure include::{snippets}/crud-delete-example/http-request.adoc[] +==== Path Parameters +include::{snippets}/crud-delete-example/path-parameters.adoc[] + ==== Example response include::{snippets}/crud-delete-example/http-response.adoc[] @@ -164,12 +156,12 @@ include::{snippets}/crud-delete-example/http-response.adoc[] include::{snippets}/crud-delete-example/curl-request.adoc[] -[[resources-crud-access]] +[[resources-crud-patch]] === Accessing the crud PATCH -A `PATCH` request is used to access the CRUD create +A `PATCH` request is used to access the CRUD update. -==== Response structure +==== Request structure include::{snippets}/crud-patch-example/http-request.adoc[] @@ -181,12 +173,12 @@ include::{snippets}/crud-patch-example/http-response.adoc[] include::{snippets}/crud-patch-example/curl-request.adoc[] -[[resources-crud-access]] +[[resources-crud-put]] === Accessing the crud PUT -A `PUT` request is used to access the CRUD create +A `PUT` request is used to access the CRUD update. -==== Response structure +==== Request structure include::{snippets}/crud-put-example/http-request.adoc[] diff --git a/spring-5/src/main/java/com/baeldung/SpringSecurity5Application.java b/spring-5/src/main/java/com/baeldung/SpringSecurity5Application.java new file mode 100644 index 0000000000..02c91a1879 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/SpringSecurity5Application.java @@ -0,0 +1,34 @@ +package com.baeldung; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; +import reactor.ipc.netty.NettyContext; +import reactor.ipc.netty.http.server.HttpServer; + +@ComponentScan(basePackages = {"com.baeldung.security"}) +@EnableWebFlux +public class SpringSecurity5Application { + + public static void main(String[] args) { + try (AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) { + context.getBean(NettyContext.class).onClose().block(); + } + } + + @Bean + public NettyContext nettyContext(ApplicationContext context) { + HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context) + .build(); + ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); + HttpServer httpServer = HttpServer.create("localhost", 8080); + return httpServer.newHandler(adapter).block(); + } + +} diff --git a/spring-5/src/main/java/com/baeldung/execption/ActorController.java b/spring-5/src/main/java/com/baeldung/execption/ActorController.java new file mode 100644 index 0000000000..6c9c46253a --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/execption/ActorController.java @@ -0,0 +1,41 @@ +package com.baeldung.execption; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.server.ResponseStatusException; + +@RestController +public class ActorController { + + @Autowired + ActorService actorService; + + @GetMapping("/actor/{id}") + public String getActorName(@PathVariable("id") int id) { + try { + return actorService.getActor(id); + } catch (ActorNotFoundException ex) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Actor Not Found", ex); + } + } + + @DeleteMapping("/actor/{id}") + public String getActor(@PathVariable("id") int id) { + return actorService.removeActor(id); + } + + @PutMapping("/actor/{id}/{name}") + public String updateActorName(@PathVariable("id") int id, @PathVariable("name") String name) { + try { + return actorService.updateActor(id, name); + } catch (ActorNotFoundException ex) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Provide correct Actor Id", ex); + } + } + +} diff --git a/spring-5/src/main/java/com/baeldung/execption/ActorNotFoundException.java b/spring-5/src/main/java/com/baeldung/execption/ActorNotFoundException.java new file mode 100644 index 0000000000..642c075b5d --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/execption/ActorNotFoundException.java @@ -0,0 +1,13 @@ +package com.baeldung.execption; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Actor Not Found") +public class ActorNotFoundException extends Exception { + private static final long serialVersionUID = 1L; + + public ActorNotFoundException(String errorMessage) { + super(errorMessage); + } +} diff --git a/spring-5/src/main/java/com/baeldung/execption/ActorService.java b/spring-5/src/main/java/com/baeldung/execption/ActorService.java new file mode 100644 index 0000000000..956fa92015 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/execption/ActorService.java @@ -0,0 +1,35 @@ +package com.baeldung.execption; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +@Service +public class ActorService { + List actors = Arrays.asList("Jack Nicholson", "Marlon Brando", "Robert De Niro", "Al Pacino", "Tom Hanks"); + + public String getActor(int index) throws ActorNotFoundException { + if (index >= actors.size()) { + throw new ActorNotFoundException("Actor Not Found in Repsoitory"); + } + return actors.get(index); + } + + public String updateActor(int index, String actorName) throws ActorNotFoundException { + if (index >= actors.size()) { + throw new ActorNotFoundException("Actor Not Found in Repsoitory"); + } + actors.set(index, actorName); + return actorName; + } + + public String removeActor(int index) { + if (index >= actors.size()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Actor Not Found in Repsoitory"); + } + return actors.remove(index); + } +} diff --git a/spring-5/src/main/java/com/baeldung/execption/SpringExceptionApplication.java b/spring-5/src/main/java/com/baeldung/execption/SpringExceptionApplication.java new file mode 100644 index 0000000000..1670da54c3 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/execption/SpringExceptionApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.execption; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication(exclude = SecurityAutoConfiguration.class) +@ComponentScan(basePackages = { "com.baeldung.execption" }) +public class SpringExceptionApplication { + public static void main(String[] args) { + SpringApplication.run(SpringExceptionApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-rest-docs/src/main/java/com/example/CRUDController.java b/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java similarity index 52% rename from spring-rest-docs/src/main/java/com/example/CRUDController.java rename to spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java index ff8c91d6cd..429d3f433a 100644 --- a/spring-rest-docs/src/main/java/com/example/CRUDController.java +++ b/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java @@ -1,16 +1,22 @@ -package com.example; +package com.baeldung.restdocs; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import java.util.ArrayList; import java.util.List; +import javax.validation.Valid; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @@ -18,38 +24,38 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/crud") public class CRUDController { - @RequestMapping(method = RequestMethod.GET) - @ResponseStatus(HttpStatus.OK) - public List read(@RequestBody CrudInput crudInput) { - List returnList = new ArrayList(); + @GetMapping + public List read(@RequestBody @Valid CrudInput crudInput) { + List returnList = new ArrayList<>(); returnList.add(crudInput); return returnList; } @ResponseStatus(HttpStatus.CREATED) - @RequestMapping(method = RequestMethod.POST) - public HttpHeaders save(@RequestBody CrudInput crudInput) { + @PostMapping + public HttpHeaders save(@RequestBody @Valid CrudInput crudInput) { HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.setLocation(linkTo(CRUDController.class).slash(crudInput.getTitle()).toUri()); + httpHeaders.setLocation(linkTo(CRUDController.class).slash(crudInput.getId()).toUri()); return httpHeaders; } - @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) + @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) - HttpHeaders delete(@RequestBody CrudInput crudInput) { - HttpHeaders httpHeaders = new HttpHeaders(); - return httpHeaders; + HttpHeaders delete(@PathVariable("id") long id) { + return new HttpHeaders(); } - @RequestMapping(value = "/{id}", method = RequestMethod.PUT) + @PutMapping("/{id}") @ResponseStatus(HttpStatus.ACCEPTED) void put(@PathVariable("id") long id, @RequestBody CrudInput crudInput) { } - @RequestMapping(value = "/{id}", method = RequestMethod.PATCH) - @ResponseStatus(HttpStatus.NO_CONTENT) - void patch(@PathVariable("id") long id, @RequestBody CrudInput crudInput) { - + @PatchMapping("/{id}") + public List patch(@PathVariable("id") long id, @RequestBody CrudInput crudInput) { + List returnList = new ArrayList(); + crudInput.setId(id); + returnList.add(crudInput); + return returnList; } } diff --git a/spring-5/src/main/java/com/baeldung/restdocs/CrudInput.java b/spring-5/src/main/java/com/baeldung/restdocs/CrudInput.java new file mode 100644 index 0000000000..29046d7725 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/restdocs/CrudInput.java @@ -0,0 +1,66 @@ +package com.baeldung.restdocs; + +import java.net.URI; +import java.util.Collections; +import java.util.List; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CrudInput { + + @NotNull + private long id; + + @NotBlank + private String title; + + private String body; + + private List tagUris; + + @JsonCreator + public CrudInput(@JsonProperty("id") long id, @JsonProperty("title") String title, @JsonProperty("body") String body, @JsonProperty("tags") List tagUris) { + this.id=id; + this.title = title; + this.body = body; + this.tagUris = tagUris == null ? Collections. emptyList() : tagUris; + } + + public String getTitle() { + return title; + } + + public String getBody() { + return body; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setBody(String body) { + this.body = body; + } + + public void setTagUris(List tagUris) { + this.tagUris = tagUris; + } + + @JsonProperty("tags") + public List getTagUris() { + return this.tagUris; + } + +} \ No newline at end of file diff --git a/spring-rest-docs/src/main/java/com/example/IndexController.java b/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java similarity index 79% rename from spring-rest-docs/src/main/java/com/example/IndexController.java rename to spring-5/src/main/java/com/baeldung/restdocs/IndexController.java index 6b896da416..2c58d5fe6b 100644 --- a/spring-rest-docs/src/main/java/com/example/IndexController.java +++ b/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java @@ -1,17 +1,17 @@ -package com.example; +package com.baeldung.restdocs; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import org.springframework.hateoas.ResourceSupport; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/") public class IndexController { - @RequestMapping(method = RequestMethod.GET) + @GetMapping public ResourceSupport index() { ResourceSupport index = new ResourceSupport(); index.add(linkTo(CRUDController.class).withRel("crud")); diff --git a/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java b/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java similarity index 90% rename from spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java rename to spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java index da09f9accc..02332ee7b6 100644 --- a/spring-rest-docs/src/main/java/com/example/SpringRestDocsApplication.java +++ b/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java @@ -1,4 +1,4 @@ -package com.example; +package com.baeldung.restdocs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-5/src/main/java/com/baeldung/security/GreetController.java b/spring-5/src/main/java/com/baeldung/security/GreetController.java new file mode 100644 index 0000000000..6b69e3bc9b --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/security/GreetController.java @@ -0,0 +1,37 @@ +package com.baeldung.security; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +import java.security.Principal; + +@RestController +public class GreetController { + + private GreetService greetService; + + public GreetController(GreetService greetService) { + this.greetService = greetService; + } + + @GetMapping("/") + public Mono greet(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Hello, %s", name)); + } + + @GetMapping("/admin") + public Mono greetAdmin(Mono principal) { + return principal + .map(Principal::getName) + .map(name -> String.format("Admin access: %s", name)); + } + + @GetMapping("/greetService") + public Mono greetService() { + return greetService.greet(); + } + +} diff --git a/spring-5/src/main/java/com/baeldung/security/GreetService.java b/spring-5/src/main/java/com/baeldung/security/GreetService.java new file mode 100644 index 0000000000..7622b360be --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/security/GreetService.java @@ -0,0 +1,15 @@ +package com.baeldung.security; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@Service +public class GreetService { + + @PreAuthorize("hasRole('ADMIN')") + public Mono greet() { + return Mono.just("Hello from service!"); + } + +} diff --git a/spring-5/src/main/java/com/baeldung/security/SecurityConfig.java b/spring-5/src/main/java/com/baeldung/security/SecurityConfig.java new file mode 100644 index 0000000000..a9e44a2eee --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/security/SecurityConfig.java @@ -0,0 +1,42 @@ +package com.baeldung.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.server.SecurityWebFilterChain; + +@EnableWebFluxSecurity +@EnableReactiveMethodSecurity +public class SecurityConfig { + + @Bean + public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) { + return http.authorizeExchange() + .pathMatchers("/admin").hasAuthority("ROLE_ADMIN") + .anyExchange().authenticated() + .and().formLogin() + .and().build(); + } + + @Bean + public MapReactiveUserDetailsService userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("password") + .roles("USER") + .build(); + + UserDetails admin = User.withDefaultPasswordEncoder() + .username("admin") + .password("password") + .roles("ADMIN") + .build(); + + return new MapReactiveUserDetailsService(user, admin); + } + +} diff --git a/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java b/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java index a218c6b7cf..a719259328 100644 --- a/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java +++ b/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java @@ -3,9 +3,7 @@ package com.baeldung.web.reactive.client; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.springframework.http.*; -import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @@ -50,7 +48,7 @@ public class WebClientController { map.add("key1", "value1"); map.add("key2", "value2"); - BodyInserter, ClientHttpRequest> inserter2 = BodyInserters.fromMultipartData(map); + // BodyInserter, ClientHttpRequest> inserter2 = BodyInserters.fromMultipartData(map); BodyInserter inserter3 = BodyInserters.fromObject("body"); // responses diff --git a/spring-5/src/main/resources/application.properties b/spring-5/src/main/resources/application.properties index 886ea1978b..ccec014c2b 100644 --- a/spring-5/src/main/resources/application.properties +++ b/spring-5/src/main/resources/application.properties @@ -1,6 +1,3 @@ server.port=8081 -security.user.name=user -security.user.password=pass - logging.level.root=INFO \ No newline at end of file diff --git a/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationTest.java b/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java similarity index 96% rename from spring-5/src/test/java/com/baeldung/functional/BeanRegistrationTest.java rename to spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java index 0b1542dbbc..5392a59343 100644 --- a/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationTest.java +++ b/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java @@ -13,7 +13,7 @@ import com.baeldung.Spring5Application; @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5Application.class) -public class BeanRegistrationTest { +public class BeanRegistrationIntegrationTest { @Autowired private GenericWebApplicationContext context; diff --git a/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java b/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java deleted file mode 100644 index 4caab86f7d..0000000000 --- a/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.jsonb; - -import static org.junit.Assert.assertTrue; - -import java.math.BigDecimal; -import java.time.LocalDate; - -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; - -import org.junit.Before; -import org.junit.Test; - -public class JsonbTest { - - private Jsonb jsonb; - - @Before - public void setup() { - jsonb = JsonbBuilder.create(); - } - - @Test - public void givenPersonObject_whenSerializeWithJsonb_thenGetPersonJson() { - Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); - String jsonPerson = jsonb.toJson(person); - assertTrue("{\"email\":\"jhon@test.com\",\"id\":1,\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}".equals(jsonPerson)); - } - - @Test - public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() { - Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0)); - String jsonPerson = "{\"email\":\"jhon@test.com\",\"id\":1,\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}"; - assertTrue(jsonb.fromJson(jsonPerson, Person.class) - .equals(person)); - } - -} diff --git a/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java b/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java new file mode 100644 index 0000000000..c6d3b7ff10 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/jupiter/EnabledOnJava8.java @@ -0,0 +1,18 @@ +package com.baeldung.jupiter; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.test.context.junit.jupiter.EnabledIf; + +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@EnabledIf( + expression = "#{systemProperties['java.version'].startsWith('1.8')}", + reason = "Enabled on Java 8" +) +public @interface EnabledOnJava8 { + +} diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java new file mode 100644 index 0000000000..ae058bc8ba --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5EnabledAnnotationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.jupiter; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.DisabledIf; +import org.springframework.test.context.junit.jupiter.EnabledIf; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +@SpringJUnitConfig(Spring5EnabledAnnotationTest.Config.class) +@TestPropertySource(properties = { "tests.enabled=true" }) +public class Spring5EnabledAnnotationTest { + + @Configuration + static class Config { + } + + @EnabledIf("true") + @Test + void givenEnabledIfLiteral_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledIf(expression = "${tests.enabled}", loadContext = true) + @Test + void givenEnabledIfExpression_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledIf("#{systemProperties['java.version'].startsWith('1.8')}") + @Test + void givenEnabledIfSpel_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @EnabledOnJava8 + @Test + void givenEnabledOnJava8_WhenTrue_ThenTestExecuted() { + assertTrue(true); + } + + @DisabledIf("#{systemProperties['java.version'].startsWith('1.7')}") + @Test + void givenDisabledIf_WhenTrue_ThenTestNotExecuted() { + assertTrue(true); + } + +} diff --git a/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java b/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java new file mode 100644 index 0000000000..6b0a6f9808 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitConfigTest.java @@ -0,0 +1,33 @@ +package com.baeldung.jupiter; + +import static org.junit.Assert.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +/** + * @SpringJUnitConfig(SpringJUnitConfigTest.Config.class) is equivalent to: + * + * @ExtendWith(SpringExtension.class) + * @ContextConfiguration(classes = SpringJUnitConfigTest.Config.class ) + * + */ +@SpringJUnitConfig(SpringJUnitConfigTest.Config.class) +public class SpringJUnitConfigTest { + + @Configuration + static class Config { + } + + @Autowired + private ApplicationContext applicationContext; + + @Test + void givenAppContext_WhenInjected_ThenItShouldNotBeNull() { + assertNotNull(applicationContext); + } + +} diff --git a/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java b/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java new file mode 100644 index 0000000000..c679dce77f --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/jupiter/SpringJUnitWebConfigTest.java @@ -0,0 +1,34 @@ +package com.baeldung.jupiter; + +import static org.junit.Assert.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.web.context.WebApplicationContext; + +/** + * @SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) is equivalent to: + * + * @ExtendWith(SpringExtension.class) + * @WebAppConfiguration + * @ContextConfiguration(classes = SpringJUnitWebConfigTest.Config.class ) + * + */ +@SpringJUnitWebConfig(SpringJUnitWebConfigTest.Config.class) +public class SpringJUnitWebConfigTest { + + @Configuration + static class Config { + } + + @Autowired + private WebApplicationContext webAppContext; + + @Test + void givenWebAppContext_WhenInjected_ThenItShouldNotBeNull() { + assertNotNull(webAppContext); + } + +} diff --git a/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit4IntegrationTest.java b/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit4IntegrationTest.java new file mode 100644 index 0000000000..20f0a47d83 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit4IntegrationTest.java @@ -0,0 +1,180 @@ +package com.baeldung.restdocs; + +import com.baeldung.restdocs.CrudInput; +import com.baeldung.restdocs.SpringRestDocsApplication; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.hateoas.MediaTypes; +import org.springframework.restdocs.JUnitRestDocumentation; +import org.springframework.restdocs.constraints.ConstraintDescriptions; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.util.HashMap; +import java.util.Map; + +import static java.util.Collections.singletonList; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; +import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel; +import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.util.StringUtils.collectionToDelimitedString; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = SpringRestDocsApplication.class) +public class ApiDocumentationJUnit4IntegrationTest { + + @Rule + public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("target/generated-snippets"); + + @Autowired + private WebApplicationContext context; + + @Autowired + private ObjectMapper objectMapper; + + private MockMvc mockMvc; + + @Before + public void setUp() { + + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) + .apply(documentationConfiguration(this.restDocumentation)) + .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))) + .build(); + } + + @Test + public void indexExample() throws Exception { + this.mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andDo(document("index-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), links(linkWithRel("crud").description("The CRUD resource")), responseFields(subsectionWithPath("_links").description("Links to other resources")), + responseHeaders(headerWithName("Content-Type").description("The Content-Type of the payload, e.g. `application/hal+json`")))); + } + + @Test + public void crudGetExample() throws Exception { + + Map crud = new HashMap<>(); + crud.put("id", 1L); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + + String tagLocation = this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getHeader("Location"); + + crud.put("tags", singletonList(tagLocation)); + + ConstraintDescriptions desc = new ConstraintDescriptions(CrudInput.class); + + this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()) + .andDo(document("crud-get-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields(fieldWithPath("id").description("The id of the input" + collectionToDelimitedString(desc.descriptionsForProperty("id"), ". ")), + fieldWithPath("title").description("The title of the input"), fieldWithPath("body").description("The body of the input"), fieldWithPath("tags").description("An array of tag resource URIs")))); + } + + @Test + public void crudCreateExample() throws Exception { + Map crud = new HashMap<>(); + crud.put("id", 2L); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + + String tagLocation = this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isCreated()) + .andReturn() + .getResponse() + .getHeader("Location"); + + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isCreated()) + .andDo(document("crud-create-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields(fieldWithPath("id").description("The id of the input"), fieldWithPath("title").description("The title of the input"), + fieldWithPath("body").description("The body of the input"), fieldWithPath("tags").description("An array of tag resource URIs")))); + } + + @Test + public void crudDeleteExample() throws Exception { + this.mockMvc.perform(delete("/crud/{id}", 10)) + .andExpect(status().isOk()) + .andDo(document("crud-delete-example", pathParameters(parameterWithName("id").description("The id of the input to delete")))); + } + + @Test + public void crudPatchExample() throws Exception { + + Map tag = new HashMap<>(); + tag.put("name", "PATCH"); + + String tagLocation = this.mockMvc.perform(patch("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(tag))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getHeader("Location"); + + Map crud = new HashMap<>(); + crud.put("title", "Sample Model Patch"); + crud.put("body", "http://www.baeldung.com/"); + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(patch("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()); + } + + @Test + public void crudPutExample() throws Exception { + Map tag = new HashMap<>(); + tag.put("name", "PUT"); + + String tagLocation = this.mockMvc.perform(put("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(tag))) + .andExpect(status().isAccepted()) + .andReturn() + .getResponse() + .getHeader("Location"); + + Map crud = new HashMap<>(); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(put("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isAccepted()); + } + + @Test + public void contextLoads() { + } + +} diff --git a/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit5IntegrationTest.java b/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit5IntegrationTest.java new file mode 100644 index 0000000000..748d5fb1b3 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/restdocs/ApiDocumentationJUnit5IntegrationTest.java @@ -0,0 +1,173 @@ +package com.baeldung.restdocs; + +import static java.util.Collections.singletonList; +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; +import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel; +import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.util.StringUtils.collectionToDelimitedString; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.hateoas.MediaTypes; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.constraints.ConstraintDescriptions; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.restdocs.CrudInput; +import com.baeldung.restdocs.SpringRestDocsApplication; +import com.fasterxml.jackson.databind.ObjectMapper; + +@ExtendWith({ RestDocumentationExtension.class, SpringExtension.class }) +@SpringBootTest(classes = SpringRestDocsApplication.class) +public class ApiDocumentationJUnit5IntegrationTest { + + @Autowired + private ObjectMapper objectMapper; + + private MockMvc mockMvc; + + @BeforeEach + public void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) + .apply(documentationConfiguration(restDocumentation)) + .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))) + .build(); + } + + @Test + public void indexExample() throws Exception { + this.mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andDo(document("index-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), links(linkWithRel("crud").description("The CRUD resource")), responseFields(subsectionWithPath("_links").description("Links to other resources")), + responseHeaders(headerWithName("Content-Type").description("The Content-Type of the payload, e.g. `application/hal+json`")))); + } + + @Test + public void crudGetExample() throws Exception { + + Map crud = new HashMap<>(); + crud.put("id", 1L); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + + String tagLocation = this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getHeader("Location"); + + crud.put("tags", singletonList(tagLocation)); + + ConstraintDescriptions desc = new ConstraintDescriptions(CrudInput.class); + + this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()) + .andDo(document("crud-get-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields(fieldWithPath("id").description("The id of the input" + collectionToDelimitedString(desc.descriptionsForProperty("id"), ". ")), + fieldWithPath("title").description("The title of the input"), fieldWithPath("body").description("The body of the input"), fieldWithPath("tags").description("An array of tag resource URIs")))); + } + + @Test + public void crudCreateExample() throws Exception { + Map crud = new HashMap<>(); + crud.put("id", 2L); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + + String tagLocation = this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isCreated()) + .andReturn() + .getResponse() + .getHeader("Location"); + + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isCreated()) + .andDo(document("crud-create-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestFields(fieldWithPath("id").description("The id of the input"), fieldWithPath("title").description("The title of the input"), + fieldWithPath("body").description("The body of the input"), fieldWithPath("tags").description("An array of tag resource URIs")))); + } + + @Test + public void crudDeleteExample() throws Exception { + this.mockMvc.perform(delete("/crud/{id}", 10)) + .andExpect(status().isOk()) + .andDo(document("crud-delete-example", pathParameters(parameterWithName("id").description("The id of the input to delete")))); + } + + @Test + public void crudPatchExample() throws Exception { + + Map tag = new HashMap<>(); + tag.put("name", "PATCH"); + + String tagLocation = this.mockMvc.perform(patch("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(tag))) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getHeader("Location"); + + Map crud = new HashMap<>(); + crud.put("title", "Sample Model Patch"); + crud.put("body", "http://www.baeldung.com/"); + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(patch("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isOk()); + } + + @Test + public void crudPutExample() throws Exception { + Map tag = new HashMap<>(); + tag.put("name", "PUT"); + + String tagLocation = this.mockMvc.perform(put("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(tag))) + .andExpect(status().isAccepted()) + .andReturn() + .getResponse() + .getHeader("Location"); + + Map crud = new HashMap<>(); + crud.put("title", "Sample Model"); + crud.put("body", "http://www.baeldung.com/"); + crud.put("tags", singletonList(tagLocation)); + + this.mockMvc.perform(put("/crud/{id}", 10).contentType(MediaTypes.HAL_JSON) + .content(this.objectMapper.writeValueAsString(crud))) + .andExpect(status().isAccepted()); + } + + @Test + public void contextLoads() { + } + +} diff --git a/spring-5/src/test/java/com/baeldung/security/SecurityIntegrationTest.java b/spring-5/src/test/java/com/baeldung/security/SecurityIntegrationTest.java new file mode 100644 index 0000000000..5680625496 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/security/SecurityIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung.security; + +import com.baeldung.SpringSecurity5Application; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = SpringSecurity5Application.class) +public class SecurityIntegrationTest { + + @Autowired + ApplicationContext context; + + private WebTestClient rest; + + @Before + public void setup() { + this.rest = WebTestClient.bindToApplicationContext(this.context).configureClient().build(); + } + + @Test + public void whenNoCredentials_thenRedirectToLogin() { + this.rest.get().uri("/").exchange().expectStatus().is3xxRedirection(); + } + + @Test + @WithMockUser + public void whenHasCredentials_thenSeesGreeting() { + this.rest.get().uri("/").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("Hello, user"); + } +} diff --git a/spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java b/spring-5/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java similarity index 96% rename from spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java rename to spring-5/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java index b05f903b4b..9a6e997ca1 100644 --- a/spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java +++ b/spring-5/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java @@ -16,7 +16,7 @@ import reactor.core.publisher.Mono; @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class WebTestClientTest { +public class WebTestClientIntegrationTest { @LocalServerPort private int port; @@ -53,7 +53,7 @@ public class WebTestClientTest { .uri("/resource") .exchange() .expectStatus() - .is4xxClientError() + .is3xxRedirection() .expectBody(); } diff --git a/spring-activiti/README.md b/spring-activiti/README.md index 3580e29a52..703dfeec52 100644 --- a/spring-activiti/README.md +++ b/spring-activiti/README.md @@ -2,4 +2,5 @@ - [A Guide to Activiti with Java](http://www.baeldung.com/java-activiti) - [Introduction to Activiti with Spring](http://www.baeldung.com/spring-activiti) - +- [Activiti with Spring Security](http://www.baeldung.com/activiti-spring-security) +- [ProcessEngine Configuration in Activiti](http://www.baeldung.com/activiti-process-engine) diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml index f6f992b7c0..92d9618b65 100644 --- a/spring-activiti/pom.xml +++ b/spring-activiti/pom.xml @@ -74,7 +74,7 @@ **/JdbcTest.java **/*LiveTest.java - true + diff --git a/spring-all/README.md b/spring-all/README.md index 36bf7da778..e1504a66db 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -23,3 +23,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [New in Guava 21 common.util.concurrent](http://www.baeldung.com/guava-21-util-concurrent) - [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) - [JasperReports with Spring](http://www.baeldung.com/spring-jasper) +- [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 6615e1d6cd..b04ffae9c8 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-aop/README.md b/spring-aop/README.md index 03d5d8f429..af8ab71da0 100644 --- a/spring-aop/README.md +++ b/spring-aop/README.md @@ -2,4 +2,5 @@ - [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) - [Intro to AspectJ](http://www.baeldung.com/aspectj) -- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) \ No newline at end of file +- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) +- [Introduction to Spring AOP](http://www.baeldung.com/spring-aop) diff --git a/spring-aop/src/main/resources/logback.xml b/spring-aop/src/main/resources/logback.xml index ec0dc2469a..3245e94f08 100644 --- a/spring-aop/src/main/resources/logback.xml +++ b/spring-aop/src/main/resources/logback.xml @@ -13,7 +13,11 @@ - + + + + + \ No newline at end of file diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml index f372ebd724..f72024d32b 100644 --- a/spring-batch/pom.xml +++ b/spring-batch/pom.xml @@ -18,9 +18,10 @@ UTF-8 - 4.3.4.RELEASE - 3.0.7.RELEASE + 5.0.3.RELEASE + 4.0.0.RELEASE 3.15.1 + 4.1 @@ -51,6 +52,16 @@ spring-batch-core ${spring.batch.version} + + org.springframework.batch + spring-batch-test + ${spring.batch.version} + + + com.opencsv + opencsv + ${opencsv.version} + diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java new file mode 100644 index 0000000000..5b6cd9add3 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineProcessor.java @@ -0,0 +1,36 @@ +package org.baeldung.taskletsvschunks.chunks; + +import org.baeldung.taskletsvschunks.model.Line; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.item.ItemProcessor; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; + +public class LineProcessor implements ItemProcessor, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LineProcessor.class); + + @Override + public void beforeStep(StepExecution stepExecution) { + logger.debug("Line Processor initialized."); + } + + @Override + public Line process(Line line) throws Exception { + long age = ChronoUnit.YEARS.between(line.getDob(), LocalDate.now()); + logger.debug("Calculated age " + age + " for line " + line.toString()); + line.setAge(age); + return line; + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + logger.debug("Line Processor ended."); + return ExitStatus.COMPLETED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java new file mode 100644 index 0000000000..5f6b6de218 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LineReader.java @@ -0,0 +1,36 @@ +package org.baeldung.taskletsvschunks.chunks; + +import org.baeldung.taskletsvschunks.model.Line; +import org.baeldung.taskletsvschunks.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.item.ItemReader; + +public class LineReader implements ItemReader, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LineReader.class); + private FileUtils fu; + + @Override + public void beforeStep(StepExecution stepExecution) { + fu = new FileUtils("taskletsvschunks/input/tasklets-vs-chunks.csv"); + logger.debug("Line Reader initialized."); + } + + @Override + public Line read() throws Exception { + Line line = fu.readLine(); + if (line != null) logger.debug("Read line: " + line.toString()); + return line; + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + fu.closeReader(); + logger.debug("Line Reader ended."); + return ExitStatus.COMPLETED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java new file mode 100644 index 0000000000..66f9103a56 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/chunks/LinesWriter.java @@ -0,0 +1,39 @@ +package org.baeldung.taskletsvschunks.chunks; + +import org.baeldung.taskletsvschunks.model.Line; +import org.baeldung.taskletsvschunks.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.item.ItemWriter; + +import java.util.List; + +public class LinesWriter implements ItemWriter, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LinesWriter.class); + private FileUtils fu; + + @Override + public void beforeStep(StepExecution stepExecution) { + fu = new FileUtils("output.csv"); + logger.debug("Line Writer initialized."); + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + fu.closeWriter(); + logger.debug("Line Writer ended."); + return ExitStatus.COMPLETED; + } + + @Override + public void write(List lines) throws Exception { + for (Line line : lines) { + fu.writeLine(line); + logger.debug("Wrote line " + line.toString()); + } + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java new file mode 100644 index 0000000000..601ffb7f27 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/ChunksConfig.java @@ -0,0 +1,90 @@ +package org.baeldung.taskletsvschunks.config; + +import org.baeldung.taskletsvschunks.chunks.LineProcessor; +import org.baeldung.taskletsvschunks.chunks.LineReader; +import org.baeldung.taskletsvschunks.chunks.LinesWriter; +import org.baeldung.taskletsvschunks.model.Line; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.launch.support.SimpleJobLauncher; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.support.transaction.ResourcelessTransactionManager; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.PlatformTransactionManager; + +@Configuration +@EnableBatchProcessing +public class ChunksConfig { + + @Autowired private JobBuilderFactory jobs; + + @Autowired private StepBuilderFactory steps; + + @Bean + public JobLauncherTestUtils jobLauncherTestUtils() { + return new JobLauncherTestUtils(); + } + + @Bean + public JobRepository jobRepository() throws Exception { + MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(); + factory.setTransactionManager(transactionManager()); + return (JobRepository) factory.getObject(); + } + + @Bean + public PlatformTransactionManager transactionManager() { + return new ResourcelessTransactionManager(); + } + + @Bean + public JobLauncher jobLauncher() throws Exception { + SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); + jobLauncher.setJobRepository(jobRepository()); + return jobLauncher; + } + + @Bean + public ItemReader itemReader() { + return new LineReader(); + } + + @Bean + public ItemProcessor itemProcessor() { + return new LineProcessor(); + } + + @Bean + public ItemWriter itemWriter() { + return new LinesWriter(); + } + + @Bean + protected Step processLines(ItemReader reader, ItemProcessor processor, ItemWriter writer) { + return steps.get("processLines"). chunk(2) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } + + @Bean + public Job job() { + return jobs + .get("chunksJob") + .start(processLines(itemReader(), itemProcessor(), itemWriter())) + .build(); + } + +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java new file mode 100644 index 0000000000..b9d06d2639 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/config/TaskletsConfig.java @@ -0,0 +1,103 @@ +package org.baeldung.taskletsvschunks.config; + +import org.baeldung.taskletsvschunks.tasklets.LinesProcessor; +import org.baeldung.taskletsvschunks.tasklets.LinesReader; +import org.baeldung.taskletsvschunks.tasklets.LinesWriter; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.launch.support.SimpleJobLauncher; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean; +import org.springframework.batch.support.transaction.ResourcelessTransactionManager; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.PlatformTransactionManager; + +@Configuration +@EnableBatchProcessing +public class TaskletsConfig { + + @Autowired private JobBuilderFactory jobs; + + @Autowired private StepBuilderFactory steps; + + @Bean + public JobLauncherTestUtils jobLauncherTestUtils() { + return new JobLauncherTestUtils(); + } + + @Bean + public JobRepository jobRepository() throws Exception { + MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(); + factory.setTransactionManager(transactionManager()); + return (JobRepository) factory.getObject(); + } + + @Bean + public PlatformTransactionManager transactionManager() { + return new ResourcelessTransactionManager(); + } + + @Bean + public JobLauncher jobLauncher() throws Exception { + SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); + jobLauncher.setJobRepository(jobRepository()); + return jobLauncher; + } + + @Bean + public LinesReader linesReader() { + return new LinesReader(); + } + + @Bean + public LinesProcessor linesProcessor() { + return new LinesProcessor(); + } + + @Bean + public LinesWriter linesWriter() { + return new LinesWriter(); + } + + @Bean + protected Step readLines() { + return steps + .get("readLines") + .tasklet(linesReader()) + .build(); + } + + @Bean + protected Step processLines() { + return steps + .get("processLines") + .tasklet(linesProcessor()) + .build(); + } + + @Bean + protected Step writeLines() { + return steps + .get("writeLines") + .tasklet(linesWriter()) + .build(); + } + + @Bean + public Job job() { + return jobs + .get("taskletsJob") + .start(readLines()) + .next(processLines()) + .next(writeLines()) + .build(); + } + +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java new file mode 100644 index 0000000000..fee6fd31a6 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/model/Line.java @@ -0,0 +1,55 @@ +package org.baeldung.taskletsvschunks.model; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class Line implements Serializable { + + private String name; + private LocalDate dob; + private Long age; + + public Line(String name, LocalDate dob) { + this.name = name; + this.dob = dob; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDate getDob() { + return dob; + } + + public void setDob(LocalDate dob) { + this.dob = dob; + } + + public Long getAge() { + return age; + } + + public void setAge(Long age) { + this.age = age; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + sb.append(this.name); + sb.append(","); + sb.append(this.dob.format(DateTimeFormatter.ofPattern("MM/dd/yyyy"))); + if (this.age != null) { + sb.append(","); + sb.append(this.age); + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java new file mode 100644 index 0000000000..ba7a3088d5 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesProcessor.java @@ -0,0 +1,49 @@ +package org.baeldung.taskletsvschunks.tasklets; + +import org.baeldung.taskletsvschunks.model.Line; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.repeat.RepeatStatus; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.List; + +public class LinesProcessor implements Tasklet, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LinesProcessor.class); + + private List lines; + + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + for (Line line : lines) { + long age = ChronoUnit.YEARS.between(line.getDob(), LocalDate.now()); + logger.debug("Calculated age " + age + " for line " + line.toString()); + line.setAge(age); + } + return RepeatStatus.FINISHED; + } + + @Override + public void beforeStep(StepExecution stepExecution) { + ExecutionContext executionContext = stepExecution + .getJobExecution() + .getExecutionContext(); + this.lines = (List) executionContext.get("lines"); + logger.debug("Lines Processor initialized."); + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + logger.debug("Lines Processor ended."); + return ExitStatus.COMPLETED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java new file mode 100644 index 0000000000..9905ee8f8a --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesReader.java @@ -0,0 +1,53 @@ +package org.baeldung.taskletsvschunks.tasklets; + +import org.baeldung.taskletsvschunks.model.Line; +import org.baeldung.taskletsvschunks.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; + +import java.util.ArrayList; +import java.util.List; + +public class LinesReader implements Tasklet, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LinesReader.class); + + private List lines; + private FileUtils fu; + + @Override + public void beforeStep(StepExecution stepExecution) { + lines = new ArrayList(); + fu = new FileUtils("taskletsvschunks/input/tasklets-vs-chunks.csv"); + logger.debug("Lines Reader initialized."); + } + + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + Line line = fu.readLine(); + while (line != null) { + lines.add(line); + logger.debug("Read line: " + line.toString()); + line = fu.readLine(); + } + return RepeatStatus.FINISHED; + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + fu.closeReader(); + stepExecution + .getJobExecution() + .getExecutionContext() + .put("lines", this.lines); + logger.debug("Lines Reader ended."); + return ExitStatus.COMPLETED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java new file mode 100644 index 0000000000..937288a890 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/tasklets/LinesWriter.java @@ -0,0 +1,50 @@ +package org.baeldung.taskletsvschunks.tasklets; + +import org.baeldung.taskletsvschunks.model.Line; +import org.baeldung.taskletsvschunks.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.repeat.RepeatStatus; + +import java.util.List; + +public class LinesWriter implements Tasklet, StepExecutionListener { + + private final Logger logger = LoggerFactory.getLogger(LinesWriter.class); + + private List lines; + private FileUtils fu; + + @Override + public void beforeStep(StepExecution stepExecution) { + ExecutionContext executionContext = stepExecution + .getJobExecution() + .getExecutionContext(); + this.lines = (List) executionContext.get("lines"); + fu = new FileUtils("output.csv"); + logger.debug("Lines Writer initialized."); + } + + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + for (Line line : lines) { + fu.writeLine(line); + logger.debug("Wrote line " + line.toString()); + } + return RepeatStatus.FINISHED; + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + fu.closeWriter(); + logger.debug("Lines Writer ended."); + return ExitStatus.COMPLETED; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java new file mode 100644 index 0000000000..df36d5c756 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/taskletsvschunks/utils/FileUtils.java @@ -0,0 +1,95 @@ +package org.baeldung.taskletsvschunks.utils; + +import com.opencsv.CSVReader; +import com.opencsv.CSVWriter; +import org.baeldung.taskletsvschunks.model.Line; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class FileUtils { + + private final Logger logger = LoggerFactory.getLogger(FileUtils.class); + + private String fileName; + private CSVReader CSVReader; + private CSVWriter CSVWriter; + private FileReader fileReader; + private FileWriter fileWriter; + private File file; + + public FileUtils(String fileName) { + this.fileName = fileName; + } + + public Line readLine() { + try { + if (CSVReader == null) initReader(); + String[] line = CSVReader.readNext(); + if (line == null) return null; + return new Line(line[0], LocalDate.parse(line[1], DateTimeFormatter.ofPattern("MM/dd/yyyy"))); + } catch (Exception e) { + logger.error("Error while reading line in file: " + this.fileName); + return null; + } + } + + public void writeLine(Line line) { + try { + if (CSVWriter == null) initWriter(); + String[] lineStr = new String[2]; + lineStr[0] = line.getName(); + lineStr[1] = line + .getAge() + .toString(); + CSVWriter.writeNext(lineStr); + } catch (Exception e) { + logger.error("Error while writing line in file: " + this.fileName); + } + } + + private void initReader() throws Exception { + ClassLoader classLoader = this + .getClass() + .getClassLoader(); + if (file == null) file = new File(classLoader + .getResource(fileName) + .getFile()); + if (fileReader == null) fileReader = new FileReader(file); + if (CSVReader == null) CSVReader = new CSVReader(fileReader); + } + + private void initWriter() throws Exception { + if (file == null) { + file = new File(fileName); + file.createNewFile(); + } + if (fileWriter == null) fileWriter = new FileWriter(file, true); + if (CSVWriter == null) CSVWriter = new CSVWriter(fileWriter); + } + + public void closeWriter() { + try { + CSVWriter.close(); + fileWriter.close(); + } catch (IOException e) { + logger.error("Error while closing writer."); + } + } + + public void closeReader() { + try { + CSVReader.close(); + fileReader.close(); + } catch (IOException e) { + logger.error("Error while closing reader."); + } + } + +} diff --git a/spring-batch/src/main/resources/logback.xml b/spring-batch/src/main/resources/logback.xml new file mode 100644 index 0000000000..b110d1c226 --- /dev/null +++ b/spring-batch/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} - %msg%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch/src/main/resources/taskletsvschunks/input/tasklets-vs-chunks.csv b/spring-batch/src/main/resources/taskletsvschunks/input/tasklets-vs-chunks.csv new file mode 100644 index 0000000000..214bd3cb70 --- /dev/null +++ b/spring-batch/src/main/resources/taskletsvschunks/input/tasklets-vs-chunks.csv @@ -0,0 +1,6 @@ +Mae Hodges,10/22/1972 +Gary Potter,02/22/1953 +Betty Wise,02/17/1968 +Wayne Rose,04/06/1977 +Adam Caldwell,09/27/1995 +Lucille Phillips,05/14/1992 \ No newline at end of file diff --git a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksTest.java b/spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksTest.java new file mode 100644 index 0000000000..2a71970637 --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/taskletsvschunks/chunks/ChunksTest.java @@ -0,0 +1,25 @@ +package org.baeldung.taskletsvschunks.chunks; + +import org.baeldung.taskletsvschunks.config.ChunksConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ChunksConfig.class) +public class ChunksTest { + + @Autowired private JobLauncherTestUtils jobLauncherTestUtils; + + @Test + public void givenChunksJob_WhenJobEnds_ThenStatusCompleted() throws Exception { + JobExecution jobExecution = jobLauncherTestUtils.launchJob(); + Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); + } +} \ No newline at end of file diff --git a/spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsTest.java b/spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsTest.java new file mode 100644 index 0000000000..20379b58fe --- /dev/null +++ b/spring-batch/src/test/java/org/baeldung/taskletsvschunks/tasklets/TaskletsTest.java @@ -0,0 +1,25 @@ +package org.baeldung.taskletsvschunks.tasklets; + +import org.baeldung.taskletsvschunks.config.TaskletsConfig; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = TaskletsConfig.class) +public class TaskletsTest { + + @Autowired private JobLauncherTestUtils jobLauncherTestUtils; + + @Test + public void givenTaskletsJob_WhenJobEnds_ThenStatusCompleted() throws Exception { + JobExecution jobExecution = jobLauncherTestUtils.launchJob(); + Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); + } +} \ No newline at end of file diff --git a/spring-boot-actuator/.gitignore b/spring-boot-actuator/.gitignore deleted file mode 100644 index 60be5b80aa..0000000000 --- a/spring-boot-actuator/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -.settings/ -.classpath -.project diff --git a/spring-boot-actuator/pom.xml b/spring-boot-actuator/pom.xml deleted file mode 100644 index bec126a247..0000000000 --- a/spring-boot-actuator/pom.xml +++ /dev/null @@ -1,121 +0,0 @@ - - 4.0.0 - com.baeldung - spring-boot-actuator - 0.0.1-SNAPSHOT - jar - spring-boot - This is simple boot application for Spring boot actuator test - - - - org.springframework.boot - spring-boot-starter-parent - 1.5.2.RELEASE - - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - spring-boot-actuator - - - src/main/resources - true - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - - org.baeldung.MainApplication - UTF-8 - 1.8 - - - diff --git a/spring-boot-actuator/src/main/java/org/baeldung/MainApplication.java b/spring-boot-actuator/src/main/java/org/baeldung/MainApplication.java deleted file mode 100644 index 7c9054dbf8..0000000000 --- a/spring-boot-actuator/src/main/java/org/baeldung/MainApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.baeldung.config.MainConfig; - -@SpringBootApplication -public class MainApplication { - - public static void main(String args[]) { - SpringApplication.run(MainConfig.class, args); - } -} diff --git a/spring-boot-actuator/src/main/java/org/baeldung/config/MainConfig.java b/spring-boot-actuator/src/main/java/org/baeldung/config/MainConfig.java deleted file mode 100644 index 27c97cc006..0000000000 --- a/spring-boot-actuator/src/main/java/org/baeldung/config/MainConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung.config; - -import java.util.Collections; -import org.springframework.boot.actuate.info.InfoContributor; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.Bean; - -@EnableAutoConfiguration -public class MainConfig { - - public MainConfig() {} - - @Bean - public InfoContributor getInfoContributor() { - return (infoBuilder) -> infoBuilder.withDetail("applicationInfo", Collections.singletonMap("ActiveUserCount", "10")); - } -} diff --git a/spring-boot-actuator/src/main/resources/application.properties b/spring-boot-actuator/src/main/resources/application.properties deleted file mode 100644 index 835c78eda2..0000000000 --- a/spring-boot-actuator/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -info.app.name=Sample application \ No newline at end of file diff --git a/spring-boot-actuator/src/test/resources/expectedResponse.json b/spring-boot-actuator/src/test/resources/expectedResponse.json deleted file mode 100644 index caa0bdbbf8..0000000000 --- a/spring-boot-actuator/src/test/resources/expectedResponse.json +++ /dev/null @@ -1 +0,0 @@ -{"app":{"name":"Sample application"},"applicationInfo":{"ActiveUserCount":"10"}} \ No newline at end of file diff --git a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationTests.java b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java similarity index 97% rename from spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationTests.java rename to spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java index d70fb1c7cf..0201deabca 100644 --- a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationTests.java +++ b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java @@ -19,7 +19,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT) -public class SpringBootAdminClientApplicationTests { +public class SpringBootAdminClientApplicationIntegrationTest { @Autowired Environment environment; diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigIntegrationTest.java similarity index 95% rename from spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigTest.java rename to spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigIntegrationTest.java index 8ca50a6f75..7c1b1881a4 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/HazelcastConfigIntegrationTest.java @@ -13,7 +13,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen @RunWith(SpringRunner.class) @SpringBootTest(classes = { HazelcastConfig.class }, webEnvironment = NONE) -public class HazelcastConfigTest { +public class HazelcastConfigIntegrationTest { @Autowired private ApplicationContext applicationContext; diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java similarity index 96% rename from spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationTest.java rename to spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java index 85f6b374a4..465d079ac3 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java @@ -16,7 +16,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen @RunWith(SpringRunner.class) @SpringBootTest(classes = { NotifierConfiguration.class }, webEnvironment = NONE) -public class NotifierConfigurationTest { +public class NotifierConfigurationIntegrationTest { @Autowired private ApplicationContext applicationContext; diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java similarity index 97% rename from spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigTest.java rename to spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java index 40611f00f6..0c0695e6c2 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java @@ -17,7 +17,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class WebSecurityConfigTest { +public class WebSecurityConfigIntegrationTest { @Autowired WebApplicationContext wac; diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml index 5ad8330a89..21c0ea60a8 100644 --- a/spring-boot-bootstrap/pom.xml +++ b/spring-boot-bootstrap/pom.xml @@ -24,12 +24,12 @@ org.springframework.boot spring-boot-starter-data-jpa - 1.5.5.RELEASE + 1.5.10.RELEASE org.springframework.boot spring-boot-dependencies - 1.5.6.RELEASE + 1.5.10.RELEASE pom import diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml index 62c3676ae4..d5946900ae 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml @@ -47,7 +47,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + 3.7.0 1.8 1.8 diff --git a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml index 7b38c53c09..9b8858a8ab 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml @@ -39,7 +39,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + 3.7.0 1.8 1.8 diff --git a/spring-boot-keycloak/README.md b/spring-boot-keycloak/README.md new file mode 100644 index 0000000000..cfe82c6cf7 --- /dev/null +++ b/spring-boot-keycloak/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [A Quick Guide to Using Keycloak with Spring Boot](http://www.baeldung.com/spring-boot-keycloak) diff --git a/spring-boot-keycloak/pom.xml b/spring-boot-keycloak/pom.xml index 657f96a265..741e2313b4 100644 --- a/spring-boot-keycloak/pom.xml +++ b/spring-boot-keycloak/pom.xml @@ -12,10 +12,12 @@ This is a simple application demonstrating integration between Keycloak and Spring Boot. - org.springframework.boot - spring-boot-starter-parent - 1.5.8.RELEASE - + + com.baeldung + parent-boot-5 + 0.0.1-SNAPSHOT + ../parent-boot-5 + diff --git a/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationTest.java b/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationIntegrationTest.java similarity index 97% rename from spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationTest.java rename to spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationIntegrationTest.java index 41662e5c17..e0bbef1c7f 100644 --- a/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationTest.java +++ b/spring-boot-keycloak/src/test/java/com/baeldung/keycloak/KeycloakConfigurationIntegrationTest.java @@ -20,7 +20,7 @@ import static org.mockito.Mockito.when; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringBoot.class) -public class KeycloakConfigurationTest { +public class KeycloakConfigurationIntegrationTest { @Spy private KeycloakSecurityContextClientRequestInterceptor factory; diff --git a/spring-boot-property-exp/pom.xml b/spring-boot-property-exp/pom.xml index 0c54d57db1..1a1e31385e 100644 --- a/spring-boot-property-exp/pom.xml +++ b/spring-boot-property-exp/pom.xml @@ -1,6 +1,11 @@ - + + 4.0.0 + spring-boot-property-exp + + com.baeldung + spring-boot-property-exp + 0.0.1-SNAPSHOT + pom parent-modules @@ -8,17 +13,6 @@ 1.0.0-SNAPSHOT - 4.0.0 - - com.baeldung - spring-boot-property-exp - 0.0.1-SNAPSHOT - - pom - - spring-boot-property-exp - http://maven.apache.org - UTF-8 @@ -28,5 +22,4 @@ property-exp-custom-config - diff --git a/spring-boot-property-exp/property-exp-custom-config/pom.xml b/spring-boot-property-exp/property-exp-custom-config/pom.xml index 7822b31cf2..019e2362a1 100644 --- a/spring-boot-property-exp/property-exp-custom-config/pom.xml +++ b/spring-boot-property-exp/property-exp-custom-config/pom.xml @@ -1,32 +1,26 @@ - - - spring-boot-property-exp - com.baeldung - 0.0.1-SNAPSHOT - + 4.0.0 + property-exp-custom com.baeldung property-exp-custom-config 0.0.1-SNAPSHOT jar - property-exp-custom - http://maven.apache.org - - - UTF-8 - Custom Property Value - + + spring-boot-property-exp + com.baeldung + 0.0.1-SNAPSHOT + + org.springframework.boot spring-boot-starter - 1.5.4.RELEASE + 1.5.10.RELEASE + @@ -73,5 +67,9 @@ + + UTF-8 + Custom Property Value + diff --git a/spring-boot-property-exp/property-exp-default-config/pom.xml b/spring-boot-property-exp/property-exp-default-config/pom.xml index 0625916d32..5dc47d287d 100644 --- a/spring-boot-property-exp/property-exp-default-config/pom.xml +++ b/spring-boot-property-exp/property-exp-default-config/pom.xml @@ -1,27 +1,17 @@ - - + 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 1.5.4.RELEASE - - + property-exp-default + com.baeldung property-exp-default-config 0.0.1-SNAPSHOT jar - property-exp-default - http://maven.apache.org - - - UTF-8 - Custom Property Value - + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + @@ -42,4 +32,9 @@ + + UTF-8 + Custom Property Value + + diff --git a/spring-boot-security/README.md b/spring-boot-security/README.md new file mode 100644 index 0000000000..a0ddb8de7b --- /dev/null +++ b/spring-boot-security/README.md @@ -0,0 +1,8 @@ +### Spring Boot Security Auto-Configuration + +- mvn clean install +- uncomment actuator dependency simultaneously with the line from basic auth main class +- uncomment security properties for easy testing. If not random will be generated. + +### CURL commands +- curl -X POST -u baeldung-admin:baeldung -d grant_type=client_credentials -d username=baeldung-admin -d password=baeldung http://localhost:8080/oauth/token diff --git a/spring-jmeter-jenkins/pom.xml b/spring-boot-security/pom.xml similarity index 50% rename from spring-jmeter-jenkins/pom.xml rename to spring-boot-security/pom.xml index 38b5f98e45..c1ec14ff64 100644 --- a/spring-jmeter-jenkins/pom.xml +++ b/spring-boot-security/pom.xml @@ -3,19 +3,30 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-jmeter-jenkins + com.baeldung + spring-boot-security 0.0.1-SNAPSHOT jar - spring-jmeter-jenkins - Run and Show JMeter test with Jenkins + spring-boot-security + Spring Boot Security Auto-Configuration - parent-boot-5 com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 + parent-modules + 1.0.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-dependencies + 1.5.9.RELEASE + pom + import + + + UTF-8 @@ -24,19 +35,33 @@ + + + + org.springframework.boot - spring-boot-starter-data-mongodb + spring-boot-starter-security + + + org.springframework.security.oauth + spring-security-oauth2 org.springframework.boot - spring-boot-starter-data-rest + spring-boot-starter-web + org.springframework.boot spring-boot-starter-test test + + org.springframework.security + spring-security-test + test + diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java new file mode 100644 index 0000000000..2ecad4ae35 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.springbootsecurity.basic_auth; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration; + +@SpringBootApplication(exclude = { + SecurityAutoConfiguration.class + // ,ManagementWebSecurityAutoConfiguration.class +}, scanBasePackages = "com.baeldung.springbootsecurity.basic_auth") +public class SpringBootSecurityApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootSecurityApplication.class, args); + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicAuthConfiguration.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicAuthConfiguration.java new file mode 100644 index 0000000000..993c573fb0 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicAuthConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.springbootsecurity.basic_auth.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class BasicAuthConfiguration extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user") + .password("password") + .roles("USER") + .and() + .withUser("admin") + .password("admin") + .roles("USER", "ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .anyRequest() + .authenticated() + .and() + .httpBasic(); + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java new file mode 100644 index 0000000000..56231a28bd --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java @@ -0,0 +1,30 @@ +package com.baeldung.springbootsecurity.oauth2resource; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@EnableResourceServer +@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2resource") +public class SpringBootOAuth2ResourceApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder() + .profiles("resource") + .sources(SpringBootOAuth2ResourceApplication.class) + .build() + .run(args); + } + + @RestController + class SecuredResourceController { + + @GetMapping("/securedResource") + public String securedResource() { + return "Baeldung Secured Resource OK"; + } + + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java new file mode 100644 index 0000000000..44dabefbb8 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java @@ -0,0 +1,30 @@ +package com.baeldung.springbootsecurity.oauth2server; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.security.Principal; + +@EnableResourceServer +@EnableAuthorizationServer +@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2server") +public class SpringBootAuthorizationServerApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootAuthorizationServerApplication.class, args); + } + + @RestController + class UserController { + + @GetMapping("/user") + public Principal user(Principal user) { + return user; + } + + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java new file mode 100644 index 0000000000..b403feb5c1 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java @@ -0,0 +1,39 @@ +package com.baeldung.springbootsecurity.oauth2server.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; + +@Configuration +@Profile("authz") +public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { + + @Autowired + private AuthenticationManager authenticationManager; + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { + endpoints.authenticationManager(authenticationManager); + } + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients + .inMemory() + .withClient("baeldung") + .secret("baeldung") + .authorizedGrantTypes("client_credentials", "password", "authorization_code") + .scopes("openid", "read") + .autoApprove(true) + .and() + .withClient("baeldung-admin") + .secret("baeldung") + .authorizedGrantTypes("authorization_code", "client_credentials", "refresh_token") + .scopes("read", "write") + .autoApprove(true); + } +} diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java new file mode 100644 index 0000000000..b1cd580f08 --- /dev/null +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java @@ -0,0 +1,18 @@ +package com.baeldung.springbootsecurity.oauth2sso; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; +import org.springframework.boot.builder.SpringApplicationBuilder; + +@EnableOAuth2Sso +@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2sso") +public class SpringBootOAuth2SsoApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder() + .profiles("sso") + .sources(SpringBootOAuth2SsoApplication.class) + .build() + .run(args); + } +} diff --git a/spring-boot-security/src/main/resources/application-authz.properties b/spring-boot-security/src/main/resources/application-authz.properties new file mode 100644 index 0000000000..d29b0cdd3c --- /dev/null +++ b/spring-boot-security/src/main/resources/application-authz.properties @@ -0,0 +1,3 @@ +security.user.password=password +security.oauth2.client.client-id=client +security.oauth2.client.client-secret=secret diff --git a/spring-boot-security/src/main/resources/application-resource.properties b/spring-boot-security/src/main/resources/application-resource.properties new file mode 100644 index 0000000000..b157b01d51 --- /dev/null +++ b/spring-boot-security/src/main/resources/application-resource.properties @@ -0,0 +1,2 @@ +server.port=8081 +security.oauth2.resource.userInfoUri=http://localhost:8080/user \ No newline at end of file diff --git a/spring-boot-security/src/main/resources/application-sso.properties b/spring-boot-security/src/main/resources/application-sso.properties new file mode 100644 index 0000000000..ac6ae0cc93 --- /dev/null +++ b/spring-boot-security/src/main/resources/application-sso.properties @@ -0,0 +1,9 @@ +server.port=8082 +security.oauth2.client.clientId= +security.oauth2.client.clientSecret= +security.oauth2.client.accessTokenUri=https://graph.facebook.com/oauth/access_token +security.oauth2.client.userAuthorizationUri=https://www.facebook.com/dialog/oauth +security.oauth2.client.tokenName=oauth_token +security.oauth2.client.authenticationScheme=query +security.oauth2.client.clientAuthenticationScheme=form +security.oauth2.resource.userInfoUri=https://graph.facebook.com/me \ No newline at end of file diff --git a/spring-boot-security/src/main/resources/application.properties b/spring-boot-security/src/main/resources/application.properties new file mode 100644 index 0000000000..c2b8d70dc6 --- /dev/null +++ b/spring-boot-security/src/main/resources/application.properties @@ -0,0 +1,4 @@ +#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration +#security.user.password=password +#security.oauth2.client.client-id=client +#security.oauth2.client.client-secret=secret diff --git a/spring-boot-security/src/main/resources/static/index.html b/spring-boot-security/src/main/resources/static/index.html new file mode 100644 index 0000000000..5e3506dde6 --- /dev/null +++ b/spring-boot-security/src/main/resources/static/index.html @@ -0,0 +1,10 @@ + + + + + Index + + +Welcome to Baeldung Secured Page !!! + + \ No newline at end of file diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicAuthConfigurationIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicAuthConfigurationIntegrationTest.java new file mode 100644 index 0000000000..32c3fbdef4 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicAuthConfigurationIntegrationTest.java @@ -0,0 +1,57 @@ +package com.baeldung.springbootsecurity.basic_auth; + +import com.baeldung.springbootsecurity.basic_auth.SpringBootSecurityApplication; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootSecurityApplication.class) +public class BasicAuthConfigurationIntegrationTest { + + TestRestTemplate restTemplate; + URL base; + + @LocalServerPort int port; + + @Before + public void setUp() throws MalformedURLException { + restTemplate = new TestRestTemplate("user", "password"); + base = new URL("http://localhost:" + port); + } + + @Test + public void whenLoggedUserRequestsHomePage_ThenSuccess() throws IllegalStateException, IOException { + ResponseEntity response = restTemplate.getForEntity(base.toString(), String.class); + + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertTrue(response + .getBody() + .contains("Baeldung")); + } + + @Test + public void whenUserWithWrongCredentialsRequestsHomePage_ThenUnauthorizedPage() throws IllegalStateException, IOException { + restTemplate = new TestRestTemplate("user", "wrongpassword"); + ResponseEntity response = restTemplate.getForEntity(base.toString(), String.class); + + assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); + assertTrue(response + .getBody() + .contains("Unauthorized")); + } +} diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java new file mode 100644 index 0000000000..cc953eef5a --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.springbootsecurity.oauth2server; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException; +import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringRunner; + +import static java.util.Collections.singletonList; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootAuthorizationServerApplication.class) +@ActiveProfiles("authz") +public class CustomConfigAuthorizationServerIntegrationTest extends OAuth2IntegrationTestSupport { + + @Test + public void givenOAuth2Context_whenAccessTokenIsRequested_ThenAccessTokenValueIsNotNull() { + ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read")); + OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); + + OAuth2AccessToken accessToken = restTemplate.getAccessToken(); + + assertNotNull(accessToken); + + } + + @Test(expected = OAuth2AccessDeniedException.class) + public void givenOAuth2Context_whenAccessTokenIsRequestedWithInvalidException_ThenExceptionIsThrown() { + ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("write")); + OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); + + restTemplate.getAccessToken(); + } + + @Test + public void givenOAuth2Context_whenAccessTokenIsRequestedByClientWithWriteScope_ThenAccessTokenIsNotNull() { + ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung-admin", singletonList("write")); + OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); + + OAuth2AccessToken accessToken = restTemplate.getAccessToken(); + + assertNotNull(accessToken); + } + +} + diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java new file mode 100644 index 0000000000..4d7b449380 --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java @@ -0,0 +1,32 @@ +package com.baeldung.springbootsecurity.oauth2server; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.test.context.junit4.SpringRunner; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootAuthorizationServerApplication.class, + properties = { "security.oauth2.client.client-id=client", "security.oauth2.client.client-secret=baeldung" }) +public class DefaultConfigAuthorizationServerIntegrationTest extends OAuth2IntegrationTestSupport { + + @Test + public void givenOAuth2Context_whenAccessTokenIsRequested_ThenAccessTokenValueIsNotNull() { + ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("client", asList("read", "write")); + OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails); + + OAuth2AccessToken accessToken = restTemplate.getAccessToken(); + + assertNotNull(accessToken); + + } + +} + diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java new file mode 100644 index 0000000000..3eef206c7d --- /dev/null +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java @@ -0,0 +1,34 @@ +package com.baeldung.springbootsecurity.oauth2server; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails; + +import java.util.List; + +import static java.lang.String.format; +import static java.util.Collections.singletonList; + +public class OAuth2IntegrationTestSupport { + + @Value("${local.server.port}") protected int port; + + protected ClientCredentialsResourceDetails getClientCredentialsResourceDetails(final String clientId, final List scopes) { + ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails(); + resourceDetails.setAccessTokenUri(format("http://localhost:%d/oauth/token", port)); + resourceDetails.setClientId(clientId); + resourceDetails.setClientSecret("baeldung"); + resourceDetails.setScope(scopes); + resourceDetails.setGrantType("client_credentials"); + return resourceDetails; + } + + protected OAuth2RestTemplate getOAuth2RestTemplate(final ClientCredentialsResourceDetails resourceDetails) { + DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext(); + OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails, clientContext); + restTemplate.setMessageConverters(singletonList(new MappingJackson2HttpMessageConverter())); + return restTemplate; + } +} diff --git a/spring-boot/.factorypath b/spring-boot/.factorypath index aa15485f5c..60dbd696eb 100644 --- a/spring-boot/.factorypath +++ b/spring-boot/.factorypath @@ -1,149 +1,154 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - + + + + + + + + + + + + + + + - + - - + + + + + - - - - - - + + + + + + + - - + - + - - - - + + + + + - - - - - - - - + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - + + + + + - - - - + + + + + + + + + + - + - - - + + + + - + diff --git a/spring-boot/.mvn/wrapper/maven-wrapper.properties b/spring-boot/.mvn/wrapper/maven-wrapper.properties new file mode 100755 index 0000000000..a447c9fa81 --- /dev/null +++ b/spring-boot/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 5d7eb11954..e78756cf08 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -27,4 +27,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Java Client for a WebSockets API](http://www.baeldung.com/websockets-api-java-spring-client) - [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) - [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) - +- [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) +- [Quick Guide on data.sql and schema.sql Files in Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql) +- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8) +- [A Quick Guide to Maven Wrapper](http://www.baeldung.com/maven-wrapper) +- [An Introduction to Kong](http://www.baeldung.com/kong) diff --git a/spring-boot/mvnw b/spring-boot/mvnw new file mode 100755 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/spring-boot/mvnw.cmd b/spring-boot/mvnw.cmd new file mode 100755 index 0000000000..4f0b068a03 --- /dev/null +++ b/spring-boot/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 5e5f01013d..84dc43a605 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -24,10 +24,6 @@ org.springframework.boot spring-boot-starter-web - - org.keycloak - keycloak-spring-boot-starter - org.springframework.boot spring-boot-starter-data-jpa @@ -62,7 +58,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided @@ -171,18 +166,13 @@ org.apache.activemq artemis-server + + + com.rometools + rome + ${rome.version} + - - - - org.keycloak.bom - keycloak-adapter-bom - 3.3.0.CR2 - pom - import - - - spring-boot @@ -282,7 +272,7 @@ - org.baeldung.boot.DemoApplication + org.baeldung.demo.DemoApplication 4.3.4.RELEASE 2.2.1 3.1.1 @@ -291,6 +281,7 @@ 8.5.11 1.4.194 2.4.1.Final + 1.9.0 \ No newline at end of file diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java index 95b4a1a191..b1bdc7d781 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/AttrListener.java @@ -9,8 +9,7 @@ public class AttrListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { - servletContextEvent.getServletContext() - .setAttribute("servlet-context-attr", "test"); + servletContextEvent.getServletContext().setAttribute("servlet-context-attr", "test"); System.out.println("context init"); } diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java index a2995d1532..d8192c2cb1 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/EchoServlet.java @@ -16,8 +16,7 @@ public class EchoServlet extends HttpServlet { @Override public void doPost(HttpServletRequest request, HttpServletResponse response) { try { - Path path = File.createTempFile("echo", "tmp") - .toPath(); + Path path = File.createTempFile("echo", "tmp").toPath(); Files.copy(request.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); Files.copy(path, response.getOutputStream()); Files.delete(path); diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java index 650dae9806..146e5ae386 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloFilter.java @@ -18,8 +18,7 @@ public class HelloFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - servletResponse.getOutputStream() - .print(filterConfig.getInitParameter("msg")); + servletResponse.getOutputStream().print(filterConfig.getInitParameter("msg")); filterChain.doFilter(servletRequest, servletResponse); } diff --git a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java index 3c27b8416f..5269c1bf29 100644 --- a/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java +++ b/spring-boot/src/main/java/com/baeldung/annotation/servletcomponentscan/components/HelloServlet.java @@ -21,9 +21,7 @@ public class HelloServlet extends HttpServlet { @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { try { - response.getOutputStream() - .write(servletConfig.getInitParameter("msg") - .getBytes()); + response.getOutputStream().write(servletConfig.getInitParameter("msg").getBytes()); } catch (IOException e) { e.printStackTrace(); } diff --git a/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java index 6dd127a8c3..4f4f6fb6af 100644 --- a/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java +++ b/spring-boot/src/main/java/com/baeldung/autoconfiguration/MySQLAutoconfiguration.java @@ -98,13 +98,8 @@ public class MySQLAutoconfiguration { public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { ConditionMessage.Builder message = ConditionMessage.forCondition("Hibernate"); - return Arrays.stream(CLASS_NAMES) - .filter(className -> ClassUtils.isPresent(className, context.getClassLoader())) - .map(className -> ConditionOutcome.match(message.found("class") - .items(Style.NORMAL, className))) - .findAny() - .orElseGet(() -> ConditionOutcome.noMatch(message.didNotFind("class", "classes") - .items(Style.NORMAL, Arrays.asList(CLASS_NAMES)))); + return Arrays.stream(CLASS_NAMES).filter(className -> ClassUtils.isPresent(className, context.getClassLoader())).map(className -> ConditionOutcome.match(message.found("class").items(Style.NORMAL, className))).findAny() + .orElseGet(() -> ConditionOutcome.noMatch(message.didNotFind("class", "classes").items(Style.NORMAL, Arrays.asList(CLASS_NAMES)))); } } diff --git a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java index c12c28d00a..0f8300a797 100644 --- a/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java +++ b/spring-boot/src/main/java/com/baeldung/dynamicvalidation/ContactInfoValidator.java @@ -28,9 +28,7 @@ public class ContactInfoValidator implements ConstraintValidator getAuthor(String id) { - return authors.stream() - .filter(author -> id.equals(author.getId())) - .findFirst(); + return authors.stream().filter(author -> id.equals(author.getId())).findFirst(); } } diff --git a/spring-boot/src/main/java/com/baeldung/graphql/Mutation.java b/spring-boot/src/main/java/com/baeldung/graphql/Mutation.java index 5ccc80dad1..0e16e3c8b7 100644 --- a/spring-boot/src/main/java/com/baeldung/graphql/Mutation.java +++ b/spring-boot/src/main/java/com/baeldung/graphql/Mutation.java @@ -13,8 +13,7 @@ public class Mutation implements GraphQLMutationResolver { public Post writePost(String title, String text, String category, String author) { Post post = new Post(); - post.setId(UUID.randomUUID() - .toString()); + post.setId(UUID.randomUUID().toString()); post.setTitle(title); post.setText(text); post.setCategory(category); diff --git a/spring-boot/src/main/java/com/baeldung/graphql/PostDao.java b/spring-boot/src/main/java/com/baeldung/graphql/PostDao.java index f8d243ee3a..0a755a7cf4 100644 --- a/spring-boot/src/main/java/com/baeldung/graphql/PostDao.java +++ b/spring-boot/src/main/java/com/baeldung/graphql/PostDao.java @@ -11,16 +11,11 @@ public class PostDao { } public List getRecentPosts(int count, int offset) { - return posts.stream() - .skip(offset) - .limit(count) - .collect(Collectors.toList()); + return posts.stream().skip(offset).limit(count).collect(Collectors.toList()); } public List getAuthorPosts(String author) { - return posts.stream() - .filter(post -> author.equals(post.getAuthorId())) - .collect(Collectors.toList()); + return posts.stream().filter(post -> author.equals(post.getAuthorId())).collect(Collectors.toList()); } public void savePost(Post post) { diff --git a/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java b/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java index 59f7fd3ba5..8a0b709e69 100644 --- a/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java +++ b/spring-boot/src/main/java/com/baeldung/internationalization/config/MvcConfig.java @@ -6,14 +6,12 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; @Configuration -@EnableWebMvc @ComponentScan(basePackages = "com.baeldung.internationalization.config") public class MvcConfig extends WebMvcConfigurerAdapter { diff --git a/spring-boot/src/main/java/com/baeldung/kong/QueryController.java b/spring-boot/src/main/java/com/baeldung/kong/QueryController.java new file mode 100644 index 0000000000..ec04d0b9ce --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/kong/QueryController.java @@ -0,0 +1,31 @@ +package com.baeldung.kong; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author aiet + */ +@RestController +@RequestMapping("/stock") +public class QueryController { + + private static int REQUEST_COUNTER = 0; + + @GetMapping("/reqcount") + public int getReqCount() { + return REQUEST_COUNTER; + } + + @GetMapping("/{code}") + public String getStockPrice(@PathVariable String code) { + REQUEST_COUNTER++; + if ("BTC".equalsIgnoreCase(code)) + return "10000"; + else + return "N/A"; + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/kong/StockApp.java b/spring-boot/src/main/java/com/baeldung/kong/StockApp.java new file mode 100644 index 0000000000..f901592938 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/kong/StockApp.java @@ -0,0 +1,13 @@ +package com.baeldung.kong; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class StockApp { + + public static void main(String[] args) { + SpringApplication.run(StockApp.class, args); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java b/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java new file mode 100644 index 0000000000..3efa619409 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/rss/ArticleFeedView.java @@ -0,0 +1,54 @@ +package com.baeldung.rss; + +import com.rometools.rome.feed.rss.Channel; +import com.rometools.rome.feed.rss.Description; +import com.rometools.rome.feed.rss.Item; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.view.feed.AbstractRssFeedView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service("articleFeedView") +public class ArticleFeedView extends AbstractRssFeedView { + + protected Channel newFeed() { + Channel channel = new Channel("rss_2.0"); + channel.setLink("http://localhost:8080/rss"); + channel.setTitle("Article Feed"); + channel.setDescription("Article Feed Description"); + channel.setPubDate(new Date()); + return channel; + } + + @Override + protected List buildFeedItems(Map map, HttpServletRequest httpStRequest, HttpServletResponse httpStResponse) throws Exception { + List list = new ArrayList(); + + Item item1 = new Item(); + item1.setLink("http://www.baeldung.com/netty-exception-handling"); + item1.setTitle("Exceptions in Netty"); + Description description1 = new Description(); + description1.setValue("In this quick article, we’ll be looking at exception handling in Netty."); + item1.setDescription(description1); + item1.setPubDate(new Date()); + item1.setAuthor("Carlos"); + + Item item2 = new Item(); + item2.setLink("http://www.baeldung.com/cockroachdb-java"); + item2.setTitle("Guide to CockroachDB in Java"); + Description description2 = new Description(); + description2.setValue("This tutorial is an introductory guide to using CockroachDB with Java."); + item2.setDescription(description2); + item2.setPubDate(new Date()); + item2.setAuthor("Baeldung"); + + list.add(item1); + list.add(item2); + return list; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java b/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java new file mode 100644 index 0000000000..a3fbc4a37e --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/rss/ArticleRssController.java @@ -0,0 +1,16 @@ +package com.baeldung.rss; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping(value = "/rss", produces = "application/*") +public class ArticleRssController { + + @RequestMapping(method = RequestMethod.GET) + public String articleFeed() { + return "articleFeedView"; + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java b/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java new file mode 100644 index 0000000000..ee36ecdc51 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/rss/CustomContainer.java @@ -0,0 +1,16 @@ +package com.baeldung.rss; + +import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; +import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; +import org.springframework.stereotype.Component; + +@Component +public class CustomContainer implements EmbeddedServletContainerCustomizer { + + @Override + public void customize(ConfigurableEmbeddedServletContainer container) { + container.setPort(8080); + container.setContextPath(""); + } + +} \ No newline at end of file diff --git a/spring-boot/src/main/java/com/baeldung/rss/RssApp.java b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java new file mode 100644 index 0000000000..2add7ed421 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/rss/RssApp.java @@ -0,0 +1,20 @@ +package com.baeldung.rss; + +import com.baeldung.autoconfiguration.MySQLAutoconfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +import javax.annotation.security.RolesAllowed; + +@SpringBootApplication(exclude = MySQLAutoconfiguration.class) +@ComponentScan(basePackages = "com.baeldung.rss") +public class RssApp { + + @RolesAllowed("*") + public static void main(String[] args) { + System.setProperty("security.basic.enabled", "false"); + SpringApplication.run(RssApp.class, args); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java b/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java index 2d8298338c..8dea814bc7 100644 --- a/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java +++ b/spring-boot/src/main/java/com/baeldung/servlets/configuration/WebMvcConfigure.java @@ -28,11 +28,7 @@ public class WebMvcConfigure extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/resources/**") - .addResourceLocations("/resources/") - .setCachePeriod(3600) - .resourceChain(true) - .addResolver(new PathResourceResolver()); + registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(3600).resourceChain(true).addResolver(new PathResourceResolver()); } @Bean diff --git a/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java b/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java index 358ff5af2d..992976ca0e 100644 --- a/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java +++ b/spring-boot/src/main/java/com/baeldung/servlets/servlets/javaee/AnnotationServlet.java @@ -13,7 +13,6 @@ public class AnnotationServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - request.getRequestDispatcher("/annotationservlet.jsp") - .forward(request, response); + request.getRequestDispatcher("/annotationservlet.jsp").forward(request, response); } } diff --git a/spring-boot/src/main/java/com/baeldung/toggle/FeaturesAspect.java b/spring-boot/src/main/java/com/baeldung/toggle/FeaturesAspect.java index 9bc643fccc..ed99f65006 100644 --- a/spring-boot/src/main/java/com/baeldung/toggle/FeaturesAspect.java +++ b/spring-boot/src/main/java/com/baeldung/toggle/FeaturesAspect.java @@ -14,12 +14,10 @@ public class FeaturesAspect { @Around(value = "@within(featureAssociation) || @annotation(featureAssociation)") public Object checkAspect(ProceedingJoinPoint joinPoint, FeatureAssociation featureAssociation) throws Throwable { - if (featureAssociation.value() - .isActive()) { + if (featureAssociation.value().isActive()) { return joinPoint.proceed(); } else { - LOG.info("Feature " + featureAssociation.value() - .name() + " is not enabled!"); + LOG.info("Feature " + featureAssociation.value().name() + " is not enabled!"); return null; } } diff --git a/spring-boot/src/main/java/com/baeldung/toggle/MyFeatures.java b/spring-boot/src/main/java/com/baeldung/toggle/MyFeatures.java index b05ec2bf52..a88ec2166e 100644 --- a/spring-boot/src/main/java/com/baeldung/toggle/MyFeatures.java +++ b/spring-boot/src/main/java/com/baeldung/toggle/MyFeatures.java @@ -17,8 +17,7 @@ public enum MyFeatures implements Feature { EMPLOYEE_MANAGEMENT_FEATURE; public boolean isActive() { - return FeatureContext.getFeatureManager() - .isActive(this); + return FeatureContext.getFeatureManager().isActive(this); } } diff --git a/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java index 7c66391bd2..8c7f2f932a 100644 --- a/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java +++ b/spring-boot/src/main/java/com/baeldung/utils/controller/UtilsController.java @@ -4,7 +4,6 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; diff --git a/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java index 8704b42166..5038c7e5f7 100644 --- a/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java +++ b/spring-boot/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java @@ -2,7 +2,6 @@ package com.baeldung.webjar; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; import com.baeldung.autoconfiguration.MySQLAutoconfiguration; diff --git a/spring-boot/src/main/java/org/baeldung/Application.java b/spring-boot/src/main/java/org/baeldung/boot/Application.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/Application.java rename to spring-boot/src/main/java/org/baeldung/boot/Application.java index 1c1e466afc..78e95455b8 100644 --- a/spring-boot/src/main/java/org/baeldung/Application.java +++ b/spring-boot/src/main/java/org/baeldung/boot/Application.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot/src/main/java/org/baeldung/client/Details.java b/spring-boot/src/main/java/org/baeldung/boot/client/Details.java similarity index 93% rename from spring-boot/src/main/java/org/baeldung/client/Details.java rename to spring-boot/src/main/java/org/baeldung/boot/client/Details.java index 2ae3adc38f..1e3ddf7b21 100644 --- a/spring-boot/src/main/java/org/baeldung/client/Details.java +++ b/spring-boot/src/main/java/org/baeldung/boot/client/Details.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package org.baeldung.boot.client; public class Details { diff --git a/spring-boot/src/main/java/org/baeldung/client/DetailsServiceClient.java b/spring-boot/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java similarity index 93% rename from spring-boot/src/main/java/org/baeldung/client/DetailsServiceClient.java rename to spring-boot/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java index 51fa7c6181..f2b9d6d030 100644 --- a/spring-boot/src/main/java/org/baeldung/client/DetailsServiceClient.java +++ b/spring-boot/src/main/java/org/baeldung/boot/client/DetailsServiceClient.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package org.baeldung.boot.client; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Service; diff --git a/spring-boot/src/main/java/org/baeldung/config/H2JpaConfig.java b/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java similarity index 89% rename from spring-boot/src/main/java/org/baeldung/config/H2JpaConfig.java rename to spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java index 62791bf180..92a6ed7ab0 100644 --- a/spring-boot/src/main/java/org/baeldung/config/H2JpaConfig.java +++ b/spring-boot/src/main/java/org/baeldung/boot/config/H2JpaConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package org.baeldung.boot.config; import java.util.Properties; @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.repository", "org.baeldung.boot.repository", "org.baeldung.boot.boottest" }) +@EnableJpaRepositories(basePackages = { "org.baeldung.boot.repository", "org.baeldung.boot.boottest", "org.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") @EnableTransactionManagement public class H2JpaConfig { @@ -41,7 +41,7 @@ public class H2JpaConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.domain", "org.baeldung.boot.model", "org.baeldung.boot.boottest" }); + em.setPackagesToScan(new String[] { "org.baeldung.boot.domain", "org.baeldung.boot.model", "org.baeldung.boot.boottest", "org.baeldung.model" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/spring-boot/src/main/java/org/baeldung/config/WebConfig.java b/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java similarity index 74% rename from spring-boot/src/main/java/org/baeldung/config/WebConfig.java rename to spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java index 6609791c69..caf88c3be7 100644 --- a/spring-boot/src/main/java/org/baeldung/config/WebConfig.java +++ b/spring-boot/src/main/java/org/baeldung/boot/config/WebConfig.java @@ -1,9 +1,9 @@ -package org.baeldung.config; +package org.baeldung.boot.config; -import org.baeldung.converter.GenericBigDecimalConverter; -import org.baeldung.converter.StringToEnumConverterFactory; -import org.baeldung.converter.StringToEmployeeConverter; -import org.baeldung.web.resolver.HeaderVersionArgumentResolver; +import org.baeldung.boot.converter.GenericBigDecimalConverter; +import org.baeldung.boot.converter.StringToEmployeeConverter; +import org.baeldung.boot.converter.StringToEnumConverterFactory; +import org.baeldung.boot.web.resolver.HeaderVersionArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.method.support.HandlerMethodArgumentResolver; diff --git a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java b/spring-boot/src/main/java/org/baeldung/boot/controller/GenericEntityController.java similarity index 74% rename from spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java rename to spring-boot/src/main/java/org/baeldung/boot/controller/GenericEntityController.java index a9e7dee0b7..817bae8d01 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/GenericEntityController.java +++ b/spring-boot/src/main/java/org/baeldung/boot/controller/GenericEntityController.java @@ -1,8 +1,8 @@ -package org.baeldung.controller; +package org.baeldung.boot.controller; -import org.baeldung.domain.GenericEntity; -import org.baeldung.domain.Modes; -import org.baeldung.web.resolver.Version; +import org.baeldung.boot.domain.GenericEntity; +import org.baeldung.boot.domain.Modes; +import org.baeldung.boot.web.resolver.Version; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -39,31 +39,21 @@ public class GenericEntityController { @RequestMapping("/entity/findby/{id}") public GenericEntity findById(@PathVariable Long id) { - return entityList.stream() - .filter(entity -> entity.getId() - .equals(id)) - .findFirst() - .get(); + return entityList.stream().filter(entity -> entity.getId().equals(id)).findFirst().get(); } @GetMapping("/entity/findbydate/{date}") public GenericEntity findByDate(@PathVariable("date") LocalDateTime date) { - return entityList.stream() - .findFirst() - .get(); + return entityList.stream().findFirst().get(); } @GetMapping("/entity/findbymode/{mode}") public GenericEntity findByEnum(@PathVariable("mode") Modes mode) { - return entityList.stream() - .findFirst() - .get(); + return entityList.stream().findFirst().get(); } @GetMapping("/entity/findbyversion") public ResponseEntity findByVersion(@Version String version) { - return version != null ? new ResponseEntity(entityList.stream() - .findFirst() - .get(), HttpStatus.OK) : new ResponseEntity(HttpStatus.NOT_FOUND); + return version != null ? new ResponseEntity(entityList.stream().findFirst().get(), HttpStatus.OK) : new ResponseEntity(HttpStatus.NOT_FOUND); } } diff --git a/spring-boot/src/main/java/org/baeldung/controller/servlet/HelloWorldServlet.java b/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java similarity index 93% rename from spring-boot/src/main/java/org/baeldung/controller/servlet/HelloWorldServlet.java rename to spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java index 9adaf7fd29..34ad11254c 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/servlet/HelloWorldServlet.java +++ b/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/HelloWorldServlet.java @@ -1,43 +1,43 @@ -package org.baeldung.controller.servlet; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Objects; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class HelloWorldServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - - public HelloWorldServlet() { - super(); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - PrintWriter out = null; - try { - out = response.getWriter(); - out.println("HelloWorldServlet: GET METHOD"); - out.flush(); - } finally { - if (!Objects.isNull(out)) - out.close(); - } - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - PrintWriter out = null; - try { - out = response.getWriter(); - out.println("HelloWorldServlet: POST METHOD"); - out.flush(); - } finally { - if (!Objects.isNull(out)) - out.close(); - } - } - -} +package org.baeldung.boot.controller.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Objects; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HelloWorldServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + public HelloWorldServlet() { + super(); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + PrintWriter out = null; + try { + out = response.getWriter(); + out.println("HelloWorldServlet: GET METHOD"); + out.flush(); + } finally { + if (!Objects.isNull(out)) + out.close(); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + PrintWriter out = null; + try { + out = response.getWriter(); + out.println("HelloWorldServlet: POST METHOD"); + out.flush(); + } finally { + if (!Objects.isNull(out)) + out.close(); + } + } + +} diff --git a/spring-boot/src/main/java/org/baeldung/controller/servlet/SpringHelloWorldServlet.java b/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java similarity index 93% rename from spring-boot/src/main/java/org/baeldung/controller/servlet/SpringHelloWorldServlet.java rename to spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java index 9a62bdbbf2..91547683c6 100644 --- a/spring-boot/src/main/java/org/baeldung/controller/servlet/SpringHelloWorldServlet.java +++ b/spring-boot/src/main/java/org/baeldung/boot/controller/servlet/SpringHelloWorldServlet.java @@ -1,43 +1,43 @@ -package org.baeldung.controller.servlet; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Objects; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class SpringHelloWorldServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - - public SpringHelloWorldServlet() { - super(); - } - - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - PrintWriter out = null; - try { - out = response.getWriter(); - out.println("SpringHelloWorldServlet: GET METHOD"); - out.flush(); - } finally { - if (!Objects.isNull(out)) - out.close(); - } - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - PrintWriter out = null; - try { - out = response.getWriter(); - out.println("SpringHelloWorldServlet: POST METHOD"); - out.flush(); - } finally { - if (!Objects.isNull(out)) - out.close(); - } - } - -} +package org.baeldung.boot.controller.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Objects; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class SpringHelloWorldServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + + public SpringHelloWorldServlet() { + super(); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + PrintWriter out = null; + try { + out = response.getWriter(); + out.println("SpringHelloWorldServlet: GET METHOD"); + out.flush(); + } finally { + if (!Objects.isNull(out)) + out.close(); + } + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + PrintWriter out = null; + try { + out = response.getWriter(); + out.println("SpringHelloWorldServlet: POST METHOD"); + out.flush(); + } finally { + if (!Objects.isNull(out)) + out.close(); + } + } + +} diff --git a/spring-boot/src/main/java/org/baeldung/converter/GenericBigDecimalConverter.java b/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java similarity index 61% rename from spring-boot/src/main/java/org/baeldung/converter/GenericBigDecimalConverter.java rename to spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java index 1dbb7df6de..f756a25f67 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/GenericBigDecimalConverter.java +++ b/spring-boot/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java @@ -1,32 +1,28 @@ -package org.baeldung.converter; +package org.baeldung.boot.converter; import com.google.common.collect.ImmutableSet; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.GenericConverter; import java.math.BigDecimal; -import java.math.MathContext; import java.util.Set; public class GenericBigDecimalConverter implements GenericConverter { @Override - public Set getConvertibleTypes () { + public Set getConvertibleTypes() { - ConvertiblePair[] pairs = new ConvertiblePair[] { - new ConvertiblePair(Number.class, BigDecimal.class), - new ConvertiblePair(String.class, BigDecimal.class)}; + ConvertiblePair[] pairs = new ConvertiblePair[] { new ConvertiblePair(Number.class, BigDecimal.class), new ConvertiblePair(String.class, BigDecimal.class) }; return ImmutableSet.copyOf(pairs); } @Override - public Object convert (Object source, TypeDescriptor sourceType, - TypeDescriptor targetType) { + public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (sourceType.getType() == BigDecimal.class) { return source; } - if(sourceType.getType() == String.class) { + if (sourceType.getType() == String.class) { String number = (String) source; return new BigDecimal(number); } else { diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToEmployeeConverter.java b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java similarity index 90% rename from spring-boot/src/main/java/org/baeldung/converter/StringToEmployeeConverter.java rename to spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java index 5f680972b7..b07e11e01a 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/StringToEmployeeConverter.java +++ b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java @@ -1,5 +1,4 @@ -package org.baeldung.converter; - +package org.baeldung.boot.converter; import com.baeldung.toggle.Employee; import org.springframework.core.convert.converter.Converter; diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java rename to spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java index 17c6fd06de..6fa51bfdcc 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/StringToEnumConverterFactory.java +++ b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToEnumConverterFactory.java @@ -1,4 +1,4 @@ -package org.baeldung.converter; +package org.baeldung.boot.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; diff --git a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java similarity index 92% rename from spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java rename to spring-boot/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java index cbb9e6ddb4..8a08b438f2 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/StringToLocalDateTimeConverter.java +++ b/spring-boot/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java @@ -1,4 +1,4 @@ -package org.baeldung.converter; +package org.baeldung.boot.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; diff --git a/spring-boot/src/main/java/org/baeldung/converter/controller/StringToEmployeeConverterController.java b/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java similarity index 82% rename from spring-boot/src/main/java/org/baeldung/converter/controller/StringToEmployeeConverterController.java rename to spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java index edd56dc136..a6e0400845 100644 --- a/spring-boot/src/main/java/org/baeldung/converter/controller/StringToEmployeeConverterController.java +++ b/spring-boot/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java @@ -1,7 +1,6 @@ -package org.baeldung.converter.controller; +package org.baeldung.boot.converter.controller; import com.baeldung.toggle.Employee; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/spring-boot/src/main/java/org/baeldung/domain/GenericEntity.java b/spring-boot/src/main/java/org/baeldung/boot/domain/GenericEntity.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/domain/GenericEntity.java rename to spring-boot/src/main/java/org/baeldung/boot/domain/GenericEntity.java index 7b1d27cb66..f1c936e432 100644 --- a/spring-boot/src/main/java/org/baeldung/domain/GenericEntity.java +++ b/spring-boot/src/main/java/org/baeldung/boot/domain/GenericEntity.java @@ -1,4 +1,4 @@ -package org.baeldung.domain; +package org.baeldung.boot.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/org/baeldung/domain/Modes.java b/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java similarity index 54% rename from spring-boot/src/main/java/org/baeldung/domain/Modes.java rename to spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java index 473406ef26..dcba064e8c 100644 --- a/spring-boot/src/main/java/org/baeldung/domain/Modes.java +++ b/spring-boot/src/main/java/org/baeldung/boot/domain/Modes.java @@ -1,4 +1,4 @@ -package org.baeldung.domain; +package org.baeldung.boot.domain; public enum Modes { diff --git a/spring-boot/src/main/java/org/baeldung/jsoncomponent/User.java b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/User.java similarity index 86% rename from spring-boot/src/main/java/org/baeldung/jsoncomponent/User.java rename to spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/User.java index 8961874526..1f14131300 100644 --- a/spring-boot/src/main/java/org/baeldung/jsoncomponent/User.java +++ b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/User.java @@ -1,4 +1,4 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import javafx.scene.paint.Color; diff --git a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserCombinedSerializer.java b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserCombinedSerializer.java similarity index 93% rename from spring-boot/src/main/java/org/baeldung/jsoncomponent/UserCombinedSerializer.java rename to spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserCombinedSerializer.java index cb1b838ca4..f4d7505342 100644 --- a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserCombinedSerializer.java +++ b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserCombinedSerializer.java @@ -1,4 +1,4 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -36,8 +36,7 @@ public class UserCombinedSerializer { public static class UserJsonDeserializer extends JsonDeserializer { @Override public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - TreeNode treeNode = jsonParser.getCodec() - .readTree(jsonParser); + TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser); TextNode favoriteColor = (TextNode) treeNode.get("favoriteColor"); return new User(Color.web(favoriteColor.asText())); } diff --git a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonDeserializer.java b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializer.java similarity index 87% rename from spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonDeserializer.java rename to spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializer.java index a310dcba5a..f7bd822c8a 100644 --- a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonDeserializer.java +++ b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializer.java @@ -1,4 +1,4 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; @@ -15,8 +15,7 @@ import java.io.IOException; public class UserJsonDeserializer extends JsonDeserializer { @Override public User deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - TreeNode treeNode = jsonParser.getCodec() - .readTree(jsonParser); + TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser); TextNode favoriteColor = (TextNode) treeNode.get("favoriteColor"); return new User(Color.web(favoriteColor.asText())); } diff --git a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonSerializer.java b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonSerializer.java similarity index 96% rename from spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonSerializer.java rename to spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonSerializer.java index 845bc3aac5..03330d81a4 100644 --- a/spring-boot/src/main/java/org/baeldung/jsoncomponent/UserJsonSerializer.java +++ b/spring-boot/src/main/java/org/baeldung/boot/jsoncomponent/UserJsonSerializer.java @@ -1,4 +1,4 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/spring-boot/src/main/java/org/baeldung/monitor/jmx/MonitoringConfig.java b/spring-boot/src/main/java/org/baeldung/boot/monitor/jmx/MonitoringConfig.java similarity index 87% rename from spring-boot/src/main/java/org/baeldung/monitor/jmx/MonitoringConfig.java rename to spring-boot/src/main/java/org/baeldung/boot/monitor/jmx/MonitoringConfig.java index 40f36ef924..28c6ac5953 100644 --- a/spring-boot/src/main/java/org/baeldung/monitor/jmx/MonitoringConfig.java +++ b/spring-boot/src/main/java/org/baeldung/boot/monitor/jmx/MonitoringConfig.java @@ -1,22 +1,21 @@ -package org.baeldung.monitor.jmx; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.codahale.metrics.JmxReporter; -import com.codahale.metrics.MetricRegistry; - -@Configuration -public class MonitoringConfig { - @Autowired - private MetricRegistry registry; - - @Bean - public JmxReporter jmxReporter() { - JmxReporter reporter = JmxReporter.forRegistry(registry) - .build(); - reporter.start(); - return reporter; - } -} +package org.baeldung.boot.monitor.jmx; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.codahale.metrics.JmxReporter; +import com.codahale.metrics.MetricRegistry; + +@Configuration +public class MonitoringConfig { + @Autowired + private MetricRegistry registry; + + @Bean + public JmxReporter jmxReporter() { + JmxReporter reporter = JmxReporter.forRegistry(registry).build(); + reporter.start(); + return reporter; + } +} diff --git a/spring-boot/src/main/java/org/baeldung/repository/GenericEntityRepository.java b/spring-boot/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java similarity index 64% rename from spring-boot/src/main/java/org/baeldung/repository/GenericEntityRepository.java rename to spring-boot/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java index 7bb1e6dcdc..d897e17afe 100644 --- a/spring-boot/src/main/java/org/baeldung/repository/GenericEntityRepository.java +++ b/spring-boot/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.repository; +package org.baeldung.boot.repository; -import org.baeldung.domain.GenericEntity; +import org.baeldung.boot.domain.GenericEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface GenericEntityRepository extends JpaRepository { diff --git a/spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java b/spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java deleted file mode 100644 index 3a419a65bd..0000000000 --- a/spring-boot/src/main/java/org/baeldung/boot/repository/UserRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.baeldung.boot.repository; - -import org.baeldung.boot.model.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository("userRepository") -public interface UserRepository extends JpaRepository { - public int countByStatus(int status); -} diff --git a/spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java b/spring-boot/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java similarity index 96% rename from spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java rename to spring-boot/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java index 89a77f38d1..b3a0dba7e8 100644 --- a/spring-boot/src/main/java/org/baeldung/web/resolver/HeaderVersionArgumentResolver.java +++ b/spring-boot/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java @@ -1,4 +1,4 @@ -package org.baeldung.web.resolver; +package org.baeldung.boot.web.resolver; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; diff --git a/spring-boot/src/main/java/org/baeldung/web/resolver/Version.java b/spring-boot/src/main/java/org/baeldung/boot/web/resolver/Version.java similarity index 86% rename from spring-boot/src/main/java/org/baeldung/web/resolver/Version.java rename to spring-boot/src/main/java/org/baeldung/boot/web/resolver/Version.java index 2a9e6e60b3..f69d40510e 100644 --- a/spring-boot/src/main/java/org/baeldung/web/resolver/Version.java +++ b/spring-boot/src/main/java/org/baeldung/boot/web/resolver/Version.java @@ -1,4 +1,4 @@ -package org.baeldung.web.resolver; +package org.baeldung.boot.web.resolver; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java b/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java rename to spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java index cb269f77f1..c4b0d48244 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/DemoApplication.java +++ b/spring-boot/src/main/java/org/baeldung/demo/DemoApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.boot; +package org.baeldung.demo; import com.baeldung.graphql.GraphqlConfiguration; import org.springframework.boot.SpringApplication; diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java b/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java rename to spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java index a805e8f5fe..c1dd109f91 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/Employee.java +++ b/spring-boot/src/main/java/org/baeldung/demo/boottest/Employee.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java similarity index 91% rename from spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java rename to spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java index 98d1c33212..d991d9a8a9 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRepository.java +++ b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRepository.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java similarity index 96% rename from spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java rename to spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java index 1bfde0f0bd..516bff0e8c 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeRestController.java +++ b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeRestController.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java similarity index 89% rename from spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java rename to spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java index 13b5ca56e0..07765a511c 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeService.java +++ b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeService.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java similarity index 96% rename from spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java rename to spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java index 3fbfa92bc8..bd85234e02 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/boottest/EmployeeServiceImpl.java +++ b/spring-boot/src/main/java/org/baeldung/demo/boottest/EmployeeServiceImpl.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import java.util.List; diff --git a/spring-boot/src/main/java/org/baeldung/boot/components/FooService.java b/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java similarity index 76% rename from spring-boot/src/main/java/org/baeldung/boot/components/FooService.java rename to spring-boot/src/main/java/org/baeldung/demo/components/FooService.java index 4ff8e9fdd4..334730ccb0 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/components/FooService.java +++ b/spring-boot/src/main/java/org/baeldung/demo/components/FooService.java @@ -1,7 +1,7 @@ -package org.baeldung.boot.components; +package org.baeldung.demo.components; -import org.baeldung.boot.model.Foo; -import org.baeldung.boot.repository.FooRepository; +import org.baeldung.demo.model.Foo; +import org.baeldung.demo.repository.FooRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java b/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java similarity index 85% rename from spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java rename to spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java index e03b859eab..51dd7bbd44 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/exceptions/CommonException.java +++ b/spring-boot/src/main/java/org/baeldung/demo/exceptions/CommonException.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.exceptions; +package org.baeldung.demo.exceptions; public class CommonException extends RuntimeException { diff --git a/spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java b/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java similarity index 86% rename from spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java rename to spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java index 0b04bd2759..59796c58f0 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/exceptions/FooNotFoundException.java +++ b/spring-boot/src/main/java/org/baeldung/demo/exceptions/FooNotFoundException.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.exceptions; +package org.baeldung.demo.exceptions; public class FooNotFoundException extends RuntimeException { diff --git a/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java b/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/boot/model/Foo.java rename to spring-boot/src/main/java/org/baeldung/demo/model/Foo.java index d373e25b85..e5638cfd3d 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/model/Foo.java +++ b/spring-boot/src/main/java/org/baeldung/demo/model/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.model; +package org.baeldung.demo.model; import java.io.Serializable; diff --git a/spring-boot/src/main/java/org/baeldung/boot/repository/FooRepository.java b/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java similarity index 70% rename from spring-boot/src/main/java/org/baeldung/boot/repository/FooRepository.java rename to spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java index 09d6975dba..c04e0c7438 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/repository/FooRepository.java +++ b/spring-boot/src/main/java/org/baeldung/demo/repository/FooRepository.java @@ -1,6 +1,6 @@ -package org.baeldung.boot.repository; +package org.baeldung.demo.repository; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; import org.springframework.data.jpa.repository.JpaRepository; public interface FooRepository extends JpaRepository { diff --git a/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java b/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java similarity index 85% rename from spring-boot/src/main/java/org/baeldung/boot/service/FooController.java rename to spring-boot/src/main/java/org/baeldung/demo/service/FooController.java index d400c3bf9e..c28dcde1a7 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/service/FooController.java +++ b/spring-boot/src/main/java/org/baeldung/demo/service/FooController.java @@ -1,7 +1,7 @@ -package org.baeldung.boot.service; +package org.baeldung.demo.service; -import org.baeldung.boot.components.FooService; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.components.FooService; +import org.baeldung.demo.model.Foo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-boot/src/main/java/org/baeldung/endpoints/MyHealthCheck.java b/spring-boot/src/main/java/org/baeldung/endpoints/MyHealthCheck.java index 68fbffda6e..1a175aed48 100644 --- a/spring-boot/src/main/java/org/baeldung/endpoints/MyHealthCheck.java +++ b/spring-boot/src/main/java/org/baeldung/endpoints/MyHealthCheck.java @@ -10,13 +10,9 @@ public class MyHealthCheck implements HealthIndicator { public Health health() { int errorCode = check(); // perform some specific health check if (errorCode != 0) { - return Health.down() - .withDetail("Error Code", errorCode) - .withDetail("Description", "You custom MyHealthCheck endpoint is down") - .build(); + return Health.down().withDetail("Error Code", errorCode).withDetail("Description", "You custom MyHealthCheck endpoint is down").build(); } - return Health.up() - .build(); + return Health.up().build(); } public int check() { diff --git a/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java b/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java index 790584644f..34b50a2c0a 100644 --- a/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java +++ b/spring-boot/src/main/java/org/baeldung/endpoints/info/TotalUsersInfoContributor.java @@ -3,7 +3,7 @@ package org.baeldung.endpoints.info; import java.util.HashMap; import java.util.Map; -import org.baeldung.boot.repository.UserRepository; +import org.baeldung.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; diff --git a/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java b/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java index 2d118b0eae..5cc697be65 100644 --- a/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java +++ b/spring-boot/src/main/java/org/baeldung/main/SpringBootApplication.java @@ -1,9 +1,9 @@ package org.baeldung.main; +import org.baeldung.boot.controller.servlet.HelloWorldServlet; +import org.baeldung.boot.controller.servlet.SpringHelloWorldServlet; import org.baeldung.common.error.SpringHelloServletRegistrationBean; import org.baeldung.common.resources.ExecutorServiceExitCodeGenerator; -import org.baeldung.controller.servlet.HelloWorldServlet; -import org.baeldung.controller.servlet.SpringHelloWorldServlet; import org.baeldung.service.LoginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -21,7 +21,7 @@ import java.util.concurrent.Executors; @RestController @EnableAutoConfiguration(exclude = MySQLAutoconfiguration.class) -@ComponentScan({ "org.baeldung.common.error", "org.baeldung.common.error.controller", "org.baeldung.common.properties", "org.baeldung.common.resources", "org.baeldung.endpoints", "org.baeldung.service", "org.baeldung.monitor.jmx", "org.baeldung.service" }) +@ComponentScan({ "org.baeldung.common.error", "org.baeldung.common.error.controller", "org.baeldung.common.properties", "org.baeldung.common.resources", "org.baeldung.endpoints", "org.baeldung.service", "org.baeldung.monitor.jmx", "org.baeldung.boot.config" }) public class SpringBootApplication { private static ApplicationContext applicationContext; diff --git a/spring-boot/src/main/java/org/baeldung/boot/model/User.java b/spring-boot/src/main/java/org/baeldung/model/User.java similarity index 95% rename from spring-boot/src/main/java/org/baeldung/boot/model/User.java rename to spring-boot/src/main/java/org/baeldung/model/User.java index f60ac86fe4..61936584c4 100644 --- a/spring-boot/src/main/java/org/baeldung/boot/model/User.java +++ b/spring-boot/src/main/java/org/baeldung/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.model; +package org.baeldung.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java new file mode 100644 index 0000000000..c9a06b5bab --- /dev/null +++ b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.repository; + +import org.baeldung.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; + +@Repository("userRepository") +public interface UserRepository extends JpaRepository { + + int countByStatus(int status); + + Optional findOneByName(String name); + + Stream findAllByName(String name); + + @Async + CompletableFuture findOneByStatus(Integer status); + +} diff --git a/spring-boot/src/main/java/org/baeldung/service/LoginServiceImpl.java b/spring-boot/src/main/java/org/baeldung/service/LoginServiceImpl.java index 6d89f7f695..ed0090f8e4 100644 --- a/spring-boot/src/main/java/org/baeldung/service/LoginServiceImpl.java +++ b/spring-boot/src/main/java/org/baeldung/service/LoginServiceImpl.java @@ -16,8 +16,7 @@ public class LoginServiceImpl implements LoginService { public boolean login(String userName, char[] password) { boolean success; - if (userName.equals("admin") && "secret".toCharArray() - .equals(password)) { + if (userName.equals("admin") && "secret".toCharArray().equals(password)) { counterService.increment("counter.login.success"); success = true; } else { diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java index c0cc669420..70c68368b5 100644 --- a/spring-boot/src/main/java/org/baeldung/session/exception/Application.java +++ b/spring-boot/src/main/java/org/baeldung/session/exception/Application.java @@ -1,6 +1,6 @@ package org.baeldung.session.exception; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java index 679d691b26..ce7bbfe57b 100644 --- a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java +++ b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepository.java @@ -1,6 +1,6 @@ package org.baeldung.session.exception.repository; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; public interface FooRepository { diff --git a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java index 36d87e6dad..52407a2117 100644 --- a/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java +++ b/spring-boot/src/main/java/org/baeldung/session/exception/repository/FooRepositoryImpl.java @@ -1,6 +1,6 @@ package org.baeldung.session.exception.repository; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; @@ -14,14 +14,12 @@ public class FooRepositoryImpl implements FooRepository { @Override public void save(Foo foo) { - sessionFactory.getCurrentSession() - .saveOrUpdate(foo); + sessionFactory.getCurrentSession().saveOrUpdate(foo); } @Override public Foo get(Integer id) { - return sessionFactory.getCurrentSession() - .get(Foo.class, id); + return sessionFactory.getCurrentSession().get(Foo.class, id); } } \ No newline at end of file diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot/src/main/resources/application.properties index 458b4e0d46..059a6c96be 100644 --- a/spring-boot/src/main/resources/application.properties +++ b/spring-boot/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.port=8080 +server.port=9090 server.contextPath=/springbootapp management.port=8081 management.address=127.0.0.1 diff --git a/spring-boot/src/test/resources/persistence-generic-entity.properties b/spring-boot/src/main/resources/persistence-generic-entity.properties similarity index 100% rename from spring-boot/src/test/resources/persistence-generic-entity.properties rename to spring-boot/src/main/resources/persistence-generic-entity.properties diff --git a/spring-boot/src/main/resources/static/internationalization.js b/spring-boot/src/main/resources/static/internationalization.js new file mode 100644 index 0000000000..ae416f083d --- /dev/null +++ b/spring-boot/src/main/resources/static/internationalization.js @@ -0,0 +1,8 @@ +$(document).ready(function() { + $("#locales").change(function () { + var selectedOption = $('#locales').val(); + if (selectedOption != ''){ + window.location.replace('international?lang=' + selectedOption); + } + }); +}); \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/international.html b/spring-boot/src/main/resources/templates/international.html index a2a5fbb591..e0cfb5143b 100644 --- a/spring-boot/src/main/resources/templates/international.html +++ b/spring-boot/src/main/resources/templates/international.html @@ -4,16 +4,7 @@ Home - +

diff --git a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java index b2b14f766e..6d958ea637 100644 --- a/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/annotation/servletcomponentscan/SpringBootWithServletComponentIntegrationTest.java @@ -40,8 +40,7 @@ public class SpringBootWithServletComponentIntegrationTest { FilterRegistration filterRegistration = servletContext.getFilterRegistration("hello filter"); assertNotNull(filterRegistration); - assertTrue(filterRegistration.getServletNameMappings() - .contains("echo servlet")); + assertTrue(filterRegistration.getServletNameMappings().contains("echo servlet")); } @Autowired diff --git a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java index 8bd9c20c5e..afe7f8df31 100644 --- a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java @@ -60,11 +60,8 @@ public class DisplayBeanIntegrationTest { @SuppressWarnings("rawtypes") ResponseEntity entity = this.testRestTemplate.getForEntity("http://localhost:" + this.mgt + "/springbeans", List.class); - List> allBeans = (List) ((Map) entity.getBody() - .get(0)).get("beans"); - List beanNamesList = allBeans.stream() - .map(x -> (String) x.get("bean")) - .collect(Collectors.toList()); + List> allBeans = (List) ((Map) entity.getBody().get(0)).get("beans"); + List beanNamesList = allBeans.stream().map(x -> (String) x.get("bean")).collect(Collectors.toList()); assertThat(beanNamesList, hasItem("fooController")); assertThat(beanNamesList, hasItem("fooService")); diff --git a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java index 4856c17c7d..2c0152b97f 100644 --- a/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java +++ b/spring-boot/src/test/java/com/baeldung/intro/AppLiveTest.java @@ -26,18 +26,12 @@ public class AppLiveTest { @Test public void getIndex() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("Index Page"))); + mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("Index Page"))); } @Test public void getLocal() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/local") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(content().string(equalTo("/local"))); + mvc.perform(MockMvcRequestBuilders.get("/local").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(equalTo("/local"))); } } \ No newline at end of file diff --git a/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java b/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java new file mode 100644 index 0000000000..5cf19dd1db --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/KongAdminAPILiveTest.java @@ -0,0 +1,166 @@ +package com.baeldung.kong; + +import com.baeldung.kong.domain.APIObject; +import com.baeldung.kong.domain.ConsumerObject; +import com.baeldung.kong.domain.KeyAuthObject; +import com.baeldung.kong.domain.PluginObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.test.context.junit4.SpringRunner; + +import java.net.URI; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; + +/** + * @author aiet + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class) +public class KongAdminAPILiveTest { + + private String getStockPrice(String code) { + try { + return restTemplate.getForObject(new URI("http://localhost:8080/stock/" + code), String.class); + } catch (Exception ignored) { + } + return null; + } + + @Before + public void init() { + System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); + } + + @Autowired + TestRestTemplate restTemplate; + + @Test + public void givenEndpoint_whenQueryStockPrice_thenPriceCorrect() { + String response = getStockPrice("btc"); + assertEquals("10000", response); + + response = getStockPrice("eth"); + assertEquals("N/A", response); + } + + @Test + public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception { + restTemplate.delete("http://localhost:8001/apis/stock-api"); + + APIObject stockAPI = new APIObject("stock-api", "stock.api", "http://localhost:8080", "/"); + HttpEntity apiEntity = new HttpEntity<>(stockAPI); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + + assertEquals(HttpStatus.CREATED, addAPIResp.getStatusCode()); + + addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + assertEquals(HttpStatus.CONFLICT, addAPIResp.getStatusCode()); + String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + + assertTrue(apiListResp.contains("stock-api")); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Host", "stock.api"); + RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc")); + ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class); + + assertEquals("10000", stockPriceResp.getBody()); + } + + @Test + public void givenKongAdminAPI_whenAddAPIConsumer_thenAdded() { + restTemplate.delete("http://localhost:8001/consumers/eugenp"); + + ConsumerObject consumer = new ConsumerObject("eugenp"); + HttpEntity addConsumerEntity = new HttpEntity<>(consumer); + ResponseEntity addConsumerResp = restTemplate.postForEntity("http://localhost:8001/consumers/", addConsumerEntity, String.class); + + assertEquals(HttpStatus.CREATED, addConsumerResp.getStatusCode()); + + addConsumerResp = restTemplate.postForEntity("http://localhost:8001/consumers", addConsumerEntity, String.class); + assertEquals(HttpStatus.CONFLICT, addConsumerResp.getStatusCode()); + + String consumerListResp = restTemplate.getForObject("http://localhost:8001/consumers/", String.class); + assertTrue(consumerListResp.contains("eugenp")); + } + + @Test + public void givenAPI_whenEnableAuth_thenAnonymousDenied() throws Exception { + String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + if (!apiListResp.contains("stock-api")) { + givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong(); + } + + PluginObject authPlugin = new PluginObject("key-auth"); + ResponseEntity enableAuthResp = restTemplate.postForEntity("http://localhost:8001/apis/stock-api/plugins", new HttpEntity<>(authPlugin), String.class); + + assertTrue(HttpStatus.CREATED == enableAuthResp.getStatusCode() || HttpStatus.CONFLICT == enableAuthResp.getStatusCode()); + + String pluginsResp = restTemplate.getForObject("http://localhost:8001/apis/stock-api/plugins", String.class); + assertTrue(pluginsResp.contains("key-auth")); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Host", "stock.api"); + RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc")); + ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class); + assertEquals(HttpStatus.UNAUTHORIZED, stockPriceResp.getStatusCode()); + } + + @Test + public void givenAPIAuthEnabled_whenAddKey_thenAccessAllowed() throws Exception { + String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class); + if (!apiListResp.contains("stock-api")) { + givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong(); + } + + String consumerListResp = restTemplate.getForObject("http://localhost:8001/consumers/", String.class); + if (!consumerListResp.contains("eugenp")) { + givenKongAdminAPI_whenAddAPIConsumer_thenAdded(); + } + + final String consumerKey = "eugenp.pass"; + KeyAuthObject keyAuth = new KeyAuthObject(consumerKey); + ResponseEntity keyAuthResp = restTemplate.postForEntity("http://localhost:8001/consumers/eugenp/key-auth", new HttpEntity<>(keyAuth), String.class); + + assertTrue(HttpStatus.CREATED == keyAuthResp.getStatusCode() || HttpStatus.CONFLICT == keyAuthResp.getStatusCode()); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Host", "stock.api"); + headers.set("apikey", consumerKey); + RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc")); + ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class); + + assertEquals("10000", stockPriceResp.getBody()); + + headers.set("apikey", "wrongpass"); + requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc")); + stockPriceResp = restTemplate.exchange(requestEntity, String.class); + assertEquals(HttpStatus.FORBIDDEN, stockPriceResp.getStatusCode()); + } + + @Test + public void givenAdminAPIProxy_whenAddAPIViaProxy_thenAPIAdded() throws Exception { + APIObject adminAPI = new APIObject("admin-api", "admin.api", "http://localhost:8001", "/admin-api"); + HttpEntity apiEntity = new HttpEntity<>(adminAPI); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + + assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Host", "admin.api"); + APIObject baeldungAPI = new APIObject("baeldung-api", "baeldung.com", "http://ww.baeldung.com", "/"); + RequestEntity requestEntity = new RequestEntity<>(baeldungAPI, headers, HttpMethod.POST, new URI("http://localhost:8000/admin-api/apis")); + addAPIResp = restTemplate.exchange(requestEntity, String.class); + + assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); + } + +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java b/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java new file mode 100644 index 0000000000..abc7151720 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/KongLoadBalanceLiveTest.java @@ -0,0 +1,69 @@ +package com.baeldung.kong; + +import com.baeldung.kong.domain.APIObject; +import com.baeldung.kong.domain.TargetObject; +import com.baeldung.kong.domain.UpstreamObject; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.*; +import org.springframework.test.context.junit4.SpringRunner; + +import java.net.URI; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; + +/** + * @author aiet + */ +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class) +public class KongLoadBalanceLiveTest { + + @Before + public void init() { + System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); + } + + @Autowired + TestRestTemplate restTemplate; + + @Test + public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception { + UpstreamObject upstream = new UpstreamObject("stock.api.service"); + ResponseEntity addUpstreamResp = restTemplate.postForEntity("http://localhost:8001/upstreams", new HttpEntity<>(upstream), String.class); + assertTrue(HttpStatus.CREATED == addUpstreamResp.getStatusCode() || HttpStatus.CONFLICT == addUpstreamResp.getStatusCode()); + + TargetObject testTarget = new TargetObject("localhost:8080", 10); + ResponseEntity addTargetResp = restTemplate.postForEntity("http://localhost:8001/upstreams/stock.api.service/targets", new HttpEntity<>(testTarget), String.class); + assertTrue(HttpStatus.CREATED == addTargetResp.getStatusCode() || HttpStatus.CONFLICT == addTargetResp.getStatusCode()); + + TargetObject releaseTarget = new TargetObject("localhost:9090", 40); + addTargetResp = restTemplate.postForEntity("http://localhost:8001/upstreams/stock.api.service/targets", new HttpEntity<>(releaseTarget), String.class); + assertTrue(HttpStatus.CREATED == addTargetResp.getStatusCode() || HttpStatus.CONFLICT == addTargetResp.getStatusCode()); + + APIObject stockAPI = new APIObject("balanced-stock-api", "balanced.stock.api", "http://stock.api.service", "/"); + HttpEntity apiEntity = new HttpEntity<>(stockAPI); + ResponseEntity addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class); + assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode()); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Host", "balanced.stock.api"); + for (int i = 0; i < 1000; i++) { + RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc")); + ResponseEntity stockPriceResp = restTemplate.exchange(requestEntity, String.class); + assertEquals("10000", stockPriceResp.getBody()); + } + + int releaseCount = restTemplate.getForObject("http://localhost:9090/stock/reqcount", Integer.class); + int testCount = restTemplate.getForObject("http://localhost:8080/stock/reqcount", Integer.class); + + assertTrue(Math.round(releaseCount * 1.0 / testCount) == 4); + } + +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/APIObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/APIObject.java new file mode 100644 index 0000000000..f386712444 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/APIObject.java @@ -0,0 +1,54 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class APIObject { + + public APIObject() { + } + + public APIObject(String name, String hosts, String upstream_url, String uris) { + this.name = name; + this.hosts = hosts; + this.upstream_url = upstream_url; + this.uris = uris; + } + + private String name; + private String hosts; + private String upstream_url; + private String uris; + + public String getUris() { + return uris; + } + + public void setUris(String uris) { + this.uris = uris; + } + + public String getUpstream_url() { + return upstream_url; + } + + public void setUpstream_url(String upstream_url) { + this.upstream_url = upstream_url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHosts() { + return hosts; + } + + public void setHosts(String hosts) { + this.hosts = hosts; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/ConsumerObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/ConsumerObject.java new file mode 100644 index 0000000000..74bef8f2d1 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/ConsumerObject.java @@ -0,0 +1,35 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class ConsumerObject { + + private String username; + private String custom_id; + + public ConsumerObject(String username) { + this.username = username; + } + + public ConsumerObject(String username, String custom_id) { + this.username = username; + this.custom_id = custom_id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getCustom_id() { + return custom_id; + } + + public void setCustom_id(String custom_id) { + this.custom_id = custom_id; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/KeyAuthObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/KeyAuthObject.java new file mode 100644 index 0000000000..80de6bfcd9 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/KeyAuthObject.java @@ -0,0 +1,21 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class KeyAuthObject { + + public KeyAuthObject(String key) { + this.key = key; + } + + private String key; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/PluginObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/PluginObject.java new file mode 100644 index 0000000000..c161fc9b54 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/PluginObject.java @@ -0,0 +1,30 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class PluginObject { + + private String name; + private String consumer_id; + + public PluginObject(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getConsumer_id() { + return consumer_id; + } + + public void setConsumer_id(String consumer_id) { + this.consumer_id = consumer_id; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/TargetObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/TargetObject.java new file mode 100644 index 0000000000..79653e2846 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/TargetObject.java @@ -0,0 +1,31 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class TargetObject { + + public TargetObject(String target, int weight) { + this.target = target; + this.weight = weight; + } + + private String target; + private int weight; + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/kong/domain/UpstreamObject.java b/spring-boot/src/test/java/com/baeldung/kong/domain/UpstreamObject.java new file mode 100644 index 0000000000..6461381ac5 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/kong/domain/UpstreamObject.java @@ -0,0 +1,21 @@ +package com.baeldung.kong.domain; + +/** + * @author aiet + */ +public class UpstreamObject { + + public UpstreamObject(String name) { + this.name = name; + } + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot/src/test/java/com/baeldung/toggle/ToggleIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/toggle/ToggleIntegrationTest.java index 5b70fa3cbe..ca6230e8f5 100644 --- a/spring-boot/src/test/java/com/baeldung/toggle/ToggleIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/toggle/ToggleIntegrationTest.java @@ -35,8 +35,7 @@ public class ToggleIntegrationTest { @Before public void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) - .build(); + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test @@ -46,8 +45,7 @@ public class ToggleIntegrationTest { System.setProperty("employee.feature", "false"); - mockMvc.perform(post("/increaseSalary").param("id", emp.getId() + "")) - .andExpect(status().is(200)); + mockMvc.perform(post("/increaseSalary").param("id", emp.getId() + "")).andExpect(status().is(200)); emp = employeeRepository.findOne(1L); assertEquals("salary incorrect", 2000, emp.getSalary(), 0.5); @@ -60,8 +58,7 @@ public class ToggleIntegrationTest { System.setProperty("employee.feature", "true"); - mockMvc.perform(post("/increaseSalary").param("id", emp.getId() + "")) - .andExpect(status().is(200)); + mockMvc.perform(post("/increaseSalary").param("id", emp.getId() + "")).andExpect(status().is(200)); emp = employeeRepository.findOne(1L); assertEquals("salary incorrect", 2200, emp.getSalary(), 0.5); diff --git a/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java index 5a80e13791..080f660c40 100644 --- a/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/utils/UtilsControllerIntegrationTest.java @@ -21,17 +21,14 @@ public class UtilsControllerIntegrationTest { @Before public void setup() { MockitoAnnotations.initMocks(this); - this.mockMvc = MockMvcBuilders.standaloneSetup(utilsController) - .build(); + this.mockMvc = MockMvcBuilders.standaloneSetup(utilsController).build(); } @Test public void givenParameter_setRequestParam_andSetSessionAttribute() throws Exception { String param = "testparam"; - this.mockMvc.perform(post("/setParam").param("param", param) - .sessionAttr("parameter", param)) - .andExpect(status().isOk()); + this.mockMvc.perform(post("/setParam").param("param", param).sessionAttr("parameter", param)).andExpect(status().isOk()); } } diff --git a/spring-boot/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java index 4dc4793ce2..bb1b5e254e 100644 --- a/spring-boot/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/websocket/client/MyStompSessionHandlerIntegrationTest.java @@ -14,9 +14,7 @@ public class MyStompSessionHandlerIntegrationTest { StompHeaders mockHeader = Mockito.mock(StompHeaders.class); MyStompSessionHandler sessionHandler = new MyStompSessionHandler(); sessionHandler.afterConnected(mockSession, mockHeader); - Mockito.verify(mockSession) - .subscribe("/topic/messages", sessionHandler); - Mockito.verify(mockSession) - .send(Mockito.anyString(), Mockito.anyObject()); + Mockito.verify(mockSession).subscribe("/topic/messages", sessionHandler); + Mockito.verify(mockSession).send(Mockito.anyString(), Mockito.anyObject()); } } diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java index 358ba942d9..5627543b62 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java @@ -1,6 +1,7 @@ package org.baeldung; -import org.baeldung.domain.Modes; +import org.baeldung.boot.Application; +import org.baeldung.boot.domain.Modes; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -33,56 +34,36 @@ public class SpringBootApplicationIntegrationTest { @Before public void setupMockMvc() { - mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) - .build(); + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")) - .andExpect(MockMvcResultMatchers.status() - .isOk()) - .andExpect(MockMvcResultMatchers.content() - .contentType(contentType)) - .andExpect(jsonPath("$", hasSize(4))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)).andExpect(jsonPath("$", hasSize(4))); } @Test public void givenRequestHasBeenMade_whenMeetsFindByDateOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbydate/{date}", "2011-12-03T10:15:30")) - .andExpect(MockMvcResultMatchers.status() - .isOk()) - .andExpect(MockMvcResultMatchers.content() - .contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbydate/{date}", "2011-12-03T10:15:30")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); } @Test public void givenRequestHasBeenMade_whenMeetsFindByModeOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())) - .andExpect(MockMvcResultMatchers.status() - .isOk()) - .andExpect(MockMvcResultMatchers.content() - .contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbymode/{mode}", Modes.ALPHA.name())).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)).andExpect(jsonPath("$.id", equalTo(1))); } @Test public void givenRequestHasBeenMade_whenMeetsFindByVersionOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); - mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbyversion") - .header("Version", "1.0.0")) - .andExpect(MockMvcResultMatchers.status() - .isOk()) - .andExpect(MockMvcResultMatchers.content() - .contentType(contentType)) - .andExpect(jsonPath("$.id", equalTo(1))); + mockMvc.perform(MockMvcRequestBuilders.get("/entity/findbyversion").header("Version", "1.0.0")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().contentType(contentType)) + .andExpect(jsonPath("$.id", equalTo(1))); } } \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootH2IntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootH2IntegrationTest.java index 185a36e571..2cb2f4dc10 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootH2IntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootH2IntegrationTest.java @@ -1,8 +1,9 @@ package org.baeldung; -import org.baeldung.config.H2JpaConfig; -import org.baeldung.domain.GenericEntity; -import org.baeldung.repository.GenericEntityRepository; +import org.baeldung.boot.Application; +import org.baeldung.boot.config.H2JpaConfig; +import org.baeldung.boot.domain.GenericEntity; +import org.baeldung.boot.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java index 7c90622cdc..d9c30c67da 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java @@ -1,7 +1,8 @@ package org.baeldung; -import org.baeldung.domain.GenericEntity; -import org.baeldung.repository.GenericEntityRepository; +import org.baeldung.boot.Application; +import org.baeldung.boot.domain.GenericEntity; +import org.baeldung.boot.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java index 0e8a698f41..a6a84184fa 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java @@ -1,5 +1,6 @@ package org.baeldung; +import org.baeldung.boot.Application; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -9,8 +10,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.web.context.WebApplicationContext; import org.subethamail.wiser.Wiser; import org.subethamail.wiser.WiserMessage; @@ -62,15 +61,11 @@ public class SpringBootMailIntegrationTest { } private String getMessage(WiserMessage wiserMessage) throws MessagingException, IOException { - return wiserMessage.getMimeMessage() - .getContent() - .toString() - .trim(); + return wiserMessage.getMimeMessage().getContent().toString().trim(); } private String getSubject(WiserMessage wiserMessage) throws MessagingException { - return wiserMessage.getMimeMessage() - .getSubject(); + return wiserMessage.getMimeMessage().getSubject(); } private SimpleMailMessage composeEmailMessage() { diff --git a/spring-boot/src/test/java/org/baeldung/SpringBootProfileIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/SpringBootProfileIntegrationTest.java index 9dd473f321..1d4ee262b0 100644 --- a/spring-boot/src/test/java/org/baeldung/SpringBootProfileIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/SpringBootProfileIntegrationTest.java @@ -1,8 +1,9 @@ package org.baeldung; +import org.baeldung.boot.Application; +import org.baeldung.boot.domain.GenericEntity; +import org.baeldung.boot.repository.GenericEntityRepository; import org.baeldung.config.H2TestProfileJPAConfig; -import org.baeldung.domain.GenericEntity; -import org.baeldung.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java index 4fcea35b4a..fba816c681 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/DemoApplicationIntegrationTest.java @@ -1,5 +1,6 @@ package org.baeldung.boot; +import org.baeldung.demo.DemoApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-boot/src/test/java/org/baeldung/client/DetailsServiceClientIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java similarity index 85% rename from spring-boot/src/test/java/org/baeldung/client/DetailsServiceClientIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java index 0f6c13ae1f..37fc202e8a 100644 --- a/spring-boot/src/test/java/org/baeldung/client/DetailsServiceClientIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/client/DetailsServiceClientIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package org.baeldung.boot.client; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Before; @@ -14,6 +14,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; +import org.baeldung.boot.client.Details; +import org.baeldung.boot.client.DetailsServiceClient; + @RunWith(SpringRunner.class) @RestClientTest(DetailsServiceClient.class) public class DetailsServiceClientIntegrationTest { @@ -30,8 +33,7 @@ public class DetailsServiceClientIntegrationTest { @Before public void setUp() throws Exception { String detailsString = objectMapper.writeValueAsString(new Details("John Smith", "john")); - this.server.expect(requestTo("/john/details")) - .andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON)); + this.server.expect(requestTo("/john/details")).andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON)); } @Test diff --git a/spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonDeserializerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializerIntegrationTest.java similarity index 89% rename from spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonDeserializerIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializerIntegrationTest.java index 4f5af3d0e7..f8b47a23fc 100644 --- a/spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonDeserializerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonDeserializerIntegrationTest.java @@ -1,7 +1,9 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import com.fasterxml.jackson.databind.ObjectMapper; import javafx.scene.paint.Color; + +import org.baeldung.boot.jsoncomponent.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonSerializerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonSerializerIntegrationTest.java similarity index 90% rename from spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonSerializerIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonSerializerIntegrationTest.java index ac47c5e5d9..060374e8fa 100644 --- a/spring-boot/src/test/java/org/baeldung/jsoncomponent/UserJsonSerializerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/jsoncomponent/UserJsonSerializerIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.jsoncomponent; +package org.baeldung.boot.jsoncomponent; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -11,6 +11,8 @@ import org.springframework.test.context.junit4.SpringRunner; import static org.junit.Assert.assertEquals; +import org.baeldung.boot.jsoncomponent.User; + @JsonTest @RunWith(SpringRunner.class) public class UserJsonSerializerIntegrationTest { diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java index a844b26b2d..5d02d34f53 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java @@ -3,7 +3,8 @@ package org.baeldung.boot.repository; import static org.junit.Assert.assertThat; import org.baeldung.boot.DemoApplicationIntegrationTest; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; +import org.baeldung.demo.repository.FooRepository; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.is; diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java index be992bcc36..4658861162 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java @@ -5,7 +5,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import org.baeldung.boot.ApplicationIntegrationTest; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; import org.baeldung.session.exception.repository.FooRepository; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java index 55b7fa7216..8de7068949 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/boot/repository/NoHibernateSessionIntegrationTest.java @@ -1,7 +1,7 @@ package org.baeldung.boot.repository; import org.baeldung.boot.ApplicationIntegrationTest; -import org.baeldung.boot.model.Foo; +import org.baeldung.demo.model.Foo; import org.baeldung.session.exception.repository.FooRepository; import org.hibernate.HibernateException; import org.junit.Test; diff --git a/spring-boot/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java b/spring-boot/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java index eff383b440..d0b92a7a93 100644 --- a/spring-boot/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java +++ b/spring-boot/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java @@ -41,7 +41,7 @@ public class H2TestProfileJPAConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.domain", "org.baeldung.boot.model", "org.baeldung.boot.boottest" }); + em.setPackagesToScan(new String[] { "org.baeldung.domain", "org.baeldung.boot.domain", "org.baeldung.boot.boottest", "org.baeldung.model" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/spring-boot/src/test/java/org/baeldung/converter/CustomConverterTest.java b/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java similarity index 78% rename from spring-boot/src/test/java/org/baeldung/converter/CustomConverterTest.java rename to spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java index 6a585b9905..bd1ae2c8fa 100644 --- a/spring-boot/src/test/java/org/baeldung/converter/CustomConverterTest.java +++ b/spring-boot/src/test/java/org/baeldung/converter/CustomConverterIntegrationTest.java @@ -1,8 +1,9 @@ package org.baeldung.converter; import com.baeldung.toggle.Employee; -import org.baeldung.Application; -import org.baeldung.domain.Modes; + +import org.baeldung.boot.Application; +import org.baeldung.boot.domain.Modes; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) @WebAppConfiguration -public class CustomConverterTest { +public class CustomConverterIntegrationTest { @Autowired ConversionService conversionService; @@ -32,8 +33,7 @@ public class CustomConverterTest { public void whenConvertStringToEmployee_thenSuccess() { Employee employee = conversionService.convert("1,50000.00", Employee.class); Employee actualEmployee = new Employee(1, 50000.00); - assertThat(conversionService.convert("1,50000.00", Employee.class)) - .isEqualToComparingFieldByField(actualEmployee); + assertThat(conversionService.convert("1,50000.00", Employee.class)).isEqualToComparingFieldByField(actualEmployee); } @Test @@ -43,11 +43,8 @@ public class CustomConverterTest { @Test public void whenConvertingToBigDecimalUsingGenericConverter_thenSuccess() { - assertThat(conversionService.convert(Integer.valueOf(11), BigDecimal.class)) - .isEqualTo(BigDecimal.valueOf(11.00).setScale(2, BigDecimal.ROUND_HALF_EVEN)); - assertThat(conversionService.convert(Double.valueOf(25.23), BigDecimal.class)) - .isEqualByComparingTo(BigDecimal.valueOf(Double.valueOf(25.23))); - assertThat(conversionService.convert("2.32", BigDecimal.class)) - .isEqualTo(BigDecimal.valueOf(2.32)); + assertThat(conversionService.convert(Integer.valueOf(11), BigDecimal.class)).isEqualTo(BigDecimal.valueOf(11.00).setScale(2, BigDecimal.ROUND_HALF_EVEN)); + assertThat(conversionService.convert(Double.valueOf(25.23), BigDecimal.class)).isEqualByComparingTo(BigDecimal.valueOf(Double.valueOf(25.23))); + assertThat(conversionService.convert("2.32", BigDecimal.class)).isEqualTo(BigDecimal.valueOf(2.32)); } } \ No newline at end of file diff --git a/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerTest.java b/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java similarity index 80% rename from spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerTest.java rename to spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java index a5ed7998b4..466d81e658 100644 --- a/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerTest.java +++ b/spring-boot/src/test/java/org/baeldung/converter/controller/StringToEmployeeConverterControllerIntegrationTest.java @@ -1,6 +1,5 @@ package org.baeldung.converter.controller; -import org.baeldung.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,20 +14,18 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.baeldung.boot.Application; + @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class) @AutoConfigureMockMvc -public class StringToEmployeeConverterControllerTest { +public class StringToEmployeeConverterControllerIntegrationTest { @Autowired private MockMvc mockMvc; @Test public void getStringToEmployeeTest() throws Exception { - mockMvc.perform(get("/string-to-employee?employee=1,2000")) - .andDo(print()) - .andExpect(jsonPath("$.id", is(1))) - .andExpect(jsonPath("$.salary", is(2000.0))) - .andExpect(status().isOk()); + mockMvc.perform(get("/string-to-employee?employee=1,2000")).andDo(print()).andExpect(jsonPath("$.id", is(1))).andExpect(jsonPath("$.salary", is(2000.0))).andExpect(status().isOk()); } } diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java similarity index 80% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java index 2146fc09bc..640a8b322a 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeControllerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java @@ -1,5 +1,8 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; +import org.baeldung.demo.boottest.Employee; +import org.baeldung.demo.boottest.EmployeeRestController; +import org.baeldung.demo.boottest.EmployeeService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,10 +47,7 @@ public class EmployeeControllerIntegrationTest { Employee alex = new Employee("alex"); given(service.save(Mockito.anyObject())).willReturn(alex); - mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON) - .content(JsonUtil.toJson(alex))) - .andExpect(status().isCreated()) - .andExpect(jsonPath("$.name", is("alex"))); + mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON).content(JsonUtil.toJson(alex))).andExpect(status().isCreated()).andExpect(jsonPath("$.name", is("alex"))); verify(service, VerificationModeFactory.times(1)).save(Mockito.anyObject()); reset(service); } @@ -62,12 +62,8 @@ public class EmployeeControllerIntegrationTest { given(service.getAllEmployees()).willReturn(allEmployees); - mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", hasSize(3))) - .andExpect(jsonPath("$[0].name", is(alex.getName()))) - .andExpect(jsonPath("$[1].name", is(john.getName()))) - .andExpect(jsonPath("$[2].name", is(bob.getName()))); + mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(jsonPath("$", hasSize(3))).andExpect(jsonPath("$[0].name", is(alex.getName()))).andExpect(jsonPath("$[1].name", is(john.getName()))) + .andExpect(jsonPath("$[2].name", is(bob.getName()))); verify(service, VerificationModeFactory.times(1)).getAllEmployees(); reset(service); } diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java similarity index 88% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java index ebde0e243a..f581052596 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRepositoryIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRepositoryIntegrationTest.java @@ -1,5 +1,7 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; +import org.baeldung.demo.boottest.Employee; +import org.baeldung.demo.boottest.EmployeeRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -64,8 +66,6 @@ public class EmployeeRepositoryIntegrationTest { List allEmployees = employeeRepository.findAll(); - assertThat(allEmployees).hasSize(3) - .extracting(Employee::getName) - .containsOnly(alex.getName(), ron.getName(), bob.getName()); + assertThat(allEmployees).hasSize(3).extracting(Employee::getName).containsOnly(alex.getName(), ron.getName(), bob.getName()); } } diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java similarity index 80% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java index 9e5613ab10..da9df4db7d 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeRestControllerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeRestControllerIntegrationTest.java @@ -1,6 +1,8 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; -import org.baeldung.boot.DemoApplication; +import org.baeldung.demo.DemoApplication; +import org.baeldung.demo.boottest.Employee; +import org.baeldung.demo.boottest.EmployeeRepository; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,12 +50,10 @@ public class EmployeeRestControllerIntegrationTest { @Test public void whenValidInput_thenCreateEmployee() throws IOException, Exception { Employee bob = new Employee("bob"); - mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON) - .content(JsonUtil.toJson(bob))); + mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON).content(JsonUtil.toJson(bob))); List found = repository.findAll(); - assertThat(found).extracting(Employee::getName) - .containsOnly("bob"); + assertThat(found).extracting(Employee::getName).containsOnly("bob"); } @Test @@ -62,13 +62,8 @@ public class EmployeeRestControllerIntegrationTest { createTestEmployee("bob"); createTestEmployee("alex"); - mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON)) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("$", hasSize(greaterThanOrEqualTo(2)))) - .andExpect(jsonPath("$[0].name", is("bob"))) - .andExpect(jsonPath("$[1].name", is("alex"))); + mvc.perform(get("/api/employees").contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk()).andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$", hasSize(greaterThanOrEqualTo(2)))) + .andExpect(jsonPath("$[0].name", is("bob"))).andExpect(jsonPath("$[1].name", is("alex"))); } private void createTestEmployee(String name) { diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java similarity index 83% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java rename to spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java index 9837b02df6..f004536c49 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/EmployeeServiceImplIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeServiceImplIntegrationTest.java @@ -1,5 +1,9 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; +import org.baeldung.demo.boottest.Employee; +import org.baeldung.demo.boottest.EmployeeRepository; +import org.baeldung.demo.boottest.EmployeeService; +import org.baeldung.demo.boottest.EmployeeServiceImpl; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,18 +47,12 @@ public class EmployeeServiceImplIntegrationTest { List allEmployees = Arrays.asList(john, bob, alex); - Mockito.when(employeeRepository.findByName(john.getName())) - .thenReturn(john); - Mockito.when(employeeRepository.findByName(alex.getName())) - .thenReturn(alex); - Mockito.when(employeeRepository.findByName("wrong_name")) - .thenReturn(null); - Mockito.when(employeeRepository.findById(john.getId())) - .thenReturn(john); - Mockito.when(employeeRepository.findAll()) - .thenReturn(allEmployees); - Mockito.when(employeeRepository.findById(-99L)) - .thenReturn(null); + Mockito.when(employeeRepository.findByName(john.getName())).thenReturn(john); + Mockito.when(employeeRepository.findByName(alex.getName())).thenReturn(alex); + Mockito.when(employeeRepository.findByName("wrong_name")).thenReturn(null); + Mockito.when(employeeRepository.findById(john.getId())).thenReturn(john); + Mockito.when(employeeRepository.findAll()).thenReturn(allEmployees); + Mockito.when(employeeRepository.findById(-99L)).thenReturn(null); } @Test @@ -112,26 +110,21 @@ public class EmployeeServiceImplIntegrationTest { List allEmployees = employeeService.getAllEmployees(); verifyFindAllEmployeesIsCalledOnce(); - assertThat(allEmployees).hasSize(3) - .extracting(Employee::getName) - .contains(alex.getName(), john.getName(), bob.getName()); + assertThat(allEmployees).hasSize(3).extracting(Employee::getName).contains(alex.getName(), john.getName(), bob.getName()); } private void verifyFindByNameIsCalledOnce(String name) { - Mockito.verify(employeeRepository, VerificationModeFactory.times(1)) - .findByName(name); + Mockito.verify(employeeRepository, VerificationModeFactory.times(1)).findByName(name); Mockito.reset(employeeRepository); } private void verifyFindByIdIsCalledOnce() { - Mockito.verify(employeeRepository, VerificationModeFactory.times(1)) - .findById(Mockito.anyLong()); + Mockito.verify(employeeRepository, VerificationModeFactory.times(1)).findById(Mockito.anyLong()); Mockito.reset(employeeRepository); } private void verifyFindAllEmployeesIsCalledOnce() { - Mockito.verify(employeeRepository, VerificationModeFactory.times(1)) - .findAll(); + Mockito.verify(employeeRepository, VerificationModeFactory.times(1)).findAll(); Mockito.reset(employeeRepository); } } diff --git a/spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java similarity index 91% rename from spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java rename to spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java index 36d07164b2..7e04f47696 100644 --- a/spring-boot/src/test/java/org/baeldung/boot/boottest/JsonUtil.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/JsonUtil.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.boottest; +package org.baeldung.demo.boottest; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java index ffd5bf55d6..3f3b558db9 100644 --- a/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/properties/ConfigPropertiesIntegrationTest.java @@ -23,30 +23,21 @@ public class ConfigPropertiesIntegrationTest { @Test public void whenListPropertyQueriedthenReturnsProperty() throws Exception { - Assert.assertTrue("Couldn't bind list property!", properties.getDefaultRecipients() - .size() == 2); - Assert.assertTrue("Incorrectly bound list property. Expected 2 entries!", properties.getDefaultRecipients() - .size() == 2); + Assert.assertTrue("Couldn't bind list property!", properties.getDefaultRecipients().size() == 2); + Assert.assertTrue("Incorrectly bound list property. Expected 2 entries!", properties.getDefaultRecipients().size() == 2); } @Test public void whenMapPropertyQueriedthenReturnsProperty() throws Exception { Assert.assertTrue("Couldn't bind map property!", properties.getAdditionalHeaders() != null); - Assert.assertTrue("Incorrectly bound map property. Expected 3 Entries!", properties.getAdditionalHeaders() - .size() == 3); + Assert.assertTrue("Incorrectly bound map property. Expected 3 Entries!", properties.getAdditionalHeaders().size() == 3); } @Test public void whenObjectPropertyQueriedthenReturnsProperty() throws Exception { Assert.assertTrue("Couldn't bind map property!", properties.getCredentials() != null); - Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials() - .getAuthMethod() - .equals("SHA1")); - Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials() - .getUsername() - .equals("john")); - Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials() - .getPassword() - .equals("password")); + Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials().getAuthMethod().equals("SHA1")); + Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials().getUsername().equals("john")); + Assert.assertTrue("Incorrectly bound object property!", properties.getCredentials().getPassword().equals("password")); } } diff --git a/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java new file mode 100644 index 0000000000..2b61aa6252 --- /dev/null +++ b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java @@ -0,0 +1,95 @@ +package org.baeldung.repository; + +import org.baeldung.boot.Application; +import org.baeldung.model.User; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.stream.Stream; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +/** + * Created by adam. + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class UserRepositoryIntegrationTest { + + private final String USER_NAME_ADAM = "Adam"; + private final Integer ACTIVE_STATUS = 1; + + @Autowired + private UserRepository userRepository; + + @Test + public void shouldReturnEmptyOptionalWhenSearchByNameInEmptyDB() { + Optional foundUser = userRepository.findOneByName(USER_NAME_ADAM); + + assertThat(foundUser.isPresent(), equalTo(false)); + } + + @Test + public void shouldReturnOptionalWithPresentUserWhenExistsWithGivenName() { + User user = new User(); + user.setName(USER_NAME_ADAM); + userRepository.save(user); + + Optional foundUser = userRepository.findOneByName(USER_NAME_ADAM); + + assertThat(foundUser.isPresent(), equalTo(true)); + assertThat(foundUser.get().getName(), equalTo(USER_NAME_ADAM)); + } + + @Test + @Transactional + public void shouldReturnStreamOfUsersWithNameWhenExistWithSameGivenName() { + User user1 = new User(); + user1.setName(USER_NAME_ADAM); + userRepository.save(user1); + + User user2 = new User(); + user2.setName(USER_NAME_ADAM); + userRepository.save(user2); + + User user3 = new User(); + user3.setName(USER_NAME_ADAM); + userRepository.save(user3); + + User user4 = new User(); + user4.setName("SAMPLE"); + userRepository.save(user4); + + try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) { + assertThat(foundUsersStream.count(), equalTo(3l)); + } + } + + @Test + public void shouldReturnUserWithGivenStatusAsync() throws ExecutionException, InterruptedException { + User user = new User(); + user.setName(USER_NAME_ADAM); + user.setStatus(ACTIVE_STATUS); + userRepository.save(user); + + CompletableFuture userByStatus = userRepository.findOneByStatus(ACTIVE_STATUS); + + assertThat(userByStatus.get().getName(), equalTo(USER_NAME_ADAM)); + + } + + @After + public void cleanUp() { + userRepository.deleteAll(); + } + +} diff --git a/spring-boot/src/test/resources/data.sql b/spring-boot/src/test/resources/data.sql new file mode 100644 index 0000000000..f36e034ce1 --- /dev/null +++ b/spring-boot/src/test/resources/data.sql @@ -0,0 +1,5 @@ +INSERT INTO country (name) VALUES ('India'); +INSERT INTO country (name) VALUES ('Brazil'); +INSERT INTO country (name) VALUES ('USA'); +INSERT INTO country (name) VALUES ('Italy'); +COMMIT; diff --git a/spring-boot/src/test/resources/schema.sql b/spring-boot/src/test/resources/schema.sql new file mode 100644 index 0000000000..15d7788cd7 --- /dev/null +++ b/spring-boot/src/test/resources/schema.sql @@ -0,0 +1,5 @@ +CREATE TABLE country ( + id INTEGER NOT NULL AUTO_INCREMENT, + name VARCHAR(128) NOT NULL, + PRIMARY KEY (id) +); diff --git a/spring-cloud-cli/README.md b/spring-cloud-cli/README.md index 5f83ab06fa..7f29be3f07 100644 --- a/spring-cloud-cli/README.md +++ b/spring-cloud-cli/README.md @@ -3,4 +3,4 @@ ## Spring Cloud CLI ### Relevant Articles: -- [Introduction to Spring Cloud CLI](http://www.baeldung.com/introduction-to-spring-cloud-cli/) \ No newline at end of file +- [Introduction to Spring Cloud CLI](http://www.baeldung.com/spring-cloud-cli) diff --git a/spring-cloud-data-flow/batch-job/pom.xml b/spring-cloud-data-flow/batch-job/pom.xml index 9a40c80e37..f2e9f35c8e 100644 --- a/spring-cloud-data-flow/batch-job/pom.xml +++ b/spring-cloud-data-flow/batch-job/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/data-flow-server/pom.xml index ec0057191b..456a8abf4b 100644 --- a/spring-cloud-data-flow/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/data-flow-server/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/data-flow-shell/pom.xml index b34c3cefeb..edb300a3b3 100644 --- a/spring-cloud-data-flow/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/data-flow-shell/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud-data-flow/log-sink/pom.xml b/spring-cloud-data-flow/log-sink/pom.xml index b97a72d9c4..c07380de56 100644 --- a/spring-cloud-data-flow/log-sink/pom.xml +++ b/spring-cloud-data-flow/log-sink/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud-data-flow/time-processor/pom.xml b/spring-cloud-data-flow/time-processor/pom.xml index 9b190e7250..08d5e2b9be 100644 --- a/spring-cloud-data-flow/time-processor/pom.xml +++ b/spring-cloud-data-flow/time-processor/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud-data-flow/time-source/pom.xml b/spring-cloud-data-flow/time-source/pom.xml index 3112c7ede8..4d35e30be2 100644 --- a/spring-cloud-data-flow/time-source/pom.xml +++ b/spring-cloud-data-flow/time-source/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud/README.md b/spring-cloud/README.md index 1b793144b1..8ad750a809 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -12,10 +12,13 @@ Client-side service discovery allows services to find and communicate with each other without hardcoding hostname and port. The only ‘fixed point’ in such an architecture consists of a service registry with which each service has to register. +### Relevant Articles: - [Intro to Spring Cloud Netflix - Hystrix](http://www.baeldung.com/spring-cloud-netflix-hystrix) - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) - -### Relevant Articles: -- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) - [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) +- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) +- [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) +- [Using a Spring Cloud App Starter](http://www.baeldung.com/using-a-spring-cloud-app-starter) +- [Spring Cloud Connectors and Heroku](http://www.baeldung.com/spring-cloud-heroku) +- [An Example of Load Balancing with Zuul and Eureka](http://www.baeldung.com/zuul-load-balancing) +- [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 93bf6ea74b..c093b87be3 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -1,7 +1,7 @@ + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring.cloud @@ -15,8 +15,13 @@ spring-cloud-ribbon-client spring-cloud-rest spring-cloud-zookeeper - spring-cloud-gateway - spring-cloud-connectors-heroku + spring-cloud-gateway + spring-cloud-stream + spring-cloud-connectors-heroku + spring-cloud-aws + spring-cloud-consul + spring-cloud-zuul-eureka-integration + spring-cloud-contract pom @@ -38,9 +43,11 @@ 1.2.3.RELEASE 1.2.3.RELEASE 1.2.3.RELEASE + 1.3.0.RELEASE 1.4.2.RELEASE - 3.6.0 + 3.7.0 1.4.2.RELEASE + 1.2.3.RELEASE diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md new file mode 100644 index 0000000000..1340712c7a --- /dev/null +++ b/spring-cloud/spring-cloud-aws/README.md @@ -0,0 +1,26 @@ +# Spring Cloud AWS + +#### Running the Integration Tests + +To run the Integration Tests, we need to have an AWS account and have API keys generated for programmatic access. Edit +the `application.properties` file to add the following properties: + +``` +cloud.aws.credentials.accessKey=YourAccessKey +cloud.aws.credentials.secretKey=YourSecretKey +cloud.aws.region.static=us-east-1 +``` + +To test automatic DataSource creation from RDS instance, we also need to create an RDS instance in the AWS account. +Let's say that the RDS instance is called `spring-cloud-test-db` having the master password `se3retpass`, then we need +to write the following in `application.properties`: + +``` +cloud.aws.rds.spring-cloud-test-db +cloud.aws.rds.spring-cloud-test-db.password=se3retpass +``` +Multiple application classes are available under this project. To launch InstanceProfileAwsApplication application, replace `start-class` under `pom.xml`: + +``` +com.baeldung.spring.cloud.aws.InstanceProfileAwsApplication +``` \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml new file mode 100644 index 0000000000..b27b6c0d18 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-aws + 0.0.1-SNAPSHOT + jar + + Spring Cloud AWS + Spring Cloud AWS Examples + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + com.baeldung.spring.cloud.aws.SpringCloudAwsApplication + UTF-8 + UTF-8 + 1.8 + Dalston.SR4 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-aws + + + org.springframework.cloud + spring-cloud-starter-aws-jdbc + + + org.springframework.cloud + spring-cloud-starter-aws-messaging + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.postgresql + postgresql + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + maven-surefire-plugin + + + **/*IntegrationTest.java + + + + + + + + + diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java new file mode 100644 index 0000000000..80c0851a6f --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/InstanceProfileAwsApplication.java @@ -0,0 +1,60 @@ +package com.baeldung.spring.cloud.aws; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.spring.cloud.aws.s3.SpringCloudS3Service; + +@Configuration +@EnableAutoConfiguration +@ComponentScan("com.baeldung.spring.cloud.aws.s3") +public class InstanceProfileAwsApplication { + + private static final Logger logger = LoggerFactory.getLogger(InstanceProfileAwsApplication.class); + private static final String applicationConfig = "spring.config.name:application-instance-profile"; + + private static String bucketName; + private static String fileName = "sample-file.txt"; + + private static void setupResources() { + bucketName = "baeldung-test-" + UUID.randomUUID() + .toString(); + try { + Files.write(Paths.get(fileName), "Hello World!".getBytes()); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + public static void main(String[] args) { + setupResources(); + if (!new File(fileName).exists()) { + logger.warn("Not able to create {} file. Check your folder permissions.", fileName); + System.exit(1); + } + + SpringApplication application = new SpringApplicationBuilder(InstanceProfileAwsApplication.class).properties(applicationConfig) + .build(); + ConfigurableApplicationContext context = application.run(args); + SpringCloudS3Service service = context.getBean(SpringCloudS3Service.class); + + // S3 bucket operations + service.createBucket(bucketName); + service.uploadObject(bucketName, fileName); + service.downloadObject(bucketName, fileName); + service.deleteBucket(bucketName); + } + +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/SpringCloudAwsApplication.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/SpringCloudAwsApplication.java new file mode 100644 index 0000000000..81bbc579ec --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/SpringCloudAwsApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.cloud.aws; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ImportResource; + +@SpringBootApplication +@ImportResource("classpath:aws-config.xml") +public class SpringCloudAwsApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudAwsApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/config/SpringCloudAwsConfig.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/config/SpringCloudAwsConfig.java new file mode 100644 index 0000000000..85dcd05c86 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/config/SpringCloudAwsConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.cloud.aws.config; + +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sqs.AmazonSQSAsync; +import org.springframework.cloud.aws.messaging.core.NotificationMessagingTemplate; +import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringCloudAwsConfig { + + @Bean + public QueueMessagingTemplate queueMessagingTemplate(AmazonSQSAsync amazonSQSAsync) { + return new QueueMessagingTemplate(amazonSQSAsync); + } + + @Bean + public NotificationMessagingTemplate notificationMessagingTemplate(AmazonSNS amazonSNS) { + return new NotificationMessagingTemplate(amazonSNS); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2EnableMetadata.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2EnableMetadata.java new file mode 100644 index 0000000000..03a7db26de --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2EnableMetadata.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.cloud.aws.ec2; + +import org.springframework.cloud.aws.context.config.annotation.EnableContextInstanceData; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableContextInstanceData +public class EC2EnableMetadata { +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2Metadata.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2Metadata.java new file mode 100644 index 0000000000..9466c14560 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/ec2/EC2Metadata.java @@ -0,0 +1,62 @@ +package com.baeldung.spring.cloud.aws.ec2; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +@Lazy +@Component +public class EC2Metadata { + + @Value("${ami-id:N/A}") + private String amiId; + + @Value("${hostname:N/A}") + private String hostname; + + @Value("${instance-type:N/A}") + private String instanceType; + + @Value("${services/domain:N/A}") + private String serviceDomain; + + @Value("#{instanceData['Name'] ?: 'N/A'}") + private String name; + + public String getAmiId() { + return amiId; + } + + public String getHostname() { + return hostname; + } + + public String getInstanceType() { + return instanceType; + } + + public String getServiceDomain() { + return serviceDomain; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("EC2Metadata [amiId="); + builder.append(amiId); + builder.append(", hostname="); + builder.append(hostname); + builder.append(", instanceType="); + builder.append(instanceType); + builder.append(", serviceDomain="); + builder.append(serviceDomain); + builder.append(", name="); + builder.append(name); + builder.append("]"); + return builder.toString(); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java new file mode 100644 index 0000000000..cfad6e904f --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.cloud.aws.s3; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.WritableResource; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +@Component +public class SpringCloudS3 { + + @Autowired + ResourceLoader resourceLoader; + + @Autowired + ResourcePatternResolver resourcePatternResolver; + + public void downloadS3Object(String s3Url) throws IOException { + Resource resource = resourceLoader.getResource(s3Url); + File downloadedS3Object = new File(resource.getFilename()); + try (InputStream inputStream = resource.getInputStream()) { + Files.copy(inputStream, downloadedS3Object.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + } + + public void uploadFileToS3(File file, String s3Url) throws IOException { + WritableResource resource = (WritableResource) resourceLoader.getResource(s3Url); + try (OutputStream outputStream = resource.getOutputStream()) { + Files.copy(file.toPath(), outputStream); + } + } + + public void downloadMultipleS3Objects(String s3UrlPattern) throws IOException { + Resource[] allFileMatchingPatten = this.resourcePatternResolver.getResources(s3UrlPattern); + for (Resource resource : allFileMatchingPatten) { + String fileName = resource.getFilename(); + fileName = fileName.substring(0, fileName.lastIndexOf("/") + 1); + File downloadedS3Object = new File(fileName); + try (InputStream inputStream = resource.getInputStream()) { + Files.copy(inputStream, downloadedS3Object.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + } + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java new file mode 100644 index 0000000000..a0fdce2143 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3Service.java @@ -0,0 +1,64 @@ +package com.baeldung.spring.cloud.aws.s3; + +import java.io.File; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3ObjectSummary; + +@Component +public class SpringCloudS3Service { + + private static final Logger logger = LoggerFactory.getLogger(SpringCloudS3Service.class); + + @Autowired + AmazonS3 amazonS3; + + @Autowired + SpringCloudS3 springCloudS3; + + public void createBucket(String bucketName) { + logger.debug("Creating S3 bucket: {}", bucketName); + amazonS3.createBucket(bucketName); + logger.info("{} bucket created successfully", bucketName); + } + + public void downloadObject(String bucketName, String objectName) { + String s3Url = "s3://" + bucketName + "/" + objectName; + try { + springCloudS3.downloadS3Object(s3Url); + logger.info("{} file download result: {}", objectName, new File(objectName).exists()); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + public void uploadObject(String bucketName, String objectName) { + String s3Url = "s3://" + bucketName + "/" + objectName; + File file = new File(objectName); + try { + springCloudS3.uploadFileToS3(file, s3Url); + logger.info("{} file uploaded to S3", objectName); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + } + + public void deleteBucket(String bucketName) { + logger.trace("Deleting S3 objects under {} bucket...", bucketName); + ListObjectsV2Result listObjectsV2Result = amazonS3.listObjectsV2(bucketName); + for (S3ObjectSummary objectSummary : listObjectsV2Result.getObjectSummaries()) { + logger.info("Deleting S3 object: {}", objectSummary.getKey()); + amazonS3.deleteObject(bucketName, objectSummary.getKey()); + } + logger.info("Deleting S3 bucket: {}", bucketName); + amazonS3.deleteBucket(bucketName); + } + +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointController.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointController.java new file mode 100644 index 0000000000..7c78fcbe37 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointController.java @@ -0,0 +1,36 @@ +package com.baeldung.spring.cloud.aws.sns; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.aws.messaging.config.annotation.NotificationMessage; +import org.springframework.cloud.aws.messaging.config.annotation.NotificationSubject; +import org.springframework.cloud.aws.messaging.endpoint.NotificationStatus; +import org.springframework.cloud.aws.messaging.endpoint.annotation.NotificationMessageMapping; +import org.springframework.cloud.aws.messaging.endpoint.annotation.NotificationSubscriptionMapping; +import org.springframework.cloud.aws.messaging.endpoint.annotation.NotificationUnsubscribeConfirmationMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/topic-subscriber") +public class SNSEndpointController { + + private static final Logger logger = LoggerFactory.getLogger(SNSEndpointController.class); + + @NotificationMessageMapping + public void receiveNotification(@NotificationMessage String message, @NotificationSubject String subject) { + logger.info("Received message: {}, having subject: {}", message, subject); + } + + @NotificationUnsubscribeConfirmationMapping + public void confirmSubscriptionMessage(NotificationStatus notificationStatus) { + logger.info("Unsubscribed from Topic"); + notificationStatus.confirmSubscription(); + } + + @NotificationSubscriptionMapping + public void confirmUnsubscribeMessage(NotificationStatus notificationStatus) { + logger.info("Subscribed to Topic"); + notificationStatus.confirmSubscription(); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSMessageSender.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSMessageSender.java new file mode 100644 index 0000000000..58cb03644b --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sns/SNSMessageSender.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.cloud.aws.sns; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.aws.messaging.core.NotificationMessagingTemplate; +import org.springframework.stereotype.Component; + +@Component +public class SNSMessageSender { + + @Autowired + NotificationMessagingTemplate notificationMessagingTemplate; + + public void send(String topicName, Object message, String subject) { + notificationMessagingTemplate.sendNotification(topicName, message, subject); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQS.java b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQS.java new file mode 100644 index 0000000000..d2a5fcf9ca --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQS.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.cloud.aws.sqs; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate; +import org.springframework.cloud.aws.messaging.listener.annotation.SqsListener; +import org.springframework.context.annotation.Lazy; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CountDownLatch; + +@Component +@Lazy +public class SpringCloudSQS { + + private static final Logger logger = LoggerFactory.getLogger(SpringCloudSQS.class); + + static final String QUEUE_NAME = "spring-cloud-test-queue"; + + /* + * CountDownLatch is added to wait for messages + * during integration test + */ + CountDownLatch countDownLatch; + + public void setCountDownLatch(CountDownLatch countDownLatch) { + this.countDownLatch = countDownLatch; + } + + @Autowired + QueueMessagingTemplate queueMessagingTemplate; + + @SqsListener(QUEUE_NAME) + public void receiveMessage(String message, @Header("SenderId") String senderId) { + logger.info("Received message: {}, having SenderId: {}", message, senderId); + if (countDownLatch != null) { + countDownLatch.countDown(); + } + } + + public void send(String queueName, Object message) { + queueMessagingTemplate.convertAndSend(queueName, message); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml b/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml new file mode 100644 index 0000000000..f8c3d3c915 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/resources/InstanceProfileFormation.yaml @@ -0,0 +1,78 @@ +AWSTemplateFormatVersion: 2010-09-09 +Metadata: + 'AWS::CloudFormation::Designer': + 157e7d5f-5cb3-4a23-a50c-97e7f6c57173: + size: + width: 60 + height: 60 + position: + x: 450 + 'y': 90 + z: 0 + embeds: [] + 9bbaaa55-9cba-4555-a7c6-fb6ac248fd3a: + size: + width: 60 + height: 60 + position: + x: 260 + 'y': 90 + z: 0 + embeds: [] + isassociatedwith: + - 157e7d5f-5cb3-4a23-a50c-97e7f6c57173 + a7348729-a594-4dca-9b0a-e1c8d777dc3b: + size: + width: 60 + height: 60 + position: + x: 70 + 'y': 90 + z: 0 + embeds: [] +Resources: + IAMRoleBaeldung: + Type: 'AWS::IAM::Role' + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Principal: + Service: + - ec2.amazonaws.com + Action: + - 'sts:AssumeRole' + ManagedPolicyArns: + - 'arn:aws:iam::aws:policy/AmazonS3FullAccess' + Metadata: + 'AWS::CloudFormation::Designer': + id: 157e7d5f-5cb3-4a23-a50c-97e7f6c57173 + InstanceProfileBaeldung: + Type: 'AWS::IAM::InstanceProfile' + Properties: + Roles: + - !Ref IAMRoleBaeldung + Metadata: + 'AWS::CloudFormation::Designer': + id: 9bbaaa55-9cba-4555-a7c6-fb6ac248fd3a + EC2Instance: + Type: 'AWS::EC2::Instance' + Properties: + ImageId: ami-2581aa40 + InstanceType: t2.micro + IamInstanceProfile: !Ref InstanceProfileBaeldung + KeyName: Satish-Ohio + UserData: !Base64 + 'Fn::Join': + - '' + - - | + #!/bin/bash + - | + apt -y install openjdk-8-jre-headless + Metadata: + 'AWS::CloudFormation::Designer': + id: a7348729-a594-4dca-9b0a-e1c8d777dc3b + DependsOn: + - InstanceProfileBaeldung + diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties b/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties new file mode 100644 index 0000000000..23ca09c85c --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/resources/application-instance-profile.properties @@ -0,0 +1,14 @@ +# Don't try to create DataSouce when running tests which don't need a DataSource +spring.autoconfigure.exclude=\ + org.springframework.cloud.aws.autoconfigure.jdbc.AmazonRdsDatabaseAutoConfiguration,\ + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration +cloud.aws.region.auto=true + +# Load instance profile credentials +cloud.aws.credentials.instanceProfile=true + +# Disable auto cloud formation +cloud.aws.stack.auto=false + +# Disable web environment +spring.main.web-environment=false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/application.properties b/spring-cloud/spring-cloud-aws/src/main/resources/application.properties new file mode 100644 index 0000000000..a769b70ddd --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/resources/application.properties @@ -0,0 +1,14 @@ +cloud.aws.credentials.accessKey=YourAccessKey +cloud.aws.credentials.secretKey=YourSecretKey +cloud.aws.region.static=us-east-1 + +cloud.aws.rds.spring-cloud-test-db +cloud.aws.rds.spring-cloud-test-db.password=se3retpass + +# These 3 properties are optional +cloud.aws.rds.spring-cloud-test-db.username=testuser +cloud.aws.rds.spring-cloud-test-db.readReplicaSupport=true +cloud.aws.rds.spring-cloud-test-db.databaseName=test + +# Disable auto cloudfromation +cloud.aws.stack.auto=false diff --git a/spring-cloud/spring-cloud-aws/src/main/resources/aws-config.xml b/spring-cloud/spring-cloud-aws/src/main/resources/aws-config.xml new file mode 100644 index 0000000000..5ca48f6b1e --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/main/resources/aws-config.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringCloudAwsTestUtil.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringCloudAwsTestUtil.java new file mode 100644 index 0000000000..fe10eb6f15 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/SpringCloudAwsTestUtil.java @@ -0,0 +1,73 @@ +package com.baeldung.spring.cloud.aws; + +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.AmazonSNSClientBuilder; +import com.amazonaws.services.sqs.AmazonSQS; +import com.amazonaws.services.sqs.AmazonSQSClientBuilder; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.junit.BeforeClass; + +/** + * This class is needed only for testing. This is because we need to + * create AWS resources before Spring's Application context is created + * in a {@link BeforeClass} method. Since Autowired dependencies don't + * work in static context, we will use this class for AWS clients. + */ +public class SpringCloudAwsTestUtil { + + private static String awsAccessKey; + private static String awsSecretKey; + private static String defaultRegion; + + static { + try { + InputStream is = SpringCloudAwsTestUtil.class.getResourceAsStream("/application.properties"); + Properties properties = new Properties(); + properties.load(is); + awsAccessKey = properties.getProperty("cloud.aws.credentials.accessKey"); + awsSecretKey = properties.getProperty("cloud.aws.credentials.secretKey"); + defaultRegion = properties.getProperty("cloud.aws.region.static"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static AWSCredentials awsCredentials() { + return new BasicAWSCredentials(awsAccessKey, awsSecretKey); + } + + public static AWSCredentialsProvider awsCredentialsProvider() { + return new AWSStaticCredentialsProvider(awsCredentials()); + } + + public static AmazonS3 amazonS3() { + return AmazonS3ClientBuilder.standard() + .withCredentials(awsCredentialsProvider()) + .withRegion(defaultRegion) + .build(); + } + + public static AmazonSNS amazonSNS() { + return AmazonSNSClientBuilder.standard() + .withCredentials(awsCredentialsProvider()) + .withRegion(defaultRegion) + .build(); + } + + public static AmazonSQS amazonSQS() { + return AmazonSQSClientBuilder.standard() + .withCredentials(awsCredentialsProvider()) + .withRegion(defaultRegion) + .build(); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java new file mode 100644 index 0000000000..1e75134194 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/ec2/EC2MetadataIntegrationTest.java @@ -0,0 +1,61 @@ +package com.baeldung.spring.cloud.aws.ec2; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.amazonaws.regions.Regions; +import com.amazonaws.services.ec2.AmazonEC2; + +@SpringBootTest +@RunWith(SpringRunner.class) +@TestPropertySource("classpath:application-test.properties") +public class EC2MetadataIntegrationTest { + + private static final Logger logger = LoggerFactory.getLogger(EC2MetadataIntegrationTest.class); + + private boolean serverEc2; + + @Before + public void setUp() { + serverEc2 = Regions.getCurrentRegion() != null; + } + + @Autowired + private EC2Metadata eC2Metadata; + + @Autowired + private AmazonEC2 amazonEC2; + + @Test + public void whenEC2ClinentNotNull_thenSuccess() { + assertThat(amazonEC2).isNotNull(); + } + + @Test + public void whenEC2MetadataNotNull_thenSuccess() { + assertThat(eC2Metadata).isNotNull(); + } + + @Test + public void whenMetdataValuesNotNull_thenSuccess() { + Assume.assumeTrue(serverEc2); + assertThat(eC2Metadata.getAmiId()).isNotEqualTo("N/A"); + assertThat(eC2Metadata.getInstanceType()).isNotEqualTo("N/A"); + } + + @Test + public void whenMetadataLogged_thenSuccess() { + logger.info("Environment is EC2: {}", serverEc2); + logger.info(eC2Metadata.toString()); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java new file mode 100644 index 0000000000..9e163d6dc4 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/rds/SpringCloudRDSIntegrationTest.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.cloud.aws.rds; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@RunWith(SpringRunner.class) +public class SpringCloudRDSIntegrationTest { + + @Autowired + DataSource dataSource; + + @Test + public void whenDataSourceCreated_thenSuccess() { + assertThat(dataSource).isNotNull(); + } + + @Test + public void givenDataSource_whenConnectionCreated_thenSuccess() throws SQLException { + Connection connection = dataSource.getConnection(); + assertThat(connection).isNotNull(); + } + + @Test + public void givenConnection_whenQueryExecuted_thenSuccess() throws SQLException { + Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT 1"); + while (resultSet.next()) { + int result = resultSet.getInt(1); + assertThat(result).isEqualTo(1); + } + connection.close(); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java new file mode 100644 index 0000000000..a866287dec --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/s3/SpringCloudS3IntegrationTest.java @@ -0,0 +1,101 @@ +package com.baeldung.spring.cloud.aws.s3; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.baeldung.spring.cloud.aws.SpringCloudAwsTestUtil; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@RunWith(SpringRunner.class) +@TestPropertySource("classpath:application-test.properties") +public class SpringCloudS3IntegrationTest { + + @Autowired + private SpringCloudS3 springCloudS3; + + private static String bucketName; + private static String testFileToDownload; + private static String testFileToUpload; + + private static String[] filesWithSimilarName; + private static List similarNameFiles; + + @BeforeClass + public static void setupResources() throws IOException { + + bucketName = UUID.randomUUID().toString(); + testFileToDownload = "test-file-download.txt"; + testFileToUpload = "test-file-upload.txt"; + + filesWithSimilarName = new String[] { "foo/hello-apple.txt", "foo/hello-orange.txt", "bar/hello-grapes.txt", }; + + similarNameFiles = new ArrayList<>(); + for (String name : filesWithSimilarName) { + similarNameFiles.add(new File(name.substring(0, name.lastIndexOf("/") + 1))); + } + + Files.write(Paths.get(testFileToUpload), "Hello World Uploaded!".getBytes()); + + AmazonS3 amazonS3 = SpringCloudAwsTestUtil.amazonS3(); + amazonS3.createBucket(bucketName); + + amazonS3.putObject(bucketName, testFileToDownload, "Hello World"); + + for (String s3Key : filesWithSimilarName) { + amazonS3.putObject(bucketName, s3Key, "Hello World"); + } + } + + @Test + public void whenS3ObjectDownloaded_thenSuccess() throws IOException { + String s3Url = "s3://" + bucketName + "/" + testFileToDownload; + springCloudS3.downloadS3Object(s3Url); + assertThat(new File(testFileToDownload)).exists(); + } + + @Test + public void whenS3ObjectUploaded_thenSuccess() throws IOException { + String s3Url = "s3://" + bucketName + "/" + testFileToUpload; + File file = new File(testFileToUpload); + springCloudS3.uploadFileToS3(file, s3Url); + } + + @Test + public void whenMultipleS3ObjectsDownloaded_thenSuccess() throws IOException { + String s3Url = "s3://" + bucketName + "/**/hello-*.txt"; + springCloudS3.downloadMultipleS3Objects(s3Url); + similarNameFiles.forEach(f -> assertThat(f).exists()); + } + + @AfterClass + public static void cleanUpResources() { + AmazonS3 amazonS3 = SpringCloudAwsTestUtil.amazonS3(); + ListObjectsV2Result listObjectsV2Result = amazonS3.listObjectsV2(bucketName); + for (S3ObjectSummary objectSummary : listObjectsV2Result.getObjectSummaries()) { + amazonS3.deleteObject(bucketName, objectSummary.getKey()); + } + amazonS3.deleteBucket(bucketName); + + new File(testFileToDownload).delete(); + new File(testFileToUpload).delete(); + similarNameFiles.forEach(File::delete); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointControllerUnitTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointControllerUnitTest.java new file mode 100644 index 0000000000..14958570e2 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SNSEndpointControllerUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.cloud.aws.sns; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.cloud.aws.messaging.endpoint.NotificationStatus; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +public class SNSEndpointControllerUnitTest { + + SNSEndpointController snsEndpointController; + + @Before + public void setUp() { + snsEndpointController = new SNSEndpointController(); + } + + @Test + public void whenReceivedNotificationInvoked_thenSuccess() { + snsEndpointController.receiveNotification("Message", "Subject"); + } + + @Test + public void whenConfirmUnsubscribeReturned_thenSuccess() { + NotificationStatus notificationStatus = mock(NotificationStatus.class); + doNothing().when(notificationStatus).confirmSubscription(); + snsEndpointController.confirmUnsubscribeMessage(notificationStatus); + } + + @Test + public void whenConfirmSubscriptionReturned_thenSuccess() { + NotificationStatus notificationStatus = mock(NotificationStatus.class); + doNothing().when(notificationStatus).confirmSubscription(); + snsEndpointController.confirmSubscriptionMessage(notificationStatus); + } + +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java new file mode 100644 index 0000000000..e1f23d5c76 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sns/SpringCloudSNSIntegrationTest.java @@ -0,0 +1,61 @@ +package com.baeldung.spring.cloud.aws.sns; + +import java.util.UUID; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.amazonaws.services.sns.AmazonSNS; +import com.amazonaws.services.sns.model.CreateTopicResult; +import com.baeldung.spring.cloud.aws.SpringCloudAwsTestUtil; +import com.baeldung.spring.cloud.aws.sqs.Greeting; + +@SpringBootTest +@RunWith(SpringRunner.class) +@TestPropertySource("classpath:application-test.properties") +public class SpringCloudSNSIntegrationTest { + + @Autowired + private SNSMessageSender snsMessageSender; + + private static String topicName; + private static String topicArn; + + @BeforeClass + public static void setupAwsResources() { + + topicName = UUID.randomUUID().toString(); + + AmazonSNS amazonSNS = SpringCloudAwsTestUtil.amazonSNS(); + + CreateTopicResult result = amazonSNS.createTopic(topicName); + topicArn = result.getTopicArn(); + } + + @Test + public void whenMessagePublished_thenSuccess() { + String subject = "Test Message"; + String message = "Hello World"; + snsMessageSender.send(topicName, message, subject); + } + + @Test + public void whenConvertedMessagePublished_thenSuccess() { + String subject = "Test Message"; + Greeting message = new Greeting("Helo", "World"); + snsMessageSender.send(topicName, message, subject); + } + + @AfterClass + public static void cleanupAwsResources() { + AmazonSNS amazonSNS = SpringCloudAwsTestUtil.amazonSNS(); + amazonSNS.deleteTopic(topicArn); + } + +} diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/Greeting.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/Greeting.java new file mode 100644 index 0000000000..3d14d55f14 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/Greeting.java @@ -0,0 +1,63 @@ +package com.baeldung.spring.cloud.aws.sqs; + +public class Greeting { + private String message; + private String name; + + public Greeting() { + + } + + public Greeting(String mesage, String name) { + this.message = mesage; + this.name = name; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((message == null) ? 0 : message.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Greeting other = (Greeting) obj; + if (message == null) { + if (other.message != null) + return false; + } else if (!message.equals(other.message)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java new file mode 100644 index 0000000000..76d2fd7c0d --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/java/com/baeldung/spring/cloud/aws/sqs/SpringCloudSQSIntegrationTest.java @@ -0,0 +1,135 @@ +package com.baeldung.spring.cloud.aws.sqs; + +import com.amazonaws.services.sqs.AmazonSQS; +import com.amazonaws.services.sqs.model.CreateQueueResult; +import com.amazonaws.services.sqs.model.PurgeQueueRequest; +import com.amazonaws.services.sqs.model.ReceiveMessageRequest; +import com.amazonaws.services.sqs.model.ReceiveMessageResult; +import com.baeldung.spring.cloud.aws.SpringCloudAwsTestUtil; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Lazy; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@RunWith(SpringRunner.class) +@TestPropertySource("classpath:application-test.properties") +public class SpringCloudSQSIntegrationTest { + + private static final Logger logger = LoggerFactory.getLogger(SpringCloudSQSIntegrationTest.class); + + @Autowired + @Lazy + private SpringCloudSQS springCloudSQS; + + private static String receiveQueueName; + private static String receiveQueueUrl; + + private static String sendQueueName; + private static String sendQueueURl; + + @BeforeClass + public static void setupAwsResources() { + + sendQueueName = UUID.randomUUID().toString(); + receiveQueueName = SpringCloudSQS.QUEUE_NAME; + + AmazonSQS amazonSQS = SpringCloudAwsTestUtil.amazonSQS(); + + CreateQueueResult receiveQueue = amazonSQS.createQueue(receiveQueueName); + receiveQueueUrl = receiveQueue.getQueueUrl(); + + CreateQueueResult sendQueue = amazonSQS.createQueue(sendQueueName); + sendQueueURl = sendQueue.getQueueUrl(); + } + + @Test + public void whenMessageSentAndVerified_thenSuccess() throws InterruptedException { + + String message = "Hello World"; + springCloudSQS.send(sendQueueName, message); + + AmazonSQS amazonSQS = SpringCloudAwsTestUtil.amazonSQS(); + + ReceiveMessageRequest request = new ReceiveMessageRequest(sendQueueURl); + request.setMaxNumberOfMessages(1); + + ReceiveMessageResult result = null; + do { + result = amazonSQS.receiveMessage(request); + if (result.getMessages().size() == 0) { + logger.info("Message not received at first time, waiting for 1 second"); + } + } while (result.getMessages().size() == 0); + assertThat(result.getMessages().get(0).getBody()).isEqualTo(message); + + // Delete message so that it doen't interfere with other test + amazonSQS.deleteMessage(sendQueueURl, result.getMessages().get(0).getReceiptHandle()); + + } + + @Test + public void whenConvertedMessageSentAndVerified_thenSuccess() throws InterruptedException, IOException { + + Greeting message = new Greeting("Hello", "World"); + springCloudSQS.send(sendQueueName, message); + + AmazonSQS amazonSQS = SpringCloudAwsTestUtil.amazonSQS(); + + ReceiveMessageRequest request = new ReceiveMessageRequest(sendQueueURl); + request.setMaxNumberOfMessages(1); + + ReceiveMessageResult result = null; + do { + result = amazonSQS.receiveMessage(request); + if (result.getMessages().size() == 0) { + logger.info("Message not received at first time, waiting for 1 second"); + } + } while (result.getMessages().size() == 0); + assertThat(new ObjectMapper().readValue(result.getMessages().get(0).getBody(), Greeting.class)).isEqualTo(message); + + // Delete message so that it doen't interfere with other test + amazonSQS.deleteMessage(sendQueueURl, result.getMessages().get(0).getReceiptHandle()); + } + + @Test + public void givenMessageSent_whenMessageReceived_thenSuccess() throws InterruptedException { + CountDownLatch countDownLatch = new CountDownLatch(5); + springCloudSQS.setCountDownLatch(countDownLatch); + + AmazonSQS amazonSQS = SpringCloudAwsTestUtil.amazonSQS(); + for (int i = 0; i < 5; i++) { + amazonSQS.sendMessage(receiveQueueUrl, "Hello World " + i); + logger.info("Sent message {}, waiting for 1 second", i + 1); + Thread.sleep(1000L); + } + countDownLatch.await(); + } + + @AfterClass + public static void cleanupAwsResources() { + AmazonSQS amazonSQS = SpringCloudAwsTestUtil.amazonSQS(); + PurgeQueueRequest receiveQueuePurge = new PurgeQueueRequest(receiveQueueUrl); + amazonSQS.purgeQueue(receiveQueuePurge); + amazonSQS.deleteQueue(receiveQueueUrl); + + PurgeQueueRequest sendQueuePurge = new PurgeQueueRequest(sendQueueURl); + amazonSQS.purgeQueue(sendQueuePurge); + amazonSQS.deleteQueue(sendQueueURl); + } +} diff --git a/spring-cloud/spring-cloud-aws/src/test/resources/application-test.properties b/spring-cloud/spring-cloud-aws/src/test/resources/application-test.properties new file mode 100644 index 0000000000..0d3d90b03a --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/resources/application-test.properties @@ -0,0 +1,4 @@ +# Don't try to create DataSouce when running tests which don't need a DataSource +spring.autoconfigure.exclude=\ + org.springframework.cloud.aws.autoconfigure.jdbc.AmazonRdsDatabaseAutoConfiguration,\ + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration diff --git a/spring-cloud/spring-cloud-bootstrap/config/pom.xml b/spring-cloud/spring-cloud-bootstrap/config/pom.xml index 77ceedab39..f01ab55eb2 100644 --- a/spring-cloud/spring-cloud-bootstrap/config/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/config/pom.xml @@ -7,10 +7,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml index 3156e0f3e6..137e9bebad 100644 --- a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml @@ -7,10 +7,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml index 84dc2a6ca9..f32de88076 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml @@ -7,10 +7,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index d35e4f6576..9cc3cdb516 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -8,10 +8,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 736a6114cf..3aa5cfa250 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -8,10 +8,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml index 3b4c984721..7e0d146f95 100644 --- a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml @@ -7,10 +7,10 @@ 1.0.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-config/client/src/test/java/com/baeldung/spring/cloud/config/client/ConfigClientLiveTest.java b/spring-cloud/spring-cloud-config/client/src/test/java/com/baeldung/spring/cloud/config/client/ConfigClientLiveTest.java index 058fd45f35..9bca369c64 100644 --- a/spring-cloud/spring-cloud-config/client/src/test/java/com/baeldung/spring/cloud/config/client/ConfigClientLiveTest.java +++ b/spring-cloud/spring-cloud-config/client/src/test/java/com/baeldung/spring/cloud/config/client/ConfigClientLiveTest.java @@ -1,14 +1,13 @@ package com.baeldung.spring.cloud.config.client; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ConfigClient.class) +@SpringBootTest(classes = ConfigClient.class) @WebAppConfiguration public class ConfigClientLiveTest { @Test diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index 81693b7e2e..a5f3f5271d 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -15,10 +15,10 @@ - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-config/server/src/test/java/com/baeldung/spring/cloud/config/server/ConfigServerListIntegrationTest.java b/spring-cloud/spring-cloud-config/server/src/test/java/com/baeldung/spring/cloud/config/server/ConfigServerListIntegrationTest.java index 34c08cc815..c521a0d2ef 100644 --- a/spring-cloud/spring-cloud-config/server/src/test/java/com/baeldung/spring/cloud/config/server/ConfigServerListIntegrationTest.java +++ b/spring-cloud/spring-cloud-config/server/src/test/java/com/baeldung/spring/cloud/config/server/ConfigServerListIntegrationTest.java @@ -3,12 +3,12 @@ package com.baeldung.spring.cloud.config.server; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = ConfigServer.class) +@SpringBootTest(classes = ConfigServer.class) @WebAppConfiguration @Ignore public class ConfigServerListIntegrationTest { diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml index ba3f0ef28f..83e8e360c8 100644 --- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml +++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml @@ -88,7 +88,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.0 + 3.7.0 1.8 1.8 diff --git a/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/Book.java b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/Book.java new file mode 100644 index 0000000000..6f45ef6a29 --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/Book.java @@ -0,0 +1,39 @@ +package com.baeldung.spring.cloud.connectors.heroku.book; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String title; + private String author; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} diff --git a/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookController.java b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookController.java new file mode 100644 index 0000000000..eb2972f35a --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookController.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.cloud.connectors.heroku.book; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/books") +public class BookController { + + private final BookService bookService; + + @Autowired + public BookController(BookService bookService) { + this.bookService = bookService; + } + + @GetMapping("/{bookId}") + public Book findBook(@PathVariable Long bookId) { + return bookService.findBookById(bookId); + } + + @PostMapping + public Book createBook(@RequestBody Book book) { + return bookService.createBook(book); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookRepository.java b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookRepository.java new file mode 100644 index 0000000000..9bdf16148d --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookRepository.java @@ -0,0 +1,6 @@ +package com.baeldung.spring.cloud.connectors.heroku.book; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BookRepository extends JpaRepository{ +} diff --git a/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookService.java b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookService.java new file mode 100644 index 0000000000..4978ded65f --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/src/main/java/com/baeldung/spring/cloud/connectors/heroku/book/BookService.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.cloud.connectors.heroku.book; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +public class BookService { + private final BookRepository bookRepository; + + @Autowired + public BookService(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + public Book findBookById(Long bookId) { + return bookRepository.findOne(bookId); + } + + @Transactional(propagation = Propagation.REQUIRED) + public Book createBook(Book book) { + Book newBook = new Book(); + newBook.setTitle(book.getTitle()); + newBook.setAuthor(book.getAuthor()); + return bookRepository.save(newBook); + } +} diff --git a/spring-cloud/spring-cloud-consul/pom.xml b/spring-cloud/spring-cloud-consul/pom.xml new file mode 100644 index 0000000000..7ce570d50d --- /dev/null +++ b/spring-cloud/spring-cloud-consul/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-consul + jar + + spring-cloud-consul + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + + UTF-8 + 3.7.0 + + + + + org.springframework.cloud + spring-cloud-starter-consul-all + 1.3.0.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-consul-config + 1.3.0.RELEASE + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java new file mode 100644 index 0000000000..d013969ad3 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.cloud.consul.discovery; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@SpringBootApplication +@EnableDiscoveryClient +public class DiscoveryClientApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder(DiscoveryClientApplication.class).web(true) + .run(args); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java new file mode 100644 index 0000000000..1436096d10 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientController.java @@ -0,0 +1,50 @@ +package com.baeldung.spring.cloud.consul.discovery; + +import java.net.URI; +import java.util.Optional; + +import javax.naming.ServiceUnavailableException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@RestController +public class DiscoveryClientController { + + @Autowired + private DiscoveryClient discoveryClient; + + private final RestTemplate restTemplate = new RestTemplate(); + + @GetMapping("/discoveryClient") + public String discoveryPing() throws RestClientException, ServiceUnavailableException { + URI service = serviceUrl().map(s -> s.resolve("/ping")) + .orElseThrow(ServiceUnavailableException::new); + return restTemplate.getForEntity(service, String.class) + .getBody(); + } + + @GetMapping("/ping") + public String ping() { + return "pong"; + } + + @GetMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + return new ResponseEntity<>(HttpStatus.OK); + } + + public Optional serviceUrl() { + return discoveryClient.getInstances("myApp") + .stream() + .findFirst() + .map(si -> si.getUri()); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java new file mode 100644 index 0000000000..020d7d017c --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.cloud.consul.health; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; + +@SpringBootApplication +public class ServiceDiscoveryApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder(ServiceDiscoveryApplication.class).web(true) + .run(args); + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java new file mode 100644 index 0000000000..20deba993f --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryController.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.cloud.consul.health; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ServiceDiscoveryController { + + @GetMapping("/ping") + public String ping() { + return "pong"; + } + + @GetMapping("/my-health-check") + public ResponseEntity myCustomCheck() { + String message = "Testing my healh check function"; + return new ResponseEntity<>(message, HttpStatus.FORBIDDEN); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java new file mode 100644 index 0000000000..c1d2b0acc5 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.cloud.consul.properties; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class DistributedPropertiesApplication { + + public static void main(String[] args) { + new SpringApplicationBuilder(DistributedPropertiesApplication.class).web(true) + .run(args); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java new file mode 100644 index 0000000000..da2d37eb76 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesController.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.cloud.consul.properties; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DistributedPropertiesController { + + @Value("${my.prop}") + String value; + + @Autowired + private MyProperties properties; + + @GetMapping("/getConfigFromValue") + public String getConfigFromValue() { + return value; + } + + @GetMapping("/getConfigFromProperty") + public String getConfigFromProperty() { + return properties.getProp(); + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java new file mode 100644 index 0000000000..d92b18ed51 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/MyProperties.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.cloud.consul.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +@RefreshScope +@Configuration +@ConfigurationProperties("my") +public class MyProperties { + + private String prop; + + public String getProp() { + return prop; + } + + public void setProp(String prop) { + this.prop = prop; + } + +} diff --git a/spring-cloud/spring-cloud-consul/src/main/resources/application.yml b/spring-cloud/spring-cloud-consul/src/main/resources/application.yml new file mode 100644 index 0000000000..ccdc3fdeee --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/resources/application.yml @@ -0,0 +1,14 @@ +spring: + application: + name: myApp + cloud: + consul: + host: localhost + port: 8500 + discovery: + healthCheckPath: /my-health-check + healthCheckInterval: 20s + enabled: true + instanceId: ${spring.application.name}:${random.value} +server: + port: 0 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml b/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml new file mode 100644 index 0000000000..6318170135 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/src/main/resources/bootstrap.yml @@ -0,0 +1,9 @@ +spring: + application: + name: myApp + cloud: + consul: + host: localhost + port: 8500 + config: + enabled: true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml new file mode 100644 index 0000000000..3981aae2ac --- /dev/null +++ b/spring-cloud/spring-cloud-contract/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + spring-cloud-contract-producer + spring-cloud-contract-consumer + + pom + + com.baeldung.spring.cloud + spring-cloud-contract + 1.0.0-SNAPSHOT + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml new file mode 100644 index 0000000000..67fea178eb --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-contract-consumer + 1.0.0-SNAPSHOT + jar + + spring-cloud-contract-consumer + Spring Cloud Consumer Sample + + + com.baeldung.spring.cloud + spring-cloud-contract + 1.0.0-SNAPSHOT + .. + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-contract-wiremock + 1.2.2.RELEASE + test + + + org.springframework.cloud + spring-cloud-contract-stub-runner + 1.2.2.RELEASE + test + + + org.springframework.boot + spring-boot-starter-web + 1.5.9.RELEASE + + + org.springframework.boot + spring-boot-starter-data-rest + 1.5.9.RELEASE + + + com.baeldung.spring.cloud + spring-cloud-contract-producer + 1.0.0-SNAPSHOT + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java new file mode 100644 index 0000000000..7383ae5afa --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/SpringCloudContractConsumerApplication.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.cloud.springcloudcontractconsumer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +public class SpringCloudContractConsumerApplication { + public static void main(String[] args) { + SpringApplication.run(SpringCloudContractConsumerApplication.class, args); + } + + @Bean + RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java new file mode 100644 index 0000000000..58e6d5d5b8 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathController.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.cloud.springcloudcontractconsumer.controller; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + + +@RestController +public class BasicMathController { + + @Autowired + private RestTemplate restTemplate; + + @GetMapping("/calculate") + public String checkOddAndEven(@RequestParam("number") Integer number) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Content-Type", "application/json"); + + ResponseEntity responseEntity = restTemplate.exchange( + "http://localhost:8090/validate/prime-number?number=" + number, + HttpMethod.GET, + new HttpEntity<>(httpHeaders), + String.class); + + return responseEntity.getBody(); + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/resources/application.yml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/main/resources/application.yml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java new file mode 100644 index 0000000000..5cf5c6d3b8 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/spring/cloud/springcloudcontractconsumer/controller/BasicMathControllerIntegrationTest.java @@ -0,0 +1,44 @@ +package com.baeldung.spring.cloud.springcloudcontractconsumer.controller; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) +@AutoConfigureMockMvc +@AutoConfigureJsonTesters +@AutoConfigureStubRunner(workOffline = true, + ids = "com.baeldung.spring.cloud:spring-cloud-contract-producer:+:stubs:8090") +public class BasicMathControllerIntegrationTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void given_WhenPassEvenNumberInQueryParam_ThenReturnEven() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/calculate?number=2") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Even")); + } + + @Test + public void given_WhenPassOddNumberInQueryParam_ThenReturnOdd() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/calculate?number=1") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string("Odd")); + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml new file mode 100644 index 0000000000..ac27dbb645 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-contract-producer + 1.0.0-SNAPSHOT + jar + + spring-cloud-contract-producer + Spring Cloud Producer Sample + + + com.baeldung.spring.cloud + spring-cloud-contract + 1.0.0-SNAPSHOT + .. + + + + UTF-8 + UTF-8 + 1.8 + Edgware.SR1 + + + + + org.springframework.cloud + spring-cloud-starter-contract-verifier + test + + + org.springframework.boot + spring-boot-starter-web + 1.5.9.RELEASE + + + org.springframework.boot + spring-boot-starter-data-rest + 1.5.9.RELEASE + + + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + 1.2.2.RELEASE + true + + com.baeldung.spring.cloud.springcloudcontractproducer.BaseTestClass + + + + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java new file mode 100644 index 0000000000..770c68c817 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/SpringCloudContractProducerApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.cloud.springcloudcontractproducer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringCloudContractProducerApplication { + public static void main(String[] args) { + SpringApplication.run(SpringCloudContractProducerApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java new file mode 100644 index 0000000000..b8cc002fb4 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/java/com/baeldung/spring/cloud/springcloudcontractproducer/controller/EvenOddController.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.cloud.springcloudcontractproducer.controller; + + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class EvenOddController { + + @GetMapping("/validate/prime-number") + public String isNumberPrime(@RequestParam("number") Integer number) { + return number % 2 == 0 ? "Even" : "Odd"; + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/resources/application.properties b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java new file mode 100644 index 0000000000..253924b247 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/spring/cloud/springcloudcontractproducer/BaseTestClass.java @@ -0,0 +1,29 @@ +package com.baeldung.spring.cloud.springcloudcontractproducer; + +import com.baeldung.spring.cloud.springcloudcontractproducer.controller.EvenOddController; +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK) +@DirtiesContext +@AutoConfigureMessageVerifier +public class BaseTestClass { + + @Autowired + private EvenOddController evenOddController; + + @Before + public void setup() { + StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup(evenOddController); + RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder); + } +} diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy new file mode 100644 index 0000000000..78c36d7334 --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnEvenWhenRequestParamIsEven.groovy @@ -0,0 +1,17 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description "should return even when number input is even" + request { + method GET() + url("/validate/prime-number") { + queryParameters { + parameter("number", "2") + } + } + } + response { + body("Even") + status 200 + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy new file mode 100644 index 0000000000..215f987bbf --- /dev/null +++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/resources/contracts/shouldReturnOddWhenRequestParamIsOdd.groovy @@ -0,0 +1,17 @@ +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description "should return odd when number input is odd" + request { + method GET() + url("/validate/prime-number") { + queryParameters { + parameter("number", "1") + } + } + } + response { + body("Odd") + status 200 + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/pom.xml b/spring-cloud/spring-cloud-eureka/pom.xml index d1d564c9bf..e90609c48d 100644 --- a/spring-cloud/spring-cloud-eureka/pom.xml +++ b/spring-cloud/spring-cloud-eureka/pom.xml @@ -26,7 +26,7 @@ UTF-8 - 3.6.0 + 3.7.0 1.4.2.RELEASE diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml index 794a2a72f3..cd363ffef1 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml @@ -48,6 +48,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml index 9c43d35b23..038a0ab81d 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml @@ -58,6 +58,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml index 19df5e0e01..e4bae32011 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml @@ -43,6 +43,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml b/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml deleted file mode 100644 index 14cde4901a..0000000000 --- a/spring-cloud/spring-cloud-gateway/gateway-service/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ - - 4.0.0 - - gateway-service - 1.0.0-SNAPSHOT - jar - - Spring Cloud Gateway Service - - - com.baeldung.spring.cloud - spring-cloud-gateway - 1.0.0-SNAPSHOT - .. - - - - 2.0.0.M2 - - - - - org.springframework.boot - spring-boot-actuator - ${version} - - - org.springframework.boot - spring-boot-starter-webflux - ${version} - - - org.springframework.cloud - spring-cloud-gateway-core - ${version} - - - org.springframework.cloud - spring-cloud-starter-eureka - ${version} - - - org.hibernate - hibernate-validator-cdi - 6.0.2.Final - - - javax.validation - validation-api - 2.0.0.Final - - - io.projectreactor.ipc - reactor-netty - 0.7.0.M1 - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml index 095ca4ea31..90737f369d 100644 --- a/spring-cloud/spring-cloud-gateway/pom.xml +++ b/spring-cloud/spring-cloud-gateway/pom.xml @@ -4,13 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.spring.cloud spring-cloud-gateway - 1.0.0-SNAPSHOT - - gateway-service - - pom + jar Spring Cloud Gateway @@ -23,9 +18,63 @@ UTF-8 - 3.6.0 + 3.7.0 1.4.2.RELEASE + 2.0.0.M6 + + + + org.springframework.boot + spring-boot-actuator + ${version} + + + org.springframework.boot + spring-boot-starter-webflux + ${version} + + + org.springframework.cloud + spring-cloud-gateway-core + ${version} + + + + org.hibernate + hibernate-validator-cdi + 6.0.2.Final + + + javax.validation + validation-api + 2.0.0.Final + + + io.projectreactor.ipc + reactor-netty + 0.7.0.M1 + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java similarity index 100% rename from spring-cloud/spring-cloud-gateway/gateway-service/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/spring/cloud/GatewayApplication.java diff --git a/spring-cloud/spring-cloud-gateway/gateway-service/src/main/resources/application.yml b/spring-cloud/spring-cloud-gateway/src/main/resources/application.yml similarity index 100% rename from spring-cloud/spring-cloud-gateway/gateway-service/src/main/resources/application.yml rename to spring-cloud/spring-cloud-gateway/src/main/resources/application.yml diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml index 91ca3ced3f..5913b60a01 100644 --- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml @@ -72,6 +72,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-hystrix/pom.xml b/spring-cloud/spring-cloud-hystrix/pom.xml index fe759cd0f1..9a6af9a790 100644 --- a/spring-cloud/spring-cloud-hystrix/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/pom.xml @@ -25,7 +25,7 @@ UTF-8 - 3.6.0 + 3.7.0 1.4.2.RELEASE diff --git a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml index 6be3449502..46e408d339 100644 --- a/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/rest-consumer/pom.xml @@ -62,6 +62,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml b/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml index 796cb4159b..804ef2eb29 100644 --- a/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml +++ b/spring-cloud/spring-cloud-hystrix/rest-producer/pom.xml @@ -30,6 +30,11 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + org.springframework.boot diff --git a/spring-cloud/spring-cloud-rest/pom.xml b/spring-cloud/spring-cloud-rest/pom.xml index d0e9999ef6..6983ee2c7c 100644 --- a/spring-cloud/spring-cloud-rest/pom.xml +++ b/spring-cloud/spring-cloud-rest/pom.xml @@ -25,7 +25,7 @@ UTF-8 - 3.6.0 + 3.7.0 1.4.2.RELEASE diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml index fb84b33876..07f6ae3b55 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml @@ -12,10 +12,10 @@ Simple books API - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml index f0a563f16f..11320107be 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml @@ -12,10 +12,10 @@ Spring Cloud REST configuration server - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml index 0735808eea..d8dbc660d0 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml @@ -12,10 +12,10 @@ Spring Cloud REST server - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml index 2574cae4eb..4252947664 100644 --- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml +++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml @@ -12,10 +12,10 @@ Simple reviews API - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-4 + ../../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-ribbon-client/pom.xml b/spring-cloud/spring-cloud-ribbon-client/pom.xml index 68f3bd9439..85baff12cd 100644 --- a/spring-cloud/spring-cloud-ribbon-client/pom.xml +++ b/spring-cloud/spring-cloud-ribbon-client/pom.xml @@ -9,10 +9,10 @@ Introduction to Spring Cloud Rest Client with Netflix Ribbon - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-cloud/spring-cloud-security/README.md b/spring-cloud/spring-cloud-security/README.md new file mode 100644 index 0000000000..39af52c077 --- /dev/null +++ b/spring-cloud/spring-cloud-security/README.md @@ -0,0 +1,29 @@ +# README # + +This README would normally document whatever steps are necessary to get your application up and running. + +### What is this repository for? ### + +* Quick summary +* Version +* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) + +### How do I get set up? ### + +* Summary of set up +* Configuration +* Dependencies +* Database configuration +* How to run tests +* Deployment instructions + +### Contribution guidelines ### + +* Writing tests +* Code review +* Other guidelines + +### Who do I talk to? ### + +* Repo owner or admin +* Other community or team contact \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/alias.rtf b/spring-cloud/spring-cloud-security/alias.rtf new file mode 100644 index 0000000000..15509e1c83 --- /dev/null +++ b/spring-cloud/spring-cloud-security/alias.rtf @@ -0,0 +1,28 @@ +myauthkey + + +security: + oauth2: + resource: + jwt: + keyValue: | + -----BEGIN PUBLIC KEY----- + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjj4JDMgT4OoaXisEd8Nz + uiLwum9mh8BH1l9Atpe+uZkepf3Vnv0Bhxn0BGR+kYGwEHZPVpWsHEyTfIRdinaQ + vlPaxWJquQW25yYstrCuQTKJvFjSO/cX/V4OGi1RUj76mOpwzkm1Kui3R7Sfh8Zo + WO0GiWIFJqNBsZ9b1wOfBMXnge+A+u/qxVNnTFpwCVj6k2Yb4YUsmLNCmND7E3Ra + BnrNQWqMU2numhV+ADpmVH08m/+pWdZ896uYu/tvQnz3agvZPcFsEst7LcNAWQFT + eNLkfwVfepKWa9jPELemtTLf1MkMppU+Lj1UNCr8x4Y6EupRDZhplVNtqYsPNDpO + 7wIDAQAB + -----END PUBLIC KEY----- + + + +jwt: + certificate: + store: + file: classpath:/certificate/my-auth-server.jks + password: storepassword + key: + alias: myauthserver + password: keypassword \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-client/pom.xml b/spring-cloud/spring-cloud-security/auth-client/pom.xml new file mode 100644 index 0000000000..5213b93f9a --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + com.baeldung + auth-client + 0.0.1-SNAPSHOT + jar + + auth-client + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Dalston.SR4 + pom + import + + + + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-oauth2 + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.boot + spring-boot-starter-test + test + + + org.webjars + jquery + + + org.webjars + bootstrap + + + org.webjars + webjars-locator + + + + org.springframework.boot + spring-boot-starter-security + + + org.webjars + js-cookie + 2.1.0 + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/CloudSite.java b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/CloudSite.java new file mode 100644 index 0000000000..a072605ec0 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/CloudSite.java @@ -0,0 +1,22 @@ +package com.baeldung; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import com.baeldung.filters.SimpleFilter; + + +@SpringBootApplication +public class CloudSite { + public static void main(String[] args) { + SpringApplication.run(CloudSite.class, args); + } + + @Bean + public SimpleFilter simpleFilter() { + return new SimpleFilter(); + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/config/SiteSecurityConfigurer.java b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/config/SiteSecurityConfigurer.java new file mode 100644 index 0000000000..217edb22fb --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/config/SiteSecurityConfigurer.java @@ -0,0 +1,49 @@ +package com.baeldung.config; + +import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.oauth2.client.OAuth2ClientContext; +import org.springframework.security.oauth2.client.OAuth2RestOperations; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; + +@EnableZuulProxy +@Configuration +@EnableOAuth2Sso +public class SiteSecurityConfigurer + extends + WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) + throws Exception { + http.antMatcher("/**") + .authorizeRequests() + .antMatchers("/", "/webjars/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .logout() + .logoutSuccessUrl("/") + .permitAll() + .and() + .csrf() + .csrfTokenRepository( + CookieCsrfTokenRepository + .withHttpOnlyFalse()); + } + + @Bean + public OAuth2RestOperations restOperations( + OAuth2ProtectedResourceDetails resource, + OAuth2ClientContext context) { + return new OAuth2RestTemplate(resource, context); + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/controller/CloudSiteController.java b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/controller/CloudSiteController.java new file mode 100644 index 0000000000..c77a5e02c5 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/controller/CloudSiteController.java @@ -0,0 +1,30 @@ +package com.baeldung.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestOperations; +import org.springframework.web.servlet.ModelAndView; + +@RestController +public class CloudSiteController { + + @Autowired + private RestOperations restOperations; + + @GetMapping("/") + @ResponseBody + public String helloFromBaeldung() { + return "Hello From Baeldung!"; + } + + @GetMapping("/personInfo") + public ModelAndView person() { + ModelAndView mav = new ModelAndView("personinfo"); + String personResourceUrl = "http://localhost:9000/person"; + mav.addObject("person", restOperations.getForObject(personResourceUrl, String.class)); + return mav; + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java new file mode 100644 index 0000000000..98e25ac9c4 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/java/com/baeldung/filters/SimpleFilter.java @@ -0,0 +1,39 @@ +package com.baeldung.filters; + +import javax.servlet.http.HttpServletRequest; +import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.ZuulFilter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SimpleFilter extends ZuulFilter { + + private static Logger log = LoggerFactory.getLogger(SimpleFilter.class); + + @Override + public String filterType() { + return "pre"; + } + + @Override + public int filterOrder() { + return 1; + } + + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run() { + RequestContext ctx = RequestContext.getCurrentContext(); + HttpServletRequest request = ctx.getRequest(); + + log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString())); + + return null; + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/resources/application.properties b/spring-cloud/spring-cloud-security/auth-client/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/resources/application.yml b/spring-cloud/spring-cloud-security/auth-client/src/main/resources/application.yml new file mode 100644 index 0000000000..2a758faeae --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/resources/application.yml @@ -0,0 +1,37 @@ +# Make the application available at http://localhost:8080 +# These are default settings, but we add them for clarity. +server: + port: 8080 + contextPath: / + +# Configure the Authorization Server and User Info Resource Server details +security: + oauth2: + client: + accessTokenUri: http://localhost:7070/authserver/oauth/token + userAuthorizationUri: http://localhost:7070/authserver/oauth/authorize + clientId: authserver + clientSecret: passwordforauthserver + resource: + userInfoUri: http://localhost:9000/user + +person: + url: http://localhost:9000/person + +# Proxies the calls to http://localhost:8080/api/* to our REST service at http://localhost:8081/* +# and automatically includes our OAuth2 token in the request headers +zuul: + routes: + resource: + path: /api/** + url: http://localhost:9000 + user: + path: /user/** + url: http://localhost:9000/user + +# Make sure the OAuth2 token is only relayed when using the internal API, +# do not pass any authentication to the external API +proxy: + auth: + routes: + api: oauth2 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-client/src/main/resources/templates/personinfo.html b/spring-cloud/spring-cloud-security/auth-client/src/main/resources/templates/personinfo.html new file mode 100644 index 0000000000..bc3197e93a --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/main/resources/templates/personinfo.html @@ -0,0 +1,13 @@ + + + + +Getting Personal Information + + +

Providing Person Information

+

+ Person's information: +

+ + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationTests.java b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationTests.java new file mode 100644 index 0000000000..5fa51a61c3 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationTests.java @@ -0,0 +1,16 @@ +package com.example.springoath2; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class Springoath2ApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-resource/pom.xml b/spring-cloud/spring-cloud-security/auth-resource/pom.xml new file mode 100644 index 0000000000..2c54d24e7d --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.baeldung + auth-resource + 0.0.1-SNAPSHOT + jar + + auth-resource + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Edgware.RELEASE + + + + + org.springframework.security.oauth + spring-security-oauth2 + + + org.springframework.cloud + spring-cloud-starter-security + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-jwt + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/Application.java b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..8c087476bf --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/Application.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/config/ResourceConfigurer.java b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/config/ResourceConfigurer.java new file mode 100644 index 0000000000..977d74093a --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/config/ResourceConfigurer.java @@ -0,0 +1,25 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; +import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; + +/** + * REST API Resource Server. + */ +@Configuration +@EnableWebSecurity +@EnableResourceServer +@EnableGlobalMethodSecurity(prePostEnabled = true) // Allow method annotations like @PreAuthorize +public class ResourceConfigurer extends ResourceServerConfigurerAdapter { + + @Override + public void configure(HttpSecurity http) throws Exception { + http.httpBasic().disable(); + http.authorizeRequests().anyRequest().authenticated(); + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/PersonInfoController.java b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/PersonInfoController.java new file mode 100644 index 0000000000..1958c0ebb8 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/PersonInfoController.java @@ -0,0 +1,18 @@ +package com.baeldung.controller; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.model.Person; + +@RestController +public class PersonInfoController { + + @GetMapping("/person") + @PreAuthorize("hasAnyRole('ADMIN', 'USER')") + public @ResponseBody Person personInfo() { + return new Person("abir", "Dhaka", "Bangladesh", 29, "Male"); + } +} diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/ResourceController.java b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/ResourceController.java new file mode 100644 index 0000000000..739a6f6240 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/controller/ResourceController.java @@ -0,0 +1,20 @@ +package com.baeldung.controller; + +import java.security.Principal; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Because this application is also a User Info Resource Server, we expose info about the logged in user at: + * + * http://localhost:9090/auth/user + */ +@RestController +public class ResourceController { + + @RequestMapping("/user") + public Principal user(Principal user) { + return user; + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/model/Person.java b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/model/Person.java new file mode 100644 index 0000000000..b568291da3 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/java/com/baeldung/model/Person.java @@ -0,0 +1,59 @@ +package com.baeldung.model; + +public class Person { + + private String name; + private String city; + private String country; + private Integer age; + private String sex; + + public Person(String name, String city, String country, Integer age, String sex) { + this.name = name; + this.city = city; + this.country = country; + this.age = age; + this.sex = sex; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/main/resources/application.yml b/spring-cloud/spring-cloud-security/auth-resource/src/main/resources/application.yml new file mode 100644 index 0000000000..52e02ba41b --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/main/resources/application.yml @@ -0,0 +1,21 @@ +# Make the application available at http://localhost:9000 + +server: + port: 9000 + +# Configure the public key to use for verifying the incoming JWT tokens +security: + sessions: NEVER + oauth2: + resource: + jwt: + keyValue: | + -----BEGIN PUBLIC KEY----- + MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhiiifKv6Otf5PyqIE+LQ + EiJRRh6q8piPY9Okq+RfRu9Bue0D8hq7aFxcgkLZ6Bg9CAS+w1KdaE5MMeOCVVxv + rpRETzVpAsh6GL5nBc679jSqMzjr3V4uty46ilL4VHKSxlZh5Nmz5EMHPI5iwpNs + 8U5n3QiwsTk514FXad54xPSPH3i/pDzGSZHrVcwDVaOKn7gFiIqP86vkJB47JZv8 + T6P5RK7Rj06zoG45DMGWG3DQv6o1/Jm4IJQWj0AUD3bSHqzXkPr7qyMYvkE4kyMH + 6aVAsAYMxilZFlJMv2b8N883gdi3LEeOJo8zZr5IWyyROfepdeOL7UkAXddAj+dL + WQIDAQAB + -----END PUBLIC KEY----- \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationTests.java b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationTests.java new file mode 100644 index 0000000000..e0fe7006d9 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/service/personservice/PersonserviceApplicationTests.java @@ -0,0 +1,16 @@ +package com.baeldung.service.personservice; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class PersonserviceApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml new file mode 100644 index 0000000000..ab30f3f2ec --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.baeldung + auth-server + 0.0.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-devtools + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.cloud + spring-cloud-starter-oauth2 + 1.1.2.RELEASE + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/AuthServer.java b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/AuthServer.java new file mode 100644 index 0000000000..c5b330b0e3 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/AuthServer.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.*; + +@SpringBootApplication +public class AuthServer { + + public static void main(String[] args) { + SpringApplication.run(AuthServer.class, args); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/AuthServerConfigurer.java b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/AuthServerConfigurer.java new file mode 100644 index 0000000000..32e445f998 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/AuthServerConfigurer.java @@ -0,0 +1,77 @@ +package com.baeldung.config; + +import java.security.KeyPair; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.Resource; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; +import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; +import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; +import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; +import org.springframework.security.oauth2.provider.token.store.KeyStoreKeyFactory; + +@Configuration +@EnableAuthorizationServer +@Order(6) +public class AuthServerConfigurer + extends + AuthorizationServerConfigurerAdapter { + + @Value("${jwt.certificate.store.file}") + private Resource keystore; + + @Value("${jwt.certificate.store.password}") + private String keystorePassword; + + @Value("${jwt.certificate.key.alias}") + private String keyAlias; + + @Value("${jwt.certificate.key.password}") + private String keyPassword; + + @Autowired + private UserDetailsService userDetailsService; + + @Override + public void configure( + ClientDetailsServiceConfigurer clients) + throws Exception { + clients + .inMemory() + .withClient("authserver") + .secret("passwordforauthserver") + .redirectUris("http://localhost:8080/") + .authorizedGrantTypes("authorization_code", + "refresh_token") + .scopes("myscope") + .autoApprove(true) + .accessTokenValiditySeconds(30) + .refreshTokenValiditySeconds(1800); + } + + @Override + public void configure( + AuthorizationServerEndpointsConfigurer endpoints) + throws Exception { + endpoints + .accessTokenConverter(jwtAccessTokenConverter()) + .userDetailsService(userDetailsService); + } + + @Bean + public JwtAccessTokenConverter jwtAccessTokenConverter() { + KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory( + keystore, keystorePassword.toCharArray()); + KeyPair keyPair = keyStoreKeyFactory.getKeyPair( + keyAlias, keyPassword.toCharArray()); + JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); + converter.setKeyPair(keyPair); + return converter; + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebMvcConfigurer.java b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebMvcConfigurer.java new file mode 100644 index 0000000000..23b56151e7 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebMvcConfigurer.java @@ -0,0 +1,14 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +public class WebMvcConfigurer extends WebMvcConfigurerAdapter { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("login").setViewName("login"); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebSecurityConfigurer.java b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebSecurityConfigurer.java new file mode 100644 index 0000000000..44406b8fa0 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/java/com/baeldung/config/WebSecurityConfigurer.java @@ -0,0 +1,52 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client; + +@Configuration +@EnableWebSecurity +@EnableOAuth2Client +public class WebSecurityConfigurer + extends + WebSecurityConfigurerAdapter { + + + @Override + protected void configure(HttpSecurity http) + throws Exception { + http + .authorizeRequests() + .antMatchers("/login**").permitAll() + .anyRequest().authenticated() + .and().csrf() + .and().formLogin().loginPage("/login"); + } + + @Override + protected void configure( + AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user").password("user") + .roles("USER") + .and() + .withUser("admin").password("admin") + .roles("USER", "ADMIN"); + } + + @Override + @Bean(name = "userDetailsService") + public UserDetailsService userDetailsServiceBean() + throws Exception { + return super.userDetailsServiceBean(); + } + + +} diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/resources/application.yml b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/application.yml new file mode 100644 index 0000000000..1dc63d3f0e --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/application.yml @@ -0,0 +1,21 @@ +# Make the application available at http://localhost:7070/authserver +server: + port: 7070 + contextPath: /authserver + +# Our certificate settings for enabling JWT tokens +jwt: + certificate: + store: + file: classpath:/certificate/mykeystore.jks + password: abirkhan04 + key: + alias: myauthkey + password: abirkhan04 + + +security: + oauth2: + resource: + filter-order: 3 + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/resources/certificate/mykeystore.jks b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/certificate/mykeystore.jks new file mode 100644 index 0000000000..9cf25e3224 Binary files /dev/null and b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/certificate/mykeystore.jks differ diff --git a/spring-cloud/spring-cloud-security/auth-server/src/main/resources/templates/login.html b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/templates/login.html new file mode 100644 index 0000000000..f5ab5a6f26 --- /dev/null +++ b/spring-cloud/spring-cloud-security/auth-server/src/main/resources/templates/login.html @@ -0,0 +1,29 @@ + + + + + Baeldung Spring cloud Security + + + +

Login

+ + +
+
+

Username and Password:

+

+ + +

+

+ + +

+

+ +

+
+
+ + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-security/mykeystore.jks b/spring-cloud/spring-cloud-security/mykeystore.jks new file mode 100644 index 0000000000..9cf25e3224 Binary files /dev/null and b/spring-cloud/spring-cloud-security/mykeystore.jks differ diff --git a/spring-cloud/spring-cloud-security/pubkey.txt b/spring-cloud/spring-cloud-security/pubkey.txt new file mode 100644 index 0000000000..2c391ba2dd --- /dev/null +++ b/spring-cloud/spring-cloud-security/pubkey.txt @@ -0,0 +1,30 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhiiifKv6Otf5PyqIE+LQ +EiJRRh6q8piPY9Okq+RfRu9Bue0D8hq7aFxcgkLZ6Bg9CAS+w1KdaE5MMeOCVVxv +rpRETzVpAsh6GL5nBc679jSqMzjr3V4uty46ilL4VHKSxlZh5Nmz5EMHPI5iwpNs +8U5n3QiwsTk514FXad54xPSPH3i/pDzGSZHrVcwDVaOKn7gFiIqP86vkJB47JZv8 +T6P5RK7Rj06zoG45DMGWG3DQv6o1/Jm4IJQWj0AUD3bSHqzXkPr7qyMYvkE4kyMH +6aVAsAYMxilZFlJMv2b8N883gdi3LEeOJo8zZr5IWyyROfepdeOL7UkAXddAj+dL +WQIDAQAB +-----END PUBLIC KEY----- +-----BEGIN CERTIFICATE----- +MIIDfzCCAmegAwIBAgIEDqsC7jANBgkqhkiG9w0BAQsFADBwMQswCQYDVQQGEwI4 +ODETMBEGA1UECBMKQmFuZ2xhZGVzaDEOMAwGA1UEBxMFRGhha2ExETAPBgNVBAoT +CEJhZWxkdW5nMRUwEwYDVQQLEwxCYWVsZHVuZ2Jsb2cxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAeFw0xNzEyMjUxNDE0MDhaFw0xODAzMjUxNDE0MDhaMHAxCzAJBgNVBAYT +Ajg4MRMwEQYDVQQIEwpCYW5nbGFkZXNoMQ4wDAYDVQQHEwVEaGFrYTERMA8GA1UE +ChMIQmFlbGR1bmcxFTATBgNVBAsTDEJhZWxkdW5nYmxvZzESMBAGA1UEAxMJbG9j +YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhiiifKv6Otf5 +PyqIE+LQEiJRRh6q8piPY9Okq+RfRu9Bue0D8hq7aFxcgkLZ6Bg9CAS+w1KdaE5M +MeOCVVxvrpRETzVpAsh6GL5nBc679jSqMzjr3V4uty46ilL4VHKSxlZh5Nmz5EMH +PI5iwpNs8U5n3QiwsTk514FXad54xPSPH3i/pDzGSZHrVcwDVaOKn7gFiIqP86vk +JB47JZv8T6P5RK7Rj06zoG45DMGWG3DQv6o1/Jm4IJQWj0AUD3bSHqzXkPr7qyMY +vkE4kyMH6aVAsAYMxilZFlJMv2b8N883gdi3LEeOJo8zZr5IWyyROfepdeOL7UkA +XddAj+dLWQIDAQABoyEwHzAdBgNVHQ4EFgQUHLFYkq36Wami5qsVRe/1eQedmdgw +DQYJKoZIhvcNAQELBQADggEBABL3lYyuRd6Hv8DPus/zQL0bRl6gVsEzczwmWMUA +3NJZbUHAD/KC732aArvKIKykkbLG6K/Mhnfuu8YBfWzTvGgY3Ww+ka2sJFOsUW7r +sa6OBtNHh4zhDYN2Weza+4jnRLxtkzFbm6v2sheFkyB1NywCwFE/6p1Z6KTG8RyJ +gw/OHl6rb+Y/T6cOeeTCFUN/v+qRVSB9I/MjSK5wRNbFT+MyNUeL6gsiyIvxSZbj +y4vrjGHkXasSmwkfvgw67mJMk4XTGrVLjIXUTyzbdSmodcv8N6nrsIk4SBYCnTrI +E/5NtNgbOFGwovde5yNrZIjjAC1VGOmVFhcxFJpwT6ZkSks= +-----END CERTIFICATE----- diff --git a/spring-cloud/spring-cloud-stream-starters/bash/hadoop.sh b/spring-cloud/spring-cloud-stream-starters/bash/hadoop.sh new file mode 100644 index 0000000000..ca8298430b --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/bash/hadoop.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# For Ubuntu 14.04 +# Inspired from: https://github.com/curran/setupHadoop/blob/master/setupHadoop.sh +# Use from the user directory + +# Install Java +sudo apt-get update +sudo add-apt-repository -y ppa:webupd8team/java +sudo apt-get install -y oracle-java8-installer + +# Install Hadoop +curl -O http://mirror.cogentco.com/pub/apache/hadoop/common/hadoop-2.8.2/hadoop-2.8.2.tar.gz +tar xfz hadoop-2.8.2.tar.gz +sudo mv hadoop-2.8.2 /usr/local/hadoop +rm hadoop-2.8.2.tar.gz + +# Environmental Variables +echo export JAVA_HOME=/usr/lib/jvm/java-8-oracle >> ~/.bashrc +echo export HADOOP_PREFIX=/usr/local/hadoop >> ~/.bashrc +echo export PATH=\$PATH:/usr/local/hadoop/bin >> ~/.bashrc +echo export PATH=\$PATH:/usr/local/hadoop/sbin >> ~/.bashrc +source ~/.bashrc + +# Copy configuration files +cp master/* /usr/local/hadoop/etc/hadoop/ + +# Format HDFS +hdfs namenode -format + +# SSH keys for Hadoop to use. +ssh-keygen -t rsa -P 'password' -f ~/.ssh/id_rsa.pub +sudo mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys + +# SSH +ssh localhost +# authenticate with osboxes.org + +# Start NameNode daemon and DataNode daemon +start-dfs.sh +# stop-dfs.sh + +# Install Maven +sudo apt-get install maven + +# Access Hadoop - http://localhost:50070 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/boot/.gitignore b/spring-cloud/spring-cloud-stream-starters/boot/.gitignore new file mode 100644 index 0000000000..e4b82e1c0f --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/.gitignore @@ -0,0 +1,3 @@ +.idea +*/target/* +*.iml diff --git a/spring-cloud/spring-cloud-stream-starters/boot/pom.xml b/spring-cloud/spring-cloud-stream-starters/boot/pom.xml new file mode 100644 index 0000000000..3e6bc134e3 --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + com.baeldung.twitterhdfs + twitterhdfs + jar + 1.0.0 + + twitterhdfs + + + UTF-8 + UTF-8 + 1.8 + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + + org.springframework.cloud.stream.app + spring-cloud-starter-stream-source-twitterstream + 1.3.1.RELEASE + + + org.springframework.cloud.stream.app + spring-cloud-starter-stream-sink-hdfs + 1.3.1.RELEASE + + + + + javax.servlet + jstl + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + twitterhdfs + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java new file mode 100644 index 0000000000..8b9ca6dc62 --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/aggregate/AggregateApp.java @@ -0,0 +1,18 @@ +package com.baeldung.twitterhdfs.aggregate; + +import com.baeldung.twitterhdfs.processor.ProcessorApp; +import com.baeldung.twitterhdfs.source.SourceApp; +import com.baeldung.twitterhdfs.sink.SinkApp; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.aggregate.AggregateApplicationBuilder; + +@SpringBootApplication +public class AggregateApp { + public static void main(String[] args) { + new AggregateApplicationBuilder() + .from(SourceApp.class).args("--fixedDelay=5000") + .via(ProcessorApp.class) + .to(SinkApp.class).args("--debug=true") + .run(args); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java new file mode 100644 index 0000000000..e3bd1197f6 --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/processor/ProcessorApp.java @@ -0,0 +1,20 @@ +package com.baeldung.twitterhdfs.processor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.integration.annotation.Transformer; + +@SpringBootApplication +@EnableBinding(Processor.class) +public class ProcessorApp { + Logger log = LoggerFactory.getLogger(ProcessorApp.class); + + @Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT) + public String processMessage(String payload) { + log.info("Payload received!"); + return payload; + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java new file mode 100644 index 0000000000..c0c1e287d3 --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/sink/SinkApp.java @@ -0,0 +1,22 @@ +package com.baeldung.twitterhdfs.sink; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.app.hdfs.sink.HdfsSinkConfiguration; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.context.annotation.Import; +import org.springframework.integration.annotation.ServiceActivator; + +@SpringBootApplication +@EnableBinding(Sink.class) +@Import(HdfsSinkConfiguration.class) +public class SinkApp { + Logger log = LoggerFactory.getLogger(SinkApp.class); + + @ServiceActivator(inputChannel= Sink.INPUT) + public void loggerSink(Object payload) { + log.info("Received: " + payload); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java new file mode 100644 index 0000000000..f9b220561b --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/src/main/java/com/baeldung/twitterhdfs/source/SourceApp.java @@ -0,0 +1,26 @@ +package com.baeldung.twitterhdfs.source; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.app.twitterstream.source.TwitterstreamSourceConfiguration; +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.context.annotation.Import; +import org.springframework.integration.annotation.InboundChannelAdapter; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@SpringBootApplication +@EnableBinding(Source.class) +@Import(TwitterstreamSourceConfiguration.class) +public class SourceApp { + Logger log = LoggerFactory.getLogger(SourceApp.class); + + @InboundChannelAdapter(value = Source.OUTPUT) + public String timerMessageSource() { + return new SimpleDateFormat().format(new Date()); + } + +} diff --git a/spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/application.properties b/spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/application.properties new file mode 100644 index 0000000000..298a8ebf4d --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/boot/src/main/resources/application.properties @@ -0,0 +1,6 @@ +hdfs.fs-uri=hdfs://127.0.0.1:50010/ + +twitter.credentials.access-token= +twitter.credentials.access-token-secret= +twitter.credentials.consumer-key= +twitter.credentials.consumer-secret= \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/hdfs/application.properties b/spring-cloud/spring-cloud-stream-starters/hdfs/application.properties new file mode 100644 index 0000000000..1f4aaf88dd --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/hdfs/application.properties @@ -0,0 +1 @@ +hdfs.fs-uri=hdfs://127.0.0.1:50010/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/hdfs/hdfs.sh b/spring-cloud/spring-cloud-stream-starters/hdfs/hdfs.sh new file mode 100644 index 0000000000..f1c6bfcf3f --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/hdfs/hdfs.sh @@ -0,0 +1,11 @@ +# Git spring-cloud-stream-app-starters +# https://github.com/spring-cloud-stream-app-starters/hdfs/blob/master/spring-cloud-starter-stream-sink-hdfs/README.adoc +git clone https://github.com/spring-cloud-stream-app-starters/hdfs.git + +# Build it +./mvnw clean install -PgenerateApps + +# Run it +cd target +# Optionally inject application.properties prior to build +java -jar hdfs-sink.jar --fsUri=hdfs://127.0.0.1:50010/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/twitter/application.properties b/spring-cloud/spring-cloud-stream-starters/twitter/application.properties new file mode 100644 index 0000000000..e38612d25e --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/twitter/application.properties @@ -0,0 +1,4 @@ +twitter.credentials.access-token= +twitter.credentials.access-token-secret= +twitter.credentials.consumer-key= +twitter.credentials.consumer-secret= \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream-starters/twitter/twitter.sh b/spring-cloud/spring-cloud-stream-starters/twitter/twitter.sh new file mode 100644 index 0000000000..967cb54dfe --- /dev/null +++ b/spring-cloud/spring-cloud-stream-starters/twitter/twitter.sh @@ -0,0 +1,12 @@ +# Git spring-cloud-stream-app-starters +# https://github.com/spring-cloud-stream-app-starters/hdfs/blob/master/spring-cloud-starter-stream-sink-hdfs/README.adoc +git clone https://github.com/spring-cloud-stream-app-starters/twitter.git + +# Build it +./mvnw clean install -PgenerateApps + +# Run it +cd target +# Optionally inject application.properties prior to build +java -jar twitter_stream_source.jar --consumerKey= --consumerSecret= \ + --accessToken= --accessTokenSecret= \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/README.md b/spring-cloud/spring-cloud-stream/README.md new file mode 100644 index 0000000000..5ecb852df5 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Introduction to Spring Cloud Stream](http://www.baeldung.com/spring-cloud-stream) diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml new file mode 100644 index 0000000000..65a327e664 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.baeldung + spring-cloud-stream + pom + + spring-cloud-stream + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + + + + spring-cloud-stream-rabbit + + + + UTF-8 + 3.7.0 + + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + ${spring-cloud-stream.version} + + + + org.springframework.cloud + spring-cloud-stream + ${spring-cloud-stream.version} + + + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream.version} + test + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml new file mode 100644 index 0000000000..a954a7035e --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + spring-cloud-stream-rabbit + jar + + spring-cloud-stream-rabbit + Simple Spring Cloud Stream + + + org.baeldung + spring-cloud-stream + 1.0.0-SNAPSHOT + .. + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + + org.springframework.cloud + spring-cloud-stream-test-support + test + + + + diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java new file mode 100644 index 0000000000..375494dfac --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplication.java @@ -0,0 +1,38 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@SpringBootApplication +@EnableBinding(MyProcessor.class) +public class MultipleOutputsServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MultipleOutputsServiceApplication.class, args); + } + + @Autowired + private MyProcessor processor; + + @StreamListener(MyProcessor.INPUT) + public void routeValues(Integer val) { + if (val < 10) { + processor.anOutput() + .send(message(val)); + } else { + processor.anotherOutput() + .send(message(val)); + } + } + + private static final Message message(T val) { + return MessageBuilder.withPayload(val) + .build(); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java new file mode 100644 index 0000000000..4729e418b6 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceApplication.java @@ -0,0 +1,39 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@SpringBootApplication +@EnableBinding(MyProcessor.class) +public class MultipleOutputsWithConditionsServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MultipleOutputsWithConditionsServiceApplication.class, args); + } + + @Autowired + private MyProcessor processor; + + @StreamListener(target = MyProcessor.INPUT, condition = "payload < 10") + public void routeValuesToAnOutput(Integer val) { + processor.anOutput() + .send(message(val)); + } + + @StreamListener(target = MyProcessor.INPUT, condition = "payload >= 10") + public void routeValuesToAnotherOutput(Integer val) { + processor.anotherOutput() + .send(message(val)); + } + + private static final Message message(T val) { + return MessageBuilder.withPayload(val) + .build(); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java new file mode 100644 index 0000000000..aac551e544 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerServiceApplication.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.context.annotation.Bean; +import org.springframework.messaging.converter.MessageConverter; +import org.springframework.messaging.handler.annotation.SendTo; + +import com.baeldung.spring.cloud.stream.rabbit.messages.TextPlainMessageConverter; +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +@SpringBootApplication +@EnableBinding(Processor.class) +public class MyLoggerServiceApplication { + public static void main(String[] args) { + SpringApplication.run(MyLoggerServiceApplication.class, args); + } + + @Bean + public MessageConverter providesTextPlainMessageConverter() { + return new TextPlainMessageConverter(); + } + + @StreamListener(Processor.INPUT) + @SendTo(Processor.OUTPUT) + public LogMessage enrichLogMessage(LogMessage log) { + return new LogMessage(String.format("[1]: %s", log.getMessage())); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java new file mode 100644 index 0000000000..d690ee38a9 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/messages/TextPlainMessageConverter.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.cloud.stream.rabbit.messages; + +import org.springframework.messaging.Message; +import org.springframework.messaging.converter.AbstractMessageConverter; +import org.springframework.util.MimeType; + +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +public class TextPlainMessageConverter extends AbstractMessageConverter { + + public TextPlainMessageConverter() { + super(new MimeType("text", "plain")); + } + + @Override + protected boolean supports(Class clazz) { + return (LogMessage.class == clazz); + } + + @Override + protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { + Object payload = message.getPayload(); + String text = payload instanceof String ? (String) payload : new String((byte[]) payload); + return new LogMessage(text); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java new file mode 100644 index 0000000000..44a6ca4d4e --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/model/LogMessage.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.stream.rabbit.model; + +import java.io.Serializable; + +public class LogMessage implements Serializable { + + private static final long serialVersionUID = -5857383701708275796L; + + private String message; + + public LogMessage() { + + } + + public LogMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return message; + } + +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java new file mode 100644 index 0000000000..563ce06b6f --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/java/com/baeldung/spring/cloud/stream/rabbit/processor/MyProcessor.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.cloud.stream.rabbit.processor; + +import org.springframework.cloud.stream.annotation.Input; +import org.springframework.cloud.stream.annotation.Output; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.SubscribableChannel; + +public interface MyProcessor { + String INPUT = "myInput"; + + @Input + SubscribableChannel myInput(); + + @Output("myOutput") + MessageChannel anOutput(); + + @Output + MessageChannel anotherOutput(); +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml new file mode 100644 index 0000000000..3d9d97a736 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/main/resources/application.yml @@ -0,0 +1,28 @@ +spring: + cloud: + stream: + bindings: + input: + destination: queue.log.messages + binder: local_rabbit + group: logMessageConsumers + output: + destination: queue.pretty.log.messages + binder: local_rabbit + binders: + local_rabbit: + type: rabbit + environment: + spring: + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest + virtual-host: / +server: + port: 0 +management: + health: + binders: + enabled: true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java new file mode 100644 index 0000000000..898d06897f --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MultipleOutputsServiceApplication.class) +@DirtiesContext +public class MultipleOutputsServiceApplicationIntegrationTest { + + @Autowired + private MyProcessor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void whenSendMessage_thenResponseIsInAOutput() { + whenSendMessage(1); + thenPayloadInChannelIs(pipe.anOutput(), 1); + } + + @Test + public void whenSendMessage_thenResponseIsInAnotherOutput() { + whenSendMessage(11); + thenPayloadInChannelIs(pipe.anotherOutput(), 11); + } + + private void whenSendMessage(Integer val) { + pipe.myInput() + .send(MessageBuilder.withPayload(val) + .build()); + } + + private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { + Object payload = messageCollector.forChannel(channel) + .poll() + .getPayload(); + assertEquals(expectedValue, payload); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java new file mode 100644 index 0000000000..c3bf5a1205 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.processor.MyProcessor; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MultipleOutputsWithConditionsServiceApplication.class) +@DirtiesContext +public class MultipleOutputsWithConditionsServiceIntegrationTest { + + @Autowired + private MyProcessor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void whenSendMessage_thenResponseIsInAOutput() { + whenSendMessage(1); + thenPayloadInChannelIs(pipe.anOutput(), 1); + } + + @Test + public void whenSendMessage_thenResponseIsInAnotherOutput() { + whenSendMessage(11); + thenPayloadInChannelIs(pipe.anotherOutput(), 11); + } + + private void whenSendMessage(Integer val) { + pipe.myInput() + .send(MessageBuilder.withPayload(val) + .build()); + } + + private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) { + Object payload = messageCollector.forChannel(channel) + .poll() + .getPayload(); + assertEquals(expectedValue, payload); + } +} diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java new file mode 100644 index 0000000000..21d84e79e0 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java @@ -0,0 +1,40 @@ +package com.baeldung.spring.cloud.stream.rabbit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.cloud.stream.test.binder.MessageCollector; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.cloud.stream.rabbit.model.LogMessage; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MyLoggerServiceApplication.class) +@DirtiesContext +public class MyLoggerApplicationIntegrationTest { + + @Autowired + private Processor pipe; + + @Autowired + private MessageCollector messageCollector; + + @Test + public void whenSendMessage_thenResponseShouldUpdateText() { + pipe.input() + .send(MessageBuilder.withPayload(new LogMessage("This is my message")) + .build()); + + Object payload = messageCollector.forChannel(pipe.output()) + .poll() + .getPayload(); + + assertEquals("[1]: This is my message", payload.toString()); + } +} diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/.gitignore b/spring-cloud/spring-cloud-task/springcloudtaskbatch/.gitignore new file mode 100644 index 0000000000..f675857856 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/.gitignore @@ -0,0 +1,2 @@ +/target/ +/.settings/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml new file mode 100644 index 0000000000..4805f5296c --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + org.baeldung.cloud + springcloudtask + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + + + + + com.baeldung.TaskDemo + UTF-8 + UTF-8 + 1.8 + 1.2.2.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + mysql + mysql-connector-java + + + org.springframework.cloud + spring-cloud-starter-task + + + + org.springframework.cloud + spring-cloud-task-core + + + + org.springframework.boot + spring-boot-starter-batch + + + + org.springframework.cloud + spring-cloud-task-batch + + + + + + + org.springframework.cloud + spring-cloud-task-dependencies + ${spring-cloud-task.version} + pom + import + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/HelloWorldTaskConfigurer.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/HelloWorldTaskConfigurer.java new file mode 100644 index 0000000000..dc2ba53138 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/HelloWorldTaskConfigurer.java @@ -0,0 +1,14 @@ +package com.baeldung.task; + +import javax.sql.DataSource; + +import org.springframework.cloud.task.configuration.DefaultTaskConfigurer; + +public class HelloWorldTaskConfigurer + extends + DefaultTaskConfigurer { + + public HelloWorldTaskConfigurer(DataSource dataSource) { + super(dataSource); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/JobConfiguration.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/JobConfiguration.java new file mode 100644 index 0000000000..6c215ad53d --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/JobConfiguration.java @@ -0,0 +1,105 @@ +package com.baeldung.task; + +import java.util.Arrays; +import java.util.List; +import java.util.logging.Logger; + +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.support.ListItemReader; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JobConfiguration { + + private final static Logger LOGGER = Logger + .getLogger(JobConfiguration.class.getName()); + + @Autowired + private JobBuilderFactory jobBuilderFactory; + + @Autowired + private StepBuilderFactory stepBuilderFactory; + + @Bean + public Step step1() { + return this.stepBuilderFactory.get("job1step1") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute( + StepContribution contribution, + ChunkContext chunkContext) + throws Exception { + LOGGER.info("Tasklet has run"); + return RepeatStatus.FINISHED; + } + }).build(); + } + + @Bean + public Step step2() { + return this.stepBuilderFactory + .get("job1step2") + . chunk(3) + .reader( + new ListItemReader<>(Arrays.asList("7", + "2", "3", "10", "5", "6"))) + .processor( + new ItemProcessor() { + @Override + public String process(String item) + throws Exception { + LOGGER.info("Processing of chunks"); + return String.valueOf(Integer + .parseInt(item) * -1); + } + }) + .writer(new ItemWriter() { + @Override + public void write( + List items) + throws Exception { + for (String item : items) { + LOGGER.info(">> " + item); + } + } + }).build(); + } + + @Bean + public Job job1() { + return this.jobBuilderFactory.get("job1") + .start(step1()) + .next(step2()) + .build(); + } + + @Bean + public Job job2() { + return jobBuilderFactory.get("job2") + .start(stepBuilderFactory.get("job2step1") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute( + StepContribution contribution, + ChunkContext chunkContext) + throws Exception { + LOGGER + .info("This job is from Baeldung"); + return RepeatStatus.FINISHED; + } + }) + .build()) + .build(); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java new file mode 100644 index 0000000000..be2a173589 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java @@ -0,0 +1,56 @@ +package com.baeldung.task; + +import java.util.logging.Logger; + +import javax.sql.DataSource; + +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.task.configuration.EnableTask; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@SpringBootApplication +@EnableTask +@EnableBatchProcessing +public class TaskDemo { + + private final static Logger LOGGER = Logger + .getLogger(TaskDemo.class.getName()); + + @Autowired + private DataSource dataSource; + + @Bean + public HelloWorldTaskConfigurer getTaskConfigurer() + { + return new HelloWorldTaskConfigurer(dataSource); + } + + @Bean + public TaskListener taskListener() { + return new TaskListener(); + } + + public static void main(String[] args) { + SpringApplication.run(TaskDemo.class, args); + } + + @Component + public static class HelloWorldApplicationRunner + implements + ApplicationRunner { + + @Override + public void run(ApplicationArguments arg0) + throws Exception { + // TODO Auto-generated method stub + LOGGER + .info("Hello World from Spring Cloud Task!"); + } + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskListener.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskListener.java new file mode 100644 index 0000000000..8250153b66 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskListener.java @@ -0,0 +1,31 @@ +package com.baeldung.task; + +import java.util.logging.Logger; + +import org.springframework.cloud.task.listener.TaskExecutionListener; +import org.springframework.cloud.task.repository.TaskExecution; + +public class TaskListener implements TaskExecutionListener { + + private final static Logger LOGGER = Logger + .getLogger(TaskListener.class.getName()); + + @Override + public void onTaskEnd(TaskExecution arg0) { + // TODO Auto-generated method stub + LOGGER.info("End of Task"); + } + + @Override + public void onTaskFailed(TaskExecution arg0, + Throwable arg1) { + // TODO Auto-generated method stub + + } + + @Override + public void onTaskStartup(TaskExecution arg0) { + // TODO Auto-generated method stub + LOGGER.info("Task Startup"); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml new file mode 100644 index 0000000000..1187c12fe7 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/resources/application.yml @@ -0,0 +1,26 @@ +logging: + level: + org: + springframework: + cloud: + task=DEBUG + +spring: + application: + name=helloWorld + datasource: + url: jdbc:mysql://localhost:3306/springcloud?useSSL=false + username: root + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL5Dialect + batch: + initialize-schema: always +maven: + remoteRepositories: + springRepo: + url: https://repo.spring.io/libs-snapshot \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/.gitignore b/spring-cloud/spring-cloud-task/springcloudtasksink/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml new file mode 100644 index 0000000000..b717fffc7c --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + com.baeldung + SpringCloudTaskSink + 0.0.1-SNAPSHOT + jar + + SpringCloudTaskSink + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.2.2.RELEASE + Edgware.SR2 + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + org.springframework.cloud + spring-cloud-starter-task + + + org.springframework.cloud + spring-cloud-stream-test-support + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-deployer-local + 1.3.0.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-task-dependencies + ${spring-cloud-task.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplication.java b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplication.java new file mode 100644 index 0000000000..62085e5fa5 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.SpringCloudTaskFinal; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.task.launcher.annotation.EnableTaskLauncher; + +@SpringBootApplication +@EnableTaskLauncher +public class SpringCloudTaskSinkApplication { + + public static void main(String[] args) { + SpringApplication.run( + SpringCloudTaskSinkApplication.class, args); + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/TaskSinkConfiguration.java b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/TaskSinkConfiguration.java new file mode 100644 index 0000000000..638de58ecb --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/java/com/baeldung/SpringCloudTaskFinal/TaskSinkConfiguration.java @@ -0,0 +1,18 @@ +package com.baeldung.SpringCloudTaskFinal; + +import static org.mockito.Mockito.mock; + +import org.springframework.cloud.deployer.spi.task.TaskLauncher; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class TaskSinkConfiguration { + + @Bean + public TaskLauncher taskLauncher() { + return mock(TaskLauncher.class); + } + +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/resources/application.properties b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/resources/application.properties new file mode 100644 index 0000000000..1660dc8516 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/src/main/resources/application.properties @@ -0,0 +1 @@ +maven.remoteRepositories.springRepo.url=https://repo.spring.io/libs-snapshot \ No newline at end of file diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplicationTests.java b/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplicationTests.java new file mode 100644 index 0000000000..1f47eada14 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringCloudTaskFinal/SpringCloudTaskSinkApplicationTests.java @@ -0,0 +1,72 @@ +package com.baeldung.SpringCloudTaskFinal; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.deployer.spi.core.AppDeploymentRequest; +import org.springframework.cloud.deployer.spi.task.TaskLauncher; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.cloud.task.launcher.TaskLaunchRequest; +import org.springframework.context.ApplicationContext; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.verify; + +@RunWith(SpringRunner.class) +@SpringBootTest( + classes = SpringCloudTaskSinkApplication.class) +public class SpringCloudTaskSinkApplicationTests { + + @Autowired + ApplicationContext context; + + @Autowired + private Sink sink; + + @Test + public void testTaskLaunch() throws IOException { + + TaskLauncher taskLauncher = + context.getBean(TaskLauncher.class); + + Map prop = new HashMap(); + prop.put("server.port", "0"); + TaskLaunchRequest request = new TaskLaunchRequest( + "maven://org.springframework.cloud.task.app:" + + "timestamp-task:jar:1.0.1.RELEASE", null, + prop, + null, null); + GenericMessage message = new GenericMessage( + request); + this.sink.input().send(message); + + ArgumentCaptor deploymentRequest = ArgumentCaptor + .forClass(AppDeploymentRequest.class); + + verify(taskLauncher).launch( + deploymentRequest.capture()); + + AppDeploymentRequest actualRequest = deploymentRequest + .getValue(); + + // Verifying the co-ordinate of launched Task here. + assertTrue(actualRequest.getCommandlineArguments() + .isEmpty()); + assertEquals("0", actualRequest.getDefinition() + .getProperties().get("server.port")); + assertTrue(actualRequest + .getResource() + .toString() + .contains( + "org.springframework.cloud.task.app:timestamp-task:jar:1.0.1.RELEASE")); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml new file mode 100644 index 0000000000..a3185a44d4 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + eureka-client + 1.0.0-SNAPSHOT + jar + + Spring Cloud Eureka Client + Spring Cloud Eureka Sample Client + + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-starter-eureka + ${spring-cloud-starter-eureka.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-starter-web.version} + + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + Brixton.SR7 + 1.2.3.RELEASE + 1.4.2.RELEASE + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/src/main/resources/application.yml new file mode 100644 index 0000000000..08624aa159 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-client/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: spring-cloud-eureka-client + +server: + port: 0 + +eureka: + client: + serviceUrl: + defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} + instance: + preferIpAddress: true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml new file mode 100644 index 0000000000..d86cfa8589 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + eureka-server + 1.0.0-SNAPSHOT + jar + + Spring Cloud Eureka Server + Spring Cloud Eureka Server Demo + + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-starter-eureka-server + ${spring-cloud-starter-eureka.version} + + + commons-configuration + commons-configuration + ${commons-config.version} + + + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + Brixton.SR7 + 1.2.3.RELEASE + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/src/main/resources/application.yml new file mode 100644 index 0000000000..49c3179bb5 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/eureka-server/src/main/resources/application.yml @@ -0,0 +1,7 @@ +server: + port: 8761 + +eureka: + client: + registerWithEureka: false + fetchRegistry: false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml new file mode 100644 index 0000000000..fabad77a77 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + pom + + Spring Cloud Zuul and Eureka Integration + Spring Cloud Zuul and Eureka Integration + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + .. + + + + UTF-8 + 3.7.0 + 1.4.2.RELEASE + 1.10 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + + zuul-server + eureka-server + eureka-client + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml new file mode 100644 index 0000000000..2622a3e36b --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/pom.xml @@ -0,0 +1,61 @@ + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + zuul-server + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.cloud + spring-cloud-starter-eureka + + + commons-configuration + commons-configuration + ${commons-config.version} + + + org.springframework.boot + spring-boot-starter-security + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/src/main/resources/application.properties new file mode 100644 index 0000000000..cb1dca78c2 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/bin/zuul-server/src/main/resources/application.properties @@ -0,0 +1,9 @@ +server.port=8762 +spring.application.name=zuul-server +eureka.instance.preferIpAddress=true +eureka.client.registerWithEureka=true +eureka.client.fetchRegistry=true +eureka.serviceurl.defaultzone=http://localhost:8761/eureka/ +management.security.enabled=false +security.basic.enabled=false +hystrix.command.default.execution.timeout.enabled=false diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml new file mode 100644 index 0000000000..a3185a44d4 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + eureka-client + 1.0.0-SNAPSHOT + jar + + Spring Cloud Eureka Client + Spring Cloud Eureka Sample Client + + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-starter-eureka + ${spring-cloud-starter-eureka.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-starter-web.version} + + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + Brixton.SR7 + 1.2.3.RELEASE + 1.4.2.RELEASE + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java new file mode 100644 index 0000000000..9bbb121408 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.cloud.eureka.client; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.RestController; + +import com.netflix.discovery.EurekaClient; + +@SpringBootApplication +@EnableEurekaClient +@RestController +public class EurekaClientApplication implements GreetingController { + @Autowired + @Lazy + private EurekaClient eurekaClient; + + @Value("${spring.application.name}") + private String appName; + + @Value("${server.port}") + private String portNumber; + + public static void main(String[] args) { + SpringApplication.run(EurekaClientApplication.class, args); + } + + @Override + public String greeting() { + System.out.println("Request received on port number " + portNumber); + return String.format("Hello from '%s with Port Number %s'!", eurekaClient.getApplication(appName) + .getName(), portNumber); + } +} diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/GreetingController.java b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/GreetingController.java new file mode 100644 index 0000000000..33ee2574b7 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/GreetingController.java @@ -0,0 +1,8 @@ +package com.baeldung.spring.cloud.eureka.client; + +import org.springframework.web.bind.annotation.RequestMapping; + +public interface GreetingController { + @RequestMapping("/greeting") + String greeting(); +} diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/resources/application.yml new file mode 100644 index 0000000000..9fa929e16b --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + application: + name: spring-cloud-eureka-client + +server: + port: 8081 + +eureka: + client: + serviceUrl: + defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} + instance: + preferIpAddress: true \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml new file mode 100644 index 0000000000..d86cfa8589 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + eureka-server + 1.0.0-SNAPSHOT + jar + + Spring Cloud Eureka Server + Spring Cloud Eureka Server Demo + + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-starter-eureka-server + ${spring-cloud-starter-eureka.version} + + + commons-configuration + commons-configuration + ${commons-config.version} + + + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + Brixton.SR7 + 1.2.3.RELEASE + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java new file mode 100644 index 0000000000..d55145448d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.cloud.eureka.server; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; + +@SpringBootApplication +@EnableEurekaServer +public class EurekaServerApplication { + public static void main(String[] args) { + SpringApplication.run(EurekaServerApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/resources/application.yml new file mode 100644 index 0000000000..49c3179bb5 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/src/main/resources/application.yml @@ -0,0 +1,7 @@ +server: + port: 8761 + +eureka: + client: + registerWithEureka: false + fetchRegistry: false \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml new file mode 100644 index 0000000000..b4c7188abe --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + pom + + Spring Cloud Zuul and Eureka Integration + Spring Cloud Zuul and Eureka Integration + + + com.baeldung.spring.cloud + spring-cloud + 1.0.0-SNAPSHOT + .. + + + + UTF-8 + 3.7.0 + 1.4.2.RELEASE + 1.10 + 1.2.10 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-maven-plugin.version} + + + + + + zuul-server + eureka-server + eureka-client + + diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml new file mode 100644 index 0000000000..b68fd63155 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-zuul-eureka-integration + 1.0.0-SNAPSHOT + + zuul-server + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.cloud + spring-cloud-starter-eureka + + + commons-configuration + commons-configuration + ${commons-config.version} + + + io.reactivex + rxjava + ${rxjava.version} + + + org.springframework.boot + spring-boot-starter-security + + + + + + org.springframework.cloud + spring-cloud-starter-parent + ${spring-cloud-dependencies.version} + pom + import + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/java/com/baeldung/spring/cloud/zuul/config/ZuulConfig.java b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/java/com/baeldung/spring/cloud/zuul/config/ZuulConfig.java new file mode 100644 index 0000000000..52488cad69 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/java/com/baeldung/spring/cloud/zuul/config/ZuulConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.cloud.zuul.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; + +@SpringBootApplication +@EnableZuulProxy +@EnableDiscoveryClient +public class ZuulConfig { + public static void main(String[] args) { + SpringApplication.run(ZuulConfig.class, args); + } +} diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties new file mode 100644 index 0000000000..cb1dca78c2 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/src/main/resources/application.properties @@ -0,0 +1,9 @@ +server.port=8762 +spring.application.name=zuul-server +eureka.instance.preferIpAddress=true +eureka.client.registerWithEureka=true +eureka.client.fetchRegistry=true +eureka.serviceurl.defaultzone=http://localhost:8761/eureka/ +management.security.enabled=false +security.basic.enabled=false +hystrix.command.default.execution.timeout.enabled=false diff --git a/spring-core/README.md b/spring-core/README.md index 81a7aaa952..dc3bb1c9f0 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -8,3 +8,5 @@ - [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) - [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) - [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults) +- [Groovy Bean Definitions](http://www.baeldung.com/spring-groovy-beans) +- [XML-Based Injection in Spring](http://www.baeldung.com/spring-xml-injection) diff --git a/spring-core/src/main/resources/com.baeldung.di.spring.xml b/spring-core/src/main/resources/com.baeldung.di.spring.xml index 9c44d911d1..e0c5d22abb 100644 --- a/spring-core/src/main/resources/com.baeldung.di.spring.xml +++ b/spring-core/src/main/resources/com.baeldung.di.spring.xml @@ -5,7 +5,7 @@ - + @@ -29,15 +29,15 @@ - + - + - + \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionTest.java b/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionTest.java index 1d133faf63..1660b99726 100644 --- a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionTest.java +++ b/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionTest.java @@ -15,31 +15,17 @@ public class BeanInjectionTest { applicationContext = new ClassPathXmlApplicationContext("com.baeldung.di.spring.xml"); } - @Test - public void protoBean_getBean_returnsMultipleInstance() { - final MessageApp messageApp1 = applicationContext.getBean("messageWorldApp", MessageApp.class); - final MessageApp messageApp2 = applicationContext.getBean("messageWorldApp", MessageApp.class); - assertNotEquals(messageApp1, messageApp2); - } - - @Test - public void protoFactoryMethod_getBean_returnsMultipleInstance() { - final IndexApp indexApp1 = applicationContext.getBean("indexAppWithFactoryMethod", IndexApp.class); - final IndexApp indexApp2 = applicationContext.getBean("indexAppWithFactoryMethod", IndexApp.class); - assertNotEquals(indexApp1, indexApp2); - } - - @Test - public void protoStaticFactory_getBean_returnsMultipleInstance() { - final IndexApp indexApp1 = applicationContext.getBean("indexAppWithStaticFactory", IndexApp.class); - final IndexApp indexApp2 = applicationContext.getBean("indexAppWithStaticFactory", IndexApp.class); - assertNotEquals(indexApp1, indexApp2); - } - @Test public void singletonBean_getBean_returnsSingleInstance() { final IndexApp indexApp1 = applicationContext.getBean("indexApp", IndexApp.class); final IndexApp indexApp2 = applicationContext.getBean("indexApp", IndexApp.class); assertEquals(indexApp1, indexApp2); } + + @Test + public void getBean_returnsInstance() { + final IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class); + assertNotNull(indexApp); + } + } diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index 8270fc3ae2..df4723484d 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java b/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java index 9fbaeb348d..f4d47d7871 100644 --- a/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java +++ b/spring-cucumber/src/test/java/com/baeldung/SpringIntegrationTest.java @@ -1,8 +1,10 @@ package com.baeldung; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.IntegrationTest; -import org.springframework.boot.test.SpringApplicationContextLoader; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpResponse; import org.springframework.test.context.ContextConfiguration; @@ -10,14 +12,9 @@ import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - //@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = SpringDemoApplication.class, loader = SpringApplicationContextLoader.class) +@ContextConfiguration(classes = SpringDemoApplication.class) @WebAppConfiguration -@IntegrationTest public class SpringIntegrationTest { static ResponseResults latestResponse = null; diff --git a/spring-custom-aop/spring-custom-aop/pom.xml b/spring-custom-aop/spring-custom-aop/pom.xml index 7e9da03b54..95c1b7419f 100644 --- a/spring-custom-aop/spring-custom-aop/pom.xml +++ b/spring-custom-aop/spring-custom-aop/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - spring-boot + spring-custom-aop 0.0.1-SNAPSHOT war spring-boot @@ -43,7 +43,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/EndpointDTO.java b/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/EndpointDTO.java new file mode 100644 index 0000000000..d12d6419e1 --- /dev/null +++ b/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/EndpointDTO.java @@ -0,0 +1,39 @@ +package org.baeldung.endpoints; + +public class EndpointDTO { + private String id; + private boolean enabled; + private boolean sensitive; + + public EndpointDTO(String id, boolean enabled, boolean sensitive) { + super(); + this.id = id; + this.enabled = enabled; + this.sensitive = sensitive; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public boolean isSensitive() { + return sensitive; + } + + public void setSensitive(boolean sensitive) { + this.sensitive = sensitive; + } + +} diff --git a/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/ListEndpoints.java b/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/ListEndpoints.java index 0add741a1f..f434351a51 100644 --- a/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/ListEndpoints.java +++ b/spring-custom-aop/spring-custom-aop/src/main/java/org/baeldung/endpoints/ListEndpoints.java @@ -1,6 +1,7 @@ package org.baeldung.endpoints; import java.util.List; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.AbstractEndpoint; @@ -8,16 +9,16 @@ import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.stereotype.Component; @Component -public class ListEndpoints extends AbstractEndpoint> { - private List endpoints; +public class ListEndpoints extends AbstractEndpoint> { + private List endpointDTOs; @Autowired public ListEndpoints(List endpoints) { super("listEndpoints"); - this.endpoints = endpoints; + this.endpointDTOs = endpoints.stream().map(endpoint -> new EndpointDTO(endpoint.getId(), endpoint.isEnabled(), endpoint.isSensitive())).collect(Collectors.toList()); } - public List invoke() { - return this.endpoints; + public List invoke() { + return this.endpointDTOs; } } \ No newline at end of file diff --git a/spring-data-elasticsearch/README.md b/spring-data-elasticsearch/README.md index 0095d66377..5d0b3b84c4 100644 --- a/spring-data-elasticsearch/README.md +++ b/spring-data-elasticsearch/README.md @@ -5,6 +5,7 @@ - [Elasticsearch Queries with Spring Data](http://www.baeldung.com/spring-data-elasticsearch-queries) - [Guide to Elasticsearch in Java](http://www.baeldung.com/elasticsearch-java) +- [Geospatial Support in ElasticSearch](http://www.baeldung.com/elasticsearch-geo-spatial) ### Build the Project with Tests Running ``` diff --git a/spring-data-elasticsearch/pom.xml b/spring-data-elasticsearch/pom.xml index 520707a432..688506450f 100644 --- a/spring-data-elasticsearch/pom.xml +++ b/spring-data-elasticsearch/pom.xml @@ -45,6 +45,24 @@ ${spring-data-elasticsearch.version} + + com.spatial4j + spatial4j + 0.4.1 + + + + com.vividsolutions + jts + 1.13 + + + xerces + xercesImpl + + + + org.springframework spring-test diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java b/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java index b8ad59e2e2..09b971fdc2 100644 --- a/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java +++ b/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java @@ -11,10 +11,9 @@ public class Person { private Date dateOfBirth; public Person() { - } - public Person(int age, String fullName, Date dateOfBirth) { + Person(int age, String fullName, Date dateOfBirth) { super(); this.age = age; this.fullName = fullName; diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java index 8aef865401..93812a3cea 100644 --- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java +++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java @@ -1,12 +1,13 @@ package com.baeldung.spring.data.es.repository; -import com.baeldung.spring.data.es.model.Article; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.annotations.Query; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; +import com.baeldung.spring.data.es.model.Article; + @Repository public interface ArticleRepository extends ElasticsearchRepository { @@ -14,4 +15,10 @@ public interface ArticleRepository extends ElasticsearchRepository findByAuthorsNameUsingCustomQuery(String name, Pageable pageable); + + @Query("{\"bool\": {\"must\": {\"match_all\": {}}, \"filter\": {\"term\": {\"tags\": \"?0\" }}}}") + Page
findByFilteredTagQuery(String tag, Pageable pageable); + + @Query("{\"bool\": {\"must\": {\"match\": {\"authors.name\": \"?0\"}}, \"filter\": {\"term\": {\"tags\": \"?1\" }}}}") + Page
findByAuthorsNameAndFilteredTagQuery(String name, String tag, Pageable pageable); } diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java index b5a8fde633..63e2d91fa7 100644 --- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java +++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java @@ -1,9 +1,10 @@ package com.baeldung.spring.data.es.service; -import com.baeldung.spring.data.es.model.Article; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import com.baeldung.spring.data.es.model.Article; + public interface ArticleService { Article save(Article article); @@ -15,6 +16,10 @@ public interface ArticleService { Page
findByAuthorNameUsingCustomQuery(String name, Pageable pageable); + Page
findByFilteredTagQuery(String tag, Pageable pageable); + + Page
findByAuthorsNameAndFilteredTagQuery(String name, String tag, Pageable pageable); + long count(); void delete(Article article); diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java index 2a31b52602..0908ffa70e 100644 --- a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java +++ b/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java @@ -1,12 +1,13 @@ package com.baeldung.spring.data.es.service; -import com.baeldung.spring.data.es.repository.ArticleRepository; -import com.baeldung.spring.data.es.model.Article; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import com.baeldung.spring.data.es.model.Article; +import com.baeldung.spring.data.es.repository.ArticleRepository; + @Service public class ArticleServiceImpl implements ArticleService { @@ -42,6 +43,16 @@ public class ArticleServiceImpl implements ArticleService { return articleRepository.findByAuthorsNameUsingCustomQuery(name, pageable); } + @Override + public Page
findByFilteredTagQuery(String tag, Pageable pageable) { + return articleRepository.findByFilteredTagQuery(tag, pageable); + } + + @Override + public Page
findByAuthorsNameAndFilteredTagQuery(String name, String tag, Pageable pageable) { + return articleRepository.findByAuthorsNameAndFilteredTagQuery(name, tag, pageable); + } + @Override public long count() { return articleRepository.count(); diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java index 1fb1ae76f7..285c164869 100644 --- a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java +++ b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import static org.elasticsearch.node.NodeBuilder.nodeBuilder; import static org.junit.Assert.assertEquals; @@ -78,12 +79,9 @@ public class ElasticSearchManualTest { SearchHit[] searchHits = response .getHits() .getHits(); - List results = new ArrayList<>(); - for (SearchHit hit : searchHits) { - String sourceAsString = hit.getSourceAsString(); - Person person = JSON.parseObject(sourceAsString, Person.class); - results.add(person); - } + List results = Arrays.stream(searchHits) + .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) + .collect(Collectors.toList()); } @Test @@ -125,11 +123,10 @@ public class ElasticSearchManualTest { .actionGet(); response2.getHits(); response3.getHits(); - List searchHits = Arrays.asList(response - .getHits() - .getHits()); - final List results = new ArrayList<>(); - searchHits.forEach(hit -> results.add(JSON.parseObject(hit.getSourceAsString(), Person.class))); + + final List results = Arrays.stream(response.getHits().getHits()) + .map(hit -> JSON.parseObject(hit.getSourceAsString(), Person.class)) + .collect(Collectors.toList()); } @Test diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java new file mode 100644 index 0000000000..aa20913637 --- /dev/null +++ b/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesTest.java @@ -0,0 +1,171 @@ +package com.baeldung.elasticsearch; + +import com.baeldung.spring.data.es.config.Config; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.geo.ShapeRelation; +import org.elasticsearch.common.geo.builders.ShapeBuilder; +import org.elasticsearch.common.unit.DistanceUnit; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertTrue; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = Config.class) +public class GeoQueriesTest { + + private static final String WONDERS_OF_WORLD = "wonders-of-world"; + private static final String WONDERS = "Wonders"; + + @Autowired + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + private Client client; + + @Before + public void setUp() { + String jsonObject = "{\"Wonders\":{\"properties\":{\"name\":{\"type\":\"string\",\"index\":\"not_analyzed\"},\"region\":{\"type\":\"geo_shape\",\"tree\":\"quadtree\",\"precision\":\"1m\"},\"location\":{\"type\":\"geo_point\"}}}}"; + CreateIndexRequest req = new CreateIndexRequest(WONDERS_OF_WORLD); + req.mapping(WONDERS, jsonObject); + client.admin() + .indices() + .create(req) + .actionGet(); + } + + @Test + public void givenGeoShapeData_whenExecutedGeoShapeQuery_thenResultNonEmpty() { + String jsonObject = "{\"name\":\"Agra\",\"region\":{\"type\":\"envelope\",\"coordinates\":[[75,25],[80.1,30.2]]}}"; + IndexResponse response = client.prepareIndex(WONDERS_OF_WORLD, WONDERS) + .setSource(jsonObject) + .get(); + String tajMahalId = response.getId(); + client.admin() + .indices() + .prepareRefresh(WONDERS_OF_WORLD) + .get(); + + QueryBuilder qb = QueryBuilders.geoShapeQuery("region", ShapeBuilder.newEnvelope() + .topLeft(74.00, 24.0) + .bottomRight(81.1, 31.2)) + .relation(ShapeRelation.WITHIN); + + SearchResponse searchResponse = client.prepareSearch(WONDERS_OF_WORLD) + .setTypes(WONDERS) + .setQuery(qb) + .execute() + .actionGet(); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(tajMahalId)); + } + + @Test + public void givenGeoPointData_whenExecutedGeoBoundingBoxQuery_thenResultNonEmpty() { + String jsonObject = "{\"name\":\"Pyramids of Giza\",\"location\":[31.131302,29.976480]}"; + IndexResponse response = client.prepareIndex(WONDERS_OF_WORLD, WONDERS) + .setSource(jsonObject) + .get(); + String pyramidsOfGizaId = response.getId(); + client.admin() + .indices() + .prepareRefresh(WONDERS_OF_WORLD) + .get(); + + QueryBuilder qb = QueryBuilders.geoBoundingBoxQuery("location") + .bottomLeft(28, 30) + .topRight(31, 32); + + SearchResponse searchResponse = client.prepareSearch(WONDERS_OF_WORLD) + .setTypes(WONDERS) + .setQuery(qb) + .execute() + .actionGet(); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(pyramidsOfGizaId)); + } + + @Test + public void givenGeoPointData_whenExecutedGeoDistanceQuery_thenResultNonEmpty() { + String jsonObject = "{\"name\":\"Lighthouse of alexandria\",\"location\":[31.131302,29.976480]}"; + IndexResponse response = client.prepareIndex(WONDERS_OF_WORLD, WONDERS) + .setSource(jsonObject) + .get(); + String lighthouseOfAlexandriaId = response.getId(); + client.admin() + .indices() + .prepareRefresh(WONDERS_OF_WORLD) + .get(); + + QueryBuilder qb = QueryBuilders.geoDistanceQuery("location") + .point(29.976, 31.131) + .distance(10, DistanceUnit.MILES); + + SearchResponse searchResponse = client.prepareSearch(WONDERS_OF_WORLD) + .setTypes(WONDERS) + .setQuery(qb) + .execute() + .actionGet(); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(lighthouseOfAlexandriaId)); + } + + @Test + public void givenGeoPointData_whenExecutedGeoPolygonQuery_thenResultNonEmpty() { + String jsonObject = "{\"name\":\"The Great Rann of Kutch\",\"location\":[69.859741,23.733732]}"; + IndexResponse response = client.prepareIndex(WONDERS_OF_WORLD, WONDERS) + .setSource(jsonObject) + .get(); + String greatRannOfKutchid = response.getId(); + client.admin() + .indices() + .prepareRefresh(WONDERS_OF_WORLD) + .get(); + + QueryBuilder qb = QueryBuilders.geoPolygonQuery("location") + .addPoint(22.733, 68.859) + .addPoint(24.733, 68.859) + .addPoint(23, 70.859); + + SearchResponse searchResponse = client.prepareSearch(WONDERS_OF_WORLD) + .setTypes(WONDERS) + .setQuery(qb) + .execute() + .actionGet(); + List ids = Arrays.stream(searchResponse.getHits() + .getHits()) + .map(SearchHit::getId) + .collect(Collectors.toList()); + assertTrue(ids.contains(greatRannOfKutchid)); + } + + @After + public void destroy() { + elasticsearchTemplate.deleteIndex(WONDERS_OF_WORLD); + } +} diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java index 1280c8e1de..41965fbb83 100644 --- a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java +++ b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java @@ -1,15 +1,9 @@ package com.baeldung.spring.data.es; -import static java.util.Arrays.asList; -import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND; -import static org.elasticsearch.index.query.QueryBuilders.fuzzyQuery; -import static org.elasticsearch.index.query.QueryBuilders.matchQuery; -import static org.elasticsearch.index.query.QueryBuilders.regexpQuery; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.List; - +import com.baeldung.spring.data.es.config.Config; +import com.baeldung.spring.data.es.model.Article; +import com.baeldung.spring.data.es.model.Author; +import com.baeldung.spring.data.es.service.ArticleService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -22,10 +16,15 @@ import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.baeldung.spring.data.es.config.Config; -import com.baeldung.spring.data.es.model.Article; -import com.baeldung.spring.data.es.model.Author; -import com.baeldung.spring.data.es.service.ArticleService; +import java.util.List; + +import static java.util.Arrays.asList; +import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND; +import static org.elasticsearch.index.query.QueryBuilders.fuzzyQuery; +import static org.elasticsearch.index.query.QueryBuilders.matchQuery; +import static org.elasticsearch.index.query.QueryBuilders.regexpQuery; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) @@ -47,14 +46,22 @@ public class ElasticSearchIntegrationTest { Article article = new Article("Spring Data Elasticsearch"); article.setAuthors(asList(johnSmith, johnDoe)); + article.setTags("elasticsearch", "spring data"); articleService.save(article); article = new Article("Search engines"); article.setAuthors(asList(johnDoe)); + article.setTags("search engines", "tutorial"); articleService.save(article); article = new Article("Second Article About Elasticsearch"); article.setAuthors(asList(johnSmith)); + article.setTags("elasticsearch", "spring data"); + articleService.save(article); + + article = new Article("Elasticsearch Tutorial"); + article.setAuthors(asList(johnDoe)); + article.setTags("elasticsearch"); articleService.save(article); } @@ -72,21 +79,34 @@ public class ElasticSearchIntegrationTest { @Test public void givenPersistedArticles_whenSearchByAuthorsName_thenRightFound() { - final Page
articleByAuthorName = articleService.findByAuthorName(johnSmith.getName(), new PageRequest(0, 10)); + final Page
articleByAuthorName = articleService + .findByAuthorName(johnSmith.getName(), new PageRequest(0, 10)); assertEquals(2L, articleByAuthorName.getTotalElements()); } @Test public void givenCustomQuery_whenSearchByAuthorsName_thenArticleIsFound() { + final Page
articleByAuthorName = articleService.findByAuthorNameUsingCustomQuery("Smith", new PageRequest(0, 10)); + assertEquals(2L, articleByAuthorName.getTotalElements()); + } - final Page
articleByAuthorName = articleService.findByAuthorNameUsingCustomQuery("John Smith", new PageRequest(0, 10)); + @Test + public void givenTagFilterQuery_whenSearchByTag_thenArticleIsFound() { + final Page
articleByAuthorName = articleService.findByFilteredTagQuery("elasticsearch", new PageRequest(0, 10)); assertEquals(3L, articleByAuthorName.getTotalElements()); } + @Test + public void givenTagFilterQuery_whenSearchByAuthorsName_thenArticleIsFound() { + final Page
articleByAuthorName = articleService.findByAuthorsNameAndFilteredTagQuery("Doe", "elasticsearch", new PageRequest(0, 10)); + assertEquals(2L, articleByAuthorName.getTotalElements()); + } + @Test public void givenPersistedArticles_whenUseRegexQuery_thenRightArticlesFound() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withFilter(regexpQuery("title", ".*data.*")).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder().withFilter(regexpQuery("title", ".*data.*")) + .build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); @@ -112,7 +132,8 @@ public class ElasticSearchIntegrationTest { final String articleTitle = "Spring Data Elasticsearch"; - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); final long count = articleService.count(); @@ -124,7 +145,8 @@ public class ElasticSearchIntegrationTest { @Test public void givenSavedDoc_whenOneTermMatches_thenFindByTitle() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(AND)).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", "Search engines").operator(AND)).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); } diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java index cc4bce0c75..c6af93bb62 100644 --- a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java +++ b/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java @@ -1,20 +1,9 @@ package com.baeldung.spring.data.es; -import static java.util.Arrays.asList; -import static java.util.stream.Collectors.toList; -import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND; -import static org.elasticsearch.index.query.QueryBuilders.boolQuery; -import static org.elasticsearch.index.query.QueryBuilders.matchPhraseQuery; -import static org.elasticsearch.index.query.QueryBuilders.matchQuery; -import static org.elasticsearch.index.query.QueryBuilders.multiMatchQuery; -import static org.elasticsearch.index.query.QueryBuilders.nestedQuery; -import static org.elasticsearch.index.query.QueryBuilders.termQuery; -import static org.junit.Assert.assertEquals; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - +import com.baeldung.spring.data.es.config.Config; +import com.baeldung.spring.data.es.model.Article; +import com.baeldung.spring.data.es.model.Author; +import com.baeldung.spring.data.es.service.ArticleService; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.unit.Fuzziness; @@ -22,6 +11,7 @@ import org.elasticsearch.index.query.MultiMatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation; import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder; @@ -35,10 +25,20 @@ import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.baeldung.spring.data.es.config.Config; -import com.baeldung.spring.data.es.model.Article; -import com.baeldung.spring.data.es.model.Author; -import com.baeldung.spring.data.es.service.ArticleService; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toList; +import static org.elasticsearch.index.query.MatchQueryBuilder.Operator.AND; +import static org.elasticsearch.index.query.QueryBuilders.boolQuery; +import static org.elasticsearch.index.query.QueryBuilders.matchPhraseQuery; +import static org.elasticsearch.index.query.QueryBuilders.matchQuery; +import static org.elasticsearch.index.query.QueryBuilders.multiMatchQuery; +import static org.elasticsearch.index.query.QueryBuilders.nestedQuery; +import static org.elasticsearch.index.query.QueryBuilders.termQuery; +import static org.junit.Assert.assertEquals; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) @@ -86,14 +86,16 @@ public class ElasticSearchQueryIntegrationTest { @Test public void givenFullTitle_whenRunMatchQuery_thenDocIsFound() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Search engines").operator(AND)).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", "Search engines").operator(AND)).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); } @Test public void givenOneTermFromTitle_whenRunMatchQuery_thenDocIsFound() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "Engines Solutions")).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", "Engines Solutions")).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); assertEquals("Search engines", articles.get(0).getTitle()); @@ -101,18 +103,21 @@ public class ElasticSearchQueryIntegrationTest { @Test public void givenPartTitle_whenRunMatchQuery_thenDocIsFound() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "elasticsearch data")).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", "elasticsearch data")).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(3, articles.size()); } @Test public void givenFullTitle_whenRunMatchQueryOnVerbatimField_thenDocIsFound() { - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch")).build(); + SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title.verbatim", "Second Article About Elasticsearch")).build(); List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); - searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About")).build(); + searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title.verbatim", "Second Article About")) + .build(); articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(0, articles.size()); } @@ -130,38 +135,48 @@ public class ElasticSearchQueryIntegrationTest { @Test public void givenAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTokenCountsSeparately() { final TermsBuilder aggregation = AggregationBuilders.terms("top_tags").field("title"); - final SearchResponse response = client.prepareSearch("blog").setTypes("article").addAggregation(aggregation).execute().actionGet(); + final SearchResponse response = client.prepareSearch("blog").setTypes("article").addAggregation(aggregation) + .execute().actionGet(); final Map results = response.getAggregations().asMap(); final StringTerms topTags = (StringTerms) results.get("top_tags"); - final List keys = topTags.getBuckets().stream().map(b -> b.getKeyAsString()).collect(toList()); - Collections.sort(keys); + final List keys = topTags.getBuckets().stream() + .map(MultiBucketsAggregation.Bucket::getKeyAsString) + .sorted() + .collect(toList()); assertEquals(asList("about", "article", "data", "elasticsearch", "engines", "search", "second", "spring", "tutorial"), keys); } @Test public void givenNotAnalyzedQuery_whenMakeAggregationOnTermCount_thenEachTermCountsIndividually() { - final TermsBuilder aggregation = AggregationBuilders.terms("top_tags").field("tags").order(Terms.Order.aggregation("_count", false)); - final SearchResponse response = client.prepareSearch("blog").setTypes("article").addAggregation(aggregation).execute().actionGet(); + final TermsBuilder aggregation = AggregationBuilders.terms("top_tags").field("tags") + .order(Terms.Order.aggregation("_count", false)); + final SearchResponse response = client.prepareSearch("blog").setTypes("article").addAggregation(aggregation) + .execute().actionGet(); final Map results = response.getAggregations().asMap(); final StringTerms topTags = (StringTerms) results.get("top_tags"); - final List keys = topTags.getBuckets().stream().map(b -> b.getKeyAsString()).collect(toList()); + final List keys = topTags.getBuckets().stream() + .map(MultiBucketsAggregation.Bucket::getKeyAsString) + .collect(toList()); assertEquals(asList("elasticsearch", "spring data", "search engines", "tutorial"), keys); } @Test public void givenNotExactPhrase_whenUseSlop_thenQueryMatches() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1)).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchPhraseQuery("title", "spring elasticsearch").slop(1)).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); } @Test public void givenPhraseWithType_whenUseFuzziness_thenQueryMatches() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", "spring date elasticserch").operator(AND).fuzziness(Fuzziness.ONE).prefixLength(3)).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(matchQuery("title", "spring date elasticserch").operator(AND).fuzziness(Fuzziness.ONE) + .prefixLength(3)).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(1, articles.size()); @@ -169,9 +184,23 @@ public class ElasticSearchQueryIntegrationTest { @Test public void givenMultimatchQuery_whenDoSearch_thenAllProvidedFieldsMatch() { - final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery("tutorial").field("title").field("tags").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)).build(); + final SearchQuery searchQuery = new NativeSearchQueryBuilder() + .withQuery(multiMatchQuery("tutorial").field("title").field("tags") + .type(MultiMatchQueryBuilder.Type.BEST_FIELDS)).build(); final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); assertEquals(2, articles.size()); } + + @Test + public void givenBoolQuery_whenQueryByAuthorsName_thenFoundArticlesByThatAuthorAndFilteredTag() { + final QueryBuilder builder = boolQuery().must(nestedQuery("authors", boolQuery().must(termQuery("authors.name", "doe")))) + .filter(termQuery("tags", "elasticsearch")); + + final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder) + .build(); + final List
articles = elasticsearchTemplate.queryForList(searchQuery, Article.class); + + assertEquals(2, articles.size()); + } } diff --git a/spring-data-spring-security/README.md b/spring-data-spring-security/README.md new file mode 100644 index 0000000000..15b4b50870 --- /dev/null +++ b/spring-data-spring-security/README.md @@ -0,0 +1,14 @@ +# About this project +This project contains examples from the [Spring Data with Spring Security](http://www.baeldung.com/spring-data-with-spring-security) article from Baeldung. + +# Running the project +The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so it is easy to run. You can start it any of a few ways: +* Run the `main` method from `SpringDataRestApplication` +* Use the Maven Spring Boot plugin: `mvn spring-boot:run` +* Package the application as a JAR and run it using `java -jar spring-data-spring-security.jar` + +# Viewing the running application +To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser + +###Relevant Articles: +- [Spring Data with Spring Security](http://www.baeldung.com/spring-data-with-spring-security) diff --git a/spring-data-spring-security/pom.xml b/spring-data-spring-security/pom.xml new file mode 100644 index 0000000000..d6b671ee57 --- /dev/null +++ b/spring-data-spring-security/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + com.baeldung + spring-data-spring-security + 1.0 + jar + + intro-spring-data-spring-security + Spring Data with Spring Security + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.security + spring-security-data + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-test + test + + + org.apache.tomcat.embed + tomcat-embed-jasper + + + + com.h2database + h2 + + + javax.servlet + jstl + + + + + ${project.artifactId} + + + + diff --git a/spring-data-spring-security/src/main/java/com/baeldung/AppConfig.java b/spring-data-spring-security/src/main/java/com/baeldung/AppConfig.java new file mode 100644 index 0000000000..16bbe8b326 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/AppConfig.java @@ -0,0 +1,64 @@ +package com.baeldung; + +import java.util.Properties; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@SpringBootApplication +@PropertySource("classpath:persistence-h2.properties") +@EnableJpaRepositories(basePackages = { "com.baeldung.data.repositories" }) +@EnableWebMvc +@Import(SpringSecurityConfig.class) +public class AppConfig extends WebMvcConfigurerAdapter { + + @Autowired + private Environment env; + + @Bean + public DataSource dataSource() { + final DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(env.getProperty("driverClassName")); + dataSource.setUrl(env.getProperty("url")); + dataSource.setUsername(env.getProperty("user")); + dataSource.setPassword(env.getProperty("password")); + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource()); + em.setPackagesToScan(new String[] { "com.baeldung.models" }); + em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + em.setJpaProperties(additionalProperties()); + return em; + } + + final Properties additionalProperties() { + final Properties hibernateProperties = new Properties(); + if (env.getProperty("hibernate.hbm2ddl.auto") != null) { + hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); + } + if (env.getProperty("hibernate.dialect") != null) { + hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); + } + if (env.getProperty("hibernate.show_sql") != null) { + hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql")); + } + return hibernateProperties; + } + +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-data-spring-security/src/main/java/com/baeldung/SpringSecurityConfig.java new file mode 100644 index 0000000000..ee13678a24 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/SpringSecurityConfig.java @@ -0,0 +1,89 @@ +package com.baeldung; + +import javax.annotation.PostConstruct; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.data.repository.query.SecurityEvaluationContextExtension; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.security.AuthenticationSuccessHandlerImpl; +import com.baeldung.security.CustomUserDetailsService; + +@Configuration +@EnableWebSecurity +@ComponentScan("com.baeldung.security") +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private WebApplicationContext applicationContext; + private CustomUserDetailsService userDetailsService; + @Autowired + private AuthenticationSuccessHandlerImpl successHandler; + @Autowired + private DataSource dataSource; + + @PostConstruct + public void completeSetup() { + userDetailsService = applicationContext.getBean(CustomUserDetailsService.class); + } + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService) + .passwordEncoder(encoder()) + .and() + .authenticationProvider(authenticationProvider()) + .jdbcAuthentication() + .dataSource(dataSource); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring() + .antMatchers("/resources/**"); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/login") + .permitAll() + .and() + .formLogin() + .permitAll() + .successHandler(successHandler) + .and() + .csrf() + .disable(); + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(userDetailsService); + authProvider.setPasswordEncoder(encoder()); + return authProvider; + } + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(11); + } + + @Bean + public SecurityEvaluationContextExtension securityEvaluationContextExtension() { + return new SecurityEvaluationContextExtension(); + } +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/TweetRepository.java b/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/TweetRepository.java new file mode 100644 index 0000000000..7d6446ed0d --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/TweetRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.data.repositories; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.PagingAndSortingRepository; + +import com.baeldung.models.Tweet; + +public interface TweetRepository extends PagingAndSortingRepository { + + @Query("select twt from Tweet twt JOIN twt.likes as lk where lk = ?#{ principal?.username } or twt.owner = ?#{ principal?.username }") + Page getMyTweetsAndTheOnesILiked(Pageable pageable); +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/UserRepository.java b/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/UserRepository.java new file mode 100644 index 0000000000..9f13c3197e --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/data/repositories/UserRepository.java @@ -0,0 +1,27 @@ +package com.baeldung.data.repositories; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.models.AppUser; +import com.baeldung.models.Tweet; + +public interface UserRepository extends CrudRepository { + AppUser findByUsername(String username); + + List findByName(String name); + + @Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE u.username = ?#{ principal?.username }") + @Modifying + @Transactional + public void updateLastLogin(@Param("lastLogin") Date lastLogin); +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/models/AppUser.java b/spring-data-spring-security/src/main/java/com/baeldung/models/AppUser.java new file mode 100644 index 0000000000..e48233f90a --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/models/AppUser.java @@ -0,0 +1,83 @@ +package com.baeldung.models; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class AppUser { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String name; + @Column(unique = true) + private String username; + private String password; + private boolean enabled = true; + private Date lastLogin; + + private AppUser() { + } + + public AppUser(String name, String email, String password) { + this.username = email; + this.name = name; + this.password = password; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public Date getLastLogin() { + return lastLogin; + } + + public void setLastLogin(Date lastLogin) { + this.lastLogin = lastLogin; + } +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/models/Tweet.java b/spring-data-spring-security/src/main/java/com/baeldung/models/Tweet.java new file mode 100644 index 0000000000..b2e45009f6 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/models/Tweet.java @@ -0,0 +1,63 @@ +package com.baeldung.models; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Tweet { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + private String tweet; + private String owner; + @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER) + private Set likes = new HashSet(); + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + private Tweet() { + } + + public Tweet(String tweet, String owner) { + this.tweet = tweet; + this.owner = owner; + } + + public String getTweet() { + return tweet; + } + + public void setTweet(String tweet) { + this.tweet = tweet; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public Set getLikes() { + return likes; + } + + public void setLikes(Set likes) { + this.likes = likes; + } + +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/AppUserPrincipal.java b/spring-data-spring-security/src/main/java/com/baeldung/security/AppUserPrincipal.java new file mode 100644 index 0000000000..195f9f7bf6 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/security/AppUserPrincipal.java @@ -0,0 +1,67 @@ +package com.baeldung.security; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import com.baeldung.models.AppUser; + +public class AppUserPrincipal implements UserDetails { + + private final AppUser user; + + // + + public AppUserPrincipal(AppUser user) { + this.user = user; + } + + // + + @Override + public String getUsername() { + return user.getUsername(); + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public Collection getAuthorities() { + final List authorities = Collections.singletonList(new SimpleGrantedAuthority("User")); + return authorities; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + // + + public AppUser getAppUser() { + return user; + } + +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java b/spring-data-spring-security/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java new file mode 100644 index 0000000000..3fc2bc6559 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java @@ -0,0 +1,28 @@ +package com.baeldung.security; + +import java.io.IOException; +import java.util.Date; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.stereotype.Component; + +import com.baeldung.data.repositories.UserRepository; + +@Component +public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler { + + @Autowired + private UserRepository userRepository; + + @Override + public void onAuthenticationSuccess(HttpServletRequest arg0, HttpServletResponse arg1, Authentication arg2) throws IOException, ServletException { + userRepository.updateLastLogin(new Date()); + } + +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/security/CustomUserDetailsService.java b/spring-data-spring-security/src/main/java/com/baeldung/security/CustomUserDetailsService.java new file mode 100644 index 0000000000..016f4f7fa9 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/security/CustomUserDetailsService.java @@ -0,0 +1,40 @@ +package com.baeldung.security; + +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.data.repositories.UserRepository; +import com.baeldung.models.AppUser; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + @Autowired + private WebApplicationContext applicationContext; + private UserRepository userRepository; + + public CustomUserDetailsService() { + super(); + } + + @PostConstruct + public void completeSetup() { + userRepository = applicationContext.getBean(UserRepository.class); + } + + @Override + public UserDetails loadUserByUsername(final String username) { + final AppUser appUser = userRepository.findByUsername(username); + if (appUser == null) { + throw new UsernameNotFoundException(username); + } + return new AppUserPrincipal(appUser); + } + +} diff --git a/spring-data-spring-security/src/main/java/com/baeldung/util/DummyContentUtil.java b/spring-data-spring-security/src/main/java/com/baeldung/util/DummyContentUtil.java new file mode 100644 index 0000000000..f1640264d2 --- /dev/null +++ b/spring-data-spring-security/src/main/java/com/baeldung/util/DummyContentUtil.java @@ -0,0 +1,63 @@ +package com.baeldung.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import com.baeldung.models.AppUser; +import com.baeldung.models.Tweet; + +public class DummyContentUtil { + + public static final List generateDummyUsers() { + List appUsers = new ArrayList<>(); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + appUsers.add(new AppUser("Lionel Messi", "lionel@messi.com", passwordEncoder.encode("li1234"))); + appUsers.add(new AppUser("Cristiano Ronaldo", "cristiano@ronaldo.com", passwordEncoder.encode("c1234"))); + appUsers.add(new AppUser("Neymar Dos Santos", "neymar@neymar.com", passwordEncoder.encode("n1234"))); + appUsers.add(new AppUser("Luiz Suarez", "luiz@suarez.com", passwordEncoder.encode("lu1234"))); + appUsers.add(new AppUser("Andres Iniesta", "andres@iniesta.com", passwordEncoder.encode("a1234"))); + appUsers.add(new AppUser("Ivan Rakitic", "ivan@rakitic.com", passwordEncoder.encode("i1234"))); + appUsers.add(new AppUser("Ousman Dembele", "ousman@dembele.com", passwordEncoder.encode("o1234"))); + appUsers.add(new AppUser("Sergio Busquet", "sergio@busquet.com", passwordEncoder.encode("s1234"))); + appUsers.add(new AppUser("Gerard Pique", "gerard@pique.com", passwordEncoder.encode("g1234"))); + appUsers.add(new AppUser("Ter Stergen", "ter@stergen.com", passwordEncoder.encode("t1234"))); + return appUsers; + } + + public static final List generateDummyTweets(List users) { + List tweets = new ArrayList<>(); + Random random = new Random(); + IntStream.range(0, 9) + .sequential() + .forEach(i -> { + Tweet twt = new Tweet(String.format("Tweet %d", i), users.get(random.nextInt(users.size())) + .getUsername()); + twt.getLikes() + .addAll(users.subList(0, random.nextInt(users.size())) + .stream() + .map(AppUser::getUsername) + .collect(Collectors.toSet())); + tweets.add(twt); + }); + return tweets; + } + + public static Collection getAuthorities() { + Collection grantedAuthorities = new ArrayList(); + GrantedAuthority grantedAuthority = new GrantedAuthority() { + public String getAuthority() { + return "ROLE_USER"; + } + }; + grantedAuthorities.add(grantedAuthority); + return grantedAuthorities; + } + +} diff --git a/spring-data-spring-security/src/main/resources/application.properties b/spring-data-spring-security/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-data-spring-security/src/main/resources/persistence-h2.properties b/spring-data-spring-security/src/main/resources/persistence-h2.properties new file mode 100644 index 0000000000..a4b2af6361 --- /dev/null +++ b/spring-data-spring-security/src/main/resources/persistence-h2.properties @@ -0,0 +1,8 @@ +driverClassName=org.h2.Driver +url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1 +username=sa +password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=false +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java b/spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java new file mode 100644 index 0000000000..dbbfe7e85e --- /dev/null +++ b/spring-data-spring-security/src/test/java/com/baeldung/relationships/SpringDataWithSecurityTest.java @@ -0,0 +1,100 @@ +package com.baeldung.relationships; + +import static org.springframework.util.Assert.isTrue; + +import java.util.Date; +import java.util.List; + +import javax.servlet.ServletContext; + +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +import com.baeldung.AppConfig; +import com.baeldung.data.repositories.TweetRepository; +import com.baeldung.data.repositories.UserRepository; +import com.baeldung.models.AppUser; +import com.baeldung.models.Tweet; +import com.baeldung.security.AppUserPrincipal; +import com.baeldung.util.DummyContentUtil; + +@RunWith(SpringRunner.class) +@WebAppConfiguration +@ContextConfiguration +@DirtiesContext +public class SpringDataWithSecurityTest { + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); + @Autowired + private ServletContext servletContext; + private static UserRepository userRepository; + private static TweetRepository tweetRepository; + + @Before + public void testInit() { + ctx.register(AppConfig.class); + ctx.setServletContext(servletContext); + ctx.refresh(); + userRepository = ctx.getBean(UserRepository.class); + tweetRepository = ctx.getBean(TweetRepository.class); + List appUsers = (List) userRepository.save(DummyContentUtil.generateDummyUsers()); + tweetRepository.save(DummyContentUtil.generateDummyTweets(appUsers)); + } + + @AfterClass + public static void tearDown() { + tweetRepository.deleteAll(); + userRepository.deleteAll(); + } + + @Test + public void givenAppUser_whenLoginSuccessful_shouldUpdateLastLogin() { + AppUser appUser = userRepository.findByUsername("lionel@messi.com"); + Authentication auth = new UsernamePasswordAuthenticationToken(new AppUserPrincipal(appUser), null, DummyContentUtil.getAuthorities()); + SecurityContextHolder.getContext() + .setAuthentication(auth); + userRepository.updateLastLogin(new Date()); + } + + @Test(expected = InvalidDataAccessApiUsageException.class) + public void givenNoAppUserInSecurityContext_whenUpdateLastLoginAttempted_shouldFail() { + userRepository.updateLastLogin(new Date()); + } + + @Test + public void givenAppUser_whenLoginSuccessful_shouldReadMyPagedTweets() { + AppUser appUser = userRepository.findByUsername("lionel@messi.com"); + Authentication auth = new UsernamePasswordAuthenticationToken(new AppUserPrincipal(appUser), null, DummyContentUtil.getAuthorities()); + SecurityContextHolder.getContext() + .setAuthentication(auth); + Page page = null; + do { + page = tweetRepository.getMyTweetsAndTheOnesILiked(new PageRequest(page != null ? page.getNumber() + 1 : 0, 5)); + for (Tweet twt : page.getContent()) { + isTrue((twt.getOwner() == appUser.getUsername()) || (twt.getLikes() + .contains(appUser.getUsername())), "I do not have any Tweets"); + } + } while (page.hasNext()); + } + + @Test(expected = InvalidDataAccessApiUsageException.class) + public void givenNoAppUser_whenPaginatedResultsRetrievalAttempted_shouldFail() { + Page page = null; + do { + page = tweetRepository.getMyTweetsAndTheOnesILiked(new PageRequest(page != null ? page.getNumber() + 1 : 0, 5)); + } while (page != null && page.hasNext()); + } +} diff --git a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java index 1cc8261f7c..a693bf039f 100644 --- a/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java +++ b/spring-dispatcher-servlet/src/main/java/com/baeldung/springdispatcherservlet/controller/MultipartController.java @@ -25,14 +25,20 @@ public class MultipartController { try { InputStream in = file.getInputStream(); String path = new File(".").getAbsolutePath(); - FileOutputStream f = new FileOutputStream(path.substring(0, path.length()-1)+ "/uploads/" + file.getOriginalFilename()); - int ch; - while ((ch = in.read()) != -1) { - f.write(ch); + FileOutputStream f = new FileOutputStream(path.substring(0, path.length() - 1) + "/uploads/" + file.getOriginalFilename()); + try { + int ch; + while ((ch = in.read()) != -1) { + f.write(ch); + } + modelAndView.getModel().put("message", "File uploaded successfully!"); + } catch (Exception e) { + System.out.println("Exception uploading multipart: " + e); + } finally { + f.flush(); + f.close(); + in.close(); } - f.flush(); - f.close(); - modelAndView.getModel().put("message", "File uploaded successfully!"); } catch (Exception e) { System.out.println("Exception uploading multipart: " + e); } diff --git a/spring-ejb/README.md b/spring-ejb/README.md new file mode 100644 index 0000000000..8fa8833f3a --- /dev/null +++ b/spring-ejb/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Integration Guide for Spring and EJB](http://www.baeldung.com/spring-ejb) diff --git a/spring-ejb/ejb-remote-for-spring/pom.xml b/spring-ejb/ejb-remote-for-spring/pom.xml new file mode 100755 index 0000000000..fd1095420c --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + + com.baeldung.spring.ejb + ejb-for-spring + 1.0.1 + + + ejb-remote-for-spring + ejb + + + + javax + javaee-api + provided + + + org.assertj + assertj-core + 3.9.0 + test + + + + + + + + wildfly-standalone + + false + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + + + + wildfly10x + + http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip + + + + + + 127.0.0.1 + standalone-full + 9990 + testUser:admin1234! + + + + + + + + + + + + 7.0 + 1.6.1 + + + + + diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java new file mode 100644 index 0000000000..6d1c26ef4a --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorld.java @@ -0,0 +1,11 @@ +package com.baeldung.ejb.tutorial; + +import javax.ejb.Remote; + +@Remote +public interface HelloStatefulWorld { + + int howManyTimes(); + String getHelloWorld(); + +} diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java new file mode 100644 index 0000000000..0619f5593a --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatefulWorldBean.java @@ -0,0 +1,19 @@ +package com.baeldung.ejb.tutorial; + +import javax.ejb.Stateful; + +@Stateful(name = "HelloStatefulWorld") +public class HelloStatefulWorldBean implements HelloStatefulWorld { + + private int howManyTimes = 0; + + public int howManyTimes() { + return howManyTimes; + } + + public String getHelloWorld() { + howManyTimes++; + return "Hello Stateful World!"; + } + +} diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java new file mode 100755 index 0000000000..6b4db29e95 --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorld.java @@ -0,0 +1,10 @@ +package com.baeldung.ejb.tutorial; + +import javax.ejb.Remote; + +@Remote +public interface HelloStatelessWorld { + + String getHelloWorld(); + +} diff --git a/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java new file mode 100755 index 0000000000..7de499c618 --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/main/java/com/baeldung/ejb/tutorial/HelloStatelessWorldBean.java @@ -0,0 +1,12 @@ +package com.baeldung.ejb.tutorial; + +import javax.ejb.Stateless; + +@Stateless(name = "HelloStatelessWorld") +public class HelloStatelessWorldBean implements HelloStatelessWorld { + + public String getHelloWorld() { + return "Hello Stateless World!"; + } + +} diff --git a/spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml b/spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml new file mode 100755 index 0000000000..f51523ac14 --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/main/resources/META-INF/ejb-jar.xml @@ -0,0 +1,7 @@ + + + ejb-remote-for-spring + + diff --git a/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java b/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java new file mode 100644 index 0000000000..61373079f6 --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatefulWorldTestUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.ejb.tutorial; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +public class HelloStatefulWorldTestUnitTest { + + private HelloStatefulWorldBean statefulBean; + + @Before + public void setup() { + statefulBean = new HelloStatefulWorldBean(); + } + + @Test + public void whenGetHelloWorld_thenHelloStatefulWorldIsReturned() { + String helloWorld = statefulBean.getHelloWorld(); + + assertThat(helloWorld).isEqualTo("Hello Stateful World!"); + } + + @Test + public void whenGetHelloWorldIsCalledTwice_thenCounterIs2() { + statefulBean.getHelloWorld(); + statefulBean.getHelloWorld(); + + assertThat(statefulBean.howManyTimes()).isEqualTo(2); + } + +} diff --git a/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java b/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java new file mode 100644 index 0000000000..b95618e4d4 --- /dev/null +++ b/spring-ejb/ejb-remote-for-spring/src/test/java/com/baeldung/ejb/tutorial/HelloStatelessWorldTestUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.ejb.tutorial; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +public class HelloStatelessWorldTestUnitTest { + + private HelloStatelessWorldBean statelessBean; + + @Before + public void setup() { + statelessBean = new HelloStatelessWorldBean(); + } + + @Test + public void whenGetHelloWorld_thenHelloStatelessWorldIsReturned() { + String helloWorld = statelessBean.getHelloWorld(); + + assertThat(helloWorld).isEqualTo("Hello Stateless World!"); + } + +} diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml new file mode 100755 index 0000000000..0b2a8445c5 --- /dev/null +++ b/spring-ejb/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + com.baeldung.spring.ejb + ejb-for-spring + 1.0.1 + pom + ejb + Spring EJB Tutorial + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + jboss-public-repository-group + JBoss Public Maven Repository Group + http://repository.jboss.org/nexus/content/groups/public/ + default + + true + never + + + true + never + + + + + + + + com.baeldung.spring.ejb + ejb-remote-for-spring + 1.0.1 + ejb + + + javax + javaee-api + 7.0 + provided + + + org.wildfly + wildfly-ejb-client-bom + 10.1.0.Final + pom + import + + + + + + + + + maven-ejb-plugin + 2.4 + + 3.2 + + + + + + + + ejb-remote-for-spring + spring-ejb-client + + diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml new file mode 100644 index 0000000000..c77ce09a2d --- /dev/null +++ b/spring-ejb/spring-ejb-client/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + spring-ejb-client + jar + + spring-ejb-client + Spring EJB Client + + + com.baeldung + parent-boot-5 + 0.0.1-SNAPSHOT + ../../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.wildfly + wildfly-ejb-client-bom + 10.1.0.Final + pom + + + + com.baeldung.spring.ejb + ejb-remote-for-spring + 1.0.1 + ejb + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + diff --git a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java new file mode 100644 index 0000000000..d3542a2158 --- /dev/null +++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java @@ -0,0 +1,50 @@ +package com.baeldung.springejbclient; + +import java.util.Properties; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import com.baeldung.ejb.tutorial.HelloStatefulWorld; +import com.baeldung.ejb.tutorial.HelloStatelessWorld; + +@SpringBootApplication +public class SpringEjbClientApplication { + + @Bean + public Context context() throws NamingException { + Properties jndiProps = new Properties(); + jndiProps.put("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory"); + jndiProps.put("jboss.naming.client.ejb.context", true); + jndiProps.put("java.naming.provider.url", "http-remoting://localhost:8080"); + return new InitialContext(jndiProps); + } + + @Bean + public HelloStatelessWorld helloStatelessWorld(Context context) throws NamingException { + return (HelloStatelessWorld) context.lookup(this.getFullName(HelloStatelessWorld.class)); + } + + @Bean + public HelloStatefulWorld helloStatefulWorld(Context context) throws NamingException { + return (HelloStatefulWorld) context.lookup(this.getFullName(HelloStatefulWorld.class)); + } + + @SuppressWarnings("rawtypes") + private String getFullName(Class classType) { + String moduleName = "ejb-remote-for-spring/"; + String beanName = classType.getSimpleName(); + String viewClassName = classType.getName(); + + return moduleName + beanName + "!" + viewClassName; + } + + public static void main(String[] args) { + SpringApplication.run(SpringEjbClientApplication.class, args); + } +} diff --git a/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/endpoint/HomeEndpoint.java b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/endpoint/HomeEndpoint.java new file mode 100644 index 0000000000..e72e3b310e --- /dev/null +++ b/spring-ejb/spring-ejb-client/src/main/java/com/baeldung/springejbclient/endpoint/HomeEndpoint.java @@ -0,0 +1,30 @@ +package com.baeldung.springejbclient.endpoint; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.ejb.tutorial.HelloStatefulWorld; +import com.baeldung.ejb.tutorial.HelloStatelessWorld; + +@RestController +public class HomeEndpoint { + + private HelloStatelessWorld helloStatelessWorld; + private HelloStatefulWorld helloStatefulWorld; + + public HomeEndpoint(HelloStatelessWorld helloStatelessWorld, HelloStatefulWorld helloStatefulWorld) { + this.helloStatelessWorld = helloStatelessWorld; + this.helloStatefulWorld = helloStatefulWorld; + } + + @GetMapping("/stateless") + public String getStateless() { + return helloStatelessWorld.getHelloWorld(); + } + + @GetMapping("/stateful") + public String getStateful() { + return helloStatefulWorld.getHelloWorld() + " called " + helloStatefulWorld.howManyTimes() + " times"; + } + +} diff --git a/spring-ejb/spring-ejb-client/src/main/resources/application.properties b/spring-ejb/spring-ejb-client/src/main/resources/application.properties new file mode 100644 index 0000000000..d564d40356 --- /dev/null +++ b/spring-ejb/spring-ejb-client/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8081 + +#logging.level.root=DEBUG \ No newline at end of file diff --git a/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/springejbclient/SpringEjbClientApplicationIntegrationTest.java b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/springejbclient/SpringEjbClientApplicationIntegrationTest.java new file mode 100644 index 0000000000..89c88fe5a5 --- /dev/null +++ b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/springejbclient/SpringEjbClientApplicationIntegrationTest.java @@ -0,0 +1,11 @@ +package com.baeldung.springejbclient; + +import org.junit.Test; + +public class SpringEjbClientApplicationIntegrationTest { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-hibernate3/README.md b/spring-hibernate3/README.md new file mode 100644 index 0000000000..02928dfb51 --- /dev/null +++ b/spring-hibernate3/README.md @@ -0,0 +1,2 @@ +## Relevant articles: +- [HibernateException: No Hibernate Session Bound to Thread in Hibernate 3](http://www.baeldung.com/no-hibernate-session-bound-to-thread-exception) diff --git a/spring-integration/README.md b/spring-integration/README.md index e5b0f601ce..750ad994eb 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -1,2 +1,5 @@ ### Relevant Articles: - [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) + +### Running the Sample +Executing the `mvn exec:java` maven command (either from the command line or from an IDE) will start up the application. Follow the command prompt for further instructions. diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index a162f18b9c..e3dd0d3f9a 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -18,11 +18,11 @@ UTF-8 - 4.3.5.RELEASE + 5.0.3.RELEASE 1.1.4.RELEASE 1.4.7 1.1.1 - + 4.12 2.10 1.5.0 @@ -56,7 +56,7 @@ exec-maven-plugin ${exec-maven-plugin.version} - com.baeldung.samples.Main + com.baeldung.samples.FileCopyConfig @@ -68,7 +68,7 @@ org.springframework.integration spring-integration-core - ${spring.integration.version} + ${spring.version} javax.activation @@ -84,17 +84,17 @@ org.springframework.integration spring-integration-twitter - ${spring.integration.version} + ${spring.version} org.springframework.integration spring-integration-mail - ${spring.integration.version} + ${spring.version} org.springframework.integration spring-integration-ftp - ${spring.integration.version} + ${spring.version} org.springframework.social @@ -104,7 +104,30 @@ org.springframework.integration spring-integration-file - ${spring.integration.version} + ${spring.version} + + + org.springframework.security + spring-security-config + ${spring.version} + + + org.springframework.integration + spring-integration-security + ${spring.version} + + + + org.springframework.security + spring-security-test + ${spring.version} + test + + + junit + junit + ${junit.version} + test diff --git a/spring-integration/src/main/java/com/baeldung/si/security/MessageConsumer.java b/spring-integration/src/main/java/com/baeldung/si/security/MessageConsumer.java new file mode 100644 index 0000000000..af925c63a7 --- /dev/null +++ b/spring-integration/src/main/java/com/baeldung/si/security/MessageConsumer.java @@ -0,0 +1,45 @@ +package com.baeldung.si.security; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Logger; + +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.messaging.Message; +import org.springframework.stereotype.Service; + +@Service +public class MessageConsumer { + + private String messageContent; + + private Map messagePSContent = new ConcurrentHashMap<>(); + + public String getMessageContent() { + return messageContent; + } + + public void setMessageContent(String messageContent) { + this.messageContent = messageContent; + } + + public Map getMessagePSContent() { + return messagePSContent; + } + + public void setMessagePSContent(Map messagePSContent) { + this.messagePSContent = messagePSContent; + } + + @ServiceActivator(inputChannel = "endDirectChannel") + public void endDirectFlow(Message message) { + setMessageContent(message.getPayload().toString()); + } + + @ServiceActivator(inputChannel = "finalPSResult") + public void endPSFlow(Message message) { + Logger.getAnonymousLogger().info(Thread.currentThread().getName() + " has completed ---------------------------"); + messagePSContent.put(Thread.currentThread().getName(), (String) message.getPayload()); + } + +} diff --git a/spring-integration/src/main/java/com/baeldung/si/security/SecuredDirectChannel.java b/spring-integration/src/main/java/com/baeldung/si/security/SecuredDirectChannel.java new file mode 100644 index 0000000000..964a07d7d7 --- /dev/null +++ b/spring-integration/src/main/java/com/baeldung/si/security/SecuredDirectChannel.java @@ -0,0 +1,50 @@ +package com.baeldung.si.security; + +import java.util.logging.Logger; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.config.EnableIntegration; +import org.springframework.integration.security.channel.ChannelSecurityInterceptor; +import org.springframework.integration.security.channel.SecuredChannel; +import org.springframework.messaging.Message; +import org.springframework.security.access.AccessDecisionManager; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.authentication.AuthenticationManager; + +@Configuration +@EnableIntegration +public class SecuredDirectChannel { + + @Bean(name = "startDirectChannel") + @SecuredChannel(interceptor = "channelSecurityInterceptor", sendAccess = { "ROLE_VIEWER", "jane" }) + public DirectChannel startDirectChannel() { + return new DirectChannel(); + } + + @ServiceActivator(inputChannel = "startDirectChannel", outputChannel = "endDirectChannel") + @PreAuthorize("hasRole('ROLE_LOGGER')") + public Message logMessage(Message message) { + Logger.getAnonymousLogger().info(message.toString()); + return message; + } + + @Bean(name = "endDirectChannel") + @SecuredChannel(interceptor = "channelSecurityInterceptor", sendAccess = { "ROLE_EDITOR" }) + public DirectChannel endDirectChannel() { + return new DirectChannel(); + } + + @Autowired + @Bean + public ChannelSecurityInterceptor channelSecurityInterceptor(AuthenticationManager authenticationManager, AccessDecisionManager customAccessDecisionManager) { + ChannelSecurityInterceptor channelSecurityInterceptor = new ChannelSecurityInterceptor(); + channelSecurityInterceptor.setAuthenticationManager(authenticationManager); + channelSecurityInterceptor.setAccessDecisionManager(customAccessDecisionManager); + return channelSecurityInterceptor; + } + +} diff --git a/spring-integration/src/main/java/com/baeldung/si/security/SecurityConfig.java b/spring-integration/src/main/java/com/baeldung/si/security/SecurityConfig.java new file mode 100644 index 0000000000..9c5b38b909 --- /dev/null +++ b/spring-integration/src/main/java/com/baeldung/si/security/SecurityConfig.java @@ -0,0 +1,46 @@ +package com.baeldung.si.security; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.security.channel.ChannelSecurityInterceptor; +import org.springframework.security.access.AccessDecisionManager; +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.vote.AffirmativeBased; +import org.springframework.security.access.vote.RoleVoter; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class SecurityConfig extends GlobalMethodSecurityConfiguration { + + @Override + @Bean + public AuthenticationManager authenticationManager() throws Exception { + return super.authenticationManager(); + } + + @Bean + public AccessDecisionManager customAccessDecisionManager() { + List> decisionVoters = new ArrayList<>(); + decisionVoters.add(new RoleVoter()); + decisionVoters.add(new UsernameAccessDecisionVoter()); + AccessDecisionManager accessDecisionManager = new AffirmativeBased(decisionVoters); + return accessDecisionManager; + } + + @Autowired + @Bean + public ChannelSecurityInterceptor channelSecurityInterceptor(AuthenticationManager authenticationManager, AccessDecisionManager customAccessDecisionManager) { + ChannelSecurityInterceptor channelSecurityInterceptor = new ChannelSecurityInterceptor(); + channelSecurityInterceptor.setAuthenticationManager(authenticationManager); + channelSecurityInterceptor.setAccessDecisionManager(customAccessDecisionManager); + return channelSecurityInterceptor; + } + +} diff --git a/spring-integration/src/main/java/com/baeldung/si/security/SecurityPubSubChannel.java b/spring-integration/src/main/java/com/baeldung/si/security/SecurityPubSubChannel.java new file mode 100644 index 0000000000..11409bb89b --- /dev/null +++ b/spring-integration/src/main/java/com/baeldung/si/security/SecurityPubSubChannel.java @@ -0,0 +1,82 @@ +package com.baeldung.si.security; + +import java.util.stream.Collectors; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.channel.PublishSubscribeChannel; +import org.springframework.integration.config.EnableIntegration; +import org.springframework.integration.config.GlobalChannelInterceptor; +import org.springframework.integration.security.channel.SecuredChannel; +import org.springframework.integration.security.channel.SecurityContextPropagationChannelInterceptor; +import org.springframework.integration.support.DefaultMessageBuilderFactory; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; + +@Configuration +@EnableIntegration +public class SecurityPubSubChannel { + + @Bean(name = "startPSChannel") + @SecuredChannel(interceptor = "channelSecurityInterceptor", sendAccess = "ROLE_VIEWER") + public PublishSubscribeChannel startChannel() { + return new PublishSubscribeChannel(executor()); + } + + @ServiceActivator(inputChannel = "startPSChannel", outputChannel = "finalPSResult") + @PreAuthorize("hasRole('ROLE_LOGGER')") + public Message changeMessageToRole(Message message) { + return buildNewMessage(getRoles(), message); + } + + @ServiceActivator(inputChannel = "startPSChannel", outputChannel = "finalPSResult") + @PreAuthorize("hasRole('ROLE_VIEWER')") + public Message changeMessageToUserName(Message message) { + return buildNewMessage(getUsername(), message); + } + + @Bean(name = "finalPSResult") + public DirectChannel finalPSResult() { + return new DirectChannel(); + } + + @Bean + @GlobalChannelInterceptor(patterns = { "startPSChannel", "endDirectChannel" }) + public ChannelInterceptor securityContextPropagationInterceptor() { + return new SecurityContextPropagationChannelInterceptor(); + } + + @Bean + public ThreadPoolTaskExecutor executor() { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + pool.setCorePoolSize(10); + pool.setMaxPoolSize(10); + pool.setWaitForTasksToCompleteOnShutdown(true); + return pool; + } + + public String getRoles() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getAuthorities().stream().map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); + } + + public String getUsername() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + public Message buildNewMessage(String content, Message message) { + DefaultMessageBuilderFactory builderFactory = new DefaultMessageBuilderFactory(); + MessageBuilder messageBuilder = builderFactory.withPayload(content); + messageBuilder.copyHeaders(message.getHeaders()); + return messageBuilder.build(); + } + +} diff --git a/spring-integration/src/main/java/com/baeldung/si/security/UsernameAccessDecisionVoter.java b/spring-integration/src/main/java/com/baeldung/si/security/UsernameAccessDecisionVoter.java new file mode 100644 index 0000000000..052f79ddf7 --- /dev/null +++ b/spring-integration/src/main/java/com/baeldung/si/security/UsernameAccessDecisionVoter.java @@ -0,0 +1,45 @@ +package com.baeldung.si.security; + +import java.util.Collection; + +import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.core.Authentication; + +public class UsernameAccessDecisionVoter implements AccessDecisionVoter { + private String rolePrefix = "ROLE_"; + + @Override + public boolean supports(ConfigAttribute attribute) { + if ((attribute.getAttribute() != null) + && !attribute.getAttribute().startsWith(rolePrefix)) { + return true; + }else { + return false; + } + } + + @Override + public boolean supports(Class clazz) { + return true; + } + + @Override + public int vote(Authentication authentication, Object object, Collection attributes) { + if (authentication == null) { + return ACCESS_DENIED; + } + String name = authentication.getName(); + int result = ACCESS_ABSTAIN; + for (ConfigAttribute attribute : attributes) { + if (this.supports(attribute)) { + result = ACCESS_DENIED; + if (attribute.getAttribute().equals(name)) { + return ACCESS_GRANTED; + } + } + } + return result; + } + +} diff --git a/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurity.java b/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurity.java new file mode 100644 index 0000000000..9ae82af2dc --- /dev/null +++ b/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurity.java @@ -0,0 +1,81 @@ +package com.baeldung.si; + +import static org.junit.Assert.assertEquals; + +import org.hamcrest.core.IsInstanceOf; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.SubscribableChannel; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.si.security.MessageConsumer; +import com.baeldung.si.security.SecuredDirectChannel; +import com.baeldung.si.security.SecurityConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { SecurityConfig.class, SecuredDirectChannel.class, MessageConsumer.class }) +public class TestSpringIntegrationSecurity { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Autowired + SubscribableChannel startDirectChannel; + + @Autowired + MessageConsumer messageConsumer; + + final String DIRECT_CHANNEL_MESSAGE = "Direct channel message"; + + @Test(expected = AuthenticationCredentialsNotFoundException.class) + public void givenNoUser_whenSendToDirectChannel_thenCredentialNotFound() { + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + } + + @Test + @WithMockUser(username = "jane", roles = { "LOGGER" }) + public void givenRoleLogger_whenSendMessageToDirectChannel_thenAccessDenied() { + expectedException.expectCause(IsInstanceOf. instanceOf(AccessDeniedException.class)); + + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + } + + @Test + @WithMockUser(username = "jane") + public void givenJane_whenSendMessageToDirectChannel_thenAccessDenied() { + expectedException.expectCause(IsInstanceOf. instanceOf(AccessDeniedException.class)); + + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + } + + @Test + @WithMockUser(roles = { "VIEWER" }) + public void givenRoleViewer_whenSendToDirectChannel_thenAccessDenied() { + expectedException.expectCause(IsInstanceOf. instanceOf(AccessDeniedException.class)); + + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + } + + @Test + @WithMockUser(roles = { "LOGGER", "VIEWER", "EDITOR" }) + public void givenRoleLoggerAndUser_whenSendMessageToDirectChannel_thenFlowCompletedSuccessfully() { + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + assertEquals(DIRECT_CHANNEL_MESSAGE, messageConsumer.getMessageContent()); + } + + @Test + @WithMockUser(username = "jane", roles = { "LOGGER", "EDITOR" }) + public void givenJaneLoggerEditor_whenSendToDirectChannel_thenFlowCompleted() { + startDirectChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + assertEquals(DIRECT_CHANNEL_MESSAGE, messageConsumer.getMessageContent()); + } + +} \ No newline at end of file diff --git a/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurityExecutor.java b/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurityExecutor.java new file mode 100644 index 0000000000..b06136a7ca --- /dev/null +++ b/spring-integration/src/test/java/com/baeldung/si/TestSpringIntegrationSecurityExecutor.java @@ -0,0 +1,68 @@ +package com.baeldung.si; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.SubscribableChannel; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.si.security.MessageConsumer; +import com.baeldung.si.security.SecurityConfig; +import com.baeldung.si.security.SecurityPubSubChannel; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { SecurityPubSubChannel.class, MessageConsumer.class, SecurityConfig.class }) +public class TestSpringIntegrationSecurityExecutor { + + @Autowired + SubscribableChannel startPSChannel; + + @Autowired + MessageConsumer messageConsumer; + + @Autowired + ThreadPoolTaskExecutor executor; + + final String DIRECT_CHANNEL_MESSAGE = "Direct channel message"; + + @Before + public void clearData() { + messageConsumer.setMessagePSContent(new ConcurrentHashMap<>()); + executor.setWaitForTasksToCompleteOnShutdown(true); + } + + @Test + @WithMockUser(username = "user", roles = { "VIEWER" }) + public void givenRoleUser_whenSendMessageToPSChannel_thenNoMessageArrived() throws IllegalStateException, InterruptedException { + startPSChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + + executor.getThreadPoolExecutor().awaitTermination(2, TimeUnit.SECONDS); + + assertEquals(1, messageConsumer.getMessagePSContent().size()); + assertTrue(messageConsumer.getMessagePSContent().values().contains("user")); + } + + @Test + @WithMockUser(username = "user", roles = { "LOGGER", "VIEWER" }) + public void givenRoleUserAndLogger_whenSendMessageToPSChannel_then2GetMessages() throws IllegalStateException, InterruptedException { + startPSChannel.send(new GenericMessage(DIRECT_CHANNEL_MESSAGE)); + + executor.getThreadPoolExecutor().awaitTermination(2, TimeUnit.SECONDS); + + assertEquals(2, messageConsumer.getMessagePSContent().size()); + assertTrue(messageConsumer.getMessagePSContent().values().contains("user")); + assertTrue(messageConsumer.getMessagePSContent().values().contains("ROLE_LOGGER,ROLE_VIEWER")); + } + +} diff --git a/spring-integration/src/test/resources/logback-test.xml b/spring-integration/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..a807be0ca2 --- /dev/null +++ b/spring-integration/src/test/resources/logback-test.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/spring-jenkins-pipeline/.gitignore b/spring-jenkins-pipeline/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-jenkins-pipeline/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000..5fd4d5023f Binary files /dev/null and b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.jar differ diff --git a/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..c954cec91c --- /dev/null +++ b/spring-jenkins-pipeline/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md new file mode 100644 index 0000000000..8c10e85da2 --- /dev/null +++ b/spring-jenkins-pipeline/README.md @@ -0,0 +1,26 @@ +BASIC CRUD API with Spring Boot +================================ + +This is the code of a simple API for some CRUD operations build using Spring Boot. + +### Requirements + +- Maven +- JDK 8 +- MongoDB + +### Running +To build and start the server simply type + +```bash +$ mvn clean install +$ mvn spring-boot:run -Dserver.port=8989 +``` + +Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) + +Enjoy it :) + +### Relevant articles + +- [Intro to Jenkins 2 and the Power of Pipelines](http://www.baeldung.com/jenkins-pipelines) diff --git a/spring-jenkins-pipeline/mvnw b/spring-jenkins-pipeline/mvnw new file mode 100755 index 0000000000..a1ba1bf554 --- /dev/null +++ b/spring-jenkins-pipeline/mvnw @@ -0,0 +1,233 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} "$@" diff --git a/spring-jenkins-pipeline/mvnw.cmd b/spring-jenkins-pipeline/mvnw.cmd new file mode 100644 index 0000000000..2b934e89dd --- /dev/null +++ b/spring-jenkins-pipeline/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% \ No newline at end of file diff --git a/spring-jenkins-pipeline/pom.xml b/spring-jenkins-pipeline/pom.xml new file mode 100644 index 0000000000..071f6e6e36 --- /dev/null +++ b/spring-jenkins-pipeline/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + spring-jenkins-pipeline + 0.0.1-SNAPSHOT + jar + + spring-jenkins-pipeline + Intro to Jenkins 2 and the power of pipelines + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + UTF-8 + UTF-8 + 1.8 + 2.17 + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle.version} + + + + + + + integration + + + + maven-surefire-plugin + + + **/*UnitTest.java + + + + **/*IntegrationTest.java + + + + + + + + + unit + + + + maven-surefire-plugin + + + **/*IntegrationTest.java + + + + **/*UnitTest.java + + + + + + + + diff --git a/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix new file mode 100644 index 0000000000..b76bb8a81a --- /dev/null +++ b/spring-jenkins-pipeline/scripted-pipeline-unix-nonunix @@ -0,0 +1,81 @@ +node { + stage 'Clone the project' + git 'https://github.com/eugenp/tutorials.git' + + dir('spring-jenkins-pipeline') { + stage("Compilation and Analysis") { + parallel 'Compilation': { + if (isUnix()) { + sh "./mvnw clean install -DskipTests" + } else { + bat "./mvnw.cmd clean install -DskipTests" + } + }, 'Static Analysis': { + stage("Checkstyle") { + if (isUnix()) { + sh "./mvnw checkstyle:checkstyle" + } else { + bat "./mvnw.cmd checkstyle:checkstyle" + } + step([$class: 'CheckStylePublisher', + canRunOnFailed: true, + defaultEncoding: '', + healthy: '100', + pattern: '**/target/checkstyle-result.xml', + unHealthy: '90', + useStableBuildAsReference: true + ]) + } + } + } + + stage("Tests and Deployment") { + parallel 'Unit tests': { + stage("Running unit tests") { + try { + if (isUnix()) { + sh "./mvnw test -Punit" + } else { + bat "./mvnw.cmd test -Punit" + } + } catch(err) { + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) + throw err + } + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*UnitTest.xml']) + + } + }, 'Integration tests': { + stage("Running integration tests") { + try { + if (isUnix()) { + sh "./mvnw test -Pintegration" + } else { + bat "./mvnw.cmd test -Pintegration" + } + } catch(err) { + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml']) + throw err + } + step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*IntegrationTest.xml']) + } + } + + stage("Staging") { + if (isUnix()) { + sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid || kill -KILL \$pid" + } else { + bat "FOR /F \"tokens=5 delims= \" %%G IN (\"netstat -a | findstr :8989\") DO TaskKill.exe /PID %%G /fi \"memusage gt 0\"" + } + + withEnv(['JENKINS_NODE_COOKIE=dontkill']) { + if (isUnix()) { + sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &' + } else { + bat 'start ./mvnw.cmd spring-boot:run -Dserver.port=8989' + } + } + } + } + } +} \ No newline at end of file diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java new file mode 100644 index 0000000000..fcf4fde414 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/SpringJenkinsPipelineApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@SpringBootApplication +@EnableMongoRepositories +public class SpringJenkinsPipelineApplication { + public static void main(String[] args) { + SpringApplication.run(SpringJenkinsPipelineApplication.class, args); + } +} diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java new file mode 100644 index 0000000000..3d1dd27b0e --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/domain/Student.java @@ -0,0 +1,73 @@ +package com.baeldung.domain; + +import javax.validation.constraints.NotNull; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; + +@Document(collection = "STUDENT") +public class Student implements Serializable { + + @Id + private String id; + @NotNull + private String firstName; + private String lastName; + @NotNull + private String phoneNumber; + private String email; + + public Student(String firstName, String lastName, String phoneNumber, String email) { + this.firstName = firstName; + this.lastName = lastName; + this.phoneNumber = phoneNumber; + this.email = email; + } + + public String getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "Student{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java b/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java new file mode 100644 index 0000000000..d0ca7d8510 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/java/com/baeldung/repository/StudentRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository; + +import org.springframework.data.mongodb.repository.MongoRepository; +import com.baeldung.domain.Student; + +public interface StudentRepository extends MongoRepository { +} diff --git a/spring-jenkins-pipeline/src/main/resources/application.properties b/spring-jenkins-pipeline/src/main/resources/application.properties new file mode 100644 index 0000000000..b6bfd8f6f3 --- /dev/null +++ b/spring-jenkins-pipeline/src/main/resources/application.properties @@ -0,0 +1,14 @@ +# the db host +spring.data.mongodb.host=localhost +# the connection port (defaults to 27107) +spring.data.mongodb.port=27017 +# The database's name +spring.data.mongodb.database=Jenkins-Pipeline + +# Or this +# spring.data.mongodb.uri=mongodb://localhost/Jenkins-Pipeline + +# spring.data.mongodb.username= +# spring.data.mongodb.password= + +spring.data.mongodb.repositories.enabled=true \ No newline at end of file diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java new file mode 100644 index 0000000000..092ebb93fd --- /dev/null +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeIntegrationTest.java @@ -0,0 +1,38 @@ +package com.baeldung; + +import com.baeldung.domain.Student; +import com.baeldung.repository.StudentRepository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertNotEquals; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class SomeIntegrationTest { + @Autowired + private StudentRepository studentRepository; + + @Before + public void setup() { + Student student = new Student("Paul", "Smith", "64377473774", "me@mailprovider.com"); + studentRepository.save(student); + } + + @Test + public void whenInserting_andCount_thenWeDontGetZero() { + long count = studentRepository.count(); + + assertNotEquals(0, count); + } + + @After + public void clean() { + studentRepository.deleteAll(); + } +} diff --git a/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java new file mode 100644 index 0000000000..ea317ed7cd --- /dev/null +++ b/spring-jenkins-pipeline/src/test/java/com/baeldung/SomeUnitTest.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class SomeUnitTest { + @Test + public void init() { + assertEquals(1, 1); + } +} diff --git a/spring-jinq/README.md b/spring-jinq/README.md new file mode 100644 index 0000000000..10d7903f49 --- /dev/null +++ b/spring-jinq/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Introduction to Jinq with Spring](http://www.baeldung.com/spring-jinq) + diff --git a/spring-jinq/pom.xml b/spring-jinq/pom.xml new file mode 100644 index 0000000000..a895ae8dd4 --- /dev/null +++ b/spring-jinq/pom.xml @@ -0,0 +1,83 @@ + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + 4.0.0 + spring-jinq + 0.1-SNAPSHOT + + spring-jinq + + jar + + + UTF-8 + 1.8 + + 1.8.22 + + + + + + org.springframework.boot + spring-boot-dependencies + 1.5.9.RELEASE + pom + import + + + + + + + org.jinq + jinq-jpa + ${jinq.version} + + + + + com.h2database + h2 + + + + org.hibernate + hibernate-entitymanager + + + + + org.springframework + spring-orm + + + + + org.springframework.boot + spring-boot-starter-test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + false + + + + + + diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/JinqApplication.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/JinqApplication.java new file mode 100644 index 0000000000..d53b585d36 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/JinqApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.jinq; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JinqApplication { + + public static void main(String[] args) { + SpringApplication.run(JinqApplication.class, args); + } +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java new file mode 100644 index 0000000000..6d921045b7 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/config/JinqProviderConfiguration.java @@ -0,0 +1,18 @@ +package com.baeldung.spring.jinq.config; + +import javax.persistence.EntityManagerFactory; + +import org.jinq.jpa.JinqJPAStreamProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JinqProviderConfiguration { + + @Bean + @Autowired + JinqJPAStreamProvider jinqProvider(EntityManagerFactory emf) { + return new JinqJPAStreamProvider(emf); + } +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java new file mode 100644 index 0000000000..263e6c7622 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Car.java @@ -0,0 +1,58 @@ +package com.baeldung.spring.jinq.entities; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; + +@Entity(name = "CAR") +public class Car { + private String model; + private String description; + private int year; + private String engine; + private Manufacturer manufacturer; + + @Id + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + public String getEngine() { + return engine; + } + + public void setEngine(String engine) { + this.engine = engine; + } + + @OneToOne + @JoinColumn(name = "name") + public Manufacturer getManufacturer() { + return manufacturer; + } + + public void setManufacturer(Manufacturer manufacturer) { + this.manufacturer = manufacturer; + } +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java new file mode 100644 index 0000000000..f6e5fd23de --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/entities/Manufacturer.java @@ -0,0 +1,42 @@ +package com.baeldung.spring.jinq.entities; + +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +@Entity(name = "MANUFACTURER") +public class Manufacturer { + + private String name; + private String city; + private List cars; + + @Id + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @OneToMany(mappedBy = "model") + public List getCars() { + return cars; + } + + public void setCars(List cars) { + this.cars = cars; + } + +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java new file mode 100644 index 0000000000..42b81ecc59 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/BaseJinqRepositoryImpl.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.jinq.repositories; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.jinq.jpa.JPAJinqStream; +import org.jinq.jpa.JinqJPAStreamProvider; +import org.springframework.beans.factory.annotation.Autowired; + +public abstract class BaseJinqRepositoryImpl { + @Autowired + private JinqJPAStreamProvider jinqDataProvider; + + @PersistenceContext + private EntityManager entityManager; + + protected abstract Class entityType(); + + public JPAJinqStream stream() { + return streamOf(entityType()); + } + + protected JPAJinqStream streamOf(Class clazz) { + return jinqDataProvider.streamAll(entityManager, clazz); + } +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepository.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepository.java new file mode 100644 index 0000000000..56f6106e08 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepository.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.jinq.repositories; + +import java.util.List; +import java.util.Optional; + +import org.jinq.tuples.Pair; +import org.jinq.tuples.Tuple3; + +import com.baeldung.spring.jinq.entities.Car; +import com.baeldung.spring.jinq.entities.Manufacturer; + +public interface CarRepository { + + Optional findByModel(String model); + + List findByModelAndDescription(String model, String desc); + + List> findWithModelYearAndEngine(); + + Optional findManufacturerByModel(String model); + + List> findCarsPerManufacturer(); + + long countCarsByModel(String model); + + List findAll(int skip, int limit); +} diff --git a/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepositoryImpl.java b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepositoryImpl.java new file mode 100644 index 0000000000..bf16c87461 --- /dev/null +++ b/spring-jinq/src/main/java/com/baeldung/spring/jinq/repositories/CarRepositoryImpl.java @@ -0,0 +1,72 @@ +package com.baeldung.spring.jinq.repositories; + +import java.util.List; +import java.util.Optional; + +import org.jinq.orm.stream.JinqStream; +import org.jinq.tuples.Pair; +import org.jinq.tuples.Tuple3; +import org.springframework.stereotype.Repository; + +import com.baeldung.spring.jinq.entities.Car; +import com.baeldung.spring.jinq.entities.Manufacturer; + +@Repository +public class CarRepositoryImpl extends BaseJinqRepositoryImpl implements CarRepository { + + @Override + public Optional findByModel(String model) { + return stream().where(c -> c.getModel() + .equals(model)) + .findFirst(); + } + + @Override + public List findByModelAndDescription(String model, String desc) { + return stream().where(c -> c.getModel() + .equals(model) + && c.getDescription() + .contains(desc)) + .toList(); + } + + @Override + public List> findWithModelYearAndEngine() { + return stream().select(c -> new Tuple3<>(c.getModel(), c.getYear(), c.getEngine())) + .toList(); + } + + @Override + public Optional findManufacturerByModel(String model) { + return stream().where(c -> c.getModel() + .equals(model)) + .select(c -> c.getManufacturer()) + .findFirst(); + } + + @Override + public List> findCarsPerManufacturer() { + return streamOf(Manufacturer.class).join(m -> JinqStream.from(m.getCars())) + .toList(); + } + + @Override + public long countCarsByModel(String model) { + return stream().where(c -> c.getModel() + .equals(model)) + .count(); + } + + @Override + public List findAll(int skip, int limit) { + return stream().skip(skip) + .limit(limit) + .toList(); + } + + @Override + protected Class entityType() { + return Car.class; + } + +} diff --git a/spring-jinq/src/main/resources/application.properties b/spring-jinq/src/main/resources/application.properties new file mode 100644 index 0000000000..dc73bed0c5 --- /dev/null +++ b/spring-jinq/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.url=jdbc:h2:~/jinq +spring.datasource.username=sa +spring.datasource.password= + +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true \ No newline at end of file diff --git a/spring-jinq/src/test/java/com/baeldung/spring/jinq/repositories/CarRepositoryIntegrationTest.java b/spring-jinq/src/test/java/com/baeldung/spring/jinq/repositories/CarRepositoryIntegrationTest.java new file mode 100644 index 0000000000..9cb126cbaa --- /dev/null +++ b/spring-jinq/src/test/java/com/baeldung/spring/jinq/repositories/CarRepositoryIntegrationTest.java @@ -0,0 +1,42 @@ +package com.baeldung.spring.jinq.repositories; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.jinq.JinqApplication; + +@ContextConfiguration(classes = JinqApplication.class) +@RunWith(SpringJUnit4ClassRunner.class) +public class CarRepositoryIntegrationTest { + + @Autowired + private CarRepository repository; + + @Test + public void givenACar_whenFilter_thenShouldBeFound() { + assertThat(repository.findByModel("model1") + .isPresent()).isFalse(); + } + + @Test + public void givenACar_whenMultipleFilters_thenShouldBeFound() { + assertThat(repository.findByModelAndDescription("model1", "desc") + .isEmpty()).isTrue(); + } + + @Test + public void whenUseASelectClause() { + assertThat(repository.findWithModelYearAndEngine() + .isEmpty()).isTrue(); + } + + @Test + public void whenUsingOneToOneRelationship() { + assertThat(repository.findManufacturerByModel("model1")).isNotNull(); + } +} diff --git a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java b/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java deleted file mode 100644 index b50fe9122e..0000000000 --- a/spring-jpa/src/main/java/org/baeldung/inmemory/persistence/model/Student.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.baeldung.inmemory.persistence.model; - -import javax.persistence.Entity; -import javax.persistence.Id; - -@Entity -public class Student { - - @Id - private long id; - private String name; - - public Student() { - } - - public Student(long id, String name) { - super(); - this.id = id; - this.name = name; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java b/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java deleted file mode 100644 index 8380ab5434..0000000000 --- a/spring-jpa/src/test/java/org/baeldung/persistence/repository/InMemoryDBIntegrationTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.baeldung.persistence.repository; - -import org.baeldung.config.StudentJpaConfig; -import org.baeldung.inmemory.persistence.dao.StudentRepository; -import org.baeldung.inmemory.persistence.model.Student; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; - -import static org.junit.Assert.assertEquals; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class) -@Transactional -public class InMemoryDBIntegrationTest { - - @Resource - private StudentRepository studentRepository; - - private static final long ID = 1; - private static final String NAME="john"; - - @Test - public void givenStudent_whenSave_thenGetOk(){ - Student student = new Student(ID, NAME); - studentRepository.save(student); - - Student student2 = studentRepository.findOne(ID); - assertEquals("name incorrect", NAME, student2.getName()); - } - -} diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index 822eac7873..49c0a5acf9 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -36,12 +36,16 @@ katharsis-servlet ${katharsis.version} - + + org.reflections + reflections + 0.9.10 + - 1.0.1 + 2.1.3 1.6.1 diff --git a/spring-katharsis/src/main/java/org/baeldung/Application.java b/spring-katharsis/src/main/java/org/baeldung/Application.java index e7beb16e04..b61151d87f 100644 --- a/spring-katharsis/src/main/java/org/baeldung/Application.java +++ b/spring-katharsis/src/main/java/org/baeldung/Application.java @@ -2,7 +2,7 @@ package org.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/RoleResourceRepository.java b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/RoleResourceRepository.java index da59d505e4..101e4c2b7e 100644 --- a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/RoleResourceRepository.java +++ b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/RoleResourceRepository.java @@ -1,6 +1,6 @@ package org.baeldung.persistence.katharsis; -import io.katharsis.queryParams.RequestParams; +import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.ResourceRepository; import org.baeldung.persistence.dao.RoleRepository; @@ -15,17 +15,17 @@ public class RoleResourceRepository implements ResourceRepository { private RoleRepository roleRepository; @Override - public Role findOne(Long id, RequestParams params) { + public Role findOne(Long id, QueryParams params) { return roleRepository.findOne(id); } @Override - public Iterable findAll(RequestParams params) { + public Iterable findAll(QueryParams params) { return roleRepository.findAll(); } @Override - public Iterable findAll(Iterable ids, RequestParams params) { + public Iterable findAll(Iterable ids, QueryParams params) { return roleRepository.findAll(ids); } diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java index 4c7ce70765..b6d519ab80 100644 --- a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java +++ b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserResourceRepository.java @@ -1,6 +1,6 @@ package org.baeldung.persistence.katharsis; -import io.katharsis.queryParams.RequestParams; +import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.ResourceRepository; import org.baeldung.persistence.dao.UserRepository; @@ -15,17 +15,17 @@ public class UserResourceRepository implements ResourceRepository { private UserRepository userRepository; @Override - public User findOne(Long id, RequestParams params) { + public User findOne(Long id, QueryParams params) { return userRepository.findOne(id); } @Override - public Iterable findAll(RequestParams params) { + public Iterable findAll(QueryParams params) { return userRepository.findAll(); } @Override - public Iterable findAll(Iterable ids, RequestParams params) { + public Iterable findAll(Iterable ids, QueryParams params) { return userRepository.findAll(ids); } diff --git a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserToRoleRelationshipRepository.java b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserToRoleRelationshipRepository.java index e10c29aece..168cd1c866 100644 --- a/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserToRoleRelationshipRepository.java +++ b/spring-katharsis/src/main/java/org/baeldung/persistence/katharsis/UserToRoleRelationshipRepository.java @@ -1,6 +1,6 @@ package org.baeldung.persistence.katharsis; -import io.katharsis.queryParams.RequestParams; +import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.RelationshipRepository; import java.util.HashSet; @@ -52,13 +52,13 @@ public class UserToRoleRelationshipRepository implements RelationshipRepository< } @Override - public Role findOneTarget(Long sourceId, String fieldName, RequestParams requestParams) { + public Role findOneTarget(Long sourceId, String fieldName, QueryParams QueryParams) { // not for many-to-many return null; } @Override - public Iterable findManyTargets(Long sourceId, String fieldName, RequestParams requestParams) { + public Iterable findManyTargets(Long sourceId, String fieldName, QueryParams QueryParams) { final User user = userRepository.findOne(sourceId); return user.getRoles(); } diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index 8b8618aeee..3a129c179e 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -11,10 +11,10 @@ http://maven.apache.org - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index d8bcc5682a..8c2949275c 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -12,10 +12,10 @@ Injecting Mockito Mocks into Spring Beans - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-mockito/src/test/java/com/baeldung/UserServiceIntegrationTest.java b/spring-mockito/src/test/java/com/baeldung/UserServiceIntegrationTest.java index 70861a96e1..d70f916b12 100644 --- a/spring-mockito/src/test/java/com/baeldung/UserServiceIntegrationTest.java +++ b/spring-mockito/src/test/java/com/baeldung/UserServiceIntegrationTest.java @@ -5,13 +5,13 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ActiveProfiles("test") @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = MocksApplication.class) +@SpringBootTest(classes = MocksApplication.class) public class UserServiceIntegrationTest { @Autowired diff --git a/spring-mvc-email/pom.xml b/spring-mvc-email/pom.xml index 9228054878..5f08b710ec 100644 --- a/spring-mvc-email/pom.xml +++ b/spring-mvc-email/pom.xml @@ -10,10 +10,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -24,7 +24,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-mvc-forms/README.md b/spring-mvc-forms-jsp/README.md similarity index 100% rename from spring-mvc-forms/README.md rename to spring-mvc-forms-jsp/README.md diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms-jsp/pom.xml similarity index 97% rename from spring-mvc-forms/pom.xml rename to spring-mvc-forms-jsp/pom.xml index e82a906112..bb666cff4f 100644 --- a/spring-mvc-forms/pom.xml +++ b/spring-mvc-forms-jsp/pom.xml @@ -6,9 +6,9 @@ 4.0.0 com.baeldung 0.1-SNAPSHOT - spring-mvc-forms + spring-mvc-forms-jsp - spring-mvc-forms + spring-mvc-forms-jsp war diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/CustomerController.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/FileUploadController.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/FileUploadController.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/FileUploadController.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/FileUploadController.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/UserController.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/controller/UserController.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Customer.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Customer.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Customer.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/Employee.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/User.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/domain/User.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/interceptor/FileUploadExceptionAdvice.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/interceptor/FileUploadExceptionAdvice.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/interceptor/FileUploadExceptionAdvice.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/interceptor/FileUploadExceptionAdvice.java diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java b/spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java similarity index 100% rename from spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java rename to spring-mvc-forms-jsp/src/main/java/com/baeldung/springmvcforms/validator/CustomerValidator.java diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/html/user.html similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/html/user.html rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/html/user.html diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/customerHome.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/customerHome.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/customerHome.jsp diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/customerView.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/customerView.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/customerView.jsp diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/employeeHome.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/employeeHome.jsp diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/employeeView.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/employeeView.jsp diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/error.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/error.jsp diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/file.jsp b/spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/file.jsp similarity index 100% rename from spring-mvc-forms/src/main/webapp/WEB-INF/views/file.jsp rename to spring-mvc-forms-jsp/src/main/webapp/WEB-INF/views/file.jsp diff --git a/spring-mvc-forms/src/main/webapp/css/user.css b/spring-mvc-forms-jsp/src/main/webapp/css/user.css similarity index 100% rename from spring-mvc-forms/src/main/webapp/css/user.css rename to spring-mvc-forms-jsp/src/main/webapp/css/user.css diff --git a/spring-mvc-forms/src/main/webapp/js/app.js b/spring-mvc-forms-jsp/src/main/webapp/js/app.js similarity index 100% rename from spring-mvc-forms/src/main/webapp/js/app.js rename to spring-mvc-forms-jsp/src/main/webapp/js/app.js diff --git a/spring-mvc-forms-thymeleaf/pom.xml b/spring-mvc-forms-thymeleaf/pom.xml new file mode 100644 index 0000000000..9238153847 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.baeldung + spring-mvc-forms-thymeleaf + 0.0.1-SNAPSHOT + jar + + spring-mvc-forms-thymeleaf + spring forms examples using thymeleaf + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + methods + true + + **/*IntegrationTest.java + **/*LiveTest.java + + + + + + + + UTF-8 + UTF-8 + + + diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/Config.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/Config.java new file mode 100644 index 0000000000..7c9f1bf00b --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/Config.java @@ -0,0 +1,44 @@ +package com.baeldung.sessionattrs; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.Ordered; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.thymeleaf.templatemode.TemplateMode; +import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; +import org.thymeleaf.templateresolver.ITemplateResolver; + +@EnableWebMvc +@Configuration +public class Config implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + } + + @Bean + @Scope( + value = WebApplicationContext.SCOPE_SESSION, + proxyMode = ScopedProxyMode.TARGET_CLASS) + public TodoList todos() { + return new TodoList(); + } + + @Bean + public ITemplateResolver templateResolver() { + ClassLoaderTemplateResolver resolver + = new ClassLoaderTemplateResolver(); + resolver.setPrefix("templates/sessionattrs/"); + resolver.setSuffix(".html"); + resolver.setTemplateMode(TemplateMode.HTML); + resolver.setCharacterEncoding("UTF-8"); + return resolver; + } +} diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/SessionAttrsApplication.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/SessionAttrsApplication.java new file mode 100644 index 0000000000..7b9f8a700f --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/SessionAttrsApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.sessionattrs; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication( + exclude = {SecurityAutoConfiguration.class, + DataSourceAutoConfiguration.class}) +public class SessionAttrsApplication { + + public static void main(String[] args) { + SpringApplication.run(SessionAttrsApplication.class, args); + } +} diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxy.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxy.java new file mode 100644 index 0000000000..feedecf844 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxy.java @@ -0,0 +1,45 @@ +package com.baeldung.sessionattrs; + +import java.time.LocalDateTime; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/scopedproxy") +public class TodoControllerWithScopedProxy { + + private TodoList todos; + + public TodoControllerWithScopedProxy(TodoList todos) { + this.todos = todos; + } + + @GetMapping("/form") + public String showForm(Model model) { + if (!todos.isEmpty()) { + model.addAttribute("todo", todos.peekLast()); + } else { + model.addAttribute("todo", new TodoItem()); + } + + return "scopedproxyform"; + } + + @PostMapping("/form") + public String create(@ModelAttribute TodoItem todo) { + todo.setCreateDate(LocalDateTime.now()); + todos.add(todo); + return "redirect:/scopedproxy/todos.html"; + } + + @GetMapping("/todos.html") + public String list(Model model) { + model.addAttribute("todos", todos); + return "scopedproxytodos"; + } +} diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributes.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributes.java new file mode 100644 index 0000000000..99e0b46fc2 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributes.java @@ -0,0 +1,55 @@ +package com.baeldung.sessionattrs; + +import java.time.LocalDateTime; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.view.RedirectView; + +@Controller +@RequestMapping("/sessionattributes") +@SessionAttributes("todos") +public class TodoControllerWithSessionAttributes { + + @GetMapping("/form") + public String showForm( + Model model, + @ModelAttribute("todos") TodoList todos) { + if (!todos.isEmpty()) { + model.addAttribute("todo", todos.peekLast()); + } else { + model.addAttribute("todo", new TodoItem()); + } + return "sessionattributesform"; + } + + @PostMapping("/form") + public RedirectView create( + @ModelAttribute TodoItem todo, + @ModelAttribute("todos") TodoList todos, + RedirectAttributes attributes) { + todo.setCreateDate(LocalDateTime.now()); + todos.add(todo); + attributes.addFlashAttribute("todos", todos); + return new RedirectView("/sessionattributes/todos.html"); + } + + @GetMapping("/todos.html") + public String list( + Model model, + @ModelAttribute("todos") TodoList todos) { + model.addAttribute("todos", todos); + return "sessionattributestodos"; + } + + @ModelAttribute("todos") + public TodoList todos() { + return new TodoList(); + } +} diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoItem.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoItem.java new file mode 100644 index 0000000000..b8b24bc04d --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoItem.java @@ -0,0 +1,39 @@ +package com.baeldung.sessionattrs; + +import java.time.LocalDateTime; + +public class TodoItem { + + private String description; + private LocalDateTime createDate; + + public TodoItem(String description, LocalDateTime createDate) { + this.description = description; + this.createDate = createDate; + } + + public TodoItem() { + // default no arg constructor + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDateTime getCreateDate() { + return createDate; + } + + public void setCreateDate(LocalDateTime createDate) { + this.createDate = createDate; + } + + @Override + public String toString() { + return "TodoItem [description=" + description + ", createDate=" + createDate + "]"; + } +} diff --git a/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoList.java b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoList.java new file mode 100644 index 0000000000..02c05f4282 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/java/com/baeldung/sessionattrs/TodoList.java @@ -0,0 +1,8 @@ +package com.baeldung.sessionattrs; + +import java.util.ArrayDeque; + +@SuppressWarnings("serial") +public class TodoList extends ArrayDeque{ + +} diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/application.properties b/spring-mvc-forms-thymeleaf/src/main/resources/application.properties new file mode 100644 index 0000000000..ccec014c2b --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=8081 + +logging.level.root=INFO \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/index.html b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/index.html new file mode 100644 index 0000000000..d0c4c7cd3a --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/index.html @@ -0,0 +1,27 @@ + + + + Session Attributes in Spring MVC + + + + + + + +
+

+

Session Scope in Spring MVC - Example

+

+
+ + + \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxyform.html b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxyform.html new file mode 100644 index 0000000000..ebb3e16525 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxyform.html @@ -0,0 +1,27 @@ + + + + Session Attributes in Spring MVC + + + + + + + +
+

+

Scoped Proxy Example

+

+
+
+
Enter a TODO
+
+
+ + +
+
+
+ + \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxytodos.html b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxytodos.html new file mode 100644 index 0000000000..f7916b0f8a --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/scopedproxytodos.html @@ -0,0 +1,48 @@ + + + + Session Attributes in Spring MVC + + + + + + + +
+

+

Scoped Proxy Example

+

+
+
+
+
+ Add New +
+
+
+
+
+
TODO List
+ + + + + + + + + + + +
DescriptionCreate Date
DescriptionCreate Date
+
+
+
+
+ + \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributesform.html b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributesform.html new file mode 100644 index 0000000000..73233c12f3 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributesform.html @@ -0,0 +1,27 @@ + + + + Session Attributes in Spring MVC + + + + + + + +
+

+

Session Attributes Example

+

+
+
+
Enter a TODO
+
+
+ + +
+
+
+ + \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributestodos.html b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributestodos.html new file mode 100644 index 0000000000..753ee133e9 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/main/resources/templates/sessionattrs/sessionattributestodos.html @@ -0,0 +1,48 @@ + + + + Session Attributes in Spring MVC + + + + + + + +
+

+

Session Attributes Example

+

+
+
+
+
+ Add New +
+
+
+
+
+
TODO List
+ + + + + + + + + + + +
DescriptionCreate Date
DescriptionCreate Date
+
+
+
+
+ + \ No newline at end of file diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java new file mode 100644 index 0000000000..2fc27841da --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/SessionAttrsApplicationTest.java @@ -0,0 +1,16 @@ +package com.baeldung.sessionattrs; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SessionAttrsApplicationTest { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TestConfig.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TestConfig.java new file mode 100644 index 0000000000..cf38463c0f --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TestConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.sessionattrs; + +import org.springframework.beans.factory.config.CustomScopeConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.SimpleThreadScope; + +@Configuration +public class TestConfig { + + @Bean + public CustomScopeConfigurer customScopeConfigurer() { + CustomScopeConfigurer configurer = new CustomScopeConfigurer(); + configurer.addScope("session", new SimpleThreadScope()); + return configurer; + } +} diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java new file mode 100644 index 0000000000..49be948a2a --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithScopedProxyTest.java @@ -0,0 +1,68 @@ +package com.baeldung.sessionattrs; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.util.StringUtils; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +@Import(TestConfig.class) +public class TodoControllerWithScopedProxyTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext wac; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) + .build(); + } + + @Test + public void whenFirstRequest_thenContainsUnintializedTodo() throws Exception { + MvcResult result = mockMvc.perform(get("/scopedproxy/form")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("todo")) + .andReturn(); + + TodoItem item = (TodoItem) result.getModelAndView().getModel().get("todo"); + assertTrue(StringUtils.isEmpty(item.getDescription())); + } + + @Test + public void whenSubmit_thenSubsequentFormRequestContainsMostRecentTodo() throws Exception { + mockMvc.perform(post("/scopedproxy/form") + .param("description", "newtodo")) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MvcResult result = mockMvc.perform(get("/scopedproxy/form")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("todo")) + .andReturn(); + TodoItem item = (TodoItem) result.getModelAndView().getModel().get("todo"); + assertEquals("newtodo", item.getDescription()); + } + +} diff --git a/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java new file mode 100644 index 0000000000..e41de880d3 --- /dev/null +++ b/spring-mvc-forms-thymeleaf/src/test/java/com/baeldung/sessionattrs/TodoControllerWithSessionAttributesTest.java @@ -0,0 +1,68 @@ +package com.baeldung.sessionattrs; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.util.StringUtils; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.FlashMap; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class TodoControllerWithSessionAttributesTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext wac; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) + .build(); + } + + @Test + public void whenFirstRequest_thenContainsUnintializedTodo() throws Exception { + MvcResult result = mockMvc.perform(get("/sessionattributes/form")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("todo")) + .andReturn(); + + TodoItem item = (TodoItem) result.getModelAndView().getModel().get("todo"); + assertTrue(StringUtils.isEmpty(item.getDescription())); + } + + @Test + public void whenSubmit_thenSubsequentFormRequestContainsMostRecentTodo() throws Exception { + FlashMap flashMap = mockMvc.perform(post("/sessionattributes/form") + .param("description", "newtodo")) + .andExpect(status().is3xxRedirection()) + .andReturn().getFlashMap(); + + MvcResult result = mockMvc.perform(get("/sessionattributes/form") + .sessionAttrs(flashMap)) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("todo")) + .andReturn(); + TodoItem item = (TodoItem) result.getModelAndView().getModel().get("todo"); + assertEquals("newtodo", item.getDescription()); + } + +} diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index b939f0496d..9d90ba2dbf 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -297,7 +297,7 @@ 4.3.4.RELEASE 4.2.0.RELEASE 2.1.5.RELEASE - 2.8.5 + 2.9.4 5.2.5.Final diff --git a/spring-mvc-kotlin/pom.xml b/spring-mvc-kotlin/pom.xml index 2d1dac5e29..8f9c58854d 100644 --- a/spring-mvc-kotlin/pom.xml +++ b/spring-mvc-kotlin/pom.xml @@ -17,38 +17,64 @@ war + + UTF-8 + 5.2.13.Final + 1.2.30 + 4.3.10.RELEASE + 3.0.7.RELEASE + 1.4.196 + + org.jetbrains.kotlin - kotlin-stdlib-jre8 - 1.1.4 + kotlin-stdlib-jdk8 + ${kotlin.version} org.springframework spring-web - 4.3.10.RELEASE + ${spring.version} org.springframework spring-webmvc - 4.3.10.RELEASE + ${spring.version} org.thymeleaf thymeleaf - 3.0.7.RELEASE + ${thymeleaf.version} org.thymeleaf thymeleaf-spring4 - 3.0.7.RELEASE + ${thymeleaf.version} + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-testing + ${hibernate.version} + test + + + com.h2database + h2 + ${h2.version} + test org.springframework spring-test - 4.3.10.RELEASE + ${spring.version} test @@ -60,10 +86,11 @@ kotlin-maven-plugin org.jetbrains.kotlin - 1.1.4 + ${kotlin.version} spring + jpa 1.8 @@ -87,7 +114,12 @@ org.jetbrains.kotlin kotlin-maven-allopen - 1.1.4-3 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-noarg + ${kotlin.version}
diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/Person.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/Person.kt new file mode 100644 index 0000000000..076dcdac46 --- /dev/null +++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/Person.kt @@ -0,0 +1,24 @@ +package com.baeldung.jpa + +import javax.persistence.CascadeType +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.OneToMany +import javax.persistence.Table + +@Entity +@Table(name = "person") +data class Person( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + val id: Int, + @Column(nullable = false) + val name: String, + @Column(nullable = true) + val email: String?, + @Column(nullable = true) + @OneToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL]) val phoneNumbers: List?) \ No newline at end of file diff --git a/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/PhoneNumber.kt b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/PhoneNumber.kt new file mode 100644 index 0000000000..25894275f6 --- /dev/null +++ b/spring-mvc-kotlin/src/main/kotlin/com/baeldung/kotlin/jpa/PhoneNumber.kt @@ -0,0 +1,17 @@ +package com.baeldung.jpa + +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.GeneratedValue +import javax.persistence.GenerationType +import javax.persistence.Id +import javax.persistence.Table + +@Entity +@Table(name = "phone_number") +data class PhoneNumber( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + val id: Int, + @Column(nullable = false) + val number: String) \ No newline at end of file diff --git a/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/jpa/HibernateKotlinIntegrationTest.kt b/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/jpa/HibernateKotlinIntegrationTest.kt new file mode 100644 index 0000000000..94559812fa --- /dev/null +++ b/spring-mvc-kotlin/src/test/kotlin/com/baeldung/kotlin/jpa/HibernateKotlinIntegrationTest.kt @@ -0,0 +1,54 @@ +package com.baeldung.kotlin.jpa + +import com.baeldung.jpa.Person +import com.baeldung.jpa.PhoneNumber +import org.hibernate.cfg.Configuration +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase +import org.hibernate.testing.transaction.TransactionUtil.doInHibernate +import org.junit.Assert.assertTrue +import org.junit.Test +import java.io.IOException +import java.util.* + + +class HibernateKotlinIntegrationTest : BaseCoreFunctionalTestCase() { + + private val properties: Properties + @Throws(IOException::class) + get() { + val properties = Properties() + properties.load(javaClass.classLoader.getResourceAsStream("hibernate.properties")) + return properties + } + + override fun getAnnotatedClasses(): Array> { + return arrayOf(Person::class.java, PhoneNumber::class.java) + } + + override fun configure(configuration: Configuration) { + super.configure(configuration) + configuration.properties = properties + } + + @Test + fun givenPerson_whenSaved_thenFound() { + doInHibernate(({ this.sessionFactory() }), { session -> + val personToSave = Person(0, "John", "jhon@test.com", Arrays.asList(PhoneNumber(0, "202-555-0171"), PhoneNumber(0, "202-555-0102"))) + session.persist(personToSave) + val personFound = session.find(Person::class.java, personToSave.id) + session.refresh(personFound) + assertTrue(personToSave == personFound) + }) + } + + @Test + fun givenPersonWithNullFields_whenSaved_thenFound() { + doInHibernate(({ this.sessionFactory() }), { session -> + val personToSave = Person(0, "John", null, null) + session.persist(personToSave) + val personFound = session.find(Person::class.java, personToSave.id) + session.refresh(personFound) + assertTrue(personToSave == personFound) + }) + } +} \ No newline at end of file diff --git a/hibernate5/src/test/resources/hibernate-multitenancy.properties b/spring-mvc-kotlin/src/test/resources/hibernate.properties similarity index 88% rename from hibernate5/src/test/resources/hibernate-multitenancy.properties rename to spring-mvc-kotlin/src/test/resources/hibernate.properties index 298ecd05d3..7b8764637b 100644 --- a/hibernate5/src/test/resources/hibernate-multitenancy.properties +++ b/spring-mvc-kotlin/src/test/resources/hibernate.properties @@ -6,4 +6,4 @@ jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true -hibernate.multiTenancy=DATABASE +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md index 197a22cbac..69a9027280 100644 --- a/spring-mvc-simple/README.md +++ b/spring-mvc-simple/README.md @@ -2,3 +2,4 @@ - [HandlerAdapters in Spring MVC](http://www.baeldung.com/spring-mvc-handler-adapters) - [Template Engines for Spring](http://www.baeldung.com/spring-template-engines) +- [Spring 5 and Servlet 4 – The PushBuilder](http://www.baeldung.com/spring-5-push) diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml index 8a51c04113..a2ba2188d6 100644 --- a/spring-mvc-simple/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -8,83 +8,72 @@ Spring MVC simple Maven Webapp http://maven.apache.org - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - 4.3.10.RELEASE - 3.1.0 + 1.8 + 1.8 + UTF-8 + 5.0.2.RELEASE + 3.2.0 + 3.7.0 + 2.20 1.2 - 2.3.1 - 3.1.0 + 2.3.2-b02 + 4.0.0 5.4.1.Final enter-location-of-server 1.3.2 1.8 3.0.7.RELEASE 2.4.12 - 2.3.23 + 2.3.27-incubating 1.2.5 + 5.0.2 + 5.0.2 + 1.0.2 + 1.9.0 + 2.9.4 + 1.4.9 + 5.1.0 + 20180130 + + org.springframework + spring-oxm + 5.0.2.RELEASE + javax.servlet javax.servlet-api - 3.1.0 - - - org.springframework - spring-webmvc - ${springframework.version} - - - org.springframework - spring-context - ${springframework.version} - - - org.springframework - spring-core - ${springframework.version} - - - commons-logging - commons-logging - - + ${javax.servlet-api.version} javax.servlet.jsp javax.servlet.jsp-api ${javax.servlet.jsp-api.version} - javax.servlet jstl ${jstl.version} - org.hibernate hibernate-validator ${hibernate-validator.version} - - org.springframework - spring-webmvc - ${springframework.version} - commons-fileupload commons-fileupload ${fileupload.version} - + + org.springframework + spring-webmvc + ${springframework.version} + + org.thymeleaf @@ -115,7 +104,7 @@ groovy-templates ${groovy.version} - + de.neuland-bfi @@ -123,6 +112,39 @@ ${jade.version} + + + org.springframework + spring-test + ${springframework.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + com.rometools + rome + ${rome.version} + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + com.github.scribejava + scribejava-apis + ${scribejava.version} + + + org.json + json + ${json.version} + @@ -141,10 +163,18 @@ org.apache.maven.plugins maven-compiler-plugin - - 1.8 - 1.8 - + ${maven.compiler.version} + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java index b62ccae465..c4c6791f9a 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/ApplicationConfiguration.java @@ -1,19 +1,30 @@ package com.baeldung.spring.configuration; +import com.baeldung.spring.controller.rss.ArticleRssFeedViewResolver; +import com.baeldung.spring.controller.rss.JsonChannelHttpMessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.feed.RssChannelHttpMessageConverter; +import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.ContentNegotiatingViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; +import java.util.ArrayList; +import java.util.List; + @Configuration @EnableWebMvc @ComponentScan(basePackages = { "com.baeldung.springmvcforms", "com.baeldung.spring.controller", "com.baeldung.spring.validator" }) -class ApplicationConfiguration extends WebMvcConfigurerAdapter { +public class ApplicationConfiguration extends WebMvcConfigurerAdapter { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { @@ -21,11 +32,19 @@ class ApplicationConfiguration extends WebMvcConfigurerAdapter { } @Bean - public InternalResourceViewResolver jspViewResolver() { - InternalResourceViewResolver bean = new InternalResourceViewResolver(); - bean.setPrefix("/WEB-INF/views/"); - bean.setSuffix(".jsp"); - return bean; + public ContentNegotiatingViewResolver viewResolver(ContentNegotiationManager cnManager) { + ContentNegotiatingViewResolver cnvResolver = new ContentNegotiatingViewResolver(); + cnvResolver.setContentNegotiationManager(cnManager); + List resolvers = new ArrayList<>(); + + InternalResourceViewResolver bean = new InternalResourceViewResolver("/WEB-INF/views/",".jsp"); + ArticleRssFeedViewResolver articleRssFeedViewResolver = new ArticleRssFeedViewResolver(); + + resolvers.add(bean); + resolvers.add(articleRssFeedViewResolver); + + cnvResolver.setViewResolvers(resolvers); + return cnvResolver; } @Bean @@ -34,4 +53,13 @@ class ApplicationConfiguration extends WebMvcConfigurerAdapter { multipartResolver.setMaxUploadSize(5242880); return multipartResolver; } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(new StringHttpMessageConverter()); + converters.add(new RssChannelHttpMessageConverter()); + converters.add(new JsonChannelHttpMessageConverter()); + + super.configureMessageConverters(converters); + } } diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/JadeTemplateConfiguration.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/JadeTemplateConfiguration.java index 10345bac58..4c95e5a0bd 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/JadeTemplateConfiguration.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/JadeTemplateConfiguration.java @@ -16,24 +16,24 @@ import de.neuland.jade4j.spring.view.JadeViewResolver; public class JadeTemplateConfiguration { @Bean public SpringTemplateLoader templateLoader() { - SpringTemplateLoader templateLoader = new SpringTemplateLoader(); - templateLoader.setBasePath("/WEB-INF/views/"); - templateLoader.setSuffix(".jade"); - return templateLoader; + SpringTemplateLoader templateLoader = new SpringTemplateLoader(); + templateLoader.setBasePath("/WEB-INF/views/"); + templateLoader.setSuffix(".jade"); + return templateLoader; } @Bean public JadeConfiguration jadeConfiguration() { - JadeConfiguration configuration = new JadeConfiguration(); - configuration.setCaching(false); - configuration.setTemplateLoader(templateLoader()); - return configuration; + JadeConfiguration configuration = new JadeConfiguration(); + configuration.setCaching(false); + configuration.setTemplateLoader(templateLoader()); + return configuration; } @Bean public ViewResolver viewResolver() { - JadeViewResolver viewResolver = new JadeViewResolver(); - viewResolver.setConfiguration(jadeConfiguration()); - return viewResolver; + JadeViewResolver viewResolver = new JadeViewResolver(); + viewResolver.setConfiguration(jadeConfiguration()); + return viewResolver; } } diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java new file mode 100644 index 0000000000..3072501cfa --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/PushConfiguration.java @@ -0,0 +1,30 @@ +package com.baeldung.spring.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = "com.baeldung.spring.controller.push") +public class PushConfiguration implements WebMvcConfigurer { + + @Bean + public InternalResourceViewResolver jspViewResolver() { + InternalResourceViewResolver bean = new InternalResourceViewResolver(); + bean.setPrefix("/WEB-INF/views/"); + bean.setSuffix(".jsp"); + return bean; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**") + .addResourceLocations("/resources/"); + } + +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/WebInitializer.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/WebInitializer.java index d57d2c621a..09030a8347 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/WebInitializer.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/configuration/WebInitializer.java @@ -11,42 +11,23 @@ import javax.servlet.ServletRegistration; public class WebInitializer implements WebApplicationInitializer { - public void onStartup(ServletContext container) throws ServletException { + public void onStartup(ServletContext container) throws ServletException { - AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); - ctx.register(ApplicationConfiguration.class); - //ctx.register(ThymeleafConfiguration.class); - //ctx.register(FreemarkerConfiguration.class); - //ctx.register(GroovyConfiguration.class); - //ctx.register(JadeTemplateConfiguration.class); - ctx.setServletContext(container); + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); + ctx.register(ApplicationConfiguration.class); + // ctx.register(ThymeleafConfiguration.class); + // ctx.register(FreemarkerConfiguration.class); + // ctx.register(GroovyConfiguration.class); + // ctx.register(JadeTemplateConfiguration.class); + // ctx.register(PushConfiguration.class); + // ctx.setServletContext(container); - // Manage the lifecycle of the root application context - container.addListener(new ContextLoaderListener(ctx)); + // Manage the lifecycle of the root application context + container.addListener(new ContextLoaderListener(ctx)); - ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); + ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); - servlet.setLoadOnStartup(1); - servlet.addMapping("/"); - - } -// @Override -// public void onStartup(ServletContext container) { -// // Create the 'root' Spring application context -// AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); -// rootContext.register(ServiceConfig.class, JPAConfig.class, SecurityConfig.class); -// -// // Manage the lifecycle of the root application context -// container.addListener(new ContextLoaderListener(rootContext)); -// -// // Create the dispatcher servlet's Spring application context -// AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext(); -// dispatcherServlet.register(MvcConfig.class); -// -// // Register and map the dispatcher servlet -// ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet)); -// dispatcher.setLoadOnStartup(1); -// dispatcher.addMapping("/"); -// -// } + servlet.setLoadOnStartup(1); + servlet.addMapping("/"); + } } diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java index 164830cd6a..89f5b2501b 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/AnnotationMethodHandlerAdapterExample.java @@ -6,10 +6,10 @@ import org.springframework.web.servlet.ModelAndView; @Controller public class AnnotationMethodHandlerAdapterExample { - @RequestMapping("/annotedName") - public ModelAndView getEmployeeName() { - ModelAndView model = new ModelAndView("Greeting"); - model.addObject("message", "Dinesh"); - return model; - } + @RequestMapping("/annotedName") + public ModelAndView getEmployeeName() { + ModelAndView model = new ModelAndView("Greeting"); + model.addObject("message", "Dinesh"); + return model; + } } \ No newline at end of file diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/FileUploadController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/FileUploadController.java index 47af2ab50d..2ca9e2b135 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/FileUploadController.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/FileUploadController.java @@ -23,13 +23,13 @@ public class FileUploadController implements HandlerExceptionResolver { } @RequestMapping(value = "/uploadFile", method = RequestMethod.POST) - public ModelAndView uploadFile(MultipartFile file) throws IOException{ + public ModelAndView uploadFile(MultipartFile file) throws IOException { ModelAndView modelAndView = new ModelAndView("file"); - - InputStream in = file.getInputStream(); + + InputStream in = file.getInputStream(); File currDir = new File("."); String path = currDir.getAbsolutePath(); - FileOutputStream f = new FileOutputStream(path.substring(0, path.length()-1)+ file.getOriginalFilename()); + FileOutputStream f = new FileOutputStream(path.substring(0, path.length() - 1) + file.getOriginalFilename()); int ch = 0; while ((ch = in.read()) != -1) { f.write(ch); @@ -37,15 +37,17 @@ public class FileUploadController implements HandlerExceptionResolver { f.flush(); f.close(); - modelAndView.getModel().put("message", "File uploaded successfully!"); + modelAndView.getModel() + .put("message", "File uploaded successfully!"); return modelAndView; } - + @Override - public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exc) { + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exc) { ModelAndView modelAndView = new ModelAndView("file"); if (exc instanceof MaxUploadSizeExceededException) { - modelAndView.getModel().put("message", "File size exceeds limit!"); + modelAndView.getModel() + .put("message", "File size exceeds limit!"); } return modelAndView; } diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java index 76ac3e2806..754bea79f1 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMappingHandlerAdapterExample.java @@ -6,10 +6,10 @@ import org.springframework.web.servlet.ModelAndView; @Controller public class RequestMappingHandlerAdapterExample { - @RequestMapping("/requestName") - public ModelAndView getEmployeeName() { - ModelAndView model = new ModelAndView("Greeting"); - model.addObject("message", "Madhwal"); - return model; - } + @RequestMapping("/requestName") + public ModelAndView getEmployeeName() { + ModelAndView model = new ModelAndView("Greeting"); + model.addObject("message", "Madhwal"); + return model; + } } \ No newline at end of file diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java index bac091ffeb..17c4ab689e 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/SimpleControllerHandlerAdapterExample.java @@ -6,13 +6,11 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; -public class SimpleControllerHandlerAdapterExample extends - AbstractController { - @Override - protected ModelAndView handleRequestInternal(HttpServletRequest request, - HttpServletResponse response) throws Exception { - ModelAndView model = new ModelAndView("Greeting"); - model.addObject("message", "Dinesh Madhwal"); - return model; - } +public class SimpleControllerHandlerAdapterExample extends AbstractController { + @Override + protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + ModelAndView model = new ModelAndView("Greeting"); + model.addObject("message", "Dinesh Madhwal"); + return model; + } } \ No newline at end of file diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java new file mode 100644 index 0000000000..b557c65c93 --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/push/PushController.java @@ -0,0 +1,25 @@ +package com.baeldung.spring.controller.push; + +import javax.servlet.http.PushBuilder; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class PushController { + + @GetMapping(path = "/demoWithPush") + public String demoWithPush(PushBuilder pushBuilder) { + if (null != pushBuilder) { + pushBuilder.path("resources/logo.png") + .addHeader("Content-Type", "image/png") + .push(); + } + return "demo"; + } + + @GetMapping(path = "/demoWithoutPush") + public String demoWithoutPush() { + return "demo"; + } +} \ No newline at end of file diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/Article.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/Article.java new file mode 100644 index 0000000000..e6e83f95ff --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/Article.java @@ -0,0 +1,63 @@ +package com.baeldung.spring.controller.rss; + +import java.io.Serializable; +import java.util.Date; + +public class Article implements Serializable { + private String link; + private String title; + private String description; + private Date publishedDate; + private String author; + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Date getPublishedDate() { + return publishedDate; + } + + public void setPublishedDate(Date publishedDate) { + this.publishedDate = publishedDate; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + @Override + public String toString() { + return "Article{" + + "link='" + link + '\'' + + ", title='" + title + '\'' + + ", description='" + description + '\'' + + ", publishedDate=" + publishedDate + + ", author='" + author + '\'' + + '}'; + } +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleFeedView.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleFeedView.java new file mode 100644 index 0000000000..cfbd33cd57 --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleFeedView.java @@ -0,0 +1,54 @@ +package com.baeldung.spring.controller.rss; + +import com.rometools.rome.feed.rss.Channel; +import com.rometools.rome.feed.rss.Description; +import com.rometools.rome.feed.rss.Item; +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.view.feed.AbstractRssFeedView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service("articleFeedView") +public class ArticleFeedView extends AbstractRssFeedView { + + protected Channel newFeed() { + Channel channel = new Channel("rss_2.0"); + channel.setLink("http://localhost:8080/spring-mvc-simple/rss"); + channel.setTitle("Article Feed"); + channel.setDescription("Article Feed Description"); + channel.setPubDate(new Date()); + return channel; + } + + @Override + protected List buildFeedItems(Map map, HttpServletRequest httpStRequest, HttpServletResponse httpStResponse) throws Exception { + List list = new ArrayList(); + + Item item1 = new Item(); + item1.setLink("http://www.baeldung.com/netty-exception-handling"); + item1.setTitle("Exceptions in Netty"); + Description description1 = new Description(); + description1.setValue("In this quick article, we’ll be looking at exception handling in Netty."); + item1.setDescription(description1); + item1.setPubDate(new Date()); + item1.setAuthor("Carlos"); + + Item item2 = new Item(); + item2.setLink("http://www.baeldung.com/cockroachdb-java"); + item2.setTitle("Guide to CockroachDB in Java"); + Description description2 = new Description(); + description2.setValue("This tutorial is an introductory guide to using CockroachDB with Java."); + item2.setDescription(description2); + item2.setPubDate(new Date()); + item2.setAuthor("Baeldung"); + + list.add(item1); + list.add(item2); + return list; + } +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssController.java new file mode 100644 index 0000000000..23a6b8700e --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssController.java @@ -0,0 +1,71 @@ +package com.baeldung.spring.controller.rss; + +import com.rometools.rome.feed.rss.Channel; +import com.rometools.rome.feed.rss.Description; +import com.rometools.rome.feed.rss.Item; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Controller +public class ArticleRssController { + + @GetMapping(value = "/rss1") + public String articleMvcFeed() { + return "articleFeedView"; + } + + @GetMapping(value = "/rss2", produces = {"application/rss+xml", "application/rss+json"}) + @ResponseBody + public Channel articleHttpFeed() { + List
items = new ArrayList<>(); + Article item1 = new Article(); + item1.setLink("http://www.baeldung.com/netty-exception-handling"); + item1.setTitle("Exceptions in Netty"); + item1.setDescription("In this quick article, we’ll be looking at exception handling in Netty."); + item1.setPublishedDate(new Date()); + item1.setAuthor("Carlos"); + + Article item2 = new Article(); + item2.setLink("http://www.baeldung.com/cockroachdb-java"); + item2.setTitle("Guide to CockroachDB in Java"); + item2.setDescription("This tutorial is an introductory guide to using CockroachDB with Java."); + item2.setPublishedDate(new Date()); + item2.setAuthor("Baeldung"); + + items.add(item1); + items.add(item2); + Channel channelData = buildChannel(items); + + return channelData; + } + + private Channel buildChannel(List
articles){ + Channel channel = new Channel("rss_2.0"); + channel.setLink("http://localhost:8080/spring-mvc-simple/rss"); + channel.setTitle("Article Feed"); + channel.setDescription("Article Feed Description"); + channel.setPubDate(new Date()); + + List items = new ArrayList<>(); + for (Article article : articles) { + Item item = new Item(); + item.setLink(article.getLink()); + item.setTitle(article.getTitle()); + Description description1 = new Description(); + description1.setValue(article.getDescription()); + item.setDescription(description1); + item.setPubDate(article.getPublishedDate()); + item.setAuthor(article.getAuthor()); + items.add(item); + } + + channel.setItems(items); + return channel; + } + +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssFeedViewResolver.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssFeedViewResolver.java new file mode 100644 index 0000000000..6be06c4812 --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/ArticleRssFeedViewResolver.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.controller.rss; + +import org.springframework.web.servlet.View; +import org.springframework.web.servlet.ViewResolver; + +import java.util.Locale; + +public class ArticleRssFeedViewResolver implements ViewResolver { + + @Override + public View resolveViewName(String s, Locale locale) throws Exception { + ArticleFeedView articleFeedView = new ArticleFeedView(); + return articleFeedView; + } +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/JsonChannelHttpMessageConverter.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/JsonChannelHttpMessageConverter.java new file mode 100644 index 0000000000..a32cbbdb7f --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/rss/JsonChannelHttpMessageConverter.java @@ -0,0 +1,47 @@ +package com.baeldung.spring.controller.rss; + +import com.rometools.rome.feed.rss.Channel; +import com.rometools.rome.io.FeedException; +import com.rometools.rome.io.WireFeedOutput; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.XML; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.AbstractHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; + +import java.io.IOException; + +public class JsonChannelHttpMessageConverter extends AbstractHttpMessageConverter { + public JsonChannelHttpMessageConverter(){ + super(new MediaType("application", "rss+json")); + } + + @Override + protected boolean supports(Class aClass) { + return Channel.class.isAssignableFrom(aClass); + } + + @Override + protected Channel readInternal(Class aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException { + return null; + } + + @Override + protected void writeInternal(Channel wireFeed, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { + WireFeedOutput feedOutput = new WireFeedOutput(); + + try { + String xmlStr = feedOutput.outputString(wireFeed, true); + JSONObject xmlJSONObj = XML.toJSONObject(xmlStr); + String jsonPrettyPrintString = xmlJSONObj.toString(4); + + outputMessage.getBody().write(jsonPrettyPrintString.getBytes()); + } catch (JSONException | FeedException e) { + e.printStackTrace(); + } + } +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/GithubController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/GithubController.java new file mode 100644 index 0000000000..61b91cbd4d --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/GithubController.java @@ -0,0 +1,58 @@ +package com.baeldung.spring.controller.scribe; + +import com.github.scribejava.apis.GitHubApi; +import com.github.scribejava.core.builder.ServiceBuilder; +import com.github.scribejava.core.model.*; +import com.github.scribejava.core.oauth.OAuth20Service; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.view.RedirectView; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Random; +import java.util.concurrent.ExecutionException; + +@Controller +@RequestMapping("github") +public class GithubController { + private OAuth20Service createService(String state) { + return new ServiceBuilder("e1f8d4f1a5c71467a159") + .apiSecret("4851597541a8f33a4f1bf1c70f3cedcfefbeb13b") + .state(state) + .callback("http://localhost:8080/spring-mvc-simple/github/callback") + .build(GitHubApi.instance()); + } + + @GetMapping(value = "/authorization") + public RedirectView authorization(HttpServletRequest servletReq) throws InterruptedException, ExecutionException, IOException { + String state = String.valueOf(new Random().nextInt(999_999)); + OAuth20Service githubService = createService(state); + servletReq.getSession().setAttribute("state", state); + + String authorizationUrl = githubService.getAuthorizationUrl(); + RedirectView redirectView = new RedirectView(); + redirectView.setUrl(authorizationUrl); + return redirectView; + } + + @GetMapping(value = "/callback", produces = "text/plain") + @ResponseBody + public String callback(HttpServletRequest servletReq, @RequestParam("code") String code, @RequestParam("state") String state) throws InterruptedException, ExecutionException, IOException { + String initialState = (String) servletReq.getSession().getAttribute("state"); + if(initialState.equals(state)) { + OAuth20Service githubService = createService(initialState); + OAuth2AccessToken accessToken = githubService.getAccessToken(code); + + OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.github.com/user"); + githubService.signRequest(accessToken, request); + Response response = githubService.execute(request); + + return response.getBody(); + } + return "Error"; + } +} diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/TwitterController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/TwitterController.java new file mode 100644 index 0000000000..af47797ac5 --- /dev/null +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/scribe/TwitterController.java @@ -0,0 +1,55 @@ +package com.baeldung.spring.controller.scribe; + +import com.github.scribejava.apis.TwitterApi; +import com.github.scribejava.core.builder.ServiceBuilder; +import com.github.scribejava.core.model.*; +import com.github.scribejava.core.oauth.OAuth10aService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.view.RedirectView; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +@Controller +@RequestMapping("twitter") +public class TwitterController { + + private OAuth10aService createService() { + return new ServiceBuilder("PSRszoHhRDVhyo2RIkThEbWko") + .apiSecret("prpJbz03DcGRN46sb4ucdSYtVxG8unUKhcnu3an5ItXbEOuenL") + .callback("http://localhost:8080/spring-mvc-simple/twitter/callback") + .build(TwitterApi.instance()); + } + + @GetMapping(value = "/authorization") + public RedirectView authorization(HttpServletRequest servletReq) throws InterruptedException, ExecutionException, IOException { + OAuth10aService twitterService = createService(); + + OAuth1RequestToken requestToken = twitterService.getRequestToken(); + String authorizationUrl = twitterService.getAuthorizationUrl(requestToken); + servletReq.getSession().setAttribute("requestToken", requestToken); + + RedirectView redirectView = new RedirectView(); + redirectView.setUrl(authorizationUrl); + return redirectView; + } + + @GetMapping(value = "/callback", produces = "text/plain") + @ResponseBody + public String callback(HttpServletRequest servletReq, @RequestParam("oauth_verifier") String oauthV) throws InterruptedException, ExecutionException, IOException { + OAuth10aService twitterService = createService(); + OAuth1RequestToken requestToken = (OAuth1RequestToken) servletReq.getSession().getAttribute("requestToken"); + OAuth1AccessToken accessToken = twitterService.getAccessToken(requestToken, oauthV); + + OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.twitter.com/1.1/account/verify_credentials.json"); + twitterService.signRequest(accessToken, request); + Response response = twitterService.execute(request); + + return response.getBody(); + } +} diff --git a/spring-mvc-simple/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml deleted file mode 100644 index 430b849012..0000000000 --- a/spring-mvc-simple/src/main/resources/spring-servlet_AnnotationMethodHandlerAdapter.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/spring-mvc-simple/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml deleted file mode 100644 index d3783c2e67..0000000000 --- a/spring-mvc-simple/src/main/resources/spring-servlet_RequestMappingHandlerAdapter.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/spring-mvc-simple/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml b/spring-mvc-simple/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml deleted file mode 100644 index 1d6e5628df..0000000000 --- a/spring-mvc-simple/src/main/resources/spring-servlet_SimpleControllerHandlerAdapter.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/spring-mvc-simple/src/main/webapp/WEB-INF/views/demo.jsp b/spring-mvc-simple/src/main/webapp/WEB-INF/views/demo.jsp new file mode 100644 index 0000000000..d5579debf7 --- /dev/null +++ b/spring-mvc-simple/src/main/webapp/WEB-INF/views/demo.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + +PushBuilder demo + + + PushBuilder demo +
+ " alt="Logo" + height="126" width="411"> +
+ + + \ No newline at end of file diff --git a/spring-mvc-simple/src/main/webapp/WEB-INF/views/registration-jade.jade b/spring-mvc-simple/src/main/webapp/WEB-INF/views/registration-jade.jade index 44b6293ff0..f271ac6852 100644 --- a/spring-mvc-simple/src/main/webapp/WEB-INF/views/registration-jade.jade +++ b/spring-mvc-simple/src/main/webapp/WEB-INF/views/registration-jade.jade @@ -4,7 +4,7 @@ html title User Registration body form(action="register" method="post" ) - label(for="email") Emailaaaaaaaa: + label(for="email") Email: input(type="text" name="email") label(for="password") Password: input(type="password" name="password") diff --git a/spring-mvc-simple/src/main/webapp/resources/logo.png b/spring-mvc-simple/src/main/webapp/resources/logo.png new file mode 100644 index 0000000000..edb83efbe3 Binary files /dev/null and b/spring-mvc-simple/src/main/webapp/resources/logo.png differ diff --git a/spring-mvc-simple/src/test/java/com/baeldung/controller/push/PushControllerIntegrationTest.java b/spring-mvc-simple/src/test/java/com/baeldung/controller/push/PushControllerIntegrationTest.java new file mode 100644 index 0000000000..a03d02895f --- /dev/null +++ b/spring-mvc-simple/src/test/java/com/baeldung/controller/push/PushControllerIntegrationTest.java @@ -0,0 +1,39 @@ +package com.baeldung.controller.push; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.spring.configuration.PushConfiguration; + +@SpringJUnitWebConfig(PushConfiguration.class) +public class PushControllerIntegrationTest { + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext) + .build(); + } + + @Test + public void whenDemoWithPushGETisPerformed_thenRetrievedStatusOk() throws Exception { + mockMvc.perform(get("/demoWithPush")) + .andExpect(status().isOk()); + } + + @Test + public void whenDemoWithoutPushGETisPerformed_thenRetrievedStatusOk() throws Exception { + mockMvc.perform(get("/demoWithoutPush")) + .andExpect(status().isOk()); + } +} \ No newline at end of file diff --git a/spring-mvc-simple/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java b/spring-mvc-simple/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java new file mode 100644 index 0000000000..fe7aeeb570 --- /dev/null +++ b/spring-mvc-simple/src/test/java/com/baeldung/controller/rss/ArticleRssIntegrationTest.java @@ -0,0 +1,45 @@ +package com.baeldung.controller.rss; + +import com.baeldung.spring.configuration.ApplicationConfiguration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringJUnitWebConfig(ApplicationConfiguration.class) +public class ArticleRssIntegrationTest { + public static final String APPLICATION_RSS_XML = "application/rss+xml"; + public static final String APPLICATION_RSS_JSON = "application/rss+json"; + public static final String APPLICATION_RSS_XML_CHARSET_UTF_8 = "application/rss+xml;charset=UTF-8"; + + @Autowired + private WebApplicationContext webAppContext; + private MockMvc mockMvc; + + @BeforeEach + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(webAppContext) + .build(); + } + + @Test + public void whenRequestingXMLFeed_thenContentTypeIsOk() throws Exception { + mockMvc.perform(get("/rss2").accept(APPLICATION_RSS_XML)) + .andExpect(status().isOk()) + .andExpect(content().contentType(APPLICATION_RSS_XML_CHARSET_UTF_8)); + } + + @Test + public void whenRequestingJSONFeed_thenContentTypeIsOk() throws Exception { + mockMvc.perform(get("/rss2").accept(APPLICATION_RSS_JSON)) + .andExpect(status().isOk()) + .andExpect(content().contentType(APPLICATION_RSS_JSON)); + } +} \ No newline at end of file diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 2131609ff6..049a3fec82 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -110,7 +110,7 @@ - 4.3.4.RELEASE + 5.0.2.RELEASE 4.2.0.RELEASE @@ -142,4 +142,4 @@ - \ No newline at end of file + diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleOne.java b/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleOne.java index 0b153bf8ec..6744570639 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleOne.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleOne.java @@ -8,24 +8,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ExampleOne extends HttpServlet { - - private static final long serialVersionUID = 1L; - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setContentType("text/html"); - PrintWriter out = response.getWriter(); - out.println( - "" + - "" + - "" + - "HTML Rendered by Servlet" + - "" + - "" + - "

HTML Rendered by Servlet


" + - "

This page was rendered by the ExampleOne Servlet!

" + - "" + - "" - ); - } + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println("" + "" + "" + "HTML Rendered by Servlet" + "" + "" + "

HTML Rendered by Servlet


" + "

This page was rendered by the ExampleOne Servlet!

" + + "" + ""); + } } \ No newline at end of file diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleThree.java b/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleThree.java index 49fefcffde..7269f917b4 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleThree.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/jsp/ExampleThree.java @@ -7,18 +7,14 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -@WebServlet( - name = "ExampleThree", - description = "JSP Servlet With Annotations", - urlPatterns = {"/ExampleThree"} -) +@WebServlet(name = "ExampleThree", description = "JSP Servlet With Annotations", urlPatterns = { "/ExampleThree" }) public class ExampleThree extends HttpServlet { - private static final long serialVersionUID = 1L; - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String message = request.getParameter("message"); - request.setAttribute("text", message); - request.getRequestDispatcher("/jsp/ExampleThree.jsp").forward(request, response); - } + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String message = request.getParameter("message"); + request.setAttribute("text", message); + request.getRequestDispatcher("/jsp/ExampleThree.jsp").forward(request, response); + } } diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java index 96556bd5b1..6ae1023374 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ErrorController.java @@ -9,7 +9,7 @@ import org.springframework.web.servlet.ModelAndView; @Controller public class ErrorController { - + @RequestMapping(value = "500Error", method = RequestMethod.GET) public void throwRuntimeException() { throw new NullPointerException("Throwing a null pointer exception"); @@ -34,19 +34,18 @@ public class ErrorController { errorMsg = "Http Error Code : 404. Resource not found"; break; } - // Handle other 4xx error codes. + // Handle other 4xx error codes. case 500: { errorMsg = "Http Error Code : 500. Internal Server Error"; break; } - // Handle other 5xx error codes. + // Handle other 5xx error codes. } errorPage.addObject("errorMsg", errorMsg); return errorPage; } private int getErrorCode(HttpServletRequest httpRequest) { - return (Integer) httpRequest - .getAttribute("javax.servlet.error.status_code"); + return (Integer) httpRequest.getAttribute("javax.servlet.error.status_code"); } } diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GeoIPTestController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GeoIPTestController.java index 16de4e56f5..eeaddcf8e0 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GeoIPTestController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GeoIPTestController.java @@ -14,15 +14,15 @@ import com.baeldung.spring.service.RawDBDemoGeoIPLocationService; @Controller public class GeoIPTestController { private RawDBDemoGeoIPLocationService locationService; + public GeoIPTestController() throws IOException { - locationService - = new RawDBDemoGeoIPLocationService(); + locationService = new RawDBDemoGeoIPLocationService(); } - @RequestMapping(value="/GeoIPTest", method = RequestMethod.POST) + + @RequestMapping(value = "/GeoIPTest", method = RequestMethod.POST) @ResponseBody - public GeoIP getLocation( - @RequestParam(value="ipAddress", required=true) String ipAddress) throws Exception { - + public GeoIP getLocation(@RequestParam(value = "ipAddress", required = true) String ipAddress) throws Exception { + return locationService.getLocation(ipAddress); } } diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ImageController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ImageController.java index ef8d1214df..fc46c07e06 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ImageController.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ImageController.java @@ -12,7 +12,6 @@ import org.springframework.web.context.support.ServletContextResource; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletResponse; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/form/GeoIP.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/GeoIP.java index 19f56867a1..4373303107 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/form/GeoIP.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/form/GeoIP.java @@ -5,15 +5,15 @@ public class GeoIP { private String city; private String latitude; private String longitude; - + public GeoIP() { - + } - + public GeoIP(String ipAddress) { this.ipAddress = ipAddress; } - + public GeoIP(String ipAddress, String city, String latitude, String longitude) { this.ipAddress = ipAddress; this.city = city; @@ -52,5 +52,5 @@ public class GeoIP { public void setLongitude(String longitude) { this.longitude = longitude; } - + } diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java index af3ce8cfb3..04443466c9 100644 --- a/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java @@ -9,18 +9,18 @@ import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; -public class RawDBDemoGeoIPLocationService{ +public class RawDBDemoGeoIPLocationService { private DatabaseReader dbReader; - + public RawDBDemoGeoIPLocationService() throws IOException { File database = new File("your-path-to-db-file"); dbReader = new DatabaseReader.Builder(database).build(); } - + public GeoIP getLocation(String ip) throws IOException, GeoIp2Exception { InetAddress ipAddress = InetAddress.getByName(ip); CityResponse response = dbReader.city(ipAddress); - + String cityName = response.getCity().getName(); String latitude = response.getLocation().getLatitude().toString(); String longitude = response.getLocation().getLongitude().toString(); diff --git a/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml b/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml index 41422d8954..75d5c1ecd6 100644 --- a/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml +++ b/spring-mvc-xml/src/main/resources/contentManagementWebMvcConfig.xml @@ -4,11 +4,11 @@ xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-4.2.xsd + http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-4.2.xsd + http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc - http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> + http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> diff --git a/spring-mvc-xml/src/main/resources/webMvcConfig.xml b/spring-mvc-xml/src/main/resources/webMvcConfig.xml index c471adf331..37aebe1d1d 100644 --- a/spring-mvc-xml/src/main/resources/webMvcConfig.xml +++ b/spring-mvc-xml/src/main/resources/webMvcConfig.xml @@ -3,11 +3,11 @@ xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-4.2.xsd + http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-4.2.xsd + http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc - http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd" + http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd" > diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml index 47e2769902..032457da43 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml @@ -2,9 +2,9 @@ + http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> @@ -58,4 +58,4 @@ - \ No newline at end of file + diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml index 1ea3051426..6ff435b84b 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/web.xml @@ -1,10 +1,9 @@ - - Spring MVC XML Application @@ -65,4 +64,4 @@ /errors - \ No newline at end of file + diff --git a/spring-mvc-xml/src/test/java/com/baeldung/geoip/GeoIpIntegrationTest.java b/spring-mvc-xml/src/test/java/com/baeldung/geoip/GeoIpIntegrationTest.java index 2edaa125b7..0e957f3400 100644 --- a/spring-mvc-xml/src/test/java/com/baeldung/geoip/GeoIpIntegrationTest.java +++ b/spring-mvc-xml/src/test/java/com/baeldung/geoip/GeoIpIntegrationTest.java @@ -10,22 +10,21 @@ import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; - public class GeoIpIntegrationTest { - + @Test public void givenIP_whenFetchingCity_thenReturnsCityData() throws IOException, GeoIp2Exception { File database = new File("your-path-to-db-file"); DatabaseReader dbReader = new DatabaseReader.Builder(database).build(); - + InetAddress ipAddress = InetAddress.getByName("your-public-ip"); CityResponse response = dbReader.city(ipAddress); - + String countryName = response.getCountry().getName(); String cityName = response.getCity().getName(); String postal = response.getPostal().getCode(); String state = response.getLeastSpecificSubdivision().getName(); - + } - + } diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 36310e08f1..1771c3e1f2 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -7,10 +7,10 @@ spring-protobuf - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java index 914cf18627..4b9f41ace3 100644 --- a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java +++ b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java @@ -1,7 +1,11 @@ package com.baeldung.protobuf; -import com.baeldung.protobuf.BaeldungTraining.Course; -import com.googlecode.protobuf.format.JsonFormat; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; + +import java.io.IOException; +import java.io.InputStream; + import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; @@ -9,21 +13,17 @@ import org.apache.http.impl.client.HttpClients; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; -import java.io.IOException; -import java.io.InputStream; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; +import com.baeldung.protobuf.BaeldungTraining.Course; +import com.googlecode.protobuf.format.JsonFormat; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = Application.class) -@WebIntegrationTest +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) public class ApplicationIntegrationTest { private static final String COURSE1_URL = "http://localhost:8080/courses/1"; diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index eb00911543..78beab6e38 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -11,10 +11,10 @@ Demo project for Scheduling in Spring with Quartz - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 759e9f2b58..1a19d9c6d9 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -9,10 +9,10 @@ http://maven.apache.org - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index b40f77eb50..aac8357c10 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -11,10 +11,10 @@ Parent for all projects related to Spring Remoting. - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java b/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java similarity index 97% rename from spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java rename to spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java index 373701f714..a1fed9637f 100644 --- a/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceTest.java +++ b/spring-remoting/remoting-hessian-burlap/client/src/test/java/com/baeldung/client/CabBookingServiceIntegrationTest.java @@ -18,9 +18,9 @@ import static java.lang.Thread.sleep; @SpringBootTest(classes = {BurlapClient.class, HessianClient.class}) @RunWith(SpringRunner.class) -public class CabBookingServiceTest { +public class CabBookingServiceIntegrationTest { - static Logger log = LoggerFactory.getLogger(CabBookingServiceTest.class); + static Logger log = LoggerFactory.getLogger(CabBookingServiceIntegrationTest.class); @Autowired @Qualifier("burlapInvoker") CabBookingService burlapClient; @Autowired @Qualifier("hessianInvoker") CabBookingService hessianClient; static Thread serverThread; diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml index 3fc429f626..255aa840e7 100644 --- a/spring-rest-angular/pom.xml +++ b/spring-rest-angular/pom.xml @@ -19,7 +19,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided org.springframework.boot diff --git a/spring-rest-docs/README.MD b/spring-rest-docs/README.MD deleted file mode 100644 index f5d001d126..0000000000 --- a/spring-rest-docs/README.MD +++ /dev/null @@ -1,5 +0,0 @@ -###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -###Relevant Articles: -- [Introduction to Spring REST Docs](http://www.baeldung.com/spring-rest-docs) diff --git a/spring-rest-docs/pom.xml b/spring-rest-docs/pom.xml deleted file mode 100644 index 4647577629..0000000000 --- a/spring-rest-docs/pom.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - 4.0.0 - - com.example - spring-rest-docs - 0.0.1-SNAPSHOT - jar - - spring-rest-docs - Demo project for Spring Boot - - - parent-boot-4 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-4 - - - - ${project.build.directory}/generated-snippets - 1.1.2.RELEASE - 2.2.0 - 1.5.3 - - - - - org.springframework.boot - spring-boot-starter-hateoas - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.restdocs - spring-restdocs-mockmvc - test - - - com.jayway.jsonpath - json-path - - - - - - - org.asciidoctor - asciidoctor-maven-plugin - ${asciidoctor-plugin.version} - - - generate-docs - package - - process-asciidoc - - - html - book - - ${snippetsDirectory} - - src/docs/asciidocs - target/generated-docs - - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - diff --git a/spring-rest-docs/src/main/java/com/example/CrudInput.java b/spring-rest-docs/src/main/java/com/example/CrudInput.java deleted file mode 100644 index 36ad67eb21..0000000000 --- a/spring-rest-docs/src/main/java/com/example/CrudInput.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example; - -import java.net.URI; -import java.util.Collections; -import java.util.List; - -import org.hibernate.validator.constraints.NotBlank; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class CrudInput { - - // @NotBlank - private final String title; - - private final String body; - - private final List tagUris; - - @JsonCreator - public CrudInput(@JsonProperty("title") String title, @JsonProperty("body") String body, @JsonProperty("tags") List tagUris) { - this.title = title; - this.body = body; - this.tagUris = tagUris == null ? Collections. emptyList() : tagUris; - } - - public String getTitle() { - return title; - } - - public String getBody() { - return body; - } - - @JsonProperty("tags") - public List getTagUris() { - return this.tagUris; - } - -} \ No newline at end of file diff --git a/spring-rest-docs/src/test/java/com/example/ApiDocumentationIntegrationTest.java b/spring-rest-docs/src/test/java/com/example/ApiDocumentationIntegrationTest.java deleted file mode 100644 index f2ac9d0f82..0000000000 --- a/spring-rest-docs/src/test/java/com/example/ApiDocumentationIntegrationTest.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.example; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.hateoas.MediaTypes; -import org.springframework.restdocs.RestDocumentation; -import org.springframework.restdocs.constraints.ConstraintDescriptions; -import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; -import org.springframework.restdocs.payload.FieldDescriptor; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import java.util.HashMap; -import java.util.Map; - -import static java.util.Collections.singletonList; -import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; -import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders; -import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel; -import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; -import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.restdocs.snippet.Attributes.key; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.util.StringUtils.collectionToDelimitedString; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SpringRestDocsApplication.class) -@WebAppConfiguration -public class ApiDocumentationIntegrationTest { - - @Rule - public final RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets"); - - @Autowired - private WebApplicationContext context; - - @Autowired - private ObjectMapper objectMapper; - - private RestDocumentationResultHandler document; - - private MockMvc mockMvc; - - @Before - public void setUp() { - this.document = document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())); - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)).alwaysDo(this.document).build(); - } - - @Test - public void headersExample() throws Exception { - this.document.snippets(responseHeaders(headerWithName("Content-Type").description("The Content-Type of the payload, e.g. `application/hal+json`"))); - this.mockMvc.perform(get("/")).andExpect(status().isOk()); - } - - @Test - public void indexExample() throws Exception { - this.document.snippets(links(linkWithRel("crud").description("The <>")), responseFields(fieldWithPath("_links").description("<> to other resources"))); - this.mockMvc.perform(get("/")).andExpect(status().isOk()); - } - - @Test - public void crudGetExample() throws Exception { - - Map tag = new HashMap<>(); - tag.put("name", "GET"); - - String tagLocation = this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isOk()).andReturn().getResponse().getHeader("Location"); - - Map crud = new HashMap<>(); - crud.put("title", "Sample Model"); - crud.put("body", "http://www.baeldung.com/"); - crud.put("tags", singletonList(tagLocation)); - - this.mockMvc.perform(get("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isOk()); - } - - @Test - public void crudCreateExample() throws Exception { - Map tag = new HashMap<>(); - tag.put("name", "CREATE"); - - String tagLocation = this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isCreated()).andReturn().getResponse().getHeader("Location"); - - Map crud = new HashMap<>(); - crud.put("title", "Sample Model"); - crud.put("body", "http://www.baeldung.com/"); - crud.put("tags", singletonList(tagLocation)); - - ConstrainedFields fields = new ConstrainedFields(CrudInput.class); - this.document.snippets(requestFields(fields.withPath("title").description("The title of the note"), fields.withPath("body").description("The body of the note"), fields.withPath("tags").description("An array of tag resource URIs"))); - this.mockMvc.perform(post("/crud").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isCreated()); - - } - - @Test - public void crudDeleteExample() throws Exception { - - Map tag = new HashMap<>(); - tag.put("name", "DELETE"); - - String tagLocation = this.mockMvc.perform(delete("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isOk()).andReturn().getResponse().getHeader("Location"); - - Map crud = new HashMap<>(); - crud.put("title", "Sample Model"); - crud.put("body", "http://www.baeldung.com/"); - crud.put("tags", singletonList(tagLocation)); - - this.mockMvc.perform(delete("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isOk()); - } - - @Test - public void crudPatchExample() throws Exception { - - Map tag = new HashMap<>(); - tag.put("name", "PATCH"); - - String tagLocation = this.mockMvc.perform(patch("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isNoContent()).andReturn().getResponse().getHeader("Location"); - - Map crud = new HashMap<>(); - crud.put("title", "Sample Model"); - crud.put("body", "http://www.baeldung.com/"); - crud.put("tags", singletonList(tagLocation)); - - this.mockMvc.perform(patch("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isNoContent()); - } - - @Test - public void crudPutExample() throws Exception { - Map tag = new HashMap<>(); - tag.put("name", "PUT"); - - String tagLocation = this.mockMvc.perform(put("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(tag))).andExpect(status().isAccepted()).andReturn().getResponse().getHeader("Location"); - - Map crud = new HashMap<>(); - crud.put("title", "Sample Model"); - crud.put("body", "http://www.baeldung.com/"); - crud.put("tags", singletonList(tagLocation)); - - this.mockMvc.perform(put("/crud/10").contentType(MediaTypes.HAL_JSON).content(this.objectMapper.writeValueAsString(crud))).andExpect(status().isAccepted()); - } - - @Test - public void contextLoads() { - } - - private static class ConstrainedFields { - - private final ConstraintDescriptions constraintDescriptions; - - ConstrainedFields(Class input) { - this.constraintDescriptions = new ConstraintDescriptions(input); - } - - private FieldDescriptor withPath(String path) { - return fieldWithPath(path).attributes(key("constraints").value(collectionToDelimitedString(this.constraintDescriptions.descriptionsForProperty(path), ". "))); - } - } - -} diff --git a/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentationIntegrationTest.java b/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentationIntegrationTest.java deleted file mode 100644 index c02c0c27f8..0000000000 --- a/spring-rest-docs/src/test/java/com/example/GettingStartedDocumentationIntegrationTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.example; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.hateoas.MediaTypes; -import org.springframework.restdocs.RestDocumentation; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = SpringRestDocsApplication.class) -@WebAppConfiguration -public class GettingStartedDocumentationIntegrationTest { - - @Rule - public final RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets"); - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private WebApplicationContext context; - - private MockMvc mockMvc; - - @Before - public void setUp() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).apply(documentationConfiguration(this.restDocumentation)).alwaysDo(document("{method-name}/{step}/", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()))).build(); - } - - @Test - public void index() throws Exception { - this.mockMvc.perform(get("/").accept(MediaTypes.HAL_JSON)).andExpect(status().isOk()).andExpect(jsonPath("_links.crud", is(notNullValue()))).andExpect(jsonPath("_links.crud", is(notNullValue()))); - } - - // String createNote() throws Exception { - // Map note = new HashMap(); - // note.put("title", "Note creation with cURL"); - // note.put("body", "An example of how to create a note using curl"); - // String noteLocation = this.mockMvc.perform(post("/crud") - // .contentType(MediaTypes.HAL_JSON) - // .content(objectMapper.writeValueAsString(note))) - // .andExpect(status().isCreated()) - // .andExpect(header().string("Location", notNullValue())) - // .andReturn() - // .getResponse() - // .getHeader("Location"); - // return noteLocation; - // } - // - // MvcResult getNote(String noteLocation) throws Exception { - // return this.mockMvc.perform(get(noteLocation)) - // .andExpect(status().isOk()) - // .andExpect(jsonPath("title", is(notNullValue()))) - // .andExpect(jsonPath("body", is(notNullValue()))) - // .andExpect(jsonPath("_links.crud", is(notNullValue()))) - // .andReturn(); - // } - // - // - // String createTag() throws Exception, JsonProcessingException { - // Map tag = new HashMap(); - // tag.put("name", "getting-started"); - // String tagLocation = this.mockMvc.perform(post("/crud") - // .contentType(MediaTypes.HAL_JSON) - // .content(objectMapper.writeValueAsString(tag))) - // .andExpect(status().isCreated()) - // .andExpect(header().string("Location", notNullValue())) - // .andReturn() - // .getResponse() - // .getHeader("Location"); - // return tagLocation; - // } - // - // void getTag(String tagLocation) throws Exception { - // this.mockMvc.perform(get(tagLocation)).andExpect(status().isOk()) - // .andExpect(jsonPath("name", is(notNullValue()))) - // .andExpect(jsonPath("_links.tagged-notes", is(notNullValue()))); - // } - // - // String createTaggedNote(String tag) throws Exception { - // Map note = new HashMap(); - // note.put("title", "Tagged note creation with cURL"); - // note.put("body", "An example of how to create a tagged note using cURL"); - // note.put("tags", Arrays.asList(tag)); - // - // String noteLocation = this.mockMvc.perform(post("/notes") - // .contentType(MediaTypes.HAL_JSON) - // .content(objectMapper.writeValueAsString(note))) - // .andExpect(status().isCreated()) - // .andExpect(header().string("Location", notNullValue())) - // .andReturn() - // .getResponse() - // .getHeader("Location"); - // return noteLocation; - // } - // - // void getTags(String noteTagsLocation) throws Exception { - // this.mockMvc.perform(get(noteTagsLocation)) - // .andExpect(status().isOk()) - // .andExpect(jsonPath("_embedded.tags", hasSize(1))); - // } - // - // void tagExistingNote(String noteLocation, String tagLocation) throws Exception { - // Map update = new HashMap(); - // update.put("tags", Arrays.asList(tagLocation)); - // this.mockMvc.perform(patch(noteLocation) - // .contentType(MediaTypes.HAL_JSON) - // .content(objectMapper.writeValueAsString(update))) - // .andExpect(status().isNoContent()); - // } - // - // MvcResult getTaggedExistingNote(String noteLocation) throws Exception { - // return this.mockMvc.perform(get(noteLocation)).andExpect(status().isOk()).andReturn(); - // } - // - // void getTagsForExistingNote(String noteTagsLocation) throws Exception { - // this.mockMvc.perform(get(noteTagsLocation)) - // .andExpect(status().isOk()).andExpect(jsonPath("_embedded.tags", hasSize(1))); - // } - // - // private String getLink(MvcResult result, String rel) - // throws UnsupportedEncodingException { - // return JsonPath.parse(result.getResponse().getContentAsString()).read("_links." + rel + ".href"); - // } - -} diff --git a/spring-rest-embedded-tomcat/pom.xml b/spring-rest-embedded-tomcat/pom.xml new file mode 100644 index 0000000000..3622e84101 --- /dev/null +++ b/spring-rest-embedded-tomcat/pom.xml @@ -0,0 +1,102 @@ + + 4.0.0 + org.baeldung.embedded + SpringRestTomcat + 0.0.1-SNAPSHOT + + spring-rest-embedded-tomcat + war + + + + junit + junit + ${junit.version} + test + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + + javax.servlet + javax.servlet-api + 4.0.0 + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.library} + + + + org.apache.tomcat.embed + tomcat-embed-core + 9.0.1 + test + + + + org.apache.tomcat + tomcat-jasper + 9.0.1 + test + + + + org.apache.httpcomponents + httpclient + 4.5.3 + + + + org.apache.httpcomponents + httpcore + 4.4.8 + + + + + + spring-rest-embedded-tomcat + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/JdbcTest.java + **/*LiveTest.java + + + + + + + + 5.0.2.RELEASE + 2.19.1 + 4.12 + 2.9.2 + 1.8 + 1.8 + false + + + \ No newline at end of file diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java new file mode 100644 index 0000000000..24bd28166b --- /dev/null +++ b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java @@ -0,0 +1,22 @@ +package org.baeldung.embedded.configuration; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + @Override + protected Class[] getRootConfigClasses() { + return new Class[] { UserConfiguration.class }; + } + + @Override + protected Class[] getServletConfigClasses() { + return null; + } + + @Override + protected String[] getServletMappings() { + return new String[] { "/" }; + } + +} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java new file mode 100644 index 0000000000..4c102a74cb --- /dev/null +++ b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java @@ -0,0 +1,12 @@ +package org.baeldung.embedded.configuration; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = "org.baeldung.embedded") +public class UserConfiguration { + +} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java new file mode 100644 index 0000000000..a9a5faa0c6 --- /dev/null +++ b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java @@ -0,0 +1,28 @@ +package org.baeldung.embedded.controller; + +import org.baeldung.embedded.domain.User; +import org.baeldung.embedded.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UserController { + + @Autowired + UserService userService; + + @RequestMapping("/") + public String welcome() { + return "Hello World!"; + } + + @RequestMapping(method = RequestMethod.GET, value = "/user/{userName}") + @ResponseBody + public User user(@PathVariable String userName) { + return this.userService.getUser(userName); + } +} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java new file mode 100644 index 0000000000..2f9443daea --- /dev/null +++ b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java @@ -0,0 +1,23 @@ +package org.baeldung.embedded.domain; + +public class User { + + private String name; + private String hobby; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getHobby() { + return hobby; + } + + public void setHobby(String hobby) { + this.hobby = hobby; + } +} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java new file mode 100644 index 0000000000..76696e12c2 --- /dev/null +++ b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java @@ -0,0 +1,38 @@ +package org.baeldung.embedded.service; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.embedded.domain.User; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + private List users = new ArrayList<>(); + + public void addUser(String name) { + User user = new User(); + user.setName(name); + if (name == "HarryPotter") { + user.setHobby("Quidditch"); + } else { + user.setHobby("MuggleActivity"); + } + users.add(user); + } + + public User getUser(String name) { + for (User user : users) { + if (user.getName() + .equalsIgnoreCase(name)) { + return user; + } + } + + User user = new User(); + user.setName(name); + user.setHobby("None"); + + return user; + } +} diff --git a/spring-rest-embedded-tomcat/src/main/webapp/emptyFile b/spring-rest-embedded-tomcat/src/main/webapp/emptyFile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java new file mode 100644 index 0000000000..f340f6c837 --- /dev/null +++ b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java @@ -0,0 +1,70 @@ +package org.baeldung.embedded; + +import java.io.File; +import java.util.concurrent.CountDownLatch; +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +public class EmbeddedTomcatApp { + + private Tomcat tomcatInstance; + private WebApplicationContext webApplicationContext; + private CountDownLatch started = new CountDownLatch(1); + + public void start() throws Exception { + tomcatInstance = new Tomcat(); + tomcatInstance.setBaseDir(new File(getClass().getResource(".") + .toURI()).getAbsolutePath()); // Tomcat's temporary directory + tomcatInstance.setPort(0); + + Context webapp = tomcatInstance.addWebapp("", new File("src/main/webapp/").getAbsolutePath()); + + webapp.addLifecycleListener(event -> { + if (event.getType() + .equals("after_stop")) { + started.countDown(); + } else if (event.getType() + .equals("after_start")) { + webApplicationContext = WebApplicationContextUtils + .findWebApplicationContext(webapp.getServletContext()); + + ((ConfigurableListableBeanFactory) webApplicationContext + .getAutowireCapableBeanFactory()).registerSingleton("baseUrl", getBaseUrl()); + + started.countDown(); + } + }); + + tomcatInstance.start(); + started.await(); + } + + public Tomcat getTomcatInstance() { + return this.tomcatInstance; + } + + public String getBaseUrl() { + return String.format("http://localhost:%d%s", getLocalPort(), getWebApplicationContext().getServletContext() + .getContextPath()); + } + + public int getLocalPort() { + return tomcatInstance.getConnector() + .getLocalPort(); + } + + public WebApplicationContext getWebApplicationContext() { + return webApplicationContext; + } + + public boolean isStarted() { + return started.getCount() == 0; + } + + public boolean isStartedSucessfully() { + return webApplicationContext != null; + } +} diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java new file mode 100644 index 0000000000..1bf15556e8 --- /dev/null +++ b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java @@ -0,0 +1,45 @@ +package org.baeldung.embedded; + +import org.junit.runner.notification.RunNotifier; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +public class EmbeddedTomcatRunner extends BlockJUnit4ClassRunner { + + public EmbeddedTomcatRunner(Class klass) throws InitializationError { + super(klass); + } + + // use one static Tomcat instance shared across all tests + private static EmbeddedTomcatApp embeddedTomcatApp = new EmbeddedTomcatApp(); + + @Override + protected Statement classBlock(RunNotifier notifier) { + ensureSharedTomcatStarted(); + Statement result = super.classBlock(notifier); + return result; + } + + private void ensureSharedTomcatStarted() { + if (!embeddedTomcatApp.isStarted()) { + try { + embeddedTomcatApp.start(); + } catch (Exception e) { + throw new RuntimeException("Error while starting embedded Tomcat server", e); + } + } + } + + @Override + protected Object createTest() throws Exception { + if (!embeddedTomcatApp.isStartedSucessfully()) { + throw new RuntimeException("Tomcat server not started successfully. Skipping test"); + } + Object testInstance = super.createTest(); + embeddedTomcatApp.getWebApplicationContext() + .getAutowireCapableBeanFactory() + .autowireBean(testInstance); + return testInstance; + } +} \ No newline at end of file diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java new file mode 100644 index 0000000000..1c5d482171 --- /dev/null +++ b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java @@ -0,0 +1,60 @@ +package org.baeldung.embedded; + +import java.io.IOException; +import java.util.Map; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.baeldung.embedded.service.UserService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(EmbeddedTomcatRunner.class) +public class UserIntegrationTest { + + @Autowired + protected String baseUrl; + + @Autowired + private UserService userService; + + private String userName = "HarryPotter"; + + @Before + public void setUp() { + userService.addUser(userName); + } + + @Test + public void givenUserName_whenSendGetForHarryPotter_thenHobbyQuidditch() throws IOException { + String url = baseUrl + "/user/" + userName; + + HttpClient httpClient = HttpClientBuilder.create() + .build(); + HttpGet getUserRequest = new HttpGet(url); + getUserRequest.addHeader("Content-type", "application/json"); + HttpResponse response = httpClient.execute(getUserRequest); + + Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine() + .getStatusCode()); + + HttpEntity responseEntity = response.getEntity(); + + Assert.assertNotNull(responseEntity); + + ObjectMapper mapper = new ObjectMapper(); + String retSrc = EntityUtils.toString(responseEntity); + Map result = mapper.readValue(retSrc, Map.class); + + Assert.assertEquals("Quidditch", result.get("hobby")); + } +} diff --git a/spring-rest-full/pom.xml b/spring-rest-full/pom.xml index c596e79b31..3bd7ec07f6 100644 --- a/spring-rest-full/pom.xml +++ b/spring-rest-full/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -94,7 +94,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-rest-full/src/testFile b/spring-rest-full/src/testFile new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-rest-full/src/testFile @@ -0,0 +1 @@ + diff --git a/spring-rest-query-language/pom.xml b/spring-rest-query-language/pom.xml index bf3eb8cb78..b329bec07e 100644 --- a/spring-rest-query-language/pom.xml +++ b/spring-rest-query-language/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -94,7 +94,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-rest-shell/README.md b/spring-rest-shell/README.md index 06e18450c6..901d9a51ee 100644 --- a/spring-rest-shell/README.md +++ b/spring-rest-shell/README.md @@ -2,4 +2,4 @@ ### Relevant Articles -- [Spring REST Shell](http://www.baeldung.com/) \ No newline at end of file +- [Spring REST Shell](http://www.baeldung.com/spring-rest-shell) \ No newline at end of file diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md index 916676feb5..982e16d5a5 100644 --- a/spring-rest-simple/README.md +++ b/spring-rest-simple/README.md @@ -5,3 +5,4 @@ - [The Guide to RestTemplate](http://www.baeldung.com/rest-template) - [Spring RequestMapping](http://www.baeldung.com/spring-requestmapping) - [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring) +- [Spring and Apache FileUpload](http://www.baeldung.com/spring-apache-file-upload) diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index f662b736ad..ac74534328 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -206,6 +206,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 1.8 1.8 @@ -230,7 +231,7 @@ **/JdbcTest.java **/*LiveTest.java - true + @@ -346,7 +347,7 @@ - 1.3.2 + 1.3.3 4.0.0 1.4 3.1.0 diff --git a/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java b/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java new file mode 100644 index 0000000000..b9b6739898 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/apachefileupload/UploadController.java @@ -0,0 +1,73 @@ +package com.baeldung.apachefileupload; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Iterator; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemIterator; +import org.apache.commons.fileupload.FileItemStream; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.fileupload.util.Streams; +import org.apache.commons.io.IOUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UploadController { + + @RequestMapping(value = "/upload", method = RequestMethod.POST) + public String handleUpload(HttpServletRequest request) { + System.out.println(System.getProperty("java.io.tmpdir")); + boolean isMultipart = ServletFileUpload.isMultipartContent(request); + // Create a factory for disk-based file items + DiskFileItemFactory factory = new DiskFileItemFactory(); + factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); + factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); + factory.setFileCleaningTracker(null); + // Configure a repository (to ensure a secure temp location is used) + ServletFileUpload upload = new ServletFileUpload(factory); + try { + // Parse the request + List items = upload.parseRequest(request); + // Process the uploaded items + Iterator iter = items.iterator(); + while (iter.hasNext()) { + FileItem item = iter.next(); + + if (!item.isFormField()) { + try (InputStream uploadedStream = item.getInputStream(); + OutputStream out = new FileOutputStream("file.mov");) { + IOUtils.copy(uploadedStream, out); + out.close(); + } + } + } + // Parse the request with Streaming API + upload = new ServletFileUpload(); + FileItemIterator iterStream = upload.getItemIterator(request); + while (iterStream.hasNext()) { + FileItemStream item = iterStream.next(); + String name = item.getFieldName(); + InputStream stream = item.openStream(); + if (!item.isFormField()) { + //Process the InputStream + } else { + //process form fields + String formFieldValue = Streams.asString(stream); + } + } + return "success!"; + } catch (IOException | FileUploadException ex) { + return "failed: " + ex.getMessage(); + } + } + +} diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 06747ffd41..50ac00e1c3 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 @@ -169,6 +169,12 @@ commons-io 2.4 + + + au.com.dius + pact-jvm-provider-junit_2.11 + ${pact.version} + @@ -324,6 +330,8 @@ 3.4.1 2.2.0 + + 3.5.11 diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/PactController.java b/spring-rest/src/main/java/org/baeldung/web/controller/PactController.java new file mode 100644 index 0000000000..4f586479ef --- /dev/null +++ b/spring-rest/src/main/java/org/baeldung/web/controller/PactController.java @@ -0,0 +1,32 @@ +package org.baeldung.web.controller; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.web.dto.PactDto; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PactController { + + List pacts = new ArrayList<>(); + + @GetMapping(value = "/pact", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public PactDto getPact() { + return new PactDto(true, "tom"); + } + + @PostMapping("/pact") + @ResponseStatus(HttpStatus.CREATED) + public void createPact(PactDto pact) { + pacts.add(pact); + } + +} diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java b/spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java new file mode 100644 index 0000000000..e34e2bdf3b --- /dev/null +++ b/spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java @@ -0,0 +1,33 @@ +package org.baeldung.web.dto; + +public class PactDto { + + private boolean condition; + private String name; + + public PactDto() { + } + + public PactDto(boolean condition, String name) { + super(); + this.condition = condition; + this.name = name; + } + + public boolean isCondition() { + return condition; + } + + public void setCondition(boolean condition) { + this.condition = condition; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json b/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json new file mode 100644 index 0000000000..c8082798f4 --- /dev/null +++ b/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json @@ -0,0 +1,61 @@ +{ + "provider": { + "name": "test_provider" + }, + "consumer": { + "name": "test_consumer" + }, + "interactions": [ + { + "description": "GET REQUEST", + "request": { + "method": "GET", + "path": "/pact" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "body": { + "condition": true, + "name": "tom" + } + }, + "providerStates": [ + { + "name": "test GET" + } + ] + }, + { + "description": "POST REQUEST", + "request": { + "method": "POST", + "path": "/pact", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "name": "Michael" + } + }, + "response": { + "status": 201 + }, + "providerStates": [ + { + "name": "test POST" + } + ] + } + ], + "metadata": { + "pact-specification": { + "version": "3.0.0" + }, + "pact-jvm": { + "version": "3.5.0" + } + } +} \ No newline at end of file diff --git a/spring-rest/src/test/java/org/baeldung/pact/PactProviderTest.java b/spring-rest/src/test/java/org/baeldung/pact/PactProviderTest.java new file mode 100644 index 0000000000..0456b0d3e7 --- /dev/null +++ b/spring-rest/src/test/java/org/baeldung/pact/PactProviderTest.java @@ -0,0 +1,40 @@ +package org.baeldung.pact; + +import org.baeldung.config.MainApplication; +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.springframework.boot.SpringApplication; +import org.springframework.web.context.ConfigurableWebApplicationContext; + +import au.com.dius.pact.provider.junit.PactRunner; +import au.com.dius.pact.provider.junit.Provider; +import au.com.dius.pact.provider.junit.State; +import au.com.dius.pact.provider.junit.loader.PactFolder; +import au.com.dius.pact.provider.junit.target.HttpTarget; +import au.com.dius.pact.provider.junit.target.Target; +import au.com.dius.pact.provider.junit.target.TestTarget; + +@RunWith(PactRunner.class) +@Provider("test_provider") +@PactFolder("pacts") +public class PactProviderTest { + + @TestTarget + public final Target target = new HttpTarget("http", "localhost", 8082, "/spring-rest"); + + private static ConfigurableWebApplicationContext application; + + @BeforeClass + public static void start() { + application = (ConfigurableWebApplicationContext) SpringApplication.run(MainApplication.class); + } + + @State("test GET") + public void toGetState() { + } + + @State("test POST") + public void toPostState() { + } + +} diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index e1d69a3031..acc03953d0 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -1,6 +1,6 @@ - io.spring.platform @@ -500,6 +500,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 ${java.version} ${java.version} diff --git a/spring-security-acl/README.md b/spring-security-acl/README.md new file mode 100644 index 0000000000..fb3e8160ab --- /dev/null +++ b/spring-security-acl/README.md @@ -0,0 +1,4 @@ +## Spring Security ACL Project + +### Relevant Articles +- [Introduction to Spring Security ACL](http://www.baeldung.com/spring-security-acl) diff --git a/spring-security-acl/pom.xml b/spring-security-acl/pom.xml new file mode 100644 index 0000000000..a19a54dd88 --- /dev/null +++ b/spring-security-acl/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + spring-security-acl + 0.0.1-SNAPSHOT + war + + spring-security-acl + Spring Security ACL + + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + com.h2database + h2 + + + + org.springframework + spring-test + test + + + + org.springframework.security + spring-security-test + test + + + + org.springframework.security + spring-security-acl + + + org.springframework.security + spring-security-config + + + org.springframework + spring-context-support + + + net.sf.ehcache + ehcache-core + 2.6.11 + jar + + + + + diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/Application.java b/spring-security-acl/src/main/java/org/baeldung/acl/Application.java new file mode 100644 index 0000000000..665ca64076 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/Application.java @@ -0,0 +1,11 @@ +package org.baeldung.acl; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java new file mode 100644 index 0000000000..337e745c3c --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/ACLContext.java @@ -0,0 +1,80 @@ +package org.baeldung.acl.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cache.ehcache.EhCacheFactoryBean; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionCacheOptimizer; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.EhCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +@Configuration +@EnableAutoConfiguration +public class ACLContext { + + @Autowired + DataSource dataSource; + + @Bean + public EhCacheBasedAclCache aclCache() { + return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); + } + + @Bean + public EhCacheFactoryBean aclEhCacheFactoryBean() { + EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); + ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); + ehCacheFactoryBean.setCacheName("aclCache"); + return ehCacheFactoryBean; + } + + @Bean + public EhCacheManagerFactoryBean aclCacheManager() { + return new EhCacheManagerFactoryBean(); + } + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN")); + } + + @Bean + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService())); + return expressionHandler; + } + + @Bean + public LookupStrategy lookupStrategy() { + return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); + } + + @Bean + public JdbcMutableAclService aclService() { + return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + } + +} \ No newline at end of file diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java new file mode 100644 index 0000000000..e503cb1a41 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.acl.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + @Autowired + MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + return defaultMethodSecurityExpressionHandler; + } + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java new file mode 100644 index 0000000000..24d170e56c --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.acl.config; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") +@PropertySource("classpath:org.baeldung.acl.datasource.properties") +@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) +public class JPAPersistenceConfig { + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java new file mode 100644 index 0000000000..91a2af7d83 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.acl.persistence.dao; + +import java.util.List; + +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; + +public interface NoticeMessageRepository extends JpaRepository{ + + @PostFilter("hasPermission(filterObject, 'READ')") + List findAll(); + + @PostAuthorize("hasPermission(returnObject, 'READ')") + NoticeMessage findById(Integer id); + + @SuppressWarnings("unchecked") + @PreAuthorize("hasPermission(#noticeMessage, 'WRITE')") + NoticeMessage save(@Param("noticeMessage")NoticeMessage noticeMessage); + +} diff --git a/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java new file mode 100644 index 0000000000..bd1e866f83 --- /dev/null +++ b/spring-security-acl/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java @@ -0,0 +1,29 @@ +package org.baeldung.acl.persistence.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="system_message") +public class NoticeMessage { + + @Id + @Column + private Integer id; + @Column + private String content; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/acl-data.sql b/spring-security-acl/src/main/resources/acl-data.sql new file mode 100644 index 0000000000..a4e0011834 --- /dev/null +++ b/spring-security-acl/src/main/resources/acl-data.sql @@ -0,0 +1,26 @@ +INSERT INTO acl_sid (id, principal, sid) VALUES +(1, 1, 'manager'), +(2, 1, 'hr'), +(3, 0, 'ROLE_EDITOR'); + +INSERT INTO acl_class (id, class) VALUES +(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); + +INSERT INTO system_message(id,content) VALUES +(1,'First Level Message'), +(2,'Second Level Message'), +(3,'Third Level Message'); + +INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES +(1, 1, 1, NULL, 3, 0), +(2, 1, 2, NULL, 3, 0), +(3, 1, 3, NULL, 3, 0); + +INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES +(1, 1, 1, 1, 1, 1, 1, 1), +(2, 1, 2, 1, 2, 1, 1, 1), +(3, 1, 3, 3, 1, 1, 1, 1), +(4, 2, 1, 2, 1, 1, 1, 1), +(5, 2, 2, 3, 1, 1, 1, 1), +(6, 3, 1, 3, 1, 1, 1, 1), +(7, 3, 2, 3, 2, 1, 1, 1); \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/acl-schema.sql b/spring-security-acl/src/main/resources/acl-schema.sql new file mode 100644 index 0000000000..9f74048230 --- /dev/null +++ b/spring-security-acl/src/main/resources/acl-schema.sql @@ -0,0 +1,58 @@ +create table IF NOT EXISTS system_message (id integer not null, content varchar(255), primary key (id)); + +CREATE TABLE IF NOT EXISTS acl_sid ( + id bigint(20) NOT NULL AUTO_INCREMENT, + principal tinyint(1) NOT NULL, + sid varchar(100) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_1 (sid,principal) +); + +CREATE TABLE IF NOT EXISTS acl_class ( + id bigint(20) NOT NULL AUTO_INCREMENT, + class varchar(255) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_2 (class) +); + +CREATE TABLE IF NOT EXISTS acl_entry ( + id bigint(20) NOT NULL AUTO_INCREMENT, + acl_object_identity bigint(20) NOT NULL, + ace_order int(11) NOT NULL, + sid bigint(20) NOT NULL, + mask int(11) NOT NULL, + granting tinyint(1) NOT NULL, + audit_success tinyint(1) NOT NULL, + audit_failure tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_4 (acl_object_identity,ace_order) +); + +CREATE TABLE IF NOT EXISTS acl_object_identity ( + id bigint(20) NOT NULL AUTO_INCREMENT, + object_id_class bigint(20) NOT NULL, + object_id_identity bigint(20) NOT NULL, + parent_object bigint(20) DEFAULT NULL, + owner_sid bigint(20) DEFAULT NULL, + entries_inheriting tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_3 (object_id_class,object_id_identity) +); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (sid) REFERENCES acl_sid(id); + +-- +-- Constraints for table acl_object_identity +-- +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (object_id_class) REFERENCES acl_class (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (owner_sid) REFERENCES acl_sid (id); \ No newline at end of file diff --git a/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties b/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties new file mode 100644 index 0000000000..40f1e6ef38 --- /dev/null +++ b/spring-security-acl/src/main/resources/org.baeldung.acl.datasource.properties @@ -0,0 +1,12 @@ +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +spring.h2.console.path=/myconsole +spring.h2.console.enabled=true +spring.datasource.initialize=true +spring.datasource.schema=classpath:acl-schema.sql +spring.datasource.data=classpath:acl-data.sql \ No newline at end of file diff --git a/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java b/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java new file mode 100644 index 0000000000..1460d4f47b --- /dev/null +++ b/spring-security-acl/src/test/java/org/baeldung/acl/SpringACLIntegrationTest.java @@ -0,0 +1,119 @@ +package org.baeldung.acl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.baeldung.acl.persistence.dao.NoticeMessageRepository; +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; +import org.springframework.test.context.transaction.TransactionalTestExecutionListener; +import org.springframework.test.context.web.ServletTestExecutionListener; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@TestExecutionListeners(listeners={ServletTestExecutionListener.class, + DependencyInjectionTestExecutionListener.class, + DirtiesContextTestExecutionListener.class, + TransactionalTestExecutionListener.class, + WithSecurityContextTestExecutionListener.class}) +public class SpringACLIntegrationTest extends AbstractJUnit4SpringContextTests{ + + private static Integer FIRST_MESSAGE_ID = 1; + private static Integer SECOND_MESSAGE_ID = 2; + private static Integer THIRD_MESSAGE_ID = 3; + private static String EDITTED_CONTENT = "EDITED"; + + @Configuration + @ComponentScan("org.baeldung.acl.*") + public static class SpringConfig { + + } + + @Autowired + NoticeMessageRepository repo; + + @Test + @WithMockUser(username="manager") + public void givenUserManager_whenFindAllMessage_thenReturnFirstMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(1,details.size()); + assertEquals(FIRST_MESSAGE_ID,details.get(0).getId()); + } + + @Test + @WithMockUser(username="manager") + public void givenUserManager_whenFind1stMessageByIdAndUpdateItsContent_thenOK(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + + NoticeMessage editedFirstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(editedFirstMessage); + assertEquals(FIRST_MESSAGE_ID,editedFirstMessage.getId()); + assertEquals(EDITTED_CONTENT,editedFirstMessage.getContent()); + } + + @Test + @WithMockUser(username="hr") + public void givenUsernameHr_whenFindMessageById2_thenOK(){ + NoticeMessage secondMessage = repo.findById(SECOND_MESSAGE_ID); + assertNotNull(secondMessage); + assertEquals(SECOND_MESSAGE_ID,secondMessage.getId()); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="hr") + public void givenUsernameHr_whenUpdateMessageWithId2_thenFail(){ + NoticeMessage secondMessage = new NoticeMessage(); + secondMessage.setId(SECOND_MESSAGE_ID); + secondMessage.setContent(EDITTED_CONTENT); + repo.save(secondMessage); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindAllMessage_thenReturn3Message(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(3,details.size()); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenUpdateThirdMessage_thenOK(){ + NoticeMessage thirdMessage = new NoticeMessage(); + thirdMessage.setId(THIRD_MESSAGE_ID); + thirdMessage.setContent(EDITTED_CONTENT); + repo.save(thirdMessage); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFind1stMessageByIdAndUpdateContent_thenFail(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + } +} + \ No newline at end of file diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index e525cd4e8e..4ccb83c29b 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -8,10 +8,10 @@ 1.0-SNAPSHOT - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-security-client/spring-security-jsp-authentication/pom.xml b/spring-security-client/spring-security-jsp-authentication/pom.xml index 6f4095c2d5..2509b26293 100644 --- a/spring-security-client/spring-security-jsp-authentication/pom.xml +++ b/spring-security-client/spring-security-jsp-authentication/pom.xml @@ -12,10 +12,10 @@ Spring Security JSP Authentication tag sample - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-client/spring-security-jsp-authorize/pom.xml b/spring-security-client/spring-security-jsp-authorize/pom.xml index 2e1a57a468..bd13520948 100644 --- a/spring-security-client/spring-security-jsp-authorize/pom.xml +++ b/spring-security-client/spring-security-jsp-authorize/pom.xml @@ -12,10 +12,10 @@ Spring Security JSP Authorize tag sample - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-client/spring-security-jsp-config/pom.xml b/spring-security-client/spring-security-jsp-config/pom.xml index 4f92e24563..0a4c8fb5be 100644 --- a/spring-security-client/spring-security-jsp-config/pom.xml +++ b/spring-security-client/spring-security-jsp-config/pom.xml @@ -12,10 +12,10 @@ Spring Security JSP configuration - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-client/spring-security-mvc/pom.xml b/spring-security-client/spring-security-mvc/pom.xml index a642e8719d..c67bc336f6 100644 --- a/spring-security-client/spring-security-mvc/pom.xml +++ b/spring-security-client/spring-security-mvc/pom.xml @@ -12,10 +12,10 @@ Spring Security MVC - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 diff --git a/spring-security-client/spring-security-mvc/src/main/java/org/baeldung/config/Application.java b/spring-security-client/spring-security-mvc/src/main/java/org/baeldung/config/Application.java index 4057a85f13..34c43fbe5a 100644 --- a/spring-security-client/spring-security-mvc/src/main/java/org/baeldung/config/Application.java +++ b/spring-security-client/spring-security-mvc/src/main/java/org/baeldung/config/Application.java @@ -3,7 +3,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { diff --git a/spring-security-client/spring-security-thymeleaf-authentication/pom.xml b/spring-security-client/spring-security-thymeleaf-authentication/pom.xml index 7573d430d3..e42d499b64 100644 --- a/spring-security-client/spring-security-thymeleaf-authentication/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-authentication/pom.xml @@ -12,10 +12,10 @@ Spring Security thymeleaf authentication tag sample - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-client/spring-security-thymeleaf-authorize/pom.xml b/spring-security-client/spring-security-thymeleaf-authorize/pom.xml index 20d141e70c..5fa2016be8 100644 --- a/spring-security-client/spring-security-thymeleaf-authorize/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-authorize/pom.xml @@ -12,10 +12,10 @@ Spring Security thymeleaf authorize tag sample - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-client/spring-security-thymeleaf-config/pom.xml b/spring-security-client/spring-security-thymeleaf-config/pom.xml index ad856c7e20..9a00ad0080 100644 --- a/spring-security-client/spring-security-thymeleaf-config/pom.xml +++ b/spring-security-client/spring-security-thymeleaf-config/pom.xml @@ -12,10 +12,10 @@ Spring Security thymeleaf configuration sample project - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-4 + ../../parent-boot-5 @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided diff --git a/spring-security-core/README.md b/spring-security-core/README.md index 3675e7e160..f7b3f6dffe 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -9,3 +9,4 @@ mvn clean install ### Relevant Articles: - [Intro to @PreFilter and @PostFilter in Spring Security](http://www.baeldung.com/spring-security-prefilter-postfilter) - [Spring Boot Authentication Auditing Support](http://www.baeldung.com/spring-boot-authentication-audit) +- [Introduction to Spring Method Security](http://www.baeldung.com/spring-security-method-security) diff --git a/spring-security-core/pom.xml b/spring-security-core/pom.xml index 7deea5deb0..db8837df46 100644 --- a/spring-security-core/pom.xml +++ b/spring-security-core/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java new file mode 100644 index 0000000000..711784adbb --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java @@ -0,0 +1,14 @@ +package org.baeldung.methodsecurity.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.security.access.prepost.PreAuthorize; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@PreAuthorize("hasRole('VIEWER')") +public @interface IsViewer { +} \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java new file mode 100644 index 0000000000..4749c730dc --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java @@ -0,0 +1,11 @@ +package org.baeldung.methodsecurity.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) +public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { + +} diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java new file mode 100644 index 0000000000..fb9174befa --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java @@ -0,0 +1,30 @@ +package org.baeldung.methodsecurity.entity; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +@SuppressWarnings("serial") +public class CustomUser extends User { + + private String nickName; + + public CustomUser(String username, String password, Collection authorities) { + super(username, password, authorities); + } + + public CustomUser(String username, String password, Collection authorities, String nickName) { + super(username, password, authorities); + this.nickName = nickName; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java new file mode 100644 index 0000000000..fc1a32289d --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java @@ -0,0 +1,57 @@ +package org.baeldung.methodsecurity.repository; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.baeldung.methodsecurity.entity.CustomUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class UserRoleRepository { + + static Map DB_BASED_USER_MAPPING; + + static { + DB_BASED_USER_MAPPING = new LinkedHashMap<>(); + DB_BASED_USER_MAPPING.put("jane", new CustomUser("jane", "1234", getGrantedAuthorities("ROLE_USER", "ROLE_VIEWER"), "jane")); + DB_BASED_USER_MAPPING.put("john", new CustomUser("john", "1234", getGrantedAuthorities("ROLE_EDITOR", "ROLE_ADMIN"), "jane")); + DB_BASED_USER_MAPPING.put("jack", new CustomUser("jack", "1234", getGrantedAuthorities("ROLE_USER", "ROLE_REVIEWER"), "jane")); + } + + private static List getGrantedAuthorities(String... roles) { + ArrayList authorities = new ArrayList<>(); + for (String role : roles) { + authorities.add(new SimpleGrantedAuthority(role)); + } + return authorities; + } + + public CustomUser loadUserByUserName(String username) { + if (DB_BASED_USER_MAPPING.containsKey(username)) { + return DB_BASED_USER_MAPPING.get(username); + } + throw new UsernameNotFoundException("User " + username + " cannot be found"); + } + + public boolean isValidUsername(String username) { + return DB_BASED_USER_MAPPING.containsKey(username); + } + + public boolean isValidRole(String roleName) { + return roleName.startsWith("ROLE_"); + } + + public List getAllUsernames() { + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + return usernames; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java new file mode 100644 index 0000000000..91171468bb --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java @@ -0,0 +1,19 @@ +package org.baeldung.methodsecurity.service; + +import org.baeldung.methodsecurity.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Service("userDetailService") +public class CustomUserDetailsService implements UserDetailsService { + + @Autowired + UserRoleRepository userRoleRepo; + + @Override + public UserDetails loadUserByUsername(String username) { + return userRoleRepo.loadUserByUserName(username); + } +} \ No newline at end of file diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java new file mode 100644 index 0000000000..5f29d7dee6 --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java @@ -0,0 +1,18 @@ +package org.baeldung.methodsecurity.service; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; + +@Service +@PreAuthorize("hasRole('ROLE_ADMIN')") +public class SystemService { + + public String getSystemYear(){ + return "2017"; + } + + public String getSystemDate(){ + return "31-12-2017"; + } + +} diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java new file mode 100644 index 0000000000..30bbdbc10f --- /dev/null +++ b/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java @@ -0,0 +1,108 @@ +package org.baeldung.methodsecurity.service; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.security.RolesAllowed; + +import org.baeldung.methodsecurity.annotation.IsViewer; +import org.baeldung.methodsecurity.entity.CustomUser; +import org.baeldung.methodsecurity.repository.UserRoleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.access.prepost.PreFilter; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +@Service +public class UserRoleService { + + @Autowired + UserRoleRepository userRoleRepository; + + @Secured("ROLE_VIEWER") + public String getUsername() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @Secured({ "ROLE_VIEWER", "ROLE_EDITOR" }) + public boolean isValidUsername(String username) { + return userRoleRepository.isValidUsername(username); + } + + @RolesAllowed("ROLE_VIEWER") + public String getUsername2() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @RolesAllowed({ "ROLE_VIEWER", "ROLE_EDITOR" }) + public boolean isValidUsername2(String username) { + return userRoleRepository.isValidUsername(username); + } + + @PreAuthorize("hasRole('ROLE_VIEWER')") + public String getUsernameInUpperCase() { + return getUsername().toUpperCase(); + } + + @PreAuthorize("hasAuthority('SYS_ADMIN')") + public String getUsernameLC() { + return getUsername().toLowerCase(); + } + + @PreAuthorize("hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR')") + public boolean isValidUsername3(String username) { + return userRoleRepository.isValidUsername(username); + } + + @PreAuthorize("#username == authentication.principal.username") + public String getMyRoles(String username) { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getAuthorities().stream().map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); + } + + @PostAuthorize("#username == authentication.principal.username") + public String getMyRoles2(String username) { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getAuthorities().stream().map(auth -> auth.getAuthority()).collect(Collectors.joining(",")); + } + + @PostAuthorize("returnObject.username == authentication.principal.nickName") + public CustomUser loadUserDetail(String username) { + return userRoleRepository.loadUserByUserName(username); + } + + @PreFilter("filterObject != authentication.principal.username") + public String joinUsernames(List usernames) { + return usernames.stream().collect(Collectors.joining(";")); + } + + @PreFilter(value = "filterObject != authentication.principal.username", filterTarget = "usernames") + public String joinUsernamesAndRoles(List usernames, List roles) { + return usernames.stream().collect(Collectors.joining(";")) + ":" + roles.stream().collect(Collectors.joining(";")); + } + + @PostFilter("filterObject != authentication.principal.username") + public List getAllUsernamesExceptCurrent() { + return userRoleRepository.getAllUsernames(); + } + + @IsViewer + public String getUsername4() { + SecurityContext securityContext = SecurityContextHolder.getContext(); + return securityContext.getAuthentication().getName(); + } + + @PreAuthorize("#username == authentication.principal.username") + @PostAuthorize("returnObject.username == authentication.principal.nickName") + public CustomUser securedLoadUserDetail(String username) { + return userRoleRepository.loadUserByUserName(username); + } + +} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java new file mode 100644 index 0000000000..502fd50c46 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java @@ -0,0 +1,49 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.*; + +import org.baeldung.methodsecurity.service.SystemService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +public class TestClassLevelSecurity { + + @Autowired + SystemService systemService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithMockUser(username="john",roles={"ADMIN"}) + public void givenRoleAdmin_whenCallGetSystemYear_return2017(){ + String systemYear = systemService.getSystemYear(); + assertEquals("2017",systemYear); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="john",roles={"VIEWER"}) + public void givenRoleViewer_whenCallGetSystemYear_returnAccessDenied(){ + String systemYear = systemService.getSystemYear(); + assertEquals("2017",systemYear); + } + + @Test + @WithMockUser(username="john",roles={"ADMIN"}) + public void givenRoleAdmin_whenCallGetSystemDate_returnDate(){ + String systemYear = systemService.getSystemDate(); + assertEquals("31-12-2017",systemYear); + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java new file mode 100644 index 0000000000..309ee3076d --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java @@ -0,0 +1,176 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.methodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.test.context.support.WithAnonymousUser; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +public class TestMethodSecurity { + + @Autowired + UserRoleService userRoleService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } + + @Test(expected = AuthenticationCredentialsNotFoundException.class) + public void givenNoSecurity_whenCallGetUsername_thenReturnException() { + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username = "john", roles = { "EDITOR" }) + public void givenUsernameJohn_whenCallIsValidUsername_thenReturnTrue() { + boolean isValid = userRoleService.isValidUsername("john"); + assertEquals(true, isValid); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN" }) + public void givenRoleAdmin_whenCallGetUsername_thenReturnAccessDenied() { + userRoleService.getUsername(); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "USER" }) + public void givenRoleUser_whenCallGetUsername2_thenReturnAccessDenied() { + userRoleService.getUsername2(); + } + + @Test + @WithMockUser(username = "john", roles = { "VIEWER", "EDITOR" }) + public void givenRoleViewer_whenCallGetUsername2_thenReturnUsername() { + String userName = userRoleService.getUsername2(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenUsernameJerry_whenCallIsValidUsername2_thenReturnFalse() { + boolean isValid = userRoleService.isValidUsername2("jerry"); + assertEquals(false, isValid); + } + + @Test + @WithMockUser(username = "JOHN", authorities = { "SYS_ADMIN" }) + public void givenAuthoritySysAdmin_whenCallGetUsernameInLowerCase_thenReturnUsername() { + String username = userRoleService.getUsernameLC(); + assertEquals("john", username); + } + + @Test + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJohn_whenCallGetMyRolesWithJohn_thenReturnRoles() { + String roles = userRoleService.getMyRoles("john"); + assertEquals("ROLE_ADMIN,ROLE_USER,ROLE_VIEWER", roles); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJane_whenCallGetMyRolesWithJane_thenAccessDenied() { + userRoleService.getMyRoles("jane"); + } + + @Test + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJohn_whenCallGetMyRoles2WithJohn_thenReturnRoles() { + String roles = userRoleService.getMyRoles2("john"); + assertEquals("ROLE_ADMIN,ROLE_USER,ROLE_VIEWER", roles); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john", roles = { "ADMIN", "USER", "VIEWER" }) + public void givenUserJane_whenCallGetMyRoles2WithJane_thenAccessDenied() { + userRoleService.getMyRoles2("jane"); + } + + @Test(expected = AccessDeniedException.class) + @WithAnonymousUser + public void givenAnomynousUser_whenCallGetUsername_thenAccessDenied() { + userRoleService.getUsername(); + } + + @Test + @WithMockJohnViewer + public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername() { + String userName = userRoleService.getUsername(); + assertEquals("john", userName); + } + + @Test + @WithMockUser(username = "jane") + public void givenListContainCurrentUsername_whenJoinUsernames_thenReturnUsernames() { + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + String containCurrentUser = userRoleService.joinUsernames(usernames); + assertEquals("john;jack", containCurrentUser); + } + + @Test + @WithMockUser(username = "john") + public void givenListContainCurrentUsername_whenCallJoinUsernamesAndRoles_thenReturnUsernameAndRoles() { + List usernames = new ArrayList<>(); + usernames.add("jane"); + usernames.add("john"); + usernames.add("jack"); + + List roles = new ArrayList<>(); + roles.add("ROLE_ADMIN"); + roles.add("ROLE_TEST"); + + String containCurrentUser = userRoleService.joinUsernamesAndRoles(usernames, roles); + assertEquals("jane;jack:ROLE_ADMIN;ROLE_TEST", containCurrentUser); + } + + @Test + @WithMockUser(username = "john") + public void givenUserJohn_whenCallGetAllUsernamesExceptCurrent_thenReturnOtherusernames() { + List others = userRoleService.getAllUsernamesExceptCurrent(); + assertEquals(2, others.size()); + assertTrue(others.contains("jane")); + assertTrue(others.contains("jack")); + } + + @Test + @WithMockUser(username = "john", roles = { "VIEWER" }) + public void givenRoleViewer_whenCallGetUsername4_thenReturnUsername() { + String userName = userRoleService.getUsername4(); + assertEquals("john", userName); + } + + @Test(expected = AccessDeniedException.class) + @WithMockUser(username = "john") + public void givenDefaultRole_whenCallGetUsername4_thenAccessDenied() { + userRoleService.getUsername4(); + } + +} \ No newline at end of file diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java new file mode 100644 index 0000000000..4df1af8ca9 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java @@ -0,0 +1,34 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.methodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +@WithMockUser(username = "john", roles = { "VIEWER" }) +public class TestWithMockUserAtClassLevel { + + @Test + public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { + String currentUserName = userService.getUsername(); + assertEquals("john", currentUserName); + } + + @Autowired + UserRoleService userService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java new file mode 100644 index 0000000000..3ef5996554 --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java @@ -0,0 +1,56 @@ +package org.baeldung.methodsecurity; + +import static org.junit.Assert.assertEquals; + +import org.baeldung.methodsecurity.entity.CustomUser; +import org.baeldung.methodsecurity.service.UserRoleService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration +public class TestWithUserDetails { + + @Autowired + UserRoleService userService; + + @Configuration + @ComponentScan("org.baeldung.methodsecurity.*") + public static class SpringConfig { + + } + + @Test + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void whenJohn_callLoadUserDetail_thenOK() { + CustomUser user = userService.loadUserDetail("jane"); + assertEquals("jane", user.getNickName()); + } + + @Test + @WithUserDetails(value = "jane", userDetailsServiceBeanName = "userDetailService") + public void givenJane_callSecuredLoadUserDetailWithJane_thenOK() { + CustomUser user = userService.securedLoadUserDetail("jane"); + assertEquals("jane", user.getNickName()); + assertEquals("jane", user.getUsername()); + } + + @Test(expected = AccessDeniedException.class) + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJane_thenAccessDenied() { + userService.securedLoadUserDetail("jane"); + } + + @Test(expected = AccessDeniedException.class) + @WithUserDetails(value = "john", userDetailsServiceBeanName = "userDetailService") + public void givenJohn_callSecuredLoadUserDetailWithJohn_thenAccessDenied() { + userService.securedLoadUserDetail("john"); + } +} diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java b/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java new file mode 100644 index 0000000000..5e1e882f3d --- /dev/null +++ b/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java @@ -0,0 +1,10 @@ +package org.baeldung.methodsecurity; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.springframework.security.test.context.support.WithMockUser; + +@Retention(RetentionPolicy.RUNTIME) +@WithMockUser(value="john",roles="VIEWER") +public @interface WithMockJohnViewer { } \ No newline at end of file diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index 3a8bc1f3aa..b717a1366d 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -31,7 +31,6 @@ org.springframework.boot spring-boot-starter-tomcat - provided @@ -122,6 +121,25 @@ jstl-api ${jstl.version} + + + org.springframework.security + spring-security-acl + + + org.springframework.security + spring-security-config + + + org.springframework + spring-context-support + + + net.sf.ehcache + ehcache-core + 2.6.11 + jar + diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java index b3c98c3e71..8a40744bdc 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -5,12 +5,13 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration -@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleauthproviders.*"), - @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*") }) +@ComponentScan({ "org.baeldung.config", "org.baeldung.persistence", "org.baeldung.security", "org.baeldung.web" }) +// @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleauthproviders.*"), +// @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*"), +// @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.rolesauthorities.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.acl.*") }) public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/ACLContext.java b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/ACLContext.java new file mode 100644 index 0000000000..63a4ea58ef --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/ACLContext.java @@ -0,0 +1,80 @@ +package org.baeldung.acl.config; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cache.ehcache.EhCacheFactoryBean; +import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.acls.AclPermissionCacheOptimizer; +import org.springframework.security.acls.AclPermissionEvaluator; +import org.springframework.security.acls.domain.AclAuthorizationStrategy; +import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; +import org.springframework.security.acls.domain.ConsoleAuditLogger; +import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; +import org.springframework.security.acls.domain.EhCacheBasedAclCache; +import org.springframework.security.acls.jdbc.BasicLookupStrategy; +import org.springframework.security.acls.jdbc.JdbcMutableAclService; +import org.springframework.security.acls.jdbc.LookupStrategy; +import org.springframework.security.acls.model.PermissionGrantingStrategy; +import org.springframework.security.core.authority.SimpleGrantedAuthority; + +@Configuration +@EnableAutoConfiguration +public class ACLContext { + + @Autowired + DataSource dataSource; + + @Bean + public EhCacheBasedAclCache aclCache() { + return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); + } + + @Bean + public EhCacheFactoryBean aclEhCacheFactoryBean() { + EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); + ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); + ehCacheFactoryBean.setCacheName("aclCache"); + return ehCacheFactoryBean; + } + + @Bean + public EhCacheManagerFactoryBean aclCacheManager() { + return new EhCacheManagerFactoryBean(); + } + + @Bean + public PermissionGrantingStrategy permissionGrantingStrategy() { + return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()); + } + + @Bean + public AclAuthorizationStrategy aclAuthorizationStrategy() { + return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN")); + } + + @Bean + public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() { + DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); + AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService()); + expressionHandler.setPermissionEvaluator(permissionEvaluator); + expressionHandler.setPermissionCacheOptimizer(new AclPermissionCacheOptimizer(aclService())); + return expressionHandler; + } + + @Bean + public LookupStrategy lookupStrategy() { + return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger()); + } + + @Bean + public JdbcMutableAclService aclService() { + return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache()); + } + +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java new file mode 100644 index 0000000000..110c4a6d24 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/AclMethodSecurityConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.acl.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration { + + @Autowired + MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler; + + @Override + protected MethodSecurityExpressionHandler createExpressionHandler() { + return defaultMethodSecurityExpressionHandler; + } + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java new file mode 100644 index 0000000000..9b87efa92c --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/config/JPAPersistenceConfig.java @@ -0,0 +1,16 @@ +package org.baeldung.acl.config; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories(basePackages = "org.baeldung.acl.persistence.dao") +@PropertySource("classpath:org.baeldung.acl.datasource.properties") +@EntityScan(basePackages={ "org.baeldung.acl.persistence.entity" }) +public class JPAPersistenceConfig { + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java new file mode 100644 index 0000000000..8662c88d6c --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/dao/NoticeMessageRepository.java @@ -0,0 +1,24 @@ +package org.baeldung.acl.persistence.dao; + +import java.util.List; + +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PostAuthorize; +import org.springframework.security.access.prepost.PostFilter; +import org.springframework.security.access.prepost.PreAuthorize; + +public interface NoticeMessageRepository extends JpaRepository{ + + @PostFilter("hasPermission(filterObject, 'READ')") + List findAll(); + + @PostAuthorize("hasPermission(returnObject, 'READ')") + NoticeMessage findById(Integer id); + + @SuppressWarnings("unchecked") + @PreAuthorize("hasPermission(#noticeMessage, 'WRITE')") + NoticeMessage save(@Param("noticeMessage")NoticeMessage noticeMessage); + +} diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java new file mode 100644 index 0000000000..23f01a8edb --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/acl/persistence/entity/NoticeMessage.java @@ -0,0 +1,29 @@ +package org.baeldung.acl.persistence.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="system_message") +public class NoticeMessage { + + @Id + @Column + private Integer id; + @Column + private String content; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } +} \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/acl-data.sql b/spring-security-mvc-boot/src/main/resources/acl-data.sql new file mode 100644 index 0000000000..6c01eaacc2 --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/acl-data.sql @@ -0,0 +1,28 @@ +INSERT INTO system_message(id,content) VALUES (1,'First Level Message'); +INSERT INTO system_message(id,content) VALUES (2,'Second Level Message'); +INSERT INTO system_message(id,content) VALUES (3,'Third Level Message'); + +INSERT INTO acl_class (id, class) VALUES +(1, 'org.baeldung.acl.persistence.entity.NoticeMessage'); + +INSERT INTO acl_sid (id, principal, sid) VALUES +(1, 1, 'manager'), +(2, 1, 'hr'), +(3, 1, 'admin'), +(4, 0, 'ROLE_EDITOR'); + +INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES +(1, 1, 1, NULL, 3, 0), +(2, 1, 2, NULL, 3, 0), +(3, 1, 3, NULL, 3, 0) +; + +INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES +(1, 1, 1, 1, 1, 1, 1, 1), +(2, 1, 2, 1, 2, 1, 1, 1), +(3, 1, 3, 4, 1, 1, 1, 1), +(4, 2, 1, 2, 1, 1, 1, 1), +(5, 2, 2, 4, 1, 1, 1, 1), +(6, 3, 1, 4, 1, 1, 1, 1), +(7, 3, 2, 4, 2, 1, 1, 1) +; \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/acl-schema.sql b/spring-security-mvc-boot/src/main/resources/acl-schema.sql new file mode 100644 index 0000000000..58e9394b2b --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/acl-schema.sql @@ -0,0 +1,58 @@ +create table system_message (id integer not null, content varchar(255), primary key (id)); + +CREATE TABLE IF NOT EXISTS acl_sid ( + id bigint(20) NOT NULL AUTO_INCREMENT, + principal tinyint(1) NOT NULL, + sid varchar(100) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_1 (sid,principal) +); + +CREATE TABLE IF NOT EXISTS acl_class ( + id bigint(20) NOT NULL AUTO_INCREMENT, + class varchar(255) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_2 (class) +); + +CREATE TABLE IF NOT EXISTS acl_entry ( + id bigint(20) NOT NULL AUTO_INCREMENT, + acl_object_identity bigint(20) NOT NULL, + ace_order int(11) NOT NULL, + sid bigint(20) NOT NULL, + mask int(11) NOT NULL, + granting tinyint(1) NOT NULL, + audit_success tinyint(1) NOT NULL, + audit_failure tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_4 (acl_object_identity,ace_order) +); + +CREATE TABLE IF NOT EXISTS acl_object_identity ( + id bigint(20) NOT NULL AUTO_INCREMENT, + object_id_class bigint(20) NOT NULL, + object_id_identity bigint(20) NOT NULL, + parent_object bigint(20) DEFAULT NULL, + owner_sid bigint(20) DEFAULT NULL, + entries_inheriting tinyint(1) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY unique_uk_3 (object_id_class,object_id_identity) +); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity(id); + +ALTER TABLE acl_entry +ADD FOREIGN KEY (sid) REFERENCES acl_sid(id); + +-- +-- Constraints for table acl_object_identity +-- +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (object_id_class) REFERENCES acl_class (id); + +ALTER TABLE acl_object_identity +ADD FOREIGN KEY (owner_sid) REFERENCES acl_sid (id); \ No newline at end of file diff --git a/spring-security-mvc-boot/src/main/resources/org.baeldung.acl.datasource.properties b/spring-security-mvc-boot/src/main/resources/org.baeldung.acl.datasource.properties new file mode 100644 index 0000000000..739dd3f07c --- /dev/null +++ b/spring-security-mvc-boot/src/main/resources/org.baeldung.acl.datasource.properties @@ -0,0 +1,12 @@ +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= +spring.datasource.driverClassName=org.h2.Driver +spring.jpa.hibernate.ddl-auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect + +spring.h2.console.path=/myconsole +spring.h2.console.enabled=true +spring.datasource.initialize=true +spring.datasource.schema=classpath:acl-schema.sql +spring.datasource.data=classpath:acl-data.sql \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/SpringContextIntegrationTest.java new file mode 100644 index 0000000000..cf1ac7de89 --- /dev/null +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -0,0 +1,15 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class SpringContextIntegrationTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/acl/SpringAclIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/acl/SpringAclIntegrationTest.java new file mode 100644 index 0000000000..38e1a2a9e7 --- /dev/null +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/acl/SpringAclIntegrationTest.java @@ -0,0 +1,119 @@ +package org.baeldung.acl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.List; + +import org.baeldung.acl.persistence.dao.NoticeMessageRepository; +import org.baeldung.acl.persistence.entity.NoticeMessage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.test.context.support.DirtiesContextTestExecutionListener; +import org.springframework.test.context.transaction.TransactionalTestExecutionListener; +import org.springframework.test.context.web.ServletTestExecutionListener; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +@TestExecutionListeners(listeners={ServletTestExecutionListener.class, + DependencyInjectionTestExecutionListener.class, + DirtiesContextTestExecutionListener.class, + TransactionalTestExecutionListener.class, + WithSecurityContextTestExecutionListener.class}) +public class SpringAclIntegrationTest extends AbstractJUnit4SpringContextTests{ + + private static Integer FIRST_MESSAGE_ID = 1; + private static Integer SECOND_MESSAGE_ID = 2; + private static Integer THIRD_MESSAGE_ID = 3; + private static String EDITTED_CONTENT = "EDITED"; + + @Configuration + @ComponentScan("org.baeldung.acl.*") + public static class SpringConfig { + + } + + @Autowired + NoticeMessageRepository repo; + + @Test + @WithMockUser(username="manager") + public void givenUsernameManager_whenFindAllMessage_thenReturnFirstMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(1,details.size()); + assertEquals(FIRST_MESSAGE_ID,details.get(0).getId()); + } + + @Test + @WithMockUser(username="manager") + public void givenUsernameManager_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenOK(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + + NoticeMessage editedFirstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(editedFirstMessage); + assertEquals(FIRST_MESSAGE_ID,editedFirstMessage.getId()); + assertEquals(EDITTED_CONTENT,editedFirstMessage.getContent()); + } + + @Test + @WithMockUser(username="hr") + public void givenUsernameHr_whenFindMessageById2_thenOK(){ + NoticeMessage secondMessage = repo.findById(SECOND_MESSAGE_ID); + assertNotNull(secondMessage); + assertEquals(SECOND_MESSAGE_ID,secondMessage.getId()); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(username="hr") + public void givenUsernameHr_whenUpdateMessageWithId2_thenFail(){ + NoticeMessage secondMessage = new NoticeMessage(); + secondMessage.setId(SECOND_MESSAGE_ID); + secondMessage.setContent(EDITTED_CONTENT); + repo.save(secondMessage); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindAllMessage_thenReturnThreeMessage(){ + List details = repo.findAll(); + assertNotNull(details); + assertEquals(3,details.size()); + } + + @Test + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenUpdateThirdMessage_thenOK(){ + NoticeMessage thirdMessage = new NoticeMessage(); + thirdMessage.setId(THIRD_MESSAGE_ID); + thirdMessage.setContent(EDITTED_CONTENT); + repo.save(thirdMessage); + } + + @Test(expected=AccessDeniedException.class) + @WithMockUser(roles={"EDITOR"}) + public void givenRoleEditor_whenFindFirstMessageByIdAndUpdateFirstMessageContent_thenFail(){ + NoticeMessage firstMessage = repo.findById(FIRST_MESSAGE_ID); + assertNotNull(firstMessage); + assertEquals(FIRST_MESSAGE_ID,firstMessage.getId()); + firstMessage.setContent(EDITTED_CONTENT); + repo.save(firstMessage); + } +} + \ No newline at end of file diff --git a/spring-security-mvc-custom/README.md b/spring-security-mvc-custom/README.md index 2c0be4768e..ca0731a0c3 100644 --- a/spring-security-mvc-custom/README.md +++ b/spring-security-mvc-custom/README.md @@ -12,6 +12,7 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Introduction to Spring MVC HandlerInterceptor](http://www.baeldung.com/spring-mvc-handlerinterceptor) - [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](http://www.baeldung.com/spring-mvc-custom-handler-interceptor) - [A Guide to CSRF Protection in Spring Security](http://www.baeldung.com/spring-security-csrf) +- [How to Manually Authenticate User with Spring Security](http://www.baeldung.com/manually-set-user-authentication-spring-security) ### Build the Project ``` diff --git a/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java b/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java new file mode 100644 index 0000000000..c67a6f667e --- /dev/null +++ b/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/LoginController.java @@ -0,0 +1,43 @@ +package org.baeldung.web.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +@RequestMapping(value = "/custom") +public class LoginController { + + @Autowired + private AuthenticationManager authManager; + + public LoginController() { + super(); + } + + // API + + // custom login + + @RequestMapping(value = "/login", method = RequestMethod.POST) + public void login(@RequestParam("username") final String username, @RequestParam("password") final String password, final HttpServletRequest request) { + UsernamePasswordAuthenticationToken authReq = + new UsernamePasswordAuthenticationToken(username, password); + Authentication auth = authManager.authenticate(authReq); + SecurityContext sc = SecurityContextHolder.getContext(); + sc.setAuthentication(auth); + HttpSession session = request.getSession(true); + session.setAttribute("SPRING_SECURITY_CONTEXT", sc); + } + +} \ No newline at end of file diff --git a/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java b/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java new file mode 100644 index 0000000000..78f164c7f1 --- /dev/null +++ b/spring-security-mvc-custom/src/main/java/org/baeldung/web/controller/PrintUserController.java @@ -0,0 +1,27 @@ +package org.baeldung.web.controller; + +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping(value = "/custom") +public class PrintUserController { + + public PrintUserController() { + super(); + } + + // API + + // print user + + @RequestMapping(value = "/print", method = RequestMethod.GET) + public void printUser() { + SecurityContext sc = SecurityContextHolder.getContext(); + System.out.println("Logged User: "+sc.getAuthentication().getName()); + } + +} \ No newline at end of file diff --git a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java new file mode 100644 index 0000000000..874856095c --- /dev/null +++ b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityConfig.java @@ -0,0 +1,58 @@ +package org.baeldung.security.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.BeanIds; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class ManualSecurityConfig extends WebSecurityConfigurerAdapter { + + public ManualSecurityConfig() { + super(); + } + + // java config + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication().withUser("user1").password("user1Pass").authorities("ROLE_USER").and().withUser("admin").password("adminPass").authorities("ROLE_ADMIN"); + } + + @Override + public void configure(final WebSecurity web) throws Exception { + web.ignoring().antMatchers("/resources/**"); + } + + @Bean(name = BeanIds.AUTHENTICATION_MANAGER) + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + @Override + protected void configure(final HttpSecurity http) throws Exception { + // @formatter:off + http + .authorizeRequests() + .mvcMatchers("/custom/login").permitAll() + .anyRequest().authenticated() + .and() + .httpBasic() + .and() + .headers().cacheControl().disable() + .and() + .csrf().disable() + ; + // @formatter:on + } + +} diff --git a/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java new file mode 100644 index 0000000000..afc86bd74c --- /dev/null +++ b/spring-security-mvc-custom/src/test/java/org/baeldung/security/spring/ManualSecurityIntegrationTest.java @@ -0,0 +1,58 @@ +package org.baeldung.security.spring; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import javax.servlet.http.HttpSession; + +import org.baeldung.spring.MvcConfig; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = { MvcConfig.class, ManualSecurityConfig.class }) +public class ManualSecurityIntegrationTest { + + @Autowired + WebApplicationContext wac; + + private MockMvc mockMvc; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mockMvc = MockMvcBuilders.webAppContextSetup(wac).apply(SecurityMockMvcConfigurers.springSecurity()).build(); + } + + /** + * Execute custom login and access the endpoint + */ + @Test + public void whenLoginIsSuccessFulThenEndpointCanBeAccessedAndCurrentUserPrinted() throws Exception { + + mockMvc.perform(get("/custom/print")) + .andExpect(status().isUnauthorized()); + + HttpSession session = mockMvc.perform(post("/custom/login").param("username", "user1").param("password", "user1Pass")) + .andExpect(status().isOk()) + .andReturn() + .getRequest() + .getSession(); + + mockMvc.perform(get("/custom/print").session((MockHttpSession) session)) + .andExpect(status().is2xxSuccessful()); + } + +} diff --git a/spring-security-mvc-ldap/pom.xml b/spring-security-mvc-ldap/pom.xml index e6452ea70b..4b0b9525e4 100644 --- a/spring-security-mvc-ldap/pom.xml +++ b/spring-security-mvc-ldap/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-security-mvc-socket/pom.xml b/spring-security-mvc-socket/pom.xml index c1715d36d2..40d81649f5 100644 --- a/spring-security-mvc-socket/pom.xml +++ b/spring-security-mvc-socket/pom.xml @@ -151,7 +151,7 @@ maven-compiler-plugin - 3.1 + 3.7.0 1.8 1.8 diff --git a/spring-security-openid/pom.xml b/spring-security-openid/pom.xml index 2149334a5c..a3942a8423 100644 --- a/spring-security-openid/pom.xml +++ b/spring-security-openid/pom.xml @@ -11,12 +11,12 @@ spring-security-openid Spring OpenID sample project - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 - + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M7 + + @@ -31,19 +31,46 @@ org.springframework.boot spring-boot-starter-tomcat - provided org.springframework.security.oauth spring-security-oauth2 + 2.2.1.RELEASE org.springframework.security spring-security-jwt + 1.0.9.RELEASE + + + + com.auth0 + jwks-rsa + 0.3.0 - + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + diff --git a/spring-security-openid/src/main/java/org/baeldung/config/SpringOpenidApplication.java b/spring-security-openid/src/main/java/org/baeldung/config/SpringOpenidApplication.java index ed57088c56..1acdba0623 100644 --- a/spring-security-openid/src/main/java/org/baeldung/config/SpringOpenidApplication.java +++ b/spring-security-openid/src/main/java/org/baeldung/config/SpringOpenidApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class SpringOpenidApplication extends SpringBootServletInitializer { diff --git a/spring-security-openid/src/main/java/org/baeldung/security/OpenIdConnectFilter.java b/spring-security-openid/src/main/java/org/baeldung/security/OpenIdConnectFilter.java index c0970ab3cf..f12169cb27 100644 --- a/spring-security-openid/src/main/java/org/baeldung/security/OpenIdConnectFilter.java +++ b/spring-security-openid/src/main/java/org/baeldung/security/OpenIdConnectFilter.java @@ -1,12 +1,16 @@ package org.baeldung.security; import java.io.IOException; +import java.net.URL; +import java.security.interfaces.RSAPublicKey; +import java.util.Date; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -14,16 +18,28 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.jwt.Jwt; import org.springframework.security.jwt.JwtHelper; +import org.springframework.security.jwt.crypto.sign.RsaVerifier; import org.springframework.security.oauth2.client.OAuth2RestOperations; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.security.oauth2.common.OAuth2AccessToken; -import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; +import com.auth0.jwk.Jwk; +import com.auth0.jwk.JwkProvider; +import com.auth0.jwk.UrlJwkProvider; import com.fasterxml.jackson.databind.ObjectMapper; public class OpenIdConnectFilter extends AbstractAuthenticationProcessingFilter { + @Value("${google.clientId}") + private String clientId; + + @Value("${google.issuer}") + private String issuer; + + @Value("${google.jwkUrl}") + private String jwkUrl; + public OAuth2RestOperations restTemplate; public OpenIdConnectFilter(String defaultFilterProcessesUrl) { @@ -42,19 +58,35 @@ public class OpenIdConnectFilter extends AbstractAuthenticationProcessingFilter } try { final String idToken = accessToken.getAdditionalInformation().get("id_token").toString(); - final Jwt tokenDecoded = JwtHelper.decode(idToken); - System.out.println("===== : " + tokenDecoded.getClaims()); - + String kid = JwtHelper.headers(idToken) + .get("kid"); + final Jwt tokenDecoded = JwtHelper.decodeAndVerify(idToken, verifier(kid)); final Map authInfo = new ObjectMapper().readValue(tokenDecoded.getClaims(), Map.class); - + verifyClaims(authInfo); final OpenIdConnectUserDetails user = new OpenIdConnectUserDetails(authInfo, accessToken); return new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities()); - } catch (final InvalidTokenException e) { + } catch (final Exception e) { throw new BadCredentialsException("Could not obtain user details from token", e); } } + public void verifyClaims(Map claims) { + int exp = (int) claims.get("exp"); + Date expireDate = new Date(exp * 1000L); + Date now = new Date(); + if (expireDate.before(now) || !claims.get("iss").equals(issuer) || !claims.get("aud").equals(clientId)) { + throw new RuntimeException("Invalid claims"); + } + } + + + private RsaVerifier verifier(String kid) throws Exception { + JwkProvider provider = new UrlJwkProvider(new URL(jwkUrl)); + Jwk jwk = provider.get(kid); + return new RsaVerifier((RSAPublicKey) jwk.getPublicKey()); + } + public void setRestTemplate(OAuth2RestTemplate restTemplate2) { restTemplate = restTemplate2; diff --git a/spring-security-openid/src/main/resources/application.properties.sample.properties b/spring-security-openid/src/main/resources/application.properties.sample.properties index 3b4f7716f0..49022bf280 100644 --- a/spring-security-openid/src/main/resources/application.properties.sample.properties +++ b/spring-security-openid/src/main/resources/application.properties.sample.properties @@ -3,4 +3,6 @@ google.clientId=TODO google.clientSecret=TODO google.accessTokenUri=https://www.googleapis.com/oauth2/v3/token google.userAuthorizationUri=https://accounts.google.com/o/oauth2/auth -google.redirectUri=http://localhost:8081/google-login \ No newline at end of file +google.redirectUri=http://localhost:8081/google-login +google.issuer=accounts.google.com +google.jwkUrl=https://www.googleapis.com/oauth2/v2/certs \ No newline at end of file diff --git a/spring-security-rest-custom/pom.xml b/spring-security-rest-custom/pom.xml index 77a58a56d8..746ddb6615 100644 --- a/spring-security-rest-custom/pom.xml +++ b/spring-security-rest-custom/pom.xml @@ -9,10 +9,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-security-stormpath/pom.xml b/spring-security-stormpath/pom.xml index 982c677bf5..060f8a553d 100644 --- a/spring-security-stormpath/pom.xml +++ b/spring-security-stormpath/pom.xml @@ -24,10 +24,10 @@ - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-security-x509/pom.xml b/spring-security-x509/pom.xml index 77830ebe5a..6225f73ebc 100644 --- a/spring-security-x509/pom.xml +++ b/spring-security-x509/pom.xml @@ -15,10 +15,10 @@ - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-session/pom.xml b/spring-session/pom.xml index bb644c8b2e..b62d814665 100644 --- a/spring-session/pom.xml +++ b/spring-session/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index dda5e09a26..aac0084720 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -9,10 +9,10 @@ jar - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-social-login/pom.xml b/spring-social-login/pom.xml index 0ca04ac298..50e2abfbfc 100644 --- a/spring-social-login/pom.xml +++ b/spring-social-login/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index fb25a888fd..fca3e6351d 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -118,10 +118,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.7.0 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/BuildConfig.java b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/BuildConfig.java new file mode 100644 index 0000000000..85233bc278 --- /dev/null +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package com.baeldung.petstore.client.invoker; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/Manifest.java b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/Manifest.java new file mode 100644 index 0000000000..06c202e733 --- /dev/null +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package com.baeldung.petstore.client.invoker; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/R.java b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/R.java new file mode 100644 index 0000000000..41e2b545fb --- /dev/null +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/src/main/gen/com/baeldung/petstore/client/invoker/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package com.baeldung.petstore.client.invoker; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index f42fc5c2e2..b7b898237f 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -9,7 +9,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.6.RELEASE + 1.5.10.RELEASE diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index 2ab506f667..2b26d939a5 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -80,7 +80,7 @@ **/JdbcTest.java **/*LiveTest.java - true + diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index e1a551bc84..ca9cbc765d 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-4 + parent-boot-5 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-4 + ../parent-boot-5 diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java index 1e35eff551..9f1d2e162b 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java +++ b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.web.SpringBootServletInitializer; +import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class ResourceServerApplication extends SpringBootServletInitializer { diff --git a/struts2/README.md b/struts-2/README.md similarity index 100% rename from struts2/README.md rename to struts-2/README.md diff --git a/struts2/WebContent/WEB-INF/web.xml b/struts-2/WebContent/WEB-INF/web.xml similarity index 100% rename from struts2/WebContent/WEB-INF/web.xml rename to struts-2/WebContent/WEB-INF/web.xml diff --git a/struts2/WebContent/input.jsp b/struts-2/WebContent/input.jsp similarity index 100% rename from struts2/WebContent/input.jsp rename to struts-2/WebContent/input.jsp diff --git a/struts2/WebContent/result.jsp b/struts-2/WebContent/result.jsp similarity index 100% rename from struts2/WebContent/result.jsp rename to struts-2/WebContent/result.jsp diff --git a/struts2/pom.xml b/struts-2/pom.xml similarity index 100% rename from struts2/pom.xml rename to struts-2/pom.xml diff --git a/struts2/src/main/java/com/baeldung/struts/CarAction.java b/struts-2/src/main/java/com/baeldung/struts/CarAction.java similarity index 100% rename from struts2/src/main/java/com/baeldung/struts/CarAction.java rename to struts-2/src/main/java/com/baeldung/struts/CarAction.java diff --git a/struts2/src/main/java/com/baeldung/struts/CarMessageService.java b/struts-2/src/main/java/com/baeldung/struts/CarMessageService.java similarity index 100% rename from struts2/src/main/java/com/baeldung/struts/CarMessageService.java rename to struts-2/src/main/java/com/baeldung/struts/CarMessageService.java diff --git a/struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java b/struts-2/src/test/java/com/baeldung/struts/test/CarActionTest.java similarity index 100% rename from struts2/src/test/java/com/baeldung/struts/test/CarActionTest.java rename to struts-2/src/test/java/com/baeldung/struts/test/CarActionTest.java diff --git a/testing-modules/README.md b/testing-modules/README.md new file mode 100644 index 0000000000..ccf63a9815 --- /dev/null +++ b/testing-modules/README.md @@ -0,0 +1,6 @@ + +## Testing Modules + +### Relevant Articles: + +- [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) diff --git a/gatling/README.md b/testing-modules/gatling/README.md similarity index 100% rename from gatling/README.md rename to testing-modules/gatling/README.md diff --git a/gatling/pom.xml b/testing-modules/gatling/pom.xml similarity index 100% rename from gatling/pom.xml rename to testing-modules/gatling/pom.xml diff --git a/gatling/src/test/resources/gatling.conf b/testing-modules/gatling/src/test/resources/gatling.conf similarity index 100% rename from gatling/src/test/resources/gatling.conf rename to testing-modules/gatling/src/test/resources/gatling.conf diff --git a/gatling/src/test/resources/logback.xml b/testing-modules/gatling/src/test/resources/logback.xml similarity index 100% rename from gatling/src/test/resources/logback.xml rename to testing-modules/gatling/src/test/resources/logback.xml diff --git a/gatling/src/test/resources/recorder.conf b/testing-modules/gatling/src/test/resources/recorder.conf similarity index 100% rename from gatling/src/test/resources/recorder.conf rename to testing-modules/gatling/src/test/resources/recorder.conf diff --git a/gatling/src/test/scala/Engine.scala b/testing-modules/gatling/src/test/scala/Engine.scala similarity index 100% rename from gatling/src/test/scala/Engine.scala rename to testing-modules/gatling/src/test/scala/Engine.scala diff --git a/gatling/src/test/scala/IDEPathHelper.scala b/testing-modules/gatling/src/test/scala/IDEPathHelper.scala similarity index 100% rename from gatling/src/test/scala/IDEPathHelper.scala rename to testing-modules/gatling/src/test/scala/IDEPathHelper.scala diff --git a/gatling/src/test/scala/Recorder.scala b/testing-modules/gatling/src/test/scala/Recorder.scala similarity index 100% rename from gatling/src/test/scala/Recorder.scala rename to testing-modules/gatling/src/test/scala/Recorder.scala diff --git a/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala b/testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala similarity index 100% rename from gatling/src/test/scala/org/baeldung/RecordedSimulation.scala rename to testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala diff --git a/groovy-spock/README.md b/testing-modules/groovy-spock/README.md similarity index 100% rename from groovy-spock/README.md rename to testing-modules/groovy-spock/README.md diff --git a/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml similarity index 97% rename from groovy-spock/pom.xml rename to testing-modules/groovy-spock/pom.xml index d9b51c5e1a..3d67657224 100644 --- a/groovy-spock/pom.xml +++ b/testing-modules/groovy-spock/pom.xml @@ -17,6 +17,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/groovy-spock/src/test/groovy/FirstSpecification.groovy b/testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy similarity index 100% rename from groovy-spock/src/test/groovy/FirstSpecification.groovy rename to testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy diff --git a/groovy-spock/src/test/groovy/Notifier.groovy b/testing-modules/groovy-spock/src/test/groovy/Notifier.groovy similarity index 100% rename from groovy-spock/src/test/groovy/Notifier.groovy rename to testing-modules/groovy-spock/src/test/groovy/Notifier.groovy diff --git a/groovy-spock/src/test/groovy/PaymentGateway.groovy b/testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy similarity index 100% rename from groovy-spock/src/test/groovy/PaymentGateway.groovy rename to testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md new file mode 100644 index 0000000000..ed429de489 --- /dev/null +++ b/testing-modules/junit-5/README.md @@ -0,0 +1,11 @@ +### Relevant Articles: +- [The Basics of JUnit 5 – A Preview](http://www.baeldung.com/junit-5-preview) +- [A Guide to JUnit 5](http://www.baeldung.com/junit-5) +- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) +- [A Guide to @RepeatedTest in Junit 5](http://www.baeldung.com/junit-5-repeated-test) +- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) +- [A Guied to JUnit 5 Extensions](http://www.baeldung.com/junit-5-extensions) +- [Inject Parameters into JUnit Jupiter Unit Tests](http://www.baeldung.com/junit-5-parameters) +- [Mockito and JUnit 5 – Using ExtendWith](http://www.baeldung.com/mockito-junit-5-extension) +- [JUnit 5 – @RunWith](http://www.baeldung.com/junit-5-runwith) +- [JUnit 5 @Test Annotation](http://www.baeldung.com/junit-5-test-annotation) diff --git a/junit5/pom.xml b/testing-modules/junit-5/pom.xml similarity index 94% rename from junit5/pom.xml rename to testing-modules/junit-5/pom.xml index b8a7622b3d..28a29d8545 100644 --- a/junit5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -4,29 +4,30 @@ 4.0.0 - junit5 + junit-5 1.0-SNAPSHOT - junit5 + junit-5 Intro to JUnit 5 com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ UTF-8 1.8 - 5.0.1 + 5.1.0 1.0.1 4.12.1 2.8.2 1.4.196 2.11.0 - 3.6.0 + 3.7.0 2.19.1 4.12 5.0.1.RELEASE @@ -126,4 +127,4 @@ - \ No newline at end of file + diff --git a/junit5/src/main/java/com/baeldung/junit5/Greetings.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/Greetings.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/Greetings.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/Greetings.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java new file mode 100644 index 0000000000..48730fd844 --- /dev/null +++ b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/bean/NumbersBean.java @@ -0,0 +1,22 @@ +package com.baeldung.junit5.bean; + +/** + * Bean that contains utility methods to work with numbers. + * + * @author Donato Rimenti + * + */ +public class NumbersBean { + + /** + * Returns true if a number is even, false otherwise. + * + * @param number + * the number to check + * @return true if the argument is even, false otherwise + */ + public boolean isNumberEven(int number) { + return number % 2 == 0; + } + +} diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/User.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/User.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java diff --git a/junit5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java similarity index 100% rename from junit5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java new file mode 100644 index 0000000000..79ba882205 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java @@ -0,0 +1,173 @@ +package com.baeldung; + +import static java.time.Duration.ofSeconds; +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.function.BooleanSupplier; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +/** + * Unit test that demonstrate the different assertions available within JUnit 4 + */ +public class AssertionUnitTest { + + @Test + public void whenAssertingArraysEquality_thenEqual() { + char[] expected = {'J', 'u', 'p', 'i', 't', 'e', 'r'}; + char[] actual = "Jupiter".toCharArray(); + + assertArrayEquals(expected, actual, "Arrays should be equal"); + } + + @Test + public void whenAssertingEquality_thenEqual() { + float square = 2 * 2; + float rectangle = 2 * 2; + + assertEquals(square, rectangle); + } + + @Test + public void whenAssertingEqualityWithDelta_thenEqual() { + float square = 2 * 2; + float rectangle = 3 * 2; + float delta = 2; + + assertEquals(square, rectangle, delta); + } + + @Test + public void whenAssertingConditions_thenVerified() { + assertTrue(5 > 4, "5 is greater the 4"); + assertTrue(null == null, "null is equal to null"); + } + + @Test + public void whenAssertingNull_thenTrue() { + Object cat = null; + + assertNull(cat, () -> "The cat should be null"); + } + + @Test + public void whenAssertingNotNull_thenTrue() { + Object dog = new Object(); + + assertNotNull(dog, () -> "The dog should not be null"); + } + + @Test + public void whenAssertingSameObject_thenSuccessfull() { + String language = "Java"; + Optional optional = Optional.of(language); + + assertSame(language, optional.get()); + } + + @Test + public void givenBooleanSupplier_whenAssertingCondition_thenVerified() { + BooleanSupplier condition = () -> 5 > 6; + + assertFalse(condition, "5 is not greater then 6"); + } + + @Test + @Disabled + public void whenFailingATest_thenFailed() { + // Test not completed + fail("FAIL - test not completed"); + } + + @Test + public void givenMultipleAssertion_whenAssertingAll_thenOK() { + assertAll( + "heading", + () -> assertEquals(4, 2 * 2, "4 is 2 times 2"), + () -> assertEquals("java", "JAVA".toLowerCase()), + () -> assertEquals(null, null, "null is equal to null") + ); + } + + @Test + public void givenTwoLists_whenAssertingIterables_thenEquals() { + Iterable al = new ArrayList<>(asList("Java", "Junit", "Test")); + Iterable ll = new LinkedList<>(asList("Java", "Junit", "Test")); + + assertIterableEquals(al, ll); + } + + @Test + public void whenAssertingTimeout_thenNotExceeded() { + assertTimeout( + ofSeconds(2), + () -> { + // code that requires less then 2 minutes to execute + Thread.sleep(1000); + } + ); + } + + @Test + public void whenAssertingTimeoutPreemptively_thenNotExceeded() { + assertTimeoutPreemptively( + ofSeconds(2), + () -> { + // code that requires less then 2 minutes to execute + Thread.sleep(1000); + } + ); + } + + @Test + public void whenAssertingEquality_thenNotEqual() { + Integer value = 5; // result of an algorithm + + assertNotEquals(0, value, "The result cannot be 0"); + } + + @Test + public void whenAssertingEqualityListOfStrings_thenEqual() { + List expected = asList("Java", "\\d+", "JUnit"); + List actual = asList("Java", "11", "JUnit"); + + assertLinesMatch(expected, actual); + } + + @Test + void whenAssertingException_thenThrown() { + Throwable exception = assertThrows( + IllegalArgumentException.class, + () -> { + throw new IllegalArgumentException("Exception message"); + } + ); + assertEquals("Exception message", exception.getMessage()); + } + + @Test + public void testConvertToDoubleThrowException() { + String age = "eighteen"; + assertThrows(NumberFormatException.class, () -> { + convertToInt(age); + }); + + assertThrows(NumberFormatException.class, () -> { + convertToInt(age); + }); + } + + private static Integer convertToInt(String str) { + if (str == null) { + return null; + } + return Integer.valueOf(str); + } + +} diff --git a/junit5/src/test/java/com/baeldung/AssumptionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/AssumptionUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/AssumptionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/AssumptionUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/DynamicTestsExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java similarity index 100% rename from junit5/src/test/java/com/baeldung/DynamicTestsExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java diff --git a/junit5/src/test/java/com/baeldung/EmployeesTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/EmployeesTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/EmployeesTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/EmployeesTest.java diff --git a/junit5/src/test/java/com/baeldung/ExceptionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/ExceptionUnitTest.java similarity index 57% rename from junit5/src/test/java/com/baeldung/ExceptionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/ExceptionUnitTest.java index bd57f5b3cb..440c3e40ab 100644 --- a/junit5/src/test/java/com/baeldung/ExceptionUnitTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/ExceptionUnitTest.java @@ -3,7 +3,12 @@ package com.baeldung; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.ConcurrentModificationException; +import java.util.HashMap; +import java.util.Map; + import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; public class ExceptionUnitTest { @@ -22,4 +27,14 @@ public class ExceptionUnitTest { Integer.valueOf(str); }); } + + @Test + public void whenModifyMapDuringIteration_thenThrowExecption() { + Map hashmap = new HashMap<>(); + hashmap.put(1, "One"); + hashmap.put(2, "Two"); + + Executable executable = () -> hashmap.forEach((key, value) -> hashmap.remove(1)); + assertThrows(ConcurrentModificationException.class, executable); + } } diff --git a/junit5/src/test/java/com/baeldung/FirstUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/FirstUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/FirstUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/FirstUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/GreetingsTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/GreetingsTest.java similarity index 99% rename from junit5/src/test/java/com/baeldung/GreetingsTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/GreetingsTest.java index e894d5857c..efde4e7404 100644 --- a/junit5/src/test/java/com/baeldung/GreetingsTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/GreetingsTest.java @@ -16,4 +16,4 @@ public class GreetingsTest { assertTrue("Hello".equals(Greetings.sayHello())); } -} +} \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/LiveTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/LiveTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/LiveTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/LiveTest.java diff --git a/junit5/src/test/java/com/baeldung/NestedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/NestedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/RepeatedTestExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java similarity index 100% rename from junit5/src/test/java/com/baeldung/RepeatedTestExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java diff --git a/junit5/src/test/java/com/baeldung/StringUtils.java b/testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java similarity index 100% rename from junit5/src/test/java/com/baeldung/StringUtils.java rename to testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java diff --git a/junit5/src/test/java/com/baeldung/TaggedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/TaggedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/TestLauncher.java b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java similarity index 100% rename from junit5/src/test/java/com/baeldung/TestLauncher.java rename to testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java diff --git a/junit5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java similarity index 100% rename from junit5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java diff --git a/junit5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java diff --git a/junit5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java diff --git a/junit5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java diff --git a/junit5/src/test/java/com/baeldung/extensions/LoggingExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/extensions/LoggingExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java diff --git a/junit5/src/test/java/com/baeldung/helpers/Employee.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java similarity index 100% rename from junit5/src/test/java/com/baeldung/helpers/Employee.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java diff --git a/junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java similarity index 100% rename from junit5/src/test/java/com/baeldung/helpers/EmployeeDao.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java diff --git a/junit5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java similarity index 100% rename from junit5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java diff --git a/junit5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java similarity index 100% rename from junit5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java new file mode 100644 index 0000000000..0297d010e8 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.junit5.bean.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.baeldung.junit5.bean.NumbersBean; + +/** + * Test class for {@link NumbersBean}. + * + * @author Donato Rimenti + * + */ +public class NumbersBeanUnitTest { + + /** + * The bean to test. + */ + private NumbersBean bean = new NumbersBean(); + + /** + * Tests that when an even number is passed to + * {@link NumbersBean#isNumberEven(int)}, true is returned. + */ + @Test + void givenEvenNumber_whenCheckingIsNumberEven_thenTrue() { + boolean result = bean.isNumberEven(8); + + Assertions.assertTrue(result); + } + + /** + * Tests that when an odd number is passed to + * {@link NumbersBean#isNumberEven(int)}, false is returned. + */ + @Test + void givenOddNumber_whenCheckingIsNumberEven_thenFalse() { + boolean result = bean.isNumberEven(3); + + Assertions.assertFalse(result); + } + +} diff --git a/junit5/src/test/java/com/baeldung/junit5/mockito/MockitoExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/MockitoExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/junit5/mockito/MockitoExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/MockitoExtension.java diff --git a/junit5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java diff --git a/junit5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java similarity index 99% rename from junit5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java index e7a8a1c1e7..3b89508c88 100644 --- a/junit5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/spring/GreetingsSpringTest.java @@ -18,4 +18,4 @@ public class GreetingsSpringTest { assertTrue("Hello".equals(Greetings.sayHello())); } -} +} \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java similarity index 100% rename from junit5/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java similarity index 100% rename from junit5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java diff --git a/junit5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java similarity index 100% rename from junit5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java diff --git a/junit5/src/test/java/com/baeldung/param/Person.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java similarity index 100% rename from junit5/src/test/java/com/baeldung/param/Person.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java diff --git a/junit5/src/test/java/com/baeldung/param/PersonValidator.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java similarity index 100% rename from junit5/src/test/java/com/baeldung/param/PersonValidator.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java diff --git a/junit5/src/test/java/com/baeldung/param/PersonValidatorTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorTest.java similarity index 100% rename from junit5/src/test/java/com/baeldung/param/PersonValidatorTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorTest.java diff --git a/junit5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java similarity index 100% rename from junit5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java diff --git a/junit5/src/test/java/com/baeldung/suites/AllTests.java b/testing-modules/junit-5/src/test/java/com/baeldung/suites/AllTests.java similarity index 100% rename from junit5/src/test/java/com/baeldung/suites/AllTests.java rename to testing-modules/junit-5/src/test/java/com/baeldung/suites/AllTests.java diff --git a/junit5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension similarity index 100% rename from junit5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension rename to testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension diff --git a/junit5/src/test/resources/com/baeldung/extensions/application.properties b/testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties similarity index 100% rename from junit5/src/test/resources/com/baeldung/extensions/application.properties rename to testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties diff --git a/junit5/src/test/resources/com/baeldung/helpers/jdbc.properties b/testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties similarity index 100% rename from junit5/src/test/resources/com/baeldung/helpers/jdbc.properties rename to testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties diff --git a/mockito2/.gitignore b/testing-modules/mockito-2/.gitignore similarity index 100% rename from mockito2/.gitignore rename to testing-modules/mockito-2/.gitignore diff --git a/mockito2/README.md b/testing-modules/mockito-2/README.md similarity index 68% rename from mockito2/README.md rename to testing-modules/mockito-2/README.md index 49741c66d1..ee443df81a 100644 --- a/mockito2/README.md +++ b/testing-modules/mockito-2/README.md @@ -1,6 +1,7 @@ ### Relevant articles - [Mockito’s Java 8 Features](http://www.baeldung.com/mockito-2-java-8) +- [Lazy Verification with Mockito 2](http://www.baeldung.com/mockito-2-lazy-verification) ## Mockito 2 and Java 8 Tips diff --git a/mockito2/pom.xml b/testing-modules/mockito-2/pom.xml similarity index 96% rename from mockito2/pom.xml rename to testing-modules/mockito-2/pom.xml index a7c4683c30..2d119ae8af 100644 --- a/mockito2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.baeldung - mockito2 + mockito-2 0.0.1-SNAPSHOT jar mockito-2-with-java8 @@ -12,6 +12,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/mockito2/src/main/java/com/baeldung/mockito/java8/JobPosition.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java similarity index 100% rename from mockito2/src/main/java/com/baeldung/mockito/java8/JobPosition.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java diff --git a/mockito2/src/main/java/com/baeldung/mockito/java8/JobService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java similarity index 100% rename from mockito2/src/main/java/com/baeldung/mockito/java8/JobService.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java diff --git a/mockito2/src/main/java/com/baeldung/mockito/java8/Person.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java similarity index 100% rename from mockito2/src/main/java/com/baeldung/mockito/java8/Person.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java diff --git a/mockito2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java similarity index 100% rename from mockito2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java diff --git a/mockito2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java similarity index 100% rename from mockito2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java new file mode 100644 index 0000000000..43b39d6859 --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationTest.java @@ -0,0 +1,34 @@ +package com.baeldung.mockito.java8; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import java.util.List; + +import org.junit.Test; +import org.mockito.exceptions.base.MockitoAssertionError; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.VerificationCollector; + +public class LazyVerificationTest { + + @Test + public void whenLazilyVerified_thenReportsMultipleFailures() { + VerificationCollector collector = MockitoJUnit.collector() + .assertLazily(); + + List mockList = mock(List.class); + verify(mockList).add("one"); + verify(mockList).clear(); + + try { + collector.collectAndReport(); + } catch (MockitoAssertionError error) { + assertTrue(error.getMessage() + .contains("1. Wanted but not invoked:")); + assertTrue(error.getMessage() + .contains("2. Wanted but not invoked:")); + } + } +} diff --git a/mockito2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java similarity index 100% rename from mockito2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java diff --git a/testing-modules/mockito/.gitignore b/testing-modules/mockito/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/testing-modules/mockito/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/mockito/README.md b/testing-modules/mockito/README.md similarity index 69% rename from mockito/README.md rename to testing-modules/mockito/README.md index 2407a5c3c5..4bbc083d8c 100644 --- a/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -11,3 +11,6 @@ - [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods) - [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock) - [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions) +- [Mocking Void Methods with Mockito](http://www.baeldung.com/mockito-void-methods) +- [Mocking of Private Methods Using PowerMock](http://www.baeldung.com/powermock-private-method) +- [Mock Final Classes and Methods with Mockito](http://www.baeldung.com/mockito-final) diff --git a/mockito/pom.xml b/testing-modules/mockito/pom.xml similarity index 85% rename from mockito/pom.xml rename to testing-modules/mockito/pom.xml index 19dd2f6468..cdd73e6efe 100644 --- a/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -11,6 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ @@ -46,6 +47,13 @@ test + + org.hamcrest + java-hamcrest + ${hamcrest.version} + test + + @@ -66,6 +74,7 @@ 1.7.0 + 2.0.0.0 diff --git a/spring-jpa/src/main/resources/logback.xml b/testing-modules/mockito/src/main/resources/logback.xml similarity index 100% rename from spring-jpa/src/main/resources/logback.xml rename to testing-modules/mockito/src/main/resources/logback.xml diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorTest.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorTest.java diff --git a/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java similarity index 100% rename from mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java new file mode 100644 index 0000000000..9cc586fb84 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoTest.java @@ -0,0 +1,104 @@ +package org.baeldung.bddmockito; + +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; + + +public class BDDMockitoTest { + + PhoneBookService phoneBookService; + PhoneBookRepository phoneBookRepository; + + String momContactName = "Mom"; + String momPhoneNumber = "01234"; + String xContactName = "x"; + String tooLongPhoneNumber = "01111111111111"; + + @Before + public void init() { + phoneBookRepository = Mockito.mock(PhoneBookRepository.class); + phoneBookService = new PhoneBookService(phoneBookRepository); + } + + @Test + public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { + given(phoneBookRepository.contains(momContactName)).willReturn(true); + given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) + .will((InvocationOnMock invocation) -> { + if(invocation.getArgument(0).equals(momContactName)) { + return momPhoneNumber; + } else { + return null; + } + }); + + String phoneNumber = phoneBookService.search(momContactName); + + then(phoneBookRepository).should().contains(momContactName); + then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); + Assert.assertEquals(phoneNumber, momPhoneNumber); + } + + @Test + public void givenInvalidContactName_whenSearch_thenRetunNull() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + + String phoneNumber = phoneBookService.search(xContactName); + + then(phoneBookRepository).should().contains(xContactName); + then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); + Assert.assertEquals(phoneNumber, null); + } + + @Test + public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(momContactName, momPhoneNumber); + + verify(phoneBookRepository).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenEmptyPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(xContactName, ""); + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenLongPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + willThrow(new RuntimeException()) + .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); + + try { + phoneBookService.register(xContactName, tooLongPhoneNumber); + fail("Should throw exception"); + } catch (RuntimeException ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); + } + + @Test + public void givenExistentContactName_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)) + .willThrow(new RuntimeException("Name already exist")); + + try { + phoneBookService.register(momContactName, momPhoneNumber); + fail("Should throw exception"); + } catch(Exception ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java new file mode 100644 index 0000000000..b73a1d835c --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java @@ -0,0 +1,26 @@ +package org.baeldung.bddmockito; + +public interface PhoneBookRepository { + + /** + * Insert phone record + * @param name Contact name + * @param phone Phone number + */ + void insert(String name, String phone); + + /** + * Search for contact phone number + * @param name Contact name + * @return phone number + */ + String getPhoneNumberByContactName(String name); + + /** + * Check if the phonebook contains this contact + * @param name Contact name + * @return true if this contact name exists + */ + boolean contains(String name); + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java new file mode 100644 index 0000000000..645884af02 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java @@ -0,0 +1,34 @@ +package org.baeldung.bddmockito; + +public class PhoneBookService { + + private PhoneBookRepository phoneBookRepository; + + public PhoneBookService(PhoneBookRepository phoneBookRepository) { + this.phoneBookRepository = phoneBookRepository; + } + + /** + * Register a contact + * @param name Contact name + * @param phone Phone number + */ + public void register(String name, String phone) { + if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { + phoneBookRepository.insert(name, phone); + } + } + + /** + * Search for a phone number by contact name + * @param name Contact name + * @return Phone number + */ + public String search(String name) { + if(!name.isEmpty() && phoneBookRepository.contains(name)) { + return phoneBookRepository.getPhoneNumberByContactName(name); + } + return null; + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java new file mode 100644 index 0000000000..652e315651 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java @@ -0,0 +1,64 @@ +package org.baeldung.hamcrest; + +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.io.FileMatchers.aFileNamed; +import static org.hamcrest.io.FileMatchers.aFileWithAbsolutePath; +import static org.hamcrest.io.FileMatchers.aFileWithCanonicalPath; +import static org.hamcrest.io.FileMatchers.aFileWithSize; +import static org.hamcrest.io.FileMatchers.aReadableFile; +import static org.hamcrest.io.FileMatchers.aWritableFile; +import static org.hamcrest.io.FileMatchers.anExistingDirectory; +import static org.hamcrest.io.FileMatchers.anExistingFile; +import static org.hamcrest.io.FileMatchers.anExistingFileOrDirectory; +import static org.hamcrest.number.OrderingComparison.greaterThan; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.junit.Assert.assertThat; + +import java.io.File; + +import org.junit.Test; + +public class HamcrestFileUnitTest { + + @Test + public final void whenVerifyingFileName_thenCorrect() { + File file = new File("src/test/resources/test1.in"); + + assertThat(file, aFileNamed(equalToIgnoringCase("test1.in"))); + } + + @Test + public final void whenVerifyingFileOrDirExist_thenCorrect() { + File file = new File("src/test/resources/test1.in"); + File dir = new File("src/test/resources"); + + assertThat(file, anExistingFile()); + assertThat(dir, anExistingDirectory()); + assertThat(file, anExistingFileOrDirectory()); + assertThat(dir, anExistingFileOrDirectory()); + } + + @Test + public final void whenVerifyingFileIsReadableAndWritable_thenCorrect() { + File file = new File("src/test/resources/test1.in"); + + assertThat(file, aReadableFile()); + assertThat(file, aWritableFile()); + } + + @Test + public final void whenVerifyingFileSize_thenCorrect() { + File file = new File("src/test/resources/test1.in"); + + assertThat(file, aFileWithSize(11)); + assertThat(file, aFileWithSize(greaterThan(1L)));; + } + + @Test + public final void whenVerifyingFilePath_thenCorrect() { + File file = new File("src/test/resources/test1.in"); + + assertThat(file, aFileWithCanonicalPath(containsString("src/test/resources"))); + assertThat(file, aFileWithAbsolutePath(containsString("src/test/resources"))); + } +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java new file mode 100644 index 0000000000..fbba6b94d2 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java @@ -0,0 +1,178 @@ +package org.baeldung.hamcrest; + +import org.junit.Test; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.comparesEqualTo; +import static org.hamcrest.Matchers.notANumber; + +public class HamcrestNumberUnitTest { + + @Test + public void givenADouble_whenCloseTo_thenCorrect() { + double actual = 1.3; + double operand = 1; + double error = 0.5; + assertThat(actual, is(closeTo(operand, error))); + } + + @Test + public void givenADouble_whenNotCloseTo_thenCorrect() { + double actual = 1.6; + double operand = 1; + double error = 0.5; + assertThat(actual, is(not(closeTo(operand, error)))); + } + + @Test + public void givenABigDecimal_whenCloseTo_thenCorrect() { + BigDecimal actual = new BigDecimal("1.0003"); + BigDecimal operand = new BigDecimal("1"); + BigDecimal error = new BigDecimal("0.0005"); + assertThat(actual, is(closeTo(operand, error))); + } + + @Test + public void givenABigDecimal_whenNotCloseTo_thenCorrect() { + BigDecimal actual = new BigDecimal("1.0006"); + BigDecimal operand = new BigDecimal("1"); + BigDecimal error = new BigDecimal("0.0005"); + assertThat(actual, is(not(closeTo(operand, error)))); + } + + @Test + public void given5_whenComparesEqualTo5_thenCorrect() { + Integer five = 5; + assertThat(five, comparesEqualTo(five)); + } + + @Test + public void given5_whenNotComparesEqualTo7_thenCorrect() { + Integer seven = 7; + Integer five = 5; + assertThat(five, not(comparesEqualTo(seven))); + } + + @Test + public void given7_whenGreaterThan5_thenCorrect() { + Integer seven = 7; + Integer five = 5; + assertThat(seven, is(greaterThan(five))); + } + + @Test + public void given7_whenGreaterThanOrEqualTo5_thenCorrect() { + Integer seven = 7; + Integer five = 5; + assertThat(seven, is(greaterThanOrEqualTo(five))); + } + + @Test + public void given5_whenGreaterThanOrEqualTo5_thenCorrect() { + Integer five = 5; + assertThat(five, is(greaterThanOrEqualTo(five))); + } + + @Test + public void given3_whenLessThan5_thenCorrect() { + Integer three = 3; + Integer five = 5; + assertThat(three, is(lessThan(five))); + } + + @Test + public void given3_whenLessThanOrEqualTo5_thenCorrect() { + Integer three = 3; + Integer five = 5; + assertThat(three, is(lessThanOrEqualTo(five))); + } + + @Test + public void given5_whenLessThanOrEqualTo5_thenCorrect() { + Integer five = 5; + assertThat(five, is(lessThanOrEqualTo(five))); + } + + @Test + public void givenBenjamin_whenGreaterThanAmanda_thenCorrect() { + String amanda = "Amanda"; + String benjamin = "Benjamin"; + assertThat(benjamin, is(greaterThan(amanda))); + } + + @Test + public void givenAmanda_whenLessThanBenajmin_thenCorrect() { + String amanda = "Amanda"; + String benjamin = "Benjamin"; + assertThat(amanda, is(lessThan(benjamin))); + } + + @Test + public void givenToday_whenGreaterThanYesterday_thenCorrect() { + LocalDate today = LocalDate.now(); + LocalDate yesterday = today.minusDays(1); + assertThat(today, is(greaterThan(yesterday))); + } + + @Test + public void givenToday_whenLessThanTomorrow_thenCorrect() { + LocalDate today = LocalDate.now(); + LocalDate tomorrow = today.plusDays(1); + assertThat(today, is(lessThan(tomorrow))); + } + + @Test + public void givenAmanda_whenOlderThanBenjamin_thenCorrect() { + Person amanda = new Person("Amanda", 20); + Person benjamin = new Person("Benjamin", 18); + assertThat(amanda, is(greaterThan(benjamin))); + } + + @Test + public void givenBenjamin_whenYoungerThanAmanda_thenCorrect() { + Person amanda = new Person("Amanda", 20); + Person benjamin = new Person("Benjamin", 18); + assertThat(benjamin, is(lessThan(amanda))); + } + + class Person implements Comparable { + String name; + int age; + + public Person(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + @Override + public int compareTo(Person o) { + if (this.age == o.getAge()) return 0; + if (this.age > o.age) return 1; + else return -1; + } + } + + @Test + public void givenNaN_whenIsNotANumber_thenCorrect() { + double zero = 0d; + assertThat(zero / zero, is(notANumber())); + } +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java new file mode 100644 index 0000000000..e336b1bba3 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java @@ -0,0 +1,97 @@ +package org.baeldung.hamcrest; + +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringContains.containsStringIgnoringCase; +import static org.hamcrest.core.StringEndsWith.endsWith; +import static org.hamcrest.core.StringEndsWith.endsWithIgnoringCase; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.hamcrest.core.StringStartsWith.startsWithIgnoringCase; +import static org.hamcrest.text.IsBlankString.blankOrNullString; +import static org.hamcrest.text.IsBlankString.blankString; +import static org.hamcrest.text.IsEmptyString.emptyOrNullString; +import static org.hamcrest.text.IsEmptyString.emptyString; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace; +import static org.hamcrest.text.MatchesPattern.matchesPattern; +import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +public class HamcrestTextUnitTest { + + @Test + public final void whenTwoStringsAreEqual_thenCorrect() { + String first = "hello"; + String second = "Hello"; + + assertThat(first, equalToIgnoringCase(second)); + } + + @Test + public final void whenTwoStringsAreEqualWithWhiteSpace_thenCorrect() { + String first = "hello"; + String second = " Hello "; + + assertThat(first, equalToIgnoringWhiteSpace(second)); + } + + @Test + public final void whenStringIsBlank_thenCorrect() { + String first = " "; + String second = null; + + assertThat(first, blankString()); + assertThat(first, blankOrNullString()); + assertThat(second, blankOrNullString()); + } + + @Test + public final void whenStringIsEmpty_thenCorrect() { + String first = ""; + String second = null; + + assertThat(first, emptyString()); + assertThat(first, emptyOrNullString()); + assertThat(second, emptyOrNullString()); + } + + @Test + public final void whenStringMatchPattern_thenCorrect() { + String first = "hello"; + + assertThat(first, matchesPattern("[a-z]+")); + } + + @Test + public final void whenVerifyStringContains_thenCorrect() { + String first = "hello"; + + assertThat(first, containsString("lo")); + assertThat(first, containsStringIgnoringCase("EL")); + } + + @Test + public final void whenVerifyStringContainsInOrder_thenCorrect() { + String first = "hello"; + + assertThat(first, stringContainsInOrder("e","l","o")); + } + + @Test + public final void whenVerifyStringStartsWith_thenCorrect() { + String first = "hello"; + + assertThat(first, startsWith("he")); + assertThat(first, startsWithIgnoringCase("HEL")); + } + + @Test + public final void whenVerifyStringEndsWith_thenCorrect() { + String first = "hello"; + + assertThat(first, endsWith("lo")); + assertThat(first, endsWithIgnoringCase("LO")); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java new file mode 100644 index 0000000000..3824de619c --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java @@ -0,0 +1,10 @@ +package org.baeldung.mockito; + +public class FinalList extends MyList { + + @Override + public int size() { + return 1; + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java new file mode 100644 index 0000000000..5f064e1355 --- /dev/null +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java @@ -0,0 +1,35 @@ +package org.baeldung.mockito; + +import org.junit.Test; + +import static org.junit.Assert.assertNotEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class MockFinals { + + @Test + public void whenMockFinalClassMockWorks() { + + FinalList finalList = new FinalList(); + + FinalList mock = mock(FinalList.class); + when(mock.size()).thenReturn(2); + + assertNotEquals(mock.size(), finalList.size()); + + } + + @Test + public void whenMockFinalMethodMockWorks() { + + MyList myList = new MyList(); + + MyList mock = mock(MyList.class); + when(mock.finalMethod()).thenReturn(1); + + assertNotEquals(mock.finalMethod(), myList.finalMethod()); + } + + + } diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsTest.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsTest.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java similarity index 100% rename from mockito/src/test/java/org/baeldung/mockito/MyDictionary.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java diff --git a/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java similarity index 84% rename from mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java index 0b501225ad..4fcddb3164 100644 --- a/mockito/src/test/java/org/baeldung/mockito/MyList.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java @@ -19,4 +19,7 @@ class MyList extends AbstractList { // no-op } + final public int finalMethod() { + return 0; + } } diff --git a/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000..ca6ee9cea8 --- /dev/null +++ b/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/testing-modules/mockito/src/test/resources/test1.in b/testing-modules/mockito/src/test/resources/test1.in new file mode 100644 index 0000000000..70c379b63f --- /dev/null +++ b/testing-modules/mockito/src/test/resources/test1.in @@ -0,0 +1 @@ +Hello world \ No newline at end of file diff --git a/mocks/README.md b/testing-modules/mocks/README.md similarity index 82% rename from mocks/README.md rename to testing-modules/mocks/README.md index 15370b812b..d7b817c518 100644 --- a/mocks/README.md +++ b/testing-modules/mocks/README.md @@ -1,6 +1,5 @@ ## Relevant articles: -- [Introduction to MockServer](http://www.baeldung.com/mockserver) - [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage) - [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations) - [JMockit 101](http://www.baeldung.com/jmockit-101) diff --git a/mocks/jmockit/README.md b/testing-modules/mocks/jmockit/README.md similarity index 100% rename from mocks/jmockit/README.md rename to testing-modules/mocks/jmockit/README.md diff --git a/mocks/jmockit/pom.xml b/testing-modules/mocks/jmockit/pom.xml similarity index 94% rename from mocks/jmockit/pom.xml rename to testing-modules/mocks/jmockit/pom.xml index 173a981e09..d998cb6918 100644 --- a/mocks/jmockit/pom.xml +++ b/testing-modules/mocks/jmockit/pom.xml @@ -6,7 +6,7 @@ com.baeldung mocks 1.0.0-SNAPSHOT - ../pom.xml + ../ jmockit diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java similarity index 100% rename from mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java similarity index 100% rename from mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java similarity index 100% rename from mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java similarity index 100% rename from mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java similarity index 100% rename from mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java diff --git a/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java similarity index 100% rename from mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java diff --git a/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java similarity index 100% rename from mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java diff --git a/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java similarity index 100% rename from mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java diff --git a/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java similarity index 100% rename from mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java diff --git a/mocks/mock-comparisons/README.md b/testing-modules/mocks/mock-comparisons/README.md similarity index 100% rename from mocks/mock-comparisons/README.md rename to testing-modules/mocks/mock-comparisons/README.md diff --git a/mocks/mock-comparisons/pom.xml b/testing-modules/mocks/mock-comparisons/pom.xml similarity index 96% rename from mocks/mock-comparisons/pom.xml rename to testing-modules/mocks/mock-comparisons/pom.xml index 11bc59d710..84f1d20401 100644 --- a/mocks/mock-comparisons/pom.xml +++ b/testing-modules/mocks/mock-comparisons/pom.xml @@ -6,7 +6,7 @@ com.baeldung mocks 1.0.0-SNAPSHOT - ../pom.xml + ../ mock-comparisons diff --git a/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java similarity index 100% rename from mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java diff --git a/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java similarity index 100% rename from mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java diff --git a/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java similarity index 100% rename from mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java diff --git a/mocks/pom.xml b/testing-modules/mocks/pom.xml similarity index 92% rename from mocks/pom.xml rename to testing-modules/mocks/pom.xml index 84243a25d2..6473f07c13 100644 --- a/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -6,7 +6,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - ../pom.xml + ../../ mocks diff --git a/mockserver/README.md b/testing-modules/mockserver/README.md similarity index 100% rename from mockserver/README.md rename to testing-modules/mockserver/README.md diff --git a/mockserver/pom.xml b/testing-modules/mockserver/pom.xml similarity index 100% rename from mockserver/pom.xml rename to testing-modules/mockserver/pom.xml diff --git a/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java b/testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java similarity index 100% rename from mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java rename to testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java diff --git a/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java b/testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java similarity index 100% rename from mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java rename to testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java diff --git a/rest-assured/.gitignore b/testing-modules/rest-assured/.gitignore similarity index 100% rename from rest-assured/.gitignore rename to testing-modules/rest-assured/.gitignore diff --git a/rest-assured/README.md b/testing-modules/rest-assured/README.md similarity index 100% rename from rest-assured/README.md rename to testing-modules/rest-assured/README.md diff --git a/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml similarity index 99% rename from rest-assured/pom.xml rename to testing-modules/rest-assured/pom.xml index 3fca54c80f..1006e9a373 100644 --- a/rest-assured/pom.xml +++ b/testing-modules/rest-assured/pom.xml @@ -10,6 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java similarity index 100% rename from rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java new file mode 100644 index 0000000000..23fff6a129 --- /dev/null +++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java @@ -0,0 +1,139 @@ +package com.baeldung.restassured; + +import static io.restassured.RestAssured.given; +import static io.restassured.RestAssured.when; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.lessThan; +import static org.junit.Assert.assertEquals; +import io.restassured.RestAssured; +import io.restassured.http.Cookie; +import io.restassured.response.Response; + +import java.util.concurrent.TimeUnit; + +import org.junit.Before; +import org.junit.Test; + +public class RestAssuredAdvancedLiveTest { + + @Before + public void setup(){ + RestAssured.baseURI = "https://api.github.com"; + RestAssured.port = 443; + } + + @Test + public void whenMeasureResponseTime_thenOK(){ + Response response = RestAssured.get("/users/eugenp"); + long timeInMS = response.time(); + long timeInS = response.timeIn(TimeUnit.SECONDS); + + assertEquals(timeInS, timeInMS/1000); + } + + @Test + public void whenValidateResponseTime_thenSuccess(){ + when().get("/users/eugenp").then().time(lessThan(5000L)); + } + + @Test + public void whenValidateResponseTimeInSeconds_thenSuccess(){ + when().get("/users/eugenp").then().time(lessThan(5L),TimeUnit.SECONDS); + } + + //===== parameter + + @Test + public void whenUseQueryParam_thenOK(){ + given().queryParam("q", "john").when().get("/search/users").then().statusCode(200); + given().param("q", "john").when().get("/search/users").then().statusCode(200); + } + + @Test + public void whenUseMultipleQueryParam_thenOK(){ + int perPage = 20; + given().queryParam("q", "john").queryParam("per_page",perPage).when().get("/search/users").then().body("items.size()", is(perPage)); + given().queryParams("q", "john","per_page",perPage).when().get("/search/users").then().body("items.size()", is(perPage)); + } + + @Test + public void whenUseFormParam_thenSuccess(){ + given().log().all().formParams("username", "john","password","1234").post("/"); + given().log().all().params("username", "john","password","1234").post("/"); + } + + @Test + public void whenUsePathParam_thenOK(){ + given().pathParam("user", "eugenp").when().get("/users/{user}/repos").then().log().all().statusCode(200); + } + + @Test + public void whenUseMultiplePathParam_thenOK(){ + given().log().all().pathParams("owner", "eugenp","repo","tutorials").when().get("/repos/{owner}/{repo}").then().statusCode(200); + given().log().all().pathParams("owner", "eugenp").when().get("/repos/{owner}/{repo}","tutorials").then().statusCode(200); + } + + //===== header + + @Test + public void whenUseCustomHeader_thenOK(){ + given().header("User-Agent", "MyAppName").when().get("/users/eugenp").then().statusCode(200); + } + + @Test + public void whenUseMultipleHeaders_thenOK(){ + given().header("User-Agent", "MyAppName","Accept-Charset","utf-8").when().get("/users/eugenp").then().statusCode(200); + } + + //======= cookie + + @Test + public void whenUseCookie_thenOK(){ + given().cookie("session_id", "1234").when().get("/users/eugenp").then().statusCode(200); + } + + @Test + public void whenUseCookieBuilder_thenOK(){ + Cookie myCookie = new Cookie.Builder("session_id", "1234").setSecured(true).setComment("session id cookie").build(); + given().cookie(myCookie).when().get("/users/eugenp").then().statusCode(200); + } + + // ====== request + + @Test + public void whenRequestGet_thenOK(){ + when().request("GET", "/users/eugenp").then().statusCode(200); + } + + @Test + public void whenRequestHead_thenOK(){ + when().request("HEAD", "/users/eugenp").then().statusCode(200); + } + + //======= log + + @Test + public void whenLogRequest_thenOK(){ + given().log().all().when().get("/users/eugenp").then().statusCode(200); + } + + @Test + public void whenLogResponse_thenOK(){ + when().get("/repos/eugenp/tutorials").then().log().body().statusCode(200); + } + + @Test + public void whenLogResponseIfErrorOccurred_thenSuccess(){ + when().get("/users/eugenp").then().log().ifError(); + when().get("/users/eugenp").then().log().ifStatusCodeIsEqualTo(500); + when().get("/users/eugenp").then().log().ifStatusCodeMatches(greaterThan(200)); + } + + @Test + public void whenLogOnlyIfValidationFailed_thenSuccess(){ + when().get("/users/eugenp").then().log().ifValidationFails().statusCode(200); + given().log().ifValidationFails().when().get("/users/eugenp").then().statusCode(200); + } + +} diff --git a/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java similarity index 100% rename from rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java diff --git a/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java similarity index 100% rename from rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java diff --git a/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java similarity index 100% rename from rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java diff --git a/rest-assured/src/test/java/com/baeldung/restassured/Util.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java similarity index 100% rename from rest-assured/src/test/java/com/baeldung/restassured/Util.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java diff --git a/rest-assured/src/test/resources/employees.xml b/testing-modules/rest-assured/src/test/resources/employees.xml similarity index 100% rename from rest-assured/src/test/resources/employees.xml rename to testing-modules/rest-assured/src/test/resources/employees.xml diff --git a/rest-assured/src/test/resources/event_0.json b/testing-modules/rest-assured/src/test/resources/event_0.json similarity index 100% rename from rest-assured/src/test/resources/event_0.json rename to testing-modules/rest-assured/src/test/resources/event_0.json diff --git a/testing-modules/rest-assured/src/test/resources/logback.xml b/testing-modules/rest-assured/src/test/resources/logback.xml new file mode 100644 index 0000000000..ec0dc2469a --- /dev/null +++ b/testing-modules/rest-assured/src/test/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rest-assured/src/test/resources/odds.json b/testing-modules/rest-assured/src/test/resources/odds.json similarity index 100% rename from rest-assured/src/test/resources/odds.json rename to testing-modules/rest-assured/src/test/resources/odds.json diff --git a/rest-assured/src/test/resources/teachers.xml b/testing-modules/rest-assured/src/test/resources/teachers.xml similarity index 100% rename from rest-assured/src/test/resources/teachers.xml rename to testing-modules/rest-assured/src/test/resources/teachers.xml diff --git a/rest-testing/.gitignore b/testing-modules/rest-testing/.gitignore similarity index 100% rename from rest-testing/.gitignore rename to testing-modules/rest-testing/.gitignore diff --git a/rest-testing/README.md b/testing-modules/rest-testing/README.md similarity index 85% rename from rest-testing/README.md rename to testing-modules/rest-testing/README.md index 37a53dd815..c6185de05f 100644 --- a/rest-testing/README.md +++ b/testing-modules/rest-testing/README.md @@ -10,3 +10,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Introduction to WireMock](http://www.baeldung.com/introduction-to-wiremock) - [REST API Testing with Cucumber](http://www.baeldung.com/cucumber-rest-api-testing) - [Testing a REST API with JBehave](http://www.baeldung.com/jbehave-rest-testing) +- [REST API Testing with Karate](http://www.baeldung.com/karate-rest-api-testing) diff --git a/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml similarity index 98% rename from rest-testing/pom.xml rename to testing-modules/rest-testing/pom.xml index 74ea5760c4..ea63ee0e58 100644 --- a/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -11,6 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/rest-testing/src/main/resources/cucumber.json b/testing-modules/rest-testing/src/main/resources/cucumber.json similarity index 100% rename from rest-testing/src/main/resources/cucumber.json rename to testing-modules/rest-testing/src/main/resources/cucumber.json diff --git a/rest-testing/src/main/resources/karate/cucumber.feature b/testing-modules/rest-testing/src/main/resources/karate/cucumber.feature similarity index 100% rename from rest-testing/src/main/resources/karate/cucumber.feature rename to testing-modules/rest-testing/src/main/resources/karate/cucumber.feature diff --git a/testing-modules/rest-testing/src/main/resources/logback.xml b/testing-modules/rest-testing/src/main/resources/logback.xml new file mode 100644 index 0000000000..ec0dc2469a --- /dev/null +++ b/testing-modules/rest-testing/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rest-testing/src/main/resources/wiremock_intro.json b/testing-modules/rest-testing/src/main/resources/wiremock_intro.json similarity index 100% rename from rest-testing/src/main/resources/wiremock_intro.json rename to testing-modules/rest-testing/src/main/resources/wiremock_intro.json diff --git a/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java diff --git a/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java similarity index 100% rename from rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java diff --git a/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java b/testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java similarity index 100% rename from rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java rename to testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java diff --git a/rest-testing/src/test/java/org/baeldung/rest/GithubBasicLiveTest.java b/testing-modules/rest-testing/src/test/java/org/baeldung/rest/GithubBasicLiveTest.java similarity index 100% rename from rest-testing/src/test/java/org/baeldung/rest/GithubBasicLiveTest.java rename to testing-modules/rest-testing/src/test/java/org/baeldung/rest/GithubBasicLiveTest.java diff --git a/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java b/testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java similarity index 100% rename from rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java rename to testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java diff --git a/rest-testing/src/test/resources/github_user_not_found.story b/testing-modules/rest-testing/src/test/resources/github_user_not_found.story similarity index 100% rename from rest-testing/src/test/resources/github_user_not_found.story rename to testing-modules/rest-testing/src/test/resources/github_user_not_found.story diff --git a/rest-testing/src/test/resources/github_user_response_mediatype.story b/testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story similarity index 100% rename from rest-testing/src/test/resources/github_user_response_mediatype.story rename to testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story diff --git a/rest-testing/src/test/resources/github_user_response_payload.story b/testing-modules/rest-testing/src/test/resources/github_user_response_payload.story similarity index 100% rename from rest-testing/src/test/resources/github_user_response_payload.story rename to testing-modules/rest-testing/src/test/resources/github_user_response_payload.story diff --git a/rest-testing/src/test/resources/increase.story b/testing-modules/rest-testing/src/test/resources/increase.story similarity index 100% rename from rest-testing/src/test/resources/increase.story rename to testing-modules/rest-testing/src/test/resources/increase.story diff --git a/rest-testing/src/test/resources/karate/user.feature b/testing-modules/rest-testing/src/test/resources/karate/user.feature similarity index 100% rename from rest-testing/src/test/resources/karate/user.feature rename to testing-modules/rest-testing/src/test/resources/karate/user.feature diff --git a/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md similarity index 77% rename from selenium-junit-testng/README.md rename to testing-modules/selenium-junit-testng/README.md index 29393b956b..0137212290 100644 --- a/selenium-junit-testng/README.md +++ b/testing-modules/selenium-junit-testng/README.md @@ -1,4 +1,3 @@ ### Relevant Articles: - [Guide to Selenium with JUnit / TestNG](http://www.baeldung.com/java-selenium-with-junit-and-testng) -- [Testing a Site with Selenium / Webdriver](http://www.baeldung.com) - [Testing with Selenium/WebDriver and the Page Object Pattern](http://www.baeldung.com/selenium-webdriver-page-object) diff --git a/selenium-junit-testng/geckodriver.mac b/testing-modules/selenium-junit-testng/geckodriver.mac similarity index 100% rename from selenium-junit-testng/geckodriver.mac rename to testing-modules/selenium-junit-testng/geckodriver.mac diff --git a/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml similarity index 96% rename from selenium-junit-testng/pom.xml rename to testing-modules/selenium-junit-testng/pom.xml index 5b695ca900..418dd495a4 100644 --- a/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -9,6 +9,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ @@ -27,7 +28,6 @@ **/*LiveTest.java - false diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java diff --git a/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java similarity index 100% rename from selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java similarity index 100% rename from selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java similarity index 100% rename from selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java diff --git a/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java similarity index 100% rename from selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java diff --git a/testing/README.md b/testing-modules/testing/README.md similarity index 76% rename from testing/README.md rename to testing-modules/testing/README.md index 889f6706d4..c9c656dde9 100644 --- a/testing/README.md +++ b/testing-modules/testing/README.md @@ -15,3 +15,7 @@ - [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) - [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) - [Introduction to Jukito](http://www.baeldung.com/jukito) +- [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) +- [Guide to JSpec](http://www.baeldung.com/jspec) +- [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) +- [Using Conditions with AssertJ](http://www.baeldung.com/assertj-conditions) diff --git a/testing/pom.xml b/testing-modules/testing/pom.xml similarity index 87% rename from testing/pom.xml rename to testing-modules/testing/pom.xml index 8f5c6ddb3d..91792a4681 100644 --- a/testing/pom.xml +++ b/testing-modules/testing/pom.xml @@ -10,6 +10,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ @@ -93,6 +94,11 @@ 1.5 test + + org.javalite + javalite-common + ${javalite.version} + @@ -148,6 +154,16 @@ + + org.assertj + assertj-assertions-generator-maven-plugin + ${assertj-generator.version} + + + com.baeldung.testing.assertj.custom.Person + + + @@ -157,9 +173,11 @@ 0.7.7.201606060606 21.0 3.1.0 - 3.6.1 + 3.9.0 + 2.1.0 0.32 1.1.0 0.12 + 1.4.13 diff --git a/testing/src/main/java/com/baeldung/cucumber/Calculator.java b/testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/cucumber/Calculator.java rename to testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java diff --git a/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/introductionjukito/Calculator.java rename to testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java diff --git a/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java rename to testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java diff --git a/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java rename to testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java new file mode 100644 index 0000000000..efb4c62bde --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java @@ -0,0 +1,41 @@ +package com.baeldung.jspec; + +public abstract class Animal { + + protected String name; + + public Animal(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Animal other = (Animal) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java new file mode 100644 index 0000000000..73ea343600 --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java @@ -0,0 +1,48 @@ +package com.baeldung.jspec; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class Cage { + + private Set animals = new HashSet<>(); + + public void put(Animal animal) { + animals.add(animal); + } + + public void put(Animal... animals) { + this.animals.addAll(Arrays.asList(animals)); + } + + public Animal release(Animal animal) { + return animals.remove(animal) ? animal : null; + } + + public void open() { + animals.clear(); + } + + public boolean hasAnimals() { + return animals.size() > 0; + } + + public boolean isEmpty() { + return animals.isEmpty(); + } + + public Set getAnimals() { + return this.animals; + } + + public int size() { + return animals.size(); + } + + @Override + public String toString() { + return "Cage [animals=" + animals + "]"; + } + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java new file mode 100644 index 0000000000..5021a1481c --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Cat extends Animal { + + public Cat(String name) { + super(name); + } + + @Override + public String toString() { + return "Cat [name=" + name + "]"; + } + +} diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java b/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java new file mode 100644 index 0000000000..43626941e3 --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Dog extends Animal { + + public Dog(String name) { + super(name); + } + + @Override + public String toString() { + return "Dog [name=" + name + "]"; + } + +} diff --git a/testing/src/main/java/com/baeldung/junit/Calculator.java b/testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/junit/Calculator.java rename to testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java diff --git a/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java b/testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java similarity index 100% rename from testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java rename to testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java diff --git a/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java b/testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java similarity index 100% rename from testing/src/main/java/com/baeldung/lambdabehave/Calculator.java rename to testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java diff --git a/testing/src/main/java/com/baeldung/testing/assertj/Dog.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java similarity index 100% rename from testing/src/main/java/com/baeldung/testing/assertj/Dog.java rename to testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java new file mode 100644 index 0000000000..a0b3d0daac --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java @@ -0,0 +1,19 @@ +package com.baeldung.testing.assertj; + +public class Member { + private String name; + private int age; + + public Member(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } +} diff --git a/testing/src/main/java/com/baeldung/testing/assertj/Person.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java similarity index 100% rename from testing/src/main/java/com/baeldung/testing/assertj/Person.java rename to testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java new file mode 100644 index 0000000000..34afc480e4 --- /dev/null +++ b/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java @@ -0,0 +1,32 @@ +package com.baeldung.testing.assertj.custom; + +import java.util.ArrayList; +import java.util.List; + +public class Person { + private String fullName; + private int age; + private List nicknames; + + public Person(String fullName, int age) { + this.fullName = fullName; + this.age = age; + this.nicknames = new ArrayList<>(); + } + + public void addNickname(String nickname) { + nicknames.add(nickname); + } + + public String getFullName() { + return fullName; + } + + public int getAge() { + return age; + } + + public List getNicknames() { + return nicknames; + } +} diff --git a/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java b/testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java similarity index 100% rename from testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java rename to testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java diff --git a/testing/src/main/java/com/baeldung/testing/truth/User.java b/testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java similarity index 100% rename from testing/src/main/java/com/baeldung/testing/truth/User.java rename to testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java diff --git a/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java b/testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java similarity index 100% rename from testing/src/main/java/com/baeldung/testing/truth/UserSubject.java rename to testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java diff --git a/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java b/testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java rename to testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java new file mode 100644 index 0000000000..33ef986588 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java @@ -0,0 +1,126 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Set; + +import org.javalite.test.jspec.DifferenceExpectation; +import org.junit.Test; + +public class CageUnitTest { + + Cat tomCat = new Cat("Tom"); + Cat felixCat = new Cat("Felix"); + Dog boltDog = new Dog("Bolt"); + Cage cage = new Cage(); + + + @Test + public void puttingAnimals_shouldIncreaseCageSize() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage.size()).shouldEqual(2); + } + + @Test + public void releasingAnimals_shouldDecreaseCageSize() { + // When + cage.put(tomCat, boltDog); + cage.release(tomCat); + + // Then + the(cage.size()).shouldEqual(1); + } + + @Test + public void puttingAnimals_shouldLeaveThemInsideTheCage() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldHave("animals"); + } + + @Test + public void openingTheCage_shouldReleaseAllAnimals() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldNotBe("empty"); + + // When + cage.open(); + + // Then + the(cage).shouldBe("empty"); + the(cage.isEmpty()).shouldBeTrue(); + } + + @Test + public void comparingTwoDogs() { + // When + Dog firstDog = new Dog("Rex"); + Dog secondDog = new Dog("Rex"); + + // Then + $(firstDog).shouldEqual(secondDog); + $(firstDog).shouldNotBeTheSameAs(secondDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageAnimalsToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + Set animals = cage.getAnimals(); + the(animals).shouldContain(tomCat); + the(animals).shouldContain(felixCat); + the(animals).shouldNotContain(boltDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + // Check with toString of the tested objects + the(cage).shouldContain(tomCat); + the(cage).shouldContain(felixCat); + the(cage).shouldNotContain(boltDog); + } + + @Test + public void puttingMoreAnimals_shouldChangeSize() { + // When + cage.put(tomCat, boltDog); + + // Then + expect( new DifferenceExpectation(cage.size()) { + + @Override + public Integer exec() { + cage.release(tomCat); + return cage.size(); + } + } ); + } + + + @Test + public void releasingTheDog_shouldReleaseAnAnimalOfDogType() { + // When + cage.put(boltDog); + Animal releasedAnimal = cage.release(boltDog); + + // Then + the(releasedAnimal).shouldNotBeNull(); + the(releasedAnimal).shouldBeA(Dog.class); + } +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java new file mode 100644 index 0000000000..0e35e26728 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.a; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.it; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Arrays; +import java.util.List; + +import org.javalite.test.jspec.ExceptionExpectation; +import org.junit.Test; + +public class JSpecUnitTest { + + @Test + public void onePlusTwo_shouldEqualThree() { + $(1 + 2).shouldEqual(3); + a(1 + 2).shouldEqual(3); + the(1 + 2).shouldEqual(3); + it(1 + 2).shouldEqual(3); + } + + @Test + public void messageShouldContainJSpec() { + String message = "Welcome to JSpec demo"; + // The message should not be empty + the(message).shouldNotBe("empty"); + // The message should contain JSpec + the(message).shouldContain("JSpec"); + } + + public void colorsListShouldContainRed() { + List colorsList = Arrays.asList("red", "green", "blue"); + $(colorsList).shouldContain("red"); + } + + public void guessedNumberShouldEqualHiddenNumber() { + Integer guessedNumber = 11; + Integer hiddenNumber = 11; + + $(guessedNumber).shouldEqual(hiddenNumber); + $(guessedNumber).shouldNotBeTheSameAs(hiddenNumber); + } + + @Test + public void dividingByThero_shouldThrowArithmeticException() { + expect(new ExceptionExpectation(ArithmeticException.class) { + @Override + public void exec() throws ArithmeticException { + System.out.println(1 / 0); + } + } ); + } + +} diff --git a/testing/src/test/java/com/baeldung/junit/AdditionTest.java b/testing-modules/testing/src/test/java/com/baeldung/junit/AdditionTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/AdditionTest.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/AdditionTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java new file mode 100644 index 0000000000..b0209b01aa --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java @@ -0,0 +1,101 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import java.util.Arrays; + +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.junit.Assert.*; + +/** + * Unit test that demonstrate the different assertions available within JUnit 4 + */ +public class AssertionsUnitTest { + + @Test + public void whenAssertingEquality_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals(expected, actual); + } + + @Test + public void whenAssertingEqualityWithMessage_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals("failure - strings are not equal", expected, actual); + } + + @Test + public void whenAssertingArraysEquality_thenEqual() { + char[] expected = { 'J', 'u', 'n', 'i', 't' }; + char[] actual = "Junit".toCharArray(); + + assertArrayEquals(expected, actual); + } + + @Test + public void givenNullArrays_whenAssertingArraysEquality_thenEqual() { + int[] expected = null; + int[] actual = null; + + assertArrayEquals(expected, actual); + } + + @Test + public void whenAssertingNull_thenTrue() { + Object car = null; + + assertNull("The car should be null", car); + } + + @Test + public void whenAssertingNotNull_thenTrue() { + Object car = new Object(); + + assertNotNull("The car should not be null", car); + } + + @Test + public void whenAssertingNotSameObject_thenDifferent() { + Object cat = new Object(); + Object dog = new Object(); + + assertNotSame(cat, dog); + } + + @Test + public void whenAssertingSameObject_thenSame() { + Object cat = new Object(); + + assertSame(cat, cat); + } + + @Test + public void whenAssertingConditions_thenVerified() { + assertTrue("5 is greater then 4", 5 > 4); + assertFalse("5 is not greater then 6", 5 > 6); + } + + @Test + public void when_thenNotFailed() { + try { + methodThatShouldThrowException(); + fail("Exception not thrown"); + } catch (UnsupportedOperationException e) { + assertEquals("Operation Not Supported", e.getMessage()); + } + } + + private void methodThatShouldThrowException() { + throw new UnsupportedOperationException("Operation Not Supported"); + } + + @Test + public void testAssertThatHasItems() { + assertThat(Arrays.asList("Java", "Kotlin", "Scala"), hasItems("Java", "Kotlin")); + } + +} diff --git a/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java diff --git a/testing/src/test/java/com/baeldung/junit/CalculatorTest.java b/testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/CalculatorTest.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorTest.java diff --git a/testing/src/test/java/com/baeldung/junit/SubstractionTest.java b/testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/SubstractionTest.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionTest.java diff --git a/testing/src/test/java/com/baeldung/junit/SuiteTest.java b/testing-modules/testing/src/test/java/com/baeldung/junit/SuiteTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/SuiteTest.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/SuiteTest.java diff --git a/testing/src/test/java/com/baeldung/junit/TestRunner.java b/testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java similarity index 100% rename from testing/src/test/java/com/baeldung/junit/TestRunner.java rename to testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java diff --git a/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java b/testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java rename to testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java diff --git a/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java similarity index 100% rename from testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java rename to testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java diff --git a/testing/src/test/java/com/baeldung/lambdabehave/CalculatorTest.java b/testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/lambdabehave/CalculatorTest.java rename to testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorTest.java diff --git a/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java new file mode 100644 index 0000000000..153af828f1 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.testing.assertj; + +import static org.assertj.core.api.Assertions.allOf; +import static org.assertj.core.api.Assertions.anyOf; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.not; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.assertj.core.api.Condition; +import org.junit.Test; + +public class AssertJConditionUnitTest { + private Condition senior = new Condition<>(m -> m.getAge() >= 60, "senior"); + private Condition nameJohn = new Condition<>(m -> m.getName().equalsIgnoreCase("John"), "name John"); + + @Test + public void whenUsingMemberAgeCondition_thenCorrect() { + Member member = new Member("John", 65); + assertThat(member).is(senior); + + try { + assertThat(member).isNot(senior); + fail(); + } catch (AssertionError e) { + assertThat(e).hasMessageContaining("not to be "); + } + } + + @Test + public void whenUsingMemberNameCondition_thenCorrect() { + Member member = new Member("Jane", 60); + assertThat(member).doesNotHave(nameJohn); + + try { + assertThat(member).has(nameJohn); + fail(); + } catch (AssertionError e) { + assertThat(e).hasMessageContaining("to have:\n "); + } + } + + @Test + public void whenCollectionConditionsAreSatisfied_thenCorrect() { + List members = new ArrayList<>(); + members.add(new Member("Alice", 50)); + members.add(new Member("Bob", 60)); + + assertThat(members).haveExactly(1, senior); + assertThat(members).doNotHave(nameJohn); + } + + @Test + public void whenCombiningAllOfConditions_thenCorrect() { + Member john = new Member("John", 60); + Member jane = new Member("Jane", 50); + + assertThat(john).is(allOf(senior, nameJohn)); + assertThat(jane).is(allOf(not(nameJohn), not(senior))); + } + + @Test + public void whenCombiningAnyOfConditions_thenCorrect() { + Member john = new Member("John", 50); + Member jane = new Member("Jane", 60); + + assertThat(john).is(anyOf(senior, nameJohn)); + assertThat(jane).is(anyOf(nameJohn, senior)); + } +} diff --git a/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java diff --git a/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java diff --git a/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java new file mode 100644 index 0000000000..4c09311bac --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.testing.assertj.custom; + +import static com.baeldung.testing.assertj.custom.Assertions.assertThat; +import static org.junit.Assert.fail; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class AssertJCustomAssertionsUnitTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void whenPersonNameMatches_thenCorrect() { + Person person = new Person("John Doe", 20); + assertThat(person).hasFullName("John Doe"); + } + + @Test + public void whenPersonAgeLessThanEighteen_thenNotAdult() { + Person person = new Person("Jane Roe", 16); + + try { + assertThat(person).isAdult(); + fail(); + } catch (AssertionError e) { + org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to be adult"); + } + } + + @Test + public void whenPersonDoesNotHaveAMatchingNickname_thenIncorrect() { + Person person = new Person("John Doe", 20); + person.addNickname("Nick"); + + try { + assertThat(person).hasNickname("John"); + fail(); + } catch (AssertionError e) { + org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to have nickname John"); + } + } +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java new file mode 100644 index 0000000000..fcffb8fc6c --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java @@ -0,0 +1,9 @@ +package com.baeldung.testing.assertj.custom; + +public class Assertions { + public static PersonAssert assertThat(Person actual) { + return new PersonAssert(actual); + } + + // static factory methods of other assertion classes +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java new file mode 100644 index 0000000000..d6cc585e96 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java @@ -0,0 +1,38 @@ +package com.baeldung.testing.assertj.custom; + +import org.assertj.core.api.AbstractAssert; + +public class PersonAssert extends AbstractAssert { + + public PersonAssert(Person actual) { + super(actual, PersonAssert.class); + } + + public static PersonAssert assertThat(Person actual) { + return new PersonAssert(actual); + } + + public PersonAssert hasFullName(String fullName) { + isNotNull(); + if (!actual.getFullName().equals(fullName)) { + failWithMessage("Expected person to have full name %s but was %s", fullName, actual.getFullName()); + } + return this; + } + + public PersonAssert isAdult() { + isNotNull(); + if (actual.getAge() < 18) { + failWithMessage("Expected person to be adult"); + } + return this; + } + + public PersonAssert hasNickname(String nickName) { + isNotNull(); + if (!actual.getNicknames().contains(nickName)) { + failWithMessage("Expected person to have nickname %s", nickName); + } + return this; + } +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java new file mode 100644 index 0000000000..07a5be1118 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java @@ -0,0 +1,24 @@ +package com.baeldung.testing.assertj.exceptions; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; + +import org.junit.Test; + +public class Java7StyleAssertions { + + @Test + public void whenDividingByZero_thenArithmeticException() { + try { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + fail("ArithmeticException expected because dividing by zero yields an ArithmeticException."); + failBecauseExceptionWasNotThrown(ArithmeticException.class); + } catch (Exception e) { + assertThat(e).hasMessage("/ by zero"); + assertThat(e).isInstanceOf(ArithmeticException.class); + } + } +} diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java new file mode 100644 index 0000000000..973b921654 --- /dev/null +++ b/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java @@ -0,0 +1,66 @@ +package com.baeldung.testing.assertj.exceptions; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.catchThrowable; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import org.junit.Test; + +public class Java8StyleAssertions { + + @Test + public void whenGettingOutOfBoundsItem_thenIndexOutOfBoundsException() { + assertThatThrownBy(() -> { + ArrayList myStringList = new ArrayList(Arrays.asList("Strine one", "String two")); + myStringList.get(2); + }).isInstanceOf(IndexOutOfBoundsException.class) + .hasMessageStartingWith("Index: 2") + .hasMessageContaining("2") + .hasMessageEndingWith("Size: 2") + .hasMessageContaining("Index: 2, Size: 2") + .hasMessage("Index: %s, Size: %s", 2, 2) + .hasMessageMatching("Index: \\d+, Size: \\d+") + .hasNoCause(); + } + + @Test + public void whenWrappingException_thenCauseInstanceOfWrappedExceptionType() { + assertThatThrownBy(() -> { + try { + throw new IOException(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }).isInstanceOf(RuntimeException.class) + .hasCauseInstanceOf(IOException.class) + .hasStackTraceContaining("IOException"); + } + + @Test + public void whenDividingByZero_thenArithmeticException() { + assertThatExceptionOfType(ArithmeticException.class).isThrownBy(() -> { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + }) + .withMessageContaining("/ by zero"); + + // Alternatively: + + // when + Throwable thrown = catchThrowable(() -> { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + }); + + // then + assertThat(thrown).isInstanceOf(ArithmeticException.class) + .hasMessageContaining("/ by zero"); + + } +} diff --git a/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java diff --git a/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java b/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java diff --git a/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java diff --git a/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java diff --git a/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java b/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java diff --git a/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java b/testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java similarity index 100% rename from testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java rename to testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java diff --git a/testing/src/test/resources/JunitParamsTestParameters.csv b/testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv similarity index 100% rename from testing/src/test/resources/JunitParamsTestParameters.csv rename to testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv diff --git a/testing/src/test/resources/features/calculator-scenario-outline.feature b/testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature similarity index 100% rename from testing/src/test/resources/features/calculator-scenario-outline.feature rename to testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature diff --git a/testing/src/test/resources/features/calculator.feature b/testing-modules/testing/src/test/resources/features/calculator.feature similarity index 100% rename from testing/src/test/resources/features/calculator.feature rename to testing-modules/testing/src/test/resources/features/calculator.feature diff --git a/testing/src/test/resources/features/shopping.feature b/testing-modules/testing/src/test/resources/features/shopping.feature similarity index 100% rename from testing/src/test/resources/features/shopping.feature rename to testing-modules/testing/src/test/resources/features/shopping.feature diff --git a/testng/README.md b/testing-modules/testng/README.md similarity index 100% rename from testng/README.md rename to testing-modules/testng/README.md diff --git a/testng/pom.xml b/testing-modules/testng/pom.xml similarity index 94% rename from testng/pom.xml rename to testing-modules/testng/pom.xml index 0ca775a00c..7aed1837e5 100644 --- a/testng/pom.xml +++ b/testing-modules/testng/pom.xml @@ -11,6 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/GroupIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/GroupIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java diff --git a/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java diff --git a/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java diff --git a/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java diff --git a/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java similarity index 100% rename from testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java diff --git a/testng/src/test/java/com/baeldung/reports/CustomisedListener.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java similarity index 100% rename from testng/src/test/java/com/baeldung/reports/CustomisedListener.java rename to testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java diff --git a/testng/src/test/java/com/baeldung/reports/CustomisedReports.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java similarity index 100% rename from testng/src/test/java/com/baeldung/reports/CustomisedReports.java rename to testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java diff --git a/testng/src/test/resources/logback.xml b/testing-modules/testng/src/test/resources/logback.xml similarity index 100% rename from testng/src/test/resources/logback.xml rename to testing-modules/testng/src/test/resources/logback.xml diff --git a/testng/src/test/resources/parametrized_testng.xml b/testing-modules/testng/src/test/resources/parametrized_testng.xml similarity index 100% rename from testng/src/test/resources/parametrized_testng.xml rename to testing-modules/testng/src/test/resources/parametrized_testng.xml diff --git a/testng/src/test/resources/reportTemplate.html b/testing-modules/testng/src/test/resources/reportTemplate.html similarity index 100% rename from testng/src/test/resources/reportTemplate.html rename to testing-modules/testng/src/test/resources/reportTemplate.html diff --git a/testng/src/test/resources/test_group.xml b/testing-modules/testng/src/test/resources/test_group.xml similarity index 100% rename from testng/src/test/resources/test_group.xml rename to testing-modules/testng/src/test/resources/test_group.xml diff --git a/testng/src/test/resources/test_setup.xml b/testing-modules/testng/src/test/resources/test_setup.xml similarity index 100% rename from testng/src/test/resources/test_setup.xml rename to testing-modules/testng/src/test/resources/test_setup.xml diff --git a/testng/src/test/resources/test_suite.xml b/testing-modules/testng/src/test/resources/test_suite.xml similarity index 100% rename from testng/src/test/resources/test_suite.xml rename to testing-modules/testng/src/test/resources/test_suite.xml diff --git a/undertow/dependency-reduced-pom.xml b/undertow/dependency-reduced-pom.xml new file mode 100644 index 0000000000..0654c82b74 --- /dev/null +++ b/undertow/dependency-reduced-pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + com.baeldung.undertow + undertow + undertow + 1.0-SNAPSHOT + http://maven.apache.org + + ${project.artifactId} + + + maven-shade-plugin + + + package + + shade + + + + + + maven-jar-plugin + + + + com.baeldung.undertow.SimpleServer + + + + + + + + 1.8 + 1.8 + + + diff --git a/vavr/README.md b/vavr/README.md index 4361363fbd..373f897486 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -8,3 +8,6 @@ - [Introduction to Vavr’s Validation API](http://www.baeldung.com/vavr-validation-api) - [Guide to Collections API in Vavr](http://www.baeldung.com/vavr-collections) - [Collection Factory Methods for Vavr](http://www.baeldung.com/vavr-collection-factory-methods) +- [Introduction to Future in Vavr](http://www.baeldung.com/vavr-future) +- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) + diff --git a/vavr/pom.xml b/vavr/pom.xml index 878430611b..28747af3ee 100644 --- a/vavr/pom.xml +++ b/vavr/pom.xml @@ -1,17 +1,15 @@ - + 4.0.0 com.baeldung vavr 1.0 vavr - - org.springframework.boot - spring-boot-starter-parent - 1.5.6.RELEASE - - + + parent-boot-5 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-5 @@ -21,12 +19,6 @@ ${vavr.version} - - junit - junit - ${junit.version} - - org.springframework.boot spring-boot-starter-data-jpa @@ -42,15 +34,15 @@ spring-boot-starter-test test - + - org.awaitility - awaitility - ${awaitility.version} - test - + org.awaitility + awaitility + ${awaitility.version} + test + - + spring-snapshot @@ -66,20 +58,13 @@ https://repo.spring.io/libs-snapshot - - + + spring-snapshots http://repo.spring.io/snapshot - - - 1.8 - 0.9.1 - 4.12 - 3.0.0 - @@ -97,10 +82,16 @@ **/JdbcTest.java **/*LiveTest.java - true + + 1.8 + 0.9.1 + 4.12 + 3.0.0 + + \ No newline at end of file diff --git a/vavr/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java b/vavr/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java new file mode 100644 index 0000000000..f4e0728f32 --- /dev/null +++ b/vavr/src/main/java/com/baeldung/samples/java/vavr/VavrSampler.java @@ -0,0 +1,99 @@ +package com.baeldung.samples.java.vavr; + +import java.util.ArrayList; +import java.util.List; + +import io.vavr.collection.Stream; + +/** + * + * @author baeldung + */ +public class VavrSampler { + + static int[] intArray = new int[] { 1, 2, 4 }; + static List intList = new ArrayList<>(); + static int[][] intOfInts = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; + + public static void main(String[] args) { + vavrStreamElementAccess(); + System.out.println("===================================="); + vavrParallelStreamAccess(); + System.out.println("===================================="); + vavrFlatMapping(); + System.out.println("===================================="); + vavrStreamManipulation(); + System.out.println("===================================="); + vavrStreamDistinct(); + } + + public static void vavrStreamElementAccess() { + System.out.println("Vavr Element Access"); + System.out.println("===================================="); + Stream vavredStream = Stream.ofAll(intArray); + System.out.println("Vavr index access: " + vavredStream.get(2)); + System.out.println("Vavr head element access: " + vavredStream.get()); + + Stream vavredStringStream = Stream.of("foo", "bar", "baz"); + System.out.println("Find foo " + vavredStringStream.indexOf("foo")); + } + + public static void vavrParallelStreamAccess() { + + System.out.println("Vavr Stream Concurrent Modification"); + System.out.println("===================================="); + Stream vavrStream = Stream.ofAll(intList); + // intList.add(5); + vavrStream.forEach(i -> System.out.println("in a Vavr Stream: " + i)); + + // Stream wrapped = Stream.ofAll(intArray); + // intArray[2] = 5; + // wrapped.forEach(i -> System.out.println("Vavr looped " + i)); + } + + public static void jdkFlatMapping() { + System.out.println("Java flatMapping"); + System.out.println("===================================="); + java.util.stream.Stream.of(42).flatMap(i -> java.util.stream.Stream.generate(() -> { + System.out.println("nested call"); + return 42; + })).findAny(); + } + + public static void vavrFlatMapping() { + System.out.println("Vavr flatMapping"); + System.out.println("===================================="); + Stream.of(42) + .flatMap(i -> Stream.continually(() -> { + System.out.println("nested call"); + return 42; + })) + .get(0); + } + + public static void vavrStreamManipulation() { + System.out.println("Vavr Stream Manipulation"); + System.out.println("===================================="); + List stringList = new ArrayList<>(); + stringList.add("foo"); + stringList.add("bar"); + stringList.add("baz"); + Stream vavredStream = Stream.ofAll(stringList); + vavredStream.forEach(item -> System.out.println("Vavr Stream item: " + item)); + Stream vavredStream2 = vavredStream.insert(2, "buzz"); + vavredStream2.forEach(item -> System.out.println("Vavr Stream item after stream addition: " + item)); + stringList.forEach(item -> System.out.println("List item after stream addition: " + item)); + Stream deletionStream = vavredStream.remove("bar"); + deletionStream.forEach(item -> System.out.println("Vavr Stream item after stream item deletion: " + item)); + + } + + public static void vavrStreamDistinct() { + Stream vavredStream = Stream.of("foo", "bar", "baz", "buxx", "bar", "bar", "foo"); + Stream distinctVavrStream = vavredStream.distinctBy((y, z) -> { + return y.compareTo(z); + }); + distinctVavrStream.forEach(item -> System.out.println("Vavr Stream item after distinct query " + item)); + + } +} diff --git a/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java index 08a5e20b40..7beb75632e 100644 --- a/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java @@ -216,11 +216,11 @@ public class VavrUnitTest { assertEquals(-1, errorSentinel); } - // @Test(expected = ArithmeticException.class) - // public void givenBadCode_whenTryHandles_thenCorrect3() { - // Try result = Try.of(() -> 1 / 0); - // result.getOrElseThrow(ArithmeticException::new); - // } + @Test(expected = RuntimeException.class) + public void givenBadCode_whenTryHandles_thenCorrect3() { + Try result = Try.of(() -> 1 / 0); + result.getOrElseThrow(e->new RuntimeException(e));//re-throw different ex type + } // lazy @Test diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java new file mode 100644 index 0000000000..d5345cad55 --- /dev/null +++ b/vavr/src/test/java/com/baeldung/vavr/future/FutureTest.java @@ -0,0 +1,189 @@ +package com.baeldung.vavr.future; + +import io.vavr.Tuple; +import io.vavr.concurrent.Future; +import io.vavr.control.Option; +import io.vavr.control.Try; +import org.junit.Test; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import static java.util.concurrent.Executors.newSingleThreadExecutor; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class FutureTest { + + private static final String error = "Failed to get underlying value."; + private static final String HELLO = "Welcome to Baeldung!"; + + @Test + public void whenChangeExecutorService_thenCorrect() { + String result = Future.of(newSingleThreadExecutor(), () -> HELLO) + .getOrElse(error); + + assertThat(result) + .isEqualTo(HELLO); + } + + @Test + public void whenAppendData_thenCorrect1() { + String result = Future.of(() -> HELLO) + .getOrElse(error); + + assertThat(result) + .isEqualTo(HELLO); + } + + @Test + public void whenAppendData_thenCorrect2() { + Future resultFuture = Future.of(() -> HELLO) + .await(); + + Option> futureOption = resultFuture.getValue(); + String result = futureOption.get().getOrElse(error); + + assertThat(result) + .isEqualTo(HELLO); + } + + @Test + public void whenAppendData_thenSuccess() { + String result = Future.of(() -> HELLO) + .onSuccess(finalResult -> System.out.println("Successfully Completed - Result: " + finalResult)) + .onFailure(finalResult -> System.out.println("Failed - Result: " + finalResult)) + .getOrElse(error); + + assertThat(result) + .isEqualTo(HELLO); + } + + @Test + public void whenTransform_thenCorrect() { + Future future = Future.of(() -> 5) + .transformValue(result -> Try.of(() -> HELLO + result.get())); + + assertThat(future.get()).isEqualTo(HELLO + 5); + } + + @Test + public void whenChainingCallbacks_thenCorrect() { + Future.of(() -> HELLO) + .andThen(r -> System.out.println("Completed - 1: " + r)) + .andThen(r -> System.out.println("Completed - 2: " + r)); + } + + @Test + public void whenCallAwait_thenCorrect() { + Future resultFuture = Future.of(() -> HELLO) + .await(); + String result = resultFuture.getValue().get().getOrElse(error); + + assertThat(result) + .isEqualTo(HELLO); + } + + @Test + public void whenDivideByZero_thenGetThrowable1() { + Future resultFuture = Future.of(() -> 10 / 0); + + assertThatThrownBy(resultFuture::get) + .isInstanceOf(ArithmeticException.class); + } + + @Test + public void whenDivideByZero_thenGetThrowable2() { + Future resultFuture = Future.of(() -> 10 / 0) + .await(); + + assertThat(resultFuture.getCause().get().getMessage()) + .isEqualTo("/ by zero"); + } + + @Test + public void whenDivideByZero_thenCorrect() { + Future resultFuture = Future.of(() -> 10 / 0) + .await(); + + assertThat(resultFuture.isCompleted()).isTrue(); + assertThat(resultFuture.isSuccess()).isFalse(); + assertThat(resultFuture.isFailure()).isTrue(); + } + + @Test + public void whenAppendData_thenFutureNotEmpty() { + Future resultFuture = Future.of(() -> HELLO) + .await(); + + assertThat(resultFuture.isEmpty()) + .isFalse(); + } + + @Test + public void whenCallZip_thenCorrect() { + Future f1 = Future.of(() -> "hello1"); + Future f2 = Future.of(() -> "hello2"); + + assertThat(f1.zip(f2).get()) + .isEqualTo(Tuple.of("hello1", "hello2")); + } + + @Test + public void whenConvertToCompletableFuture_thenCorrect() throws InterruptedException, ExecutionException { + CompletableFuture convertedFuture = Future.of(() -> HELLO) + .toCompletableFuture(); + + assertThat(convertedFuture.get()) + .isEqualTo(HELLO); + } + + @Test + public void whenCallMap_thenCorrect() { + Future futureResult = Future.of(() -> "from Baeldung") + .map(a -> "Hello " + a) + .await(); + + assertThat(futureResult.get()) + .isEqualTo("Hello from Baeldung"); + } + + @Test + public void whenCallFlatMap_thenCorrect() { + Future futureMap = Future.of(() -> 1) + .flatMap((i) -> Future.of(() -> "Hello: " + i)); + + assertThat(futureMap.get()).isEqualTo("Hello: 1"); + } + + @Test + public void whenFutureFails_thenGetErrorMessage() { + Future future = Future.of(() -> "Hello".substring(-1)) + .recover(x -> "fallback value"); + + assertThat(future.get()) + .isEqualTo("fallback value"); + } + + @Test + public void whenFutureFails_thenGetAnotherFuture() { + Future future = Future.of(() -> "Hello".substring(-1)) + .recoverWith(x -> Future.of(() -> "fallback value")); + + assertThat(future.get()) + .isEqualTo("fallback value"); + } + + @Test + public void whenBothFuturesFail_thenGetErrorMessage() { + Future f1 = Future.of(() -> "Hello".substring(-1)); + Future f2 = Future.of(() -> "Hello".substring(-2)); + + Future errorMessageFuture = f1.fallbackTo(f2); + Future errorMessage = errorMessageFuture.failed(); + + assertThat( + errorMessage.get().getMessage()) + .isEqualTo("String index out of range: -1"); + } +} diff --git a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java b/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java deleted file mode 100644 index 437742c964..0000000000 --- a/vavr/src/test/java/com/baeldung/vavr/future/FutureUnitTest.java +++ /dev/null @@ -1,289 +0,0 @@ -package com.baeldung.vavr.future; - -import static io.vavr.API.$; -import static io.vavr.API.Case; -import static io.vavr.API.Match; -import static io.vavr.Predicates.exists; -import static io.vavr.Predicates.forAll; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.concurrent.CancellationException; -import java.util.function.Consumer; -import java.util.function.Predicate; - -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.internal.verification.VerificationModeFactory; -import org.mockito.verification.Timeout; - -import io.vavr.Tuple; -import io.vavr.Tuple2; -import io.vavr.collection.List; -import io.vavr.concurrent.Future; -import io.vavr.control.Try; - -public class FutureUnitTest { - - private final String SUCCESS = "Success"; - private final String FAILURE = "Failure"; - - @Test - public void givenFunctionReturnInteger_WhenCallWithFuture_ShouldReturnFunctionValue() { - Future future = Future.of(() -> 1); - - assertEquals(1, future.get().intValue()); - } - - @Test - public void givenFunctionGetRemoteHttpResourceAsString_WhenCallSuccessWithFuture_ShouldReturnContentValueAsString() { - String url = "http://resource"; - String content = "Content from " + url; - Future future = Future.of(() -> getResource(url)); - - assertEquals(content, future.get()); - } - - @Test - public void givenFunctionThrowException_WhenCallWithFuture_ShouldReturnFailure() { - Future future = Future.of(() -> getResourceThrowException("")); - future.await(); - - assertTrue(future.isFailure()); - } - - @Test - public void givenAFutureReturnZero_WhenCheckFutureWithExistEvenValue_ShouldReturnRight() { - Future future = Future.of(() -> 2); - boolean result = future.exists(i -> i % 2 == 0); - - assertTrue(result); - } - - @Test - public void givenFunction_WhenCallWithFutureAndRegisterConsumerForSuccess_ShouldCallConsumerToStoreValue() { - Future future = Future.of(() -> 1); - MockConsumer consumer = Mockito.mock(MockConsumer.class); - future.onSuccess(consumer); - Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(1); - } - - @Test - public void givenFunctionThrowException_WhenCallWithFutureAndRegisterConsumerForFailer_ShouldCallConsumerToStoreException() { - Future future = Future.of(() -> getResourceThrowException("")); - MockThrowableConsumer consumer = Mockito.mock(MockThrowableConsumer.class); - future.onFailure(consumer); - Mockito.verify(consumer, new Timeout(1000, VerificationModeFactory.times(1))).accept(Mockito.any()); - } - - @Test - public void givenAFuture_WhenAddAndThenConsumer_ShouldCallConsumerWithResultOfFutureAction() { - MockTryConsumer consumer1 = Mockito.mock(MockTryConsumer.class); - MockTryConsumer consumer2 = Mockito.mock(MockTryConsumer.class); - Future future = Future.of(() -> 1); - Future andThenFuture = future.andThen(consumer1).andThen(consumer2); - andThenFuture.await(); - Mockito.verify(consumer1, VerificationModeFactory.times(1)).accept(Try.success(1)); - Mockito.verify(consumer2, VerificationModeFactory.times(1)).accept(Try.success(1)); - } - - @Test - public void givenAFailureFuture_WhenCallOrElseFunction_ShouldReturnNewFuture() { - Future future = Future.failed(new RuntimeException()); - Future future2 = future.orElse(Future.of(() -> 2)); - - assertEquals(2, future2.get().intValue()); - } - - @Test(expected = CancellationException.class) - public void givenAFuture_WhenCallCancel_ShouldReturnCancellationException() { - long waitTime = 1000; - Future future = Future.of(() -> { - Thread.sleep(waitTime); - return 1; - }); - future.cancel(); - future.await(); - future.get(); - } - - @Test - public void givenAFuture_WhenCallFallBackWithSuccessFuture_ShouldReturnFutureResult() { - String expectedResult = "take this"; - Future future = Future.of(() -> expectedResult); - Future secondFuture = Future.of(() -> "take that"); - Future futureResult = future.fallbackTo(secondFuture); - futureResult.await(); - - assertEquals(expectedResult, futureResult.get()); - } - - @Test - public void givenAFuture_WhenCallFallBackWithFailureFuture_ShouldReturnValueOfFallBackFuture() { - String expectedResult = "take that"; - Future future = Future.failed(new RuntimeException()); - Future fallbackFuture = Future.of(() -> expectedResult); - Future futureResult = future.fallbackTo(fallbackFuture); - - assertEquals(expectedResult, futureResult.get()); - } - - @Test - public void givenAFuture_WhenTransformByAddingOne_ShouldReturn() { - Future future = Future.of(() -> 1).transformValue(f -> Try.of(() -> "Hello: " + f.get())); - - assertEquals("Hello: 1", future.get()); - } - - @Test - public void givenAFutureOfInt_WhenMapToString_ShouldCombineAndReturn() { - Future future = Future.of(()->1).map(i -> "Hello: " + i); - - assertEquals("Hello: 1", future.get()); - } - - @Test - public void givenAFutureOfInt_WhenFlatMapToString_ShouldCombineAndReturn() { - Future futureMap = Future.of(() -> 1).flatMap((i) -> Future.of(() -> "Hello: " + i)); - - assertEquals("Hello: 1", futureMap.get()); - } - - @Test - public void givenAFutureOf2String_WhenZip_ShouldReturnTupleOf2String() { - Future> future = Future.of(() -> "hello").zip(Future.of(() -> "world")); - - assertEquals(Tuple.of("hello", "world"), future.get()); - } - - @Test - public void givenGetResourceWithFuture_WhenWaitAndMatchWithPredicate_ShouldReturnSuccess() { - String url = "http://resource"; - Future future = Future.of(() -> getResource(url)); - future.await(); - String s = Match(future).of( - Case($(future0 -> future0.isSuccess()), SUCCESS), - Case($(), FAILURE)); - - assertEquals(SUCCESS, s); - } - - @Test - public void givenAFailedFuture_WhenWaitAndMatchWithPredicateCheckSuccess_ShouldReturnFailed() { - Future future = Future.failed(new RuntimeException()); - future.await(); - String s = Match(future).of( - Case($(future0 -> future0.isSuccess()), SUCCESS), - Case($(), FAILURE)); - - assertEquals(FAILURE, s); - } - - @Test - public void givenAFuture_WhenMatchWithFuturePredicate_ShouldReturnSuccess() { - Future future = Future.of(() -> { - Thread.sleep(10); - return 1; - }); - Predicate> predicate = f -> f.exists(i -> i % 2 == 1); - - String s = Match(future).of( - Case($(predicate), "Even"), - Case($(), "Odd")); - - assertEquals("Even", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithExistEvenNumberPredicate_ShouldReturnSuccess() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i % 2 == 0); - String s = Match(futures).of( - Case($(exists(predicate0)), "Even"), - Case($(), "Odd")); - - assertEquals("Even", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberBiggerThanZeroPredicate_ShouldReturnSuccess() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i > 0); - String s = Match(futures).of( - Case($(forAll(predicate0)), "Positive numbers"), - Case($(), "None")); - - assertEquals("Positive numbers", s); - } - - @Test - public void givenAListOfFutureReturnFist3Integers_WhenMatchWithForAllNumberSmallerThanZeroPredicate_ShouldReturnFailed() { - List> futures = getFutureOfFirst3Number(); - Predicate> predicate0 = future -> future.exists(i -> i < 0); - String s = Match(futures).of( - Case($(forAll(predicate0)), "Negative numbers"), - Case($(), "None")); - - assertEquals("None", s); - } - - private String getResource(String url) { - try { - Thread.sleep(10); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return "Content from " + url; - } - - private String getResourceThrowException(String url) { - throw new RuntimeException("Exception when get resource " + url); - } - - private List> getFutureOfFirst3Number() { - List> futures = List.of(Future.of(() -> 1), Future.of(() -> 2), Future.of(() -> 3)); - return futures; - } - - private static void checkOnSuccessFunction() { - Future future = Future.of(() -> 1); - future.onSuccess(i -> System.out.println("Future finish with result: " + i)); - } - - private static void checkOnFailureFunction() { - Future future = Future.of(() -> {throw new RuntimeException("Failed");}); - future.onFailure(t -> System.out.println("Future failures with exception: " + t)); - } - - private static void runAndThenConsumer() { - Future future = Future.of(() -> 1); - future.andThen(i -> System.out.println("Do side-effect action 1 with input: " + i.get())). - andThen((i) -> System.out.println("Do side-effect action 2 with input: " + i.get())); - } - - public static void main(String[] args) throws InterruptedException { - checkOnSuccessFunction(); - checkOnFailureFunction(); - runAndThenConsumer(); - Thread.sleep(1000); - } -} - - -class MockConsumer implements Consumer { - @Override - public void accept(Integer t) { - } -} - -class MockTryConsumer implements Consumer> { - @Override - public void accept(Try t) { - } -} - -class MockThrowableConsumer implements Consumer { - @Override - public void accept(Throwable t) { - } -} diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml index 9c2c9bfd48..067b88c410 100644 --- a/vertx-and-rxjava/pom.xml +++ b/vertx-and-rxjava/pom.xml @@ -17,6 +17,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.7.0 1.8 1.8 diff --git a/vraptor/.gitignore b/vraptor/.gitignore new file mode 100644 index 0000000000..27dc294cd1 --- /dev/null +++ b/vraptor/.gitignore @@ -0,0 +1,4 @@ + +/target/ +/.idea/ +/src/main/webapp/WEB-INF/classes/ diff --git a/vraptor/README.md b/vraptor/README.md new file mode 100644 index 0000000000..d547fc1274 --- /dev/null +++ b/vraptor/README.md @@ -0,0 +1,13 @@ +# VRaptor blank project + +This is a blank project to help you to use VRaptor. You can easily import in you IDE as Maven project. + +Este é um projeto em branco para ajudar você a usar o VRaptor. Você pode facilmente importá-lo na sua IDE favorita como um projeto Maven. + +Após criar seu projeto você pode rodá-lo com um tomcat7 ou +: + +``` +mvn tomcat7:run +``` + +Cuidado para *jamais* executar `mvn tomcat:run` pois ele usará um tomcat6 (incompatível). diff --git a/vraptor/pom.xml b/vraptor/pom.xml new file mode 100644 index 0000000000..64a4f2d85d --- /dev/null +++ b/vraptor/pom.xml @@ -0,0 +1,134 @@ + + 4.0.0 + + com.baeldung + vraptor + 1.0.0 + war + + A demo project to start using VRaptor 4 + + + UTF-8 + 2.1.2.Final + + + + + br.com.caelum + vraptor + 4.2.0.Final + + + + org.jboss.weld.servlet + weld-servlet-core + 2.1.2.Final + + + org.jboss.spec.javax.el + jboss-el-api_3.0_spec + + + + + + org.jboss.weld + weld-core-impl + 2.1.2.Final + + + org.jboss.spec.javax.el + jboss-el-api_3.0_spec + + + + + + javax.el + el-api + 2.2 + provided + + + + org.hibernate + hibernate-validator-cdi + 5.1.1.Final + + + + javax.servlet + jstl + 1.2 + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + org.slf4j + slf4j-log4j12 + 1.7.5 + + + + br.com.caelum.vraptor + vraptor-freemarker + 4.1.0-RC3 + + + + br.com.caelum.vraptor + vraptor-hibernate + 4.0.4 + + + + mysql + mysql-connector-java + 8.0.8-dmr + + + + org.mindrot + jbcrypt + 0.4 + + + + org.freemarker + freemarker + 2.3.27-incubating + + + + + + vraptor + src/main/webapp/WEB-INF/classes + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + / + + + + + diff --git a/vraptor/src/main/java/com/baeldung/config/UserInfo.java b/vraptor/src/main/java/com/baeldung/config/UserInfo.java new file mode 100644 index 0000000000..2613128790 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/config/UserInfo.java @@ -0,0 +1,23 @@ +package com.baeldung.config; + +import com.baeldung.models.User; + +import javax.enterprise.context.SessionScoped; +import java.io.Serializable; + +@SessionScoped +public class UserInfo implements Serializable { + + private User user; + + + public UserInfo() {} + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/vraptor/src/main/java/com/baeldung/controllers/AuthController.java b/vraptor/src/main/java/com/baeldung/controllers/AuthController.java new file mode 100644 index 0000000000..ed2d3fdba7 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/AuthController.java @@ -0,0 +1,99 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.*; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import br.com.caelum.vraptor.validator.Validator; +import com.baeldung.config.UserInfo; +import com.baeldung.daos.UserDao; +import com.baeldung.models.User; +import org.mindrot.jbcrypt.BCrypt; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.logging.Logger; + +@Controller +public class AuthController { + + private Validator validator; + private UserDao userDao; + private Result result; + private UserInfo userInfo; + private Logger logger = Logger.getLogger(getClass().getName()); + + public AuthController() { + this(null, null, null, null); + } + + @Inject + public AuthController(Validator validator, UserDao userDao, Result result, UserInfo userInfo) { + this.validator = validator; + this.userDao = userDao; + this.result = result; + this.userInfo = userInfo; + } + + @Get("/register") + public void registrationForm() { + result.use(FreemarkerView.class).withTemplate("auth/register"); + } + + @Post("/register") + public void register(User user, HttpServletRequest request) { + + validator.validate(user); + + if(validator.hasErrors()) { + result.include("errors", validator.getErrors()); + } + + validator.onErrorRedirectTo(this).registrationForm(); + + if(!user.getPassword() + .equals(request.getParameter("password_confirmation"))) { + result.include("error", "Passwords Do Not Match"); + result.redirectTo(this).registrationForm(); + } + + user.setPassword( + BCrypt.hashpw(user.getPassword(), BCrypt.gensalt())); + + Object resp = userDao.add(user); + + if(resp != null) { + result.include("status", "Registration Successful! Now Login"); + result.redirectTo(this).loginForm(); + } else { + result.include("error", "There was an error during registration"); + result.redirectTo(this).registrationForm(); + } + } + + @Get("/login") + public void loginForm() { + result.use(FreemarkerView.class).withTemplate("auth/login"); + } + + @Post("/login") + public void login(HttpServletRequest request) { + + String password = request.getParameter("user.password"); + String email = request.getParameter("user.email"); + + if(email.isEmpty() || password.isEmpty()) { + result.include("error", "Email/Password is Required!"); + result.redirectTo(AuthController.class).loginForm(); + } + + User user = userDao.findByEmail(email); + if(user != null && BCrypt.checkpw(password, user.getPassword())) { + userInfo.setUser(user); + result.include("status", "Login Successful!"); + result.redirectTo(IndexController.class).index(); + } else { + result.include("error", "Email/Password Does Not Match!"); + result.redirectTo(AuthController.class).loginForm(); + } + } +} diff --git a/vraptor/src/main/java/com/baeldung/controllers/IndexController.java b/vraptor/src/main/java/com/baeldung/controllers/IndexController.java new file mode 100644 index 0000000000..cca34f5447 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/IndexController.java @@ -0,0 +1,40 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.Controller; +import br.com.caelum.vraptor.Path; +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import com.baeldung.daos.PostDao; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; + +@Controller +public class IndexController { + + private PostDao postDao; + private final Result result; + private static final Logger logger = LoggerFactory.getLogger(IndexController.class); + + public IndexController() { + this(null, null); + } + + @Inject + public IndexController(Result result, PostDao postDao) { + this.result = result; + this.postDao = postDao; + } + + @Path("/") + public void index() { + result.include("posts", postDao.all()); + result.use(FreemarkerView.class).withTemplate("index"); + } + + + + + +} \ No newline at end of file diff --git a/vraptor/src/main/java/com/baeldung/controllers/PostController.java b/vraptor/src/main/java/com/baeldung/controllers/PostController.java new file mode 100644 index 0000000000..979d0c28e2 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/controllers/PostController.java @@ -0,0 +1,77 @@ +package com.baeldung.controllers; + +import br.com.caelum.vraptor.Controller; +import br.com.caelum.vraptor.Get; +import br.com.caelum.vraptor.Path; +import br.com.caelum.vraptor.Result; +import br.com.caelum.vraptor.freemarker.FreemarkerView; +import br.com.caelum.vraptor.validator.Validator; +import com.baeldung.config.UserInfo; +import com.baeldung.daos.PostDao; +import com.baeldung.models.Post; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.logging.Logger; + +@Controller +public class PostController { + + private Result result; + private Logger logger = Logger.getLogger(PostController.class.getName()); + private PostDao postDao; + private UserInfo userInfo; + private Validator validator; + + public PostController() {} + + @Inject + public PostController(Result result, PostDao postDao, UserInfo userInfo, Validator validator) { + this.result = result; + this.postDao = postDao; + this.userInfo = userInfo; + this.validator = validator; + } + + @Get("/post/add") + public void addForm() { + + if(Objects.isNull(userInfo.getUser())) { + result.include("error", "Please Login to Proceed"); + result.redirectTo(AuthController.class).loginForm(); + return; + } + + result.use(FreemarkerView.class).withTemplate("posts/add"); + } + + @br.com.caelum.vraptor.Post("/post/add") + public void add(Post post) { + post.setAuthor(userInfo.getUser()); + validator.validate(post); + if(validator.hasErrors()) + result.include("errors", validator.getErrors()); + validator.onErrorRedirectTo(this).addForm(); + + Object id = postDao.add(post); + + if(Objects.nonNull(id)) { + result.include("status", "Post Added Successfully"); + result.redirectTo(IndexController.class).index(); + } else { + result.include( + "error", "There was an error creating the post. Try Again"); + result.redirectTo(this).addForm(); + } + } + + @Get("/posts/{id}") + public void view(int id) { + result.include("post", postDao.findById(id)); + result.use(FreemarkerView.class).withTemplate("view"); + } + + + +} diff --git a/vraptor/src/main/java/com/baeldung/daos/PostDao.java b/vraptor/src/main/java/com/baeldung/daos/PostDao.java new file mode 100644 index 0000000000..e9a62b5b5e --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/daos/PostDao.java @@ -0,0 +1,54 @@ +package com.baeldung.daos; + +import com.baeldung.controllers.PostController; +import com.baeldung.models.Post; +import org.hibernate.Session; +import org.hibernate.SessionFactory; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import java.util.List; +import java.util.logging.Logger; + +@RequestScoped +public class PostDao { + + private Logger logger = Logger.getLogger(PostController.class.getName()); + private SessionFactory sessionFactory; + + public PostDao() {} + + @Inject + public PostDao(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + public Object add(Post post) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Object id = session.save(post); + session.getTransaction().commit(); + session.close(); + return id; + } + + public Post findById(int id) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Post post = (Post) session.get(Post.class, id); + session.getTransaction().commit(); + session.close(); + return post; + } + + + public List all() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + List posts = (List) session.createQuery("FROM Post p").list(); + session.getTransaction().commit(); + session.close(); + return posts; + } + +} diff --git a/vraptor/src/main/java/com/baeldung/daos/UserDao.java b/vraptor/src/main/java/com/baeldung/daos/UserDao.java new file mode 100644 index 0000000000..6af1a49d25 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/daos/UserDao.java @@ -0,0 +1,50 @@ +package com.baeldung.daos; + +import com.baeldung.models.User; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; +import org.omg.PortableInterceptor.LOCATION_FORWARD; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import java.util.logging.Logger; + +@RequestScoped +public class UserDao { + + SessionFactory sessionFactory; + + public UserDao() { + this(null); + } + + @Inject + public UserDao(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + + public Object add(User user) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Object Id = session.save(user); + session.getTransaction().commit(); + return Id; + } + + public User findByEmail(String email) { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Criteria criteria = session.createCriteria(User.class); + criteria.add(Restrictions.eq("email", email)); + criteria.setMaxResults(1); + User u = (User) criteria.uniqueResult(); + session.getTransaction().commit(); + session.close(); + return u; + } + +} diff --git a/vraptor/src/main/java/com/baeldung/models/Post.java b/vraptor/src/main/java/com/baeldung/models/Post.java new file mode 100644 index 0000000000..6beb6e1682 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/models/Post.java @@ -0,0 +1,105 @@ +package com.baeldung.models; + + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.logging.Logger; + +@Entity +@Table(name = "posts") +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @NotNull @Size(min = 10) + @Column(columnDefinition = "longtext") + private String post; + + @NotNull @Size(min = 5, max = 100) + @Column(unique = true) + private String title; + + @NotNull + @ManyToOne(targetEntity = User.class, optional = false) + private User author; + + @Column(name = "created_at") + private Date createdAt; + + @Column(name = "updated_at") + private Date updatedAt; + + @Transient + private Logger logger = Logger.getLogger(getClass().getName()); + + public Post() { + createdAt = new Date(); + updatedAt = new Date(); + } + + public Post(String title, String post, User author) { + this.title = title; + this.post = post; + this.author = author; + createdAt = new Date(); + updatedAt = new Date(); + } + + public int getId() { + return id; + } + + public String getPost() { + return post; + } + + public void setPost(String post) { + this.post = post; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public User getAuthor() { + return author; + } + + public void setAuthor(User author) { + this.author = author; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "title: " + this.title + + "\npost: " + this.post + + "\nauthor: " + this.author + +"\ncreatetdAt: " + this.createdAt + + "\nupdatedAt: " + this.updatedAt; + } +} diff --git a/vraptor/src/main/java/com/baeldung/models/User.java b/vraptor/src/main/java/com/baeldung/models/User.java new file mode 100644 index 0000000000..b0f3bd9500 --- /dev/null +++ b/vraptor/src/main/java/com/baeldung/models/User.java @@ -0,0 +1,101 @@ +package com.baeldung.models; + +import org.hibernate.validator.constraints.Email; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; +import java.util.Date; + +@Entity +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @NotNull + @Size(min=3, max=255) + private String name; + + @Column(unique = true) + @NotNull @Email + private String email; + + @NotNull + @Size(min=6, max=255) + private String password; + + @Column(name = "created_at") + private Date createdAt; + + @Column(name = "updated_at") + private Date updatedAt; + + public User() { + updatedAt = new Date(); + createdAt = new Date(); + } + + public User(String name, String email, String password) { + this.name = name; + this.email = email; + this.password = password; + createdAt = new Date(); + updatedAt = new Date(); + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + + @Override + public String toString() { + return "Name: " + this.name + + "\nEmail: " + this.email; + } +} diff --git a/vraptor/src/main/resources/META-INF/beans.xml b/vraptor/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000000..9e32823437 --- /dev/null +++ b/vraptor/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/vraptor/src/main/resources/database.sql b/vraptor/src/main/resources/database.sql new file mode 100644 index 0000000000..bd4a1a6bde --- /dev/null +++ b/vraptor/src/main/resources/database.sql @@ -0,0 +1,55 @@ +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +CREATE DATABASE IF NOT EXISTS `larablog` /*!40100 DEFAULT CHARACTER SET latin1 */; +USE `larablog`; + +CREATE TABLE IF NOT EXISTS `posts` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `post` longtext COLLATE utf8mb4_unicode_ci NOT NULL, + `author_id` int(11) DEFAULT NULL, + `published` tinyint(1) NOT NULL DEFAULT 0, + `views` int(11) NOT NULL DEFAULT 0, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +DELETE FROM `posts`; +/*!40000 ALTER TABLE `posts` DISABLE KEYS */; +INSERT INTO `posts` (`id`, `title`, `post`, `author_id`, `published`, `views`, `created_at`, `updated_at`) VALUES + (2, 'Sample Post 2', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:19', NULL), + (3, 'Sample Post 3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:22', NULL), + (4, 'Sample Post 2212', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lobortis, ante in pretium volutpat, risus metus molestie odio, non placerat magna diam sit amet augue. Donec ullamcorper ornare mauris, id bibendum lacus viverra vel. Curabitur in pellentesque metus. Quisque gravida molestie turpis, id tincidunt purus viverra vitae. In sollicitudin, arcu at interdum sagittis, massa mi cursus diam, eu sodales purus erat vitae dui. Curabitur tempus urna consequat odio pretium pellentesque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tincidunt eros orci, sit amet pharetra eros accumsan vitae. Quisque a massa id nisi sodales rhoncus sed ut ante. Duis sed augue non velit feugiat varius eget eu velit. Nam commodo posuere massa sed convallis. Phasellus dapibus commodo lectus, vitae gravida lorem. Donec molestie a nisi ac mattis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam tempor ante et rutrum consequat.', 11, 1, 100, '2017-12-12 18:48:24', NULL), + (9, 'This is a Test', 'HJh sahjnasj hjas hjashj ashj ashj ashjsa sahjass naskjasnmas', 11, 0, 0, NULL, NULL), + (10, 'Test Title', 'hjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj', 11, 0, 0, NULL, NULL), + (11, 'Test Title 2', 'This is a as as sa asmas as as as as as', 11, 0, 0, NULL, NULL), + (12, 'This is another Test Article', 'There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don\'t look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn\'t anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.', 11, 0, 0, '2017-12-14 03:48:52', '2017-12-14 03:48:52'); +/*!40000 ALTER TABLE `posts` ENABLE KEYS */; + +CREATE TABLE IF NOT EXISTS `users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `is_admin` int(10) unsigned NULL DEFAULT 0, + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `users_email_unique` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +DELETE FROM `users`; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` (`id`, `name`, `email`, `password`, `is_admin`, `remember_token`, `created_at`, `updated_at`) VALUES + (11, 'Test User', 'test@test.com', '$2a$10$i/TgIqC3xRMnqCEbDryfxuZqhfM/qekfsaQUjBVPUKiiB3Nofr/wO', 0, NULL, '2017-12-14 03:40:57', '2017-12-14 03:40:57'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/vraptor/src/main/resources/hibernate.cfg.xml b/vraptor/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000000..dad0b44683 --- /dev/null +++ b/vraptor/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,31 @@ + + + + + + org.hibernate.dialect.MySQLDialect + + + com.mysql.cj.jdbc.Driver + + + jdbc:mysql://127.0.0.1:3306/larablog?serverTimezone=UTC + + + root + + + root + + + true + + + true + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/resources/log4j.xml b/vraptor/src/main/resources/log4j.xml new file mode 100644 index 0000000000..4e4c4636bc --- /dev/null +++ b/vraptor/src/main/resources/log4j.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/auth/login.ftl b/vraptor/src/main/resources/templates/auth/login.ftl new file mode 100644 index 0000000000..56ab2900cd --- /dev/null +++ b/vraptor/src/main/resources/templates/auth/login.ftl @@ -0,0 +1,172 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+

Login

+
${error!""} ${status!""}
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/auth/register.ftl b/vraptor/src/main/resources/templates/auth/register.ftl new file mode 100644 index 0000000000..c65264c834 --- /dev/null +++ b/vraptor/src/main/resources/templates/auth/register.ftl @@ -0,0 +1,194 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+

Register

+
${error!""} ${status!""}
+ <#if errors??> + <#list errors as error> +
${error.category?upper_case}: ${error.message}
+ <#else> + + <#else> + +
+
+
+ + +

+
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/index.ftl b/vraptor/src/main/resources/templates/index.ftl new file mode 100644 index 0000000000..d65d73f534 --- /dev/null +++ b/vraptor/src/main/resources/templates/index.ftl @@ -0,0 +1,173 @@ + + + + + + + + + + + + Clean Blog + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Clean Blog

+
+ A Clean Blog Theme by Start Bootstrap +
+
+
+
+
+ + +
+
+
+
${error!""} ${status!""}
+ <#list posts as post> +
+ +

+ ${post.title} +

+

+ <#if (post.post?length > 50) >${post.post?substring(0,50)} <#else> ${post.post} +

+
+ +
+
+ <#else> +

+ NO POSTS YET! +

+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/posts/add.ftl b/vraptor/src/main/resources/templates/posts/add.ftl new file mode 100644 index 0000000000..de036cea20 --- /dev/null +++ b/vraptor/src/main/resources/templates/posts/add.ftl @@ -0,0 +1,164 @@ + + + + + + + + + + + + Clean Blog - Contact + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Compose the Next Viral Message!

+
${error!""} ${status!""}
+ <#if errors??> + <#list errors as error> +
${error.category?upper_case}: ${error.message}
+ <#else> + + <#else> + +
+
+
+ + +

+
+
+
+
+ + +

+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + diff --git a/vraptor/src/main/resources/templates/view.ftl b/vraptor/src/main/resources/templates/view.ftl new file mode 100644 index 0000000000..96525cc93a --- /dev/null +++ b/vraptor/src/main/resources/templates/view.ftl @@ -0,0 +1,152 @@ + + + + + + + + + + + + Clean Blog - Sample Post + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

${post.title}

+ Posted by Start Bootstrap on ${post.createdAt!''} +
+
+
+
+
+ + +
+
+
+
+

+ ${post.post} +

+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/META-INF/MANIFEST.MF b/vraptor/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/vraptor/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp b/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp new file mode 100644 index 0000000000..61efbb9e1d --- /dev/null +++ b/vraptor/src/main/webapp/WEB-INF/jsp/index/index.jsp @@ -0,0 +1,10 @@ + + + + +VRaptor Blank Project + + + It works!! JSP ${variable} ${linkTo[IndexController].index} + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/WEB-INF/web.xml b/vraptor/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..f778a0e779 --- /dev/null +++ b/vraptor/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,19 @@ + + + + vraptor-blank-project + + + javax.servlet.jsp.jstl.fmt.localizationContext + messages + + + + org.jboss.weld.environment.servlet.Listener + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/css/clean-blog.css b/vraptor/src/main/webapp/css/clean-blog.css new file mode 100644 index 0000000000..04a94f0e0f --- /dev/null +++ b/vraptor/src/main/webapp/css/clean-blog.css @@ -0,0 +1,400 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +body { + font-family: 'Lora', 'Times New Roman', serif; + font-size: 20px; + color: #333333; +} +p { + line-height: 1.5; + margin: 30px 0; +} +p a { + text-decoration: underline; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 800; +} +a { + color: #333333; +} +a:hover, +a:focus { + color: #0085A1; +} +a img:hover, +a img:focus { + cursor: zoom-in; +} +blockquote { + color: #777777; + font-style: italic; +} +hr.small { + max-width: 100px; + margin: 15px auto; + border-width: 4px; + border-color: white; +} +.navbar-custom { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 3; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +.navbar-custom .navbar-brand { + font-weight: 800; +} +.navbar-custom .navbar-header .navbar-toggle { + color: #777777; + font-weight: 800; + text-transform: uppercase; + font-size: 12px; +} +.navbar-custom .nav li a { + text-transform: uppercase; + font-size: 12px; + font-weight: 800; + letter-spacing: 1px; +} +@media only screen and (min-width: 768px) { + .navbar-custom { + background: transparent; + border-bottom: 1px solid transparent; + } + .navbar-custom .navbar-brand { + color: white; + padding: 20px; + } + .navbar-custom .navbar-brand:hover, + .navbar-custom .navbar-brand:focus { + color: rgba(255, 255, 255, 0.8); + } + .navbar-custom .nav li a { + color: white; + padding: 20px; + } + .navbar-custom .nav li a:hover, + .navbar-custom .nav li a:focus { + color: rgba(255, 255, 255, 0.8); + } +} +@media only screen and (min-width: 1170px) { + .navbar-custom { + -webkit-transition: background-color 0.3s; + -moz-transition: background-color 0.3s; + transition: background-color 0.3s; + /* Force Hardware Acceleration in WebKit */ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + .navbar-custom.is-fixed { + /* when the user scrolls down, we hide the header right above the viewport */ + position: fixed; + top: -61px; + background-color: rgba(255, 255, 255, 0.9); + border-bottom: 1px solid #f2f2f2; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + transition: transform 0.3s; + } + .navbar-custom.is-fixed .navbar-brand { + color: #333333; + } + .navbar-custom.is-fixed .navbar-brand:hover, + .navbar-custom.is-fixed .navbar-brand:focus { + color: #0085A1; + } + .navbar-custom.is-fixed .nav li a { + color: #333333; + } + .navbar-custom.is-fixed .nav li a:hover, + .navbar-custom.is-fixed .nav li a:focus { + color: #0085A1; + } + .navbar-custom.is-visible { + /* if the user changes the scrolling direction, we show the header */ + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.intro-header { + background-color: #777777; + background: no-repeat center center; + background-attachment: scroll; + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + -o-background-size: cover; + margin-bottom: 50px; +} +.intro-header .site-heading, +.intro-header .post-heading, +.intro-header .page-heading { + padding: 100px 0 50px; + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading, + .intro-header .post-heading, + .intro-header .page-heading { + padding: 150px 0; + } +} +.intro-header .site-heading, +.intro-header .page-heading { + text-align: center; +} +.intro-header .site-heading h1, +.intro-header .page-heading h1 { + margin-top: 0; + font-size: 50px; +} +.intro-header .site-heading .subheading, +.intro-header .page-heading .subheading { + font-size: 24px; + line-height: 1.1; + display: block; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + margin: 10px 0 0; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading h1, + .intro-header .page-heading h1 { + font-size: 80px; + } +} +.intro-header .post-heading h1 { + font-size: 35px; +} +.intro-header .post-heading .subheading, +.intro-header .post-heading .meta { + line-height: 1.1; + display: block; +} +.intro-header .post-heading .subheading { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 24px; + margin: 10px 0 30px; + font-weight: 600; +} +.intro-header .post-heading .meta { + font-family: 'Lora', 'Times New Roman', serif; + font-style: italic; + font-weight: 300; + font-size: 20px; +} +.intro-header .post-heading .meta a { + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .post-heading h1 { + font-size: 55px; + } + .intro-header .post-heading .subheading { + font-size: 30px; + } +} +.post-preview > a { + color: #333333; +} +.post-preview > a:hover, +.post-preview > a:focus { + text-decoration: none; + color: #0085A1; +} +.post-preview > a > .post-title { + font-size: 30px; + margin-top: 30px; + margin-bottom: 10px; +} +.post-preview > a > .post-subtitle { + margin: 0; + font-weight: 300; + margin-bottom: 10px; +} +.post-preview > .post-meta { + color: #777777; + font-size: 18px; + font-style: italic; + margin-top: 0; +} +.post-preview > .post-meta > a { + text-decoration: none; + color: #333333; +} +.post-preview > .post-meta > a:hover, +.post-preview > .post-meta > a:focus { + color: #0085A1; + text-decoration: underline; +} +@media only screen and (min-width: 768px) { + .post-preview > a > .post-title { + font-size: 36px; + } +} +.section-heading { + font-size: 36px; + margin-top: 60px; + font-weight: 700; +} +.caption { + text-align: center; + font-size: 14px; + padding: 10px; + font-style: italic; + margin: 0; + display: block; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +footer { + padding: 50px 0 65px; +} +footer .list-inline { + margin: 0; + padding: 0; +} +footer .copyright { + font-size: 14px; + text-align: center; + margin-bottom: 0; +} +.floating-label-form-group { + font-size: 14px; + position: relative; + margin-bottom: 0; + padding-bottom: 0.5em; + border-bottom: 1px solid #eeeeee; +} +.floating-label-form-group input, +.floating-label-form-group textarea { + z-index: 1; + position: relative; + padding-right: 0; + padding-left: 0; + border: none; + border-radius: 0; + font-size: 1.5em; + background: none; + box-shadow: none !important; + resize: none; +} +.floating-label-form-group label { + display: block; + z-index: 0; + position: relative; + top: 2em; + margin: 0; + font-size: 0.85em; + line-height: 1.764705882em; + vertical-align: middle; + vertical-align: baseline; + opacity: 0; + -webkit-transition: top 0.3s ease,opacity 0.3s ease; + -moz-transition: top 0.3s ease,opacity 0.3s ease; + -ms-transition: top 0.3s ease,opacity 0.3s ease; + transition: top 0.3s ease,opacity 0.3s ease; +} +.floating-label-form-group::not(:first-child) { + padding-left: 14px; + border-left: 1px solid #eeeeee; +} +.floating-label-form-group-with-value label { + top: 0; + opacity: 1; +} +.floating-label-form-group-with-focus label { + color: #0085A1; +} +form .row:first-child .floating-label-form-group { + border-top: 1px solid #eeeeee; +} +.btn { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + border-radius: 0; + padding: 15px 25px; +} +.btn-lg { + font-size: 16px; + padding: 25px 35px; +} +.btn-default:hover, +.btn-default:focus { + background-color: #0085A1; + border: 1px solid #0085A1; + color: white; +} +.pager { + margin: 20px 0 0; +} +.pager li > a, +.pager li > span { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + padding: 15px 25px; + background-color: white; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + color: white; + background-color: #0085A1; + border: 1px solid #0085A1; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #333333; + cursor: not-allowed; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #0085A1; +} +::selection { + color: white; + text-shadow: none; + background: #0085A1; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} +body { + -webkit-tap-highlight-color: #0085A1; +} diff --git a/vraptor/src/main/webapp/css/clean-blog.min.css b/vraptor/src/main/webapp/css/clean-blog.min.css new file mode 100644 index 0000000000..faa3794436 --- /dev/null +++ b/vraptor/src/main/webapp/css/clean-blog.min.css @@ -0,0 +1,5 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */a,body{color:#333}.navbar-custom .nav li a,.navbar-custom .navbar-brand,h1,h2,h3,h4,h5,h6{font-weight:800}.caption,.intro-header .page-heading,.intro-header .site-heading,footer .copyright{text-align:center}body{font-family:Lora,'Times New Roman',serif;font-size:20px;-webkit-tap-highlight-color:#0085A1}.intro-header .page-heading .subheading,.intro-header .post-heading .subheading,.intro-header .site-heading .subheading,.navbar-custom,h1,h2,h3,h4,h5,h6{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}p{line-height:1.5;margin:30px 0}p a{text-decoration:underline}a:focus,a:hover{color:#0085A1}a img:focus,a img:hover{cursor:zoom-in}blockquote{color:#777;font-style:italic}hr.small{max-width:100px;margin:15px auto;border-width:4px;border-color:#fff}.navbar-custom{position:absolute;top:0;left:0;width:100%;z-index:3}.navbar-custom .navbar-header .navbar-toggle{color:#777;font-weight:800;text-transform:uppercase;font-size:12px}.navbar-custom .nav li a{text-transform:uppercase;font-size:12px;letter-spacing:1px}@media only screen and (min-width:768px){.navbar-custom{background:0 0;border-bottom:1px solid transparent}.navbar-custom .navbar-brand{color:#fff;padding:20px}.navbar-custom .navbar-brand:focus,.navbar-custom .navbar-brand:hover{color:rgba(255,255,255,.8)}.navbar-custom .nav li a{color:#fff;padding:20px}.navbar-custom .nav li a:focus,.navbar-custom .nav li a:hover{color:rgba(255,255,255,.8)}}@media only screen and (min-width:1170px){.navbar-custom{-webkit-transition:background-color .3s;-moz-transition:background-color .3s;transition:background-color .3s;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.navbar-custom.is-fixed{position:fixed;top:-61px;background-color:rgba(255,255,255,.9);border-bottom:1px solid #f2f2f2;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;transition:transform .3s}.navbar-custom.is-fixed .navbar-brand{color:#333}.navbar-custom.is-fixed .navbar-brand:focus,.navbar-custom.is-fixed .navbar-brand:hover{color:#0085A1}.navbar-custom.is-fixed .nav li a{color:#333}.navbar-custom.is-fixed .nav li a:focus,.navbar-custom.is-fixed .nav li a:hover{color:#0085A1}.navbar-custom.is-visible{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.intro-header{background:center center no-repeat;-webkit-background-size:cover;-moz-background-size:cover;background-size:cover;-o-background-size:cover;margin-bottom:50px}.intro-header .page-heading,.intro-header .post-heading,.intro-header .site-heading{padding:100px 0 50px;color:#fff}.intro-header .page-heading h1,.intro-header .site-heading h1{margin-top:0;font-size:50px}.intro-header .page-heading .subheading,.intro-header .site-heading .subheading{font-size:24px;line-height:1.1;display:block;font-weight:300;margin:10px 0 0}@media only screen and (min-width:768px){.intro-header .page-heading,.intro-header .post-heading,.intro-header .site-heading{padding:150px 0}.intro-header .page-heading h1,.intro-header .site-heading h1{font-size:80px}}.intro-header .post-heading h1{font-size:35px}.intro-header .post-heading .meta,.intro-header .post-heading .subheading{line-height:1.1;display:block}.intro-header .post-heading .subheading{font-size:24px;margin:10px 0 30px;font-weight:600}.intro-header .post-heading .meta{font-family:Lora,'Times New Roman',serif;font-style:italic;font-weight:300;font-size:20px}.intro-header .post-heading .meta a{color:#fff}@media only screen and (min-width:768px){.intro-header .post-heading h1{font-size:55px}.intro-header .post-heading .subheading{font-size:30px}}.post-preview>a{color:#333}.post-preview>a:focus,.post-preview>a:hover{text-decoration:none;color:#0085A1}.post-preview>a>.post-title{font-size:30px;margin-top:30px;margin-bottom:10px}.post-preview>a>.post-subtitle{margin:0 0 10px;font-weight:300}.post-preview>.post-meta{color:#777;font-size:18px;font-style:italic;margin-top:0}.post-preview>.post-meta>a{text-decoration:none;color:#333}.post-preview>.post-meta>a:focus,.post-preview>.post-meta>a:hover{color:#0085A1;text-decoration:underline}@media only screen and (min-width:768px){.post-preview>a>.post-title{font-size:36px}}.section-heading{font-size:36px;margin-top:60px;font-weight:700}.btn,.pager li>a,.pager li>span{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;text-transform:uppercase;font-weight:800;letter-spacing:1px}.caption{font-size:14px;padding:10px;font-style:italic;margin:0;display:block;border-bottom-right-radius:5px;border-bottom-left-radius:5px}footer{padding:50px 0 65px}footer .list-inline{margin:0;padding:0}footer .copyright{font-size:14px;margin-bottom:0}.floating-label-form-group{font-size:14px;position:relative;margin-bottom:0;padding-bottom:.5em;border-bottom:1px solid #eee}.floating-label-form-group input,.floating-label-form-group textarea{z-index:1;position:relative;padding-right:0;padding-left:0;border:none;border-radius:0;font-size:1.5em;background:0 0;box-shadow:none!important;resize:none}.floating-label-form-group label{display:block;z-index:0;position:relative;top:2em;margin:0;font-size:.85em;line-height:1.764705882em;vertical-align:middle;vertical-align:baseline;opacity:0;-webkit-transition:top .3s ease,opacity .3s ease;-moz-transition:top .3s ease,opacity .3s ease;-ms-transition:top .3s ease,opacity .3s ease;transition:top .3s ease,opacity .3s ease}.floating-label-form-group::not(:first-child){padding-left:14px;border-left:1px solid #eee}.floating-label-form-group-with-value label{top:0;opacity:1}.floating-label-form-group-with-focus label{color:#0085A1}form .row:first-child .floating-label-form-group{border-top:1px solid #eee}.btn{font-size:14px;border-radius:0;padding:15px 25px}.btn-lg{font-size:16px;padding:25px 35px}.btn-default:focus,.btn-default:hover{background-color:#0085A1;border:1px solid #0085A1;color:#fff}.pager{margin:20px 0 0}.pager li>a,.pager li>span{font-size:14px;padding:15px 25px;background-color:#fff;border-radius:0}.pager li>a:focus,.pager li>a:hover{color:#fff;background-color:#0085A1;border:1px solid #0085A1}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#333;cursor:not-allowed}::-moz-selection{color:#fff;text-shadow:none;background:#0085A1}::selection{color:#fff;text-shadow:none;background:#0085A1}img::selection{color:#fff;background:0 0}img::-moz-selection{color:#fff;background:0 0} \ No newline at end of file diff --git a/vraptor/src/main/webapp/img/about-bg.jpg b/vraptor/src/main/webapp/img/about-bg.jpg new file mode 100644 index 0000000000..af6d4d5cd1 Binary files /dev/null and b/vraptor/src/main/webapp/img/about-bg.jpg differ diff --git a/vraptor/src/main/webapp/img/contact-bg.jpg b/vraptor/src/main/webapp/img/contact-bg.jpg new file mode 100644 index 0000000000..9bf21a4e4b Binary files /dev/null and b/vraptor/src/main/webapp/img/contact-bg.jpg differ diff --git a/vraptor/src/main/webapp/img/home-bg.jpg b/vraptor/src/main/webapp/img/home-bg.jpg new file mode 100644 index 0000000000..a4d2108a3f Binary files /dev/null and b/vraptor/src/main/webapp/img/home-bg.jpg differ diff --git a/vraptor/src/main/webapp/img/post-bg.jpg b/vraptor/src/main/webapp/img/post-bg.jpg new file mode 100644 index 0000000000..21750a49b0 Binary files /dev/null and b/vraptor/src/main/webapp/img/post-bg.jpg differ diff --git a/vraptor/src/main/webapp/img/post-sample-image.jpg b/vraptor/src/main/webapp/img/post-sample-image.jpg new file mode 100644 index 0000000000..3fc4282987 Binary files /dev/null and b/vraptor/src/main/webapp/img/post-sample-image.jpg differ diff --git a/vraptor/src/main/webapp/js/clean-blog.js b/vraptor/src/main/webapp/js/clean-blog.js new file mode 100644 index 0000000000..26a60cce5f --- /dev/null +++ b/vraptor/src/main/webapp/js/clean-blog.js @@ -0,0 +1,40 @@ +// Floating label headings for the contact form +$(function() { + $("body").on("input propertychange", ".floating-label-form-group", function(e) { + $(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val()); + }).on("focus", ".floating-label-form-group", function() { + $(this).addClass("floating-label-form-group-with-focus"); + }).on("blur", ".floating-label-form-group", function() { + $(this).removeClass("floating-label-form-group-with-focus"); + }); +}); + +// Navigation Scripts to Show Header on Scroll-Up +jQuery(document).ready(function($) { + var MQL = 1170; + + //primary navigation slide-in effect + if ($(window).width() > MQL) { + var headerHeight = $('.navbar-custom').height(); + $(window).on('scroll', { + previousTop: 0 + }, + function() { + var currentTop = $(window).scrollTop(); + //check if user is scrolling up + if (currentTop < this.previousTop) { + //if scrolling up... + if (currentTop > 0 && $('.navbar-custom').hasClass('is-fixed')) { + $('.navbar-custom').addClass('is-visible'); + } else { + $('.navbar-custom').removeClass('is-visible is-fixed'); + } + } else if (currentTop > this.previousTop) { + //if scrolling down... + $('.navbar-custom').removeClass('is-visible'); + if (currentTop > headerHeight && !$('.navbar-custom').hasClass('is-fixed')) $('.navbar-custom').addClass('is-fixed'); + } + this.previousTop = currentTop; + }); + } +}); diff --git a/vraptor/src/main/webapp/js/clean-blog.min.js b/vraptor/src/main/webapp/js/clean-blog.min.js new file mode 100644 index 0000000000..852db7e938 --- /dev/null +++ b/vraptor/src/main/webapp/js/clean-blog.min.js @@ -0,0 +1,6 @@ +/*! + * Start Bootstrap - Clean Blog v3.3.7+1 (http://startbootstrap.com/template-overviews/clean-blog) + * Copyright 2013-2016 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) + */ +$(function(){$("body").on("input propertychange",".floating-label-form-group",function(o){$(this).toggleClass("floating-label-form-group-with-value",!!$(o.target).val())}).on("focus",".floating-label-form-group",function(){$(this).addClass("floating-label-form-group-with-focus")}).on("blur",".floating-label-form-group",function(){$(this).removeClass("floating-label-form-group-with-focus")})}),jQuery(document).ready(function(o){var s=1170;if(o(window).width()>s){var i=o(".navbar-custom").height();o(window).on("scroll",{previousTop:0},function(){var s=o(window).scrollTop();s0&&o(".navbar-custom").hasClass("is-fixed")?o(".navbar-custom").addClass("is-visible"):o(".navbar-custom").removeClass("is-visible is-fixed"):s>this.previousTop&&(o(".navbar-custom").removeClass("is-visible"),s>i&&!o(".navbar-custom").hasClass("is-fixed")&&o(".navbar-custom").addClass("is-fixed")),this.previousTop=s})}}); \ No newline at end of file diff --git a/vraptor/src/main/webapp/js/contact_me.js b/vraptor/src/main/webapp/js/contact_me.js new file mode 100644 index 0000000000..c3d8ecce26 --- /dev/null +++ b/vraptor/src/main/webapp/js/contact_me.js @@ -0,0 +1,72 @@ +// Contact Form Scripts + +$(function() { + + $("#contactForm input,#contactForm textarea").jqBootstrapValidation({ + preventSubmit: true, + submitError: function($form, event, errors) { + // additional error messages or events + }, + submitSuccess: function($form, event) { + event.preventDefault(); // prevent default submit behaviour + // get values from FORM + var name = $("input#name").val(); + var email = $("input#email").val(); + var phone = $("input#phone").val(); + var message = $("textarea#message").val(); + var firstName = name; // For Success/Failure Message + // Check for white space in name for Success/Fail message + if (firstName.indexOf(' ') >= 0) { + firstName = name.split(' ').slice(0, -1).join(' '); + } + $.ajax({ + url: "././mail/contact_me.php", + type: "POST", + data: { + name: name, + phone: phone, + email: email, + message: message + }, + cache: false, + success: function() { + // Success message + $('#success').html("
"); + $('#success > .alert-success').html(""); + $('#success > .alert-success') + .append("Your message has been sent. "); + $('#success > .alert-success') + .append('
'); + + //clear all fields + $('#contactForm').trigger("reset"); + }, + error: function() { + // Fail message + $('#success').html("
"); + $('#success > .alert-danger').html(""); + $('#success > .alert-danger').append("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!"); + $('#success > .alert-danger').append('
'); + //clear all fields + $('#contactForm').trigger("reset"); + }, + }); + }, + filter: function() { + return $(this).is(":visible"); + }, + }); + + $("a[data-toggle=\"tab\"]").click(function(e) { + e.preventDefault(); + $(this).tab("show"); + }); +}); + + +/*When clicking on Full hide fail/success boxes */ +$('#name').focus(function() { + $('#success').html(''); +}); diff --git a/vraptor/src/main/webapp/js/jqBootstrapValidation.js b/vraptor/src/main/webapp/js/jqBootstrapValidation.js new file mode 100644 index 0000000000..7b3b922251 --- /dev/null +++ b/vraptor/src/main/webapp/js/jqBootstrapValidation.js @@ -0,0 +1,912 @@ +/* jqBootstrapValidation + * A plugin for automating validation on Twitter Bootstrap formatted forms. + * + * v1.3.6 + * + * License: MIT - see LICENSE file + * + * http://ReactiveRaven.github.com/jqBootstrapValidation/ + */ + +(function( $ ){ + + var createdElements = []; + + var defaults = { + options: { + prependExistingHelpBlock: false, + sniffHtml: true, // sniff for 'required', 'maxlength', etc + preventSubmit: true, // stop the form submit event from firing if validation fails + submitError: false, // function called if there is an error when trying to submit + submitSuccess: false, // function called just before a successful submit event is sent to the server + semanticallyStrict: false, // set to true to tidy up generated HTML output + autoAdd: { + helpBlocks: true + }, + filter: function () { + // return $(this).is(":visible"); // only validate elements you can see + return true; // validate everything + } + }, + methods: { + init : function( options ) { + + var settings = $.extend(true, {}, defaults); + + settings.options = $.extend(true, settings.options, options); + + var $siblingElements = this; + + var uniqueForms = $.unique( + $siblingElements.map( function () { + return $(this).parents("form")[0]; + }).toArray() + ); + + $(uniqueForms).bind("submit", function (e) { + var $form = $(this); + var warningsFound = 0; + var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter); + $inputs.trigger("submit.validation").trigger("validationLostFocus.validation"); + + $inputs.each(function (i, el) { + var $this = $(el), + $controlGroup = $this.parents(".form-group").first(); + if ( + $controlGroup.hasClass("warning") + ) { + $controlGroup.removeClass("warning").addClass("error"); + warningsFound++; + } + }); + + $inputs.trigger("validationLostFocus.validation"); + + if (warningsFound) { + if (settings.options.preventSubmit) { + e.preventDefault(); + } + $form.addClass("error"); + if ($.isFunction(settings.options.submitError)) { + settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true)); + } + } else { + $form.removeClass("error"); + if ($.isFunction(settings.options.submitSuccess)) { + settings.options.submitSuccess($form, e); + } + } + }); + + return this.each(function(){ + + // Get references to everything we're interested in + var $this = $(this), + $controlGroup = $this.parents(".form-group").first(), + $helpBlock = $controlGroup.find(".help-block").first(), + $form = $this.parents("form").first(), + validatorNames = []; + + // create message container if not exists + if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) { + $helpBlock = $('
'); + $controlGroup.find('.controls').append($helpBlock); + createdElements.push($helpBlock[0]); + } + + // ============================================================= + // SNIFF HTML FOR VALIDATORS + // ============================================================= + + // *snort sniff snuffle* + + if (settings.options.sniffHtml) { + var message = ""; + // --------------------------------------------------------- + // PATTERN + // --------------------------------------------------------- + if ($this.attr("pattern") !== undefined) { + message = "Not in the expected format"; + if ($this.data("validationPatternMessage")) { + message = $this.data("validationPatternMessage"); + } + $this.data("validationPatternMessage", message); + $this.data("validationPatternRegex", $this.attr("pattern")); + } + // --------------------------------------------------------- + // MAX + // --------------------------------------------------------- + if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { + var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); + message = "Too high: Maximum of '" + max + "'"; + if ($this.data("validationMaxMessage")) { + message = $this.data("validationMaxMessage"); + } + $this.data("validationMaxMessage", message); + $this.data("validationMaxMax", max); + } + // --------------------------------------------------------- + // MIN + // --------------------------------------------------------- + if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { + var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); + message = "Too low: Minimum of '" + min + "'"; + if ($this.data("validationMinMessage")) { + message = $this.data("validationMinMessage"); + } + $this.data("validationMinMessage", message); + $this.data("validationMinMin", min); + } + // --------------------------------------------------------- + // MAXLENGTH + // --------------------------------------------------------- + if ($this.attr("maxlength") !== undefined) { + message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters"; + if ($this.data("validationMaxlengthMessage")) { + message = $this.data("validationMaxlengthMessage"); + } + $this.data("validationMaxlengthMessage", message); + $this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); + } + // --------------------------------------------------------- + // MINLENGTH + // --------------------------------------------------------- + if ($this.attr("minlength") !== undefined) { + message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters"; + if ($this.data("validationMinlengthMessage")) { + message = $this.data("validationMinlengthMessage"); + } + $this.data("validationMinlengthMessage", message); + $this.data("validationMinlengthMinlength", $this.attr("minlength")); + } + // --------------------------------------------------------- + // REQUIRED + // --------------------------------------------------------- + if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { + message = settings.builtInValidators.required.message; + if ($this.data("validationRequiredMessage")) { + message = $this.data("validationRequiredMessage"); + } + $this.data("validationRequiredMessage", message); + } + // --------------------------------------------------------- + // NUMBER + // --------------------------------------------------------- + if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") { + message = settings.builtInValidators.number.message; + if ($this.data("validationNumberMessage")) { + message = $this.data("validationNumberMessage"); + } + $this.data("validationNumberMessage", message); + } + // --------------------------------------------------------- + // EMAIL + // --------------------------------------------------------- + if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") { + message = "Not a valid email address"; + if ($this.data("validationValidemailMessage")) { + message = $this.data("validationValidemailMessage"); + } else if ($this.data("validationEmailMessage")) { + message = $this.data("validationEmailMessage"); + } + $this.data("validationValidemailMessage", message); + } + // --------------------------------------------------------- + // MINCHECKED + // --------------------------------------------------------- + if ($this.attr("minchecked") !== undefined) { + message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required"; + if ($this.data("validationMincheckedMessage")) { + message = $this.data("validationMincheckedMessage"); + } + $this.data("validationMincheckedMessage", message); + $this.data("validationMincheckedMinchecked", $this.attr("minchecked")); + } + // --------------------------------------------------------- + // MAXCHECKED + // --------------------------------------------------------- + if ($this.attr("maxchecked") !== undefined) { + message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required"; + if ($this.data("validationMaxcheckedMessage")) { + message = $this.data("validationMaxcheckedMessage"); + } + $this.data("validationMaxcheckedMessage", message); + $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked")); + } + } + + // ============================================================= + // COLLECT VALIDATOR NAMES + // ============================================================= + + // Get named validators + if ($this.data("validation") !== undefined) { + validatorNames = $this.data("validation").split(","); + } + + // Get extra ones defined on the element's data attributes + $.each($this.data(), function (i, el) { + var parts = i.replace(/([A-Z])/g, ",$1").split(","); + if (parts[0] === "validation" && parts[1]) { + validatorNames.push(parts[1]); + } + }); + + // ============================================================= + // NORMALISE VALIDATOR NAMES + // ============================================================= + + var validatorNamesToInspect = validatorNames; + var newValidatorNamesToInspect = []; + + do // repeatedly expand 'shortcut' validators into their real validators + { + // Uppercase only the first letter of each name + $.each(validatorNames, function (i, el) { + validatorNames[i] = formatValidatorName(el); + }); + + // Remove duplicate validator names + validatorNames = $.unique(validatorNames); + + // Pull out the new validator names from each shortcut + newValidatorNamesToInspect = []; + $.each(validatorNamesToInspect, function(i, el) { + if ($this.data("validation" + el + "Shortcut") !== undefined) { + // Are these custom validators? + // Pull them out! + $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) { + newValidatorNamesToInspect.push(el2); + }); + } else if (settings.builtInValidators[el.toLowerCase()]) { + // Is this a recognised built-in? + // Pull it out! + var validator = settings.builtInValidators[el.toLowerCase()]; + if (validator.type.toLowerCase() === "shortcut") { + $.each(validator.shortcut.split(","), function (i, el) { + el = formatValidatorName(el); + newValidatorNamesToInspect.push(el); + validatorNames.push(el); + }); + } + } + }); + + validatorNamesToInspect = newValidatorNamesToInspect; + + } while (validatorNamesToInspect.length > 0) + + // ============================================================= + // SET UP VALIDATOR ARRAYS + // ============================================================= + + var validators = {}; + + $.each(validatorNames, function (i, el) { + // Set up the 'override' message + var message = $this.data("validation" + el + "Message"); + var hasOverrideMessage = (message !== undefined); + var foundValidator = false; + message = + ( + message + ? message + : "'" + el + "' validation failed " + ) + ; + + $.each( + settings.validatorTypes, + function (validatorType, validatorTemplate) { + if (validators[validatorType] === undefined) { + validators[validatorType] = []; + } + if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) { + validators[validatorType].push( + $.extend( + true, + { + name: formatValidatorName(validatorTemplate.name), + message: message + }, + validatorTemplate.init($this, el) + ) + ); + foundValidator = true; + } + } + ); + + if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) { + + var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]); + if (hasOverrideMessage) { + validator.message = message; + } + var validatorType = validator.type.toLowerCase(); + + if (validatorType === "shortcut") { + foundValidator = true; + } else { + $.each( + settings.validatorTypes, + function (validatorTemplateType, validatorTemplate) { + if (validators[validatorTemplateType] === undefined) { + validators[validatorTemplateType] = []; + } + if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) { + $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]); + validators[validatorType].push( + $.extend( + validator, + validatorTemplate.init($this, el) + ) + ); + foundValidator = true; + } + } + ); + } + } + + if (! foundValidator) { + $.error("Cannot find validation info for '" + el + "'"); + } + }); + + // ============================================================= + // STORE FALLBACK VALUES + // ============================================================= + + $helpBlock.data( + "original-contents", + ( + $helpBlock.data("original-contents") + ? $helpBlock.data("original-contents") + : $helpBlock.html() + ) + ); + + $helpBlock.data( + "original-role", + ( + $helpBlock.data("original-role") + ? $helpBlock.data("original-role") + : $helpBlock.attr("role") + ) + ); + + $controlGroup.data( + "original-classes", + ( + $controlGroup.data("original-clases") + ? $controlGroup.data("original-classes") + : $controlGroup.attr("class") + ) + ); + + $this.data( + "original-aria-invalid", + ( + $this.data("original-aria-invalid") + ? $this.data("original-aria-invalid") + : $this.attr("aria-invalid") + ) + ); + + // ============================================================= + // VALIDATION + // ============================================================= + + $this.bind( + "validation.validation", + function (event, params) { + + var value = getValue($this); + + // Get a list of the errors to apply + var errorsFound = []; + + $.each(validators, function (validatorType, validatorTypeArray) { + if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) { + $.each(validatorTypeArray, function (i, validator) { + if (settings.validatorTypes[validatorType].validate($this, value, validator)) { + errorsFound.push(validator.message); + } + }); + } + }); + + return errorsFound; + } + ); + + $this.bind( + "getValidators.validation", + function () { + return validators; + } + ); + + // ============================================================= + // WATCH FOR CHANGES + // ============================================================= + $this.bind( + "submit.validation", + function () { + return $this.triggerHandler("change.validation", {submitting: true}); + } + ); + $this.bind( + [ + "keyup", + "focus", + "blur", + "click", + "keydown", + "keypress", + "change" + ].join(".validation ") + ".validation", + function (e, params) { + + var value = getValue($this); + + var errorsFound = []; + + $controlGroup.find("input,textarea,select").each(function (i, el) { + var oldCount = errorsFound.length; + $.each($(el).triggerHandler("validation.validation", params), function (j, message) { + errorsFound.push(message); + }); + if (errorsFound.length > oldCount) { + $(el).attr("aria-invalid", "true"); + } else { + var original = $this.data("original-aria-invalid"); + $(el).attr("aria-invalid", (original !== undefined ? original : false)); + } + }); + + $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation"); + + errorsFound = $.unique(errorsFound.sort()); + + // Were there any errors? + if (errorsFound.length) { + // Better flag it up as a warning. + $controlGroup.removeClass("success error").addClass("warning"); + + // How many errors did we find? + if (settings.options.semanticallyStrict && errorsFound.length === 1) { + // Only one? Being strict? Just output it. + $helpBlock.html(errorsFound[0] + + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); + } else { + // Multiple? Being sloppy? Glue them together into an UL. + $helpBlock.html("
  • " + errorsFound.join("
  • ") + "
" + + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); + } + } else { + $controlGroup.removeClass("warning error success"); + if (value.length > 0) { + $controlGroup.addClass("success"); + } + $helpBlock.html($helpBlock.data("original-contents")); + } + + if (e.type === "blur") { + $controlGroup.removeClass("success"); + } + } + ); + $this.bind("validationLostFocus.validation", function () { + $controlGroup.removeClass("success"); + }); + }); + }, + destroy : function( ) { + + return this.each( + function() { + + var + $this = $(this), + $controlGroup = $this.parents(".form-group").first(), + $helpBlock = $controlGroup.find(".help-block").first(); + + // remove our events + $this.unbind('.validation'); // events are namespaced. + // reset help text + $helpBlock.html($helpBlock.data("original-contents")); + // reset classes + $controlGroup.attr("class", $controlGroup.data("original-classes")); + // reset aria + $this.attr("aria-invalid", $this.data("original-aria-invalid")); + // reset role + $helpBlock.attr("role", $this.data("original-role")); + // remove all elements we created + if (createdElements.indexOf($helpBlock[0]) > -1) { + $helpBlock.remove(); + } + + } + ); + + }, + collectErrors : function(includeEmpty) { + + var errorMessages = {}; + this.each(function (i, el) { + var $el = $(el); + var name = $el.attr("name"); + var errors = $el.triggerHandler("validation.validation", {includeEmpty: true}); + errorMessages[name] = $.extend(true, errors, errorMessages[name]); + }); + + $.each(errorMessages, function (i, el) { + if (el.length === 0) { + delete errorMessages[i]; + } + }); + + return errorMessages; + + }, + hasErrors: function() { + + var errorMessages = []; + + this.each(function (i, el) { + errorMessages = errorMessages.concat( + $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : [] + ); + }); + + return (errorMessages.length > 0); + }, + override : function (newDefaults) { + defaults = $.extend(true, defaults, newDefaults); + } + }, + validatorTypes: { + callback: { + name: "callback", + init: function ($this, name) { + return { + validatorName: name, + callback: $this.data("validation" + name + "Callback"), + lastValue: $this.val(), + lastValid: true, + lastFinished: true + }; + }, + validate: function ($this, value, validator) { + if (validator.lastValue === value && validator.lastFinished) { + return !validator.lastValid; + } + + if (validator.lastFinished === true) + { + validator.lastValue = value; + validator.lastValid = true; + validator.lastFinished = false; + + var rrjqbvValidator = validator; + var rrjqbvThis = $this; + executeFunctionByName( + validator.callback, + window, + $this, + value, + function (data) { + if (rrjqbvValidator.lastValue === data.value) { + rrjqbvValidator.lastValid = data.valid; + if (data.message) { + rrjqbvValidator.message = data.message; + } + rrjqbvValidator.lastFinished = true; + rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + rrjqbvThis.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + } + ); + } + + return false; + + } + }, + ajax: { + name: "ajax", + init: function ($this, name) { + return { + validatorName: name, + url: $this.data("validation" + name + "Ajax"), + lastValue: $this.val(), + lastValid: true, + lastFinished: true + }; + }, + validate: function ($this, value, validator) { + if (""+validator.lastValue === ""+value && validator.lastFinished === true) { + return validator.lastValid === false; + } + + if (validator.lastFinished === true) + { + validator.lastValue = value; + validator.lastValid = true; + validator.lastFinished = false; + $.ajax({ + url: validator.url, + data: "value=" + value + "&field=" + $this.attr("name"), + dataType: "json", + success: function (data) { + if (""+validator.lastValue === ""+data.value) { + validator.lastValid = !!(data.valid); + if (data.message) { + validator.message = data.message; + } + validator.lastFinished = true; + $this.data("validation" + validator.validatorName + "Message", validator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + $this.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + }, + failure: function () { + validator.lastValid = true; + validator.message = "ajax call failed"; + validator.lastFinished = true; + $this.data("validation" + validator.validatorName + "Message", validator.message); + // Timeout is set to avoid problems with the events being considered 'already fired' + setTimeout(function () { + $this.trigger("change.validation"); + }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst + } + }); + } + + return false; + + } + }, + regex: { + name: "regex", + init: function ($this, name) { + return {regex: regexFromString($this.data("validation" + name + "Regex"))}; + }, + validate: function ($this, value, validator) { + return (!validator.regex.test(value) && ! validator.negative) + || (validator.regex.test(value) && validator.negative); + } + }, + required: { + name: "required", + init: function ($this, name) { + return {}; + }, + validate: function ($this, value, validator) { + return !!(value.length === 0 && ! validator.negative) + || !!(value.length > 0 && validator.negative); + }, + blockSubmit: true + }, + match: { + name: "match", + init: function ($this, name) { + var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first(); + element.bind("validation.validation", function () { + $this.trigger("change.validation", {submitting: true}); + }); + return {"element": element}; + }, + validate: function ($this, value, validator) { + return (value !== validator.element.val() && ! validator.negative) + || (value === validator.element.val() && validator.negative); + }, + blockSubmit: true + }, + max: { + name: "max", + init: function ($this, name) { + return {max: $this.data("validation" + name + "Max")}; + }, + validate: function ($this, value, validator) { + return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative) + || (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative); + } + }, + min: { + name: "min", + init: function ($this, name) { + return {min: $this.data("validation" + name + "Min")}; + }, + validate: function ($this, value, validator) { + return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative) + || (parseFloat(value) >= parseFloat(validator.min) && validator.negative); + } + }, + maxlength: { + name: "maxlength", + init: function ($this, name) { + return {maxlength: $this.data("validation" + name + "Maxlength")}; + }, + validate: function ($this, value, validator) { + return ((value.length > validator.maxlength) && ! validator.negative) + || ((value.length <= validator.maxlength) && validator.negative); + } + }, + minlength: { + name: "minlength", + init: function ($this, name) { + return {minlength: $this.data("validation" + name + "Minlength")}; + }, + validate: function ($this, value, validator) { + return ((value.length < validator.minlength) && ! validator.negative) + || ((value.length >= validator.minlength) && validator.negative); + } + }, + maxchecked: { + name: "maxchecked", + init: function ($this, name) { + var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); + elements.bind("click.validation", function () { + $this.trigger("change.validation", {includeEmpty: true}); + }); + return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements}; + }, + validate: function ($this, value, validator) { + return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative) + || (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative); + }, + blockSubmit: true + }, + minchecked: { + name: "minchecked", + init: function ($this, name) { + var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); + elements.bind("click.validation", function () { + $this.trigger("change.validation", {includeEmpty: true}); + }); + return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements}; + }, + validate: function ($this, value, validator) { + return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative) + || (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative); + }, + blockSubmit: true + } + }, + builtInValidators: { + email: { + name: "Email", + type: "shortcut", + shortcut: "validemail" + }, + validemail: { + name: "Validemail", + type: "regex", + regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}", + message: "Not a valid email address" + }, + passwordagain: { + name: "Passwordagain", + type: "match", + match: "password", + message: "Does not match the given password" + }, + positive: { + name: "Positive", + type: "shortcut", + shortcut: "number,positivenumber" + }, + negative: { + name: "Negative", + type: "shortcut", + shortcut: "number,negativenumber" + }, + number: { + name: "Number", + type: "regex", + regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?", + message: "Must be a number" + }, + integer: { + name: "Integer", + type: "regex", + regex: "[+-]?\\\d+", + message: "No decimal places allowed" + }, + positivenumber: { + name: "Positivenumber", + type: "min", + min: 0, + message: "Must be a positive number" + }, + negativenumber: { + name: "Negativenumber", + type: "max", + max: 0, + message: "Must be a negative number" + }, + required: { + name: "Required", + type: "required", + message: "This is required" + }, + checkone: { + name: "Checkone", + type: "minchecked", + minchecked: 1, + message: "Check at least one option" + } + } + }; + + var formatValidatorName = function (name) { + return name + .toLowerCase() + .replace( + /(^|\s)([a-z])/g , + function(m,p1,p2) { + return p1+p2.toUpperCase(); + } + ) + ; + }; + + var getValue = function ($this) { + // Extract the value we're talking about + var value = $this.val(); + var type = $this.attr("type"); + if (type === "checkbox") { + value = ($this.is(":checked") ? value : ""); + } + if (type === "radio") { + value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : ""); + } + return value; + }; + + function regexFromString(inputstring) { + return new RegExp("^" + inputstring + "$"); + } + + /** + * Thanks to Jason Bunting via StackOverflow.com + * + * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910 + * Short link: http://tinyurl.com/executeFunctionByName + **/ + function executeFunctionByName(functionName, context /*, args*/) { + var args = Array.prototype.slice.call(arguments).splice(2); + var namespaces = functionName.split("."); + var func = namespaces.pop(); + for(var i = 0; i < namespaces.length; i++) { + context = context[namespaces[i]]; + } + return context[func].apply(this, args); + } + + $.fn.jqBootstrapValidation = function( method ) { + + if ( defaults.methods[method] ) { + return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return defaults.methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' ); + return null; + } + + }; + + $.jqBootstrapValidation = function (options) { + $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments); + }; + +})( jQuery ); diff --git a/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css new file mode 100644 index 0000000000..6167622cec --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000000..ed3905e0e0 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000..b93a4953ff Binary files /dev/null and b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000000..94fb5490a2 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000..1413fc609a Binary files /dev/null and b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000..9e612858f8 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000..64539b54c3 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js new file mode 100644 index 0000000000..8a2e99a535 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000000..9bcd2fccae --- /dev/null +++ b/vraptor/src/main/webapp/vendor/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css new file mode 100644 index 0000000000..a0b879fa00 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.css @@ -0,0 +1,2199 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.6.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000000..9b27f8ea8f --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf b/vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000..d4de13e832 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/font-awesome/fonts/FontAwesome.otf differ diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..c7b00d2ba8 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.svg b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..8b66187fe0 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..f221e50a2e Binary files /dev/null and b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..6e7483cf61 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..7eb74fd127 Binary files /dev/null and b/vraptor/src/main/webapp/vendor/font-awesome/fonts/fontawesome-webfont.woff2 differ diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less b/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less new file mode 100644 index 0000000000..66ad52a5ba --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less b/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000000..f1c8ad75f5 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/core.less b/vraptor/src/main/webapp/vendor/font-awesome/less/core.less new file mode 100644 index 0000000000..c577ac84a6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less b/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less new file mode 100644 index 0000000000..110289f2f4 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less b/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less new file mode 100644 index 0000000000..c44e5f466a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less b/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less new file mode 100644 index 0000000000..ba21b222d6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/icons.less @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less b/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less new file mode 100644 index 0000000000..c9d646770e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/list.less b/vraptor/src/main/webapp/vendor/font-awesome/less/list.less new file mode 100644 index 0000000000..0b440382f6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less b/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less new file mode 100644 index 0000000000..beef231d0e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/path.less b/vraptor/src/main/webapp/vendor/font-awesome/less/path.less new file mode 100644 index 0000000000..835be41f81 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less b/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000000..f6ba81475b --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less b/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less new file mode 100644 index 0000000000..11c188196d --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less b/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less new file mode 100644 index 0000000000..fc53fb0e7a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less b/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less new file mode 100644 index 0000000000..2b3381975e --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/less/variables.less @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.6.3"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss new file mode 100644 index 0000000000..8a020dbfff --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000000..d4b85a02f2 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss new file mode 100644 index 0000000000..7425ef85fc --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000000..b221c98133 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss new file mode 100644 index 0000000000..2944344350 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_icons.scss @@ -0,0 +1,733 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss new file mode 100644 index 0000000000..41e9a8184a --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss new file mode 100644 index 0000000000..7d1e4d54d6 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000000..c3bbd5745d --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss new file mode 100644 index 0000000000..bb457c23a8 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000000..a3558fd09c --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss new file mode 100644 index 0000000000..637426f0da --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000000..aef7403660 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss new file mode 100644 index 0000000000..a5a89ef97b --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/_variables.scss @@ -0,0 +1,744 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.6.3" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss b/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000000..2308b14ca7 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/font-awesome/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/vraptor/src/main/webapp/vendor/jquery/jquery.js b/vraptor/src/main/webapp/vendor/jquery/jquery.js new file mode 100644 index 0000000000..7fc60fca78 --- /dev/null +++ b/vraptor/src/main/webapp/vendor/jquery/jquery.js @@ -0,0 +1,11008 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "