+++ /dev/null
-{
- "01001": "Autauga, AL",
- "01003": "Baldwin, AL",
- "01005": "Barbour, AL",
- "01007": "Bibb, AL",
- "01009": "Blount, AL",
- "01011": "Bullock, AL",
- "01013": "Butler, AL",
- "01015": "Calhoun, AL",
- "01017": "Chambers, AL",
- "01019": "Cherokee, AL",
- "01021": "Chilton, AL",
- "01023": "Choctaw, AL",
- "01025": "Clarke, AL",
- "01027": "Clay, AL",
- "01029": "Cleburne, AL",
- "01031": "Coffee, AL",
- "01033": "Colbert, AL",
- "01035": "Conecuh, AL",
- "01037": "Coosa, AL",
- "01039": "Covington, AL",
- "01041": "Crenshaw, AL",
- "01043": "Cullman, AL",
- "01045": "Dale, AL",
- "01047": "Dallas, AL",
- "01049": "DeKalb, AL",
- "01051": "Elmore, AL",
- "01053": "Escambia, AL",
- "01055": "Etowah, AL",
- "01057": "Fayette, AL",
- "01059": "Franklin, AL",
- "01061": "Geneva, AL",
- "01063": "Greene, AL",
- "01065": "Hale, AL",
- "01067": "Henry, AL",
- "01069": "Houston, AL",
- "01071": "Jackson, AL",
- "01073": "Jefferson, AL",
- "01075": "Lamar, AL",
- "01077": "Lauderdale, AL",
- "01079": "Lawrence, AL",
- "01081": "Lee, AL",
- "01083": "Limestone, AL",
- "01085": "Lowndes, AL",
- "01087": "Macon, AL",
- "01089": "Madison, AL",
- "01091": "Marengo, AL",
- "01093": "Marion, AL",
- "01095": "Marshall, AL",
- "01097": "Mobile, AL",
- "01099": "Monroe, AL",
- "01101": "Montgomery, AL",
- "01103": "Morgan, AL",
- "01105": "Perry, AL",
- "01107": "Pickens, AL",
- "01109": "Pike, AL",
- "01111": "Randolph, AL",
- "01113": "Russell, AL",
- "01115": "St. Clair, AL",
- "01117": "Shelby, AL",
- "01119": "Sumter, AL",
- "01121": "Talladega, AL",
- "01123": "Tallapoosa, AL",
- "01125": "Tuscaloosa, AL",
- "01127": "Walker, AL",
- "01129": "Washington, AL",
- "01131": "Wilcox, AL",
- "01133": "Winston, AL",
- "02013": "Aleutians East, AK",
- "02016": "Aleutians West, AK",
- "02020": "Anchorage, AK",
- "02050": "Bethel, AK",
- "02060": "Bristol Bay, AK",
- "02068": "Denali, AK",
- "02070": "Dillingham, AK",
- "02090": "Fairbanks North Star, AK",
- "02100": "Haines, AK",
- "02105": "Hoonah-Angoon, AK",
- "02110": "Juneau, AK",
- "02122": "Kenai Peninsula, AK",
- "02130": "Ketchikan Gateway, AK",
- "02150": "Kodiak Island, AK",
- "02164": "Lake and Peninsula, AK",
- "02170": "Matanuska-Susitna, AK",
- "02180": "Nome, AK",
- "02185": "North Slope, AK",
- "02188": "Northwest Arctic, AK",
- "02195": "Petersburg, AK",
- "02198": "Prince of Wales-Hyder, AK",
- "02220": "Sitka, AK",
- "02230": "Skagway, AK",
- "02240": "Southeast Fairbanks, AK",
- "02261": "Valdez-Cordova, AK",
- "02270": "Wade Hampton, AK",
- "02275": "Wrangell, AK",
- "02282": "Yakutat, AK",
- "02290": "Yukon-Koyukuk, AK",
- "04001": "Apache, AZ",
- "04003": "Cochise, AZ",
- "04005": "Coconino, AZ",
- "04007": "Gila, AZ",
- "04009": "Graham, AZ",
- "04011": "Greenlee, AZ",
- "04012": "La Paz, AZ",
- "04013": "Maricopa, AZ",
- "04015": "Mohave, AZ",
- "04017": "Navajo, AZ",
- "04019": "Pima, AZ",
- "04021": "Pinal, AZ",
- "04023": "Santa Cruz, AZ",
- "04025": "Yavapai, AZ",
- "04027": "Yuma, AZ",
- "05001": "Arkansas, AR",
- "05003": "Ashley, AR",
- "05005": "Baxter, AR",
- "05007": "Benton, AR",
- "05009": "Boone, AR",
- "05011": "Bradley, AR",
- "05013": "Calhoun, AR",
- "05015": "Carroll, AR",
- "05017": "Chicot, AR",
- "05019": "Clark, AR",
- "05021": "Clay, AR",
- "05023": "Cleburne, AR",
- "05025": "Cleveland, AR",
- "05027": "Columbia, AR",
- "05029": "Conway, AR",
- "05031": "Craighead, AR",
- "05033": "Crawford, AR",
- "05035": "Crittenden, AR",
- "05037": "Cross, AR",
- "05039": "Dallas, AR",
- "05041": "Desha, AR",
- "05043": "Drew, AR",
- "05045": "Faulkner, AR",
- "05047": "Franklin, AR",
- "05049": "Fulton, AR",
- "05051": "Garland, AR",
- "05053": "Grant, AR",
- "05055": "Greene, AR",
- "05057": "Hempstead, AR",
- "05059": "Hot Spring, AR",
- "05061": "Howard, AR",
- "05063": "Independence, AR",
- "05065": "Izard, AR",
- "05067": "Jackson, AR",
- "05069": "Jefferson, AR",
- "05071": "Johnson, AR",
- "05073": "Lafayette, AR",
- "05075": "Lawrence, AR",
- "05077": "Lee, AR",
- "05079": "Lincoln, AR",
- "05081": "Little River, AR",
- "05083": "Logan, AR",
- "05085": "Lonoke, AR",
- "05087": "Madison, AR",
- "05089": "Marion, AR",
- "05091": "Miller, AR",
- "05093": "Mississippi, AR",
- "05095": "Monroe, AR",
- "05097": "Montgomery, AR",
- "05099": "Nevada, AR",
- "05101": "Newton, AR",
- "05103": "Ouachita, AR",
- "05105": "Perry, AR",
- "05107": "Phillips, AR",
- "05109": "Pike, AR",
- "05111": "Poinsett, AR",
- "05113": "Polk, AR",
- "05115": "Pope, AR",
- "05117": "Prairie, AR",
- "05119": "Pulaski, AR",
- "05121": "Randolph, AR",
- "05123": "St. Francis, AR",
- "05125": "Saline, AR",
- "05127": "Scott, AR",
- "05129": "Searcy, AR",
- "05131": "Sebastian, AR",
- "05133": "Sevier, AR",
- "05135": "Sharp, AR",
- "05137": "Stone, AR",
- "05139": "Union, AR",
- "05141": "Van Buren, AR",
- "05143": "Washington, AR",
- "05145": "White, AR",
- "05147": "Woodruff, AR",
- "05149": "Yell, AR",
- "06001": "Alameda, CA",
- "06003": "Alpine, CA",
- "06005": "Amador, CA",
- "06007": "Butte, CA",
- "06009": "Calaveras, CA",
- "06011": "Colusa, CA",
- "06013": "Contra Costa, CA",
- "06015": "Del Norte, CA",
- "06017": "El Dorado, CA",
- "06019": "Fresno, CA",
- "06021": "Glenn, CA",
- "06023": "Humboldt, CA",
- "06025": "Imperial, CA",
- "06027": "Inyo, CA",
- "06029": "Kern, CA",
- "06031": "Kings, CA",
- "06033": "Lake, CA",
- "06035": "Lassen, CA",
- "06037": "Los Angeles, CA",
- "06039": "Madera, CA",
- "06041": "Marin, CA",
- "06043": "Mariposa, CA",
- "06045": "Mendocino, CA",
- "06047": "Merced, CA",
- "06049": "Modoc, CA",
- "06051": "Mono, CA",
- "06053": "Monterey, CA",
- "06055": "Napa, CA",
- "06057": "Nevada, CA",
- "06059": "Orange, CA",
- "06061": "Placer, CA",
- "06063": "Plumas, CA",
- "06065": "Riverside, CA",
- "06067": "Sacramento, CA",
- "06069": "San Benito, CA",
- "06071": "San Bernardino, CA",
- "06073": "San Diego, CA",
- "06075": "San Francisco, CA",
- "06077": "San Joaquin, CA",
- "06079": "San Luis Obispo, CA",
- "06081": "San Mateo, CA",
- "06083": "Santa Barbara, CA",
- "06085": "Santa Clara, CA",
- "06087": "Santa Cruz, CA",
- "06089": "Shasta, CA",
- "06091": "Sierra, CA",
- "06093": "Siskiyou, CA",
- "06095": "Solano, CA",
- "06097": "Sonoma, CA",
- "06099": "Stanislaus, CA",
- "06101": "Sutter, CA",
- "06103": "Tehama, CA",
- "06105": "Trinity, CA",
- "06107": "Tulare, CA",
- "06109": "Tuolumne, CA",
- "06111": "Ventura, CA",
- "06113": "Yolo, CA",
- "06115": "Yuba, CA",
- "08001": "Adams, CO",
- "08003": "Alamosa, CO",
- "08005": "Arapahoe, CO",
- "08007": "Archuleta, CO",
- "08009": "Baca, CO",
- "08011": "Bent, CO",
- "08013": "Boulder, CO",
- "08014": "Broomfield, CO",
- "08015": "Chaffee, CO",
- "08017": "Cheyenne, CO",
- "08019": "Clear Creek, CO",
- "08021": "Conejos, CO",
- "08023": "Costilla, CO",
- "08025": "Crowley, CO",
- "08027": "Custer, CO",
- "08029": "Delta, CO",
- "08031": "Denver, CO",
- "08033": "Dolores, CO",
- "08035": "Douglas, CO",
- "08037": "Eagle, CO",
- "08039": "Elbert, CO",
- "08041": "El Paso, CO",
- "08043": "Fremont, CO",
- "08045": "Garfield, CO",
- "08047": "Gilpin, CO",
- "08049": "Grand, CO",
- "08051": "Gunnison, CO",
- "08053": "Hinsdale, CO",
- "08055": "Huerfano, CO",
- "08057": "Jackson, CO",
- "08059": "Jefferson, CO",
- "08061": "Kiowa, CO",
- "08063": "Kit Carson, CO",
- "08065": "Lake, CO",
- "08067": "La Plata, CO",
- "08069": "Larimer, CO",
- "08071": "Las Animas, CO",
- "08073": "Lincoln, CO",
- "08075": "Logan, CO",
- "08077": "Mesa, CO",
- "08079": "Mineral, CO",
- "08081": "Moffat, CO",
- "08083": "Montezuma, CO",
- "08085": "Montrose, CO",
- "08087": "Morgan, CO",
- "08089": "Otero, CO",
- "08091": "Ouray, CO",
- "08093": "Park, CO",
- "08095": "Phillips, CO",
- "08097": "Pitkin, CO",
- "08099": "Prowers, CO",
- "08101": "Pueblo, CO",
- "08103": "Rio Blanco, CO",
- "08105": "Rio Grande, CO",
- "08107": "Routt, CO",
- "08109": "Saguache, CO",
- "08111": "San Juan, CO",
- "08113": "San Miguel, CO",
- "08115": "Sedgwick, CO",
- "08117": "Summit, CO",
- "08119": "Teller, CO",
- "08121": "Washington, CO",
- "08123": "Weld, CO",
- "08125": "Yuma, CO",
- "09001": "Fairfield, CT",
- "09003": "Hartford, CT",
- "09005": "Litchfield, CT",
- "09007": "Middlesex, CT",
- "09009": "New Haven, CT",
- "09011": "New London, CT",
- "09013": "Tolland, CT",
- "09015": "Windham, CT",
- "10001": "Kent, DE",
- "10003": "New Castle, DE",
- "10005": "Sussex, DE",
- "11001": "District of Columbia, DC",
- "12001": "Alachua, FL",
- "12003": "Baker, FL",
- "12005": "Bay, FL",
- "12007": "Bradford, FL",
- "12009": "Brevard, FL",
- "12011": "Broward, FL",
- "12013": "Calhoun, FL",
- "12015": "Charlotte, FL",
- "12017": "Citrus, FL",
- "12019": "Clay, FL",
- "12021": "Collier, FL",
- "12023": "Columbia, FL",
- "12027": "DeSoto, FL",
- "12029": "Dixie, FL",
- "12031": "Duval, FL",
- "12033": "Escambia, FL",
- "12035": "Flagler, FL",
- "12037": "Franklin, FL",
- "12039": "Gadsden, FL",
- "12041": "Gilchrist, FL",
- "12043": "Glades, FL",
- "12045": "Gulf, FL",
- "12047": "Hamilton, FL",
- "12049": "Hardee, FL",
- "12051": "Hendry, FL",
- "12053": "Hernando, FL",
- "12055": "Highlands, FL",
- "12057": "Hillsborough, FL",
- "12059": "Holmes, FL",
- "12061": "Indian River, FL",
- "12063": "Jackson, FL",
- "12065": "Jefferson, FL",
- "12067": "Lafayette, FL",
- "12069": "Lake, FL",
- "12071": "Lee, FL",
- "12073": "Leon, FL",
- "12075": "Levy, FL",
- "12077": "Liberty, FL",
- "12079": "Madison, FL",
- "12081": "Manatee, FL",
- "12083": "Marion, FL",
- "12085": "Martin, FL",
- "12086": "Miami-Dade, FL",
- "12087": "Monroe, FL",
- "12089": "Nassau, FL",
- "12091": "Okaloosa, FL",
- "12093": "Okeechobee, FL",
- "12095": "Orange, FL",
- "12097": "Osceola, FL",
- "12099": "Palm Beach, FL",
- "12101": "Pasco, FL",
- "12103": "Pinellas, FL",
- "12105": "Polk, FL",
- "12107": "Putnam, FL",
- "12109": "St. Johns, FL",
- "12111": "St. Lucie, FL",
- "12113": "Santa Rosa, FL",
- "12115": "Sarasota, FL",
- "12117": "Seminole, FL",
- "12119": "Sumter, FL",
- "12121": "Suwannee, FL",
- "12123": "Taylor, FL",
- "12125": "Union, FL",
- "12127": "Volusia, FL",
- "12129": "Wakulla, FL",
- "12131": "Walton, FL",
- "12133": "Washington, FL",
- "13001": "Appling, GA",
- "13003": "Atkinson, GA",
- "13005": "Bacon, GA",
- "13007": "Baker, GA",
- "13009": "Baldwin, GA",
- "13011": "Banks, GA",
- "13013": "Barrow, GA",
- "13015": "Bartow, GA",
- "13017": "Ben Hill, GA",
- "13019": "Berrien, GA",
- "13021": "Bibb, GA",
- "13023": "Bleckley, GA",
- "13025": "Brantley, GA",
- "13027": "Brooks, GA",
- "13029": "Bryan, GA",
- "13031": "Bulloch, GA",
- "13033": "Burke, GA",
- "13035": "Butts, GA",
- "13037": "Calhoun, GA",
- "13039": "Camden, GA",
- "13043": "Candler, GA",
- "13045": "Carroll, GA",
- "13047": "Catoosa, GA",
- "13049": "Charlton, GA",
- "13051": "Chatham, GA",
- "13053": "Chattahoochee, GA",
- "13055": "Chattooga, GA",
- "13057": "Cherokee, GA",
- "13059": "Clarke, GA",
- "13061": "Clay, GA",
- "13063": "Clayton, GA",
- "13065": "Clinch, GA",
- "13067": "Cobb, GA",
- "13069": "Coffee, GA",
- "13071": "Colquitt, GA",
- "13073": "Columbia, GA",
- "13075": "Cook, GA",
- "13077": "Coweta, GA",
- "13079": "Crawford, GA",
- "13081": "Crisp, GA",
- "13083": "Dade, GA",
- "13085": "Dawson, GA",
- "13087": "Decatur, GA",
- "13089": "DeKalb, GA",
- "13091": "Dodge, GA",
- "13093": "Dooly, GA",
- "13095": "Dougherty, GA",
- "13097": "Douglas, GA",
- "13099": "Early, GA",
- "13101": "Echols, GA",
- "13103": "Effingham, GA",
- "13105": "Elbert, GA",
- "13107": "Emanuel, GA",
- "13109": "Evans, GA",
- "13111": "Fannin, GA",
- "13113": "Fayette, GA",
- "13115": "Floyd, GA",
- "13117": "Forsyth, GA",
- "13119": "Franklin, GA",
- "13121": "Fulton, GA",
- "13123": "Gilmer, GA",
- "13125": "Glascock, GA",
- "13127": "Glynn, GA",
- "13129": "Gordon, GA",
- "13131": "Grady, GA",
- "13133": "Greene, GA",
- "13135": "Gwinnett, GA",
- "13137": "Habersham, GA",
- "13139": "Hall, GA",
- "13141": "Hancock, GA",
- "13143": "Haralson, GA",
- "13145": "Harris, GA",
- "13147": "Hart, GA",
- "13149": "Heard, GA",
- "13151": "Henry, GA",
- "13153": "Houston, GA",
- "13155": "Irwin, GA",
- "13157": "Jackson, GA",
- "13159": "Jasper, GA",
- "13161": "Jeff Davis, GA",
- "13163": "Jefferson, GA",
- "13165": "Jenkins, GA",
- "13167": "Johnson, GA",
- "13169": "Jones, GA",
- "13171": "Lamar, GA",
- "13173": "Lanier, GA",
- "13175": "Laurens, GA",
- "13177": "Lee, GA",
- "13179": "Liberty, GA",
- "13181": "Lincoln, GA",
- "13183": "Long, GA",
- "13185": "Lowndes, GA",
- "13187": "Lumpkin, GA",
- "13189": "McDuffie, GA",
- "13191": "McIntosh, GA",
- "13193": "Macon, GA",
- "13195": "Madison, GA",
- "13197": "Marion, GA",
- "13199": "Meriwether, GA",
- "13201": "Miller, GA",
- "13205": "Mitchell, GA",
- "13207": "Monroe, GA",
- "13209": "Montgomery, GA",
- "13211": "Morgan, GA",
- "13213": "Murray, GA",
- "13215": "Muscogee, GA",
- "13217": "Newton, GA",
- "13219": "Oconee, GA",
- "13221": "Oglethorpe, GA",
- "13223": "Paulding, GA",
- "13225": "Peach, GA",
- "13227": "Pickens, GA",
- "13229": "Pierce, GA",
- "13231": "Pike, GA",
- "13233": "Polk, GA",
- "13235": "Pulaski, GA",
- "13237": "Putnam, GA",
- "13239": "Quitman, GA",
- "13241": "Rabun, GA",
- "13243": "Randolph, GA",
- "13245": "Richmond, GA",
- "13247": "Rockdale, GA",
- "13249": "Schley, GA",
- "13251": "Screven, GA",
- "13253": "Seminole, GA",
- "13255": "Spalding, GA",
- "13257": "Stephens, GA",
- "13259": "Stewart, GA",
- "13261": "Sumter, GA",
- "13263": "Talbot, GA",
- "13265": "Taliaferro, GA",
- "13267": "Tattnall, GA",
- "13269": "Taylor, GA",
- "13271": "Telfair, GA",
- "13273": "Terrell, GA",
- "13275": "Thomas, GA",
- "13277": "Tift, GA",
- "13279": "Toombs, GA",
- "13281": "Towns, GA",
- "13283": "Treutlen, GA",
- "13285": "Troup, GA",
- "13287": "Turner, GA",
- "13289": "Twiggs, GA",
- "13291": "Union, GA",
- "13293": "Upson, GA",
- "13295": "Walker, GA",
- "13297": "Walton, GA",
- "13299": "Ware, GA",
- "13301": "Warren, GA",
- "13303": "Washington, GA",
- "13305": "Wayne, GA",
- "13307": "Webster, GA",
- "13309": "Wheeler, GA",
- "13311": "White, GA",
- "13313": "Whitfield, GA",
- "13315": "Wilcox, GA",
- "13317": "Wilkes, GA",
- "13319": "Wilkinson, GA",
- "13321": "Worth, GA",
- "15001": "Hawaii, HI",
- "15003": "Honolulu, HI",
- "15005": "Kalawao, HI",
- "15007": "Kauai, HI",
- "15009": "Maui, HI",
- "16001": "Ada, ID",
- "16003": "Adams, ID",
- "16005": "Bannock, ID",
- "16007": "Bear Lake, ID",
- "16009": "Benewah, ID",
- "16011": "Bingham, ID",
- "16013": "Blaine, ID",
- "16015": "Boise, ID",
- "16017": "Bonner, ID",
- "16019": "Bonneville, ID",
- "16021": "Boundary, ID",
- "16023": "Butte, ID",
- "16025": "Camas, ID",
- "16027": "Canyon, ID",
- "16029": "Caribou, ID",
- "16031": "Cassia, ID",
- "16033": "Clark, ID",
- "16035": "Clearwater, ID",
- "16037": "Custer, ID",
- "16039": "Elmore, ID",
- "16041": "Franklin, ID",
- "16043": "Fremont, ID",
- "16045": "Gem, ID",
- "16047": "Gooding, ID",
- "16049": "Idaho, ID",
- "16051": "Jefferson, ID",
- "16053": "Jerome, ID",
- "16055": "Kootenai, ID",
- "16057": "Latah, ID",
- "16059": "Lemhi, ID",
- "16061": "Lewis, ID",
- "16063": "Lincoln, ID",
- "16065": "Madison, ID",
- "16067": "Minidoka, ID",
- "16069": "Nez Perce, ID",
- "16071": "Oneida, ID",
- "16073": "Owyhee, ID",
- "16075": "Payette, ID",
- "16077": "Power, ID",
- "16079": "Shoshone, ID",
- "16081": "Teton, ID",
- "16083": "Twin Falls, ID",
- "16085": "Valley, ID",
- "16087": "Washington, ID",
- "17001": "Adams, IL",
- "17003": "Alexander, IL",
- "17005": "Bond, IL",
- "17007": "Boone, IL",
- "17009": "Brown, IL",
- "17011": "Bureau, IL",
- "17013": "Calhoun, IL",
- "17015": "Carroll, IL",
- "17017": "Cass, IL",
- "17019": "Champaign, IL",
- "17021": "Christian, IL",
- "17023": "Clark, IL",
- "17025": "Clay, IL",
- "17027": "Clinton, IL",
- "17029": "Coles, IL",
- "17031": "Cook, IL",
- "17033": "Crawford, IL",
- "17035": "Cumberland, IL",
- "17037": "DeKalb, IL",
- "17039": "De Witt, IL",
- "17041": "Douglas, IL",
- "17043": "DuPage, IL",
- "17045": "Edgar, IL",
- "17047": "Edwards, IL",
- "17049": "Effingham, IL",
- "17051": "Fayette, IL",
- "17053": "Ford, IL",
- "17055": "Franklin, IL",
- "17057": "Fulton, IL",
- "17059": "Gallatin, IL",
- "17061": "Greene, IL",
- "17063": "Grundy, IL",
- "17065": "Hamilton, IL",
- "17067": "Hancock, IL",
- "17069": "Hardin, IL",
- "17071": "Henderson, IL",
- "17073": "Henry, IL",
- "17075": "Iroquois, IL",
- "17077": "Jackson, IL",
- "17079": "Jasper, IL",
- "17081": "Jefferson, IL",
- "17083": "Jersey, IL",
- "17085": "Jo Daviess, IL",
- "17087": "Johnson, IL",
- "17089": "Kane, IL",
- "17091": "Kankakee, IL",
- "17093": "Kendall, IL",
- "17095": "Knox, IL",
- "17097": "Lake, IL",
- "17099": "LaSalle, IL",
- "17101": "Lawrence, IL",
- "17103": "Lee, IL",
- "17105": "Livingston, IL",
- "17107": "Logan, IL",
- "17109": "McDonough, IL",
- "17111": "McHenry, IL",
- "17113": "McLean, IL",
- "17115": "Macon, IL",
- "17117": "Macoupin, IL",
- "17119": "Madison, IL",
- "17121": "Marion, IL",
- "17123": "Marshall, IL",
- "17125": "Mason, IL",
- "17127": "Massac, IL",
- "17129": "Menard, IL",
- "17131": "Mercer, IL",
- "17133": "Monroe, IL",
- "17135": "Montgomery, IL",
- "17137": "Morgan, IL",
- "17139": "Moultrie, IL",
- "17141": "Ogle, IL",
- "17143": "Peoria, IL",
- "17145": "Perry, IL",
- "17147": "Piatt, IL",
- "17149": "Pike, IL",
- "17151": "Pope, IL",
- "17153": "Pulaski, IL",
- "17155": "Putnam, IL",
- "17157": "Randolph, IL",
- "17159": "Richland, IL",
- "17161": "Rock Island, IL",
- "17163": "St. Clair, IL",
- "17165": "Saline, IL",
- "17167": "Sangamon, IL",
- "17169": "Schuyler, IL",
- "17171": "Scott, IL",
- "17173": "Shelby, IL",
- "17175": "Stark, IL",
- "17177": "Stephenson, IL",
- "17179": "Tazewell, IL",
- "17181": "Union, IL",
- "17183": "Vermilion, IL",
- "17185": "Wabash, IL",
- "17187": "Warren, IL",
- "17189": "Washington, IL",
- "17191": "Wayne, IL",
- "17193": "White, IL",
- "17195": "Whiteside, IL",
- "17197": "Will, IL",
- "17199": "Williamson, IL",
- "17201": "Winnebago, IL",
- "17203": "Woodford, IL",
- "18001": "Adams, IN",
- "18003": "Allen, IN",
- "18005": "Bartholomew, IN",
- "18007": "Benton, IN",
- "18009": "Blackford, IN",
- "18011": "Boone, IN",
- "18013": "Brown, IN",
- "18015": "Carroll, IN",
- "18017": "Cass, IN",
- "18019": "Clark, IN",
- "18021": "Clay, IN",
- "18023": "Clinton, IN",
- "18025": "Crawford, IN",
- "18027": "Daviess, IN",
- "18029": "Dearborn, IN",
- "18031": "Decatur, IN",
- "18033": "DeKalb, IN",
- "18035": "Delaware, IN",
- "18037": "Dubois, IN",
- "18039": "Elkhart, IN",
- "18041": "Fayette, IN",
- "18043": "Floyd, IN",
- "18045": "Fountain, IN",
- "18047": "Franklin, IN",
- "18049": "Fulton, IN",
- "18051": "Gibson, IN",
- "18053": "Grant, IN",
- "18055": "Greene, IN",
- "18057": "Hamilton, IN",
- "18059": "Hancock, IN",
- "18061": "Harrison, IN",
- "18063": "Hendricks, IN",
- "18065": "Henry, IN",
- "18067": "Howard, IN",
- "18069": "Huntington, IN",
- "18071": "Jackson, IN",
- "18073": "Jasper, IN",
- "18075": "Jay, IN",
- "18077": "Jefferson, IN",
- "18079": "Jennings, IN",
- "18081": "Johnson, IN",
- "18083": "Knox, IN",
- "18085": "Kosciusko, IN",
- "18087": "LaGrange, IN",
- "18089": "Lake, IN",
- "18091": "LaPorte, IN",
- "18093": "Lawrence, IN",
- "18095": "Madison, IN",
- "18097": "Marion, IN",
- "18099": "Marshall, IN",
- "18101": "Martin, IN",
- "18103": "Miami, IN",
- "18105": "Monroe, IN",
- "18107": "Montgomery, IN",
- "18109": "Morgan, IN",
- "18111": "Newton, IN",
- "18113": "Noble, IN",
- "18115": "Ohio, IN",
- "18117": "Orange, IN",
- "18119": "Owen, IN",
- "18121": "Parke, IN",
- "18123": "Perry, IN",
- "18125": "Pike, IN",
- "18127": "Porter, IN",
- "18129": "Posey, IN",
- "18131": "Pulaski, IN",
- "18133": "Putnam, IN",
- "18135": "Randolph, IN",
- "18137": "Ripley, IN",
- "18139": "Rush, IN",
- "18141": "St. Joseph, IN",
- "18143": "Scott, IN",
- "18145": "Shelby, IN",
- "18147": "Spencer, IN",
- "18149": "Starke, IN",
- "18151": "Steuben, IN",
- "18153": "Sullivan, IN",
- "18155": "Switzerland, IN",
- "18157": "Tippecanoe, IN",
- "18159": "Tipton, IN",
- "18161": "Union, IN",
- "18163": "Vanderburgh, IN",
- "18165": "Vermillion, IN",
- "18167": "Vigo, IN",
- "18169": "Wabash, IN",
- "18171": "Warren, IN",
- "18173": "Warrick, IN",
- "18175": "Washington, IN",
- "18177": "Wayne, IN",
- "18179": "Wells, IN",
- "18181": "White, IN",
- "18183": "Whitley, IN",
- "19001": "Adair, IA",
- "19003": "Adams, IA",
- "19005": "Allamakee, IA",
- "19007": "Appanoose, IA",
- "19009": "Audubon, IA",
- "19011": "Benton, IA",
- "19013": "Black Hawk, IA",
- "19015": "Boone, IA",
- "19017": "Bremer, IA",
- "19019": "Buchanan, IA",
- "19021": "Buena Vista, IA",
- "19023": "Butler, IA",
- "19025": "Calhoun, IA",
- "19027": "Carroll, IA",
- "19029": "Cass, IA",
- "19031": "Cedar, IA",
- "19033": "Cerro Gordo, IA",
- "19035": "Cherokee, IA",
- "19037": "Chickasaw, IA",
- "19039": "Clarke, IA",
- "19041": "Clay, IA",
- "19043": "Clayton, IA",
- "19045": "Clinton, IA",
- "19047": "Crawford, IA",
- "19049": "Dallas, IA",
- "19051": "Davis, IA",
- "19053": "Decatur, IA",
- "19055": "Delaware, IA",
- "19057": "Des Moines, IA",
- "19059": "Dickinson, IA",
- "19061": "Dubuque, IA",
- "19063": "Emmet, IA",
- "19065": "Fayette, IA",
- "19067": "Floyd, IA",
- "19069": "Franklin, IA",
- "19071": "Fremont, IA",
- "19073": "Greene, IA",
- "19075": "Grundy, IA",
- "19077": "Guthrie, IA",
- "19079": "Hamilton, IA",
- "19081": "Hancock, IA",
- "19083": "Hardin, IA",
- "19085": "Harrison, IA",
- "19087": "Henry, IA",
- "19089": "Howard, IA",
- "19091": "Humboldt, IA",
- "19093": "Ida, IA",
- "19095": "Iowa, IA",
- "19097": "Jackson, IA",
- "19099": "Jasper, IA",
- "19101": "Jefferson, IA",
- "19103": "Johnson, IA",
- "19105": "Jones, IA",
- "19107": "Keokuk, IA",
- "19109": "Kossuth, IA",
- "19111": "Lee, IA",
- "19113": "Linn, IA",
- "19115": "Louisa, IA",
- "19117": "Lucas, IA",
- "19119": "Lyon, IA",
- "19121": "Madison, IA",
- "19123": "Mahaska, IA",
- "19125": "Marion, IA",
- "19127": "Marshall, IA",
- "19129": "Mills, IA",
- "19131": "Mitchell, IA",
- "19133": "Monona, IA",
- "19135": "Monroe, IA",
- "19137": "Montgomery, IA",
- "19139": "Muscatine, IA",
- "19141": "O'Brien, IA",
- "19143": "Osceola, IA",
- "19145": "Page, IA",
- "19147": "Palo Alto, IA",
- "19149": "Plymouth, IA",
- "19151": "Pocahontas, IA",
- "19153": "Polk, IA",
- "19155": "Pottawattamie, IA",
- "19157": "Poweshiek, IA",
- "19159": "Ringgold, IA",
- "19161": "Sac, IA",
- "19163": "Scott, IA",
- "19165": "Shelby, IA",
- "19167": "Sioux, IA",
- "19169": "Story, IA",
- "19171": "Tama, IA",
- "19173": "Taylor, IA",
- "19175": "Union, IA",
- "19177": "Van Buren, IA",
- "19179": "Wapello, IA",
- "19181": "Warren, IA",
- "19183": "Washington, IA",
- "19185": "Wayne, IA",
- "19187": "Webster, IA",
- "19189": "Winnebago, IA",
- "19191": "Winneshiek, IA",
- "19193": "Woodbury, IA",
- "19195": "Worth, IA",
- "19197": "Wright, IA",
- "20001": "Allen, KS",
- "20003": "Anderson, KS",
- "20005": "Atchison, KS",
- "20007": "Barber, KS",
- "20009": "Barton, KS",
- "20011": "Bourbon, KS",
- "20013": "Brown, KS",
- "20015": "Butler, KS",
- "20017": "Chase, KS",
- "20019": "Chautauqua, KS",
- "20021": "Cherokee, KS",
- "20023": "Cheyenne, KS",
- "20025": "Clark, KS",
- "20027": "Clay, KS",
- "20029": "Cloud, KS",
- "20031": "Coffey, KS",
- "20033": "Comanche, KS",
- "20035": "Cowley, KS",
- "20037": "Crawford, KS",
- "20039": "Decatur, KS",
- "20041": "Dickinson, KS",
- "20043": "Doniphan, KS",
- "20045": "Douglas, KS",
- "20047": "Edwards, KS",
- "20049": "Elk, KS",
- "20051": "Ellis, KS",
- "20053": "Ellsworth, KS",
- "20055": "Finney, KS",
- "20057": "Ford, KS",
- "20059": "Franklin, KS",
- "20061": "Geary, KS",
- "20063": "Gove, KS",
- "20065": "Graham, KS",
- "20067": "Grant, KS",
- "20069": "Gray, KS",
- "20071": "Greeley, KS",
- "20073": "Greenwood, KS",
- "20075": "Hamilton, KS",
- "20077": "Harper, KS",
- "20079": "Harvey, KS",
- "20081": "Haskell, KS",
- "20083": "Hodgeman, KS",
- "20085": "Jackson, KS",
- "20087": "Jefferson, KS",
- "20089": "Jewell, KS",
- "20091": "Johnson, KS",
- "20093": "Kearny, KS",
- "20095": "Kingman, KS",
- "20097": "Kiowa, KS",
- "20099": "Labette, KS",
- "20101": "Lane, KS",
- "20103": "Leavenworth, KS",
- "20105": "Lincoln, KS",
- "20107": "Linn, KS",
- "20109": "Logan, KS",
- "20111": "Lyon, KS",
- "20113": "McPherson, KS",
- "20115": "Marion, KS",
- "20117": "Marshall, KS",
- "20119": "Meade, KS",
- "20121": "Miami, KS",
- "20123": "Mitchell, KS",
- "20125": "Montgomery, KS",
- "20127": "Morris, KS",
- "20129": "Morton, KS",
- "20131": "Nemaha, KS",
- "20133": "Neosho, KS",
- "20135": "Ness, KS",
- "20137": "Norton, KS",
- "20139": "Osage, KS",
- "20141": "Osborne, KS",
- "20143": "Ottawa, KS",
- "20145": "Pawnee, KS",
- "20147": "Phillips, KS",
- "20149": "Pottawatomie, KS",
- "20151": "Pratt, KS",
- "20153": "Rawlins, KS",
- "20155": "Reno, KS",
- "20157": "Republic, KS",
- "20159": "Rice, KS",
- "20161": "Riley, KS",
- "20163": "Rooks, KS",
- "20165": "Rush, KS",
- "20167": "Russell, KS",
- "20169": "Saline, KS",
- "20171": "Scott, KS",
- "20173": "Sedgwick, KS",
- "20175": "Seward, KS",
- "20177": "Shawnee, KS",
- "20179": "Sheridan, KS",
- "20181": "Sherman, KS",
- "20183": "Smith, KS",
- "20185": "Stafford, KS",
- "20187": "Stanton, KS",
- "20189": "Stevens, KS",
- "20191": "Sumner, KS",
- "20193": "Thomas, KS",
- "20195": "Trego, KS",
- "20197": "Wabaunsee, KS",
- "20199": "Wallace, KS",
- "20201": "Washington, KS",
- "20203": "Wichita, KS",
- "20205": "Wilson, KS",
- "20207": "Woodson, KS",
- "20209": "Wyandotte, KS",
- "21001": "Adair, KY",
- "21003": "Allen, KY",
- "21005": "Anderson, KY",
- "21007": "Ballard, KY",
- "21009": "Barren, KY",
- "21011": "Bath, KY",
- "21013": "Bell, KY",
- "21015": "Boone, KY",
- "21017": "Bourbon, KY",
- "21019": "Boyd, KY",
- "21021": "Boyle, KY",
- "21023": "Bracken, KY",
- "21025": "Breathitt, KY",
- "21027": "Breckinridge, KY",
- "21029": "Bullitt, KY",
- "21031": "Butler, KY",
- "21033": "Caldwell, KY",
- "21035": "Calloway, KY",
- "21037": "Campbell, KY",
- "21039": "Carlisle, KY",
- "21041": "Carroll, KY",
- "21043": "Carter, KY",
- "21045": "Casey, KY",
- "21047": "Christian, KY",
- "21049": "Clark, KY",
- "21051": "Clay, KY",
- "21053": "Clinton, KY",
- "21055": "Crittenden, KY",
- "21057": "Cumberland, KY",
- "21059": "Daviess, KY",
- "21061": "Edmonson, KY",
- "21063": "Elliott, KY",
- "21065": "Estill, KY",
- "21067": "Fayette, KY",
- "21069": "Fleming, KY",
- "21071": "Floyd, KY",
- "21073": "Franklin, KY",
- "21075": "Fulton, KY",
- "21077": "Gallatin, KY",
- "21079": "Garrard, KY",
- "21081": "Grant, KY",
- "21083": "Graves, KY",
- "21085": "Grayson, KY",
- "21087": "Green, KY",
- "21089": "Greenup, KY",
- "21091": "Hancock, KY",
- "21093": "Hardin, KY",
- "21095": "Harlan, KY",
- "21097": "Harrison, KY",
- "21099": "Hart, KY",
- "21101": "Henderson, KY",
- "21103": "Henry, KY",
- "21105": "Hickman, KY",
- "21107": "Hopkins, KY",
- "21109": "Jackson, KY",
- "21111": "Jefferson, KY",
- "21113": "Jessamine, KY",
- "21115": "Johnson, KY",
- "21117": "Kenton, KY",
- "21119": "Knott, KY",
- "21121": "Knox, KY",
- "21123": "Larue, KY",
- "21125": "Laurel, KY",
- "21127": "Lawrence, KY",
- "21129": "Lee, KY",
- "21131": "Leslie, KY",
- "21133": "Letcher, KY",
- "21135": "Lewis, KY",
- "21137": "Lincoln, KY",
- "21139": "Livingston, KY",
- "21141": "Logan, KY",
- "21143": "Lyon, KY",
- "21145": "McCracken, KY",
- "21147": "McCreary, KY",
- "21149": "McLean, KY",
- "21151": "Madison, KY",
- "21153": "Magoffin, KY",
- "21155": "Marion, KY",
- "21157": "Marshall, KY",
- "21159": "Martin, KY",
- "21161": "Mason, KY",
- "21163": "Meade, KY",
- "21165": "Menifee, KY",
- "21167": "Mercer, KY",
- "21169": "Metcalfe, KY",
- "21171": "Monroe, KY",
- "21173": "Montgomery, KY",
- "21175": "Morgan, KY",
- "21177": "Muhlenberg, KY",
- "21179": "Nelson, KY",
- "21181": "Nicholas, KY",
- "21183": "Ohio, KY",
- "21185": "Oldham, KY",
- "21187": "Owen, KY",
- "21189": "Owsley, KY",
- "21191": "Pendleton, KY",
- "21193": "Perry, KY",
- "21195": "Pike, KY",
- "21197": "Powell, KY",
- "21199": "Pulaski, KY",
- "21201": "Robertson, KY",
- "21203": "Rockcastle, KY",
- "21205": "Rowan, KY",
- "21207": "Russell, KY",
- "21209": "Scott, KY",
- "21211": "Shelby, KY",
- "21213": "Simpson, KY",
- "21215": "Spencer, KY",
- "21217": "Taylor, KY",
- "21219": "Todd, KY",
- "21221": "Trigg, KY",
- "21223": "Trimble, KY",
- "21225": "Union, KY",
- "21227": "Warren, KY",
- "21229": "Washington, KY",
- "21231": "Wayne, KY",
- "21233": "Webster, KY",
- "21235": "Whitley, KY",
- "21237": "Wolfe, KY",
- "21239": "Woodford, KY",
- "22001": "Acadia, LA",
- "22003": "Allen, LA",
- "22005": "Ascension, LA",
- "22007": "Assumption, LA",
- "22009": "Avoyelles, LA",
- "22011": "Beauregard, LA",
- "22013": "Bienville, LA",
- "22015": "Bossier, LA",
- "22017": "Caddo, LA",
- "22019": "Calcasieu, LA",
- "22021": "Caldwell, LA",
- "22023": "Cameron, LA",
- "22025": "Catahoula, LA",
- "22027": "Claiborne, LA",
- "22029": "Concordia, LA",
- "22031": "De Soto, LA",
- "22033": "East Baton Rouge, LA",
- "22035": "East Carroll, LA",
- "22037": "East Feliciana, LA",
- "22039": "Evangeline, LA",
- "22041": "Franklin, LA",
- "22043": "Grant, LA",
- "22045": "Iberia, LA",
- "22047": "Iberville, LA",
- "22049": "Jackson, LA",
- "22051": "Jefferson, LA",
- "22053": "Jefferson Davis, LA",
- "22055": "Lafayette, LA",
- "22057": "Lafourche, LA",
- "22059": "La Salle, LA",
- "22061": "Lincoln, LA",
- "22063": "Livingston, LA",
- "22065": "Madison, LA",
- "22067": "Morehouse, LA",
- "22069": "Natchitoches, LA",
- "22071": "Orleans, LA",
- "22073": "Ouachita, LA",
- "22075": "Plaquemines, LA",
- "22077": "Pointe Coupee, LA",
- "22079": "Rapides, LA",
- "22081": "Red River, LA",
- "22083": "Richland, LA",
- "22085": "Sabine, LA",
- "22087": "St. Bernard, LA",
- "22089": "St. Charles, LA",
- "22091": "St. Helena, LA",
- "22093": "St. James, LA",
- "22095": "St. John the Baptist, LA",
- "22097": "St. Landry, LA",
- "22099": "St. Martin, LA",
- "22101": "St. Mary, LA",
- "22103": "St. Tammany, LA",
- "22105": "Tangipahoa, LA",
- "22107": "Tensas, LA",
- "22109": "Terrebonne, LA",
- "22111": "Union, LA",
- "22113": "Vermilion, LA",
- "22115": "Vernon, LA",
- "22117": "Washington, LA",
- "22119": "Webster, LA",
- "22121": "West Baton Rouge, LA",
- "22123": "West Carroll, LA",
- "22125": "West Feliciana, LA",
- "22127": "Winn, LA",
- "23001": "Androscoggin, ME",
- "23003": "Aroostook, ME",
- "23005": "Cumberland, ME",
- "23007": "Franklin, ME",
- "23009": "Hancock, ME",
- "23011": "Kennebec, ME",
- "23013": "Knox, ME",
- "23015": "Lincoln, ME",
- "23017": "Oxford, ME",
- "23019": "Penobscot, ME",
- "23021": "Piscataquis, ME",
- "23023": "Sagadahoc, ME",
- "23025": "Somerset, ME",
- "23027": "Waldo, ME",
- "23029": "Washington, ME",
- "23031": "York, ME",
- "24001": "Allegany, MD",
- "24003": "Anne Arundel, MD",
- "24005": "Baltimore, MD",
- "24009": "Calvert, MD",
- "24011": "Caroline, MD",
- "24013": "Carroll, MD",
- "24015": "Cecil, MD",
- "24017": "Charles, MD",
- "24019": "Dorchester, MD",
- "24021": "Frederick, MD",
- "24023": "Garrett, MD",
- "24025": "Harford, MD",
- "24027": "Howard, MD",
- "24029": "Kent, MD",
- "24031": "Montgomery, MD",
- "24033": "Prince George's, MD",
- "24035": "Queen Anne's, MD",
- "24037": "St. Mary's, MD",
- "24039": "Somerset, MD",
- "24041": "Talbot, MD",
- "24043": "Washington, MD",
- "24045": "Wicomico, MD",
- "24047": "Worcester, MD",
- "24510": "Baltimore, MD",
- "25001": "Barnstable, MA",
- "25003": "Berkshire, MA",
- "25005": "Bristol, MA",
- "25007": "Dukes, MA",
- "25009": "Essex, MA",
- "25011": "Franklin, MA",
- "25013": "Hampden, MA",
- "25015": "Hampshire, MA",
- "25017": "Middlesex, MA",
- "25019": "Nantucket, MA",
- "25021": "Norfolk, MA",
- "25023": "Plymouth, MA",
- "25025": "Suffolk, MA",
- "25027": "Worcester, MA",
- "26001": "Alcona, MI",
- "26003": "Alger, MI",
- "26005": "Allegan, MI",
- "26007": "Alpena, MI",
- "26009": "Antrim, MI",
- "26011": "Arenac, MI",
- "26013": "Baraga, MI",
- "26015": "Barry, MI",
- "26017": "Bay, MI",
- "26019": "Benzie, MI",
- "26021": "Berrien, MI",
- "26023": "Branch, MI",
- "26025": "Calhoun, MI",
- "26027": "Cass, MI",
- "26029": "Charlevoix, MI",
- "26031": "Cheboygan, MI",
- "26033": "Chippewa, MI",
- "26035": "Clare, MI",
- "26037": "Clinton, MI",
- "26039": "Crawford, MI",
- "26041": "Delta, MI",
- "26043": "Dickinson, MI",
- "26045": "Eaton, MI",
- "26047": "Emmet, MI",
- "26049": "Genesee, MI",
- "26051": "Gladwin, MI",
- "26053": "Gogebic, MI",
- "26055": "Grand Traverse, MI",
- "26057": "Gratiot, MI",
- "26059": "Hillsdale, MI",
- "26061": "Houghton, MI",
- "26063": "Huron, MI",
- "26065": "Ingham, MI",
- "26067": "Ionia, MI",
- "26069": "Iosco, MI",
- "26071": "Iron, MI",
- "26073": "Isabella, MI",
- "26075": "Jackson, MI",
- "26077": "Kalamazoo, MI",
- "26079": "Kalkaska, MI",
- "26081": "Kent, MI",
- "26083": "Keweenaw, MI",
- "26085": "Lake, MI",
- "26087": "Lapeer, MI",
- "26089": "Leelanau, MI",
- "26091": "Lenawee, MI",
- "26093": "Livingston, MI",
- "26095": "Luce, MI",
- "26097": "Mackinac, MI",
- "26099": "Macomb, MI",
- "26101": "Manistee, MI",
- "26103": "Marquette, MI",
- "26105": "Mason, MI",
- "26107": "Mecosta, MI",
- "26109": "Menominee, MI",
- "26111": "Midland, MI",
- "26113": "Missaukee, MI",
- "26115": "Monroe, MI",
- "26117": "Montcalm, MI",
- "26119": "Montmorency, MI",
- "26121": "Muskegon, MI",
- "26123": "Newaygo, MI",
- "26125": "Oakland, MI",
- "26127": "Oceana, MI",
- "26129": "Ogemaw, MI",
- "26131": "Ontonagon, MI",
- "26133": "Osceola, MI",
- "26135": "Oscoda, MI",
- "26137": "Otsego, MI",
- "26139": "Ottawa, MI",
- "26141": "Presque Isle, MI",
- "26143": "Roscommon, MI",
- "26145": "Saginaw, MI",
- "26147": "St. Clair, MI",
- "26149": "St. Joseph, MI",
- "26151": "Sanilac, MI",
- "26153": "Schoolcraft, MI",
- "26155": "Shiawassee, MI",
- "26157": "Tuscola, MI",
- "26159": "Van Buren, MI",
- "26161": "Washtenaw, MI",
- "26163": "Wayne, MI",
- "26165": "Wexford, MI",
- "27001": "Aitkin, MN",
- "27003": "Anoka, MN",
- "27005": "Becker, MN",
- "27007": "Beltrami, MN",
- "27009": "Benton, MN",
- "27011": "Big Stone, MN",
- "27013": "Blue Earth, MN",
- "27015": "Brown, MN",
- "27017": "Carlton, MN",
- "27019": "Carver, MN",
- "27021": "Cass, MN",
- "27023": "Chippewa, MN",
- "27025": "Chisago, MN",
- "27027": "Clay, MN",
- "27029": "Clearwater, MN",
- "27031": "Cook, MN",
- "27033": "Cottonwood, MN",
- "27035": "Crow Wing, MN",
- "27037": "Dakota, MN",
- "27039": "Dodge, MN",
- "27041": "Douglas, MN",
- "27043": "Faribault, MN",
- "27045": "Fillmore, MN",
- "27047": "Freeborn, MN",
- "27049": "Goodhue, MN",
- "27051": "Grant, MN",
- "27053": "Hennepin, MN",
- "27055": "Houston, MN",
- "27057": "Hubbard, MN",
- "27059": "Isanti, MN",
- "27061": "Itasca, MN",
- "27063": "Jackson, MN",
- "27065": "Kanabec, MN",
- "27067": "Kandiyohi, MN",
- "27069": "Kittson, MN",
- "27071": "Koochiching, MN",
- "27073": "Lac qui Parle, MN",
- "27075": "Lake, MN",
- "27077": "Lake of the Woods, MN",
- "27079": "Le Sueur, MN",
- "27081": "Lincoln, MN",
- "27083": "Lyon, MN",
- "27085": "McLeod, MN",
- "27087": "Mahnomen, MN",
- "27089": "Marshall, MN",
- "27091": "Martin, MN",
- "27093": "Meeker, MN",
- "27095": "Mille Lacs, MN",
- "27097": "Morrison, MN",
- "27099": "Mower, MN",
- "27101": "Murray, MN",
- "27103": "Nicollet, MN",
- "27105": "Nobles, MN",
- "27107": "Norman, MN",
- "27109": "Olmsted, MN",
- "27111": "Otter Tail, MN",
- "27113": "Pennington, MN",
- "27115": "Pine, MN",
- "27117": "Pipestone, MN",
- "27119": "Polk, MN",
- "27121": "Pope, MN",
- "27123": "Ramsey, MN",
- "27125": "Red Lake, MN",
- "27127": "Redwood, MN",
- "27129": "Renville, MN",
- "27131": "Rice, MN",
- "27133": "Rock, MN",
- "27135": "Roseau, MN",
- "27137": "St. Louis, MN",
- "27139": "Scott, MN",
- "27141": "Sherburne, MN",
- "27143": "Sibley, MN",
- "27145": "Stearns, MN",
- "27147": "Steele, MN",
- "27149": "Stevens, MN",
- "27151": "Swift, MN",
- "27153": "Todd, MN",
- "27155": "Traverse, MN",
- "27157": "Wabasha, MN",
- "27159": "Wadena, MN",
- "27161": "Waseca, MN",
- "27163": "Washington, MN",
- "27165": "Watonwan, MN",
- "27167": "Wilkin, MN",
- "27169": "Winona, MN",
- "27171": "Wright, MN",
- "27173": "Yellow Medicine, MN",
- "28001": "Adams, MS",
- "28003": "Alcorn, MS",
- "28005": "Amite, MS",
- "28007": "Attala, MS",
- "28009": "Benton, MS",
- "28011": "Bolivar, MS",
- "28013": "Calhoun, MS",
- "28015": "Carroll, MS",
- "28017": "Chickasaw, MS",
- "28019": "Choctaw, MS",
- "28021": "Claiborne, MS",
- "28023": "Clarke, MS",
- "28025": "Clay, MS",
- "28027": "Coahoma, MS",
- "28029": "Copiah, MS",
- "28031": "Covington, MS",
- "28033": "DeSoto, MS",
- "28035": "Forrest, MS",
- "28037": "Franklin, MS",
- "28039": "George, MS",
- "28041": "Greene, MS",
- "28043": "Grenada, MS",
- "28045": "Hancock, MS",
- "28047": "Harrison, MS",
- "28049": "Hinds, MS",
- "28051": "Holmes, MS",
- "28053": "Humphreys, MS",
- "28055": "Issaquena, MS",
- "28057": "Itawamba, MS",
- "28059": "Jackson, MS",
- "28061": "Jasper, MS",
- "28063": "Jefferson, MS",
- "28065": "Jefferson Davis, MS",
- "28067": "Jones, MS",
- "28069": "Kemper, MS",
- "28071": "Lafayette, MS",
- "28073": "Lamar, MS",
- "28075": "Lauderdale, MS",
- "28077": "Lawrence, MS",
- "28079": "Leake, MS",
- "28081": "Lee, MS",
- "28083": "Leflore, MS",
- "28085": "Lincoln, MS",
- "28087": "Lowndes, MS",
- "28089": "Madison, MS",
- "28091": "Marion, MS",
- "28093": "Marshall, MS",
- "28095": "Monroe, MS",
- "28097": "Montgomery, MS",
- "28099": "Neshoba, MS",
- "28101": "Newton, MS",
- "28103": "Noxubee, MS",
- "28105": "Oktibbeha, MS",
- "28107": "Panola, MS",
- "28109": "Pearl River, MS",
- "28111": "Perry, MS",
- "28113": "Pike, MS",
- "28115": "Pontotoc, MS",
- "28117": "Prentiss, MS",
- "28119": "Quitman, MS",
- "28121": "Rankin, MS",
- "28123": "Scott, MS",
- "28125": "Sharkey, MS",
- "28127": "Simpson, MS",
- "28129": "Smith, MS",
- "28131": "Stone, MS",
- "28133": "Sunflower, MS",
- "28135": "Tallahatchie, MS",
- "28137": "Tate, MS",
- "28139": "Tippah, MS",
- "28141": "Tishomingo, MS",
- "28143": "Tunica, MS",
- "28145": "Union, MS",
- "28147": "Walthall, MS",
- "28149": "Warren, MS",
- "28151": "Washington, MS",
- "28153": "Wayne, MS",
- "28155": "Webster, MS",
- "28157": "Wilkinson, MS",
- "28159": "Winston, MS",
- "28161": "Yalobusha, MS",
- "28163": "Yazoo, MS",
- "29001": "Adair, MO",
- "29003": "Andrew, MO",
- "29005": "Atchison, MO",
- "29007": "Audrain, MO",
- "29009": "Barry, MO",
- "29011": "Barton, MO",
- "29013": "Bates, MO",
- "29015": "Benton, MO",
- "29017": "Bollinger, MO",
- "29019": "Boone, MO",
- "29021": "Buchanan, MO",
- "29023": "Butler, MO",
- "29025": "Caldwell, MO",
- "29027": "Callaway, MO",
- "29029": "Camden, MO",
- "29031": "Cape Girardeau, MO",
- "29033": "Carroll, MO",
- "29035": "Carter, MO",
- "29037": "Cass, MO",
- "29039": "Cedar, MO",
- "29041": "Chariton, MO",
- "29043": "Christian, MO",
- "29045": "Clark, MO",
- "29047": "Clay, MO",
- "29049": "Clinton, MO",
- "29051": "Cole, MO",
- "29053": "Cooper, MO",
- "29055": "Crawford, MO",
- "29057": "Dade, MO",
- "29059": "Dallas, MO",
- "29061": "Daviess, MO",
- "29063": "DeKalb, MO",
- "29065": "Dent, MO",
- "29067": "Douglas, MO",
- "29069": "Dunklin, MO",
- "29071": "Franklin, MO",
- "29073": "Gasconade, MO",
- "29075": "Gentry, MO",
- "29077": "Greene, MO",
- "29079": "Grundy, MO",
- "29081": "Harrison, MO",
- "29083": "Henry, MO",
- "29085": "Hickory, MO",
- "29087": "Holt, MO",
- "29089": "Howard, MO",
- "29091": "Howell, MO",
- "29093": "Iron, MO",
- "29095": "Jackson, MO",
- "29097": "Jasper, MO",
- "29099": "Jefferson, MO",
- "29101": "Johnson, MO",
- "29103": "Knox, MO",
- "29105": "Laclede, MO",
- "29107": "Lafayette, MO",
- "29109": "Lawrence, MO",
- "29111": "Lewis, MO",
- "29113": "Lincoln, MO",
- "29115": "Linn, MO",
- "29117": "Livingston, MO",
- "29119": "McDonald, MO",
- "29121": "Macon, MO",
- "29123": "Madison, MO",
- "29125": "Maries, MO",
- "29127": "Marion, MO",
- "29129": "Mercer, MO",
- "29131": "Miller, MO",
- "29133": "Mississippi, MO",
- "29135": "Moniteau, MO",
- "29137": "Monroe, MO",
- "29139": "Montgomery, MO",
- "29141": "Morgan, MO",
- "29143": "New Madrid, MO",
- "29145": "Newton, MO",
- "29147": "Nodaway, MO",
- "29149": "Oregon, MO",
- "29151": "Osage, MO",
- "29153": "Ozark, MO",
- "29155": "Pemiscot, MO",
- "29157": "Perry, MO",
- "29159": "Pettis, MO",
- "29161": "Phelps, MO",
- "29163": "Pike, MO",
- "29165": "Platte, MO",
- "29167": "Polk, MO",
- "29169": "Pulaski, MO",
- "29171": "Putnam, MO",
- "29173": "Ralls, MO",
- "29175": "Randolph, MO",
- "29177": "Ray, MO",
- "29179": "Reynolds, MO",
- "29181": "Ripley, MO",
- "29183": "St. Charles, MO",
- "29185": "St. Clair, MO",
- "29186": "Ste. Genevieve, MO",
- "29187": "St. Francois, MO",
- "29189": "St. Louis, MO",
- "29195": "Saline, MO",
- "29197": "Schuyler, MO",
- "29199": "Scotland, MO",
- "29201": "Scott, MO",
- "29203": "Shannon, MO",
- "29205": "Shelby, MO",
- "29207": "Stoddard, MO",
- "29209": "Stone, MO",
- "29211": "Sullivan, MO",
- "29213": "Taney, MO",
- "29215": "Texas, MO",
- "29217": "Vernon, MO",
- "29219": "Warren, MO",
- "29221": "Washington, MO",
- "29223": "Wayne, MO",
- "29225": "Webster, MO",
- "29227": "Worth, MO",
- "29229": "Wright, MO",
- "29510": "St. Louis, MO",
- "30001": "Beaverhead, MT",
- "30003": "Big Horn, MT",
- "30005": "Blaine, MT",
- "30007": "Broadwater, MT",
- "30009": "Carbon, MT",
- "30011": "Carter, MT",
- "30013": "Cascade, MT",
- "30015": "Chouteau, MT",
- "30017": "Custer, MT",
- "30019": "Daniels, MT",
- "30021": "Dawson, MT",
- "30023": "Deer Lodge, MT",
- "30025": "Fallon, MT",
- "30027": "Fergus, MT",
- "30029": "Flathead, MT",
- "30031": "Gallatin, MT",
- "30033": "Garfield, MT",
- "30035": "Glacier, MT",
- "30037": "Golden Valley, MT",
- "30039": "Granite, MT",
- "30041": "Hill, MT",
- "30043": "Jefferson, MT",
- "30045": "Judith Basin, MT",
- "30047": "Lake, MT",
- "30049": "Lewis and Clark, MT",
- "30051": "Liberty, MT",
- "30053": "Lincoln, MT",
- "30055": "McCone, MT",
- "30057": "Madison, MT",
- "30059": "Meagher, MT",
- "30061": "Mineral, MT",
- "30063": "Missoula, MT",
- "30065": "Musselshell, MT",
- "30067": "Park, MT",
- "30069": "Petroleum, MT",
- "30071": "Phillips, MT",
- "30073": "Pondera, MT",
- "30075": "Powder River, MT",
- "30077": "Powell, MT",
- "30079": "Prairie, MT",
- "30081": "Ravalli, MT",
- "30083": "Richland, MT",
- "30085": "Roosevelt, MT",
- "30087": "Rosebud, MT",
- "30089": "Sanders, MT",
- "30091": "Sheridan, MT",
- "30093": "Silver Bow, MT",
- "30095": "Stillwater, MT",
- "30097": "Sweet Grass, MT",
- "30099": "Teton, MT",
- "30101": "Toole, MT",
- "30103": "Treasure, MT",
- "30105": "Valley, MT",
- "30107": "Wheatland, MT",
- "30109": "Wibaux, MT",
- "30111": "Yellowstone, MT",
- "31001": "Adams, NE",
- "31003": "Antelope, NE",
- "31005": "Arthur, NE",
- "31007": "Banner, NE",
- "31009": "Blaine, NE",
- "31011": "Boone, NE",
- "31013": "Box Butte, NE",
- "31015": "Boyd, NE",
- "31017": "Brown, NE",
- "31019": "Buffalo, NE",
- "31021": "Burt, NE",
- "31023": "Butler, NE",
- "31025": "Cass, NE",
- "31027": "Cedar, NE",
- "31029": "Chase, NE",
- "31031": "Cherry, NE",
- "31033": "Cheyenne, NE",
- "31035": "Clay, NE",
- "31037": "Colfax, NE",
- "31039": "Cuming, NE",
- "31041": "Custer, NE",
- "31043": "Dakota, NE",
- "31045": "Dawes, NE",
- "31047": "Dawson, NE",
- "31049": "Deuel, NE",
- "31051": "Dixon, NE",
- "31053": "Dodge, NE",
- "31055": "Douglas, NE",
- "31057": "Dundy, NE",
- "31059": "Fillmore, NE",
- "31061": "Franklin, NE",
- "31063": "Frontier, NE",
- "31065": "Furnas, NE",
- "31067": "Gage, NE",
- "31069": "Garden, NE",
- "31071": "Garfield, NE",
- "31073": "Gosper, NE",
- "31075": "Grant, NE",
- "31077": "Greeley, NE",
- "31079": "Hall, NE",
- "31081": "Hamilton, NE",
- "31083": "Harlan, NE",
- "31085": "Hayes, NE",
- "31087": "Hitchcock, NE",
- "31089": "Holt, NE",
- "31091": "Hooker, NE",
- "31093": "Howard, NE",
- "31095": "Jefferson, NE",
- "31097": "Johnson, NE",
- "31099": "Kearney, NE",
- "31101": "Keith, NE",
- "31103": "Keya Paha, NE",
- "31105": "Kimball, NE",
- "31107": "Knox, NE",
- "31109": "Lancaster, NE",
- "31111": "Lincoln, NE",
- "31113": "Logan, NE",
- "31115": "Loup, NE",
- "31117": "McPherson, NE",
- "31119": "Madison, NE",
- "31121": "Merrick, NE",
- "31123": "Morrill, NE",
- "31125": "Nance, NE",
- "31127": "Nemaha, NE",
- "31129": "Nuckolls, NE",
- "31131": "Otoe, NE",
- "31133": "Pawnee, NE",
- "31135": "Perkins, NE",
- "31137": "Phelps, NE",
- "31139": "Pierce, NE",
- "31141": "Platte, NE",
- "31143": "Polk, NE",
- "31145": "Red Willow, NE",
- "31147": "Richardson, NE",
- "31149": "Rock, NE",
- "31151": "Saline, NE",
- "31153": "Sarpy, NE",
- "31155": "Saunders, NE",
- "31157": "Scotts Bluff, NE",
- "31159": "Seward, NE",
- "31161": "Sheridan, NE",
- "31163": "Sherman, NE",
- "31165": "Sioux, NE",
- "31167": "Stanton, NE",
- "31169": "Thayer, NE",
- "31171": "Thomas, NE",
- "31173": "Thurston, NE",
- "31175": "Valley, NE",
- "31177": "Washington, NE",
- "31179": "Wayne, NE",
- "31181": "Webster, NE",
- "31183": "Wheeler, NE",
- "31185": "York, NE",
- "32001": "Churchill, NV",
- "32003": "Clark, NV",
- "32005": "Douglas, NV",
- "32007": "Elko, NV",
- "32009": "Esmeralda, NV",
- "32011": "Eureka, NV",
- "32013": "Humboldt, NV",
- "32015": "Lander, NV",
- "32017": "Lincoln, NV",
- "32019": "Lyon, NV",
- "32021": "Mineral, NV",
- "32023": "Nye, NV",
- "32027": "Pershing, NV",
- "32029": "Storey, NV",
- "32031": "Washoe, NV",
- "32033": "White Pine, NV",
- "32510": "Carson, NV",
- "33001": "Belknap, NH",
- "33003": "Carroll, NH",
- "33005": "Cheshire, NH",
- "33007": "Coos, NH",
- "33009": "Grafton, NH",
- "33011": "Hillsborough, NH",
- "33013": "Merrimack, NH",
- "33015": "Rockingham, NH",
- "33017": "Strafford, NH",
- "33019": "Sullivan, NH",
- "34001": "Atlantic, NJ",
- "34003": "Bergen, NJ",
- "34005": "Burlington, NJ",
- "34007": "Camden, NJ",
- "34009": "Cape May, NJ",
- "34011": "Cumberland, NJ",
- "34013": "Essex, NJ",
- "34015": "Gloucester, NJ",
- "34017": "Hudson, NJ",
- "34019": "Hunterdon, NJ",
- "34021": "Mercer, NJ",
- "34023": "Middlesex, NJ",
- "34025": "Monmouth, NJ",
- "34027": "Morris, NJ",
- "34029": "Ocean, NJ",
- "34031": "Passaic, NJ",
- "34033": "Salem, NJ",
- "34035": "Somerset, NJ",
- "34037": "Sussex, NJ",
- "34039": "Union, NJ",
- "34041": "Warren, NJ",
- "35001": "Bernalillo, NM",
- "35003": "Catron, NM",
- "35005": "Chaves, NM",
- "35006": "Cibola, NM",
- "35007": "Colfax, NM",
- "35009": "Curry, NM",
- "35011": "De Baca, NM",
- "35013": "Dona Ana, NM",
- "35015": "Eddy, NM",
- "35017": "Grant, NM",
- "35019": "Guadalupe, NM",
- "35021": "Harding, NM",
- "35023": "Hidalgo, NM",
- "35025": "Lea, NM",
- "35027": "Lincoln, NM",
- "35028": "Los Alamos, NM",
- "35029": "Luna, NM",
- "35031": "McKinley, NM",
- "35033": "Mora, NM",
- "35035": "Otero, NM",
- "35037": "Quay, NM",
- "35039": "Rio Arriba, NM",
- "35041": "Roosevelt, NM",
- "35043": "Sandoval, NM",
- "35045": "San Juan, NM",
- "35047": "San Miguel, NM",
- "35049": "Santa Fe, NM",
- "35051": "Sierra, NM",
- "35053": "Socorro, NM",
- "35055": "Taos, NM",
- "35057": "Torrance, NM",
- "35059": "Union, NM",
- "35061": "Valencia, NM",
- "36001": "Albany, NY",
- "36003": "Allegany, NY",
- "36005": "Bronx, NY",
- "36007": "Broome, NY",
- "36009": "Cattaraugus, NY",
- "36011": "Cayuga, NY",
- "36013": "Chautauqua, NY",
- "36015": "Chemung, NY",
- "36017": "Chenango, NY",
- "36019": "Clinton, NY",
- "36021": "Columbia, NY",
- "36023": "Cortland, NY",
- "36025": "Delaware, NY",
- "36027": "Dutchess, NY",
- "36029": "Erie, NY",
- "36031": "Essex, NY",
- "36033": "Franklin, NY",
- "36035": "Fulton, NY",
- "36037": "Genesee, NY",
- "36039": "Greene, NY",
- "36041": "Hamilton, NY",
- "36043": "Herkimer, NY",
- "36045": "Jefferson, NY",
- "36047": "Kings, NY",
- "36049": "Lewis, NY",
- "36051": "Livingston, NY",
- "36053": "Madison, NY",
- "36055": "Monroe, NY",
- "36057": "Montgomery, NY",
- "36059": "Nassau, NY",
- "36061": "New York, NY",
- "36063": "Niagara, NY",
- "36065": "Oneida, NY",
- "36067": "Onondaga, NY",
- "36069": "Ontario, NY",
- "36071": "Orange, NY",
- "36073": "Orleans, NY",
- "36075": "Oswego, NY",
- "36077": "Otsego, NY",
- "36079": "Putnam, NY",
- "36081": "Queens, NY",
- "36083": "Rensselaer, NY",
- "36085": "Richmond, NY",
- "36087": "Rockland, NY",
- "36089": "St. Lawrence, NY",
- "36091": "Saratoga, NY",
- "36093": "Schenectady, NY",
- "36095": "Schoharie, NY",
- "36097": "Schuyler, NY",
- "36099": "Seneca, NY",
- "36101": "Steuben, NY",
- "36103": "Suffolk, NY",
- "36105": "Sullivan, NY",
- "36107": "Tioga, NY",
- "36109": "Tompkins, NY",
- "36111": "Ulster, NY",
- "36113": "Warren, NY",
- "36115": "Washington, NY",
- "36117": "Wayne, NY",
- "36119": "Westchester, NY",
- "36121": "Wyoming, NY",
- "36123": "Yates, NY",
- "37001": "Alamance, NC",
- "37003": "Alexander, NC",
- "37005": "Alleghany, NC",
- "37007": "Anson, NC",
- "37009": "Ashe, NC",
- "37011": "Avery, NC",
- "37013": "Beaufort, NC",
- "37015": "Bertie, NC",
- "37017": "Bladen, NC",
- "37019": "Brunswick, NC",
- "37021": "Buncombe, NC",
- "37023": "Burke, NC",
- "37025": "Cabarrus, NC",
- "37027": "Caldwell, NC",
- "37029": "Camden, NC",
- "37031": "Carteret, NC",
- "37033": "Caswell, NC",
- "37035": "Catawba, NC",
- "37037": "Chatham, NC",
- "37039": "Cherokee, NC",
- "37041": "Chowan, NC",
- "37043": "Clay, NC",
- "37045": "Cleveland, NC",
- "37047": "Columbus, NC",
- "37049": "Craven, NC",
- "37051": "Cumberland, NC",
- "37053": "Currituck, NC",
- "37055": "Dare, NC",
- "37057": "Davidson, NC",
- "37059": "Davie, NC",
- "37061": "Duplin, NC",
- "37063": "Durham, NC",
- "37065": "Edgecombe, NC",
- "37067": "Forsyth, NC",
- "37069": "Franklin, NC",
- "37071": "Gaston, NC",
- "37073": "Gates, NC",
- "37075": "Graham, NC",
- "37077": "Granville, NC",
- "37079": "Greene, NC",
- "37081": "Guilford, NC",
- "37083": "Halifax, NC",
- "37085": "Harnett, NC",
- "37087": "Haywood, NC",
- "37089": "Henderson, NC",
- "37091": "Hertford, NC",
- "37093": "Hoke, NC",
- "37095": "Hyde, NC",
- "37097": "Iredell, NC",
- "37099": "Jackson, NC",
- "37101": "Johnston, NC",
- "37103": "Jones, NC",
- "37105": "Lee, NC",
- "37107": "Lenoir, NC",
- "37109": "Lincoln, NC",
- "37111": "McDowell, NC",
- "37113": "Macon, NC",
- "37115": "Madison, NC",
- "37117": "Martin, NC",
- "37119": "Mecklenburg, NC",
- "37121": "Mitchell, NC",
- "37123": "Montgomery, NC",
- "37125": "Moore, NC",
- "37127": "Nash, NC",
- "37129": "New Hanover, NC",
- "37131": "Northampton, NC",
- "37133": "Onslow, NC",
- "37135": "Orange, NC",
- "37137": "Pamlico, NC",
- "37139": "Pasquotank, NC",
- "37141": "Pender, NC",
- "37143": "Perquimans, NC",
- "37145": "Person, NC",
- "37147": "Pitt, NC",
- "37149": "Polk, NC",
- "37151": "Randolph, NC",
- "37153": "Richmond, NC",
- "37155": "Robeson, NC",
- "37157": "Rockingham, NC",
- "37159": "Rowan, NC",
- "37161": "Rutherford, NC",
- "37163": "Sampson, NC",
- "37165": "Scotland, NC",
- "37167": "Stanly, NC",
- "37169": "Stokes, NC",
- "37171": "Surry, NC",
- "37173": "Swain, NC",
- "37175": "Transylvania, NC",
- "37177": "Tyrrell, NC",
- "37179": "Union, NC",
- "37181": "Vance, NC",
- "37183": "Wake, NC",
- "37185": "Warren, NC",
- "37187": "Washington, NC",
- "37189": "Watauga, NC",
- "37191": "Wayne, NC",
- "37193": "Wilkes, NC",
- "37195": "Wilson, NC",
- "37197": "Yadkin, NC",
- "37199": "Yancey, NC",
- "38001": "Adams, ND",
- "38003": "Barnes, ND",
- "38005": "Benson, ND",
- "38007": "Billings, ND",
- "38009": "Bottineau, ND",
- "38011": "Bowman, ND",
- "38013": "Burke, ND",
- "38015": "Burleigh, ND",
- "38017": "Cass, ND",
- "38019": "Cavalier, ND",
- "38021": "Dickey, ND",
- "38023": "Divide, ND",
- "38025": "Dunn, ND",
- "38027": "Eddy, ND",
- "38029": "Emmons, ND",
- "38031": "Foster, ND",
- "38033": "Golden Valley, ND",
- "38035": "Grand Forks, ND",
- "38037": "Grant, ND",
- "38039": "Griggs, ND",
- "38041": "Hettinger, ND",
- "38043": "Kidder, ND",
- "38045": "LaMoure, ND",
- "38047": "Logan, ND",
- "38049": "McHenry, ND",
- "38051": "McIntosh, ND",
- "38053": "McKenzie, ND",
- "38055": "McLean, ND",
- "38057": "Mercer, ND",
- "38059": "Morton, ND",
- "38061": "Mountrail, ND",
- "38063": "Nelson, ND",
- "38065": "Oliver, ND",
- "38067": "Pembina, ND",
- "38069": "Pierce, ND",
- "38071": "Ramsey, ND",
- "38073": "Ransom, ND",
- "38075": "Renville, ND",
- "38077": "Richland, ND",
- "38079": "Rolette, ND",
- "38081": "Sargent, ND",
- "38083": "Sheridan, ND",
- "38085": "Sioux, ND",
- "38087": "Slope, ND",
- "38089": "Stark, ND",
- "38091": "Steele, ND",
- "38093": "Stutsman, ND",
- "38095": "Towner, ND",
- "38097": "Traill, ND",
- "38099": "Walsh, ND",
- "38101": "Ward, ND",
- "38103": "Wells, ND",
- "38105": "Williams, ND",
- "39001": "Adams, OH",
- "39003": "Allen, OH",
- "39005": "Ashland, OH",
- "39007": "Ashtabula, OH",
- "39009": "Athens, OH",
- "39011": "Auglaize, OH",
- "39013": "Belmont, OH",
- "39015": "Brown, OH",
- "39017": "Butler, OH",
- "39019": "Carroll, OH",
- "39021": "Champaign, OH",
- "39023": "Clark, OH",
- "39025": "Clermont, OH",
- "39027": "Clinton, OH",
- "39029": "Columbiana, OH",
- "39031": "Coshocton, OH",
- "39033": "Crawford, OH",
- "39035": "Cuyahoga, OH",
- "39037": "Darke, OH",
- "39039": "Defiance, OH",
- "39041": "Delaware, OH",
- "39043": "Erie, OH",
- "39045": "Fairfield, OH",
- "39047": "Fayette, OH",
- "39049": "Franklin, OH",
- "39051": "Fulton, OH",
- "39053": "Gallia, OH",
- "39055": "Geauga, OH",
- "39057": "Greene, OH",
- "39059": "Guernsey, OH",
- "39061": "Hamilton, OH",
- "39063": "Hancock, OH",
- "39065": "Hardin, OH",
- "39067": "Harrison, OH",
- "39069": "Henry, OH",
- "39071": "Highland, OH",
- "39073": "Hocking, OH",
- "39075": "Holmes, OH",
- "39077": "Huron, OH",
- "39079": "Jackson, OH",
- "39081": "Jefferson, OH",
- "39083": "Knox, OH",
- "39085": "Lake, OH",
- "39087": "Lawrence, OH",
- "39089": "Licking, OH",
- "39091": "Logan, OH",
- "39093": "Lorain, OH",
- "39095": "Lucas, OH",
- "39097": "Madison, OH",
- "39099": "Mahoning, OH",
- "39101": "Marion, OH",
- "39103": "Medina, OH",
- "39105": "Meigs, OH",
- "39107": "Mercer, OH",
- "39109": "Miami, OH",
- "39111": "Monroe, OH",
- "39113": "Montgomery, OH",
- "39115": "Morgan, OH",
- "39117": "Morrow, OH",
- "39119": "Muskingum, OH",
- "39121": "Noble, OH",
- "39123": "Ottawa, OH",
- "39125": "Paulding, OH",
- "39127": "Perry, OH",
- "39129": "Pickaway, OH",
- "39131": "Pike, OH",
- "39133": "Portage, OH",
- "39135": "Preble, OH",
- "39137": "Putnam, OH",
- "39139": "Richland, OH",
- "39141": "Ross, OH",
- "39143": "Sandusky, OH",
- "39145": "Scioto, OH",
- "39147": "Seneca, OH",
- "39149": "Shelby, OH",
- "39151": "Stark, OH",
- "39153": "Summit, OH",
- "39155": "Trumbull, OH",
- "39157": "Tuscarawas, OH",
- "39159": "Union, OH",
- "39161": "Van Wert, OH",
- "39163": "Vinton, OH",
- "39165": "Warren, OH",
- "39167": "Washington, OH",
- "39169": "Wayne, OH",
- "39171": "Williams, OH",
- "39173": "Wood, OH",
- "39175": "Wyandot, OH",
- "40001": "Adair, OK",
- "40003": "Alfalfa, OK",
- "40005": "Atoka, OK",
- "40007": "Beaver, OK",
- "40009": "Beckham, OK",
- "40011": "Blaine, OK",
- "40013": "Bryan, OK",
- "40015": "Caddo, OK",
- "40017": "Canadian, OK",
- "40019": "Carter, OK",
- "40021": "Cherokee, OK",
- "40023": "Choctaw, OK",
- "40025": "Cimarron, OK",
- "40027": "Cleveland, OK",
- "40029": "Coal, OK",
- "40031": "Comanche, OK",
- "40033": "Cotton, OK",
- "40035": "Craig, OK",
- "40037": "Creek, OK",
- "40039": "Custer, OK",
- "40041": "Delaware, OK",
- "40043": "Dewey, OK",
- "40045": "Ellis, OK",
- "40047": "Garfield, OK",
- "40049": "Garvin, OK",
- "40051": "Grady, OK",
- "40053": "Grant, OK",
- "40055": "Greer, OK",
- "40057": "Harmon, OK",
- "40059": "Harper, OK",
- "40061": "Haskell, OK",
- "40063": "Hughes, OK",
- "40065": "Jackson, OK",
- "40067": "Jefferson, OK",
- "40069": "Johnston, OK",
- "40071": "Kay, OK",
- "40073": "Kingfisher, OK",
- "40075": "Kiowa, OK",
- "40077": "Latimer, OK",
- "40079": "Le Flore, OK",
- "40081": "Lincoln, OK",
- "40083": "Logan, OK",
- "40085": "Love, OK",
- "40087": "McClain, OK",
- "40089": "McCurtain, OK",
- "40091": "McIntosh, OK",
- "40093": "Major, OK",
- "40095": "Marshall, OK",
- "40097": "Mayes, OK",
- "40099": "Murray, OK",
- "40101": "Muskogee, OK",
- "40103": "Noble, OK",
- "40105": "Nowata, OK",
- "40107": "Okfuskee, OK",
- "40109": "Oklahoma, OK",
- "40111": "Okmulgee, OK",
- "40113": "Osage, OK",
- "40115": "Ottawa, OK",
- "40117": "Pawnee, OK",
- "40119": "Payne, OK",
- "40121": "Pittsburg, OK",
- "40123": "Pontotoc, OK",
- "40125": "Pottawatomie, OK",
- "40127": "Pushmataha, OK",
- "40129": "Roger Mills, OK",
- "40131": "Rogers, OK",
- "40133": "Seminole, OK",
- "40135": "Sequoyah, OK",
- "40137": "Stephens, OK",
- "40139": "Texas, OK",
- "40141": "Tillman, OK",
- "40143": "Tulsa, OK",
- "40145": "Wagoner, OK",
- "40147": "Washington, OK",
- "40149": "Washita, OK",
- "40151": "Woods, OK",
- "40153": "Woodward, OK",
- "41001": "Baker, OR",
- "41003": "Benton, OR",
- "41005": "Clackamas, OR",
- "41007": "Clatsop, OR",
- "41009": "Columbia, OR",
- "41011": "Coos, OR",
- "41013": "Crook, OR",
- "41015": "Curry, OR",
- "41017": "Deschutes, OR",
- "41019": "Douglas, OR",
- "41021": "Gilliam, OR",
- "41023": "Grant, OR",
- "41025": "Harney, OR",
- "41027": "Hood River, OR",
- "41029": "Jackson, OR",
- "41031": "Jefferson, OR",
- "41033": "Josephine, OR",
- "41035": "Klamath, OR",
- "41037": "Lake, OR",
- "41039": "Lane, OR",
- "41041": "Lincoln, OR",
- "41043": "Linn, OR",
- "41045": "Malheur, OR",
- "41047": "Marion, OR",
- "41049": "Morrow, OR",
- "41051": "Multnomah, OR",
- "41053": "Polk, OR",
- "41055": "Sherman, OR",
- "41057": "Tillamook, OR",
- "41059": "Umatilla, OR",
- "41061": "Union, OR",
- "41063": "Wallowa, OR",
- "41065": "Wasco, OR",
- "41067": "Washington, OR",
- "41069": "Wheeler, OR",
- "41071": "Yamhill, OR",
- "42001": "Adams, PA",
- "42003": "Allegheny, PA",
- "42005": "Armstrong, PA",
- "42007": "Beaver, PA",
- "42009": "Bedford, PA",
- "42011": "Berks, PA",
- "42013": "Blair, PA",
- "42015": "Bradford, PA",
- "42017": "Bucks, PA",
- "42019": "Butler, PA",
- "42021": "Cambria, PA",
- "42023": "Cameron, PA",
- "42025": "Carbon, PA",
- "42027": "Centre, PA",
- "42029": "Chester, PA",
- "42031": "Clarion, PA",
- "42033": "Clearfield, PA",
- "42035": "Clinton, PA",
- "42037": "Columbia, PA",
- "42039": "Crawford, PA",
- "42041": "Cumberland, PA",
- "42043": "Dauphin, PA",
- "42045": "Delaware, PA",
- "42047": "Elk, PA",
- "42049": "Erie, PA",
- "42051": "Fayette, PA",
- "42053": "Forest, PA",
- "42055": "Franklin, PA",
- "42057": "Fulton, PA",
- "42059": "Greene, PA",
- "42061": "Huntingdon, PA",
- "42063": "Indiana, PA",
- "42065": "Jefferson, PA",
- "42067": "Juniata, PA",
- "42069": "Lackawanna, PA",
- "42071": "Lancaster, PA",
- "42073": "Lawrence, PA",
- "42075": "Lebanon, PA",
- "42077": "Lehigh, PA",
- "42079": "Luzerne, PA",
- "42081": "Lycoming, PA",
- "42083": "McKean, PA",
- "42085": "Mercer, PA",
- "42087": "Mifflin, PA",
- "42089": "Monroe, PA",
- "42091": "Montgomery, PA",
- "42093": "Montour, PA",
- "42095": "Northampton, PA",
- "42097": "Northumberland, PA",
- "42099": "Perry, PA",
- "42101": "Philadelphia, PA",
- "42103": "Pike, PA",
- "42105": "Potter, PA",
- "42107": "Schuylkill, PA",
- "42109": "Snyder, PA",
- "42111": "Somerset, PA",
- "42113": "Sullivan, PA",
- "42115": "Susquehanna, PA",
- "42117": "Tioga, PA",
- "42119": "Union, PA",
- "42121": "Venango, PA",
- "42123": "Warren, PA",
- "42125": "Washington, PA",
- "42127": "Wayne, PA",
- "42129": "Westmoreland, PA",
- "42131": "Wyoming, PA",
- "42133": "York, PA",
- "44001": "Bristol, RI",
- "44003": "Kent, RI",
- "44005": "Newport, RI",
- "44007": "Providence, RI",
- "44009": "Washington, RI",
- "45001": "Abbeville, SC",
- "45003": "Aiken, SC",
- "45005": "Allendale, SC",
- "45007": "Anderson, SC",
- "45009": "Bamberg, SC",
- "45011": "Barnwell, SC",
- "45013": "Beaufort, SC",
- "45015": "Berkeley, SC",
- "45017": "Calhoun, SC",
- "45019": "Charleston, SC",
- "45021": "Cherokee, SC",
- "45023": "Chester, SC",
- "45025": "Chesterfield, SC",
- "45027": "Clarendon, SC",
- "45029": "Colleton, SC",
- "45031": "Darlington, SC",
- "45033": "Dillon, SC",
- "45035": "Dorchester, SC",
- "45037": "Edgefield, SC",
- "45039": "Fairfield, SC",
- "45041": "Florence, SC",
- "45043": "Georgetown, SC",
- "45045": "Greenville, SC",
- "45047": "Greenwood, SC",
- "45049": "Hampton, SC",
- "45051": "Horry, SC",
- "45053": "Jasper, SC",
- "45055": "Kershaw, SC",
- "45057": "Lancaster, SC",
- "45059": "Laurens, SC",
- "45061": "Lee, SC",
- "45063": "Lexington, SC",
- "45065": "McCormick, SC",
- "45067": "Marion, SC",
- "45069": "Marlboro, SC",
- "45071": "Newberry, SC",
- "45073": "Oconee, SC",
- "45075": "Orangeburg, SC",
- "45077": "Pickens, SC",
- "45079": "Richland, SC",
- "45081": "Saluda, SC",
- "45083": "Spartanburg, SC",
- "45085": "Sumter, SC",
- "45087": "Union, SC",
- "45089": "Williamsburg, SC",
- "45091": "York, SC",
- "46003": "Aurora, SD",
- "46005": "Beadle, SD",
- "46007": "Bennett, SD",
- "46009": "Bon Homme, SD",
- "46011": "Brookings, SD",
- "46013": "Brown, SD",
- "46015": "Brule, SD",
- "46017": "Buffalo, SD",
- "46019": "Butte, SD",
- "46021": "Campbell, SD",
- "46023": "Charles Mix, SD",
- "46025": "Clark, SD",
- "46027": "Clay, SD",
- "46029": "Codington, SD",
- "46031": "Corson, SD",
- "46033": "Custer, SD",
- "46035": "Davison, SD",
- "46037": "Day, SD",
- "46039": "Deuel, SD",
- "46041": "Dewey, SD",
- "46043": "Douglas, SD",
- "46045": "Edmunds, SD",
- "46047": "Fall River, SD",
- "46049": "Faulk, SD",
- "46051": "Grant, SD",
- "46053": "Gregory, SD",
- "46055": "Haakon, SD",
- "46057": "Hamlin, SD",
- "46059": "Hand, SD",
- "46061": "Hanson, SD",
- "46063": "Harding, SD",
- "46065": "Hughes, SD",
- "46067": "Hutchinson, SD",
- "46069": "Hyde, SD",
- "46071": "Jackson, SD",
- "46073": "Jerauld, SD",
- "46075": "Jones, SD",
- "46077": "Kingsbury, SD",
- "46079": "Lake, SD",
- "46081": "Lawrence, SD",
- "46083": "Lincoln, SD",
- "46085": "Lyman, SD",
- "46087": "McCook, SD",
- "46089": "McPherson, SD",
- "46091": "Marshall, SD",
- "46093": "Meade, SD",
- "46095": "Mellette, SD",
- "46097": "Miner, SD",
- "46099": "Minnehaha, SD",
- "46101": "Moody, SD",
- "46103": "Pennington, SD",
- "46105": "Perkins, SD",
- "46107": "Potter, SD",
- "46109": "Roberts, SD",
- "46111": "Sanborn, SD",
- "46113": "Shannon, SD",
- "46115": "Spink, SD",
- "46117": "Stanley, SD",
- "46119": "Sully, SD",
- "46121": "Todd, SD",
- "46123": "Tripp, SD",
- "46125": "Turner, SD",
- "46127": "Union, SD",
- "46129": "Walworth, SD",
- "46135": "Yankton, SD",
- "46137": "Ziebach, SD",
- "47001": "Anderson, TN",
- "47003": "Bedford, TN",
- "47005": "Benton, TN",
- "47007": "Bledsoe, TN",
- "47009": "Blount, TN",
- "47011": "Bradley, TN",
- "47013": "Campbell, TN",
- "47015": "Cannon, TN",
- "47017": "Carroll, TN",
- "47019": "Carter, TN",
- "47021": "Cheatham, TN",
- "47023": "Chester, TN",
- "47025": "Claiborne, TN",
- "47027": "Clay, TN",
- "47029": "Cocke, TN",
- "47031": "Coffee, TN",
- "47033": "Crockett, TN",
- "47035": "Cumberland, TN",
- "47037": "Davidson, TN",
- "47039": "Decatur, TN",
- "47041": "DeKalb, TN",
- "47043": "Dickson, TN",
- "47045": "Dyer, TN",
- "47047": "Fayette, TN",
- "47049": "Fentress, TN",
- "47051": "Franklin, TN",
- "47053": "Gibson, TN",
- "47055": "Giles, TN",
- "47057": "Grainger, TN",
- "47059": "Greene, TN",
- "47061": "Grundy, TN",
- "47063": "Hamblen, TN",
- "47065": "Hamilton, TN",
- "47067": "Hancock, TN",
- "47069": "Hardeman, TN",
- "47071": "Hardin, TN",
- "47073": "Hawkins, TN",
- "47075": "Haywood, TN",
- "47077": "Henderson, TN",
- "47079": "Henry, TN",
- "47081": "Hickman, TN",
- "47083": "Houston, TN",
- "47085": "Humphreys, TN",
- "47087": "Jackson, TN",
- "47089": "Jefferson, TN",
- "47091": "Johnson, TN",
- "47093": "Knox, TN",
- "47095": "Lake, TN",
- "47097": "Lauderdale, TN",
- "47099": "Lawrence, TN",
- "47101": "Lewis, TN",
- "47103": "Lincoln, TN",
- "47105": "Loudon, TN",
- "47107": "McMinn, TN",
- "47109": "McNairy, TN",
- "47111": "Macon, TN",
- "47113": "Madison, TN",
- "47115": "Marion, TN",
- "47117": "Marshall, TN",
- "47119": "Maury, TN",
- "47121": "Meigs, TN",
- "47123": "Monroe, TN",
- "47125": "Montgomery, TN",
- "47127": "Moore, TN",
- "47129": "Morgan, TN",
- "47131": "Obion, TN",
- "47133": "Overton, TN",
- "47135": "Perry, TN",
- "47137": "Pickett, TN",
- "47139": "Polk, TN",
- "47141": "Putnam, TN",
- "47143": "Rhea, TN",
- "47145": "Roane, TN",
- "47147": "Robertson, TN",
- "47149": "Rutherford, TN",
- "47151": "Scott, TN",
- "47153": "Sequatchie, TN",
- "47155": "Sevier, TN",
- "47157": "Shelby, TN",
- "47159": "Smith, TN",
- "47161": "Stewart, TN",
- "47163": "Sullivan, TN",
- "47165": "Sumner, TN",
- "47167": "Tipton, TN",
- "47169": "Trousdale, TN",
- "47171": "Unicoi, TN",
- "47173": "Union, TN",
- "47175": "Van Buren, TN",
- "47177": "Warren, TN",
- "47179": "Washington, TN",
- "47181": "Wayne, TN",
- "47183": "Weakley, TN",
- "47185": "White, TN",
- "47187": "Williamson, TN",
- "47189": "Wilson, TN",
- "48001": "Anderson, TX",
- "48003": "Andrews, TX",
- "48005": "Angelina, TX",
- "48007": "Aransas, TX",
- "48009": "Archer, TX",
- "48011": "Armstrong, TX",
- "48013": "Atascosa, TX",
- "48015": "Austin, TX",
- "48017": "Bailey, TX",
- "48019": "Bandera, TX",
- "48021": "Bastrop, TX",
- "48023": "Baylor, TX",
- "48025": "Bee, TX",
- "48027": "Bell, TX",
- "48029": "Bexar, TX",
- "48031": "Blanco, TX",
- "48033": "Borden, TX",
- "48035": "Bosque, TX",
- "48037": "Bowie, TX",
- "48039": "Brazoria, TX",
- "48041": "Brazos, TX",
- "48043": "Brewster, TX",
- "48045": "Briscoe, TX",
- "48047": "Brooks, TX",
- "48049": "Brown, TX",
- "48051": "Burleson, TX",
- "48053": "Burnet, TX",
- "48055": "Caldwell, TX",
- "48057": "Calhoun, TX",
- "48059": "Callahan, TX",
- "48061": "Cameron, TX",
- "48063": "Camp, TX",
- "48065": "Carson, TX",
- "48067": "Cass, TX",
- "48069": "Castro, TX",
- "48071": "Chambers, TX",
- "48073": "Cherokee, TX",
- "48075": "Childress, TX",
- "48077": "Clay, TX",
- "48079": "Cochran, TX",
- "48081": "Coke, TX",
- "48083": "Coleman, TX",
- "48085": "Collin, TX",
- "48087": "Collingsworth, TX",
- "48089": "Colorado, TX",
- "48091": "Comal, TX",
- "48093": "Comanche, TX",
- "48095": "Concho, TX",
- "48097": "Cooke, TX",
- "48099": "Coryell, TX",
- "48101": "Cottle, TX",
- "48103": "Crane, TX",
- "48105": "Crockett, TX",
- "48107": "Crosby, TX",
- "48109": "Culberson, TX",
- "48111": "Dallam, TX",
- "48113": "Dallas, TX",
- "48115": "Dawson, TX",
- "48117": "Deaf Smith, TX",
- "48119": "Delta, TX",
- "48121": "Denton, TX",
- "48123": "DeWitt, TX",
- "48125": "Dickens, TX",
- "48127": "Dimmit, TX",
- "48129": "Donley, TX",
- "48131": "Duval, TX",
- "48133": "Eastland, TX",
- "48135": "Ector, TX",
- "48137": "Edwards, TX",
- "48139": "Ellis, TX",
- "48141": "El Paso, TX",
- "48143": "Erath, TX",
- "48145": "Falls, TX",
- "48147": "Fannin, TX",
- "48149": "Fayette, TX",
- "48151": "Fisher, TX",
- "48153": "Floyd, TX",
- "48155": "Foard, TX",
- "48157": "Fort Bend, TX",
- "48159": "Franklin, TX",
- "48161": "Freestone, TX",
- "48163": "Frio, TX",
- "48165": "Gaines, TX",
- "48167": "Galveston, TX",
- "48169": "Garza, TX",
- "48171": "Gillespie, TX",
- "48173": "Glasscock, TX",
- "48175": "Goliad, TX",
- "48177": "Gonzales, TX",
- "48179": "Gray, TX",
- "48181": "Grayson, TX",
- "48183": "Gregg, TX",
- "48185": "Grimes, TX",
- "48187": "Guadalupe, TX",
- "48189": "Hale, TX",
- "48191": "Hall, TX",
- "48193": "Hamilton, TX",
- "48195": "Hansford, TX",
- "48197": "Hardeman, TX",
- "48199": "Hardin, TX",
- "48201": "Harris, TX",
- "48203": "Harrison, TX",
- "48205": "Hartley, TX",
- "48207": "Haskell, TX",
- "48209": "Hays, TX",
- "48211": "Hemphill, TX",
- "48213": "Henderson, TX",
- "48215": "Hidalgo, TX",
- "48217": "Hill, TX",
- "48219": "Hockley, TX",
- "48221": "Hood, TX",
- "48223": "Hopkins, TX",
- "48225": "Houston, TX",
- "48227": "Howard, TX",
- "48229": "Hudspeth, TX",
- "48231": "Hunt, TX",
- "48233": "Hutchinson, TX",
- "48235": "Irion, TX",
- "48237": "Jack, TX",
- "48239": "Jackson, TX",
- "48241": "Jasper, TX",
- "48243": "Jeff Davis, TX",
- "48245": "Jefferson, TX",
- "48247": "Jim Hogg, TX",
- "48249": "Jim Wells, TX",
- "48251": "Johnson, TX",
- "48253": "Jones, TX",
- "48255": "Karnes, TX",
- "48257": "Kaufman, TX",
- "48259": "Kendall, TX",
- "48261": "Kenedy, TX",
- "48263": "Kent, TX",
- "48265": "Kerr, TX",
- "48267": "Kimble, TX",
- "48269": "King, TX",
- "48271": "Kinney, TX",
- "48273": "Kleberg, TX",
- "48275": "Knox, TX",
- "48277": "Lamar, TX",
- "48279": "Lamb, TX",
- "48281": "Lampasas, TX",
- "48283": "La Salle, TX",
- "48285": "Lavaca, TX",
- "48287": "Lee, TX",
- "48289": "Leon, TX",
- "48291": "Liberty, TX",
- "48293": "Limestone, TX",
- "48295": "Lipscomb, TX",
- "48297": "Live Oak, TX",
- "48299": "Llano, TX",
- "48301": "Loving, TX",
- "48303": "Lubbock, TX",
- "48305": "Lynn, TX",
- "48307": "McCulloch, TX",
- "48309": "McLennan, TX",
- "48311": "McMullen, TX",
- "48313": "Madison, TX",
- "48315": "Marion, TX",
- "48317": "Martin, TX",
- "48319": "Mason, TX",
- "48321": "Matagorda, TX",
- "48323": "Maverick, TX",
- "48325": "Medina, TX",
- "48327": "Menard, TX",
- "48329": "Midland, TX",
- "48331": "Milam, TX",
- "48333": "Mills, TX",
- "48335": "Mitchell, TX",
- "48337": "Montague, TX",
- "48339": "Montgomery, TX",
- "48341": "Moore, TX",
- "48343": "Morris, TX",
- "48345": "Motley, TX",
- "48347": "Nacogdoches, TX",
- "48349": "Navarro, TX",
- "48351": "Newton, TX",
- "48353": "Nolan, TX",
- "48355": "Nueces, TX",
- "48357": "Ochiltree, TX",
- "48359": "Oldham, TX",
- "48361": "Orange, TX",
- "48363": "Palo Pinto, TX",
- "48365": "Panola, TX",
- "48367": "Parker, TX",
- "48369": "Parmer, TX",
- "48371": "Pecos, TX",
- "48373": "Polk, TX",
- "48375": "Potter, TX",
- "48377": "Presidio, TX",
- "48379": "Rains, TX",
- "48381": "Randall, TX",
- "48383": "Reagan, TX",
- "48385": "Real, TX",
- "48387": "Red River, TX",
- "48389": "Reeves, TX",
- "48391": "Refugio, TX",
- "48393": "Roberts, TX",
- "48395": "Robertson, TX",
- "48397": "Rockwall, TX",
- "48399": "Runnels, TX",
- "48401": "Rusk, TX",
- "48403": "Sabine, TX",
- "48405": "San Augustine, TX",
- "48407": "San Jacinto, TX",
- "48409": "San Patricio, TX",
- "48411": "San Saba, TX",
- "48413": "Schleicher, TX",
- "48415": "Scurry, TX",
- "48417": "Shackelford, TX",
- "48419": "Shelby, TX",
- "48421": "Sherman, TX",
- "48423": "Smith, TX",
- "48425": "Somervell, TX",
- "48427": "Starr, TX",
- "48429": "Stephens, TX",
- "48431": "Sterling, TX",
- "48433": "Stonewall, TX",
- "48435": "Sutton, TX",
- "48437": "Swisher, TX",
- "48439": "Tarrant, TX",
- "48441": "Taylor, TX",
- "48443": "Terrell, TX",
- "48445": "Terry, TX",
- "48447": "Throckmorton, TX",
- "48449": "Titus, TX",
- "48451": "Tom Green, TX",
- "48453": "Travis, TX",
- "48455": "Trinity, TX",
- "48457": "Tyler, TX",
- "48459": "Upshur, TX",
- "48461": "Upton, TX",
- "48463": "Uvalde, TX",
- "48465": "Val Verde, TX",
- "48467": "Van Zandt, TX",
- "48469": "Victoria, TX",
- "48471": "Walker, TX",
- "48473": "Waller, TX",
- "48475": "Ward, TX",
- "48477": "Washington, TX",
- "48479": "Webb, TX",
- "48481": "Wharton, TX",
- "48483": "Wheeler, TX",
- "48485": "Wichita, TX",
- "48487": "Wilbarger, TX",
- "48489": "Willacy, TX",
- "48491": "Williamson, TX",
- "48493": "Wilson, TX",
- "48495": "Winkler, TX",
- "48497": "Wise, TX",
- "48499": "Wood, TX",
- "48501": "Yoakum, TX",
- "48503": "Young, TX",
- "48505": "Zapata, TX",
- "48507": "Zavala, TX",
- "49001": "Beaver, UT",
- "49003": "Box Elder, UT",
- "49005": "Cache, UT",
- "49007": "Carbon, UT",
- "49009": "Daggett, UT",
- "49011": "Davis, UT",
- "49013": "Duchesne, UT",
- "49015": "Emery, UT",
- "49017": "Garfield, UT",
- "49019": "Grand, UT",
- "49021": "Iron, UT",
- "49023": "Juab, UT",
- "49025": "Kane, UT",
- "49027": "Millard, UT",
- "49029": "Morgan, UT",
- "49031": "Piute, UT",
- "49033": "Rich, UT",
- "49035": "Salt Lake, UT",
- "49037": "San Juan, UT",
- "49039": "Sanpete, UT",
- "49041": "Sevier, UT",
- "49043": "Summit, UT",
- "49045": "Tooele, UT",
- "49047": "Uintah, UT",
- "49049": "Utah, UT",
- "49051": "Wasatch, UT",
- "49053": "Washington, UT",
- "49055": "Wayne, UT",
- "49057": "Weber, UT",
- "50001": "Addison, VT",
- "50003": "Bennington, VT",
- "50005": "Caledonia, VT",
- "50007": "Chittenden, VT",
- "50009": "Essex, VT",
- "50011": "Franklin, VT",
- "50013": "Grand Isle, VT",
- "50015": "Lamoille, VT",
- "50017": "Orange, VT",
- "50019": "Orleans, VT",
- "50021": "Rutland, VT",
- "50023": "Washington, VT",
- "50025": "Windham, VT",
- "50027": "Windsor, VT",
- "51001": "Accomack, VA",
- "51003": "Albemarle, VA",
- "51005": "Alleghany, VA",
- "51007": "Amelia, VA",
- "51009": "Amherst, VA",
- "51011": "Appomattox, VA",
- "51013": "Arlington, VA",
- "51015": "Augusta, VA",
- "51017": "Bath, VA",
- "51019": "Bedford, VA",
- "51021": "Bland, VA",
- "51023": "Botetourt, VA",
- "51025": "Brunswick, VA",
- "51027": "Buchanan, VA",
- "51029": "Buckingham, VA",
- "51031": "Campbell, VA",
- "51033": "Caroline, VA",
- "51035": "Carroll, VA",
- "51036": "Charles City, VA",
- "51037": "Charlotte, VA",
- "51041": "Chesterfield, VA",
- "51043": "Clarke, VA",
- "51045": "Craig, VA",
- "51047": "Culpeper, VA",
- "51049": "Cumberland, VA",
- "51051": "Dickenson, VA",
- "51053": "Dinwiddie, VA",
- "51057": "Essex, VA",
- "51059": "Fairfax, VA",
- "51061": "Fauquier, VA",
- "51063": "Floyd, VA",
- "51065": "Fluvanna, VA",
- "51067": "Franklin, VA",
- "51069": "Frederick, VA",
- "51071": "Giles, VA",
- "51073": "Gloucester, VA",
- "51075": "Goochland, VA",
- "51077": "Grayson, VA",
- "51079": "Greene, VA",
- "51081": "Greensville, VA",
- "51083": "Halifax, VA",
- "51085": "Hanover, VA",
- "51087": "Henrico, VA",
- "51089": "Henry, VA",
- "51091": "Highland, VA",
- "51093": "Isle of Wight, VA",
- "51095": "James City, VA",
- "51097": "King and Queen, VA",
- "51099": "King George, VA",
- "51101": "King William, VA",
- "51103": "Lancaster, VA",
- "51105": "Lee, VA",
- "51107": "Loudoun, VA",
- "51109": "Louisa, VA",
- "51111": "Lunenburg, VA",
- "51113": "Madison, VA",
- "51115": "Mathews, VA",
- "51117": "Mecklenburg, VA",
- "51119": "Middlesex, VA",
- "51121": "Montgomery, VA",
- "51125": "Nelson, VA",
- "51127": "New Kent, VA",
- "51131": "Northampton, VA",
- "51133": "Northumberland, VA",
- "51135": "Nottoway, VA",
- "51137": "Orange, VA",
- "51139": "Page, VA",
- "51141": "Patrick, VA",
- "51143": "Pittsylvania, VA",
- "51145": "Powhatan, VA",
- "51147": "Prince Edward, VA",
- "51149": "Prince George, VA",
- "51153": "Prince William, VA",
- "51155": "Pulaski, VA",
- "51157": "Rappahannock, VA",
- "51159": "Richmond, VA",
- "51161": "Roanoke, VA",
- "51163": "Rockbridge, VA",
- "51165": "Rockingham, VA",
- "51167": "Russell, VA",
- "51169": "Scott, VA",
- "51171": "Shenandoah, VA",
- "51173": "Smyth, VA",
- "51175": "Southampton, VA",
- "51177": "Spotsylvania, VA",
- "51179": "Stafford, VA",
- "51181": "Surry, VA",
- "51183": "Sussex, VA",
- "51185": "Tazewell, VA",
- "51187": "Warren, VA",
- "51191": "Washington, VA",
- "51193": "Westmoreland, VA",
- "51195": "Wise, VA",
- "51197": "Wythe, VA",
- "51199": "York, VA",
- "51510": "Alexandria, VA",
- "51515": "Bedford, VA",
- "51520": "Bristol, VA",
- "51530": "Buena Vista, VA",
- "51540": "Charlottesville, VA",
- "51550": "Chesapeake, VA",
- "51570": "Colonial Heights, VA",
- "51580": "Covington, VA",
- "51590": "Danville, VA",
- "51595": "Emporia, VA",
- "51600": "Fairfax, VA",
- "51610": "Falls Church, VA",
- "51620": "Franklin, VA",
- "51630": "Fredericksburg, VA",
- "51640": "Galax, VA",
- "51650": "Hampton, VA",
- "51660": "Harrisonburg, VA",
- "51670": "Hopewell, VA",
- "51678": "Lexington, VA",
- "51680": "Lynchburg, VA",
- "51683": "Manassas, VA",
- "51685": "Manassas Park, VA",
- "51690": "Martinsville, VA",
- "51700": "Newport News, VA",
- "51710": "Norfolk, VA",
- "51720": "Norton, VA",
- "51730": "Petersburg, VA",
- "51735": "Poquoson, VA",
- "51740": "Portsmouth, VA",
- "51750": "Radford, VA",
- "51760": "Richmond, VA",
- "51770": "Roanoke, VA",
- "51775": "Salem, VA",
- "51790": "Staunton, VA",
- "51800": "Suffolk, VA",
- "51810": "Virginia Beach, VA",
- "51820": "Waynesboro, VA",
- "51830": "Williamsburg, VA",
- "51840": "Winchester, VA",
- "53001": "Adams, WA",
- "53003": "Asotin, WA",
- "53005": "Benton, WA",
- "53007": "Chelan, WA",
- "53009": "Clallam, WA",
- "53011": "Clark, WA",
- "53013": "Columbia, WA",
- "53015": "Cowlitz, WA",
- "53017": "Douglas, WA",
- "53019": "Ferry, WA",
- "53021": "Franklin, WA",
- "53023": "Garfield, WA",
- "53025": "Grant, WA",
- "53027": "Grays Harbor, WA",
- "53029": "Island, WA",
- "53031": "Jefferson, WA",
- "53033": "King, WA",
- "53035": "Kitsap, WA",
- "53037": "Kittitas, WA",
- "53039": "Klickitat, WA",
- "53041": "Lewis, WA",
- "53043": "Lincoln, WA",
- "53045": "Mason, WA",
- "53047": "Okanogan, WA",
- "53049": "Pacific, WA",
- "53051": "Pend Oreille, WA",
- "53053": "Pierce, WA",
- "53055": "San Juan, WA",
- "53057": "Skagit, WA",
- "53059": "Skamania, WA",
- "53061": "Snohomish, WA",
- "53063": "Spokane, WA",
- "53065": "Stevens, WA",
- "53067": "Thurston, WA",
- "53069": "Wahkiakum, WA",
- "53071": "Walla Walla, WA",
- "53073": "Whatcom, WA",
- "53075": "Whitman, WA",
- "53077": "Yakima, WA",
- "54001": "Barbour, WV",
- "54003": "Berkeley, WV",
- "54005": "Boone, WV",
- "54007": "Braxton, WV",
- "54009": "Brooke, WV",
- "54011": "Cabell, WV",
- "54013": "Calhoun, WV",
- "54015": "Clay, WV",
- "54017": "Doddridge, WV",
- "54019": "Fayette, WV",
- "54021": "Gilmer, WV",
- "54023": "Grant, WV",
- "54025": "Greenbrier, WV",
- "54027": "Hampshire, WV",
- "54029": "Hancock, WV",
- "54031": "Hardy, WV",
- "54033": "Harrison, WV",
- "54035": "Jackson, WV",
- "54037": "Jefferson, WV",
- "54039": "Kanawha, WV",
- "54041": "Lewis, WV",
- "54043": "Lincoln, WV",
- "54045": "Logan, WV",
- "54047": "McDowell, WV",
- "54049": "Marion, WV",
- "54051": "Marshall, WV",
- "54053": "Mason, WV",
- "54055": "Mercer, WV",
- "54057": "Mineral, WV",
- "54059": "Mingo, WV",
- "54061": "Monongalia, WV",
- "54063": "Monroe, WV",
- "54065": "Morgan, WV",
- "54067": "Nicholas, WV",
- "54069": "Ohio, WV",
- "54071": "Pendleton, WV",
- "54073": "Pleasants, WV",
- "54075": "Pocahontas, WV",
- "54077": "Preston, WV",
- "54079": "Putnam, WV",
- "54081": "Raleigh, WV",
- "54083": "Randolph, WV",
- "54085": "Ritchie, WV",
- "54087": "Roane, WV",
- "54089": "Summers, WV",
- "54091": "Taylor, WV",
- "54093": "Tucker, WV",
- "54095": "Tyler, WV",
- "54097": "Upshur, WV",
- "54099": "Wayne, WV",
- "54101": "Webster, WV",
- "54103": "Wetzel, WV",
- "54105": "Wirt, WV",
- "54107": "Wood, WV",
- "54109": "Wyoming, WV",
- "55001": "Adams, WI",
- "55003": "Ashland, WI",
- "55005": "Barron, WI",
- "55007": "Bayfield, WI",
- "55009": "Brown, WI",
- "55011": "Buffalo, WI",
- "55013": "Burnett, WI",
- "55015": "Calumet, WI",
- "55017": "Chippewa, WI",
- "55019": "Clark, WI",
- "55021": "Columbia, WI",
- "55023": "Crawford, WI",
- "55025": "Dane, WI",
- "55027": "Dodge, WI",
- "55029": "Door, WI",
- "55031": "Douglas, WI",
- "55033": "Dunn, WI",
- "55035": "Eau Claire, WI",
- "55037": "Florence, WI",
- "55039": "Fond du Lac, WI",
- "55041": "Forest, WI",
- "55043": "Grant, WI",
- "55045": "Green, WI",
- "55047": "Green Lake, WI",
- "55049": "Iowa, WI",
- "55051": "Iron, WI",
- "55053": "Jackson, WI",
- "55055": "Jefferson, WI",
- "55057": "Juneau, WI",
- "55059": "Kenosha, WI",
- "55061": "Kewaunee, WI",
- "55063": "La Crosse, WI",
- "55065": "Lafayette, WI",
- "55067": "Langlade, WI",
- "55069": "Lincoln, WI",
- "55071": "Manitowoc, WI",
- "55073": "Marathon, WI",
- "55075": "Marinette, WI",
- "55077": "Marquette, WI",
- "55078": "Menominee, WI",
- "55079": "Milwaukee, WI",
- "55081": "Monroe, WI",
- "55083": "Oconto, WI",
- "55085": "Oneida, WI",
- "55087": "Outagamie, WI",
- "55089": "Ozaukee, WI",
- "55091": "Pepin, WI",
- "55093": "Pierce, WI",
- "55095": "Polk, WI",
- "55097": "Portage, WI",
- "55099": "Price, WI",
- "55101": "Racine, WI",
- "55103": "Richland, WI",
- "55105": "Rock, WI",
- "55107": "Rusk, WI",
- "55109": "St. Croix, WI",
- "55111": "Sauk, WI",
- "55113": "Sawyer, WI",
- "55115": "Shawano, WI",
- "55117": "Sheboygan, WI",
- "55119": "Taylor, WI",
- "55121": "Trempealeau, WI",
- "55123": "Vernon, WI",
- "55125": "Vilas, WI",
- "55127": "Walworth, WI",
- "55129": "Washburn, WI",
- "55131": "Washington, WI",
- "55133": "Waukesha, WI",
- "55135": "Waupaca, WI",
- "55137": "Waushara, WI",
- "55139": "Winnebago, WI",
- "55141": "Wood, WI",
- "56001": "Albany, WY",
- "56003": "Big Horn, WY",
- "56005": "Campbell, WY",
- "56007": "Carbon, WY",
- "56009": "Converse, WY",
- "56011": "Crook, WY",
- "56013": "Fremont, WY",
- "56015": "Goshen, WY",
- "56017": "Hot Springs, WY",
- "56019": "Johnson, WY",
- "56021": "Laramie, WY",
- "56023": "Lincoln, WY",
- "56025": "Natrona, WY",
- "56027": "Niobrara, WY",
- "56029": "Park, WY",
- "56031": "Platte, WY",
- "56033": "Sheridan, WY",
- "56035": "Sublette, WY",
- "56037": "Sweetwater, WY",
- "56039": "Teton, WY",
- "56041": "Uinta, WY",
- "56043": "Washakie, WY",
- "56045": "Weston, WY",
- "60010": "Eastern District, AS",
- "60020": "Manu'a District, AS",
- "60030": "Rose Island, AS",
- "60040": "Swains Island, AS",
- "60050": "Western District, AS",
- "66010": "Guam, GU",
- "69085": "Northern Islands, MP",
- "69100": "Rota, MP",
- "69110": "Saipan, MP",
- "69120": "Tinian, MP",
- "72001": "Adjuntas, PR",
- "72003": "Aguada, PR",
- "72005": "Aguadilla, PR",
- "72007": "Aguas Buenas, PR",
- "72009": "Aibonito, PR",
- "72011": "Anasco, PR",
- "72013": "Arecibo, PR",
- "72015": "Arroyo, PR",
- "72017": "Barceloneta, PR",
- "72019": "Barranquitas, PR",
- "72021": "Bayamon, PR",
- "72023": "Cabo Rojo, PR",
- "72025": "Caguas, PR",
- "72027": "Camuy, PR",
- "72029": "Canovanas, PR",
- "72031": "Carolina, PR",
- "72033": "Catano, PR",
- "72035": "Cayey, PR",
- "72037": "Ceiba, PR",
- "72039": "Ciales, PR",
- "72041": "Cidra, PR",
- "72043": "Coamo, PR",
- "72045": "Comerio, PR",
- "72047": "Corozal, PR",
- "72049": "Culebra, PR",
- "72051": "Dorado, PR",
- "72053": "Fajardo, PR",
- "72054": "Florida, PR",
- "72055": "Guanica, PR",
- "72057": "Guayama, PR",
- "72059": "Guayanilla, PR",
- "72061": "Guaynabo, PR",
- "72063": "Gurabo, PR",
- "72065": "Hatillo, PR",
- "72067": "Hormigueros, PR",
- "72069": "Humacao, PR",
- "72071": "Isabela, PR",
- "72073": "Jayuya, PR",
- "72075": "Juana Diaz, PR",
- "72077": "Juncos, PR",
- "72079": "Lajas, PR",
- "72081": "Lares, PR",
- "72083": "Las Marias, PR",
- "72085": "Las Piedras, PR",
- "72087": "Loiza, PR",
- "72089": "Luquillo, PR",
- "72091": "Manati, PR",
- "72093": "Maricao, PR",
- "72095": "Maunabo, PR",
- "72097": "Mayaguez, PR",
- "72099": "Moca, PR",
- "72101": "Morovis, PR",
- "72103": "Naguabo, PR",
- "72105": "Naranjito, PR",
- "72107": "Orocovis, PR",
- "72109": "Patillas, PR",
- "72111": "Penuelas, PR",
- "72113": "Ponce, PR",
- "72115": "Quebradillas, PR",
- "72117": "Rincon, PR",
- "72119": "Rio Grande, PR",
- "72121": "Sabana Grande, PR",
- "72123": "Salinas, PR",
- "72125": "San German, PR",
- "72127": "San Juan, PR",
- "72129": "San Lorenzo, PR",
- "72131": "San Sebastian, PR",
- "72133": "Santa Isabel, PR",
- "72135": "Toa Alta, PR",
- "72137": "Toa Baja, PR",
- "72139": "Trujillo Alto, PR",
- "72141": "Utuado, PR",
- "72143": "Vega Alta, PR",
- "72145": "Vega Baja, PR",
- "72147": "Vieques, PR",
- "72149": "Villalba, PR",
- "72151": "Yabucoa, PR",
- "72153": "Yauco, PR",
- "74300": "Midway Islands, UM",
- "78010": "St. Croix, VI",
- "78020": "St. John, VI",
- "78030": "St. Thomas, VI"
-}
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/perl -w
-# mysql2pgsql
-# MySQL to PostgreSQL dump file converter
-#
-# For usage: perl mysql2pgsql.perl --help
-#
-# ddl statments are changed but none or only minimal real data
-# formatting are done.
-# data consistency is up to the DBA.
-#
-# (c) 2004-2007 Jose M Duarte and Joseph Speigle ... gborg
-#
-# (c) 2000-2004 Maxim Rudensky <fonin@omnistaronline.com>
-# (c) 2000 Valentine Danilchuk <valdan@ziet.zhitomir.ua>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by the Max Rudensky
-# and its contributors.
-# 4. Neither the name of the author 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 AUTHOR 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 AUTHOR 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.
-
-use Getopt::Long;
-
-use POSIX;
-
-use strict;
-use warnings;
-
-
-# main sections
-# -------------
-# 1 variable declarations
-# 2 subroutines
-# 3 get commandline options and specify help statement
-# 4 loop through file and process
-# 5. print_plpgsql function prototype
-
-#################################################################
-# 1. variable declarations
-#################################################################
-# command line options
-my( $ENC_IN, $ENC_OUT, $PRESERVE_CASE, $HELP, $DEBUG, $SCHEMA, $LOWERCASE, $CHAR2VARCHAR, $NODROP, $SEP_FILE, $opt_debug, $opt_help, $opt_schema, $opt_preserve_case, $opt_char2varchar, $opt_nodrop, $opt_sepfile, $opt_enc_in, $opt_enc_out );
-# variables for constructing pre-create-table entities
-my $pre_create_sql=''; # comments, 'enum' constraints preceding create table statement
-my $auto_increment_seq= ''; # so we can easily substitute it if we need a default value
-my $create_sql=''; # all the datatypes in the create table section
-my $post_create_sql=''; # create indexes, foreign keys, table comments
-my $function_create_sql = ''; # for the set (function,trigger) and CURRENT_TIMESTAMP ( function,trigger )
-# constraints
-my ($type, $column_valuesStr, @column_values, $value );
-my %constraints=(); # holds values constraints used to emulate mysql datatypes (e.g. year, set)
-# datatype conversion variables
-my ( $index,$seq);
-my ( $column_name, $col, $quoted_column);
-my ( @year_holder, $year, $constraint_table_name);
-my $table=""; # table_name for create sql statements
-my $table_no_quotes=""; # table_name for create sql statements
-my $sl = '^\s+\w+\s+'; # matches the column name
-my $tables_first_timestamp_column= 1; # decision to print warnings about default_timestamp not being in postgres
-my $mysql_numeric_datatypes = "TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT|REAL|DOUBLE|FLOAT|DECIMAL|NUMERIC";
-my $mysql_datetime_datatypes = "|DATE|TIME|TIMESTAMP|DATETIME|YEAR";
-my $mysql_text_datatypes = "CHAR|VARCHAR|BINARY|VARBINARY|TINYBLOB|BLOB|MEDIUMBLOB|LONGBLOB|TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|ENUM|SET";
-my $mysql_datatypesStr = $mysql_numeric_datatypes . "|". $mysql_datetime_datatypes . "|". $mysql_text_datatypes ;
-# handling INSERT INTO statements
-my $rowRe = qr{
- \( # opening parens
- ( # (start capture)
- (?: # (start group)
- ' # string start
- [^'\\]* # up to string-end or backslash (escape)
- (?: # (start group)
- \\. # gobble escaped character
- [^'\\]* # up to string-end of backslash
- )* # (end group, repeat zero or more)
- ' # string end
- | # (OR)
- .*? # everything else (not strings)
- )* # (end group, repeat zero or more)
- ) # (end capture)
- \) # closing parent
-}x;
-
-my ($insert_table, $valueString);
-#
-########################################################
-# 2. subroutines
-#
-# get_identifier
-# print_post_create_sql()
-# quote_and_lc()
-# make_plpgsql($table,$column_name) -- at end of file
-########################################################
-
-# returns an identifier with the given suffix doing controlled
-# truncation if necessary
-sub get_identifier($$$) {
- my ($table, $col, $suffix) = @_;
- my $name = '';
- $table=~s/\"//g; # make sure that $table doesn't have quotes so we don't end up with redundant quoting
- # in the case of multiple columns
- my @cols = split(/,/,$col);
- $col =~ s/,//g;
- # in case all columns together too long we have to truncate them
- if (length($col) > 55) {
- my $totaltocut = length($col)-55;
- my $tocut = ceil($totaltocut / @cols);
- @cols = map {substr($_,0,abs(length($_)-$tocut))} @cols;
- $col="";
- foreach (@cols){
- $col.=$_;
- }
- }
-
- my $max_table_length = 63 - length("_${col}_$suffix");
-
- if (length($table) > $max_table_length) {
- $table = substr($table, length($table) - $max_table_length, $max_table_length);
- }
- return quote_and_lc("${table}_${col}_${suffix}");
-}
-
-
-#
-#
-# called when we encounter next CREATE TABLE statement
-# also called at EOF to print out for last table
-# prints comments, indexes, foreign key constraints (the latter 2 possibly to a separate file)
-sub print_post_create_sql() {
- my ( @create_idx_comments_constraints_commandsArr, $stmts, $table_field_combination);
- my %stmts;
- # loop to check for duplicates in $post_create_sql
- # Needed because of duplicate key declarations ( PRIMARY KEY and KEY), auto_increment columns
-
- @create_idx_comments_constraints_commandsArr = split(';\n?', $post_create_sql);
- if ($SEP_FILE) {
- open(SEP_FILE, ">>:encoding($ENC_OUT)", $SEP_FILE) or die "Unable to open $SEP_FILE for output: $!\n";
- }
-
- foreach (@create_idx_comments_constraints_commandsArr) {
- if (m/CREATE INDEX "*(\S+)"*\s/i) { # CREATE INDEX korean_english_wordsize_idx ON korean_english USING btree (wordsize);
- $table_field_combination = $1;
- # if this particular table_field_combination was already used do not print the statement:
- if ($SEP_FILE) {
- print SEP_FILE "$_;\n" if !defined($stmts{$table_field_combination});
- } else {
- print OUT "$_;\n" if !defined($stmts{$table_field_combination});
- }
- $stmts{$table_field_combination} = 1;
- }
- elsif (m/COMMENT/i) { # COMMENT ON object IS 'text'; but comment may be part of table name so use 'elsif'
- print OUT "$_;\n"
- } else { # foreign key constraint or comments (those preceded by -- )
- if ($SEP_FILE) {
- print SEP_FILE "$_;\n";
- } else {
- print OUT "$_;\n"
- }
- }
- }
-
- if ($SEP_FILE) {
- close SEP_FILE;
- }
- $post_create_sql='';
- # empty %constraints for next " create table" statement
-}
-
-# quotes a string or a multicolumn string (comma separated)
-# and optionally lowercase (if LOWERCASE is set)
-# lowercase .... if user wants default postgres behavior
-# quotes .... to preserve keywords and to preserve case when case-sensitive tables are to be used
-sub quote_and_lc($)
-{
- my $col = shift;
- if ($LOWERCASE) {
- $col = lc($col);
- }
- if ($col =~ m/,/) {
- my @cols = split(/,\s?/, $col);
- @cols = map {"\"$_\""} @cols;
- return join(', ', @cols);
- } else {
- return "\"$col\"";
- }
-}
-
-########################################################
-# 3. get commandline options and maybe print help
-########################################################
-
-GetOptions("help", "debug"=> \$opt_debug, "schema=s" => \$SCHEMA, "preserve_case" => \$opt_preserve_case, "char2varchar" => \$opt_char2varchar, "nodrop" => \$opt_nodrop, "sepfile=s" => \$opt_sepfile, "enc_in=s" => \$opt_enc_in, "enc_out=s" => \$opt_enc_out );
-
-$HELP = $opt_help || 0;
-$DEBUG = $opt_debug || 0;
-$PRESERVE_CASE = $opt_preserve_case || 0;
-if ($PRESERVE_CASE == 1) { $LOWERCASE = 0; }
-else { $LOWERCASE = 1; }
-$CHAR2VARCHAR = $opt_char2varchar || 0;
-$NODROP = $opt_nodrop || 0;
-$SEP_FILE = $opt_sepfile || 0;
-$ENC_IN = $opt_enc_in || 'utf8';
-$ENC_OUT = $opt_enc_out || 'utf8';
-
-if (($HELP) || ! defined($ARGV[0]) || ! defined($ARGV[1])) {
- print "\n\nUsage: perl $0 {--help --debug --preserve_case --char2varchar --nodrop --schema --sepfile --enc_in --enc_out } mysql.sql pg.sql\n";
- print "\t* OPTIONS WITHOUT ARGS\n";
- print "\t--help: prints this message \n";
- print "\t--debug: output the commented-out mysql line above the postgres line in pg.sql \n";
- print "\t--preserve_case: prevents automatic case-lowering of column and table names\n";
- print "\t\tIf you want to preserve case, you must set this flag. For example,\n";
- print "\t\tIf your client application quotes table and column-names and they have cases in them, set this flag\n";
- print "\t--char2varchar: converts all char fields to varchar\n";
- print "\t--nodrop: strips out DROP TABLE statements\n";
- print "\t\totherise harmless warnings are printed by psql when the dropped table does not exist\n";
- print "\n\t* OPTIONS WITH ARGS\n";
- print "\t--schema: outputs a line into the postgres sql file setting search_path \n";
- print "\t--sepfile: output foreign key constraints and indexes to a separate file so that it can be\n";
- print "\t\timported after large data set is inserted from another dump file\n";
- print "\t--enc_in: encoding of mysql in file (default utf8) \n";
- print "\t--enc_out: encoding of postgres out file (default utf8) \n";
- print "\n\t* REQUIRED ARGUMENTS\n";
- if (defined ($ARGV[0])) {
- print "\tmysql.sql ($ARGV[0])\n";
- } else {
- print "\tmysql.sql (undefined)\n";
- }
- if (defined ($ARGV[1])) {
- print "\tpg.sql ($ARGV[1])\n";
- } else {
- print "\tpg.sql (undefined)\n";
- }
- print "\n";
- exit 1;
-}
-########################################################
-# 4. process through mysql_dump.sql file
-# in a big loop
-########################################################
-
-# open in and out files
-open(IN,"<:encoding($ENC_IN)", $ARGV[0]) || die "can't open mysql dump file $ARGV[0]";
-open(OUT,">:encoding($ENC_OUT)", $ARGV[1]) || die "can't open pg dump file $ARGV[1]";
-
-# output header
-print OUT "--\n";
-print OUT "-- Generated from mysql2pgsql.perl\n";
-print OUT "-- http://gborg.postgresql.org/project/mysql2psql/\n";
-print OUT "-- (c) 2001 - 2007 Jose M. Duarte, Joseph Speigle\n";
-print OUT "--\n";
-print OUT "\n";
-print OUT "-- warnings are printed for drop tables if they do not exist\n";
-print OUT "-- please see http://archives.postgresql.org/pgsql-novice/2004-10/msg00158.php\n\n";
-print OUT "-- ##############################################################\n";
-
-if ($SCHEMA ) {
- print OUT "set search_path='" . $SCHEMA . "'\\g\n" ;
-}
-
-# loop through mysql file on a per-line basis
-while(<IN>) {
-
-############## flow #########################
-# (the lines are directed to different string variables at different times)
-#
-# handle drop table , unlock, connect statements
-# if ( start of create table) {
-# print out post_create table (indexes, foreign key constraints, comments from previous table)
-# add drop table statement if !$NODROP to pre_create_sql
-# next;
-# }
-# else if ( inside create table) {
-# add comments in this portion to create_sql
-# if ( end of create table) {
-# delete mysql-unique CREATE TABLE commands
-# print pre_create_sql
-# print the constraint tables for set and year datatypes
-# print create_sql
-# print function_create_sql (this is for the enum columns only)
-# next;
-# }
-# do substitutions
-# -- NUMERIC DATATYPES
-# -- CHARACTER DATATYPES
-# -- DATE AND TIME DATATYPES
-# -- KEY AND UNIQUE CREATIONS
-# and append them to create_sql
-# } else {
-# print inserts on-the-spot (this script only changes default timestamp of 0000-00-00)
-# }
-# LOOP until EOF
-#
-########################################################
-
-
-if (!/^\s*insert into/i) { # not inside create table so don't worry about data corruption
- s/`//g; # '`pgsql uses no backticks to denote table name (CREATE TABLE `sd`) or around field
- # and table names like mysql
- # doh! we hope all dashes and special chars are caught by the regular expressions :)
-}
-if (/^\s*USE\s*([^;]*);/) {
- print OUT "\\c ". $1;
- next;
-}
-if (/^(UN)?LOCK TABLES/i || /drop\s+table/i ) {
-
- # skip
- # DROP TABLE is added when we see the CREATE TABLE
- next;
-}
-if (/(create\s+table\s+)([-_\w]+)\s/i) { # example: CREATE TABLE `english_english`
- print_post_create_sql(); # for last table
- $tables_first_timestamp_column= 1; # decision to print warnings about default_timestamp not being in postgres
- $create_sql = '';
- $table_no_quotes = $2 ;
- $table=quote_and_lc($2);
- if ( !$NODROP ) { # always print drop table if user doesn't explicitly say not to
- # to drop a table that is referenced by a view or a foreign-key constraint of another table,
- # CASCADE must be specified. (CASCADE will remove a dependent view entirely, but in the
- # in the foreign-key case it will only remove the foreign-key constraint, not the other table entirely.)
- # (source: 8.1.3 docs, section "drop table")
- warn "table $table will be dropped CASCADE\n";
- $pre_create_sql .= "DROP TABLE $table CASCADE;\n"; # custom dumps may be missing the 'dump' commands
- }
-
- s/(create\s+table\s+)([-_\w]+)\s/$1 $table /i;
- if ($DEBUG) {
- $create_sql .= '-- ' . $_;
- }
- $create_sql .= $_;
- next;
-}
-if ($create_sql ne "") { # we are inside create table statement so lets process datatypes
- # print out comments or empty lines in context
- if ($DEBUG) {
- $create_sql .= '-- ' . $_;
- }
- if (/^#/ || /^$/ || /^\s*--/) {
- s/^#/--/; # Two hyphens (--) is the SQL-92 standard indicator for comments
- $create_sql.=$_;
- next;
- }
-
- if (/\).*;/i) { # end of create table squence
-
- s/INSERT METHOD[=\s+][^;\s]+//i;
- s/PASSWORD=[^;\s]+//i;
- s/ROW_FORMAT=(?:DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)+//i;
- s/KEY_BLOCK_SIZE=8//i;
- s/DELAY KEY WRITE=[^;\s]+//i;
- s/INDEX DIRECTORY[=\s+][^;\s]+//i;
- s/DATA DIRECTORY=[^;\s]+//i;
- s/CONNECTION=[^;\s]+//i;
- s/CHECKSUM=[^;\s]+//i;
- s/Type=[^;\s]+//i; # ISAM , # older versions
- s/COLLATE=[^;\s]+//i; # table's collate
- s/COLLATE\s+[^;\s]+//i; # table's collate
- # possible AUTO_INCREMENT starting index, it is used in mysql 5.0.26, not sure since which version
- if (/AUTO_INCREMENT=(\d+)/i) {
- # should take < ---- ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;
- # and should ouput ---> CREATE SEQUENCE "rhm_host_info_id_seq" START WITH 16;
- my $start_value = $1;
- print $auto_increment_seq . "--\n";
- # print $pre_create_sql . "--\n";
- $pre_create_sql =~ s/(CREATE SEQUENCE $auto_increment_seq )/$1 START WITH $start_value /;
- }
- s/AUTO_INCREMENT=\d+//i;
- s/PACK_KEYS=\d//i; # mysql 5.0.22
- s/DEFAULT CHARSET=[^;\s]+//i; # my mysql version is 4.1.11
- s/ENGINE\s*=\s*[^;\s]+//i; # my mysql version is 4.1.11
- s/ROW_FORMAT=[^;\s]+//i; # my mysql version is 5.0.22
- s/KEY_BLOCK_SIZE=8//i;
- s/MIN_ROWS=[^;\s]+//i;
- s/MAX_ROWS=[^;\s]+//i;
- s/AVG_ROW_LENGTH=[^;\s]+//i;
- if (/COMMENT='([^']*)'/) { # ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='must be country zones';
- $post_create_sql.="COMMENT ON TABLE $table IS '$1'\;"; # COMMENT ON table_name IS 'text';
- s/COMMENT='[^']*'//i;
- }
- $create_sql =~ s/,$//g; # strip last , inside create table
- # make sure we end in a comma, as KEY statments are turned
- # into post_create_sql indices
- # they often are the last line so leaving a 'hanging comma'
- my @array = split("\n", $create_sql);
- for (my $a = $#array; $a >= 0; $a--) { #loop backwards
- if ($a == $#array && $array[$a] =~ m/,\s*$/) { # for last line
- $array[$a] =~ s/,\s*$//;
- next;
- }
- if ($array[$a] !~ m/create table/i) { # i.e. if there was more than one column in table
- if ($a != $#array && $array[$a] !~ m/,\s*$/ ) { # for second to last
- $array[$a] =~ s/$/,/;
- last;
- }
- elsif ($a != $#array && $array[$a] =~ m/,\s*$/ ) { # for second to last
- last;
- }
- }
- }
- $create_sql = join("\n", @array) . "\n";
- $create_sql .= $_;
-
- # put comments out first
- print OUT $pre_create_sql;
-
- # create separate table to reference and to hold mysql's possible set data-type
- # values. do that table's creation before create table
- # definition
- foreach $column_name (keys %constraints) {
- $type=$constraints{$column_name}{'type'};
- $column_valuesStr = $constraints{$column_name}{'values'};
- $constraint_table_name = get_identifier(${table},${column_name} ,"constraint_table");
- if ($type eq 'set') {
- print OUT qq~DROP TABLE $constraint_table_name CASCADE\\g\n~ ;
- print OUT qq~create table $constraint_table_name ( set_values varchar UNIQUE)\\g\n~ ;
- $function_create_sql .= make_plpgsql($table,$column_name);
- } elsif ($type eq 'year') {
- print OUT qq~DROP TABLE $constraint_table_name CASCADE\\g\n~ ;
- print OUT qq~create table $constraint_table_name ( year_values varchar UNIQUE)\\g\n~ ;
- }
- @column_values = split /,/, $column_valuesStr;
- foreach $value (@column_values) {
- print OUT qq~insert into $constraint_table_name values ( $value )\\g\n~; # ad ' for ints and varchars
- }
- }
-
- $create_sql =~ s/double double/double precision/g;
-
- # print create table and reset create table vars
- # when moving from each "create table" to "insert" part of dump
- print OUT $create_sql;
- print OUT $function_create_sql;
- $pre_create_sql="";
- $auto_increment_seq="";
- $create_sql="";
- $function_create_sql='';
- %constraints=();
- # the post_create_sql for this table is output at the beginning of the next table def
- # in case we want to make indexes after doing inserting
- next;
- }
- if (/^\s*(\w+)\s+.*COMMENT\s*'([^']*)'/) { #`zone_country_id` int(11) COMMENT 'column comment here',
- $quoted_column=quote_and_lc($1);
- $post_create_sql.="COMMENT ON COLUMN $table"."."." $quoted_column IS '$2'\;"; # COMMENT ON table_name.column_name IS 'text';
- s/COMMENT\s*'[^']*'//i;
- }
-
-
- # NUMERIC DATATYPES
- #
- # auto_increment -> sequences
- # UNSIGNED conversions
- # TINYINT
- # SMALLINT
- # MEDIUMINT
- # INT, INTEGER
- # BIGINT
- #
- # DOUBLE [PRECISION], REAL
- # DECIMAL(M,D), NUMERIC(M,D)
- # FLOAT(p)
- # FLOAT
-
- s/(\w*int)\(\d+\)/$1/g; # hack of the (n) stuff for e.g. mediumint(2) int(3)
-
- if (/^(\s*)(\w+)\s*.*numeric.*auto_increment/i) { # int,auto_increment -> serial
- $seq = get_identifier($table, $2, 'seq');
- $quoted_column=quote_and_lc($2);
- # Smash datatype to int8 and autogenerate the sequence.
- s/^(\s*)(\w+)\s*.*NUMERIC(.*)auto_increment([^,]*)/$1 $quoted_column serial8 $4/ig;
- $create_sql.=$_;
- next;
- }
- if (/^\s*(\w+)\s+.*int.*auto_increment/i) { # example: data_id mediumint(8) unsigned NOT NULL auto_increment,
- $seq = get_identifier($table, $1, 'seq');
- $quoted_column=quote_and_lc($1);
- s/(\s*)(\w+)\s+.*int.*auto_increment([^,]*)/$1 $quoted_column serial8 $3/ig;
- $create_sql.=$_;
- next;
- }
-
-
-
-
- # convert UNSIGNED to CHECK constraints
- if (m/^(\s*)(\w+)\s+((float|double precision|double|real|decimal|numeric))(.*)unsigned/i) {
- $quoted_column = quote_and_lc($2);
- s/^(\s*)(\w+)\s+((float|double precision|double|real|decimal|numeric))(.*)unsigned/$1 $quoted_column $3 $4 CHECK ($quoted_column >= 0)/i;
- }
- # example: `wordsize` tinyint(3) unsigned default NULL,
- if (m/^(\s+)(\w+)\s+(\w+)\s+unsigned/i) {
- $quoted_column=quote_and_lc($2);
- s/^(\s+)(\w+)\s+(\w+)\s+unsigned/$1 $quoted_column $3 CHECK ($quoted_column >= 0)/i;
- }
- if (m/^(\s*)(\w+)\s+(bigint.*)unsigned/) {
- $quoted_column=quote_and_lc($2);
- # see http://archives.postgresql.org/pgsql-general/2005-07/msg01178.php
- # and see http://www.postgresql.org/docs/8.2/interactive/datatype-numeric.html
- # see http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html max size == 20 digits
- s/^(\s*)(\w+)\s+bigint(.*)unsigned/$1 $quoted_column NUMERIC (20,0) CHECK ($quoted_column >= 0)/i;
-
- }
-
- # int type conversion
- # TINYINT (signed) -128 to 127 (unsigned) 0 255
- # SMALLINT A small integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535.
- # MEDIUMINT A medium-sized integer. The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215.
- # INT A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.
- # BIGINT The signed range is -9223372036854775808 to 9223372036854775807. The unsigned range is 0 to 18446744073709551615
- # for postgres see http://www.postgresql.org/docs/8.2/static/datatype-numeric.html#DATATYPE-INT
- s/^(\s+"*\w+"*\s+)tinyint/$1 smallint/i;
- s/^(\s+"*\w+"*\s+)mediumint/$1 integer/i;
-
- # the floating point types
- # double -> double precision
- # double(n,m) -> double precision
- # float - no need for conversion
- # float(n) - no need for conversion
- # float(n,m) -> double precision
-
- s/(^\s*\w+\s+)double(\(\d+,\d+\))?/$1float/i;
- s/float(\(\d+,\d+\))/float/i;
-
- #
- # CHARACTER TYPES
- #
- # set
- # enum
- # binary(M), VARBINARy(M), tinyblob, tinytext,
- # bit
- # char(M), varchar(M)
- # blob -> text
- # mediumblob
- # longblob, longtext
- # text -> text
- # mediumtext
- # longtext
- # mysql docs: A BLOB is a binary large object that can hold a variable amount of data.
-
- # set
- # For example, a column specified as SET('one', 'two') NOT NULL can have any of these values:
- # ''
- # 'one'
- # 'two'
- # 'one,two'
- if (/(\w*)\s+set\(((?:['"]\w+['"]\s*,*)+(?:['"]\w+['"])*)\)(.*)$/i) { # example: `au_auth` set('r','w','d') NOT NULL default '',
- $column_name = $1;
- $constraints{$column_name}{'values'} = $2; # 'abc','def', ...
- $constraints{$column_name}{'type'} = "set"; # 'abc','def', ...
- $_ = qq~ $column_name varchar , ~;
- $column_name = quote_and_lc($1);
- $create_sql.=$_;
- next;
-
- }
- if (/(\S*)\s+enum\(((?:['"][^'"]+['"]\s*,)+['"][^'"]+['"])\)(.*)$/i) { # enum handling
- # example: `test` enum('?','+','-') NOT NULL default '?'
- # $2 is the values of the enum 'abc','def', ...
- $quoted_column=quote_and_lc($1);
- # "test" NOT NULL default '?' CONSTRAINT test_test_constraint CHECK ("test" IN ('?','+','-'))
- $_ = qq~ $quoted_column varchar CHECK ($quoted_column IN ( $2 ))$3\n~; # just assume varchar?
- $create_sql.=$_;
- next;
- }
- # Take care of "binary" option for char and varchar
- # (pre-4.1.2, it indicated a byte array; from 4.1.2, indicates
- # a binary collation)
- s/(?:var)?char(?:\(\d+\))? (?:byte|binary)/text/i;
- if (m/(?:var)?binary\s*\(\d+\)/i) { # c varBINARY(3) in Mysql
- warn "WARNING in table '$table' '$_': binary type is converted to bytea (unsized) for Postgres\n";
- }
- s/(?:var)?binary(?:\(\d+\))?/text/i; # c varBINARY(3) in Mysql
- s/bit(?:\(\d+\))?/bytea/i; # bit datatype -> bytea
-
- # large datatypes
- s/\w*blob/bytea/gi;
- s/tinytext/text/gi;
- s/mediumtext/text/gi;
- s/longtext/text/gi;
-
- # char -> varchar -- if specified as a command line option
- # PostgreSQL would otherwise pad with spaces as opposed
- # to MySQL! Your user interface may depend on this!
- if ($CHAR2VARCHAR) {
- s/(^\s+\S+\s+)char/${1}varchar/gi;
- }
-
- # nuke column's collate and character set
- s/(\S+)\s+character\s+set\s+\w+/$1/gi;
- s/(\S+)\s+collate\s+\w+/$1/gi;
-
- #
- # DATE AND TIME TYPES
- #
- # date time
- # year
- # datetime
- # timestamp
-
- # date time
- # these are the same types in postgres, just do the replacement of 0000-00-00 date
-
- if (m/default '(\d+)-(\d+)-(\d+)([^']*)'/i) { # we grab the year, month and day
- # NOTE: times of 00:00:00 are possible and are okay
- my $time = '';
- my $year=$1;
- my $month= $2;
- my $day = $3;
- if ($4) {
- $time = $4;
- }
- if ($year eq "0000") { $year = '1970'; }
- if ($month eq "00") { $month = '01'; }
- if ($day eq "00") { $day = '01'; }
- s/default '[^']+'/default '$year-$month-$day$time'/i; # finally we replace with $datetime
- }
-
- # convert mysql's year datatype to a constraint
- if (/(\w*)\s+year\(4\)(.*)$/i) { # can be integer OR string 1901-2155
- $constraint_table_name = get_identifier($table,$1 ,"constraint_table");
- $column_name=quote_and_lc($1);
- @year_holder = ();
- $year='';
- for (1901 .. 2155) {
- $year = "'$_'";
- unless ($year =~ /2155/) { $year .= ','; }
- push( @year_holder, $year);
- }
- $constraints{$column_name}{'values'} = join('','',@year_holder); # '1901','1902', ...
- $constraints{$column_name}{'type'} = "year";
- $_ = qq~ $column_name varchar CONSTRAINT ${table}_${column_name}_constraint REFERENCES $constraint_table_name ("year_values") $2\n~;
- $create_sql.=$_;
- next;
- } elsif (/(\w*)\s+year\(2\)(.*)$/i) { # same for a 2-integer string
- $constraint_table_name = get_identifier($table,$1 ,"constraint_table");
- $column_name=quote_and_lc($1);
- @year_holder = ();
- $year='';
- for (1970 .. 2069) {
- $year = "'$_'";
- if ($year =~ /2069/) { next; }
- push( @year_holder, $year);
- }
- push( @year_holder, '0000');
- $constraints{$column_name}{'values'} = join(',',@year_holder); # '1971','1972', ...
- $constraints{$column_name}{'type'} = "year"; # 'abc','def', ...
- $_ = qq~ $1 varchar CONSTRAINT ${table}_${column_name}_constraint REFERENCES $constraint_table_name ("year_values") $2\n~;
- $create_sql.=$_;
- next;
- }
-
- # datetime
- # Default on a dump from MySQL 5.0.22 is in the same form as datetime so let it flow down
- # to the timestamp section and deal with it there
- s/(${sl})datetime /$1timestamp without time zone /i;
-
- # change not null datetime field to null valid ones
- # (to support remapping of "zero time" to null
- # s/($sl)datetime not null/$1timestamp without time zone/i;
-
-
- # timestamps
- #
- # nuke datetime representation (not supported in PostgreSQL)
- # change default time of 0000-00-00 to 1970-01-01
-
- # we may possibly need to create a trigger to provide
- # equal functionality with ON UPDATE CURRENT TIMESTAMP
-
-
- if (m/${sl}timestamp/i) {
- if ( m/ON UPDATE CURRENT_TIMESTAMP/i ) { # the ... default CURRENT_TIMESTAMP only applies for blank inserts, not updates
- s/ON UPDATE CURRENT_TIMESTAMP//i ;
- m/^\s*(\w+)\s+timestamp/i ;
- # automatic trigger creation
- $table_no_quotes =~ s/"//g;
-$function_create_sql .= " CREATE OR REPLACE FUNCTION update_". $table_no_quotes . "() RETURNS trigger AS '
-BEGIN
- NEW.$1 := CURRENT_TIMESTAMP;
- RETURN NEW;
-END;
-' LANGUAGE 'plpgsql';
-
--- before INSERT is handled by 'default CURRENT_TIMESTAMP'
-CREATE TRIGGER add_current_date_to_".$table_no_quotes." BEFORE UPDATE ON ". $table . " FOR EACH ROW EXECUTE PROCEDURE
-update_".$table_no_quotes."();\n";
-
- }
- if ($tables_first_timestamp_column && m/DEFAULT NULL/i) {
- # DEFAULT NULL is the same as DEFAULT CURRENT_TIMESTAMP for the first TIMESTAMP column. (MYSQL manual)
- s/($sl)(timestamp\s+)default null/$1 $2 DEFAULT CURRENT_TIMESTAMP/i;
- }
- $tables_first_timestamp_column= 0;
- if (m/${sl}timestamp\s*\(\d+\)/i) { # fix for timestamps with width spec not handled (ID: 1628)
- warn "WARNING for in table '$table' '$_': your default timestamp width is being ignored for table $table \n";
- s/($sl)timestamp(?:\(\d+\))/$1datetime/i;
- }
- } # end timestamp section
-
- # KEY AND UNIQUE CREATIONS
- #
- # unique
- if ( /^\s+unique\s+\(([^(]+)\)/i ) { # example UNIQUE `name` (`name`), same as UNIQUE KEY
- # POSTGRESQL: treat same as mysql unique
- $quoted_column = quote_and_lc($1);
- s/\s+unique\s+\(([^(]+)\)/ unique ($quoted_column) /i;
- $create_sql.=$_;
- next;
- } elsif ( /^\s+unique\s+key\s*(\w+)\s*\(([^(]+)\)/i ) { # example UNIQUE KEY `name` (`name`)
- # MYSQL: unique key: allows null=YES, allows duplicates=NO (*)
- # ... new ... UNIQUE KEY `unique_fullname` (`fullname`) in my mysql v. Ver 14.12 Distrib 5.1.7-beta
- # POSTGRESQL: treat same as mysql unique
- # just quote columns
- $quoted_column = quote_and_lc($2);
- s/\s+unique\s+key\s*(\w+)\s*\(([^(]+)\)/ unique ($quoted_column) /i;
- $create_sql.=$_;
- # the index corresponding to the 'key' is automatically created
- next;
- }
- # keys
- if ( /^\s+fulltext key\s+/i) { # example: FULLTEXT KEY `commenttext` (`commenttext`)
- # that is key as a word in the first check for a match
- # the tsvector datatype is made for these types of things
- # example mysql file:
- # what is tsvector datatype?
- # http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html
- warn "dba must do fulltext key transformation for $table\n";
- next;
- }
- if ( /^(\s+)constraint (\S+) foreign key \((\S+)\) references (\S+) \((\S+)\)(.*)/i ) {
- $quoted_column =quote_and_lc($3);
- $col=quote_and_lc($5);
- $post_create_sql .= "ALTER TABLE $table ADD FOREIGN KEY ($quoted_column) REFERENCES " . quote_and_lc($4) . " ($col);\n";
- next;
- }
- if ( /^\s*primary key\s*\(([^)]+)\)([,\s]+)/i ) { # example PRIMARY KEY (`name`)
- # MYSQL: primary key: allows null=NO , allows duplicates=NO
- # POSTGRESQL: When an index is declared unique, multiple table rows with equal indexed values will not be
- # allowed. Null values are not considered equal.
- # POSTGRESQL quote's source: 8.1.3 docs section 11.5 "unique indexes"
- # so, in postgres, we need to add a NOT NULL to the UNIQUE constraint
- # and, primary key (mysql) == primary key (postgres) so that we *really* don't need change anything
- $quoted_column = quote_and_lc($1);
- s/(\s*)primary key\s+\(([^)]+)\)([,\s]+)/$1 primary key ($quoted_column)$3/i;
- # indexes are automatically created for unique columns
- $create_sql.=$_;
- next;
- } elsif (m/^\s+key\s[-_\s\w]+\((.+)\)/i ) { # example: KEY `idx_mod_english_def_word` (`word`),
- # regular key: allows null=YES, allows duplicates=YES
- # MYSQL: KEY is normally a synonym for INDEX. http://dev.mysql.com/doc/refman/5.1/en/create-table.html
- #
- # * MySQL: ALTER TABLE {$table} ADD KEY $column ($column)
- # * PostgreSQL: CREATE INDEX {$table}_$column_idx ON {$table}($column) // Please note the _idx "extension"
- # PRIMARY KEY (`postid`),
- # KEY `ownerid` (`ownerid`)
- # create an index for everything which has a key listed for it.
- my $col = $1;
- # TODO we don't have a translation for the substring syntax in text columns in MySQL (e.g. "KEY my_idx (mytextcol(20))")
- # for now just getting rid of the brackets and numbers (the substring specifier):
- $col=~s/\(\d+\)//g;
- $quoted_column = quote_and_lc($col);
- if ($col =~ m/,/) {
- $col = s/,/_/;
- }
- $index = get_identifier($table, $col, 'idx');
- $post_create_sql.="CREATE INDEX $index ON $table USING btree ($quoted_column)\;";
- # just create index do not add to create table statement
- next;
- }
-
- # handle 'key' declared at end of column
- if (/\w+.*primary key/i) { # mysql: key is normally just a synonym for index
- # just leave as is ( postgres has primary key type)
-
-
- } elsif (/(\w+\s+(?:$mysql_datatypesStr)\s+.*)key/i) { # mysql: key is normally just a synonym for index
- # I can't find a reference for 'key' in a postgres command without using the word 'primary key'
- s/$1key/$1/i ;
- $index = get_identifier($table, $1, 'idx');
- $quoted_column =quote_and_lc($1);
- $post_create_sql.="CREATE INDEX $index ON $table USING btree ($quoted_column) \;";
- $create_sql.=$_;
- }
-
-
-
- # do we really need this anymore?
- # remap colums with names of existing system attribute
- if (/"oid"/i) {
- s/"oid"/"_oid"/g;
- print STDERR "WARNING: table $table uses column \"oid\" which is renamed to \"_oid\"\nYou should fix application manually! Press return to continue.";
- my $wait=<STDIN>;
- }
-
- s/oid/_oid/i if (/key/i && /oid/i); # fix oid in key
-
- # FINAL QUOTING OF ALL COLUMNS
- # quote column names which were not already quoted
- # perhaps they were not quoted because they were not explicitly handled
- if (!/^\s*"(\w+)"(\s+)/i) {
- /^(\s*)(\w+)(\s+)(.*)$/i ;
- $quoted_column= quote_and_lc($2);
- s/^(\s*)(\w+)(\s+)(.*)$/$1 $quoted_column $3 $4 /;
- }
- $create_sql.=$_;
- # END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes
-}
-# add "not in create table" comments or empty lines to pre_create_sql
-elsif (/^#/ || /^$/ || /^\s*--/) {
- s/^#/--/; # Two hyphens (--) is the SQL-92 standard indicator for comments
- $pre_create_sql .= $_ ; # printed above create table statement
- next;
-}
-elsif (/^\s*insert into/i) { # not inside create table and doing insert
- # fix mysql's zero/null value for timestamps
- s/'0000-00-00/'1970-01-01/gi;
- # commented out to fix bug "Field contents interpreted as a timestamp", what was the point of this line anyway?
- #s/([12]\d\d\d)([01]\d)([0-3]\d)([0-2]\d)([0-6]\d)([0-6]\d)/'$1-$2-$3 $4:$5:$6'/;
-
- #---- fix data in inserted data: (from MS world)
- s!\x96!-!g; # --
- s!\x93!"!g; # ``
- s!\x94!"!g; # ''
- s!\x85!... !g; # \ldots
- s!\x92!`!g;
-
- print OUT $pre_create_sql; # print comments preceding the insert section
- $pre_create_sql="";
- $auto_increment_seq = "";
-
- s/'((?:[^'\\]++|\\.)*+)'(?=[),])/E'$1'/g;
- # for the E'' see http://www.postgresql.org/docs/8.2/interactive/release-8-1.html
- s!\\\\!\\\\\\\\!g; # replace \\ with ]\\\\
-
- # split 'extended' INSERT INTO statements to something PostgreSQL can understand
- ( $insert_table, $valueString) = $_ =~ m/^INSERT\s+INTO\s+['`"]*(.*?)['`"]*\s+VALUES\s*(.*)/i;
- $insert_table = quote_and_lc($insert_table);
-
- s/^INSERT INTO.*?\);//i; # hose the statement which is to be replaced whether a run-on or not
- # guarantee table names are quoted
- print OUT qq(INSERT INTO $insert_table VALUES $valueString \n);
-
-} else {
- print OUT $_ ; # example: /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-}
-# keep looping and get next line of IN file
-
-} # END while(<IN>)
-
-print_post_create_sql(); # in case there is extra from the last table
-
-#################################################################
-# 5. print_plgsql function prototype
-# emulate the set datatype with the following plpgsql function
-# looks ugly so putting at end of file
-#################################################################
-#
-sub make_plpgsql {
-my ($table,$column_name) = ($_[0],$_[1]);
-$table=~s/\"//g; # make sure that $table doesn't have quotes so we don't end up with redundant quoting
-my $constraint_table = get_identifier($table,$column_name ,"constraint_table");
-return "
--- this function is called by the insert/update trigger
--- it checks if the INSERT/UPDATE for the 'set' column
--- contains members which comprise a valid mysql set
--- this TRIGGER function therefore acts like a constraint
--- provided limited functionality for mysql's set datatype
--- just verifies and matches for string representations of the set at this point
--- though the set datatype uses bit comparisons, the only supported arguments to our
--- set datatype are VARCHAR arguments
--- to add a member to the set add it to the ".$table."_".$column_name." table
-CREATE OR REPLACE FUNCTION check_".$table."_".$column_name."_set( ) RETURNS TRIGGER AS \$\$\n
-DECLARE
-----
-arg_str VARCHAR ;
-argx VARCHAR := '';
-nobreak INT := 1;
-rec_count INT := 0;
-psn INT := 0;
-str_in VARCHAR := NEW.$column_name;
-----
-BEGIN
-----
-IF str_in IS NULL THEN RETURN NEW ; END IF;
-arg_str := REGEXP_REPLACE(str_in, '\\',\\'', ','); -- str_in is CONSTANT
-arg_str := REGEXP_REPLACE(arg_str, '^\\'', '');
-arg_str := REGEXP_REPLACE(arg_str, '\\'\$', '');
--- RAISE NOTICE 'arg_str %',arg_str;
-psn := POSITION(',' in arg_str);
-IF psn > 0 THEN
- psn := psn - 1; -- minus-1 from comma position
- -- RAISE NOTICE 'psn %',psn;
- argx := SUBSTRING(arg_str FROM 1 FOR psn); -- get one set member
- psn := psn + 2; -- go to first starting letter
- arg_str := SUBSTRING(arg_str FROM psn); -- hack it off
-ELSE
- psn := 0; -- minus-1 from comma position
- argx := arg_str;
-END IF;
--- RAISE NOTICE 'argx %',argx;
--- RAISE NOTICE 'new arg_str: %',arg_str;
-WHILE nobreak LOOP
- EXECUTE 'SELECT count(*) FROM $constraint_table WHERE set_values = ' || quote_literal(argx) INTO rec_count;
- IF rec_count = 0 THEN RAISE EXCEPTION 'one of the set values was not found';
- END IF;
- IF psn > 0 THEN
- psn := psn - 1; -- minus-1 from comma position
- -- RAISE NOTICE 'psn %',psn;
- argx := SUBSTRING(arg_str FROM 1 FOR psn); -- get one set member
- psn := psn + 2; -- go to first starting letter
- arg_str := SUBSTRING(arg_str FROM psn); -- hack it off
- psn := POSITION(',' in arg_str);
- ELSE nobreak = 0;
- END IF;
- -- RAISE NOTICE 'next argx % and next arg_str %', argx, arg_str;
-END LOOP;
-RETURN NEW;
-----
-END;
-\$\$ LANGUAGE 'plpgsql' VOLATILE;
-
-drop trigger set_test ON $table;
--- make a trigger for each set field
--- make trigger and hard-code in column names
--- see http://archives.postgresql.org/pgsql-interfaces/2005-02/msg00020.php
-CREATE TRIGGER set_test
-BEFORE INSERT OR UPDATE ON $table FOR EACH ROW
-EXECUTE PROCEDURE check_".$table."_".$column_name."_set();\n";
-} # end sub make_plpgsql();
-