diff --git a/History.txt b/History.txt new file mode 100644 index 0000000..f2e1e74 --- /dev/null +++ b/History.txt @@ -0,0 +1,4 @@ +== 1.0.0 / 2007-06-24 + +* Initial release. + diff --git a/Manifest.txt b/Manifest.txt new file mode 100644 index 0000000..bd2ee29 --- /dev/null +++ b/Manifest.txt @@ -0,0 +1,12 @@ +History.txt +Manifest.txt +README.txt +Rakefile +lib/class-extension.rb +lib/ofx-parser.rb +lib/ofx.rb +lib/sic.rb +test/fixtures/banking.ofx.sgml +test/fixtures/creditcard.ofx.sgml +test/fixtures/with_spaces.ofx.sgml +test/test_ofx_parser.rb \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..0f0212f --- /dev/null +++ b/README.txt @@ -0,0 +1,103 @@ +== ofx-parser +by Andrew A. Smith + +http://ofx-parser.rubyforge.org/ +http://rubyforge.org/projects/ofx-parser/ + +== DESCRIPTION: + +ofx-parser is a ruby library to parse a realistic subset of the lengthy OFX 1.x specification. + +== FEATURES/PROBLEMS: + +* Reads OFX responses - i.e. those downloaded from financial institutions and + puts it into a usable object graph. +* Supports the 3 main message sets: banking, credit card and investment + accounts, as well as the required 'sign on' set. +* Knows about SIC codes - if your institution provides them. + See http://www.eeoc.gov/stats/jobpat/siccodes.html +* Monetary amounts can be retrieved either as a raw string, or in pennies. +* Supports OFX timestamps. + +== SYNOPSIS: + +Supports bank accounts: + + require 'rubygems' + require 'ofx-parser' + + ofx = OfxParser::OfxParser.parse(open("bank-statement.ofx")) + + ofx.bank_account.number # => '103333333333' + ofx.bank_account.routing_number # => '033000033' + ofx.bank_account.balance # => '123.45' + ofx.bank_account.balance_in_pennies # => 12345 + + ofx.bank_account.statement.start_date # => DateTime + ofx.bank_account.statement.end_date # => DateTime + + ofx.bank_account.statement.transactions.size # => 4 + + ofx.bank_account.statement.transactions.first.payee # => "FOO, INC." + ofx.bank_account.statement.transactions.first.type # => :DEBIT + ofx.bank_account.statement.transactions.first.amount # => '-11.11' + ofx.bank_account.statement.transactions.first.amount_in_pennies # => -1111 + +Also supports credit cards... + + ofx = OfxParser::OfxParser.parse(open("creditcard-statement.ofx")) + + ofx.credit_card.remaining_credit # => '19000.0' + ofx.credit_card.remaining_credit_in_pennies # => '1900000' + + ofx.credit_card.statement.start_date # => DateTime + ofx.credit_card.statement.end_date # => DateTime + + ofx.credit_card.statement.transactions.size # => 10 + + ofx.credit_card.statement.transactions.first.type # => :DEBIT + ofx.credit_card.statement.transactions.first.amount # => '-19.17' + ofx.credit_card.statement.transactions.first.amount_in_pennies # => '-1917' + ofx.credit_card.statement.transactions.first.sic # => '7933' + ofx.credit_card.statement.transactions.first.sic_desc # => 'BOWLING CENTERS' + ofx.credit_card.statement.transactions.first.payee # => 'SUNSET BOWLING' + +Working on investment accounts... + +== REQUIREMENTS: + +* hpricot >= 0.6 + +== INSTALL: + +* gem install ofx-parser + +== LICENSE: + +Copyright (c) 2007, Andrew A. Smith +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright owner nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..edafb8e --- /dev/null +++ b/Rakefile @@ -0,0 +1,18 @@ +require 'rubygems' +require 'hoe' +$:.unshift(File.dirname(__FILE__) + "/lib") +require 'ofx-parser' + +Hoe.new('ofx-parser', OfxParser::VERSION) do |p| + p.author = 'Andrew A. Smith' + p.email = 'andy@tinnedfruit.org' + p.rubyforge_name = 'ofx-parser' + p.summary = 'ofx-parser is a ruby library for parsing OFX 1.x data.' + p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n") + p.url = 'http://ofx-parser.rubyforge.org/' + p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n") + p.remote_rdoc_dir = '' # Release to root + p.extra_deps << ["hpricot", ">= 0.6"] + p.need_zip = true + p.need_tar = false +end diff --git a/email.txt b/email.txt new file mode 100644 index 0000000..5e3bd2b --- /dev/null +++ b/email.txt @@ -0,0 +1,28 @@ +Subject: [ANN] ofx-parser 1.0.0 Released + +ofx-parser version 1.0.0 has been released! + +* + +## DESCRIPTION: + +ofx-parser is a ruby library to parse a realistic subset of the lengthy OFX 1.x specification. + +## FEATURES/PROBLEMS: + +* Reads OFX responses - i.e. those downloaded from financial institutions and + puts it into a usable object graph. +* Supports the 3 main message sets: banking, credit card and investment + accounts, as well as the required 'sign on' set. +* Knows about SIC codes - if your institution provides them. + See http://www.eeoc.gov/stats/jobpat/siccodes.html +* Monetary amounts can be retrieved either as a raw string, or in pennies. +* Supports OFX timestamps. + +Changes: + +## 1.0.0 / 2007-06-24 + +* Initial release. + +* diff --git a/lib/class-extension.rb b/lib/class-extension.rb new file mode 100644 index 0000000..10ef9ed --- /dev/null +++ b/lib/class-extension.rb @@ -0,0 +1,154 @@ +# = class_extension.rb +# +# == Copyright (c) 2006 Daniel Schierbeck +# +# Ruby License +# +# This module is free software. You may use, modify, and/or redistribute this +# software under the same terms as Ruby. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. +# +# == Special Thanks +# +# Thanks to Trans, Nobu and Ulysses for their original on this concept. +# +# == Authors and Contributors +# +# * Daniel Schierbeck +# * Thomas Sawyer +# * Nobu Nakada +# * Ulysses + +# Author:: Daniel Schierbeck +# Copyright:: Copyright (c) 2006 Daniel Schierbeck +# License:: Ruby License + +# + +class Module #:nodoc: all + + alias_method :append_features_without_class_extension, :append_features + + # = class_extension + # + # Normally when including modules, class/module methods are not + # extended. To achieve this behavior requires some clever + # Ruby Karate. Instead class_extension provides an easy to use + # and clean solution. Simply place the extending class methods + # in a block of the special module method #class_extension. + # + # module Mix + # def inst_meth + # puts 'inst_meth' + # end + # + # class_extension do + # def class_meth + # "Class Method!" + # end + # end + # end + # + # class X + # include Mix + # end + # + # X.class_meth #=> "Class Method!" + # + + def class_extension(&block) + @class_extension ||= Module.new do + def self.append_features(mod) + append_features_without_class_extension(mod) + end + end + @class_extension.module_eval(&block) if block_given? + @class_extension + end + + private :class_extension + + def append_features(mod) + append_features_without_class_extension(mod) + mod.extend(class_extension) + if mod.instance_of? Module + mod.__send__(:class_extension).__send__(:include, class_extension) + end + end + +end + +class Class #:nodoc: all + undef_method :class_extension +end + + + +# _____ _ +# |_ _|__ ___| |_ +# | |/ _ \/ __| __| +# | | __/\__ \ |_ +# |_|\___||___/\__| +# + +=begin test + + require 'test/unit' + + class TC_ClassMethods < Test::Unit::TestCase + + # fixture + + module N + class_extension do + def n ; 43 ; end + def s ; self ; end + end + extend class_extension + end + + class X + include N + def n ; 11 ; end + end + + module K + include N + class_extension do + def n ; super + 1 ; end + end + end + + class Z + include K + end + + # tests + + def test_01 + assert_equal( 43, N.n ) + assert_equal( N, N.s ) + end + def test_02 + assert_equal( 43, X.n ) + assert_equal( X, X.s ) + end + def test_03 + assert_equal( 11, X.new.n ) + end + def test_04 + assert_equal( 43, K.n ) #notic the difference! + assert_equal( K, K.s ) + end + def test_05 + assert_equal( 44, Z.n ) + assert_equal( Z, Z.s ) + end + + end + +=end + diff --git a/lib/ofx-parser.rb b/lib/ofx-parser.rb new file mode 100644 index 0000000..f5787f7 --- /dev/null +++ b/lib/ofx-parser.rb @@ -0,0 +1,175 @@ +require 'hpricot' +require 'time' +require 'date' + +%w(class-extension ofx sic).each do |fn| + require File.dirname(__FILE__) + "/#{fn}" +end + +module OfxParser + VERSION = '1.0.0' + + class OfxParser + + # Creates and returns an Ofx instance when given a well-formed OFX document, + # complete with the mandatory key:pair header. + def self.parse(ofx) + ofx = ofx.respond_to?(:read) ? ofx.read.to_s : ofx.to_s + + return Ofx.new if ofx == "" + + header, body = pre_process(ofx) + + ofx_out = parse_body(body) + ofx_out.header = header + ofx_out + end + + # Designed to make the main OFX body parsable. This means adding closing tags + # to the SGML to make it parsable by hpricot. + # + # Returns an array of 2 elements: + # * header as a hash, + # * body as an evily pre-processed string ready for parsing by hpricot. + def self.pre_process(ofx) + header, body = ofx.split(/\n\n/) + + header = Hash[*header.split(/:|\n/)] + + body.gsub!(/>\s+<') + body.gsub!(/\s+\s+/m, '>') + body.gsub!(/<(\w+?)>([^<]+)/m, '<\1>\2') + + [header, body] + end + + # Takes an OFX datetime string of the format: + # * YYYYMMDDHHMMSS.XXX[gmt offset:tz name] + # * YYYYMMDD + # * YYYYMMDDHHMMSS + # * YYYYMMDDHHMMSS.XXX + # + # Returns a DateTime object. Milliseconds (XXX) are ignored. + def self.parse_datetime(date) + if /\A\s* + (\d{4})(\d{2})(\d{2}) ?# YYYYMMDD 1,2,3 + (?:(\d{2})(\d{2})(\d{2}))? ?# HHMMSS - optional 4,5,6 + (?:\.(\d{3}))? ?# .XXX - optional 7 + (?:\[(-?\d+)\:\w{3}\])? ?# [-n:TZ] - optional 8,9 + \s*\z/ix =~ date + year = $1.to_i + mon = $2.to_i + day = $3.to_i + hour = $4.to_i + min = $5.to_i + sec = $6.to_i + # DateTime does not support usecs. + # usec = 0 + # usec = $7.to_f * 1000000 if $7 + off = Rational($8.to_i, 24) # offset as a fraction of day. :| + DateTime.civil(year, mon, day, hour, min, sec, off) + end + end + + private + def self.parse_body(body) + doc = Hpricot.XML(body) + + ofx = Ofx.new + + ofx.sign_on = build_signon((doc/"SIGNONMSGSRSV1/SONRS")) + ofx.bank_account = build_bank((doc/"BANKMSGSRSV1/STMTTRNRS")) unless (doc/"BANKMSGSRSV1").empty? + ofx.credit_card = build_credit((doc/"CREDITCARDMSGSRSV1/CCSTMTTRNRS")) unless (doc/"CREDITCARDMSGSRSV1").empty? + #build_investment((doc/"SIGNONMSGSRQV1")) + + ofx + end + + def self.build_signon(doc) + sign_on = SignOn.new + sign_on.status = build_status((doc/"STATUS")) + sign_on.date = parse_datetime((doc/"DTSERVER").inner_text) + sign_on.language = (doc/"LANGUAGE").inner_text + + sign_on.institute = Institute.new + sign_on.institute.name = ((doc/"FI")/"ORG").inner_text + sign_on.institute.id = ((doc/"FI")/"FID").inner_text + sign_on + end + + def self.build_bank(doc) + acct = BankAccount.new + + acct.transaction_uid = (doc/"TRNUID").inner_text.strip + acct.number = (doc/"STMTRS/BANKACCTFROM/ACCTID").inner_text + acct.routing_number = (doc/"STMTRS/BANKACCTFROM/BANKID").inner_text + acct.type = (doc/"STMTRS/BANKACCTFROM/ACCTTYPE").inner_text.strip + acct.balance = (doc/"STMTRS/LEDGERBAL/BALAMT").inner_text + acct.balance_date = parse_datetime((doc/"STMTRS/LEDGERBAL/DTASOF").inner_text) + + statement = Statement.new + statement.currency = (doc/"STMTRS/CURDEF").inner_text + statement.start_date = parse_datetime((doc/"STMTRS/BANKTRANLIST/DTSTART").inner_text) + statement.end_date = parse_datetime((doc/"STMTRS/BANKTRANLIST/DTEND").inner_text) + acct.statement = statement + + statement.transactions = (doc/"STMTRS/BANKTRANLIST/STMTTRN").collect do |t| + build_transaction(t) + end + + acct + end + + def self.build_credit(doc) + acct = CreditAccount.new + + acct.number = (doc/"CCSTMTRS/CCACCTFROM/ACCTID").inner_text + acct.transaction_uid = (doc/"TRNUID").inner_text.strip + acct.balance = (doc/"CCSTMTRS/LEDGERBAL/BALAMT").inner_text + acct.balance_date = parse_datetime((doc/"CCSTMTRS/LEDGERBAL/DTASOF").inner_text) + acct.remaining_credit = (doc/"CCSTMTRS/AVAILBAL/BALAMT").inner_text + acct.remaining_credit_date = parse_datetime((doc/"CCSTMTRS/AVAILBAL/DTASOF").inner_text) + + statement = Statement.new + statement.currency = (doc/"CCSTMTRS/CURDEF").inner_text + statement.start_date = parse_datetime((doc/"CCSTMTRS/BANKTRANLIST/DTSTART").inner_text) + statement.end_date = parse_datetime((doc/"CCSTMTRS/BANKTRANLIST/DTEND").inner_text) + acct.statement = statement + + statement.transactions = (doc/"CCSTMTRS/BANKTRANLIST/STMTTRN").collect do |t| + build_transaction(t) + end + + acct + end + + # for credit and bank transactions. + def self.build_transaction(t) + transaction = Transaction.new + transaction.type = (t/"TRNTYPE").inner_text + transaction.date = parse_datetime((t/"DTPOSTED").inner_text) + transaction.amount = (t/"TRNAMT").inner_text + transaction.fit_id = (t/"FITID").inner_text + transaction.payee = (t/"PAYEE").inner_text + (t/"NAME").inner_text + transaction.memo = (t/"MEMO").inner_text + transaction.sic = (t/"SIC").inner_text + transaction.check_number = (t/"CHECKNUM").inner_text if transaction.type == :CHECK + transaction + end + + + def self.build_investment(doc) + + end + + def self.build_status(doc) + status = Status.new + status.code = (doc/"CODE").inner_text + status.severity = (doc/"SEVERITY").inner_text + status.message = (doc/"MESSAGE").inner_text + status + end + + end +end diff --git a/lib/ofx.rb b/lib/ofx.rb new file mode 100644 index 0000000..94afc01 --- /dev/null +++ b/lib/ofx.rb @@ -0,0 +1,178 @@ +module OfxParser + module MonetarySupport + + @@monies ||= [] + + class_extension do + def monetary_vars(*methods) #:nodoc: + @@monies += methods + end + end + + # Returns pennies for a given string amount, i.e: + # '-123.45' => 12345 + # '123' => 12300 + def pennies_for(amount) + return nil if amount == "" + int, fraction = amount.scan(/\d+/) + i = (fraction.to_s.strip =~ /[1-9]/) ? "#{int}#{fraction[0,2]}".to_i : int.to_i * 100 + amount =~ /^\s*-\s*\d+/ ? -i : i + end + + def original_method(meth) #:nodoc: + meth.to_s.sub('_in_pennies','').to_sym rescue nil + end + + def monetary_method_call?(meth) #:nodoc: + orig = original_method(meth) + @@monies.include?(orig) && meth.to_s == "#{orig}_in_pennies" + end + + def method_missing(meth, *args) #:nodoc: + if (monetary_method_call?(meth)) + pennies_for(send(original_method(meth))) + else + super + end + end + + def respond_to?(meth) #:nodoc: + monetary_method_call?(meth) ? true : super + end + + end + + # This class is returned when a parse is successful. + # == General Notes + # * currency symbols are an iso4217 3-letter code + # * language is defined by iso639 3-letter code + class Ofx + attr_accessor :header, :sign_on, :bank_account, :credit_card, :investment + + def accounts + accounts = [] + [:bank_account, :credit_card, :investment].each do |method| + val = send(method) + accounts << val if val + end + accounts + end + end + + class SignOn + attr_accessor :status, :date, :language, :institute + end + + class Account + attr_accessor :number, :statement, :transaction_uid + end + + class BankAccount < Account + TYPE = [:CHECKING, :SAVINGS, :MONEYMRKT, :CREDITLINE] + attr_accessor :routing_number, :type, :balance, :balance_date + + include MonetarySupport + monetary_vars :balance + + undef type + def type + @type.to_s.upcase.to_sym + end + end + + class CreditAccount < Account + attr_accessor :remaining_credit, :remaining_credit_date, :balance, :balance_date + + include MonetarySupport + monetary_vars :remaining_credit, :balance + end + + class InvestmentAccount < Account + attr_accessor :broker_id, :positions, :margin_balance, :short_balance, :cash_balance + + include MonetarySupport + monetary_vars :margin_balance, :short_balance, :cash_balance + end + + + class Statement + attr_accessor :currency, :transactions, :start_date, :end_date + end + + class Transaction + attr_accessor :type, :date, :amount, :fit_id, :check_number, :sic, :memo, :payee + + include MonetarySupport + monetary_vars :amount + + TYPE = { + :CREDIT => "Generic credit", + :DEBIT => "Generic debit", + :INT => "Interest earned or paid ", + :DIV => "Dividend", + :FEE => "FI fee", + :SRVCHG => "Service charge", + :DEP => "Deposit", + :ATM => "ATM debit or credit", + :POS => "Point of sale debit or credit ", + :XFER => "Transfer", + :CHECK => "Check", + :PAYMENT => "Electronic payment", + :CASH => "Cash withdrawal", + :DIRECTDEP => "Direct deposit", + :DIRECTDEBIT => "Merchant initiated debit", + :REPEATPMT => "Repeating payment/standing order", + :OTHER => "Other" + } + + def type_desc + TYPE[type] + end + + undef type + def type + @type.to_s.strip.upcase.to_sym + end + + undef sic + def sic + @sic == "" ? nil : @sic + end + + def sic_desc + Sic::CODES[sic] + end + end + + class Position + end + + # Status of a sign on + class Status + attr_accessor :code, :severity, :message + + CODES = { + '0' => 'Success', + '2000' => 'General error', + '15000' => 'Must change USERPASS', + '15500' => 'Signon invalid', + '15501' => 'Customer account already in use', + '15502' => 'USERPASS Lockout' + } + + def code_desc + CODES[code] + end + + undef code + def code + @code.to_s.strip + end + + end + + class Institute + attr_accessor :name, :id + end + +end diff --git a/lib/sic.rb b/lib/sic.rb new file mode 100644 index 0000000..5e320f4 --- /dev/null +++ b/lib/sic.rb @@ -0,0 +1,1457 @@ +module OfxParser + + # The U.S. Equal Employment Opportunity Commission + # Standard Industrial Classification Code Descriptions + # + # From http://www.eeoc.gov/stats/jobpat/siccodes.html + module Sic + + CODES = { + '3291' => "ABRASIVE PRODUCTS", + '6321' => "ACCIDENT AND HEALTH INSURANCE", + '8720' => "ACCOUNTING, AUDITING, & BOOKKEEPING", + '8721' => "ACCOUNTING, AUDITING, & BOOKKEEPING", + '2891' => "ADHESIVES AND SEALANTS", + '7322' => "ADJUSTMENT & COLLECTION SERVICES", + '7310' => "ADVERTISING", + '7311' => "ADVERTISING AGENCIES", + '7319' => "ADVERTISING, NEC", + '2870' => "AGRICULTURAL CHEMICALS", + '2879' => "AGRICULTURAL CHEMICALS, NEC", + '0200' => "AGRICULTURAL PRODUCTION^LIVESTOCK", + '0700' => "AGRICULTURAL SERVICES", + '3563' => "AIR AND GAS COMPRESSORS", + '4513' => "AIR COURIER SERVICES", + '4520' => "AIR TRANSPORTATION, NONSCHEDULED", + '4522' => "AIR TRANSPORTATION, NONSCHEDULED", + '4510' => "AIR TRANSPORTATION, SCHEDULED", + '4512' => "AIR TRANSPORTATION, SCHEDULED", + '3721' => "AIRCRAFT", + '3720' => "AIRCRAFT AND PARTS", + '3724' => "AIRCRAFT ENGINES AND ENGINE PARTS", + '3728' => "AIRCRAFT PARTS AND EQUIPMENT, NEC", + '4580' => "AIRPORTS, FLYING FIELDS, & SERVICES", + '4581' => "AIRPORTS, FLYING FIELDS, & SERVICES", + '2812' => "ALKALIES AND CHLORINE", + '3363' => "ALUMINUM DIE-CASTINGS", + '3354' => "ALUMINUM EXTRUDED PRODUCTS", + '3365' => "ALUMINUM FOUNDRIES", + '3355' => "ALUMINUM ROLLING AND DRAWING, NEC", + '3353' => "ALUMINUM SHEET, PLATE, AND FOIL", + '3483' => "AMMUNITION, EXC. FOR SMALL ARMS, NEC", + '7900' => "AMUSEMENT & RECREATION SERVICES", + '7999' => "AMUSEMENT AND RECREATION, NEC", + '7996' => "AMUSEMENT PARKS", + '3826' => "ANALYTICAL INSTRUMENTS", + '2077' => "ANIMAL AND MARINE FATS AND OILS", + '0273' => "ANIMAL AQUACULTURE", + '0750' => "ANIMAL SERVICES, EXCEPT VETERINARY", + '0270' => "ANIMAL SPECIALTIES", + '0279' => "ANIMAL SPECIALTIES, NEC", + '0752' => "ANIMAL SPECIALTY SERVICES", + '1230' => "ANTHRACITE MINING", + '1231' => "ANTHRACITE MINING", + '6513' => "APARTMENT BUILDING OPERATORS", + '2389' => "APPAREL AND ACCESSORIES, NEC", + '5600' => "APPAREL AND ACCESSORY STORES", + '2300' => "APPAREL AND OTHER TEXTILE PRODUCTS", + '2387' => "APPAREL BELTS", + '5130' => "APPAREL, PIECE GOODS, AND NOTIONS", + '3446' => "ARCHITECTURAL METAL WORK", + '8712' => "ARCHITECTURAL SERVICES", + '7694' => "ARMATURE REWINDING SHOPS", + '3292' => "ASBESTOS PRODUCTS", + '2952' => "ASPHALT FELTS AND COATINGS", + '2950' => "ASPHALT PAVING AND ROOFING MATERIALS", + '2951' => "ASPHALT PAVING MIXTURES AND BLOCKS", + '5530' => "AUTO AND HOME SUPPLY STORES", + '5531' => "AUTO AND HOME SUPPLY STORES", + '7533' => "AUTO EXHAUST SYSTEM REPAIR SHOPS", + '7500' => "AUTO REPAIR, SERVICES, AND PARKING", + '3581' => "AUTOMATIC VENDING MACHINES", + '7520' => "AUTOMOBILE PARKING", + '7521' => "AUTOMOBILE PARKING", + '5012' => "AUTOMOBILES AND OTHER MOTOR VEHICLES", + '2396' => "AUTOMOTIVE AND APPAREL TRIMMINGS", + '5500' => "AUTOMOTIVE DEALERS & SERVICE STATIONS", + '5590' => "AUTOMOTIVE DEALERS, NEC", + '5599' => "AUTOMOTIVE DEALERS, NEC", + '7536' => "AUTOMOTIVE GLASS REPLACEMENT SHOPS", + '7510' => "AUTOMOTIVE RENTALS, NO DRIVERS", + '7530' => "AUTOMOTIVE REPAIR SHOPS", + '7539' => "AUTOMOTIVE REPAIR SHOPS, NEC", + '7540' => "AUTOMOTIVE SERVICES, EXCEPT REPAIR", + '7549' => "AUTOMOTIVE SERVICES, NEC", + '3465' => "AUTOMOTIVE STAMPINGS", + '7537' => "AUTOMOTIVE TRANSMISSION REPAIR SHOPS", + '2673' => "BAGS: PLASTICS, LAMINATED, & COATED", + '2674' => "BAGS: UNCOATED PAPER & MULTIWALL", + '2050' => "BAKERY PRODUCTS", + '3562' => "BALL AND ROLLER BEARINGS", + '6712' => "BANK HOLDING COMPANIES", + '7240' => "BARBER SHOPS", + '7241' => "BARBER SHOPS", + '7230' => "BEAUTY SHOPS", + '7231' => "BEAUTY SHOPS", + '0211' => "BEEF CATTLE FEEDLOTS", + '0212' => "BEEF CATTLE, EXCEPT FEEDLOTS", + '5181' => "BEER AND ALE", + '5180' => "BEER, WINE, AND DISTILLED BEVERAGES", + '2063' => "BEET SUGAR", + '0171' => "BERRY CROPS", + '2080' => "BEVERAGES", + '2836' => "BIOLOGICAL PRODUCTS EXC. DIAGNOSTIC", + '1220' => "BITUMINOUS COAL AND LIGNITE MINING", + '1221' => "BITUMINOUS COAL AND LIGNITE^SURFACE", + '1222' => "BITUMINOUS COAL^UNDERGROUND", + '2780' => "BLANKBOOKS AND BOOKBINDING", + '2782' => "BLANKBOOKS AND LOOSELEAF BINDERS", + '3310' => "BLAST FURNACE AND BASIC STEEL PRODUCTS", + '3312' => "BLAST FURNACES AND STEEL MILLS", + '3564' => "BLOWERS AND FANS", + '3732' => "BOAT BUILDING AND REPAIRING", + '5550' => "BOAT DEALERS", + '5551' => "BOAT DEALERS", + '3452' => "BOLTS, NUTS, RIVETS, AND WASHERS", + '2732' => "BOOK PRINTING", + '2731' => "BOOK PUBLISHING", + '5942' => "BOOK STORES", + '2789' => "BOOKBINDING AND RELATED WORK", + '2730' => "BOOKS", + '5192' => "BOOKS, PERIODICALS, & NEWSPAPERS", + '8420' => "BOTANICAL AND ZOOLOGICAL GARDENS", + '8422' => "BOTANICAL AND ZOOLOGICAL GARDENS", + '2086' => "BOTTLED AND CANNED SOFT DRINKS", + '7930' => "BOWLING CENTERS", + '7933' => "BOWLING CENTERS", + '2342' => "BRAS, GIRDLES, AND ALLIED GARMENTS", + '2051' => "BREAD, CAKE, AND RELATED PRODUCTS", + '3251' => "BRICK AND STRUCTURAL CLAY TILE", + '5032' => "BRICK, STONE, & RELATED MATERIALS", + '1622' => "BRIDGE, TUNNEL, & ELEVATED HIGHWAY", + '2210' => "BROADWOVEN FABRIC MILLS, COTTON", + '2211' => "BROADWOVEN FABRIC MILLS, COTTON", + '2220' => "BROADWOVEN FABRIC MILLS, MANMADE", + '2221' => "BROADWOVEN FABRIC MILLS, MANMADE", + '2230' => "BROADWOVEN FABRIC MILLS, WOOL", + '2231' => "BROADWOVEN FABRIC MILLS, WOOL", + '0251' => "BROILER, FRYER, AND ROASTER CHICKENS", + '3991' => "BROOMS AND BRUSHES", + '7349' => "BUILDING MAINTENANCE SERVICES, NEC", + '5200' => "BUILDING MATERIALS & GARDEN SUPPLIES", + '3995' => "BURIAL CASKETS", + '4140' => "BUS CHARTER SERVICE", + '4142' => "BUS CHARTER SERVICE, EXCEPT LOCAL", + '4170' => "BUS TERMINAL AND SERVICE FACILITIES", + '4173' => "BUS TERMINAL AND SERVICE FACILITIES", + '8244' => "BUSINESS AND SECRETARIAL SCHOOLS", + '8610' => "BUSINESS ASSOCIATIONS", + '8611' => "BUSINESS ASSOCIATIONS", + '8748' => "BUSINESS CONSULTING, NEC", + '6150' => "BUSINESS CREDIT INSTITUTIONS", + '7300' => "BUSINESS SERVICES", + '7389' => "BUSINESS SERVICES, NEC", + '4840' => "CABLE AND OTHER PAY TV SERVICES", + '4841' => "CABLE AND OTHER PAY TV SERVICES", + '3578' => "CALCULATING AND ACCOUNTING EQUIPMENT", + '5946' => "CAMERA & PHOTOGRAPHIC SUPPLY STORES", + '7030' => "CAMPS AND RECREATIONAL VEHICLE PARKS", + '2064' => "CANDY & OTHER CONFECTIONERY PRODUCTS", + '5440' => "CANDY, NUT, AND CONFECTIONERY STORES", + '5441' => "CANDY, NUT, AND CONFECTIONERY STORES", + '2062' => "CANE SUGAR REFINING", + '2091' => "CANNED AND CURED FISH AND SEAFOODS", + '2033' => "CANNED FRUITS AND VEGETABLES", + '2032' => "CANNED SPECIALTIES", + '2394' => "CANVAS AND RELATED PRODUCTS", + '3624' => "CARBON AND GRAPHITE PRODUCTS", + '2895' => "CARBON BLACK", + '3955' => "CARBON PAPER AND INKED RIBBONS", + '3592' => "CARBURETORS, PISTONS, RINGS, VALVES", + '1750' => "CARPENTRY AND FLOOR WORK", + '1751' => "CARPENTRY WORK", + '7217' => "CARPET AND UPHOLSTERY CLEANING", + '2270' => "CARPETS AND RUGS", + '2273' => "CARPETS AND RUGS", + '7542' => "CARWASHES", + '0119' => "CASH GRAINS, NEC", + '5961' => "CATALOG AND MAIL-ORDER HOUSES", + '2823' => "CELLULOSIC MANMADE FIBERS", + '3240' => "CEMENT, HYDRAULIC", + '3241' => "CEMENT, HYDRAULIC", + '6553' => "CEMETERY SUBDIVIDERS AND DEVELOPERS", + '6010' => "CENTRAL RESERVE DEPOSITORY", + '6019' => "CENTRAL RESERVE DEPOSITORY, NEC", + '3253' => "CERAMIC WALL AND FLOOR TILE", + '2043' => "CEREAL BREAKFAST FOODS", + '2022' => "CHEESE, NATURAL AND PROCESSED", + '1470' => "CHEMICAL AND FERTILIZER MINERALS", + '1479' => "CHEMICAL AND FERTILIZER MINING, NEC", + '2899' => "CHEMICAL PREPARATIONS, NEC", + '5169' => "CHEMICALS & ALLIED PRODUCTS, NEC", + '2800' => "CHEMICALS AND ALLIED PRODUCTS", + '5160' => "CHEMICALS AND ALLIED PRODUCTS", + '2130' => "CHEWING AND SMOKING TOBACCO", + '2131' => "CHEWING AND SMOKING TOBACCO", + '2067' => "CHEWING GUM", + '0252' => "CHICKEN EGGS", + '8350' => "CHILD DAY CARE SERVICES", + '8351' => "CHILD DAY CARE SERVICES", + '5640' => "CHILDREN'S AND INFANTS' WEAR STORES", + '5641' => "CHILDREN'S AND INFANTS' WEAR STORES", + '2066' => "CHOCOLATE AND COCOA PRODUCTS", + '2110' => "CIGARETTES", + '2111' => "CIGARETTES", + '2120' => "CIGARS", + '2121' => "CIGARS", + '0174' => "CITRUS FRUITS", + '8640' => "CIVIC AND SOCIAL ASSOCIATIONS", + '8641' => "CIVIC AND SOCIAL ASSOCIATIONS", + '1459' => "CLAY AND RELATED MINERALS, NEC", + '3255' => "CLAY REFRACTORIES", + '1450' => "CLAY, CERAMIC, & REFRACTORY MINERALS", + '5052' => "COAL AND OTHER MINERALS AND ORES", + '1200' => "COAL MINING", + '1240' => "COAL MINING SERVICES", + '1241' => "COAL MINING SERVICES", + '2295' => "COATED FABRICS, NOT RUBBERIZED", + '7993' => "COIN-OPERATED AMUSEMENT DEVICES", + '7215' => "COIN-OPERATED LAUNDRIES AND CLEANING", + '3316' => "COLD FINISHING OF STEEL SHAPES", + '8220' => "COLLEGES AND UNIVERSITIES", + '8221' => "COLLEGES AND UNIVERSITIES", + '4939' => "COMBINATION UTILITIES, NEC", + '4930' => "COMBINATION UTILITY SERVICES", + '7336' => "COMMERCIAL ART AND GRAPHIC DESIGN", + '6020' => "COMMERCIAL BANKS", + '6029' => "COMMERCIAL BANKS, NEC", + '5046' => "COMMERCIAL EQUIPMENT, NEC", + '0910' => "COMMERCIAL FISHING", + '3582' => "COMMERCIAL LAUNDRY EQUIPMENT", + '3646' => "COMMERCIAL LIGHTING FIXTURES", + '8732' => "COMMERCIAL NONPHYSICAL RESEARCH", + '7335' => "COMMERCIAL PHOTOGRAPHY", + '8731' => "COMMERCIAL PHYSICAL RESEARCH", + '2750' => "COMMERCIAL PRINTING", + '2754' => "COMMERCIAL PRINTING, GRAVURE", + '2752' => "COMMERCIAL PRINTING, LITHOGRAPHIC", + '2759' => "COMMERCIAL PRINTING, NEC", + '7940' => "COMMERCIAL SPORTS", + '6220' => "COMMODITY CONTRACTS BROKERS, DEALERS", + '6221' => "COMMODITY CONTRACTS BROKERS, DEALERS", + '4800' => "COMMUNICATION", + '4890' => "COMMUNICATION SERVICES, NEC", + '4899' => "COMMUNICATION SERVICES, NEC", + '3660' => "COMMUNICATIONS EQUIPMENT", + '3669' => "COMMUNICATIONS EQUIPMENT, NEC", + '7370' => "COMPUTER AND DATA PROCESSING SERVICES", + '3570' => "COMPUTER AND OFFICE EQUIPMENT", + '5734' => "COMPUTER AND SOFTWARE STORES", + '7376' => "COMPUTER FACILITIES MANAGEMENT", + '7373' => "COMPUTER INTEGRATED SYSTEMS DESIGN", + '7378' => "COMPUTER MAINTENANCE & REPAIR", + '3577' => "COMPUTER PERIPHERAL EQUIPMENT, NEC", + '7371' => "COMPUTER PROGRAMMING SERVICES", + '7379' => "COMPUTER RELATED SERVICES, NEC", + '7377' => "COMPUTER RENTAL & LEASING", + '3572' => "COMPUTER STORAGE DEVICES", + '3575' => "COMPUTER TERMINALS", + '5045' => "COMPUTERS, PERIPHERALS & SOFTWARE", + '3271' => "CONCRETE BLOCK AND BRICK", + '3272' => "CONCRETE PRODUCTS, NEC", + '1770' => "CONCRETE WORK", + '1771' => "CONCRETE WORK", + '3270' => "CONCRETE, GYPSUM, AND PLASTER PRODUCTS", + '5145' => "CONFECTIONERY", + '5082' => "CONSTRUCTION AND MINING MACHINERY", + '3530' => "CONSTRUCTION AND RELATED MACHINERY", + '3531' => "CONSTRUCTION MACHINERY", + '5039' => "CONSTRUCTION MATERIALS, NEC", + '1442' => "CONSTRUCTION SAND AND GRAVEL", + '2679' => "CONVERTED PAPER PRODUCTS, NEC", + '3535' => "CONVEYORS AND CONVEYING EQUIPMENT", + '2052' => "COOKIES AND CRACKERS", + '3366' => "COPPER FOUNDRIES", + '1020' => "COPPER ORES", + '1021' => "COPPER ORES", + '3351' => "COPPER ROLLING AND DRAWING", + '2298' => "CORDAGE AND TWINE", + '0115' => "CORN", + '2653' => "CORRUGATED AND SOLID FIBER BOXES", + '3961' => "COSTUME JEWELRY", + '3960' => "COSTUME JEWELRY AND NOTIONS", + '0131' => "COTTON", + '0724' => "COTTON GINNING", + '2074' => "COTTONSEED OIL MILLS", + '4215' => "COURIER SERVICES, EXCEPT BY AIR", + '2021' => "CREAMERY BUTTER", + '7320' => "CREDIT REPORTING AND COLLECTION", + '7323' => "CREDIT REPORTING SERVICES", + '6060' => "CREDIT UNIONS", + '0722' => "CROP HARVESTING", + '0721' => "CROP PLANTING AND PROTECTING", + '0723' => "CROP PREPARATION SERVICES FOR MARKET", + '0720' => "CROP SERVICES", + '3466' => "CROWNS AND CLOSURES", + '1310' => "CRUDE PETROLEUM AND NATURAL GAS", + '1311' => "CRUDE PETROLEUM AND NATURAL GAS", + '4612' => "CRUDE PETROLEUM PIPELINES", + '1423' => "CRUSHED AND BROKEN GRANITE", + '1422' => "CRUSHED AND BROKEN LIMESTONE", + '1420' => "CRUSHED AND BROKEN STONE", + '1429' => "CRUSHED AND BROKEN STONE, NEC", + '3643' => "CURRENT-CARRYING WIRING DEVICES", + '2391' => "CURTAINS AND DRAPERIES", + '3087' => "CUSTOM COMPOUND PURCHASED RESINS", + '3280' => "CUT STONE AND STONE PRODUCTS", + '3281' => "CUT STONE AND STONE PRODUCTS", + '3421' => "CUTLERY", + '3420' => "CUTLERY, HANDTOOLS, AND HARDWARE", + '2865' => "CYCLIC CRUDES AND INTERMEDIATES", + '0240' => "DAIRY FARMS", + '0241' => "DAIRY FARMS", + '2020' => "DAIRY PRODUCTS", + '5450' => "DAIRY PRODUCTS STORES", + '5451' => "DAIRY PRODUCTS STORES", + '5143' => "DAIRY PRODUCTS, EXC. DRIED OR CANNED", + '7910' => "DANCE STUDIOS, SCHOOLS, AND HALLS", + '7911' => "DANCE STUDIOS, SCHOOLS, AND HALLS", + '7374' => "DATA PROCESSING AND PREPARATION", + '8243' => "DATA PROCESSING SCHOOLS", + '0175' => "DECIDUOUS TREE FRUITS", + '4420' => "DEEP SEA DOMESTIC TRANS. OF FREIGHT", + '4424' => "DEEP SEA DOMESTIC TRANS. OF FREIGHT", + '4410' => "DEEP SEA FOREIGN TRANS. OF FREIGHT", + '4412' => "DEEP SEA FOREIGN TRANS. OF FREIGHT", + '4481' => "DEEP SEA PASSENGER TRANS., EX. FERRY", + '2034' => "DEHYDRATED FRUITS, VEGETABLES, SOUPS", + '3843' => "DENTAL EQUIPMENT AND SUPPLIES", + '8072' => "DENTAL LABORATORIES", + '5310' => "DEPARTMENT STORES", + '5311' => "DEPARTMENT STORES", + '6000' => "DEPOSITORY INSTITUTIONS", + '7381' => "DETECTIVE & ARMORED CAR SERVICES", + '2835' => "DIAGNOSTIC SUBSTANCES", + '2675' => "DIE-CUT PAPER AND BOARD", + '1410' => "DIMENSION STONE", + '1411' => "DIMENSION STONE", + '7331' => "DIRECT MAIL ADVERTISING SERVICES", + '5963' => "DIRECT SELLING ESTABLISHMENTS", + '7342' => "DISINFECTING & PEST CONTROL SERVICES", + '2085' => "DISTILLED AND BLENDED LIQUORS", + '2047' => "DOG AND CAT FOOD", + '3942' => "DOLLS AND STUFFED TOYS", + '5714' => "DRAPERY AND UPHOLSTERY STORES", + '2591' => "DRAPERY HARDWARE & BLINDS & SHADES", + '1381' => "DRILLING OIL AND GAS WELLS", + '5813' => "DRINKING PLACES", + '7833' => "DRIVE-IN MOTION PICTURE THEATERS", + '5910' => "DRUG STORES AND PROPRIETARY STORES", + '5912' => "DRUG STORES AND PROPRIETARY STORES", + '2830' => "DRUGS", + '5120' => "DRUGS, PROPRIETARIES, AND SUNDRIES", + '5122' => "DRUGS, PROPRIETARIES, AND SUNDRIES", + '2023' => "DRY, CONDENSED, EVAPORATED PRODUCTS", + '7216' => "DRYCLEANING PLANTS, EXCEPT RUG", + '5099' => "DURABLE GOODS, NEC", + '6514' => "DWELLING OPERATORS, EXC. APARTMENTS", + '5800' => "EATING AND DRINKING PLACES", + '5810' => "EATING AND DRINKING PLACES", + '5812' => "EATING PLACES", + '2079' => "EDIBLE FATS AND OILS, NEC", + '8200' => "EDUCATIONAL SERVICES", + '6732' => "EDUCATIONAL, RELIGIOUS, ETC. TRUSTS", + '4931' => "ELECTRIC AND OTHER SERVICES COMBINED", + '3610' => "ELECTRIC DISTRIBUTION EQUIPMENT", + '3634' => "ELECTRIC HOUSEWARES AND FANS", + '3641' => "ELECTRIC LAMPS", + '3640' => "ELECTRIC LIGHTING AND WIRING EQUIPMENT", + '4910' => "ELECTRIC SERVICES", + '4911' => "ELECTRIC SERVICES", + '4900' => "ELECTRIC, GAS, AND SANITARY SERVICES", + '5063' => "ELECTRICAL APPARATUS AND EQUIPMENT", + '5064' => "ELECTRICAL APPLIANCES, TV & RADIOS", + '3699' => "ELECTRICAL EQUIPMENT & SUPPLIES, NEC", + '5060' => "ELECTRICAL GOODS", + '3620' => "ELECTRICAL INDUSTRIAL APPARATUS", + '3629' => "ELECTRICAL INDUSTRIAL APPARATUS, NEC", + '7620' => "ELECTRICAL REPAIR SHOPS", + '7629' => "ELECTRICAL REPAIR SHOPS, NEC", + '1730' => "ELECTRICAL WORK", + '1731' => "ELECTRICAL WORK", + '3845' => "ELECTROMEDICAL EQUIPMENT", + '3313' => "ELECTROMETALLURGICAL PRODUCTS", + '3671' => "ELECTRON TUBES", + '3600' => "ELECTRONIC & OTHER ELECTRIC EQUIPMENT", + '3675' => "ELECTRONIC CAPACITORS", + '3677' => "ELECTRONIC COILS AND TRANSFORMERS", + '3670' => "ELECTRONIC COMPONENTS AND ACCESSORIES", + '3679' => "ELECTRONIC COMPONENTS, NEC", + '3571' => "ELECTRONIC COMPUTERS", + '3678' => "ELECTRONIC CONNECTORS", + '5065' => "ELECTRONIC PARTS AND EQUIPMENT", + '3676' => "ELECTRONIC RESISTORS", + '8210' => "ELEMENTARY AND SECONDARY SCHOOLS", + '8211' => "ELEMENTARY AND SECONDARY SCHOOLS", + '3534' => "ELEVATORS AND MOVING STAIRWAYS", + '7361' => "EMPLOYMENT AGENCIES", + '3694' => "ENGINE ELECTRICAL EQUIPMENT", + '8710' => "ENGINEERING & ARCHITECTURAL SERVICES", + '8700' => "ENGINEERING & MANAGEMENT SERVICES", + '8711' => "ENGINEERING SERVICES", + '3510' => "ENGINES AND TURBINES", + '7929' => "ENTERTAINERS & ENTERTAINMENT GROUPS", + '2677' => "ENVELOPES", + '3822' => "ENVIRONMENTAL CONTROLS", + '7359' => "EQUIPMENT RENTAL & LEASING, NEC", + '1794' => "EXCAVATION WORK", + '2892' => "EXPLOSIVES", + '2381' => "FABRIC DRESS AND WORK GLOVES", + '3400' => "FABRICATED METAL PRODUCTS", + '3499' => "FABRICATED METAL PRODUCTS, NEC", + '3498' => "FABRICATED PIPE AND FITTINGS", + '3443' => "FABRICATED PLATE WORK (BOILER SHOPS)", + '3060' => "FABRICATED RUBBER PRODUCTS, NEC", + '3069' => "FABRICATED RUBBER PRODUCTS, NEC", + '3441' => "FABRICATED STRUCTURAL METAL", + '3440' => "FABRICATED STRUCTURAL METAL PRODUCTS", + '2399' => "FABRICATED TEXTILE PRODUCTS, NEC", + '8744' => "FACILITIES SUPPORT SERVICES", + '5650' => "FAMILY CLOTHING STORES", + '5651' => "FAMILY CLOTHING STORES", + '3520' => "FARM AND GARDEN MACHINERY", + '5083' => "FARM AND GARDEN MACHINERY", + '0760' => "FARM LABOR AND MANAGEMENT SERVICES", + '0761' => "FARM LABOR CONTRACTORS", + '3523' => "FARM MACHINERY AND EQUIPMENT", + '0762' => "FARM MANAGEMENT SERVICES", + '4221' => "FARM PRODUCT WAREHOUSING AND STORAGE", + '5191' => "FARM SUPPLIES", + '5150' => "FARM-PRODUCT RAW MATERIALS", + '5159' => "FARM-PRODUCT RAW MATERIALS, NEC", + '3965' => "FASTENERS, BUTTONS, NEEDLES, & PINS", + '2070' => "FATS AND OILS", + '6110' => "FEDERAL & FED.-SPONSORED CREDIT", + '6111' => "FEDERAL & FED.-SPONSORED CREDIT", + '6061' => "FEDERAL CREDIT UNIONS", + '6011' => "FEDERAL RESERVE BANKS", + '6035' => "FEDERAL SAVINGS INSTITUTIONS", + '4482' => "FERRIES", + '1060' => "FERROALLOY ORES, EXCEPT VANADIUM", + '1061' => "FERROALLOY ORES, EXCEPT VANADIUM", + '2875' => "FERTILIZERS, MIXING ONLY", + '2655' => "FIBER CANS, DRUMS & SIMILAR PRODUCTS", + '0130' => "FIELD CROPS, EXCEPT CASH GRAINS", + '0139' => "FIELD CROPS, EXCEPT CASH GRAINS, NEC", + '0912' => "FINFISH", + '2261' => "FINISHING PLANTS, COTTON", + '2262' => "FINISHING PLANTS, MANMADE", + '2269' => "FINISHING PLANTS, NEC", + '6330' => "FIRE, MARINE, AND CASUALTY INSURANCE", + '6331' => "FIRE, MARINE, AND CASUALTY INSURANCE", + '5146' => "FISH AND SEAFOODS", + '0920' => "FISH HATCHERIES AND PRESERVES", + '0921' => "FISH HATCHERIES AND PRESERVES", + '0900' => "FISHING, HUNTING, AND TRAPPING", + '3210' => "FLAT GLASS", + '3211' => "FLAT GLASS", + '2087' => "FLAVORING EXTRACTS AND SYRUPS, NEC", + '5713' => "FLOOR COVERING STORES", + '1752' => "FLOOR LAYING AND FLOOR WORK, NEC", + '5992' => "FLORISTS", + '2041' => "FLOUR AND OTHER GRAIN MILL PRODUCTS", + '5193' => "FLOWERS & FLORISTS' SUPPLIES", + '3824' => "FLUID METERS AND COUNTING DEVICES", + '2026' => "FLUID MILK", + '3593' => "FLUID POWER CYLINDERS & ACTUATORS", + '3594' => "FLUID POWER PUMPS AND MOTORS", + '3492' => "FLUID POWER VALVES & HOSE FITTINGS", + '2657' => "FOLDING PAPERBOARD BOXES", + '2000' => "FOOD AND KINDRED PRODUCTS", + '0182' => "FOOD CROPS GROWN UNDER COVER", + '2099' => "FOOD PREPARATIONS, NEC", + '3556' => "FOOD PRODUCTS MACHINERY", + '5400' => "FOOD STORES", + '5139' => "FOOTWEAR", + '3130' => "FOOTWEAR CUT STOCK", + '3131' => "FOOTWEAR CUT STOCK", + '3140' => "FOOTWEAR, EXCEPT RUBBER", + '3149' => "FOOTWEAR, EXCEPT RUBBER, NEC", + '6081' => "FOREIGN BANK & BRANCHES & AGENCIES", + '6080' => "FOREIGN BANK & BRANCHES + AGENCIES", + '6082' => "FOREIGN TRADE & INTERNATIONAL BANKS", + '0831' => "FOREST PRODUCTS", + '0831' => "FOREST PRODUCTS", + '0800' => "FORESTRY", + '0850' => "FORESTRY SERVICES", + '0851' => "FORESTRY SERVICES", + '4430' => "FREIGHT TRANS. ON THE GREAT LAKES", + '4432' => "FREIGHT TRANS. ON THE GREAT LAKES", + '4730' => "FREIGHT TRANSPORTATION ARRANGEMENT", + '4731' => "FREIGHT TRANSPORTATION ARRANGEMENT", + '5148' => "FRESH FRUITS AND VEGETABLES", + '2092' => "FRESH OR FROZEN PREPARED FISH", + '2053' => "FROZEN BAKERY PRODUCTS, EXCEPT BREAD", + '2037' => "FROZEN FRUITS AND VEGETABLES", + '2038' => "FROZEN SPECIALTIES, NEC", + '5430' => "FRUIT AND VEGETABLE MARKETS", + '5431' => "FRUIT AND VEGETABLE MARKETS", + '0170' => "FRUITS AND TREE NUTS", + '0179' => "FRUITS AND TREE NUTS, NEC", + '5980' => "FUEL DEALERS", + '5989' => "FUEL DEALERS, NEC", + '5983' => "FUEL OIL DEALERS", + '6090' => "FUNCTIONS CLOSELY RELATED TO BANKING", + '6099' => "FUNCTIONS RELATED TO DEPOSIT BANKING", + '7260' => "FUNERAL SERVICE AND CREMATORIES", + '7261' => "FUNERAL SERVICE AND CREMATORIES", + '2370' => "FUR GOODS", + '2371' => "FUR GOODS", + '0271' => "FUR-BEARING ANIMALS AND RABBITS", + '5021' => "FURNITURE", + '2500' => "FURNITURE AND FIXTURES", + '2599' => "FURNITURE AND FIXTURES, NEC", + '5020' => "FURNITURE AND HOMEFURNISHINGS", + '5700' => "FURNITURE AND HOMEFURNISHINGS STORES", + '5710' => "FURNITURE AND HOMEFURNISHINGS STORES", + '5712' => "FURNITURE STORES", + '3944' => "GAMES, TOYS, AND CHILDREN'S VEHICLES", + '7212' => "GARMENT PRESSING & CLEANERS' AGENTS", + '4932' => "GAS AND OTHER SERVICES COMBINED", + '4920' => "GAS PRODUCTION AND DISTRIBUTION", + '4925' => "GAS PRODUCTION AND/OR DISTRIBUTION", + '4923' => "GAS TRANSMISSION AND DISTRIBUTION", + '3053' => "GASKETS, PACKING AND SEALING DEVICES", + '5540' => "GASOLINE SERVICE STATIONS", + '5541' => "GASOLINE SERVICE STATIONS", + '7538' => "GENERAL AUTOMOTIVE REPAIR SHOPS", + '1500' => "GENERAL BUILDING CONTRACTORS", + '0290' => "GENERAL FARMS, PRIMARILY ANIMAL", + '0291' => "GENERAL FARMS, PRIMARILY ANIMAL", + '0190' => "GENERAL FARMS, PRIMARILY CROP", + '0191' => "GENERAL FARMS, PRIMARILY CROP", + '3560' => "GENERAL INDUSTRIAL MACHINERY", + '3569' => "GENERAL INDUSTRIAL MACHINERY, NEC", + '0219' => "GENERAL LIVESTOCK, NEC", + '8062' => "GENERAL MEDICAL & SURGICAL HOSPITALS", + '5300' => "GENERAL MERCHANDISE STORES", + '4225' => "GENERAL WAREHOUSING AND STORAGE", + '5947' => "GIFT, NOVELTY, AND SOUVENIR SHOPS", + '2361' => "GIRLS' & CHILDREN'S DRESSES, BLOUSES", + '2360' => "GIRLS' AND CHILDREN'S OUTERWEAR", + '2369' => "GIRLS' AND CHILDREN'S OUTERWEAR, NEC", + '3220' => "GLASS AND GLASSWARE, PRESSED OR BLOWN", + '1793' => "GLASS AND GLAZING WORK", + '3221' => "GLASS CONTAINERS", + '1040' => "GOLD AND SILVER ORES", + '1041' => "GOLD ORES", + '5153' => "GRAIN AND FIELD BEANS", + '2040' => "GRAIN MILL PRODUCTS", + '0172' => "GRAPES", + '3321' => "GRAY AND DUCTILE IRON FOUNDRIES", + '2770' => "GREETING CARDS", + '2771' => "GREETING CARDS", + '5140' => "GROCERIES AND RELATED PRODUCTS", + '5149' => "GROCERIES AND RELATED PRODUCTS, NEC", + '5141' => "GROCERIES, GENERAL LINE", + '5410' => "GROCERY STORES", + '5411' => "GROCERY STORES", + '3761' => "GUIDED MISSILES AND SPACE VEHICLES", + '3760' => "GUIDED MISSILES, SPACE VEHICLES, PARTS", + '2861' => "GUM AND WOOD CHEMICALS", + '3275' => "GYPSUM PRODUCTS", + '3423' => "HAND AND EDGE TOOLS, NEC", + '3170' => "HANDBAGS AND PERSONAL LEATHER GOODS", + '3996' => "HARD SURFACE FLOOR COVERINGS, NEC", + '5072' => "HARDWARE", + '5250' => "HARDWARE STORES", + '5251' => "HARDWARE STORES", + '3429' => "HARDWARE, NEC", + '5070' => "HARDWARE, PLUMBING & HEATING EQUIPMENT", + '2426' => "HARDWOOD DIMENSION & FLOORING MILLS", + '2435' => "HARDWOOD VENEER AND PLYWOOD", + '2350' => "HATS, CAPS, AND MILLINERY", + '2353' => "HATS, CAPS, AND MILLINERY", + '8090' => "HEALTH AND ALLIED SERVICES, NEC", + '8099' => "HEALTH AND ALLIED SERVICES, NEC", + '8000' => "HEALTH SERVICES", + '3433' => "HEATING EQUIPMENT, EXCEPT ELECTRIC", + '7353' => "HEAVY CONSTRUCTION EQUIPMENT RENTAL", + '1600' => "HEAVY CONSTRUCTION, EX. BUILDING", + '1620' => "HEAVY CONSTRUCTION, EXCEPT HIGHWAY", + '1629' => "HEAVY CONSTRUCTION, NEC", + '7363' => "HELP SUPPLY SERVICES", + '1610' => "HIGHWAY AND STREET CONSTRUCTION", + '1611' => "HIGHWAY AND STREET CONSTRUCTION", + '5945' => "HOBBY, TOY, AND GAME SHOPS", + '0213' => "HOGS", + '3536' => "HOISTS, CRANES, AND MONORAILS", + '6700' => "HOLDING AND OTHER INVESTMENT OFFICES", + '6719' => "HOLDING COMPANIES, NEC", + '6710' => "HOLDING OFFICES", + '8080' => "HOME HEALTH CARE SERVICES", + '8082' => "HOME HEALTH CARE SERVICES", + '5023' => "HOMEFURNISHINGS", + '0272' => "HORSES AND OTHER EQUINES", + '0180' => "HORTICULTURAL SPECIALTIES", + '3050' => "HOSE & BELTING & GASKETS & PACKING", + '2252' => "HOSIERY, NEC", + '6324' => "HOSPITAL AND MEDICAL SERVICE PLANS", + '8060' => "HOSPITALS", + '7010' => "HOTELS AND MOTELS", + '7011' => "HOTELS AND MOTELS", + '7000' => "HOTELS AND OTHER LODGING PLACES", + '3142' => "HOUSE SLIPPERS", + '2392' => "HOUSEFURNISHINGS, NEC", + '5720' => "HOUSEHOLD APPLIANCE STORES", + '5722' => "HOUSEHOLD APPLIANCE STORES", + '3630' => "HOUSEHOLD APPLIANCES", + '3639' => "HOUSEHOLD APPLIANCES, NEC", + '3650' => "HOUSEHOLD AUDIO AND VIDEO EQUIPMENT", + '3651' => "HOUSEHOLD AUDIO AND VIDEO EQUIPMENT", + '3631' => "HOUSEHOLD COOKING EQUIPMENT", + '2510' => "HOUSEHOLD FURNITURE", + '2519' => "HOUSEHOLD FURNITURE, NEC", + '3633' => "HOUSEHOLD LAUNDRY EQUIPMENT", + '3632' => "HOUSEHOLD REFRIGERATORS AND FREEZERS", + '3635' => "HOUSEHOLD VACUUM CLEANERS", + '0970' => "HUNTING, TRAPPING, GAME PROPAGATION", + '0971' => "HUNTING, TRAPPING, GAME PROPAGATION", + '2024' => "ICE CREAM AND FROZEN DESSERTS", + '8320' => "INDIVIDUAL AND FAMILY SERVICES", + '8322' => "INDIVIDUAL AND FAMILY SERVICES", + '5113' => "INDUSTRIAL & PERSONAL SERVICE PAPER", + '1541' => "INDUSTRIAL BUILDINGS AND WAREHOUSES", + '3567' => "INDUSTRIAL FURNACES AND OVENS", + '2813' => "INDUSTRIAL GASES", + '2810' => "INDUSTRIAL INORGANIC CHEMICALS", + '2819' => "INDUSTRIAL INORGANIC CHEMICALS, NEC", + '7218' => "INDUSTRIAL LAUNDERERS", + '3500' => "INDUSTRIAL MACHINERY AND EQUIPMENT", + '5084' => "INDUSTRIAL MACHINERY AND EQUIPMENT", + '3590' => "INDUSTRIAL MACHINERY, NEC", + '3599' => "INDUSTRIAL MACHINERY, NEC", + '2860' => "INDUSTRIAL ORGANIC CHEMICALS", + '2869' => "INDUSTRIAL ORGANIC CHEMICALS, NEC", + '3543' => "INDUSTRIAL PATTERNS", + '1446' => "INDUSTRIAL SAND", + '5085' => "INDUSTRIAL SUPPLIES", + '3537' => "INDUSTRIAL TRUCKS AND TRACTORS", + '3491' => "INDUSTRIAL VALVES", + '7375' => "INFORMATION RETRIEVAL SERVICES", + '2816' => "INORGANIC PIGMENTS", + '4785' => "INSPECTION & FIXED FACILITIES", + '1796' => "INSTALLING BUILDING EQUIPMENT, NEC", + '3800' => "INSTRUMENTS AND RELATED PRODUCTS", + '3825' => "INSTRUMENTS TO MEASURE ELECTRICITY", + '6400' => "INSURANCE AGENTS, BROKERS, & SERVICE", + '6410' => "INSURANCE AGENTS, BROKERS, & SERVICE", + '6411' => "INSURANCE AGENTS, BROKERS, & SERVICE", + '6300' => "INSURANCE CARRIERS", + '6390' => "INSURANCE CARRIERS, NEC", + '6399' => "INSURANCE CARRIERS, NEC", + '4131' => "INTERCITY & RURAL BUS TRANSPORTATION", + '4130' => "INTERCITY AND RURAL BUS TRANSPORTATION", + '8052' => "INTERMEDIATE CARE FACILITIES", + '3519' => "INTERNAL COMBUSTION ENGINES, NEC", + '6282' => "INVESTMENT ADVICE", + '6720' => "INVESTMENT OFFICES", + '6726' => "INVESTMENT OFFICES, NEC", + '6799' => "INVESTORS, NEC", + '0134' => "IRISH POTATOES", + '3462' => "IRON AND STEEL FORGINGS", + '3320' => "IRON AND STEEL FOUNDRIES", + '1010' => "IRON ORES", + '1011' => "IRON ORES", + '4970' => "IRRIGATION SYSTEMS", + '4971' => "IRRIGATION SYSTEMS", + '3915' => "JEWELERS' MATERIALS & LAPIDARY WORK", + '5094' => "JEWELRY & PRECIOUS STONES", + '5944' => "JEWELRY STORES", + '3911' => "JEWELRY, PRECIOUS METAL", + '3910' => "JEWELRY, SILVERWARE, AND PLATED WARE", + '8330' => "JOB TRAINING AND RELATED SERVICES", + '8331' => "JOB TRAINING AND RELATED SERVICES", + '8222' => "JUNIOR COLLEGES", + '1455' => "KAOLIN AND BALL CLAY", + '8092' => "KIDNEY DIALYSIS CENTERS", + '2253' => "KNIT OUTERWEAR MILLS", + '2254' => "KNIT UNDERWEAR MILLS", + '2250' => "KNITTING MILLS", + '2259' => "KNITTING MILLS, NEC", + '8630' => "LABOR ORGANIZATIONS", + '8631' => "LABOR ORGANIZATIONS", + '3821' => "LABORATORY APPARATUS AND FURNITURE", + '2258' => "LACE & WARP KNIT FABRIC MILLS", + '3083' => "LAMINATED PLASTICS PLATE & SHEET", + '0780' => "LANDSCAPE AND HORTICULTURAL SERVICES", + '0781' => "LANDSCAPE COUNSELING AND PLANNING", + '7219' => "LAUNDRY AND GARMENT SERVICES, NEC", + '7210' => "LAUNDRY, CLEANING, & GARMENT SERVICES", + '3524' => "LAWN AND GARDEN EQUIPMENT", + '0782' => "LAWN AND GARDEN SERVICES", + '1030' => "LEAD AND ZINC ORES", + '1031' => "LEAD AND ZINC ORES", + '3952' => "LEAD PENCILS AND ART GOODS", + '3100' => "LEATHER AND LEATHER PRODUCTS", + '2386' => "LEATHER AND SHEEP-LINED CLOTHING", + '3150' => "LEATHER GLOVES AND MITTENS", + '3151' => "LEATHER GLOVES AND MITTENS", + '3190' => "LEATHER GOODS, NEC", + '3199' => "LEATHER GOODS, NEC", + '3110' => "LEATHER TANNING AND FINISHING", + '3111' => "LEATHER TANNING AND FINISHING", + '8100' => "LEGAL SERVICES", + '8110' => "LEGAL SERVICES", + '8111' => "LEGAL SERVICES", + '8230' => "LIBRARIES", + '8231' => "LIBRARIES", + '6310' => "LIFE INSURANCE", + '6311' => "LIFE INSURANCE", + '3648' => "LIGHTING EQUIPMENT, NEC", + '3274' => "LIME", + '7213' => "LINEN SUPPLY", + '5984' => "LIQUEFIED PETROLEUM GAS DEALERS", + '5920' => "LIQUOR STORES", + '5921' => "LIQUOR STORES", + '5154' => "LIVESTOCK", + '0751' => "LIVESTOCK SERVICES, EXC. VETERINARY", + '0210' => "LIVESTOCK, EXCEPT DAIRY AND POULTRY", + '6163' => "LOAN BROKERS", + '4100' => "LOCAL AND INTERURBAN PASSENGER TRANSIT", + '4111' => "LOCAL AND SUBURBAN TRANSIT", + '4110' => "LOCAL AND SUBURBAN TRANSPORTATION", + '4141' => "LOCAL BUS CHARTER SERVICE", + '4119' => "LOCAL PASSENGER TRANSPORTATION, NEC", + '4214' => "LOCAL TRUCKING WITH STORAGE", + '4212' => "LOCAL TRUCKING, WITHOUT STORAGE", + '2410' => "LOGGING", + '2411' => "LOGGING", + '2992' => "LUBRICATING OILS AND GREASES", + '3160' => "LUGGAGE", + '3161' => "LUGGAGE", + '5948' => "LUGGAGE AND LEATHER GOODS STORES", + '5030' => "LUMBER AND CONSTRUCTION MATERIALS", + '5210' => "LUMBER AND OTHER BUILDING MATERIALS", + '5211' => "LUMBER AND OTHER BUILDING MATERIALS", + '2400' => "LUMBER AND WOOD PRODUCTS", + '5031' => "LUMBER, PLYWOOD, AND MILLWORK", + '2098' => "MACARONI AND SPAGHETTI", + '3545' => "MACHINE TOOL ACCESSORIES", + '3541' => "MACHINE TOOLS, METAL CUTTING TYPES", + '3542' => "MACHINE TOOLS, METAL FORMING TYPES", + '5080' => "MACHINERY, EQUIPMENT, AND SUPPLIES", + '3695' => "MAGNETIC AND OPTICAL RECORDING MEDIA", + '7330' => "MAILING, REPRODUCTION, STENOGRAPHIC", + '3322' => "MALLEABLE IRON FOUNDRIES", + '2083' => "MALT", + '2082' => "MALT BEVERAGES", + '8740' => "MANAGEMENT AND PUBLIC RELATIONS", + '8742' => "MANAGEMENT CONSULTING SERVICES", + '6722' => "MANAGEMENT INVESTMENT, OPEN-END", + '8741' => "MANAGEMENT SERVICES", + '2760' => "MANIFOLD BUSINESS FORMS", + '2761' => "MANIFOLD BUSINESS FORMS", + '2097' => "MANUFACTURED ICE", + '3999' => "MANUFACTURING INDUSTRIES, NEC", + '4493' => "MARINAS", + '4491' => "MARINE CARGO HANDLING", + '3953' => "MARKING DEVICES", + '1741' => "MASONRY AND OTHER STONEWORK", + '1740' => "MASONRY, STONEWORK, AND PLASTERING", + '2515' => "MATTRESSES AND BEDSPRINGS", + '3829' => "MEASURING & CONTROLLING DEVICES, NEC", + '3820' => "MEASURING AND CONTROLLING DEVICES", + '3586' => "MEASURING AND DISPENSING PUMPS", + '5420' => "MEAT AND FISH MARKETS", + '5421' => "MEAT AND FISH MARKETS", + '2011' => "MEAT PACKING PLANTS", + '2010' => "MEAT PRODUCTS", + '5147' => "MEATS AND MEAT PRODUCTS", + '3061' => "MECHANICAL RUBBER GOODS", + '8070' => "MEDICAL AND DENTAL LABORATORIES", + '5047' => "MEDICAL AND HOSPITAL EQUIPMENT", + '7352' => "MEDICAL EQUIPMENT RENTAL", + '3840' => "MEDICAL INSTRUMENTS AND SUPPLIES", + '8071' => "MEDICAL LABORATORIES", + '6320' => "MEDICAL SERVICE AND HEALTH INSURANCE", + '2833' => "MEDICINALS AND BOTANICALS", + '8600' => "MEMBERSHIP ORGANIZATIONS", + '8690' => "MEMBERSHIP ORGANIZATIONS, NEC", + '8699' => "MEMBERSHIP ORGANIZATIONS, NEC", + '7997' => "MEMBERSHIP SPORTS & RECREATION CLUBS", + '7040' => "MEMBERSHIP-BASIS ORGANIZATION HOTELS", + '7041' => "MEMBERSHIP-BASIS ORGANIZATION HOTELS", + '5610' => "MEN'S & BOYS' CLOTHING STORES", + '5611' => "MEN'S & BOYS' CLOTHING STORES", + '2322' => "MEN'S & BOYS' UNDERWEAR + NIGHTWEAR", + '5136' => "MEN'S AND BOYS' CLOTHING", + '2329' => "MEN'S AND BOYS' CLOTHING, NEC", + '2320' => "MEN'S AND BOYS' FURNISHINGS", + '2323' => "MEN'S AND BOYS' NECKWEAR", + '2321' => "MEN'S AND BOYS' SHIRTS", + '2310' => "MEN'S AND BOYS' SUITS AND COATS", + '2311' => "MEN'S AND BOYS' SUITS AND COATS", + '2325' => "MEN'S AND BOYS' TROUSERS AND SLACKS", + '2326' => "MEN'S AND BOYS' WORK CLOTHING", + '3143' => "MEN'S FOOTWEAR, EXCEPT ATHLETIC", + '5962' => "MERCHANDISING MACHINE OPERATORS", + '3412' => "METAL BARRELS, DRUMS, AND PAILS", + '3411' => "METAL CANS", + '3410' => "METAL CANS AND SHIPPING CONTAINERS", + '3479' => "METAL COATING AND ALLIED SERVICES", + '3442' => "METAL DOORS, SASH, AND TRIM", + '3497' => "METAL FOIL AND LEAF", + '3460' => "METAL FORGINGS AND STAMPINGS", + '3398' => "METAL HEAT TREATING", + '2514' => "METAL HOUSEHOLD FURNITURE", + '1000' => "METAL MINING", + '1080' => "METAL MINING SERVICES", + '1081' => "METAL MINING SERVICES", + '1099' => "METAL ORES, NEC", + '3431' => "METAL SANITARY WARE", + '3470' => "METAL SERVICES, NEC", + '3469' => "METAL STAMPINGS, NEC", + '5050' => "METALS AND MINERALS, EXCEPT PETROLEUM", + '5051' => "METALS SERVICE CENTERS AND OFFICES", + '3540' => "METALWORKING MACHINERY", + '3549' => "METALWORKING MACHINERY, NEC", + '2431' => "MILLWORK", + '2430' => "MILLWORK, PLYWOOD & STRUCTURAL", + '3296' => "MINERAL WOOL", + '3295' => "MINERALS, GROUND OR TREATED", + '3532' => "MINING MACHINERY", + '7990' => "MISC. AMUSEMENT, RECREATION SERVICES", + '5690' => "MISC. APPAREL & ACCESSORY STORES", + '5699' => "MISC. APPAREL & ACCESSORY STORES", + '6159' => "MISC. BUSINESS CREDIT INSTITUTIONS", + '2670' => "MISC. CONVERTED PAPER PRODUCTS", + '3690' => "MISC. ELECTRICAL EQUIPMENT & SUPPLIES", + '7350' => "MISC. EQUIPMENT RENTAL & LEASING", + '3490' => "MISC. FABRICATED METAL PRODUCTS", + '2390' => "MISC. FABRICATED TEXTILE PRODUCTS", + '3496' => "MISC. FABRICATED WIRE PRODUCTS", + '2090' => "MISC. FOOD AND KINDRED PRODUCTS", + '5390' => "MISC. GENERAL MERCHANDISE STORES", + '5399' => "MISC. GENERAL MERCHANDISE STORES", + '5719' => "MISC. HOMEFURNISHINGS STORES", + '5190' => "MISC. NONDURABLE GOODS", + '3290' => "MISC. NONMETALLIC MINERAL PRODUCTS", + '2990' => "MISC. PETROLEUM AND COAL PRODUCTS", + '1790' => "MISC. SPECIAL TRADE CONTRACTORS", + '2380' => "MISCELLANEOUS APPAREL AND ACCESSORIES", + '7380' => "MISCELLANEOUS BUSINESS SERVICES", + '2890' => "MISCELLANEOUS CHEMICAL PRODUCTS", + '5090' => "MISCELLANEOUS DURABLE GOODS", + '5490' => "MISCELLANEOUS FOOD STORES", + '5499' => "MISCELLANEOUS FOOD STORES", + '2590' => "MISCELLANEOUS FURNITURE AND FIXTURES", + '6790' => "MISCELLANEOUS INVESTING", + '3990' => "MISCELLANEOUS MANUFACTURES", + '3900' => "MISCELLANEOUS MANUFACTURING INDUSTRIES", + '0919' => "MISCELLANEOUS MARINE PRODUCTS", + '1090' => "MISCELLANEOUS METAL ORES", + '3449' => "MISCELLANEOUS METAL WORK", + '1490' => "MISCELLANEOUS NONMETALLIC MINERALS", + '1499' => "MISCELLANEOUS NONMETALLIC MINERALS", + '7290' => "MISCELLANEOUS PERSONAL SERVICES", + '7299' => "MISCELLANEOUS PERSONAL SERVICES, NEC", + '3080' => "MISCELLANEOUS PLASTICS PRODUCTS, NEC", + '3390' => "MISCELLANEOUS PRIMARY METAL PRODUCTS", + '2740' => "MISCELLANEOUS PUBLISHING", + '2741' => "MISCELLANEOUS PUBLISHING", + '7600' => "MISCELLANEOUS REPAIR SERVICES", + '7690' => "MISCELLANEOUS REPAIR SHOPS", + '5900' => "MISCELLANEOUS RETAIL", + '5999' => "MISCELLANEOUS RETAIL STORES, NEC", + '5940' => "MISCELLANEOUS SHOPPING GOODS STORES", + '2290' => "MISCELLANEOUS TEXTILE GOODS", + '3790' => "MISCELLANEOUS TRANSPORTATION EQUIPMENT", + '4780' => "MISCELLANEOUS TRANSPORTATION SERVICES", + '2490' => "MISCELLANEOUS WOOD PRODUCTS", + '5270' => "MOBILE HOME DEALERS", + '5271' => "MOBILE HOME DEALERS", + '6515' => "MOBILE HOME SITE OPERATORS", + '2451' => "MOBILE HOMES", + '6160' => "MORTGAGE BANKERS AND BROKERS", + '6162' => "MORTGAGE BANKERS AND CORRESPONDENTS", + '7812' => "MOTION PICTURE & VIDEO PRODUCTION", + '7822' => "MOTION PICTURE AND TAPE DISTRIBUTION", + '7820' => "MOTION PICTURE DISTRIBUTION & SERVICES", + '7829' => "MOTION PICTURE DISTRIBUTION SERVICES", + '7810' => "MOTION PICTURE PRODUCTION & SERVICES", + '7830' => "MOTION PICTURE THEATERS", + '7832' => "MOTION PICTURE THEATERS, EX DRIVE-IN", + '7800' => "MOTION PICTURES", + '3716' => "MOTOR HOMES", + '3714' => "MOTOR VEHICLE PARTS AND ACCESSORIES", + '5015' => "MOTOR VEHICLE PARTS, USED", + '5013' => "MOTOR VEHICLE SUPPLIES AND NEW PARTS", + '3711' => "MOTOR VEHICLES AND CAR BODIES", + '3710' => "MOTOR VEHICLES AND EQUIPMENT", + '5010' => "MOTOR VEHICLES, PARTS, AND SUPPLIES", + '5570' => "MOTORCYCLE DEALERS", + '5571' => "MOTORCYCLE DEALERS", + '3750' => "MOTORCYCLES, BICYCLES, AND PARTS", + '3751' => "MOTORCYCLES, BICYCLES, AND PARTS", + '3621' => "MOTORS AND GENERATORS", + '8410' => "MUSEUMS AND ART GALLERIES", + '8412' => "MUSEUMS AND ART GALLERIES", + '8400' => "MUSEUMS, BOTANICAL, ZOOLOGICAL GARDENS", + '5736' => "MUSICAL INSTRUMENT STORES", + '3930' => "MUSICAL INSTRUMENTS", + '3931' => "MUSICAL INSTRUMENTS", + '2441' => "NAILED WOOD BOXES AND SHOOK", + '2240' => "NARROW FABRIC MILLS", + '2241' => "NARROW FABRIC MILLS", + '6021' => "NATIONAL COMMERCIAL BANKS", + '4924' => "NATURAL GAS DISTRIBUTION", + '1320' => "NATURAL GAS LIQUIDS", + '1321' => "NATURAL GAS LIQUIDS", + '4922' => "NATURAL GAS TRANSMISSION", + '5510' => "NEW AND USED CAR DEALERS", + '5511' => "NEW AND USED CAR DEALERS", + '5994' => "NEWS DEALERS AND NEWSSTANDS", + '7383' => "NEWS SYNDICATES", + '2710' => "NEWSPAPERS", + '2711' => "NEWSPAPERS", + '2873' => "NITROGENOUS FERTILIZERS", + '3297' => "NONCLAY REFRACTORIES", + '8733' => "NONCOMMERCIAL RESEARCH ORGANIZATIONS", + '3644' => "NONCURRENT-CARRYING WIRING DEVICES", + '6091' => "NONDEPOSIT TRUST FACILITIES", + '6100' => "NONDEPOSITORY INSTITUTIONS", + '5199' => "NONDURABLE GOODS, NEC", + '3364' => "NONFERROUS DIE-CASTING EXC. ALUMINUM", + '3463' => "NONFERROUS FORGINGS", + '3360' => "NONFERROUS FOUNDRIES (CASTINGS)", + '3369' => "NONFERROUS FOUNDRIES, NEC", + '3350' => "NONFERROUS ROLLING AND DRAWING", + '3356' => "NONFERROUS ROLLING AND DRAWING, NEC", + '3357' => "NONFERROUS WIREDRAWING & INSULATING", + '3299' => "NONMETALLIC MINERAL PRODUCTS, NEC", + '1480' => "NONMETALLIC MINERALS SERVICES", + '1481' => "NONMETALLIC MINERALS SERVICES", + '1400' => "NONMETALLIC MINERALS, EXCEPT FUELS", + '1540' => "NONRESIDENTIAL BUILDING CONSTRUCTION", + '6512' => "NONRESIDENTIAL BUILDING OPERATORS", + '1542' => "NONRESIDENTIAL CONSTRUCTION, NEC", + '5960' => "NONSTORE RETAILERS", + '2297' => "NONWOVEN FABRICS", + '8050' => "NURSING AND PERSONAL CARE FACILITIES", + '8059' => "NURSING AND PERSONAL CARE, NEC", + '5044' => "OFFICE EQUIPMENT", + '2520' => "OFFICE FURNITURE", + '2522' => "OFFICE FURNITURE, EXCEPT WOOD", + '3579' => "OFFICE MACHINES, NEC", + '8010' => "OFFICES & CLINICS OF MEDICAL DOCTORS", + '8011' => "OFFICES & CLINICS OF MEDICAL DOCTORS", + '8041' => "OFFICES AND CLINICS OF CHIROPRACTORS", + '8020' => "OFFICES AND CLINICS OF DENTISTS", + '8021' => "OFFICES AND CLINICS OF DENTISTS", + '8042' => "OFFICES AND CLINICS OF OPTOMETRISTS", + '8043' => "OFFICES AND CLINICS OF PODIATRISTS", + '8049' => "OFFICES OF HEALTH PRACTITIONERS, NEC", + '8030' => "OFFICES OF OSTEOPATHIC PHYSICIANS", + '8031' => "OFFICES OF OSTEOPATHIC PHYSICIANS", + '8040' => "OFFICES OF OTHER HEALTH PRACTITIONERS", + '1382' => "OIL AND GAS EXPLORATION SERVICES", + '1300' => "OIL AND GAS EXTRACTION", + '3533' => "OIL AND GAS FIELD MACHINERY", + '1380' => "OIL AND GAS FIELD SERVICES", + '1389' => "OIL AND GAS FIELD SERVICES, NEC", + '6792' => "OIL ROYALTY TRADERS", + '1530' => "OPERATIVE BUILDERS", + '1531' => "OPERATIVE BUILDERS", + '3850' => "OPHTHALMIC GOODS", + '3851' => "OPHTHALMIC GOODS", + '5048' => "OPHTHALMIC GOODS", + '5995' => "OPTICAL GOODS STORES", + '3827' => "OPTICAL INSTRUMENTS AND LENSES", + '3480' => "ORDNANCE AND ACCESSORIES, NEC", + '3489' => "ORDNANCE AND ACCESSORIES, NEC", + '2824' => "ORGANIC FIBERS, NONCELLULOSIC", + '0181' => "ORNAMENTAL NURSERY PRODUCTS", + '0783' => "ORNAMENTAL SHRUB AND TREE SERVICES", + '7312' => "OUTDOOR ADVERTISING SERVICES", + '5142' => "PACKAGED FROZEN FOODS", + '3565' => "PACKAGING MACHINERY", + '4783' => "PACKING AND CRATING", + '5230' => "PAINT, GLASS, AND WALLPAPER STORES", + '5231' => "PAINT, GLASS, AND WALLPAPER STORES", + '1720' => "PAINTING AND PAPER HANGING", + '1721' => "PAINTING AND PAPER HANGING", + '2850' => "PAINTS AND ALLIED PRODUCTS", + '2851' => "PAINTS AND ALLIED PRODUCTS", + '5198' => "PAINTS, VARNISHES, AND SUPPLIES", + '2600' => "PAPER AND ALLIED PRODUCTS", + '5110' => "PAPER AND PAPER PRODUCTS", + '2671' => "PAPER COATED & LAMINATED, PACKAGING", + '2672' => "PAPER COATED AND LAMINATED, NEC", + '3554' => "PAPER INDUSTRIES MACHINERY", + '2620' => "PAPER MILLS", + '2621' => "PAPER MILLS", + '2650' => "PAPERBOARD CONTAINERS AND BOXES", + '2630' => "PAPERBOARD MILLS", + '2631' => "PAPERBOARD MILLS", + '2540' => "PARTITIONS AND FIXTURES", + '2542' => "PARTITIONS AND FIXTURES, EXCEPT WOOD", + '7515' => "PASSENGER CAR LEASING", + '7514' => "PASSENGER CAR RENTAL", + '4729' => "PASSENGER TRANSPORT ARRANGEMENT, NEC", + '4720' => "PASSENGER TRANSPORTATION ARRANGEMENT", + '6794' => "PATENT OWNERS AND LESSORS", + '3951' => "PENS AND MECHANICAL PENCILS", + '3950' => "PENS, PENCILS, OFFICE, & ART SUPPLIES", + '6370' => "PENSION, HEALTH, AND WELFARE FUNDS", + '6371' => "PENSION, HEALTH, AND WELFARE FUNDS", + '2720' => "PERIODICALS", + '2721' => "PERIODICALS", + '6140' => "PERSONAL CREDIT INSTITUTIONS", + '6141' => "PERSONAL CREDIT INSTITUTIONS", + '3172' => "PERSONAL LEATHER GOODS, NEC", + '7200' => "PERSONAL SERVICES", + '7360' => "PERSONNEL SUPPLY SERVICES", + '2900' => "PETROLEUM AND COAL PRODUCTS", + '2999' => "PETROLEUM AND COAL PRODUCTS, NEC", + '5170' => "PETROLEUM AND PETROLEUM PRODUCTS", + '5171' => "PETROLEUM BULK STATIONS & TERMINALS", + '5172' => "PETROLEUM PRODUCTS, NEC", + '2910' => "PETROLEUM REFINING", + '2911' => "PETROLEUM REFINING", + '2834' => "PHARMACEUTICAL PREPARATIONS", + '1475' => "PHOSPHATE ROCK", + '2874' => "PHOSPHATIC FERTILIZERS", + '7334' => "PHOTOCOPYING & DUPLICATING SERVICES", + '7384' => "PHOTOFINISHING LABORATORIES", + '3860' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES", + '3861' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES", + '5043' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES", + '7220' => "PHOTOGRAPHIC STUDIOS, PORTRAIT", + '7221' => "PHOTOGRAPHIC STUDIOS, PORTRAIT", + '7991' => "PHYSICAL FITNESS FACILITIES", + '2035' => "PICKLES, SAUCES, AND SALAD DRESSINGS", + '5131' => "PIECE GOODS & NOTIONS", + '4600' => "PIPELINES, EXCEPT NATURAL GAS", + '4610' => "PIPELINES, EXCEPT NATURAL GAS", + '4619' => "PIPELINES, NEC", + '1742' => "PLASTERING, DRYWALL, AND INSULATION", + '3085' => "PLASTICS BOTTLES", + '3086' => "PLASTICS FOAM PRODUCTS", + '5162' => "PLASTICS MATERIALS & BASIC SHAPES", + '2821' => "PLASTICS MATERIALS AND RESINS", + '2820' => "PLASTICS MATERIALS AND SYNTHETICS", + '3084' => "PLASTICS PIPE", + '3088' => "PLASTICS PLUMBING FIXTURES", + '3089' => "PLASTICS PRODUCTS, NEC", + '2796' => "PLATEMAKING SERVICES", + '3471' => "PLATING AND POLISHING", + '2395' => "PLEATING AND STITCHING", + '5074' => "PLUMBING & HYDRONIC HEATING SUPPLIES", + '3430' => "PLUMBING AND HEATING, EXCEPT ELECTRIC", + '3432' => "PLUMBING FIXTURE FITTINGS AND TRIM", + '1710' => "PLUMBING, HEATING, AIR-CONDITIONING", + '1711' => "PLUMBING, HEATING, AIR-CONDITIONING", + '2842' => "POLISHES AND SANITATION GOODS", + '8650' => "POLITICAL ORGANIZATIONS", + '8651' => "POLITICAL ORGANIZATIONS", + '3264' => "PORCELAIN ELECTRICAL SUPPLIES", + '1474' => "POTASH, SODA, AND BORATE MINERALS", + '2096' => "POTATO CHIPS AND SIMILAR SNACKS", + '3260' => "POTTERY AND RELATED PRODUCTS", + '3269' => "POTTERY PRODUCTS, NEC", + '0250' => "POULTRY AND EGGS", + '0259' => "POULTRY AND EGGS, NEC", + '5144' => "POULTRY AND POULTRY PRODUCTS", + '0254' => "POULTRY HATCHERIES", + '2015' => "POULTRY SLAUGHTERING AND PROCESSING", + '7211' => "POWER LAUNDRIES, FAMILY & COMMERCIAL", + '3568' => "POWER TRANSMISSION EQUIPMENT, NEC", + '3546' => "POWER-DRIVEN HANDTOOLS", + '3448' => "PREFABRICATED METAL BUILDINGS", + '2452' => "PREFABRICATED WOOD BUILDINGS", + '7372' => "PREPACKAGED SOFTWARE", + '2048' => "PREPARED FEEDS, NEC", + '2045' => "PREPARED FLOUR MIXES AND DOUGHS", + '3652' => "PRERECORDED RECORDS AND TAPES", + '2030' => "PRESERVED FRUITS AND VEGETABLES", + '3229' => "PRESSED AND BLOWN GLASS, NEC", + '3334' => "PRIMARY ALUMINUM", + '3692' => "PRIMARY BATTERIES, DRY AND WET", + '3331' => "PRIMARY COPPER", + '3300' => "PRIMARY METAL INDUSTRIES", + '3399' => "PRIMARY METAL PRODUCTS, NEC", + '3330' => "PRIMARY NONFERROUS METALS", + '3339' => "PRIMARY NONFERROUS METALS, NEC", + '3672' => "PRINTED CIRCUIT BOARDS", + '2700' => "PRINTING AND PUBLISHING", + '5111' => "PRINTING AND WRITING PAPER", + '2893' => "PRINTING INK", + '2790' => "PRINTING TRADE SERVICES", + '3555' => "PRINTING TRADES MACHINERY", + '8800' => "PRIVATE HOUSEHOLDS", + '8810' => "PRIVATE HOUSEHOLDS", + '8811' => "PRIVATE HOUSEHOLDS", + '3823' => "PROCESS CONTROL INSTRUMENTS", + '7920' => "PRODUCERS, ORCHESTRAS, ENTERTAINERS", + '3230' => "PRODUCTS OF PURCHASED GLASS", + '3231' => "PRODUCTS OF PURCHASED GLASS", + '5040' => "PROFESSIONAL & COMMERCIAL EQUIPMENT", + '5049' => "PROFESSIONAL EQUIPMENT, NEC", + '8620' => "PROFESSIONAL ORGANIZATIONS", + '8621' => "PROFESSIONAL ORGANIZATIONS", + '8063' => "PSYCHIATRIC HOSPITALS", + '2530' => "PUBLIC BUILDING & RELATED FURNITURE", + '2531' => "PUBLIC BUILDING & RELATED FURNITURE", + '7992' => "PUBLIC GOLF COURSES", + '8743' => "PUBLIC RELATIONS SERVICES", + '4220' => "PUBLIC WAREHOUSING AND STORAGE", + '2610' => "PULP MILLS", + '2611' => "PULP MILLS", + '3561' => "PUMPS AND PUMPING EQUIPMENT", + '7948' => "RACING, INCLUDING TRACK OPERATION", + '3663' => "RADIO & TV COMMUNICATIONS EQUIPMENT", + '4830' => "RADIO AND TELEVISION BROADCASTING", + '7622' => "RADIO AND TELEVISION REPAIR", + '4832' => "RADIO BROADCASTING STATIONS", + '5730' => "RADIO, TELEVISION, & COMPUTER STORES", + '5731' => "RADIO, TV, & ELECTRONIC STORES", + '7313' => "RADIO, TV, PUBLISHER REPRESENTATIVES", + '4812' => "RADIOTELEPHONE COMMUNICATIONS", + '3740' => "RAILROAD EQUIPMENT", + '3743' => "RAILROAD EQUIPMENT", + '6517' => "RAILROAD PROPERTY LESSORS", + '4000' => "RAILROAD TRANSPORTATION", + '4010' => "RAILROADS", + '4011' => "RAILROADS, LINE-HAUL OPERATING", + '2061' => "RAW CANE SUGAR", + '3273' => "READY-MIXED CONCRETE", + '6500' => "REAL ESTATE", + '6530' => "REAL ESTATE AGENTS AND MANAGERS", + '6531' => "REAL ESTATE AGENTS AND MANAGERS", + '6798' => "REAL ESTATE INVESTMENT TRUSTS", + '6510' => "REAL ESTATE OPERATORS AND LESSORS", + '6519' => "REAL PROPERTY LESSORS, NEC", + '2493' => "RECONSTITUTED WOOD PRODUCTS", + '5735' => "RECORD & PRERECORDED TAPE STORES", + '5560' => "RECREATIONAL VEHICLE DEALERS", + '5561' => "RECREATIONAL VEHICLE DEALERS", + '4613' => "REFINED PETROLEUM PIPELINES", + '4222' => "REFRIGERATED WAREHOUSING AND STORAGE", + '3585' => "REFRIGERATION AND HEATING EQUIPMENT", + '3580' => "REFRIGERATION AND SERVICE MACHINERY", + '5078' => "REFRIGERATION EQUIPMENT AND SUPPLIES", + '7623' => "REFRIGERATION SERVICE AND REPAIR", + '4953' => "REFUSE SYSTEMS", + '3625' => "RELAYS AND INDUSTRIAL CONTROLS", + '8660' => "RELIGIOUS ORGANIZATIONS", + '8661' => "RELIGIOUS ORGANIZATIONS", + '4740' => "RENTAL OF RAILROAD CARS", + '4741' => "RENTAL OF RAILROAD CARS", + '7699' => "REPAIR SERVICES, NEC", + '8730' => "RESEARCH AND TESTING SERVICES", + '1520' => "RESIDENTIAL BUILDING CONSTRUCTION", + '8360' => "RESIDENTIAL CARE", + '8361' => "RESIDENTIAL CARE", + '1522' => "RESIDENTIAL CONSTRUCTION, NEC", + '3645' => "RESIDENTIAL LIGHTING FIXTURES", + '5460' => "RETAIL BAKERIES", + '5461' => "RETAIL BAKERIES", + '5260' => "RETAIL NURSERIES AND GARDEN STORES", + '5261' => "RETAIL NURSERIES AND GARDEN STORES", + '5990' => "RETAIL STORES, NEC", + '7640' => "REUPHOLSTERY AND FURNITURE REPAIR", + '7641' => "REUPHOLSTERY AND FURNITURE REPAIR", + '0112' => "RICE", + '2044' => "RICE MILLING", + '2095' => "ROASTED COFFEE", + '2384' => "ROBES AND DRESSING GOWNS", + '3547' => "ROLLING MILL MACHINERY", + '5033' => "ROOFING, SIDING, & INSULATION", + '1760' => "ROOFING, SIDING, AND SHEET METAL WORK", + '1761' => "ROOFING, SIDING, AND SHEET METAL WORK", + '7020' => "ROOMING AND BOARDING HOUSES", + '7021' => "ROOMING AND BOARDING HOUSES", + '3052' => "RUBBER & PLASTICS HOSE & BELTING", + '3000' => "RUBBER AND MISC. PLASTICS PRODUCTS", + '3020' => "RUBBER AND PLASTICS FOOTWEAR", + '3021' => "RUBBER AND PLASTICS FOOTWEAR", + '2068' => "SALTED AND ROASTED NUTS AND SEEDS", + '1440' => "SAND AND GRAVEL", + '2656' => "SANITARY FOOD CONTAINERS", + '2676' => "SANITARY PAPER PRODUCTS", + '4950' => "SANITARY SERVICES", + '4959' => "SANITARY SERVICES, NEC", + '2013' => "SAUSAGES AND OTHER PREPARED MEATS", + '6030' => "SAVINGS INSTITUTIONS", + '6036' => "SAVINGS INSTITUTIONS, EXCEPT FEDERAL", + '3425' => "SAW BLADES AND HANDSAWS", + '2420' => "SAWMILLS AND PLANING MILLS", + '2421' => "SAWMILLS AND PLANING MILLS, GENERAL", + '3596' => "SCALES AND BALANCES, EXC. LABORATORY", + '2397' => "SCHIFFLI MACHINE EMBROIDERIES", + '4150' => "SCHOOL BUSES", + '4151' => "SCHOOL BUSES", + '8290' => "SCHOOLS & EDUCATIONAL SERVICES, NEC", + '8299' => "SCHOOLS & EDUCATIONAL SERVICES, NEC", + '5093' => "SCRAP AND WASTE MATERIALS", + '3451' => "SCREW MACHINE PRODUCTS", + '3450' => "SCREW MACHINE PRODUCTS, BOLTS, ETC.", + '3810' => "SEARCH AND NAVIGATION EQUIPMENT", + '3812' => "SEARCH AND NAVIGATION EQUIPMENT", + '3340' => "SECONDARY NONFERROUS METALS", + '3341' => "SECONDARY NONFERROUS METALS", + '7338' => "SECRETARIAL & COURT REPORTING", + '6289' => "SECURITY & COMMODITY SERVICES, NEC", + '6200' => "SECURITY AND COMMODITY BROKERS", + '6230' => "SECURITY AND COMMODITY EXCHANGES", + '6231' => "SECURITY AND COMMODITY EXCHANGES", + '6280' => "SECURITY AND COMMODITY SERVICES", + '6210' => "SECURITY BROKERS AND DEALERS", + '6211' => "SECURITY BROKERS AND DEALERS", + '7382' => "SECURITY SYSTEMS SERVICES", + '3674' => "SEMICONDUCTORS AND RELATED DEVICES", + '3263' => "SEMIVITREOUS TABLE & KITCHENWARE", + '5087' => "SERVICE ESTABLISHMENT EQUIPMENT", + '3589' => "SERVICE INDUSTRY MACHINERY, NEC", + '7819' => "SERVICES ALLIED TO MOTION PICTURES", + '7340' => "SERVICES TO BUILDINGS", + '8999' => "SERVICES, NEC", + '8990' => "SERVICES, NEC", + '8999' => "SERVICES, NEC", + '2652' => "SETUP PAPERBOARD BOXES", + '4952' => "SEWERAGE SYSTEMS", + '5949' => "SEWING, NEEDLEWORK, AND PIECE GOODS", + '0214' => "SHEEP AND GOATS", + '3444' => "SHEET METALWORK", + '0913' => "SHELLFISH", + '3730' => "SHIP AND BOAT BUILDING AND REPAIRING", + '3731' => "SHIP BUILDING AND REPAIRING", + '7250' => "SHOE REPAIR AND SHOESHINE PARLORS", + '7251' => "SHOE REPAIR AND SHOESHINE PARLORS", + '5660' => "SHOE STORES", + '5661' => "SHOE STORES", + '6153' => "SHORT-TERM BUSINESS CREDIT", + '3993' => "SIGNS AND ADVERTISING SPECIALITIES", + '1044' => "SILVER ORES", + '3914' => "SILVERWARE AND PLATED WARE", + '1521' => "SINGLE-FAMILY HOUSING CONSTRUCTION", + '8051' => "SKILLED NURSING CARE FACILITIES", + '3484' => "SMALL ARMS", + '3482' => "SMALL ARMS AMMUNITION", + '2841' => "SOAP AND OTHER DETERGENTS", + '2840' => "SOAP, CLEANERS, AND TOILET GOODS", + '8300' => "SOCIAL SERVICES", + '8390' => "SOCIAL SERVICES, NEC", + '8399' => "SOCIAL SERVICES, NEC", + '2436' => "SOFTWOOD VENEER AND PLYWOOD", + '0710' => "SOIL PREPARATION SERVICES", + '0711' => "SOIL PREPARATION SERVICES", + '2075' => "SOYBEAN OIL MILLS", + '0116' => "SOYBEANS", + '3764' => "SPACE PROPULSION UNITS AND PARTS", + '3769' => "SPACE VEHICLE EQUIPMENT, NEC", + '3544' => "SPECIAL DIES, TOOLS, JIGS & FIXTURES", + '3550' => "SPECIAL INDUSTRY MACHINERY", + '3559' => "SPECIAL INDUSTRY MACHINERY, NEC", + '2429' => "SPECIAL PRODUCT SAWMILLS, NEC", + '1700' => "SPECIAL TRADE CONTRACTORS", + '1799' => "SPECIAL TRADE CONTRACTORS, NEC", + '4226' => "SPECIAL WAREHOUSING AND STORAGE, NEC", + '8069' => "SPECIALTY HOSPITALS EXC. PSYCHIATRIC", + '8093' => "SPECIALTY OUTPATIENT CLINICS, NEC", + '3566' => "SPEED CHANGERS, DRIVES, AND GEARS", + '5091' => "SPORTING & RECREATIONAL GOODS", + '3949' => "SPORTING AND ATHLETIC GOODS, NEC", + '7032' => "SPORTING AND RECREATIONAL CAMPS", + '5941' => "SPORTING GOODS AND BICYCLE SHOPS", + '7941' => "SPORTS CLUBS, MANAGERS, & PROMOTERS", + '6022' => "STATE COMMERCIAL BANKS", + '6062' => "STATE CREDIT UNIONS", + '5112' => "STATIONERY AND OFFICE SUPPLIES", + '2678' => "STATIONERY PRODUCTS", + '5943' => "STATIONERY STORES", + '4960' => "STEAM AND AIR-CONDITIONING SUPPLY", + '4961' => "STEAM AND AIR-CONDITIONING SUPPLY", + '3325' => "STEEL FOUNDRIES, NEC", + '3324' => "STEEL INVESTMENT FOUNDRIES", + '3317' => "STEEL PIPE AND TUBES", + '3493' => "STEEL SPRINGS, EXCEPT WIRE", + '3315' => "STEEL WIRE AND RELATED PRODUCTS", + '3200' => "STONE, CLAY, AND GLASS PRODUCTS", + '3691' => "STORAGE BATTERIES", + '3250' => "STRUCTURAL CLAY PRODUCTS", + '3259' => "STRUCTURAL CLAY PRODUCTS, NEC", + '1791' => "STRUCTURAL STEEL ERECTION", + '2439' => "STRUCTURAL WOOD MEMBERS, NEC", + '6550' => "SUBDIVIDERS AND DEVELOPERS", + '6552' => "SUBDIVIDERS AND DEVELOPERS, NEC", + '2060' => "SUGAR AND CONFECTIONERY PRODUCTS", + '0133' => "SUGARCANE AND SUGAR BEETS", + '6350' => "SURETY INSURANCE", + '6351' => "SURETY INSURANCE", + '2843' => "SURFACE ACTIVE AGENTS", + '3841' => "SURGICAL AND MEDICAL INSTRUMENTS", + '3842' => "SURGICAL APPLIANCES AND SUPPLIES", + '8713' => "SURVEYING SERVICES", + '3613' => "SWITCHGEAR AND SWITCHBOARD APPARATUS", + '4013' => "SWITCHING AND TERMINAL SERVICES", + '2822' => "SYNTHETIC RUBBER", + '3795' => "TANKS AND TANK COMPONENTS", + '7291' => "TAX RETURN PREPARATION SERVICES", + '4120' => "TAXICABS", + '4121' => "TAXICABS", + '4820' => "TELEGRAPH & OTHER COMMUNICATIONS", + '4822' => "TELEGRAPH & OTHER COMMUNICATIONS", + '3661' => "TELEPHONE AND TELEGRAPH APPARATUS", + '4810' => "TELEPHONE COMMUNICATION", + '4813' => "TELEPHONE COMMUNICATIONS, EXC. RADIO", + '4833' => "TELEVISION BROADCASTING STATIONS", + '1743' => "TERRAZZO, TILE, MARBLE, MOSAIC WORK", + '8734' => "TESTING LABORATORIES", + '2393' => "TEXTILE BAGS", + '2260' => "TEXTILE FINISHING, EXCEPT WOOL", + '2299' => "TEXTILE GOODS, NEC", + '3552' => "TEXTILE MACHINERY", + '2200' => "TEXTILE MILL PRODUCTS", + '7922' => "THEATRICAL PRODUCERS AND SERVICES", + '2284' => "THREAD MILLS", + '2282' => "THROWING AND WINDING MILLS", + '0810' => "TIMBER TRACTS", + '0811' => "TIMBER TRACTS", + '2296' => "TIRE CORD AND FABRICS", + '7534' => "TIRE RETREADING AND REPAIR SHOPS", + '3010' => "TIRES AND INNER TUBES", + '3011' => "TIRES AND INNER TUBES", + '5014' => "TIRES AND TUBES", + '6540' => "TITLE ABSTRACT OFFICES", + '6541' => "TITLE ABSTRACT OFFICES", + '6360' => "TITLE INSURANCE", + '6361' => "TITLE INSURANCE", + '0132' => "TOBACCO", + '5194' => "TOBACCO AND TOBACCO PRODUCTS", + '2100' => "TOBACCO PRODUCTS", + '2140' => "TOBACCO STEMMING AND REDRYING", + '2141' => "TOBACCO STEMMING AND REDRYING", + '5993' => "TOBACCO STORES AND STANDS", + '2844' => "TOILET PREPARATIONS", + '7532' => "TOP & BODY REPAIR & PAINT SHOPS", + '4725' => "TOUR OPERATORS", + '4492' => "TOWING AND TUGBOAT SERVICE", + '5092' => "TOYS AND HOBBY GOODS AND SUPPLIES", + '3940' => "TOYS AND SPORTING GOODS", + '7033' => "TRAILER PARKS AND CAMPSITES", + '3612' => "TRANSFORMERS, EXCEPT ELECTRONIC", + '4500' => "TRANSPORTATION BY AIR", + '3700' => "TRANSPORTATION EQUIPMENT", + '5088' => "TRANSPORTATION EQUIPMENT & SUPPLIES", + '3799' => "TRANSPORTATION EQUIPMENT, NEC", + '4700' => "TRANSPORTATION SERVICES", + '4789' => "TRANSPORTATION SERVICES, NEC", + '4724' => "TRAVEL AGENCIES", + '3792' => "TRAVEL TRAILERS AND CAMPERS", + '0173' => "TREE NUTS", + '3713' => "TRUCK AND BUS BODIES", + '7513' => "TRUCK RENTAL AND LEASING, NO DRIVERS", + '3715' => "TRUCK TRAILERS", + '4210' => "TRUCKING & COURIER SERVICES, EX. AIR", + '4200' => "TRUCKING AND WAREHOUSING", + '4230' => "TRUCKING TERMINAL FACILITIES", + '4231' => "TRUCKING TERMINAL FACILITIES", + '4213' => "TRUCKING, EXCEPT LOCAL", + '6730' => "TRUSTS", + '6733' => "TRUSTS, NEC", + '3511' => "TURBINES AND TURBINE GENERATOR SETS", + '0253' => "TURKEYS AND TURKEY EGGS", + '2791' => "TYPESETTING", + '4300' => "U.S. POSTAL SERVICE", + '4310' => "U.S. POSTAL SERVICE", + '4311' => "U.S. POSTAL SERVICE", + '3081' => "UNSUPPORTED PLASTICS FILM & SHEET", + '3082' => "UNSUPPORTED PLASTICS PROFILE SHAPES", + '2512' => "UPHOLSTERED HOUSEHOLD FURNITURE", + '1094' => "URANIUM-RADIUM-VANADIUM ORES", + '5520' => "USED CAR DEALERS", + '5521' => "USED CAR DEALERS", + '5930' => "USED MERCHANDISE STORES", + '5932' => "USED MERCHANDISE STORES", + '7519' => "UTILITY TRAILER RENTAL", + '3494' => "VALVES AND PIPE FITTINGS, NEC", + '5330' => "VARIETY STORES", + '5331' => "VARIETY STORES", + '2076' => "VEGETABLE OIL MILLS, NEC", + '0160' => "VEGETABLES AND MELONS", + '0161' => "VEGETABLES AND MELONS", + '3647' => "VEHICULAR LIGHTING EQUIPMENT", + '0740' => "VETERINARY SERVICES", + '0741' => "VETERINARY SERVICES FOR LIVESTOCK", + '0742' => "VETERINARY SERVICES, SPECIALTIES", + '7840' => "VIDEO TAPE RENTAL", + '7841' => "VIDEO TAPE RENTAL", + '3262' => "VITREOUS CHINA TABLE & KITCHENWARE", + '3261' => "VITREOUS PLUMBING FIXTURES", + '8240' => "VOCATIONAL SCHOOLS", + '8249' => "VOCATIONAL SCHOOLS, NEC", + '5075' => "WARM AIR HEATING & AIR-CONDITIONING", + '7630' => "WATCH, CLOCK, AND JEWELRY REPAIR", + '7631' => "WATCH, CLOCK, AND JEWELRY REPAIR", + '3870' => "WATCHES, CLOCKS, WATCHCASES & PARTS", + '3873' => "WATCHES, CLOCKS, WATCHCASES & PARTS", + '4489' => "WATER PASSENGER TRANSPORTATION, NEC", + '4940' => "WATER SUPPLY", + '4941' => "WATER SUPPLY", + '4400' => "WATER TRANSPORTATION", + '4440' => "WATER TRANSPORTATION OF FREIGHT, NEC", + '4449' => "WATER TRANSPORTATION OF FREIGHT, NEC", + '4480' => "WATER TRANSPORTATION OF PASSENGERS", + '4490' => "WATER TRANSPORTATION SERVICES", + '4499' => "WATER TRANSPORTATION SERVICES, NEC", + '1780' => "WATER WELL DRILLING", + '1781' => "WATER WELL DRILLING", + '1623' => "WATER, SEWER, AND UTILITY LINES", + '2385' => "WATERPROOF OUTERWEAR", + '2257' => "WEFT KNIT FABRIC MILLS", + '3548' => "WELDING APPARATUS", + '7692' => "WELDING REPAIR", + '2046' => "WET CORN MILLING", + '5000' => "WHOLESALE TRADE^DURABLE GOODS", + '5100' => "WHOLESALE TRADE^NONDURABLE GOODS", + '5182' => "WINE AND DISTILLED BEVERAGES", + '2084' => "WINES, BRANDY, AND BRANDY SPIRITS", + '3495' => "WIRE SPRINGS", + '2331' => "WOMEN'S & MISSES' BLOUSES & SHIRTS", + '5630' => "WOMEN'S ACCESSORY & SPECIALTY STORES", + '5632' => "WOMEN'S ACCESSORY & SPECIALTY STORES", + '5137' => "WOMEN'S AND CHILDREN'S CLOTHING", + '2340' => "WOMEN'S AND CHILDREN'S UNDERGARMENTS", + '2341' => "WOMEN'S AND CHILDREN'S UNDERWEAR", + '2330' => "WOMEN'S AND MISSES' OUTERWEAR", + '2339' => "WOMEN'S AND MISSES' OUTERWEAR, NEC", + '2337' => "WOMEN'S AND MISSES' SUITS AND COATS", + '5620' => "WOMEN'S CLOTHING STORES", + '5621' => "WOMEN'S CLOTHING STORES", + '3144' => "WOMEN'S FOOTWEAR, EXCEPT ATHLETIC", + '3171' => "WOMEN'S HANDBAGS AND PURSES", + '2251' => "WOMEN'S HOSIERY, EXCEPT SOCKS", + '2335' => "WOMEN'S, JUNIOR'S, & MISSES' DRESSES", + '2450' => "WOOD BUILDINGS AND MOBILE HOMES", + '2440' => "WOOD CONTAINERS", + '2449' => "WOOD CONTAINERS, NEC", + '2511' => "WOOD HOUSEHOLD FURNITURE", + '2434' => "WOOD KITCHEN CABINETS", + '2521' => "WOOD OFFICE FURNITURE", + '2448' => "WOOD PALLETS AND SKIDS", + '2541' => "WOOD PARTITIONS AND FIXTURES", + '2491' => "WOOD PRESERVING", + '2499' => "WOOD PRODUCTS, NEC", + '2517' => "WOOD TV AND RADIO CABINETS", + '3553' => "WOODWORKING MACHINERY", + '1795' => "WRECKING AND DEMOLITION WORK", + '3844' => "X-RAY APPARATUS AND TUBES", + '2280' => "YARN AND THREAD MILLS", + '2281' => "YARN SPINNING MILLS" + } + + end +end + diff --git a/test/fixtures/banking.ofx.sgml b/test/fixtures/banking.ofx.sgml new file mode 100644 index 0000000..026b77b --- /dev/null +++ b/test/fixtures/banking.ofx.sgml @@ -0,0 +1,87 @@ +OFXHEADER:100 +DATA:OFXSGML +VERSION:102 +SECURITY:NONE +ENCODING:USASCII +CHARSET:1252 +COMPRESSION:NONE +OLDFILEUID:NONE +NEWFILEUID:NONE + + + + + + 0 + INFO + The user is authentic; operation succeeded. + + 20070623142635.169[-5:CDT] + ENG + + U.S. Bank + 1402 + + 1402 + + + + + 9C24229A0077EAA50000011353C9E00743FC + + 0 + INFO + + + USD + + 033000033 + 103333333333 + CHECKING + + + 20070604190000.000[-5:CDT] + 20070622190000.000[-5:CDT] + + PAYMENT + 20070606120000.000 + -11.11 + 11111111 22 + WEB AUTHORIZED PMT FOO INC + Download from usbank.com. FOO INC + + + CHECK + 20070607120000.000 + -111.11 + 22222A + 0000009611 + CHECK + Download from usbank.com. + + + DIRECTDEP + 20070614120000.000 + 1111.11 + X34AE33 + ELECTRONIC DEPOSIT BAR INC + Download from usbank.com. BAR INC + + + CREDIT + 20070619120000.000 + 11.11 + 8 8 9089743 + ATM DEPOSIT US BANK ANYTOWNAS + Download from usbank.com. US BANK ANYTOWN ASUS1 + + + + 1234.09 + 20070623142635.369[-5:CDT] + + + + + + diff --git a/test/fixtures/creditcard.ofx.sgml b/test/fixtures/creditcard.ofx.sgml new file mode 100644 index 0000000..07bba18 --- /dev/null +++ b/test/fixtures/creditcard.ofx.sgml @@ -0,0 +1,79 @@ +OFXHEADER:100 +DATA:OFXSGML +VERSION:102 +SECURITY:NONE +ENCODING:USASCII +CHARSET:1252 +COMPRESSION:NONE +OLDFILEUID:NONE +NEWFILEUID:NONE + + + + + + 0 + INFO + + 20070623192010 + ENG + + Citigroup + 24909 + + 24909 + + + + + 0 + + 0 + INFO + + + USD + + XXXXXXXXXXXX1111 + + + 20070509120000 + 20070608120000 + + DEBIT + 20070510170000 + -19.17 + xx + 5912 + WALGREEN 34638675 ANYTOWN + + + DEBIT + 20070512170000 + -12.0 + yy-56 + 7933 + SUNSET BOWL ANYTOWN + + + CREDIT + 20070526170000 + 11.01 + 78-9 + 0000 + ELECTRONIC PAYMENT-THANK YOU + + + + -1111.01 + 20070623192013 + + + 19000.99 + 20070623192013 + + + + + + diff --git a/test/fixtures/with_spaces.ofx.sgml b/test/fixtures/with_spaces.ofx.sgml new file mode 100644 index 0000000..7bae080 --- /dev/null +++ b/test/fixtures/with_spaces.ofx.sgml @@ -0,0 +1,28 @@ +OFXHEADER:100 +DATA:OFXSGML +VERSION:102 +SECURITY:NONE +ENCODING:USASCII +CHARSET:1252 +COMPRESSION:NONE +OLDFILEUID:NONE +NEWFILEUID:NONE + + + + + + 0 + INFO + The user is authentic; operation succeeded. + + 20070623142635.169[-5:CDT] + ENG + + U.S. Bank + 1402 + + 1402 + + + diff --git a/test/test_ofx_parser.rb b/test/test_ofx_parser.rb new file mode 100644 index 0000000..43d1ab8 --- /dev/null +++ b/test/test_ofx_parser.rb @@ -0,0 +1,244 @@ +require 'test/unit' +require 'ofx-parser' + +class OfxParserTest < Test::Unit::TestCase + + OFX_FILES = {} + + fixtures_dir = File.dirname(__FILE__) + '/fixtures' + + # Load up the xml files + Dir.open(fixtures_dir).each do |fn| + next unless fn =~ /\.ofx\.sgml$/ + OFX_FILES[fn.scan(/^[^.]*/).to_s.to_sym] = File.read(fixtures_dir + "/#{fn}") + end + + def setup + # empty ofx parser - useful for testing other methods independently + @parser = OfxParser::OfxParser + end + + def test_pre_process_strips_spaces + header, body = @parser.pre_process(OFX_FILES[:with_spaces]) + + assert_no_match(/>\s+.*?.*?\s+\s+ -111, + '-11.110' => -1111, + '-11.11101' => -1111, + '11.11' => 1111, + '11,11' => 1111, + '1' => 100, + '1.0' => 100, + '-1.0' => -100, + '' => nil + } + + x = X.new + + amounts.each do |actual, expected| + x.amount = actual + assert_equal expected, x.amount_in_pennies, "#{actual.inspect} should give #{expected.inspect}" + end + end + +end \ No newline at end of file