colorized output for test harness output
new redis db layout for holding and allocation data

  Redis DB layout for fund holdings and allocations data is defined as
follows:

  key => "MFNames"
  val => sorted set of mutual fund names.

  key => "AssetNames"
  val => sorted set of asset names.

  key => "SectorNames"
  val => sorted set of sector names.

  key => "CountryNames"
  val => sorted set of country names.

  key => "HoldingNames"
  val => sorted set of holding company names.

  key => "MFID:#{fundid}:HoldingID:#{holdingid}"
  val => hashtable of holding dates and holding values.

  key => "MFID:#{fundid}:AssetID:#{assetid}"
  val => hashtable of asset allocation dates and values.

  key => "MFID:#{fundid}:SectorID:#{sectorid}"
  val => hashtable of sector allocation dates and values.

  key => "MFID:#{fundid}:CountryID:#{countryid}"
  val => hashtable of country allocation dates and values.
cosmetic changes
new redis db layout for fund basic data

  Redis DB layout for fund data is defined as follows:

  key => "MFTickers"
  val => sorted set of fund tickers.

  key => "MFNames"
  val => sorted set of fund names.
  e.g.=> "fund.names" => ['AC ONE China Fund, ...]

  key => "MFID:#{fundid}:Tickers".
  val => sorted set of fund tickers for the given fund.

  key => "MFSponsors"
  val => sorted set of fund sponsors.

  key => "MFSponsor:#{sponsorid}:Tickers".
  val => sorted set of fund tickers for the given fund sponsor.

  key => "MFSponsor:#{sponsorid}:FundNames".
  val => sorted set of fund names for the given sponsor.

  key => "MFPrimaryGroups".
  val => sorted set of fund primary groups.

  key => "MFPrimaryGroupID:#{groupid}:Tickers".
  val => sorted set of fund tickers that belong to the given primary
group.

  key => "MFSecondaryGroups".
  val => sorted set of fund secondary groups.

  key => "MFSecondaryGroupID:#{groupid}:Tickers".
  val => sorted set of fund tickers that belong to the given secondary
group.

  key => "MFBenchmarkIndices".
  val => sorted set of benchmark indices.

  key => "MFBenchmarkIndexID:#{indexid}:Tickers".
  val => sorted set of fund tickers that belong to the given benchmark
index.

  key => "MFTicker:#{fticker}:Fees"
  val => hashtable of fund fee related data elements.
          "ManagementFees",
          "b12-1Fee",
          "RedemptionFee",
          "RedemptionFeeDuration",
          "SalesCharge",
          "LoadType",
          "DeferredLoad",
          "DeferredLoadDuration"

  key => "MFTicker:#{fticker}:Ratios"
  val => hashtable of fund expense related data elements.
          "TotalExpenseRatio",
          "NetExpenseRatio",
          "Turnover",
          "TurnoverDate"

  key => "MFTicker:#{fticker}:Managers"
  val => hashtable of fund management related data elements.
          "TeamManagement",
          "ManagerName1",
          "ManagerName2",
          "ManagerName3",
          "ManagerTenure1",
          "ManagerTenure2",
          "ManagerTenure3"

  key => "MFTicker:#{fticker}:Profile"
  val => hashtable of fund profile related data elements.
          "Name",
          "ShareClass",
          "InceptionDate",
          "PrimaryGroup",
          "SecondaryGroup",
          "Objective",
          "Strategy",
          "Status",
          "TotalNetAssets",
          "TotalNetAssetsDate",
          "InitialInvestment",
          "IncrementalInvestment",
          "IRAInitialInvestment",
          "IRAIncrementalInvestment",
          "InitialAutomaticInvestmentPlan",
          "ExpenseWaiverType",
          "ExpenseWaiverExpiryDate",
          "ExpenseWaiverOptionCode",
          "DividendFrequency"

  key => "MFTicker:#{fticker}:Sponsor"
  val => hashtable of fund sponsor related data elements.
          "Sponsor",
          "SponsorPhone",
          "SponsorWebsite",
          "SponsorStreet",
          "SponsorStreet2",
          "SponsorCity",
          "SponsorState",
          "SponsorZip"

  key => "MFTicker:#{fticker}:Basics"
  val => hashtable of fund basic data elements.
          "Symbol",
          "Name",
          "CUSIP",
          "ProspectusDate",
          "BenchmarkIndex",
          "FiscalYearEndDate"

  key => "MFTicker:#{fticker}:Returns"
  val => hashtable of fund performance or returns related data elements.
          "Yr1TotalReturns",
          "Yr3TotalReturns",
          "Yr5TotalReturns",
          "Yr10TotalReturns",
          "LifeTotalReturns",
          "TotalReturnsDate",
          "BestQuarterReturns",
          "BestQuarterReturnsDate",
          "WorstQuarterReturns",
          "WorstQuarterReturnsDate",
          "Yr1AfterTaxReturns",
          "Yr3AfterTaxReturns",
          "Yr5AfterTaxReturns",
          "Yr10AfterTaxReturns",
          "LifeAfterTaxReturns",
          "Yr1AfterTaxAndSalesReturns",
          "Yr3AfterTaxAndSalesReturns",
          "Yr5AfterTaxAndSalesReturns",
          "Yr10AfterTaxAndSalesReturns",
          "LifeAfterTaxAndSalesReturns",
          "QuartileRanking",
          "PercentileRanking",
          "PeerGroupReturns",
          "PeerGroupCount",
          "Month12Yield",
          "YieldDate"

  key => "MFTicker:#{fticker}:TotalNetAssets"
  val => hashtable of dates and values for which total net assets are
available.

  key => "MFTicker:#{fticker}:TotalReturns"
  val => hashtable of dates and values for which total returns are
available.

  key => "MFTicker:#{fticker}:Turnover"
  val => hashtable of dates and values for which turnovers are
available.
new redis db layour for auto completion

key => "MFTickersAutoComplete"
val => sorted set of fund tickers with auto completion list (google
suggest).

key => "MFNamesAutoComplete"
val => sorted set of fund names with auto completion list (google
suggest).