diff --git a/.formatter.exs b/.formatter.exs
new file mode 100644
index 00000000..d2cda26e
--- /dev/null
+++ b/.formatter.exs
@@ -0,0 +1,4 @@
+# Used by "mix format"
+[
+ inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
+]
diff --git a/README.md b/README.md
index aa1db75b..b0298ff8 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,25 @@
# ConfigCat SDK for Elixir
-https://configcat.com
+
+https://configcat.com
ConfigCat SDK for Elixir provides easy integration for your application to ConfigCat.
ConfigCat is a feature flag and configuration management service that lets you separate releases from deployments. You can turn your features ON/OFF using ConfigCat Dashboard even after they are deployed. ConfigCat lets you target specific groups of users based on region, email or any other custom user attribute.
ConfigCat is a hosted feature flag service. Manage feature toggles across frontend, backend, mobile, desktop apps. Alternative to LaunchDarkly. Management app + feature flag SDKs.
+
+## Installation
+
+If [available in Hex](https://hex.pm/docs/publish), the package can be installed
+by adding `config_cat` to your list of dependencies in `mix.exs`:
+
+```elixir
+def deps do
+ [
+ {:config_cat, "~> 0.1.0"}
+ ]
+end
+```
+
+Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
+and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
+be found at [https://hexdocs.pm/config_cat](https://hexdocs.pm/config_cat).
diff --git a/lib/config_cat.ex b/lib/config_cat.ex
new file mode 100644
index 00000000..32aadeda
--- /dev/null
+++ b/lib/config_cat.ex
@@ -0,0 +1,187 @@
+defmodule ConfigCat do
+ use GenServer
+
+ alias ConfigCat.{FetchPolicy, Rollout}
+ alias HTTPoison.Response
+
+ require Logger
+
+ @base_url "https://cdn.configcat.com"
+ @base_path "configuration-files"
+ @config_filename "config_v4.json"
+
+ def start_link(sdk_key, options \\ [])
+
+ def start_link(nil, _options), do: {:error, :missing_sdk_key}
+
+ def start_link(sdk_key, options) do
+ with {name, options} <- Keyword.pop(options, :name, __MODULE__),
+ {initial_config, options} <- Keyword.pop(options, :initial_config) do
+ initial_state = %{
+ config: initial_config,
+ etag: nil,
+ last_update: nil,
+ options: Keyword.merge(default_options(), options),
+ sdk_key: sdk_key
+ }
+
+ GenServer.start_link(__MODULE__, initial_state, name: name)
+ end
+ end
+
+ defp default_options, do: [api: ConfigCat.API, fetch_policy: FetchPolicy.auto()]
+
+ def get_value(key, default_value, user_or_options \\ []) do
+ if Keyword.keyword?(user_or_options) do
+ get_value(key, default_value, nil, user_or_options)
+ else
+ get_value(key, default_value, user_or_options, [])
+ end
+ end
+
+ def get_value(key, default_value, user, options) do
+ client = Keyword.get(options, :client, __MODULE__)
+ GenServer.call(client, {:get_value, key, default_value, user})
+ end
+
+ def force_refresh(client \\ __MODULE__) do
+ GenServer.call(client, :force_refresh)
+ end
+
+ @impl GenServer
+ def init(state) do
+ {:ok, state, {:continue, :maybe_init_fetch}}
+ end
+
+ @impl GenServer
+ def handle_call({:get_value, key, default_value, user}, _from, state) do
+ with {:ok, new_state} <- maybe_refresh(state),
+ value <- Rollout.evaluate(key, user, default_value, new_state.config) do
+ {:reply, value, new_state}
+ else
+ error -> {:reply, error, state}
+ end
+ end
+
+ @impl GenServer
+ def handle_call(:force_refresh, _from, state) do
+ with {:ok, new_state} <- refresh(state) do
+ {:reply, :ok, new_state}
+ else
+ error -> {:reply, error, state}
+ end
+ end
+
+ defp schedule_initial_fetch?(%{options: options}) do
+ options
+ |> Keyword.get(:fetch_policy)
+ |> FetchPolicy.schedule_initial_fetch?()
+ end
+
+ defp maybe_refresh(%{options: options} = state) do
+ options
+ |> Keyword.get(:fetch_policy)
+ |> maybe_refresh(state)
+ end
+
+ defp maybe_refresh(fetch_policy, %{last_update: last_update} = state) do
+ if FetchPolicy.needs_fetch?(fetch_policy, last_update) do
+ refresh(state)
+ else
+ {:ok, state}
+ end
+ end
+
+ defp refresh(%{options: options, etag: etag} = state) do
+ Logger.info("Fetching configuration from ConfigCat")
+
+ with api <- Keyword.get(options, :api),
+ {:ok, response} <- api.get(url(state), headers(etag)) do
+ response
+ |> log_response()
+ |> handle_response(state)
+ else
+ error ->
+ log_error(error)
+ end
+ end
+
+ defp handle_response(%Response{status_code: code, body: body, headers: headers}, state)
+ when code >= 200 and code < 300 do
+ with {:ok, config} = Jason.decode(body),
+ etag <- extract_etag(headers) do
+ {:ok, %{state | config: config, etag: etag, last_update: now()}}
+ end
+ end
+
+ defp handle_response(%Response{status_code: 304}, state) do
+ {:ok, %{state | last_update: now()}}
+ end
+
+ defp handle_response(response, _state) do
+ {:error, response}
+ end
+
+ defp headers(nil), do: []
+ defp headers(etag), do: [{"If-None-Match", etag}]
+
+ defp extract_etag(headers) do
+ headers |> Enum.into(%{}) |> Map.get("ETag")
+ end
+
+ defp url(%{options: options, sdk_key: sdk_key}) do
+ base_url = Keyword.get(options, :base_url, @base_url)
+
+ base_url
+ |> URI.parse()
+ |> URI.merge("#{@base_path}/#{sdk_key}/#{@config_filename}")
+ |> URI.to_string()
+ end
+
+ defp now, do: DateTime.utc_now()
+
+ defp log_response(%Response{headers: headers, status_code: status_code} = response) do
+ Logger.info(
+ "ConfigCat configuration json fetch response code: #{status_code} Cached: #{
+ extract_etag(headers)
+ }"
+ )
+
+ response
+ end
+
+ defp log_error(error) do
+ Logger.warn("Failed to fetch configuration from ConfigCat: #{inspect(error)}")
+ error
+ end
+
+ defp schedule_and_refresh(%{options: options} = state) do
+ options
+ |> Keyword.get(:fetch_policy)
+ |> FetchPolicy.schedule_next_fetch(self())
+
+ case refresh(state) do
+ {:ok, new_state} -> new_state
+ _error -> state
+ end
+ end
+
+ @impl GenServer
+ # Work around leaking messages from hackney (see https://github.com/benoitc/hackney/issues/464#issuecomment-495731612)
+ # Seems to be an issue in OTP 21 and later.
+ def handle_info({:ssl_closed, _msg}, state), do: {:noreply, state}
+
+ @impl GenServer
+ def handle_info(:refresh, state) do
+ {:noreply, schedule_and_refresh(state)}
+ end
+
+ @impl GenServer
+ def handle_continue(:maybe_init_fetch, state) do
+ if schedule_initial_fetch?(state) do
+ {:noreply, schedule_and_refresh(state)}
+ else
+ {:noreply, state}
+ end
+ end
+end
diff --git a/lib/config_cat/api.ex b/lib/config_cat/api.ex
new file mode 100644
index 00000000..ef620614
--- /dev/null
+++ b/lib/config_cat/api.ex
@@ -0,0 +1,11 @@
+defmodule ConfigCat.API do
+ use HTTPoison.Base
+
+ def process_request_headers(headers) do
+ [
+ {"User-Agent", "ConfigCat-Elixir/m-0.0.1"},
+ {"X-ConfigCat-UserAgent", "ConfigCat-Elixir/m-0.0.1"},
+ {"Content-Type", "application/json"} | headers
+ ]
+ end
+end
diff --git a/lib/config_cat/fetch_policy.ex b/lib/config_cat/fetch_policy.ex
new file mode 100644
index 00000000..630599e5
--- /dev/null
+++ b/lib/config_cat/fetch_policy.ex
@@ -0,0 +1,51 @@
+defmodule ConfigCat.FetchPolicy do
+ defstruct [
+ :type,
+ cache_expiry_seconds: 0,
+ poll_interval_seconds: 0
+ ]
+
+ def manual do
+ %__MODULE__{type: :manual}
+ end
+
+ def lazy(cache_expiry_seconds: seconds) do
+ %__MODULE__{type: :lazy, cache_expiry_seconds: seconds}
+ end
+
+ def auto(options \\ []) do
+ seconds = options |> Keyword.get(:poll_interval_seconds, 60) |> max(1)
+
+ %__MODULE__{
+ type: :auto,
+ poll_interval_seconds: seconds
+ }
+ end
+
+ def needs_fetch?(%__MODULE__{type: :lazy}, nil), do: true
+
+ def needs_fetch?(
+ %__MODULE__{type: :lazy, cache_expiry_seconds: expiry_seconds},
+ last_update_time
+ ) do
+ cache_expired?(last_update_time, expiry_seconds)
+ end
+
+ def needs_fetch?(_policy, _last_update_time), do: false
+
+ def schedule_initial_fetch?(%__MODULE__{type: :auto}), do: true
+ def schedule_initial_fetch?(_policy), do: false
+
+ def schedule_next_fetch(%__MODULE__{type: :auto, poll_interval_seconds: seconds}, pid) do
+ Process.send_after(pid, :refresh, seconds * 1000)
+ end
+
+ def schedule_next_fetch(_policy, _pid), do: nil
+
+ defp cache_expired?(last_update_time, expiry_seconds) do
+ :gt !==
+ last_update_time
+ |> DateTime.add(expiry_seconds, :second)
+ |> DateTime.compare(DateTime.utc_now())
+ end
+end
diff --git a/lib/config_cat/rollout.ex b/lib/config_cat/rollout.ex
new file mode 100644
index 00000000..8a1581e3
--- /dev/null
+++ b/lib/config_cat/rollout.ex
@@ -0,0 +1,192 @@
+defmodule ConfigCat.Rollout do
+ require Logger
+
+ alias ConfigCat.User
+ alias ConfigCat.Rollout.Comparator
+
+ # Fields
+ @comparator "t"
+ @comparison_attribute "a"
+ @comparison_value "c"
+ @rollout_rules "r"
+ @percentage_rules "p"
+ @percentage "p"
+ @value "v"
+
+ def evaluate(_key, _user, default_value, nil), do: default_value
+
+ def evaluate(key, user, default_value, config) do
+ log_evaluating(key)
+
+ with {:ok, valid_user} <- validate_user(user),
+ {:ok, setting_descriptor} <- Map.fetch(config, key),
+ rollout_rules <- Map.get(setting_descriptor, @rollout_rules, []),
+ percentage_rules <- Map.get(setting_descriptor, @percentage_rules, []),
+ result <- evaluate_rules(rollout_rules, percentage_rules, valid_user, key) do
+ if result == :none do
+ base_value(setting_descriptor, default_value)
+ else
+ result
+ end
+ else
+ {:error, :invalid_user} ->
+ log_invalid_user(key)
+ evaluate(key, nil, default_value, config)
+
+ :error ->
+ log_no_value_found(key, default_value)
+ default_value
+ end
+ end
+
+ defp validate_user(nil), do: {:ok, nil}
+ defp validate_user(%User{} = user), do: {:ok, user}
+ defp validate_user(_), do: {:error, :invalid_user}
+
+ defp evaluate_rules([], [], _user, _key), do: :none
+
+ defp evaluate_rules(_rollout_rules, _percentage_rules, nil, key) do
+ log_nil_user(key)
+ :none
+ end
+
+ defp evaluate_rules(rollout_rules, percentage_rules, user, key) do
+ log_valid_user(user)
+ result = evaluate_rollout_rules(rollout_rules, user, key)
+
+ if result == :none do
+ evaluate_percentage_rules(percentage_rules, user, key)
+ else
+ result
+ end
+ end
+
+ defp evaluate_rollout_rules(rules, user, _key) do
+ Enum.reduce_while(rules, :none, &evaluate_rollout_rule(&1, &2, user))
+ end
+
+ defp evaluate_rollout_rule(rule, default, user) do
+ with comparison_attribute <- Map.get(rule, @comparison_attribute),
+ comparison_value <- Map.get(rule, @comparison_value),
+ comparator <- Map.get(rule, @comparator),
+ value <- Map.get(rule, @value) do
+ case User.get_attribute(user, comparison_attribute) do
+ nil ->
+ log_no_match(comparison_attribute, nil, comparator, comparison_value)
+ {:cont, default}
+
+ user_value ->
+ case Comparator.compare(comparator, to_string(user_value), to_string(comparison_value)) do
+ {:ok, true} ->
+ log_match(comparison_attribute, user_value, comparator, comparison_value, value)
+ {:halt, value}
+
+ {:ok, false} ->
+ {:cont, default}
+
+ {:error, error} ->
+ log_validation_error(
+ comparison_attribute,
+ user_value,
+ comparator,
+ comparison_value,
+ error
+ )
+
+ {:cont, default}
+ end
+ end
+ end
+ end
+
+ def evaluate_percentage_rules(_percentage_rules = [], _user, _key), do: :none
+
+ def evaluate_percentage_rules(percentage_rules, user, key) do
+ hash_val = hash_user(user, key)
+
+ Enum.reduce_while(percentage_rules, 0, &evaluate_percentage_rule(&1, &2, hash_val))
+ end
+
+ def evaluate_percentage_rule(rule, bucket, hash_val) do
+ bucket = increment_bucket(bucket, rule)
+
+ if hash_val < bucket do
+ percentage_value = Map.get(rule, @value, nil)
+ {:halt, percentage_value}
+ else
+ {:cont, bucket}
+ end
+ end
+
+ defp increment_bucket(bucket, rule), do: bucket + Map.get(rule, @percentage, 0)
+
+ defp hash_user(user, key) do
+ user_key = User.get_attribute(user, "identifier")
+ hash_candidate = "#{key}#{user_key}"
+
+ {hash_value, _} =
+ :crypto.hash(:sha, hash_candidate)
+ |> Base.encode16()
+ |> String.slice(0, 7)
+ |> Integer.parse(16)
+
+ rem(hash_value, 100)
+ end
+
+ defp base_value(setting_descriptor, default_value) do
+ result = Map.get(setting_descriptor, @value, default_value)
+ Logger.debug("Returning #{result}")
+
+ result
+ end
+
+ defp log_evaluating(key) do
+ Logger.debug("Evaluating get_value('#{key}').")
+ end
+
+ defp log_match(comparison_attribute, user_value, comparator, comparison_value, value) do
+ Logger.debug(
+ "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{
+ Comparator.description(comparator)
+ }] [#{comparison_value}] => match, returning: #{value}"
+ )
+ end
+
+ defp log_no_match(comparison_attribute, user_value, comparator, comparison_value) do
+ Logger.debug(
+ "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{
+ Comparator.description(comparator)
+ }] [#{comparison_value}] => no match"
+ )
+ end
+
+ defp log_validation_error(comparison_attribute, user_value, comparator, comparison_value, error) do
+ Logger.warn(
+ "Evaluating rule: [#{comparison_attribute}:#{user_value}] [#{
+ Comparator.description(comparator)
+ }] [#{comparison_value}] => SKIP rule. Validation error: #{inspect(error)}"
+ )
+ end
+
+ defp log_no_value_found(key, default_value) do
+ Logger.error(
+ "Evaluating get_value('#{key}') failed. Value not found for key '#{key}'. Return default_value: [#{
+ default_value
+ }]."
+ )
+ end
+
+ defp log_valid_user(user) do
+ Logger.debug("User object: #{inspect(user)}")
+ end
+
+ defp log_nil_user(key) do
+ Logger.warn(
+ "Evaluating get_value('#{key}'). User struct missing! You should pass a User to get_value(), in order to make targeting work properly. Read more: https://configcat.com/docs/advanced/user-object/"
+ )
+ end
+
+ defp log_invalid_user(key) do
+ Logger.warn("Evaluating get_value('#{key}'). User Object is not an instance of User struct.")
+ end
+end
diff --git a/lib/config_cat/rollout/comparator.ex b/lib/config_cat/rollout/comparator.ex
new file mode 100644
index 00000000..809bfab7
--- /dev/null
+++ b/lib/config_cat/rollout/comparator.ex
@@ -0,0 +1,176 @@
+defmodule ConfigCat.Rollout.Comparator do
+ @is_one_of 0
+ @is_not_one_of 1
+ @contains 2
+ @does_not_contain 3
+ @is_one_of_semver 4
+ @is_not_one_of_semver 5
+ @less_than_semver 6
+ @less_than_equal_semver 7
+ @greater_than_semver 8
+ @greater_than_equal_semver 9
+ @equals_number 10
+ @not_equals_number 11
+ @less_than_number 12
+ @less_than_equal_number 13
+ @greater_than_number 14
+ @greater_than_equal_number 15
+ @is_one_of_sensitive 16
+ @is_not_one_of_sensitive 17
+
+ @descriptions %{
+ @is_one_of => "IS ONE OF",
+ @is_not_one_of => "IS NOT ONE OF",
+ @contains => "CONTAINS",
+ @does_not_contain => "DOES NOT CONTAIN",
+ @is_one_of_semver => "IS ONE OF (SemVer)",
+ @is_not_one_of_semver => "IS NOT ONE OF (SemVer)",
+ @less_than_semver => "< (SemVer)",
+ @less_than_equal_semver => "<= (SemVer)",
+ @greater_than_semver => "> (SemVer)",
+ @greater_than_equal_semver => ">= (SemVer)",
+ @equals_number => "= (Number)",
+ @not_equals_number => "<> (Number)",
+ @less_than_number => "< (Number)",
+ @less_than_equal_number => "<= (Number)",
+ @greater_than_number => "> (Number)",
+ @greater_than_equal_number => ">= (Number)",
+ @is_one_of_sensitive => "IS ONE OF (Sensitive)",
+ @is_not_one_of_sensitive => "IS NOT ONE OF (Sensitive)"
+ }
+
+ def description(comparator) do
+ Map.get(@descriptions, comparator, "Unsupported comparator")
+ end
+
+ def compare(@is_one_of, user_value, comparison_value),
+ do: is_one_of(user_value, comparison_value)
+
+ def compare(@is_not_one_of, user_value, comparison_value),
+ do: is_one_of(user_value, comparison_value) |> negate()
+
+ def compare(@contains, user_value, comparison_value),
+ do: contains(user_value, comparison_value)
+
+ def compare(@does_not_contain, user_value, comparison_value),
+ do: contains(user_value, comparison_value) |> negate()
+
+ def compare(@is_one_of_semver, user_value, comparison_value),
+ do: is_one_of_semver(user_value, comparison_value)
+
+ def compare(@is_not_one_of_semver, user_value, comparison_value),
+ do: is_one_of_semver(user_value, comparison_value) |> negate()
+
+ def compare(@less_than_semver, user_value, comparison_value),
+ do: compare_semver(user_value, comparison_value, [:lt])
+
+ def compare(@less_than_equal_semver, user_value, comparison_value),
+ do: compare_semver(user_value, comparison_value, [:lt, :eq])
+
+ def compare(@greater_than_semver, user_value, comparison_value),
+ do: compare_semver(user_value, comparison_value, [:gt])
+
+ def compare(@greater_than_equal_semver, user_value, comparison_value),
+ do: compare_semver(user_value, comparison_value, [:gt, :eq])
+
+ def compare(@equals_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &==/2)
+
+ def compare(@not_equals_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &!==/2)
+
+ def compare(@less_than_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &2)
+
+ def compare(@less_than_equal_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &<=/2)
+
+ def compare(@greater_than_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &>/2)
+
+ def compare(@greater_than_equal_number, user_value, comparison_value),
+ do: compare_numbers(user_value, comparison_value, &>=/2)
+
+ def compare(@is_one_of_sensitive, user_value, comparison_value),
+ do: is_one_of_sensitive(user_value, comparison_value)
+
+ def compare(@is_not_one_of_sensitive, user_value, comparison_value),
+ do: is_one_of_sensitive(user_value, comparison_value) |> negate()
+
+ def compare(_comparator, _user_value, _comparison_value) do
+ {:ok, false}
+ end
+
+ defp is_one_of(user_value, comparison_value) do
+ result =
+ comparison_value
+ |> String.split(",")
+ |> Enum.map(&String.trim/1)
+ |> Enum.member?(user_value)
+
+ {:ok, result}
+ end
+
+ defp contains(user_value, comparison_value) do
+ result = String.contains?(user_value, comparison_value)
+ {:ok, result}
+ end
+
+ def is_one_of_semver(user_value, comparison_value) do
+ user_version = Version.parse!(user_value)
+
+ result =
+ comparison_value
+ |> String.split(",")
+ |> Enum.map(&String.trim/1)
+ |> Enum.reject(&(&1 == ""))
+ |> Enum.map(&Version.parse!/1)
+ |> Enum.any?(fn version -> Version.compare(user_version, version) == :eq end)
+
+ {:ok, result}
+ rescue
+ error in Version.InvalidVersionError ->
+ {:error, error}
+ end
+
+ defp is_one_of_sensitive(user_value, comparison_value) do
+ user_value
+ |> hash_value()
+ |> is_one_of(comparison_value)
+ end
+
+ defp hash_value(value) do
+ :crypto.hash(:sha, value)
+ |> Base.encode16()
+ |> String.downcase()
+ end
+
+ defp compare_semver(user_value, comparison_value, valid_comparisons) do
+ user_version = to_version(user_value)
+ comparison_version = to_version(comparison_value)
+ result = Version.compare(user_version, comparison_version) in valid_comparisons
+ {:ok, result}
+ rescue
+ error in Version.InvalidVersionError -> {:error, error}
+ end
+
+ defp to_version(value) do
+ value |> String.trim() |> Version.parse!()
+ end
+
+ defp compare_numbers(user_value, comparison_value, operator) do
+ with {user_float, _} <- to_float(user_value),
+ {comparison_float, _} <- to_float(comparison_value) do
+ {:ok, operator.(user_float, comparison_float)}
+ else
+ :error -> {:error, :invalid_float}
+ end
+ end
+
+ defp to_float(value) do
+ value |> to_string() |> String.replace(",", ".") |> Float.parse()
+ end
+
+ defp negate({:ok, result}), do: {:ok, !result}
+ defp negate(error), do: error
+end
diff --git a/lib/config_cat/user.ex b/lib/config_cat/user.ex
new file mode 100644
index 00000000..66f6601a
--- /dev/null
+++ b/lib/config_cat/user.ex
@@ -0,0 +1,35 @@
+defmodule ConfigCat.User do
+ @enforce_keys :identifier
+ defstruct [:identifier, email: nil, country: nil, custom: nil]
+
+ def new(identifier, other_props \\ []) do
+ %__MODULE__{identifier: identifier}
+ |> struct!(other_props)
+ end
+
+ def get_attribute(user, attribute) do
+ do_get_attribute(user, normalize(attribute))
+ end
+
+ defp do_get_attribute(user, "identifier"), do: user.identifier
+ defp do_get_attribute(user, "email"), do: user.email
+ defp do_get_attribute(user, "country"), do: user.country
+ defp do_get_attribute(user, attribute), do: custom_attribute(user.custom, attribute)
+
+ defp custom_attribute(nil, _attribute), do: nil
+
+ defp custom_attribute(custom, attribute) do
+ case Enum.find(custom, fn {key, _value} ->
+ normalize(key) == attribute
+ end) do
+ {_key, value} -> value
+ _ -> nil
+ end
+ end
+
+ defp normalize(attribute) do
+ attribute
+ |> to_string()
+ |> String.downcase()
+ end
+end
diff --git a/mix.exs b/mix.exs
new file mode 100644
index 00000000..6f98e799
--- /dev/null
+++ b/mix.exs
@@ -0,0 +1,33 @@
+defmodule ConfigCat.MixProject do
+ use Mix.Project
+
+ def project do
+ [
+ app: :config_cat,
+ version: "0.1.0",
+ elixir: "~> 1.10",
+ start_permanent: Mix.env() == :prod,
+ deps: deps()
+ ]
+ end
+
+ # Run "mix help compile.app" to learn about applications.
+ def application do
+ [
+ extra_applications: [:logger]
+ ]
+ end
+
+ # Run "mix help deps" to learn about dependencies.
+ defp deps do
+ [
+ # {:dep_from_hexpm, "~> 0.3.0"},
+ # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
+ {:elixir_uuid, "~> 1.2"},
+ {:httpoison, "~> 1.7"},
+ {:jason, "~> 1.2"},
+ {:mix_test_watch, "~> 1.0", only: :dev, runtime: false},
+ {:mox, "~> 1.0", only: :test}
+ ]
+ end
+end
diff --git a/mix.lock b/mix.lock
new file mode 100644
index 00000000..5c3aff25
--- /dev/null
+++ b/mix.lock
@@ -0,0 +1,17 @@
+%{
+ "certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"},
+ "elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
+ "file_system": {:hex, :file_system, "0.2.9", "545b9c9d502e8bfa71a5315fac2a923bd060fd9acb797fe6595f54b0f975fd32", [:mix], [], "hexpm", "3cf87a377fe1d93043adeec4889feacf594957226b4f19d5897096d6f61345d8"},
+ "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"},
+ "httpoison": {:hex, :httpoison, "1.7.0", "abba7d086233c2d8574726227b6c2c4f6e53c4deae7fe5f6de531162ce9929a0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "975cc87c845a103d3d1ea1ccfd68a2700c211a434d8428b10c323dc95dc5b980"},
+ "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"},
+ "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"},
+ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
+ "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
+ "mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"},
+ "mox": {:hex, :mox, "1.0.0", "4b3c7005173f47ff30641ba044eb0fe67287743eec9bd9545e37f3002b0a9f8b", [:mix], [], "hexpm", "201b0a20b7abdaaab083e9cf97884950f8a30a1350a1da403b3145e213c6f4df"},
+ "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
+ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
+ "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"},
+ "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"},
+}
diff --git a/test/config_cat_test.exs b/test/config_cat_test.exs
new file mode 100644
index 00000000..51e39999
--- /dev/null
+++ b/test/config_cat_test.exs
@@ -0,0 +1,254 @@
+defmodule ConfigCatTest do
+ use ExUnit.Case
+
+ import Mox
+
+ alias ConfigCat.FetchPolicy
+ alias HTTPoison.Response
+
+ setup [:set_mox_global, :verify_on_exit!]
+
+ Mox.defmock(APIMock, for: HTTPoison.Base)
+
+ setup do
+ feature = "FEATURE"
+ value = "VALUE"
+ config = %{feature => %{"v" => value}}
+
+ {:ok, config: config, feature: feature, value: value}
+ end
+
+ describe "starting the GenServer" do
+ test "requires SDK key" do
+ assert {:error, :missing_sdk_key} == start_config_cat(nil)
+ end
+ end
+
+ describe "manually fetching the configuration" do
+ test "fetches configuration from ConfigCat server", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ sdk_key = "SDK_KEY"
+ url = "https://cdn.configcat.com/configuration-files/#{sdk_key}/config_v4.json"
+
+ {:ok, client} = start_config_cat(sdk_key, fetch_policy: FetchPolicy.manual())
+
+ APIMock
+ |> stub(:get, fn ^url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(config)}}
+ end)
+
+ :ok = ConfigCat.force_refresh(client)
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ test "sends proper cache control header on later requests" do
+ etag = "ETAG"
+ {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual())
+
+ initial_response = %Response{
+ status_code: 200,
+ body: Jason.encode!(%{}),
+ headers: [{"ETag", etag}]
+ }
+
+ APIMock
+ |> stub(:get, fn _url, [] -> {:ok, initial_response} end)
+
+ :ok = ConfigCat.force_refresh(client)
+
+ not_modified_response = %Response{
+ status_code: 304,
+ headers: [{"ETag", etag}]
+ }
+
+ APIMock
+ |> expect(:get, fn _url, [{"If-None-Match", ^etag}] -> {:ok, not_modified_response} end)
+
+ assert :ok = ConfigCat.force_refresh(client)
+ end
+
+ test "retains previous config when server responds that the config hasn't changed", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ {:ok, client} =
+ start_config_cat("SDK_KEY", initial_config: config, fetch_policy: FetchPolicy.manual())
+
+ response = %Response{
+ status_code: 304,
+ headers: [{"ETag", "ETAG"}]
+ }
+
+ APIMock
+ |> stub(:get, fn _url, _headers -> {:ok, response} end)
+
+ :ok = ConfigCat.force_refresh(client)
+
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ @tag capture_log: true
+ test "handles non-200 response from ConfigCat" do
+ {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual())
+ response = %Response{status_code: 503}
+
+ APIMock
+ |> stub(:get, fn _url, _headers -> {:ok, response} end)
+
+ assert {:error, response} == ConfigCat.force_refresh(client)
+ end
+
+ @tag capture_log: true
+ test "handles error response from ConfigCat" do
+ {:ok, client} = start_config_cat("SDK_KEY")
+
+ error = %HTTPoison.Error{reason: "failed"}
+
+ APIMock
+ |> stub(:get, fn _url, _headers -> {:error, error} end)
+
+ assert {:error, error} == ConfigCat.force_refresh(client)
+ end
+
+ test "allows base URL to be configured" do
+ base_url = "https://BASE_URL/"
+ sdk_key = "SDK_KEY"
+ url = "https://BASE_URL/configuration-files/#{sdk_key}/config_v4.json"
+
+ {:ok, client} =
+ start_config_cat(sdk_key, base_url: base_url, fetch_policy: FetchPolicy.manual())
+
+ APIMock
+ |> expect(:get, fn ^url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(%{})}}
+ end)
+
+ :ok = ConfigCat.force_refresh(client)
+ end
+ end
+
+ describe "automatically fetching the configuration" do
+ test "loads configuration after initialized", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ APIMock
+ |> stub(:get, fn _url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(config)}}
+ end)
+
+ fetch_policy = FetchPolicy.auto()
+ {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: fetch_policy)
+
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ test "retains previous configuration if state cannot be refreshed", %{
+ feature: feature,
+ config: config,
+ value: value
+ } do
+ APIMock
+ |> stub(:get, fn _url, _headers ->
+ {:ok, %Response{status_code: 500}}
+ end)
+
+ fetch_policy = FetchPolicy.auto()
+
+ {:ok, client} =
+ start_config_cat("SDK_KEY", fetch_policy: fetch_policy, initial_config: config)
+
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+ end
+
+ describe "lazily fetching the configuration" do
+ test "loads configuration when first attempting to get a value", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ {:ok, client} =
+ start_config_cat(
+ "SDK_KEY",
+ fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300)
+ )
+
+ APIMock
+ |> stub(:get, fn _url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(config)}}
+ end)
+
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ test "does not reload configuration if cache has not expired", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ {:ok, client} =
+ start_config_cat(
+ "SDK_KEY",
+ fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300)
+ )
+
+ APIMock
+ |> expect(:get, 1, fn _url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(config)}}
+ end)
+
+ ConfigCat.get_value(feature, "default", client: client)
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ test "refetches configuration if cache has expired", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ {:ok, client} =
+ start_config_cat(
+ "SDK_KEY",
+ fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 0)
+ )
+
+ APIMock
+ |> expect(:get, 2, fn _url, _headers ->
+ {:ok, %Response{status_code: 200, body: Jason.encode!(config)}}
+ end)
+
+ ConfigCat.get_value(feature, "default", client: client)
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+ end
+
+ describe "looking up configuration values" do
+ test "looks up the value for a key in the cached config", %{
+ config: config,
+ feature: feature,
+ value: value
+ } do
+ {:ok, client} =
+ start_config_cat("SDK_KEY", initial_config: config, fetch_policy: FetchPolicy.manual())
+
+ assert ConfigCat.get_value(feature, "default", client: client) == value
+ end
+
+ test "returns default value when config hasn't been fetched" do
+ {:ok, client} = start_config_cat("SDK_KEY", fetch_policy: FetchPolicy.manual())
+
+ assert ConfigCat.get_value("any_feature", "default", client: client) == "default"
+ end
+ end
+
+ defp start_config_cat(sdk_key, options \\ []) do
+ name = UUID.uuid4() |> String.to_atom()
+ ConfigCat.start_link(sdk_key, Keyword.merge([api: APIMock, name: name], options))
+ end
+end
diff --git a/test/fetch_policy_test.exs b/test/fetch_policy_test.exs
new file mode 100644
index 00000000..902395b7
--- /dev/null
+++ b/test/fetch_policy_test.exs
@@ -0,0 +1,101 @@
+defmodule ConfigCat.FetchPolicyTest do
+ use ExUnit.Case, async: true
+
+ alias ConfigCat.FetchPolicy
+
+ describe "checking whether a fetch is required" do
+ test "is not required for a manual policy" do
+ policy = FetchPolicy.manual()
+
+ refute FetchPolicy.needs_fetch?(policy, DateTime.utc_now())
+ end
+
+ test "is not required for an auto policy" do
+ policy = FetchPolicy.auto()
+
+ refute FetchPolicy.needs_fetch?(policy, DateTime.utc_now())
+ end
+
+ test "is required for a lazy policy when not yet fetched" do
+ policy = FetchPolicy.lazy(cache_expiry_seconds: 60)
+
+ assert FetchPolicy.needs_fetch?(policy, nil)
+ end
+
+ test "is required for a lazy policy when cache has expired" do
+ one_minute_ago = DateTime.add(DateTime.utc_now(), -60, :second)
+ policy = FetchPolicy.lazy(cache_expiry_seconds: 60)
+
+ assert FetchPolicy.needs_fetch?(policy, one_minute_ago)
+ end
+
+ test "is not required for a lazy policy when cache has not expired" do
+ a_few_seconds_ago = DateTime.add(DateTime.utc_now(), -3, :second)
+ policy = FetchPolicy.lazy(cache_expiry_seconds: 60)
+
+ refute FetchPolicy.needs_fetch?(policy, a_few_seconds_ago)
+ end
+ end
+
+ describe "creating auto fetch policy" do
+ test "returns with valid interval" do
+ actual = FetchPolicy.auto(poll_interval_seconds: -1)
+
+ assert actual.poll_interval_seconds == 1
+ end
+
+ test "returns with valid defaults" do
+ actual = FetchPolicy.auto()
+
+ assert actual.poll_interval_seconds == 60
+ assert actual.type == :auto
+ end
+ end
+
+ describe "checking to schedule initial fetch" do
+ test "returns true if auto policy" do
+ policy = FetchPolicy.auto()
+ assert FetchPolicy.schedule_initial_fetch?(policy)
+ end
+
+ test "returns false if manual policy" do
+ policy = FetchPolicy.manual()
+
+ refute FetchPolicy.schedule_initial_fetch?(policy)
+ end
+
+ test "returns false if lazy policy" do
+ policy = FetchPolicy.lazy(cache_expiry_seconds: 60)
+
+ refute FetchPolicy.schedule_initial_fetch?(policy)
+ end
+ end
+
+ describe "scheduling next fetch" do
+ test "sends a refresh message after poll interval" do
+ interval_seconds = 0
+ policy = FetchPolicy.auto() |> Map.put(:poll_interval_seconds, interval_seconds)
+ FetchPolicy.schedule_next_fetch(policy, self())
+
+ start = DateTime.utc_now()
+ assert_receive :refresh
+ stop = DateTime.utc_now()
+ time_passed = DateTime.diff(stop, start)
+ assert time_passed == interval_seconds
+ end
+
+ test "doesnt send a refresh message for manual policy" do
+ policy = FetchPolicy.manual()
+ FetchPolicy.schedule_next_fetch(policy, self())
+
+ refute_receive :refresh
+ end
+
+ test "doesnt send a refresh message for lazy policy" do
+ policy = FetchPolicy.lazy(cache_expiry_seconds: 1)
+ FetchPolicy.schedule_next_fetch(policy, self())
+
+ refute_receive :refresh
+ end
+ end
+end
diff --git a/test/fixtures/testmatrix.csv b/test/fixtures/testmatrix.csv
new file mode 100644
index 00000000..c1851f29
--- /dev/null
+++ b/test/fixtures/testmatrix.csv
@@ -0,0 +1,1012 @@
+Identifier;Email;Country;Custom1;bool30TrueAdvancedRules;boolDefaultFalse;boolDefaultTrue;double25Pi25E25Gr25Zero;doubleDefaultPi;integer25One25Two25Three25FourAdvancedRules;integerDefaultOne;string25Cat25Dog25Falcon25Horse;string25Cat25Dog25Falcon25HorseAdvancedRules;string75Cat0Dog25Falcon0Horse;stringContainsDogDefaultCat;stringDefaultCat;stringIsInDogDefaultCat;stringIsNotInDogDefaultCat;stringNotContainsDogDefaultCat
+##null##;;;;true;false;true;-1.0;3.1415;-1;1;Chicken;Chicken;Chicken;Cat;Cat;Cat;Cat;Cat
+a@configcat.com;a@configcat.com;Hungary;admin;false;false;true;5.561;3.1415;5;1;Cat;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat
+b@configcat.com;b@configcat.com;Hungary;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat
+c@configcat.com;c@configcat.com;United Kingdom;admin;false;false;true;5.561;3.1415;5;1;Dog;Dolphin;Falcon;Dog;Cat;Dog;Dog;Cat
+d@configcat.com;d@configcat.com;United Kingdom;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Cat;Dog;Cat
+e@configcat.com;e@configcat.com;United States of America;;false;false;true;5.561;3.1415;5;1;Falcon;Kitten;Cat;Dog;Cat;Cat;Dog;Cat
+f@configcat.com;f@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat
+g@configcat.com;g@configcat.com;;;false;false;true;5.561;3.1415;5;1;Horse;Kitten;Cat;Dog;Cat;Cat;Dog;Cat
+h@configcat.com;h@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Cat;Dog;Cat;Cat;Dog;Cat
+i@configcat.com;i@configcat.com;;admin;true;false;true;5.561;3.1415;5;1;Cat;Lion;Falcon;Dog;Cat;Dog;Dog;Cat
+j@configcat.com;j@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat
+stern@msn.com;stern@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+sarahs@yahoo.com;sarahs@yahoo.com;##null##;##null##;true;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+luebke@hotmail.com;luebke@hotmail.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+padme@icloud.com;padme@icloud.com;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+claypool@aol.com;claypool@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+bogjobber@verizon.net;bogjobber@verizon.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+cliffordj@aol.com;cliffordj@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+bryanw@verizon.net;bryanw@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+jfmulder@sbcglobal.net;jfmulder@sbcglobal.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+raines@live.com;raines@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+ribet@yahoo.ca;ribet@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+nacho@gmail.com;nacho@gmail.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+sherzodr@att.net;sherzodr@att.net;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+oster@optonline.net;oster@optonline.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+josem@icloud.com;josem@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+hedwig@outlook.com;hedwig@outlook.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+camenisch@yahoo.com;camenisch@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+ccohen@comcast.net;ccohen@comcast.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+techie@att.net;techie@att.net;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+damian@gmail.com;damian@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+psharpe@comcast.net;psharpe@comcast.net;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+ebassi@me.com;ebassi@me.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+curly@aol.com;curly@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+rddesign@optonline.net;rddesign@optonline.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+boftx@gmail.com;boftx@gmail.com;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+eegsa@yahoo.ca;eegsa@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+ganter@gmail.com;ganter@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+mleary@att.net;mleary@att.net;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+kassiesa@icloud.com;kassiesa@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+peterhoeg@outlook.com;peterhoeg@outlook.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+mhanoh@yahoo.ca;mhanoh@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+henkp@yahoo.com;henkp@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+krueger@sbcglobal.net;krueger@sbcglobal.net;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+barjam@yahoo.com;barjam@yahoo.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+mirod@msn.com;mirod@msn.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+marioph@yahoo.com;marioph@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+niknejad@optonline.net;niknejad@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+bwcarty@sbcglobal.net;bwcarty@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+mcast@aol.com;mcast@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+portscan@msn.com;portscan@msn.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+pereinar@yahoo.ca;pereinar@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+floxy@verizon.net;floxy@verizon.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+mhassel@comcast.net;mhassel@comcast.net;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+mgemmons@optonline.net;mgemmons@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+luvirini@mac.com;luvirini@mac.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+gslondon@gmail.com;gslondon@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+lamky@comcast.net;lamky@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+keiji@mac.com;keiji@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog
+gumpish@verizon.net;gumpish@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+tromey@hotmail.com;tromey@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+miyop@aol.com;miyop@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+natepuri@me.com;natepuri@me.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+sbmrjbr@outlook.com;sbmrjbr@outlook.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Dog;Dog
+hahiss@gmail.com;hahiss@gmail.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+gmcgath@yahoo.ca;gmcgath@yahoo.ca;##null##;##null##;true;false;true;0.0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+zavadsky@msn.com;zavadsky@msn.com;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+munson@gmail.com;munson@gmail.com;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+jfriedl@yahoo.com;jfriedl@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+lushe@yahoo.ca;lushe@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+skythe@gmail.com;skythe@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+jigsaw@me.com;jigsaw@me.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+schwaang@gmail.com;schwaang@gmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+eurohack@verizon.net;eurohack@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+janneh@icloud.com;janneh@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+frederic@me.com;frederic@me.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+facet@optonline.net;facet@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+uncle@aol.com;uncle@aol.com;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+wilsonpm@comcast.net;wilsonpm@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+garland@optonline.net;garland@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+srour@yahoo.com;srour@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+inico@hotmail.com;inico@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+plover@comcast.net;plover@comcast.net;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+amichalo@comcast.net;amichalo@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+mirod@hotmail.com;mirod@hotmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+bester@mac.com;bester@mac.com;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+kildjean@verizon.net;kildjean@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Dog;Dog
+arandal@comcast.net;arandal@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+bartlett@yahoo.com;bartlett@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+zyghom@icloud.com;zyghom@icloud.com;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+valdez@mac.com;valdez@mac.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+scato@yahoo.com;scato@yahoo.com;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+sinkou@live.com;sinkou@live.com;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+evilopie@comcast.net;evilopie@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+ducasse@gmail.com;ducasse@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+sthomas@sbcglobal.net;sthomas@sbcglobal.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+plover@msn.com;plover@msn.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+mavilar@yahoo.com;mavilar@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+josephw@msn.com;josephw@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+qmacro@yahoo.com;qmacro@yahoo.com;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+munson@mac.com;munson@mac.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog
+paulv@mac.com;paulv@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+dogdude@hotmail.com;dogdude@hotmail.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Dog;Dog
+symbolic@yahoo.ca;symbolic@yahoo.ca;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+carcus@yahoo.com;carcus@yahoo.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+sblack@me.com;sblack@me.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog
+richard@gmail.com;richard@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+tbusch@yahoo.ca;tbusch@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+gtaylor@aol.com;gtaylor@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+burniske@att.net;burniske@att.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+bebing@me.com;bebing@me.com;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+joglo@gmail.com;joglo@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+chrwin@sbcglobal.net;chrwin@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+chaikin@yahoo.com;chaikin@yahoo.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+jigsaw@verizon.net;jigsaw@verizon.net;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+wbarker@yahoo.ca;wbarker@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+ganter@verizon.net;ganter@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+eegsa@att.net;eegsa@att.net;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+sethbrown@hotmail.com;sethbrown@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+solomon@me.com;solomon@me.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+tellis@yahoo.ca;tellis@yahoo.ca;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+jshirley@optonline.net;jshirley@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+tattooman@verizon.net;tattooman@verizon.net;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+bescoto@yahoo.com;bescoto@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+hstiles@comcast.net;hstiles@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+gumpish@optonline.net;gumpish@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+hikoza@optonline.net;hikoza@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+slanglois@yahoo.ca;slanglois@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+kmiller@verizon.net;kmiller@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+bowmanbs@hotmail.com;bowmanbs@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+penna@msn.com;penna@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog
+rnelson@live.com;rnelson@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog
+johndo@aol.com;johndo@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+shrapnull@att.net;shrapnull@att.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog
+lcheng@comcast.net;lcheng@comcast.net;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+cyrus@msn.com;cyrus@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog
+suresh@yahoo.ca;suresh@yahoo.ca;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog
+elflord@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+sassen@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dbindel@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+morain@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+timtroyr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+esbeck@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+ilyaz@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+grinder@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+trieuvan@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+koudas@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+specprog@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+nichoj@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+sopwith@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+odlyzko@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+warrior@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+budinger@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lstein@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+kmiller@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+british@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+webinc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kohlis@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+matthijs@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mmccool@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ribet@hotmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+wildfire@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+makarow@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+garland@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+kjohnson@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+oneiros@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+jaxweb@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+raides@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+cantu@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+msherr@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dwsauder@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+comdig@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+esokullu@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kjetilk@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+boomzilla@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+cvrcek@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+iamcal@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+grdschl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jgwang@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+stevelim@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+weidai@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+dpitts@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+bebing@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+wikinerd@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+pfitza@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+policies@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+niknejad@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+aukjan@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dleconte@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+noahb@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bdbrown@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+adillon@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+eegsa@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+chunzi@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+privcan@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+mglee@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+leocharre@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dwendlan@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lpalmer@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+emcleod@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mwandel@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+stewwy@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+drolsky@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+lukka@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+geekgrl@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+epeeist@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+papathan@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+singh@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+njpayne@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+willg@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jimmichie@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+frosal@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+dunstan@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+parasite@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+firstpr@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+konit@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+amaranth@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mcsporran@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gommix@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dprice@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+lcheng@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dwendlan@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+miami@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ajlitt@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+grdschl@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+andersbr@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hoangle@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jbuchana@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+knorr@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+saridder@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+scotfl@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+skoch@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+luebke@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bsikdar@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+ryanvm@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dburrows@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+seebs@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mgemmons@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+kobayasi@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+marcs@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+netsfr@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+martink@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bflong@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bhima@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+oster@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+teverett@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kannan@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+yzheng@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+msusa@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+falcao@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+uraeus@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dunstan@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+oracle@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+tbeck@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+scottzed@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+sblack@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+yenya@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bjoern@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+benanov@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+preneel@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+punkis@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+rwelty@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+penna@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+baveja@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+louise@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+arachne@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hahiss@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+wayward@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pajas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+intlprog@comcast.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+hermanab@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+presoff@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+trygstad@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+denton@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+skythe@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lushe@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+magusnet@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ullman@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+jyoliver@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+flavell@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+ianbuck@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+satch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gommix@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+rnelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+crusader@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+rddesign@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+nanop@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ngedmond@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+munjal@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+unreal@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jemarch@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+shawnce@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+nweaver@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+british@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ccohen@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+amaranth@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+louise@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+atmarks@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+iamcal@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+snunez@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mrobshaw@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+denton@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+konst@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+louise@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+wetter@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kohlis@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+monkeydo@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+melnik@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+munge@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+stefano@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+giafly@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+gbacon@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dgriffith@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+firstpr@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+nichoj@comcast.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+aibrahim@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+inico@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ribet@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ajlitt@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+errxn@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+lstein@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mgemmons@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jadavis@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+zilla@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bogjobber@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+shazow@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+rgarton@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+meder@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+hedwig@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dhwon@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mstrout@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+manuals@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+andrewik@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hahsler@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+miami@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+facet@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+zeitlin@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+lamprecht@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+johnh@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mrsam@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lipeng@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+dsowsy@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+philen@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kjohnson@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+nelson@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+syncnine@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jfmulder@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jacks@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+mrdvt@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+cfhsoft@outlook.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+kodeman@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mbrown@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jaxweb@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+symbolic@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+hager@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+zavadsky@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mugwump@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+dprice@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+petersko@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+netsfr@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+tbmaddux@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+meder@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+benits@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+timlinux@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+heroine@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hachi@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+sthomas@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+thaljef@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ganter@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+drjlaw@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+timtroyr@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+smcnabb@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+fwiles@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+delpino@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+whimsy@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+lbecchi@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jbearp@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+tamas@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+panolex@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lridener@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+wayward@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+amaranth@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+garland@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+rfisher@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+stern@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+mavilar@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+rfisher@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+tarreau@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+koudas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bwcarty@mac.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jeteve@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+pmint@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+barlow@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+punkis@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jfinke@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+unreal@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dwendlan@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dbrobins@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rasca@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jfriedl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+clkao@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+noahb@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ducasse@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jrkorson@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+corrada@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+tmaek@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+richard@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+pkplex@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kwilliams@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mcrawfor@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+webteam@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+leakin@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+njpayne@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+konst@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+godeke@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+godeke@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+glenz@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+fallorn@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+nacho@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dkeeler@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+adhere@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gfody@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+codex@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+erynf@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+monkeydo@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+lauronen@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dinther@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+miami@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kewley@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dkeeler@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+galbra@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mastinfo@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kempsonc@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+andale@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+airship@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+xtang@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jhardin@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+frederic@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+matsn@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+pereinar@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+salesgeek@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+tezbo@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+keijser@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+chaki@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+wetter@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+thassine@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+hoangle@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+bester@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jdhedden@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+killmenow@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+retoh@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+goresky@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+microfab@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+pfitza@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+onestab@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+aracne@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+sherzodr@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+feamster@verizon.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+hyper@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jmgomez@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+fwitness@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+storerm@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+improv@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+arnold@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+blixem@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rohitm@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+rfisher@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+alastair@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+multiplx@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+caidaperl@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lbaxter@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+hachi@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mfburgo@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gfody@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+jaxweb@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+wojciech@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+doche@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+josephw@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+hakim@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+lstein@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+conteb@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+wildixon@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+oechslin@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+metzzo@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kosact@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kodeman@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ebassi@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+pgolle@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jdhildeb@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+garyjb@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+gslondon@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+maratb@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+marnanel@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+rgiersig@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+gozer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+valdez@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+mnemonic@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+paina@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+syncnine@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+melnik@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jaesenj@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+sekiya@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+tbusch@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+whimsy@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+firstpr@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+bartlett@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+bester@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+gordonjcp@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+bcevc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+sethbrown@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mcmillan@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+raines@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+psharpe@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bachmann@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+leslie@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hager@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ismail@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+nacho@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kohlis@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+lahvak@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+willg@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+zavadsky@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+steve@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ccohen@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+msusa@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jsmith@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jshearer@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+majordick@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+sjava@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+rupak@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+empathy@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+intlprog@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+matthijs@gmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+portscan@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+morain@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+akoblin@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mhassel@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+spadkins@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rohitm@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mwandel@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+warrior@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jipsen@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bancboy@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+corrada@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+wojciech@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+marcs@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+atmarks@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+quinn@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dkeeler@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pizza@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+empathy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dmouse@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+dinther@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+pappp@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+dougj@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+cfhsoft@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+maratb@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+stewwy@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+sravani@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+tmaek@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+juliano@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mcsporran@optonline.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+mgemmons@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+seasweb@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+lushe@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+schumer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gfody@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mlewan@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+eegsa@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rhavyn@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+cremonini@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+boftx@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+smartfart@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+uncled@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+quantaman@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+heidrich@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+moinefou@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ilial@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+fraser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+csilvers@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+csilvers@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+kalpol@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+punkis@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+nacho@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mcsporran@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jaarnial@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gboss@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+henkp@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+philb@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hllam@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+roamer@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+cantu@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+firstpr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+hmbrand@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+arandal@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jaarnial@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+hoyer@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mmccool@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+smcnabb@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+pakaste@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+panolex@mac.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hikoza@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+larry@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+arandal@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+policies@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+sblack@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+lushe@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+devphil@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dowdy@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+arachne@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+donev@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bowmanbs@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+roesch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+lridener@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hmbrand@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+sopwith@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+vsprintf@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+symbolic@aol.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+gbacon@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hillct@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+earmstro@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+studyabr@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+shawnce@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+boser@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gknauss@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+marcs@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bruck@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+comdig@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+floxy@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+tmccarth@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+darin@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+mcraigw@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+fhirsch@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+unreal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+crypt@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pakaste@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+staffelb@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jonas@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+staikos@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mfburgo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+psichel@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+brainless@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jmgomez@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+wsnyder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+carcus@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dmouse@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+graham@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+murdocj@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+reziac@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+caronni@sbcglobal.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hoyer@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+amcuri@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mstrout@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+osrin@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+geeber@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+konit@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+mxiao@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ryanshaw@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+bowmanbs@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+yamla@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ardagna@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+darin@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jmorris@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+valdez@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+haddawy@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+biglou@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pplinux@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+afeldspar@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+campbell@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+akoblin@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+nwiger@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+stinson@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+daveed@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+arachne@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+augusto@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+xtang@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+itstatus@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kspiteri@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kewley@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+yamla@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+oevans@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+ebassi@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+scitext@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+sisyphus@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jamuir@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+dobey@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rande@live.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dkasak@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+greear@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+thaljef@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+sjmuir@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+joehall@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+kronvold@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jmorris@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+ajohnson@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+russotto@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+pgolle@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+mrdvt@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+starstuff@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+jesse@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+luebke@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+emmanuel@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+imightb@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+wbarker@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+luvirini@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+ylchang@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+elflord@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+scottzed@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mcraigw@yahoo.ca;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+nacho@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+rwelty@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+subir@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+tbusch@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+rupak@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+giafly@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+british@outlook.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hllam@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+fatelk@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+parsimony@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+tbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+citizenl@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+starstuff@sbcglobal.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bader@icloud.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+starstuff@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+satishr@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ilikered@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+bader@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+yruan@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+skoch@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bader@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+smallpaul@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+stern@verizon.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+feamster@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+mcnihil@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+firstpr@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+bmorrow@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+laird@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+ingolfke@msn.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+irving@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+monopole@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+keiji@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+wortmanj@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+keijser@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+aschmitz@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+tangsh@mac.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jdray@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kewley@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+policies@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+wayward@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+errxn@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+fglock@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kmself@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+amichalo@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mwandel@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+thowell@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+pedwards@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dmiller@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+choset@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dbrobins@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+pizza@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+noahb@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jespley@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jfriedl@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+arebenti@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+eidac@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jipsen@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+malin@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jramio@optonline.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jsnover@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+martyloo@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+danny@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bruck@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jfmulder@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+wsnyder@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+leslie@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+noticias@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+cgcra@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+louise@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rasca@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+cvrcek@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+chaffar@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+webdragon@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+knorr@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+kawasaki@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+satishr@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+drewf@comcast.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+martyloo@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+lstein@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+nighthawk@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+debest@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+cyrus@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+yruan@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+bmidd@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+policies@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+treit@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+animats@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kawasaki@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jramio@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+josephw@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+rgarcia@me.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+ryanvm@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+rnewman@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+yangyan@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+tubesteak@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+munjal@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pgolle@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+milton@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+harryh@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+howler@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+drewf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+cantu@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+leslie@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mfleming@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+nelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+valdez@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jsmith@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+djpig@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bader@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+galbra@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dawnsong@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mcrawfor@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+pthomsen@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+raides@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ahuillet@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+kostas@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+lridener@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+maneesh@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+sartak@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+rohitm@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+heidrich@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+koudas@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+okroeger@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+cgcra@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+janusfury@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+seurat@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dhrakar@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bebing@msn.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+keiji@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+okroeger@hotmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+gward@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+jusdisgi@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+sakusha@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+rande@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mwitte@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+alhajj@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+marcs@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+juerd@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+sethbrown@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kdawson@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+mfburgo@aol.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+crandall@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+schwaang@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+mrsam@icloud.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+szymansk@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+epeeist@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+miyop@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+wainwrig@me.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+pereinar@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+killmenow@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+dsowsy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+forsberg@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+amaranth@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+mkearl@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+openldap@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+world@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+adamk@att.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+pdbaby@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hellfire@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+firstpr@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kenja@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+leslie@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bogjobber@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+hauma@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+hoangle@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+nimaclea@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+fraterk@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+ninenine@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+campware@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+amimojo@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+karasik@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+yenya@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+stevelim@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+dvdotnet@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+bonmots@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+schumer@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+andrei@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+alfred@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+multiplx@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+tjensen@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+dmath@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+kostas@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+carmena@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+terjesa@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+tjensen@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+schwaang@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+nimaclea@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jaesenj@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+mobileip@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+nullchar@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+crowemojo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+hermanab@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+esbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+naoya@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+lpalmer@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+dgatwood@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+jtorkbob@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+rfoley@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+andale@comcast.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+mlewan@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+ianbuck@yahoo.ca;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+syrinx@live.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+imightb@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+gozer@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+gozer@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+shawnce@gmail.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+lauronen@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+raines@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jfriedl@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+smpeters@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+thurston@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+flaviog@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mnemonic@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+privcan@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+mobileip@verizon.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+gbacon@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+caronni@optonline.net;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+tbeck@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+keijser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+scotfl@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+ryanshaw@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+eimear@att.net;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+noticias@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+leocharre@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+killmenow@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+petersen@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+bdthomas@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+mavilar@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+isaacson@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+miyop@msn.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+bwcarty@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+warrior@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+magusnet@hotmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+crowemojo@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+crypt@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat
+kempsonc@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat
+kayvonf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+noahb@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+symbolic@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+wsnyder@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+pdbaby@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+jfriedl@yahoo.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+jwarren@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+dsugal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+kayvonf@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+nasarius@mac.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+bolow@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+tbmaddux@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+maradine@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+breegster@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+jshirley@gmail.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+tfinniga@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat
+delpino@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+stecoop@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat
+jnolan@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+jhardin@yahoo.com;##null##;##null##;##null##;true;false;true;0.0;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+teverett@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
+wsnyder@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+treeves@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat
+garland@outlook.com;##null##;##null##;##null##;false;false;true;0.0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat
+ullman@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat
+sumdumass@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat
diff --git a/test/fixtures/testmatrix_number.csv b/test/fixtures/testmatrix_number.csv
new file mode 100644
index 00000000..56a53508
--- /dev/null
+++ b/test/fixtures/testmatrix_number.csv
@@ -0,0 +1,26 @@
+Identifier;Email;Country;Custom1;numberWithPercentage;number
+##null##;;;;Default;Default
+id1;;;0;<2.1;<>5
+id1;;;0.0;<2.1;<>5
+id1;;;0,0;<2.1;<>5
+id1;;;0.2;<2.1;<>5
+id2;;;0,2;<2.1;<>5
+id3;;;1;<2.1;<>5
+id4;;;1.0;<2.1;<>5
+id5;;;1,0;<2.1;<>5
+id6;;;1.5;<2.1;<>5
+id7;;;1,5;<2.1;<>5
+id8;;;2.1;<=2,1;<>5
+id9;;;2,1;<=2,1;<>5
+id10;;;3.50;=3.5;<>5
+id11;;;3,50;=3.5;<>5
+id12;;;5;>=5;Default
+id13;;;5.0;>=5;Default
+id14;;;5,0;>=5;Default
+id13;;;5.76;>5;<>5
+id14;;;5,76;>5;<>5
+id15;;;4;<>4.2;<>5
+id16;;;4.0;<>4.2;<>5
+id17;;;4,0;<>4.2;<>5
+id18;;;4.2;80%;<>5
+id19;;;4,2;20%;<>5
diff --git a/test/fixtures/testmatrix_semantic.csv b/test/fixtures/testmatrix_semantic.csv
new file mode 100644
index 00000000..a5a70465
--- /dev/null
+++ b/test/fixtures/testmatrix_semantic.csv
@@ -0,0 +1,36 @@
+Identifier;Email;Country;Custom1;isOneOf;isOneOfWithPercentage;isNotOneOf;isNotOneOfWithPercentage;lessThanWithPercentage;relations
+##null##;;;;Default;Default;Default;Default;Default;Default
+id1;;;0.0.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0
+id1;;;0.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0
+id1;;;0.2.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );< 1.0.0;< 1.0.0
+id1;;;1;Default;80%;Default;80%;20%;Default
+id2;;;1.0;Default;80%;Default;80%;80%;Default
+id3;;;1.0.0;Is one of (1.0.0);is one of (1.0.0);Default;80%;80%;<=1.0.0
+id4;;;1.0.0.0;Default;80%;Default;20%;20%;Default
+id5;;;1.0.0.0.0;Default;80%;Default;80%;80%;Default
+id6;;;1.0.1;Default;80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;Default
+id7;;;1.0.11;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default
+id8;;;1.0.111;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id9;;;1.0.2;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id10;;;1.0.3;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id11;;;1.0.4;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id12;;;1.0.5;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id13;;;1.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id14;;;1.1.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id15;;;1.1.2;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id16;;;1.1.3;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default
+id17;;;1.1.4;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default
+id18;;;1.1.5;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id19;;;1.9.0;Default;20%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;Default
+id20;;;1.9.99;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;Default
+id21;;;2.0.0;Default;80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);20%;>=2.0.0
+id22;;;2.0.1;Is one of ( , 2.0.1, 2.0.2, );80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;>2.0.0
+id23;;;2.0.11;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0
+id24;;;2.0.2;Is one of ( , 2.0.1, 2.0.2, );80%;Is not one of (1.0.0, 3.0.1);Is not one of (1.0.0, 3.0.1);80%;>2.0.0
+id25;;;2.0.3;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0
+id26;;;3.0.0;Is one of (3.0.0);80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0
+id27;;;3.0.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0
+id28;;;3.1.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0
+id28;;;3.1.1;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0
+id29;;;5.0.0;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );80%;>2.0.0
+id30;;;5.99.999;Default;80%;Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );Is not one of (1.0.0, 1.0.1, 2.0.0 , 2.0.1, 2.0.2, );20%;>2.0.0
diff --git a/test/fixtures/testmatrix_semantic_2.csv b/test/fixtures/testmatrix_semantic_2.csv
new file mode 100644
index 00000000..449f8632
--- /dev/null
+++ b/test/fixtures/testmatrix_semantic_2.csv
@@ -0,0 +1,95 @@
+Identifier;Email;Country;AppVersion;precedenceTests
+dontcare;;;1.9.1-1;< 1.9.1-2
+dontcare;;;1.9.1-2;< 1.9.1-10
+dontcare;;;1.9.1-10;< 1.9.1-10a
+dontcare;;;1.9.1-10a;< 1.9.1-1a
+dontcare;;;1.9.1-1a;< 1.9.1-alpha
+dontcare;;;1.9.1-alpha;< 1.9.99-alpha
+dontcare;;;1.9.99-alpha;= 1.9.99-alpha
+dontcare;;;1.9.99-alpha+build1;= 1.9.99-alpha
+dontcare;;;1.9.99-alpha+build2;= 1.9.99-alpha
+dontcare;;;1.9.99-alpha2;< 1.9.99-beta
+dontcare;;;1.9.99-beta;< 1.9.99-rc
+dontcare;;;1.9.99-rc;< 1.9.99-rc.1
+dontcare;;;1.9.99-rc.1;< 1.9.99-rc.2
+dontcare;;;1.9.99-rc.2;< 1.9.99-rc.20
+dontcare;;;1.9.99-rc.9;< 1.9.99-rc.20
+dontcare;;;1.9.99-rc.20;< 1.9.99-rc.20a
+dontcare;;;1.9.99-rc.20a;< 1.9.99-rc.2a
+dontcare;;;1.9.99-rc.2a;< 1.9.99
+dontcare;;;1.9.99;< 1.9.100
+dontcare;;;1.9.100;< 1.10.0-alpha
+dontcare;;;1.10.0-alpha;<= 1.10.0-alpha
+dontcare;;;1.10.0;<= 1.10.0
+dontcare;;;1.10.1;<= 1.10.1
+dontcare;;;1.10.2;<= 1.10.3
+dontcare;;;2.0.0;= 2.0.0
+dontcare;;;2.0.0+build3;= 2.0.0
+dontcare;;;2.0.0+001;= 2.0.0
+dontcare;;;2.0.0+20130313144700;= 2.0.0
+dontcare;;;2.0.0+exp.sha.5114f85;= 2.0.0
+dontcare;;;3.0.0;= 3.0.0+build3
+dontcare;;;4.0.0;= 4.0.0+001
+dontcare;;;5.0.0;= 5.0.0+20130313144700
+dontcare;;;6.0.0;= 6.0.0+exp.sha.5114f85
+dontcare;;;7.0.0-patch+metadata;= 7.0.0-patch
+dontcare;;;8.0.0-patch+metadata;= 8.0.0-patch+anothermetadata
+dontcare;;;9.0.0-patch;= 9.0.0-patch+metadata
+dontcare;;;10.0.0;DEFAULT-FROM-CC-APP
+dontcare;;;104.0.0;> 103.0.0
+dontcare;;;103.0.0;>= 103.0.0
+dontcare;;;102.0.0;>= 101.0.0
+dontcare;;;101.0.0;>= 101.0.0
+dontcare;;;90.104.0;> 90.103.0
+dontcare;;;90.103.0;>= 90.103.0
+dontcare;;;90.102.0;>= 90.101.0
+dontcare;;;90.101.0;>= 90.101.0
+dontcare;;;80.0.104;> 80.0.103
+dontcare;;;80.0.103;>= 80.0.103
+dontcare;;;80.0.102;>= 80.0.101
+dontcare;;;80.0.101;>= 80.0.101
+dontcare;;;73.0.0;>= 73.0.0-beta.2
+dontcare;;;72.0.0;> 72.0.0-beta.2
+dontcare;;;72.0.0-beta.2;> 72.0.0-beta.1
+dontcare;;;72.0.0-beta.1;> 72.0.0-beta
+dontcare;;;72.0.0-beta;> 72.0.0-alpha
+dontcare;;;72.0.0-alpha;> 72.0.0-1a
+dontcare;;;72.0.0-1a;> 72.0.0-10a
+dontcare;;;72.0.0-10aa;> 72.0.0-10a
+dontcare;;;72.0.0-10a;> 72.0.0-2
+dontcare;;;72.0.0-2;> 72.0.0-1
+dontcare;;;71.0.0+metadata;>= 71.0.0+anothermetadata
+dontcare;;;71.0.0-patch3+metadata;>= 71.0.0-patch3+anothermetadata
+dontcare;;;71.0.0-patch2+metadata;>= 71.0.0-patch2
+dontcare;;;71.0.0-patch1;>= 71.0.0-patch1+metadata
+dontcare;;;60.73.0;>= 60.73.0-beta.2
+dontcare;;;60.72.0;> 60.72.0-beta.2
+dontcare;;;60.72.0-beta.2;> 60.72.0-beta.1
+dontcare;;;60.72.0-beta.1;> 60.72.0-beta
+dontcare;;;60.72.0-beta;> 60.72.0-alpha
+dontcare;;;60.72.0-alpha;> 60.72.0-1a
+dontcare;;;60.72.0-1a;> 60.72.0-10a
+dontcare;;;60.72.0-10aa;> 60.72.0-10a
+dontcare;;;60.72.0-10a;> 60.72.0-2
+dontcare;;;60.72.0-2;> 60.72.0-1
+dontcare;;;60.71.0+metadata;>= 60.71.0+anothermetadata
+dontcare;;;60.71.0-patch3+metadata;>= 60.71.0-patch3+anothermetadata
+dontcare;;;60.71.0-patch2+metadata;>= 60.71.0-patch2
+dontcare;;;60.71.0-patch1;>= 60.71.0-patch1+metadata
+dontcare;;;50.60.73;>= 50.60.73-beta.2
+dontcare;;;50.60.72;> 50.60.72-beta.2
+dontcare;;;50.60.72-beta.2;> 50.60.72-beta.1
+dontcare;;;50.60.72-beta.1;> 50.60.72-beta
+dontcare;;;50.60.72-beta;> 50.60.72-alpha
+dontcare;;;50.60.72-alpha;> 50.60.72-1a
+dontcare;;;50.60.72-1a;> 50.60.72-10a
+dontcare;;;50.60.72-10aa;> 50.60.72-10a
+dontcare;;;50.60.72-10a;> 50.60.72-2
+dontcare;;;50.60.72-2;> 50.60.72-1
+dontcare;;;50.60.71+metadata;>= 50.60.71+anothermetadata
+dontcare;;;50.60.71-patch3+metadata;>= 50.60.71-patch3+anothermetadata
+dontcare;;;50.60.71-patch2+metadata;>= 50.60.71-patch2
+dontcare;;;50.60.71-patch1;>= 50.60.71-patch1+metadata
+dontcare;;;50.60.71-patch1+anothermetadata;>= 50.60.71-patch1+metadata
+dontcare;;;40.0.0-patch;>= 40.0.0-patch
+dontcare;;;30.0.0-beta;>= 30.0.0-alpha
diff --git a/test/fixtures/testmatrix_sensitive.csv b/test/fixtures/testmatrix_sensitive.csv
new file mode 100644
index 00000000..1fe9dbf0
--- /dev/null
+++ b/test/fixtures/testmatrix_sensitive.csv
@@ -0,0 +1,8 @@
+Identifier;Email;Country;Custom1;isOneOfSensitive;isNotOneOfSensitive
+##null##;;;;ToAll;ToAll
+id1;macska@example.com;;;Macska;Kigyo
+Kutya;;;;Allat;ToAll
+Sas;;;;ToAll;Kigyo
+Kutya;macska@example.com;;;Macska;ToAll
+id1;;Scotland;;Britt;Kigyo
+Macska;;USA;;ToAll;Ireland
diff --git a/test/integration_test.exs b/test/integration_test.exs
new file mode 100644
index 00000000..e7a4e911
--- /dev/null
+++ b/test/integration_test.exs
@@ -0,0 +1,57 @@
+defmodule ConfigCat.IntegrationTest do
+ use ExUnit.Case, async: true
+
+ alias ConfigCat.FetchPolicy
+
+ @sdk_key "PKDVCLf-Hq-h-kCzMp-L7Q/PaDVCFk9EpmD6sLpGLltTA"
+
+ test "fetches config" do
+ {:ok, client} = start_config_cat(@sdk_key)
+
+ :ok = ConfigCat.force_refresh(client)
+
+ assert ConfigCat.get_value("keySampleText", "default value", client: client) ==
+ "This text came from ConfigCat"
+ end
+
+ test "maintains previous configuration when config has not changed between refreshes" do
+ {:ok, client} = start_config_cat(@sdk_key)
+
+ :ok = ConfigCat.force_refresh(client)
+ :ok = ConfigCat.force_refresh(client)
+
+ assert ConfigCat.get_value("keySampleText", "default value", client: client) ==
+ "This text came from ConfigCat"
+ end
+
+ test "lazily fetches configuration when using lazy loading" do
+ {:ok, client} =
+ start_config_cat(
+ @sdk_key,
+ fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 5)
+ )
+
+ assert ConfigCat.get_value("keySampleText", "default value", client: client) ==
+ "This text came from ConfigCat"
+ end
+
+ @tag capture_log: true
+ test "handles errors from ConfigCat server" do
+ {:ok, client} = start_config_cat("invalid_sdk_key")
+
+ {:error, response} = ConfigCat.force_refresh(client)
+ assert response.status_code == 404
+ end
+
+ @tag capture_log: true
+ test "handles invalid base_url" do
+ {:ok, client} = start_config_cat(@sdk_key, base_url: "https://invalidcdn.configcat.com")
+
+ assert {:error, %HTTPoison.Error{}} = ConfigCat.force_refresh(client)
+ end
+
+ defp start_config_cat(sdk_key, options \\ []) do
+ name = UUID.uuid4() |> String.to_atom()
+ ConfigCat.start_link(sdk_key, Keyword.merge([name: name], options))
+ end
+end
diff --git a/test/rollout/comparator_test.exs b/test/rollout/comparator_test.exs
new file mode 100644
index 00000000..ccf02b6e
--- /dev/null
+++ b/test/rollout/comparator_test.exs
@@ -0,0 +1,258 @@
+defmodule ConfigCat.Rollout.ComparatorTest do
+ @moduledoc """
+ All evaluators are tested exhaustively in ConfigCat.RolloutTest,
+ these are basic tests to ensure that we're using the correct
+ comparator type for the given comparator value.
+ """
+
+ use ExUnit.Case, async: true
+
+ alias ConfigCat.Rollout.Comparator
+ alias Version.InvalidVersionError
+
+ test "returns false if given an unknown comparator" do
+ assert {:ok, false} = Comparator.compare(-1, "b", "a, b, c")
+ end
+
+ describe "basic comparators" do
+ test "is_one_of" do
+ is_one_of = 0
+
+ assert {:ok, true} = Comparator.compare(is_one_of, "b", "a, b, c")
+ assert {:ok, false} = Comparator.compare(is_one_of, "x", "a, b, c")
+ end
+
+ test "is_not_one_of" do
+ is_not_one_of = 1
+
+ assert {:ok, false} = Comparator.compare(is_not_one_of, "b", "a, b, c")
+ assert {:ok, true} = Comparator.compare(is_not_one_of, "x", "a, b, c")
+ end
+
+ test "contains" do
+ contains = 2
+
+ assert {:ok, true} = Comparator.compare(contains, "jane@influxdata.com", "influxdata.com")
+ assert {:ok, false} = Comparator.compare(contains, "jane@email.com", "influxdata.com")
+ end
+
+ test "does_not_contain" do
+ does_not_contain = 3
+
+ assert {:ok, false} =
+ Comparator.compare(does_not_contain, "jane@influxdata.com", "influxdata.com")
+
+ assert {:ok, true} =
+ Comparator.compare(does_not_contain, "jane@email.com", "influxdata.com")
+ end
+ end
+
+ describe "semantic version comparators" do
+ test "is_one_of (semver)" do
+ is_one_of_semver = 4
+
+ assert {:ok, true} = Comparator.compare(is_one_of_semver, "1.2.0", "1.2.0, 1.3.4")
+ assert {:ok, false} = Comparator.compare(is_one_of_semver, "2.0.0", "1.2.0, 1.3.4")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_one_of_semver, "invalid", "1.2.0, 1.3.4")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_one_of_semver, "1.2.0", "invalid, 1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_one_of_semver, "1.2.0", "1.2.0, invalid")
+ end
+
+ test "is_not_one_of (semver)" do
+ is_not_one_of_semver = 5
+
+ assert {:ok, true} = Comparator.compare(is_not_one_of_semver, "2.0.0", "1.2.0, 1.3.4")
+ assert {:ok, false} = Comparator.compare(is_not_one_of_semver, "1.2.0", "1.2.0, 1.3.4")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_not_one_of_semver, "invalid", "1.2.0, 1.3.4")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_not_one_of_semver, "1.2.0", "invalid, 1.3.4")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(is_not_one_of_semver, "1.2.0", "1.2.0, invalid")
+ end
+
+ test "< (SemVer)" do
+ less_than_semver = 6
+
+ assert {:ok, true} = Comparator.compare(less_than_semver, "1.2.0", "1.3.0")
+ assert {:ok, false} = Comparator.compare(less_than_semver, "1.3.0", "1.2.0")
+ assert {:ok, false} = Comparator.compare(less_than_semver, "1.2.0", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(less_than_semver, "invalid", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(less_than_semver, "1.3.0", "invalid")
+ end
+
+ test "<= (SemVer)" do
+ less_than_equal_semver = 7
+
+ assert {:ok, true} = Comparator.compare(less_than_equal_semver, "1.2.0", "1.3.0")
+ assert {:ok, false} = Comparator.compare(less_than_equal_semver, "1.3.0", "1.2.0")
+ assert {:ok, true} = Comparator.compare(less_than_equal_semver, "1.2.0", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(less_than_equal_semver, "invalid", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(less_than_equal_semver, "1.3.0", "invalid")
+ end
+
+ test "> (SemVer)" do
+ greater_than_semver = 8
+
+ assert {:ok, true} = Comparator.compare(greater_than_semver, "1.3.0", "1.2.0")
+ assert {:ok, false} = Comparator.compare(greater_than_semver, "1.2.0", "1.3.0")
+ assert {:ok, false} = Comparator.compare(greater_than_semver, "1.2.0", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(greater_than_semver, "invalid", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(greater_than_semver, "1.3.0", "invalid")
+ end
+
+ test ">= (SemVer)" do
+ greater_than_equal_semver = 9
+
+ assert {:ok, true} = Comparator.compare(greater_than_equal_semver, "1.3.0", "1.2.0")
+ assert {:ok, false} = Comparator.compare(greater_than_equal_semver, "1.2.0", "1.3.0")
+ assert {:ok, true} = Comparator.compare(greater_than_equal_semver, "1.2.0", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(greater_than_equal_semver, "invalid", "1.2.0")
+
+ assert {:error, %InvalidVersionError{}} =
+ Comparator.compare(greater_than_equal_semver, "1.3.0", "invalid")
+ end
+ end
+
+ describe "numeric comparators" do
+ test "= (Number)" do
+ equals_number = 10
+
+ assert {:ok, true} = Comparator.compare(equals_number, "3.5", "3.5000")
+ assert {:ok, true} = Comparator.compare(equals_number, "3,5", "3.5000")
+ assert {:ok, true} = Comparator.compare(equals_number, 3.5, 3.5000)
+ assert {:ok, false} = Comparator.compare(equals_number, "3,5", "4.752")
+ assert {:error, :invalid_float} = Comparator.compare(equals_number, "not a float", "3.5000")
+ assert {:error, :invalid_float} = Comparator.compare(equals_number, "3,5", "not a float")
+ end
+
+ test "<> (Number)" do
+ not_equals_number = 11
+
+ assert {:ok, false} = Comparator.compare(not_equals_number, "3.5", "3.5000")
+ assert {:ok, false} = Comparator.compare(not_equals_number, "3,5", "3.5000")
+ assert {:ok, false} = Comparator.compare(not_equals_number, 3.5, 3.5000)
+ assert {:ok, true} = Comparator.compare(not_equals_number, "3,5", "4.752")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(not_equals_number, "not a float", "3.5000")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(not_equals_number, "3,5", "not a float")
+ end
+
+ test "< (Number)" do
+ less_than_number = 12
+
+ assert {:ok, true} = Comparator.compare(less_than_number, "3.5", "3.6000")
+ assert {:ok, true} = Comparator.compare(less_than_number, "3,5", "3.6000")
+ assert {:ok, true} = Comparator.compare(less_than_number, 3.5, 3.6000)
+ assert {:ok, false} = Comparator.compare(less_than_number, "3,5", "1.752")
+ assert {:ok, false} = Comparator.compare(less_than_number, "3,5", "3.5")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(less_than_number, "not a float", "3.5000")
+
+ assert {:error, :invalid_float} = Comparator.compare(less_than_number, "3,5", "not a float")
+ end
+
+ test "<= (Number)" do
+ less_than_equal_number = 13
+
+ assert {:ok, true} = Comparator.compare(less_than_equal_number, "3.5", "3.6000")
+ assert {:ok, true} = Comparator.compare(less_than_equal_number, "3,5", "3.6000")
+ assert {:ok, true} = Comparator.compare(less_than_equal_number, 3.5, 3.6000)
+ assert {:ok, true} = Comparator.compare(less_than_equal_number, "3,5", "3.5")
+ assert {:ok, false} = Comparator.compare(less_than_equal_number, "3,5", "1.752")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(less_than_equal_number, "not a float", "3.5000")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(less_than_equal_number, "3,5", "not a float")
+ end
+
+ test "> (Number)" do
+ greater_than_number = 14
+
+ assert {:ok, false} = Comparator.compare(greater_than_number, "3.5", "3.6000")
+ assert {:ok, false} = Comparator.compare(greater_than_number, "3,5", "3.6000")
+ assert {:ok, false} = Comparator.compare(greater_than_number, 3.5, 3.6000)
+ assert {:ok, false} = Comparator.compare(greater_than_number, "3,5", "3.5")
+ assert {:ok, true} = Comparator.compare(greater_than_number, "3,5", "1.752")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(greater_than_number, "not a float", "3.5000")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(greater_than_number, "3,5", "not a float")
+ end
+
+ test ">= (Number)" do
+ greater_than_equal_number = 15
+
+ assert {:ok, false} = Comparator.compare(greater_than_equal_number, "3.5", "3.6000")
+ assert {:ok, false} = Comparator.compare(greater_than_equal_number, "3,5", "3.6000")
+ assert {:ok, false} = Comparator.compare(greater_than_equal_number, 3.5, 3.6000)
+ assert {:ok, true} = Comparator.compare(greater_than_equal_number, "3,5", "1.752")
+ assert {:ok, true} = Comparator.compare(greater_than_equal_number, "3,5", "3.5")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(greater_than_equal_number, "not a float", "3.5000")
+
+ assert {:error, :invalid_float} =
+ Comparator.compare(greater_than_equal_number, "3,5", "not a float")
+ end
+ end
+
+ describe "sensitive comparators" do
+ setup do
+ hashed = %{
+ a: "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
+ b: "e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98",
+ c: "84a516841ba77a5b4648de2cd0dfcb30ea46dbb4"
+ }
+
+ {:ok, hashed: hashed}
+ end
+
+ test "is_one_of (sensitive)", %{hashed: hashed} do
+ is_one_of_sensitive = 16
+ %{a: a, b: b, c: c} = hashed
+
+ assert {:ok, true} = Comparator.compare(is_one_of_sensitive, "a", "#{a}, #{b}, #{c}")
+ assert {:ok, false} = Comparator.compare(is_one_of_sensitive, "x", "#{a}, #{b}, #{c}")
+ end
+
+ test "is_not_one_of (sensitive)", %{hashed: hashed} do
+ is_not_one_of_sensitive = 17
+ %{a: a, b: b, c: c} = hashed
+
+ assert {:ok, true} = Comparator.compare(is_not_one_of_sensitive, "x", "#{a}, #{b}, #{c}")
+ assert {:ok, false} = Comparator.compare(is_not_one_of_sensitive, "a", "#{a}, #{b}, #{c}")
+ end
+ end
+end
diff --git a/test/rollout_test.exs b/test/rollout_test.exs
new file mode 100644
index 00000000..f8a61678
--- /dev/null
+++ b/test/rollout_test.exs
@@ -0,0 +1,120 @@
+defmodule ConfigCat.RolloutTest do
+ use ExUnit.Case, async: true
+
+ alias ConfigCat.{FetchPolicy, User}
+
+ @moduletag capture_log: true
+
+ test "basic rule evaluation" do
+ test_matrix("testmatrix.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A")
+ end
+
+ test "semantic version matching" do
+ test_matrix("testmatrix_semantic.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/BAr3KgLTP0ObzKnBTo5nhA")
+ end
+
+ test "semantic version comparisons" do
+ test_matrix("testmatrix_semantic_2.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/q6jMCFIp-EmuAfnmZhPY7w")
+ end
+
+ test "numeric comparisons" do
+ test_matrix("testmatrix_number.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/uGyK3q9_ckmdxRyI7vjwCw")
+ end
+
+ test "sensitive information comparisons" do
+ test_matrix("testmatrix_sensitive.csv", "PKDVCLf-Hq-h-kCzMp-L7Q/qX3TP2dTj06ZpCCT1h_SPA")
+ end
+
+ test "invalid user object" do
+ user = %{email: "a@configcat.com"}
+ {:ok, client} = start_config_cat("PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A")
+ actual = ConfigCat.get_value("stringContainsDogDefaultCat", "Lion", user, client: client)
+
+ assert actual == "Cat"
+ end
+
+ defp test_matrix(filename, sdk_key) do
+ [header | test_lines] = read_test_matrix(filename)
+ {custom_key, settings_keys} = parse_header(header)
+
+ {:ok, client} = start_config_cat(sdk_key)
+
+ errors = Enum.flat_map(test_lines, &run_tests(&1, client, custom_key, settings_keys))
+
+ assert errors == []
+ end
+
+ defp read_test_matrix(filename) do
+ __ENV__.file
+ |> Path.dirname()
+ |> Path.join("fixtures/#{filename}")
+ |> File.read!()
+ |> String.split("\n", trim: true)
+ end
+
+ defp parse_header(header) do
+ [custom_key | settings_keys] =
+ header
+ |> String.split(";")
+ |> Enum.drop(3)
+
+ {custom_key, settings_keys}
+ end
+
+ defp run_tests(test_line, client, custom_key, settings_keys) do
+ user = build_user(test_line, custom_key)
+
+ expected_values =
+ test_line
+ |> String.split(";")
+ |> Enum.drop(4)
+
+ Enum.zip(settings_keys, expected_values)
+ |> Enum.map(fn {setting_key, expected} -> run_test(setting_key, expected, user, client) end)
+ |> Enum.reject(&is_nil/1)
+ end
+
+ defp build_user(test_line, custom_key) do
+ [id, email, country, custom_value] =
+ test_line
+ |> String.split(";")
+ |> Enum.take(4)
+ |> Enum.map(&normalize/1)
+
+ if id do
+ User.new(id, email: email, country: country, custom: build_custom(custom_key, custom_value))
+ else
+ nil
+ end
+ end
+
+ defp run_test(setting_key, expected, user, client) do
+ actual = ConfigCat.get_value(setting_key, nil, user, client: client)
+
+ if to_string(actual) !== to_string(expected) do
+ %{
+ identifier: user && user.identifier,
+ setting_key: setting_key,
+ expected: to_string(expected),
+ actual: to_string(actual)
+ }
+ end
+ end
+
+ defp build_custom(_custom_key, nil), do: nil
+ defp build_custom(custom_key, custom_value), do: %{custom_key => custom_value}
+
+ defp normalize(nil), do: nil
+ defp normalize(""), do: nil
+ defp normalize("##null##"), do: nil
+ defp normalize(value), do: value
+
+ defp start_config_cat(sdk_key) do
+ name = UUID.uuid4() |> String.to_atom()
+
+ ConfigCat.start_link(sdk_key,
+ fetch_policy: FetchPolicy.lazy(cache_expiry_seconds: 300),
+ name: name
+ )
+ end
+end
diff --git a/test/test_helper.exs b/test/test_helper.exs
new file mode 100644
index 00000000..404a0d20
--- /dev/null
+++ b/test/test_helper.exs
@@ -0,0 +1,2 @@
+Logger.configure(level: :warn)
+ExUnit.start()
diff --git a/test/user_test.exs b/test/user_test.exs
new file mode 100644
index 00000000..7a2696b2
--- /dev/null
+++ b/test/user_test.exs
@@ -0,0 +1,91 @@
+defmodule ConfigCat.UserTest do
+ use ExUnit.Case, async: true
+
+ alias ConfigCat.User
+
+ describe "creating a user" do
+ test "creates a user with only an identifer" do
+ identifier = "IDENTIFIER"
+ user = User.new(identifier)
+
+ assert %User{identifier: ^identifier, email: nil, country: nil, custom: nil} = user
+ end
+
+ test "creates a user with additional properties" do
+ identifier = "IDENTIFIER"
+ email = "me@example.com"
+ country = "COUNTRY"
+ user = User.new(identifier, email: email, country: country)
+
+ assert %User{identifier: ^identifier, email: ^email, country: ^country, custom: nil} = user
+ end
+
+ test "creates a user with custom properties" do
+ identifier = "IDENTIFIER"
+ custom_property = 42
+ user = User.new(identifier, custom: %{custom_property: custom_property})
+
+ assert %User{
+ identifier: ^identifier,
+ email: nil,
+ country: nil,
+ custom: %{custom_property: ^custom_property}
+ } = user
+ end
+ end
+
+ describe "looking up attributes" do
+ setup do
+ user =
+ User.new("IDENTIFIER",
+ email: "EMAIL",
+ country: "COUNTRY",
+ custom: %{
+ :atom_property => "ATOM_VALUE",
+ "string_property" => "STRING_VALUE",
+ "UpperStringProperty" => "UPPER_STRING_VALUE"
+ }
+ )
+
+ {:ok, user: user}
+ end
+
+ test "looks up identifier", %{user: user} do
+ value = User.get_attribute(user, "Identifier")
+ assert value == user.identifier
+ end
+
+ test "looks up email", %{user: user} do
+ value = User.get_attribute(user, "Email")
+ assert value == user.email
+ end
+
+ test "looks up country", %{user: user} do
+ value = User.get_attribute(user, "Country")
+ assert value == user.country
+ end
+
+ test "looks up a custom property with an atom key", %{user: user} do
+ value = User.get_attribute(user, "ATOM_PROPERTY")
+ assert value == user.custom[:atom_property]
+ end
+
+ test "looks up a custom property with a string key", %{user: user} do
+ value = User.get_attribute(user, "STRING_PROPERTY")
+ assert value == user.custom["string_property"]
+ end
+
+ test "looks up a custom property with a string key with uppercase letters", %{user: user} do
+ value = User.get_attribute(user, "upperstringproperty")
+ assert value == user.custom["UpperStringProperty"]
+ end
+
+ test "returns nil for null attributes" do
+ user = User.new("IDENTIFIER")
+
+ assert User.get_attribute(user, "Email") == nil
+ assert User.get_attribute(user, "Country") == nil
+ assert User.get_attribute(user, "AnyCustom") == nil
+ end
+ end
+end