From bbb13f0619c8f44667ace644475909eea614f4e4 Mon Sep 17 00:00:00 2001 From: Petr Skoda Date: Mon, 9 Aug 2010 13:10:33 +0000 Subject: [PATCH] MDL-23720 importing latest PEAR GeoIP module --- iplookup/index.php | 8 +- lib/geoip/ChangeLog.htm | 66 - lib/geoip/README.htm | 43 - lib/geoip/geoip.inc | 542 ---- lib/geoip/geoipcity.inc | 217 -- lib/geoip/geoipregionvars.php | 4456 ------------------------------- lib/geoip/readme_moodle.txt | 49 - lib/pear/Net/GeoIP.php | 904 +++++++ lib/pear/Net/GeoIP/DMA.php | 315 +++ lib/pear/Net/GeoIP/Location.php | 201 ++ lib/thirdpartylibs.xml | 4 +- 11 files changed, 1426 insertions(+), 5379 deletions(-) delete mode 100644 lib/geoip/ChangeLog.htm delete mode 100644 lib/geoip/README.htm delete mode 100644 lib/geoip/geoip.inc delete mode 100644 lib/geoip/geoipcity.inc delete mode 100644 lib/geoip/geoipregionvars.php delete mode 100644 lib/geoip/readme_moodle.txt create mode 100644 lib/pear/Net/GeoIP.php create mode 100644 lib/pear/Net/GeoIP/DMA.php create mode 100644 lib/pear/Net/GeoIP/Location.php diff --git a/iplookup/index.php b/iplookup/index.php index 1c5848f9ee4..dd94b615cab 100644 --- a/iplookup/index.php +++ b/iplookup/index.php @@ -26,7 +26,7 @@ require('../config.php'); require_once($CFG->libdir.'/filelib.php'); -require_once($CFG->libdir.'/geoip/geoipcity.inc'); +require_once('Net/GeoIP.php'); require_login(); @@ -64,9 +64,9 @@ if ($user) { } if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) { - $gi = geoip_open($CFG->geoipfile, GEOIP_STANDARD); - $location = geoip_record_by_addr($gi, $ip); - geoip_close($gi); + $geoip = Net_GeoIP::getInstance($CFG->geoipfile, Net_GeoIP::STANDARD); + $location = $geoip->lookupLocation($ip); + $geoip->close(); if (empty($location)) { print_error('iplookupfailed', 'error', '', $ip); diff --git a/lib/geoip/ChangeLog.htm b/lib/geoip/ChangeLog.htm deleted file mode 100644 index 632a2b37dae..00000000000 --- a/lib/geoip/ChangeLog.htm +++ /dev/null @@ -1,66 +0,0 @@ - * Workaround php's broken usage of mb_substr instead of substr with - mbstring.func_overload and mbstring.internal_encoding ( Boris Zentner ) - * Change Turkey's continent code from AS to EU ( Boris Zentner ) - * Update FIPS codes 20090723 ( Boris Zentner ) -1.8 2009-04-02 - * Add continent_code to the city record. See: sample_city.php ( Boris Zentner ) - * Update FIPS codes 20090401 ( Boris Zentner ) - * Fixed spelling of Kazakhstan, was Kazakstan - * Fix TN FIPS codes and add two new TH79 and TH80 ( Boris Zentner ) - * Fix geoip_country_code_by_addr when used with a city database for unknown or private records ( cpw ) - * Update timezone.php - * Sync geoipregionvars.php with fips codes from Jan, 14th 2009 ( Boris Zentner ) - * use metro_code in sample_city.php ( Boris Zentner ) - * replace the depreciated dma_code field with metro_code ( Boris Zentner ) - * remove wrong but unreferenced Singapur SG fips regions codes ( Boris Zentner ) - * update regions ( geoipregionvars.php ) ( Boris Zentner ) - * Die when the database file is not found or readable ( Boris Zentner ) - -1.7 2008-1-8 - * Added BL/Saint Barthelemy, MF/Saint Martin (ISO-3166-1 additions) - * fixed bug with newlines in Country Name - * replaced $s_array[size] with $s_array['size'] (Daniel Horchner) - * Fix bug where PHP API didn't work with new edition of GeoIP ISP - -1.6 2007-1-10 - * Added AX/Aland Islands, GG/Guernsey, IM/Isle of Man, JE/Jersey (ISO-3166-1 changes) - * Replaced CS/Serbia and Montenegro with RS/Serbia, removed ZR/Zaire, added ME/Montenegro - * geoip_country_(code|name)_by_addr now work against Geo(IP|Lite) City (Frank Mather) - * Added code to lookup zoneinfo timezone given country and region (Frank Mather) - * TP/East Timor changed to TL/Timor-Leste, reflecting changes in ISO-3166 - -1.5 2005-11-1 - * Added Shared Memory support for GeoIP City (Frank Mather) - * Replaced Yugoslavia with Serbia and Montenegro - * Removed global declaration for $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES, - and $GEOIP_COUNTRY_CODES3 - -1.4 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net) - * Formatted file according to PEAR library standards. - * Moved $GEOIP_COUNTRY_CODE_TO_NUMBER, $GEOIP_COUNTRY_CODES, - * $GEOIP_COUNTRY_CODES3 and $GEOIP_COUNTRY_NAMES into the - * GeoIP class, so that library will still work even when - * not included in the $GLOBAL context. - - * Updated geoip_country_code_by_addr to work with PHP5 (Eric of Host Ultra) - * Replaced bit operators (| and &) with logical operators (|| and &&) - * Defined GEOIP_ISP_EDITION - -1.3 2004-8-4 - * Changed license from GPL to LGPL so code can be included in PEAR - * added global definitions to prevent undefined variables error when including from function (Cédric Dufour) - * Updated country names - * Added support for GeoIP City, version 1 with DMA and Area codes - -1.2 2003-10-28 - * Added support for Shared Memory (Jason Priebe) - * Added support for Distributed queries - * Added support for GeoIP Region, version 1 - * Added Anonymous Proxy and Satellite Provider code/labels - * Changed Taiwan, Province of China to Taiwan - -1.1 2003-01-15 - * Added support for GeoIP Region and GeoIP City - -1.0 2002-11-21 - * Initial checkin to CVS \ No newline at end of file diff --git a/lib/geoip/README.htm b/lib/geoip/README.htm deleted file mode 100644 index 8456d2b0e35..00000000000 --- a/lib/geoip/README.htm +++ /dev/null @@ -1,43 +0,0 @@ -Requirements - -None (only the 'GeoIP.dat' file is needed). To download a free GeoIP Standard Country -database, go to -http://maxmind.com/download/geoip/database/ - -Install - -Just place the 'geoip.inc' file somewhere according to the 'include_path' directive of -your 'php.ini' file, or just place it in the same directory as your PHP scripts. - -Usage - -Gets country name by hostname : - -include("geoip.inc"); - -$gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD); - -echo geoip_country_code_by_addr($gi, "24.24.24.24") . "\t" . - geoip_country_name_by_addr($gi, "24.24.24.24") . "\n"; -echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" . - geoip_country_name_by_addr($gi, "80.24.24.24") . "\n"; - -geoip_close($gi); - -Memory Caching: -To enable memory caching, pass GEOIP_SHARED_MEMORY or -GEOIP_MEMORY_CACHE to the second argument of geoip_open - -For GEOIP_SHARED_MEMORY, requires php >= 4.0.4, -and --enable-shmop passed at configure time, see -http://us2.php.net/manual/en/ref.shmop.php -In addition, you should call geoip_load_shared_mem -before calling geoip_open. See sample_city.php for an -example of shared memory caching. - -Working with PHP5. -geoip_country_code_by_addr should work -with PHP. For help with the other -routines, please contact support@maxmind.com - -Thanks to Jim Winstead. diff --git a/lib/geoip/geoip.inc b/lib/geoip/geoip.inc deleted file mode 100644 index 70948dcdc3b..00000000000 --- a/lib/geoip/geoip.inc +++ /dev/null @@ -1,542 +0,0 @@ - 0, "AP" => 1, "EU" => 2, "AD" => 3, "AE" => 4, "AF" => 5, -"AG" => 6, "AI" => 7, "AL" => 8, "AM" => 9, "AN" => 10, "AO" => 11, -"AQ" => 12, "AR" => 13, "AS" => 14, "AT" => 15, "AU" => 16, "AW" => 17, -"AZ" => 18, "BA" => 19, "BB" => 20, "BD" => 21, "BE" => 22, "BF" => 23, -"BG" => 24, "BH" => 25, "BI" => 26, "BJ" => 27, "BM" => 28, "BN" => 29, -"BO" => 30, "BR" => 31, "BS" => 32, "BT" => 33, "BV" => 34, "BW" => 35, -"BY" => 36, "BZ" => 37, "CA" => 38, "CC" => 39, "CD" => 40, "CF" => 41, -"CG" => 42, "CH" => 43, "CI" => 44, "CK" => 45, "CL" => 46, "CM" => 47, -"CN" => 48, "CO" => 49, "CR" => 50, "CU" => 51, "CV" => 52, "CX" => 53, -"CY" => 54, "CZ" => 55, "DE" => 56, "DJ" => 57, "DK" => 58, "DM" => 59, -"DO" => 60, "DZ" => 61, "EC" => 62, "EE" => 63, "EG" => 64, "EH" => 65, -"ER" => 66, "ES" => 67, "ET" => 68, "FI" => 69, "FJ" => 70, "FK" => 71, -"FM" => 72, "FO" => 73, "FR" => 74, "FX" => 75, "GA" => 76, "GB" => 77, -"GD" => 78, "GE" => 79, "GF" => 80, "GH" => 81, "GI" => 82, "GL" => 83, -"GM" => 84, "GN" => 85, "GP" => 86, "GQ" => 87, "GR" => 88, "GS" => 89, -"GT" => 90, "GU" => 91, "GW" => 92, "GY" => 93, "HK" => 94, "HM" => 95, -"HN" => 96, "HR" => 97, "HT" => 98, "HU" => 99, "ID" => 100, "IE" => 101, -"IL" => 102, "IN" => 103, "IO" => 104, "IQ" => 105, "IR" => 106, "IS" => 107, -"IT" => 108, "JM" => 109, "JO" => 110, "JP" => 111, "KE" => 112, "KG" => 113, -"KH" => 114, "KI" => 115, "KM" => 116, "KN" => 117, "KP" => 118, "KR" => 119, -"KW" => 120, "KY" => 121, "KZ" => 122, "LA" => 123, "LB" => 124, "LC" => 125, -"LI" => 126, "LK" => 127, "LR" => 128, "LS" => 129, "LT" => 130, "LU" => 131, -"LV" => 132, "LY" => 133, "MA" => 134, "MC" => 135, "MD" => 136, "MG" => 137, -"MH" => 138, "MK" => 139, "ML" => 140, "MM" => 141, "MN" => 142, "MO" => 143, -"MP" => 144, "MQ" => 145, "MR" => 146, "MS" => 147, "MT" => 148, "MU" => 149, -"MV" => 150, "MW" => 151, "MX" => 152, "MY" => 153, "MZ" => 154, "NA" => 155, -"NC" => 156, "NE" => 157, "NF" => 158, "NG" => 159, "NI" => 160, "NL" => 161, -"NO" => 162, "NP" => 163, "NR" => 164, "NU" => 165, "NZ" => 166, "OM" => 167, -"PA" => 168, "PE" => 169, "PF" => 170, "PG" => 171, "PH" => 172, "PK" => 173, -"PL" => 174, "PM" => 175, "PN" => 176, "PR" => 177, "PS" => 178, "PT" => 179, -"PW" => 180, "PY" => 181, "QA" => 182, "RE" => 183, "RO" => 184, "RU" => 185, -"RW" => 186, "SA" => 187, "SB" => 188, "SC" => 189, "SD" => 190, "SE" => 191, -"SG" => 192, "SH" => 193, "SI" => 194, "SJ" => 195, "SK" => 196, "SL" => 197, -"SM" => 198, "SN" => 199, "SO" => 200, "SR" => 201, "ST" => 202, "SV" => 203, -"SY" => 204, "SZ" => 205, "TC" => 206, "TD" => 207, "TF" => 208, "TG" => 209, -"TH" => 210, "TJ" => 211, "TK" => 212, "TM" => 213, "TN" => 214, "TO" => 215, -"TL" => 216, "TR" => 217, "TT" => 218, "TV" => 219, "TW" => 220, "TZ" => 221, -"UA" => 222, "UG" => 223, "UM" => 224, "US" => 225, "UY" => 226, "UZ" => 227, -"VA" => 228, "VC" => 229, "VE" => 230, "VG" => 231, "VI" => 232, "VN" => 233, -"VU" => 234, "WF" => 235, "WS" => 236, "YE" => 237, "YT" => 238, "RS" => 239, -"ZA" => 240, "ZM" => 241, "ME" => 242, "ZW" => 243, "A1" => 244, "A2" => 245, -"O1" => 246, "AX" => 247, "GG" => 248, "IM" => 249, "JE" => 250, "BL" => 251, -"MF" => 252 -); - var $GEOIP_COUNTRY_CODES = array( -"", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ", -"AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", -"BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", -"CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", -"CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", -"EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB", -"GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", -"GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", -"IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", -"KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", -"LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN", -"MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", -"NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", -"PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", -"QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", -"SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD", -"TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW", -"TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", -"VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1", -"AX", "GG", "IM", "JE", "BL", "MF" -); - var $GEOIP_COUNTRY_CODES3 = array( -"","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG", -"ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI", -"BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC", -"COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV", -"CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH", -"ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD", -"GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM", -"GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO", -"IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA", -"PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU", -"LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC", -"MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL", -"NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER", -"PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT", -"REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM", -"SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF", -"TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA", -"UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT", -"WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1", -"ALA","GGY","IMN","JEY","BLM","MAF" - ); - var $GEOIP_COUNTRY_NAMES = array( -"", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates", -"Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia", -"Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa", -"Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina", -"Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain", -"Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil", -"Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize", -"Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the", -"Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands", -"Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape Verde", -"Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti", -"Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia", -"Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji", -"Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands", -"France", "France, Metropolitan", "Gabon", "United Kingdom", -"Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland", -"Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands", -"Guatemala", "Guam", "Guinea-Bissau", -"Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras", -"Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India", -"British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of", -"Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan", -"Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of", -"Korea, Republic of", "Kuwait", "Cayman Islands", -"Kazakhstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia", -"Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg", -"Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic of", -"Madagascar", "Marshall Islands", "Macedonia", -"Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands", -"Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives", -"Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia", -"Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway", -"Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia", -"Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon", -"Pitcairn Islands", "Puerto Rico", "Palestinian Territory", -"Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania", -"Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands", -"Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia", -"Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal", -"Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab Republic", -"Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories", -"Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan", -"Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu", -"Taiwan", "Tanzania, United Republic of", "Ukraine", -"Uganda", "United States Minor Outlying Islands", "United States", "Uruguay", -"Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines", -"Venezuela", "Virgin Islands, British", "Virgin Islands, U.S.", -"Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte", -"Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe", -"Anonymous Proxy","Satellite Provider","Other", -"Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin" -); - - var $GEOIP_CONTINENT_CODES = array( -"--", "AS", "EU", "EU", "AS", "AS", "SA", "SA", "EU", "AS", -"SA", "AF", "AN", "SA", "OC", "EU", "OC", "SA", "AS", "EU", -"SA", "AS", "EU", "AF", "EU", "AS", "AF", "AF", "SA", "AS", -"SA", "SA", "SA", "AS", "AF", "AF", "EU", "SA", "NA", "AS", -"AF", "AF", "AF", "EU", "AF", "OC", "SA", "AF", "AS", "SA", -"SA", "SA", "AF", "AS", "AS", "EU", "EU", "AF", "EU", "SA", -"SA", "AF", "SA", "EU", "AF", "AF", "AF", "EU", "AF", "EU", -"OC", "SA", "OC", "EU", "EU", "EU", "AF", "EU", "SA", "AS", -"SA", "AF", "EU", "SA", "AF", "AF", "SA", "AF", "EU", "SA", -"SA", "OC", "AF", "SA", "AS", "AF", "SA", "EU", "SA", "EU", -"AS", "EU", "AS", "AS", "AS", "AS", "AS", "EU", "EU", "SA", -"AS", "AS", "AF", "AS", "AS", "OC", "AF", "SA", "AS", "AS", -"AS", "SA", "AS", "AS", "AS", "SA", "EU", "AS", "AF", "AF", -"EU", "EU", "EU", "AF", "AF", "EU", "EU", "AF", "OC", "EU", -"AF", "AS", "AS", "AS", "OC", "SA", "AF", "SA", "EU", "AF", -"AS", "AF", "NA", "AS", "AF", "AF", "OC", "AF", "OC", "AF", -"SA", "EU", "EU", "AS", "OC", "OC", "OC", "AS", "SA", "SA", -"OC", "OC", "AS", "AS", "EU", "SA", "OC", "SA", "AS", "EU", -"OC", "SA", "AS", "AF", "EU", "AS", "AF", "AS", "OC", "AF", -"AF", "EU", "AS", "AF", "EU", "EU", "EU", "AF", "EU", "AF", -"AF", "SA", "AF", "SA", "AS", "AF", "SA", "AF", "AF", "AF", -"AS", "AS", "OC", "AS", "AF", "OC", "AS", "EU", "SA", "OC", -"AS", "AF", "EU", "AF", "OC", "NA", "SA", "AS", "EU", "SA", -"SA", "SA", "SA", "AS", "OC", "OC", "OC", "AS", "AF", "EU", -"AF", "AF", "EU", "AF", "--", "--", "--", "EU", "EU", "EU", -"EU", "SA", "SA" ); - -} -function geoip_load_shared_mem ($file) { - - $fp = fopen($file, "rb"); - if (!$fp) { - print "error opening $file: $php_errormsg\n"; - exit; - } - $s_array = fstat($fp); - $size = $s_array['size']; - if ($shmid = @shmop_open (GEOIP_SHM_KEY, "w", 0, 0)) { - shmop_delete ($shmid); - shmop_close ($shmid); - } - $shmid = shmop_open (GEOIP_SHM_KEY, "c", 0644, $size); - shmop_write ($shmid, fread($fp, $size), 0); - shmop_close ($shmid); -} - -function _setup_segments($gi){ - $gi->databaseType = GEOIP_COUNTRY_EDITION; - $gi->record_length = STANDARD_RECORD_LENGTH; - if ($gi->flags & GEOIP_SHARED_MEMORY) { - $offset = @shmop_size ($gi->shmid) - 3; - for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) { - $delim = @shmop_read ($gi->shmid, $offset, 3); - $offset += 3; - if ($delim == (chr(255).chr(255).chr(255))) { - $gi->databaseType = ord(@shmop_read ($gi->shmid, $offset, 1)); - $offset++; - - if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ - $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0; - } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){ - $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1; - } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0)|| - ($gi->databaseType == GEOIP_CITY_EDITION_REV1) - || ($gi->databaseType == GEOIP_ORG_EDITION) - || ($gi->databaseType == GEOIP_ISP_EDITION) - || ($gi->databaseType == GEOIP_ASNUM_EDITION)){ - $gi->databaseSegments = 0; - $buf = @shmop_read ($gi->shmid, $offset, SEGMENT_RECORD_LENGTH); - for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ - $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); - } - if (($gi->databaseType == GEOIP_ORG_EDITION)|| - ($gi->databaseType == GEOIP_ISP_EDITION)) { - $gi->record_length = ORG_RECORD_LENGTH; - } - } - break; - } else { - $offset -= 4; - } - } - if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| - ($gi->databaseType == GEOIP_PROXY_EDITION)|| - ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ - $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; - } - } else { - $filepos = ftell($gi->filehandle); - fseek($gi->filehandle, -3, SEEK_END); - for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) { - $delim = fread($gi->filehandle,3); - if ($delim == (chr(255).chr(255).chr(255))){ - $gi->databaseType = ord(fread($gi->filehandle,1)); - if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ - $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0; - } - else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1){ - $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1; - } else if (($gi->databaseType == GEOIP_CITY_EDITION_REV0) || - ($gi->databaseType == GEOIP_CITY_EDITION_REV1) || - ($gi->databaseType == GEOIP_ORG_EDITION) || - ($gi->databaseType == GEOIP_ISP_EDITION) || - ($gi->databaseType == GEOIP_ASNUM_EDITION)){ - $gi->databaseSegments = 0; - $buf = fread($gi->filehandle,SEGMENT_RECORD_LENGTH); - for ($j = 0;$j < SEGMENT_RECORD_LENGTH;$j++){ - $gi->databaseSegments += (ord($buf[$j]) << ($j * 8)); - } - if ($gi->databaseType == GEOIP_ORG_EDITION || - $gi->databaseType == GEOIP_ISP_EDITION) { - $gi->record_length = ORG_RECORD_LENGTH; - } - } - break; - } else { - fseek($gi->filehandle, -4, SEEK_CUR); - } - } - if (($gi->databaseType == GEOIP_COUNTRY_EDITION)|| - ($gi->databaseType == GEOIP_PROXY_EDITION)|| - ($gi->databaseType == GEOIP_NETSPEED_EDITION)){ - $gi->databaseSegments = GEOIP_COUNTRY_BEGIN; - } - fseek($gi->filehandle,$filepos,SEEK_SET); - } - return $gi; -} - -function geoip_open($filename, $flags) { - $gi = new GeoIP; - $gi->flags = $flags; - if ($gi->flags & GEOIP_SHARED_MEMORY) { - $gi->shmid = @shmop_open (GEOIP_SHM_KEY, "a", 0, 0); - } else { - $gi->filehandle = fopen($filename,"rb") or die( "Can not open $filename\n" ); - if ($gi->flags & GEOIP_MEMORY_CACHE) { - $s_array = fstat($gi->filehandle); - $gi->memory_buffer = fread($gi->filehandle, $s_array['size']); - } - } - - $gi = _setup_segments($gi); - return $gi; -} - -function geoip_close($gi) { - if ($gi->flags & GEOIP_SHARED_MEMORY) { - return true; - } - - return fclose($gi->filehandle); -} - -function geoip_country_id_by_name($gi, $name) { - $addr = gethostbyname($name); - if (!$addr || $addr == $name) { - return false; - } - return geoip_country_id_by_addr($gi, $addr); -} - -function geoip_country_code_by_name($gi, $name) { - $country_id = geoip_country_id_by_name($gi,$name); - if ($country_id !== false) { - return $gi->GEOIP_COUNTRY_CODES[$country_id]; - } - return false; -} - -function geoip_country_name_by_name($gi, $name) { - $country_id = geoip_country_id_by_name($gi,$name); - if ($country_id !== false) { - return $gi->GEOIP_COUNTRY_NAMES[$country_id]; - } - return false; -} - -function geoip_country_id_by_addr($gi, $addr) { - $ipnum = ip2long($addr); - return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN; -} - -function geoip_country_code_by_addr($gi, $addr) { - if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) { - $record = geoip_record_by_addr($gi,$addr); - if ( $record !== false ) { - return $record->country_code; - } - } else { - $country_id = geoip_country_id_by_addr($gi,$addr); - if ($country_id !== false) { - return $gi->GEOIP_COUNTRY_CODES[$country_id]; - } - } - return false; -} - -function geoip_country_name_by_addr($gi, $addr) { - if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) { - $record = geoip_record_by_addr($gi,$addr); - return $record->country_name; - } else { - $country_id = geoip_country_id_by_addr($gi,$addr); - if ($country_id !== false) { - return $gi->GEOIP_COUNTRY_NAMES[$country_id]; - } - } - return false; -} - -function _geoip_seek_country($gi, $ipnum) { - $offset = 0; - for ($depth = 31; $depth >= 0; --$depth) { - if ($gi->flags & GEOIP_MEMORY_CACHE) { - // workaround php's broken substr, strpos, etc handling with - // mbstring.func_overload and mbstring.internal_encoding - $enc = mb_internal_encoding(); - mb_internal_encoding('ISO-8859-1'); - - $buf = substr($gi->memory_buffer, - 2 * $gi->record_length * $offset, - 2 * $gi->record_length); - - mb_internal_encoding($enc); - } elseif ($gi->flags & GEOIP_SHARED_MEMORY) { - $buf = @shmop_read ($gi->shmid, - 2 * $gi->record_length * $offset, - 2 * $gi->record_length ); - } else { - fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0 - or die("fseek failed"); - $buf = fread($gi->filehandle, 2 * $gi->record_length); - } - $x = array(0,0); - for ($i = 0; $i < 2; ++$i) { - for ($j = 0; $j < $gi->record_length; ++$j) { - $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8); - } - } - if ($ipnum & (1 << $depth)) { - if ($x[1] >= $gi->databaseSegments) { - return $x[1]; - } - $offset = $x[1]; - } else { - if ($x[0] >= $gi->databaseSegments) { - return $x[0]; - } - $offset = $x[0]; - } - } - trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR); - return false; -} - -function _get_org($gi,$ipnum){ - $seek_org = _geoip_seek_country($gi,$ipnum); - if ($seek_org == $gi->databaseSegments) { - return NULL; - } - $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments; - if ($gi->flags & GEOIP_SHARED_MEMORY) { - $org_buf = @shmop_read ($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH); - } else { - fseek($gi->filehandle, $record_pointer, SEEK_SET); - $org_buf = fread($gi->filehandle,MAX_ORG_RECORD_LENGTH); - } - // workaround php's broken substr, strpos, etc handling with - // mbstring.func_overload and mbstring.internal_encoding - $enc = mb_internal_encoding(); - mb_internal_encoding('ISO-8859-1'); - $org_buf = substr($org_buf, 0, strpos($org_buf, 0)); - mb_internal_encoding($enc); - return $org_buf; -} - -function geoip_org_by_addr ($gi,$addr) { - if ($addr == NULL) { - return 0; - } - $ipnum = ip2long($addr); - return _get_org($gi, $ipnum); -} - -function _get_region($gi,$ipnum){ - if ($gi->databaseType == GEOIP_REGION_EDITION_REV0){ - $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV0; - if ($seek_region >= 1000){ - $country_code = "US"; - $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65); - } else { - $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region]; - $region = ""; - } - return array ($country_code,$region); - } else if ($gi->databaseType == GEOIP_REGION_EDITION_REV1) { - $seek_region = _geoip_seek_country($gi,$ipnum) - GEOIP_STATE_BEGIN_REV1; - //print $seek_region; - if ($seek_region < US_OFFSET){ - $country_code = ""; - $region = ""; - } else if ($seek_region < CANADA_OFFSET) { - $country_code = "US"; - $region = chr(($seek_region - US_OFFSET)/26 + 65) . chr(($seek_region - US_OFFSET)%26 + 65); - } else if ($seek_region < WORLD_OFFSET) { - $country_code = "CA"; - $region = chr(($seek_region - CANADA_OFFSET)/26 + 65) . chr(($seek_region - CANADA_OFFSET)%26 + 65); - } else { - $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE]; - $region = ""; - } - return array ($country_code,$region); - } -} - -function geoip_region_by_addr ($gi,$addr) { - if ($addr == NULL) { - return 0; - } - $ipnum = ip2long($addr); - return _get_region($gi, $ipnum); -} - -function getdnsattributes ($l,$ip){ - $r = new Net_DNS_Resolver(); - $r->nameservers = array("ws1.maxmind.com"); - $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN"); - $str = is_object($p->answer[0])?$p->answer[0]->string():''; - preg_match("#\"(.*)\"#",$str,$regs); - $str = $regs[1]; - return $str; -} - -?> \ No newline at end of file diff --git a/lib/geoip/geoipcity.inc b/lib/geoip/geoipcity.inc deleted file mode 100644 index 4e7b397db51..00000000000 --- a/lib/geoip/geoipcity.inc +++ /dev/null @@ -1,217 +0,0 @@ -country_code = $value; - } - if ($key == "ci"){ - $record->city = $value; - } - if ($key == "re"){ - $record->region = $value; - } - if ($key == "ac"){ - $record->areacode = $value; - } - if ($key == "dm" || $key == "me" ){ - $record->dmacode = $value; - $record->metrocode = $value; - } - if ($key == "is"){ - $record->isp = $value; - } - if ($key == "or"){ - $record->org = $value; - } - if ($key == "zi"){ - $record->postal_code = $value; - } - if ($key == "la"){ - $record->latitude = $value; - } - if ($key == "lo"){ - $record->longitude = $value; - } - } - $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code]; - $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number]; - $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number]; - if ($record->region != "") { - if (($record->country_code == "US") || ($record->country_code == "CA")){ - $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region]; - } else { - $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region]; - } - } - return $record; -} - -function _get_record($gi,$ipnum){ - $seek_country = _geoip_seek_country($gi,$ipnum); - if ($seek_country == $gi->databaseSegments) { - return NULL; - } - - // workaround php's broken substr, strpos, etc handling with - // mbstring.func_overload and mbstring.internal_encoding - $enc = mb_internal_encoding(); - mb_internal_encoding('ISO-8859-1'); - - $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments; - - if ($gi->flags & GEOIP_MEMORY_CACHE) { - $record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH); - } elseif ($gi->flags & GEOIP_SHARED_MEMORY){ - $record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH); - } else { - fseek($gi->filehandle, $record_pointer, SEEK_SET); - $record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH); - } - $record = new geoiprecord; - $record_buf_pos = 0; - $char = ord(substr($record_buf,$record_buf_pos,1)); - $record->country_code = $gi->GEOIP_COUNTRY_CODES[$char]; - $record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char]; - $record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char]; - $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char]; - $record_buf_pos++; - $str_length = 0; - // Get region - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->region = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; - // Get city - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->city = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; - // Get postal code - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->postal_code = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; - // Get latitude and longitude - $latitude = 0; - $longitude = 0; - for ($j = 0;$j < 3; ++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $latitude += ($char << ($j * 8)); - } - $record->latitude = ($latitude/10000) - 180; - for ($j = 0;$j < 3; ++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $longitude += ($char << ($j * 8)); - } - $record->longitude = ($longitude/10000) - 180; - if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){ - $metroarea_combo = 0; - if ($record->country_code == "US"){ - for ($j = 0;$j < 3;++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $metroarea_combo += ($char << ($j * 8)); - } - $record->metro_code = $record->dma_code = floor($metroarea_combo/1000); - $record->area_code = $metroarea_combo%1000; - } - } - mb_internal_encoding($enc); - return $record; -} - -function GeoIP_record_by_addr ($gi,$addr){ - if ($addr == NULL){ - return 0; - } - $ipnum = ip2long($addr); - return _get_record($gi, $ipnum); -} - -?> diff --git a/lib/geoip/geoipregionvars.php b/lib/geoip/geoipregionvars.php deleted file mode 100644 index 9ae67dbf793..00000000000 --- a/lib/geoip/geoipregionvars.php +++ /dev/null @@ -1,4456 +0,0 @@ - array( - "02" => "Canillo", - "03" => "Encamp", - "04" => "La Massana", - "05" => "Ordino", - "06" => "Sant Julia de Loria", - "07" => "Andorra la Vella", - "08" => "Escaldes-Engordany"), -"AE" => array( - "01" => "Abu Dhabi", - "02" => "Ajman", - "03" => "Dubai", - "04" => "Fujairah", - "05" => "Ras Al Khaimah", - "06" => "Sharjah", - "07" => "Umm Al Quwain"), -"AF" => array( - "01" => "Badakhshan", - "02" => "Badghis", - "03" => "Baghlan", - "05" => "Bamian", - "06" => "Farah", - "07" => "Faryab", - "08" => "Ghazni", - "09" => "Ghowr", - "10" => "Helmand", - "11" => "Herat", - "13" => "Kabol", - "14" => "Kapisa", - "15" => "Konar", - "16" => "Laghman", - "17" => "Lowgar", - "18" => "Nangarhar", - "19" => "Nimruz", - "21" => "Paktia", - "22" => "Parvan", - "23" => "Kandahar", - "24" => "Kondoz", - "26" => "Takhar", - "27" => "Vardak", - "28" => "Zabol", - "29" => "Paktika", - "30" => "Balkh", - "31" => "Jowzjan", - "32" => "Samangan", - "33" => "Sar-e Pol", - "34" => "Konar", - "35" => "Laghman", - "36" => "Paktia", - "37" => "Khowst", - "38" => "Nurestan", - "39" => "Oruzgan", - "40" => "Parvan", - "41" => "Daykondi", - "42" => "Panjshir"), -"AG" => array( - "01" => "Barbuda", - "03" => "Saint George", - "04" => "Saint John", - "05" => "Saint Mary", - "06" => "Saint Paul", - "07" => "Saint Peter", - "08" => "Saint Philip"), -"AL" => array( - "40" => "Berat", - "41" => "Diber", - "42" => "Durres", - "43" => "Elbasan", - "44" => "Fier", - "45" => "Gjirokaster", - "46" => "Korce", - "47" => "Kukes", - "48" => "Lezhe", - "49" => "Shkoder", - "50" => "Tirane", - "51" => "Vlore"), -"AM" => array( - "01" => "Aragatsotn", - "02" => "Ararat", - "03" => "Armavir", - "04" => "Geghark'unik'", - "05" => "Kotayk'", - "06" => "Lorri", - "07" => "Shirak", - "08" => "Syunik'", - "09" => "Tavush", - "10" => "Vayots' Dzor", - "11" => "Yerevan"), -"AO" => array( - "01" => "Benguela", - "02" => "Bie", - "03" => "Cabinda", - "04" => "Cuando Cubango", - "05" => "Cuanza Norte", - "06" => "Cuanza Sul", - "07" => "Cunene", - "08" => "Huambo", - "09" => "Huila", - "10" => "Luanda", - "12" => "Malanje", - "13" => "Namibe", - "14" => "Moxico", - "15" => "Uige", - "16" => "Zaire", - "17" => "Lunda Norte", - "18" => "Lunda Sul", - "19" => "Bengo", - "20" => "Luanda"), -"AR" => array( - "01" => "Buenos Aires", - "02" => "Catamarca", - "03" => "Chaco", - "04" => "Chubut", - "05" => "Cordoba", - "06" => "Corrientes", - "07" => "Distrito Federal", - "08" => "Entre Rios", - "09" => "Formosa", - "10" => "Jujuy", - "11" => "La Pampa", - "12" => "La Rioja", - "13" => "Mendoza", - "14" => "Misiones", - "15" => "Neuquen", - "16" => "Rio Negro", - "17" => "Salta", - "18" => "San Juan", - "19" => "San Luis", - "20" => "Santa Cruz", - "21" => "Santa Fe", - "22" => "Santiago del Estero", - "23" => "Tierra del Fuego", - "24" => "Tucuman"), -"AT" => array( - "01" => "Burgenland", - "02" => "Karnten", - "03" => "Niederosterreich", - "04" => "Oberosterreich", - "05" => "Salzburg", - "06" => "Steiermark", - "07" => "Tirol", - "08" => "Vorarlberg", - "09" => "Wien"), -"AU" => array( - "01" => "Australian Capital Territory", - "02" => "New South Wales", - "03" => "Northern Territory", - "04" => "Queensland", - "05" => "South Australia", - "06" => "Tasmania", - "07" => "Victoria", - "08" => "Western Australia"), -"AZ" => array( - "01" => "Abseron", - "02" => "Agcabadi", - "03" => "Agdam", - "04" => "Agdas", - "05" => "Agstafa", - "06" => "Agsu", - "07" => "Ali Bayramli", - "08" => "Astara", - "09" => "Baki", - "10" => "Balakan", - "11" => "Barda", - "12" => "Beylaqan", - "13" => "Bilasuvar", - "14" => "Cabrayil", - "15" => "Calilabad", - "16" => "Daskasan", - "17" => "Davaci", - "18" => "Fuzuli", - "19" => "Gadabay", - "20" => "Ganca", - "21" => "Goranboy", - "22" => "Goycay", - "23" => "Haciqabul", - "24" => "Imisli", - "25" => "Ismayilli", - "26" => "Kalbacar", - "27" => "Kurdamir", - "28" => "Lacin", - "29" => "Lankaran", - "30" => "Lankaran", - "31" => "Lerik", - "32" => "Masalli", - "33" => "Mingacevir", - "34" => "Naftalan", - "35" => "Naxcivan", - "36" => "Neftcala", - "37" => "Oguz", - "38" => "Qabala", - "39" => "Qax", - "40" => "Qazax", - "41" => "Qobustan", - "42" => "Quba", - "43" => "Qubadli", - "44" => "Qusar", - "45" => "Saatli", - "46" => "Sabirabad", - "47" => "Saki", - "48" => "Saki", - "49" => "Salyan", - "50" => "Samaxi", - "51" => "Samkir", - "52" => "Samux", - "53" => "Siyazan", - "54" => "Sumqayit", - "55" => "Susa", - "56" => "Susa", - "57" => "Tartar", - "58" => "Tovuz", - "59" => "Ucar", - "60" => "Xacmaz", - "61" => "Xankandi", - "62" => "Xanlar", - "63" => "Xizi", - "64" => "Xocali", - "65" => "Xocavand", - "66" => "Yardimli", - "67" => "Yevlax", - "68" => "Yevlax", - "69" => "Zangilan", - "70" => "Zaqatala", - "71" => "Zardab"), -"BA" => array( - "01" => "Federation of Bosnia and Herzegovina", - "02" => "Republika Srpska"), -"BB" => array( - "01" => "Christ Church", - "02" => "Saint Andrew", - "03" => "Saint George", - "04" => "Saint James", - "05" => "Saint John", - "06" => "Saint Joseph", - "07" => "Saint Lucy", - "08" => "Saint Michael", - "09" => "Saint Peter", - "10" => "Saint Philip", - "11" => "Saint Thomas"), -"BD" => array( - "01" => "Barisal", - "04" => "Bandarban", - "05" => "Comilla", - "12" => "Mymensingh", - "13" => "Noakhali", - "15" => "Patuakhali", - "22" => "Bagerhat", - "23" => "Bhola", - "24" => "Bogra", - "25" => "Barguna", - "26" => "Brahmanbaria", - "27" => "Chandpur", - "28" => "Chapai Nawabganj", - "29" => "Chattagram", - "30" => "Chuadanga", - "31" => "Cox's Bazar", - "32" => "Dhaka", - "33" => "Dinajpur", - "34" => "Faridpur", - "35" => "Feni", - "36" => "Gaibandha", - "37" => "Gazipur", - "38" => "Gopalganj", - "39" => "Habiganj", - "40" => "Jaipurhat", - "41" => "Jamalpur", - "42" => "Jessore", - "43" => "Jhalakati", - "44" => "Jhenaidah", - "45" => "Khagrachari", - "46" => "Khulna", - "47" => "Kishorganj", - "48" => "Kurigram", - "49" => "Kushtia", - "50" => "Laksmipur", - "51" => "Lalmonirhat", - "52" => "Madaripur", - "53" => "Magura", - "54" => "Manikganj", - "55" => "Meherpur", - "56" => "Moulavibazar", - "57" => "Munshiganj", - "58" => "Naogaon", - "59" => "Narail", - "60" => "Narayanganj", - "61" => "Narsingdi", - "62" => "Nator", - "63" => "Netrakona", - "64" => "Nilphamari", - "65" => "Pabna", - "66" => "Panchagar", - "67" => "Parbattya Chattagram", - "68" => "Pirojpur", - "69" => "Rajbari", - "70" => "Rajshahi", - "71" => "Rangpur", - "72" => "Satkhira", - "73" => "Shariyatpur", - "74" => "Sherpur", - "75" => "Sirajganj", - "76" => "Sunamganj", - "77" => "Sylhet", - "78" => "Tangail", - "79" => "Thakurgaon", - "81" => "Dhaka", - "82" => "Khulna", - "83" => "Rajshahi", - "84" => "Chittagong", - "85" => "Barisal", - "86" => "Sylhet"), -"BE" => array( - "01" => "Antwerpen", - "02" => "Brabant", - "03" => "Hainaut", - "04" => "Liege", - "05" => "Limburg", - "06" => "Luxembourg", - "07" => "Namur", - "08" => "Oost-Vlaanderen", - "09" => "West-Vlaanderen", - "10" => "Brabant Wallon", - "11" => "Brussels Hoofdstedelijk Gewest", - "12" => "Vlaams-Brabant"), -"BF" => array( - "15" => "Bam", - "19" => "Boulkiemde", - "20" => "Ganzourgou", - "21" => "Gnagna", - "28" => "Kouritenga", - "33" => "Oudalan", - "34" => "Passore", - "36" => "Sanguie", - "40" => "Soum", - "42" => "Tapoa", - "44" => "Zoundweogo", - "45" => "Bale", - "46" => "Banwa", - "47" => "Bazega", - "48" => "Bougouriba", - "49" => "Boulgou", - "50" => "Gourma", - "51" => "Houet", - "52" => "Ioba", - "53" => "Kadiogo", - "54" => "Kenedougou", - "55" => "Komoe", - "56" => "Komondjari", - "57" => "Kompienga", - "58" => "Kossi", - "59" => "Koulpelogo", - "60" => "Kourweogo", - "61" => "Leraba", - "62" => "Loroum", - "63" => "Mouhoun", - "64" => "Namentenga", - "65" => "Naouri", - "66" => "Nayala", - "67" => "Noumbiel", - "68" => "Oubritenga", - "69" => "Poni", - "70" => "Sanmatenga", - "71" => "Seno", - "72" => "Sissili", - "73" => "Sourou", - "74" => "Tuy", - "75" => "Yagha", - "76" => "Yatenga", - "77" => "Ziro", - "78" => "Zondoma"), -"BG" => array( - "33" => "Mikhaylovgrad", - "38" => "Blagoevgrad", - "39" => "Burgas", - "40" => "Dobrich", - "41" => "Gabrovo", - "42" => "Grad Sofiya", - "43" => "Khaskovo", - "44" => "Kurdzhali", - "45" => "Kyustendil", - "46" => "Lovech", - "47" => "Montana", - "48" => "Pazardzhik", - "49" => "Pernik", - "50" => "Pleven", - "51" => "Plovdiv", - "52" => "Razgrad", - "53" => "Ruse", - "54" => "Shumen", - "55" => "Silistra", - "56" => "Sliven", - "57" => "Smolyan", - "58" => "Sofiya", - "59" => "Stara Zagora", - "60" => "Turgovishte", - "61" => "Varna", - "62" => "Veliko Turnovo", - "63" => "Vidin", - "64" => "Vratsa", - "65" => "Yambol"), -"BH" => array( - "01" => "Al Hadd", - "02" => "Al Manamah", - "03" => "Al Muharraq", - "05" => "Jidd Hafs", - "06" => "Sitrah", - "07" => "Ar Rifa' wa al Mintaqah al Janubiyah", - "08" => "Al Mintaqah al Gharbiyah", - "09" => "Mintaqat Juzur Hawar", - "10" => "Al Mintaqah ash Shamaliyah", - "11" => "Al Mintaqah al Wusta", - "12" => "Madinat", - "13" => "Ar Rifa", - "14" => "Madinat Hamad", - "15" => "Al Muharraq", - "16" => "Al Asimah", - "17" => "Al Janubiyah", - "18" => "Ash Shamaliyah", - "19" => "Al Wusta"), -"BI" => array( - "02" => "Bujumbura", - "09" => "Bubanza", - "10" => "Bururi", - "11" => "Cankuzo", - "12" => "Cibitoke", - "13" => "Gitega", - "14" => "Karuzi", - "15" => "Kayanza", - "16" => "Kirundo", - "17" => "Makamba", - "18" => "Muyinga", - "19" => "Ngozi", - "20" => "Rutana", - "21" => "Ruyigi", - "22" => "Muramvya", - "23" => "Mwaro"), -"BJ" => array( - "01" => "Atakora", - "02" => "Atlantique", - "03" => "Borgou", - "04" => "Mono", - "05" => "Oueme", - "06" => "Zou", - "07" => "Alibori", - "08" => "Atakora", - "09" => "Atlanyique", - "10" => "Borgou", - "11" => "Collines", - "12" => "Kouffo", - "13" => "Donga", - "14" => "Littoral", - "15" => "Mono", - "16" => "Oueme", - "17" => "Plateau", - "18" => "Zou"), -"BM" => array( - "01" => "Devonshire", - "02" => "Hamilton", - "03" => "Hamilton", - "04" => "Paget", - "05" => "Pembroke", - "06" => "Saint George", - "07" => "Saint George's", - "08" => "Sandys", - "09" => "Smiths", - "10" => "Southampton", - "11" => "Warwick"), -"BN" => array( - "07" => "Alibori", - "08" => "Belait", - "09" => "Brunei and Muara", - "10" => "Temburong", - "11" => "Collines", - "12" => "Kouffo", - "13" => "Donga", - "14" => "Littoral", - "15" => "Tutong", - "16" => "Oueme", - "17" => "Plateau", - "18" => "Zou"), -"BO" => array( - "01" => "Chuquisaca", - "02" => "Cochabamba", - "03" => "El Beni", - "04" => "La Paz", - "05" => "Oruro", - "06" => "Pando", - "07" => "Potosi", - "08" => "Santa Cruz", - "09" => "Tarija"), -"BR" => array( - "01" => "Acre", - "02" => "Alagoas", - "03" => "Amapa", - "04" => "Amazonas", - "05" => "Bahia", - "06" => "Ceara", - "07" => "Distrito Federal", - "08" => "Espirito Santo", - "11" => "Mato Grosso do Sul", - "13" => "Maranhao", - "14" => "Mato Grosso", - "15" => "Minas Gerais", - "16" => "Para", - "17" => "Paraiba", - "18" => "Parana", - "20" => "Piaui", - "21" => "Rio de Janeiro", - "22" => "Rio Grande do Norte", - "23" => "Rio Grande do Sul", - "24" => "Rondonia", - "25" => "Roraima", - "26" => "Santa Catarina", - "27" => "Sao Paulo", - "28" => "Sergipe", - "29" => "Goias", - "30" => "Pernambuco", - "31" => "Tocantins"), -"BS" => array( - "05" => "Bimini", - "06" => "Cat Island", - "10" => "Exuma", - "13" => "Inagua", - "15" => "Long Island", - "16" => "Mayaguana", - "18" => "Ragged Island", - "22" => "Harbour Island", - "23" => "New Providence", - "24" => "Acklins and Crooked Islands", - "25" => "Freeport", - "26" => "Fresh Creek", - "27" => "Governor's Harbour", - "28" => "Green Turtle Cay", - "29" => "High Rock", - "30" => "Kemps Bay", - "31" => "Marsh Harbour", - "32" => "Nichollstown and Berry Islands", - "33" => "Rock Sound", - "34" => "Sandy Point", - "35" => "San Salvador and Rum Cay"), -"BT" => array( - "05" => "Bumthang", - "06" => "Chhukha", - "07" => "Chirang", - "08" => "Daga", - "09" => "Geylegphug", - "10" => "Ha", - "11" => "Lhuntshi", - "12" => "Mongar", - "13" => "Paro", - "14" => "Pemagatsel", - "15" => "Punakha", - "16" => "Samchi", - "17" => "Samdrup", - "18" => "Shemgang", - "19" => "Tashigang", - "20" => "Thimphu", - "21" => "Tongsa", - "22" => "Wangdi Phodrang"), -"BW" => array( - "01" => "Central", - "03" => "Ghanzi", - "04" => "Kgalagadi", - "05" => "Kgatleng", - "06" => "Kweneng", - "08" => "North-East", - "09" => "South-East", - "10" => "Southern", - "11" => "North-West"), -"BY" => array( - "01" => "Brestskaya Voblasts'", - "02" => "Homyel'skaya Voblasts'", - "03" => "Hrodzyenskaya Voblasts'", - "04" => "Minsk", - "05" => "Minskaya Voblasts'", - "06" => "Mahilyowskaya Voblasts'", - "07" => "Vitsyebskaya Voblasts'"), -"BZ" => array( - "01" => "Belize", - "02" => "Cayo", - "03" => "Corozal", - "04" => "Orange Walk", - "05" => "Stann Creek", - "06" => "Toledo"), -"CA" => array( - "AB" => "Alberta", - "BC" => "British Columbia", - "MB" => "Manitoba", - "NB" => "New Brunswick", - "NL" => "Newfoundland", - "NS" => "Nova Scotia", - "NT" => "Northwest Territories", - "NU" => "Nunavut", - "ON" => "Ontario", - "PE" => "Prince Edward Island", - "QC" => "Quebec", - "SK" => "Saskatchewan", - "YT" => "Yukon Territory"), -"CD" => array( - "01" => "Bandundu", - "02" => "Equateur", - "04" => "Kasai-Oriental", - "05" => "Katanga", - "06" => "Kinshasa", - "07" => "Kivu", - "08" => "Bas-Congo", - "09" => "Orientale", - "10" => "Maniema", - "11" => "Nord-Kivu", - "12" => "Sud-Kivu", - "13" => "Cuvette"), -"CF" => array( - "01" => "Bamingui-Bangoran", - "02" => "Basse-Kotto", - "03" => "Haute-Kotto", - "04" => "Mambere-Kadei", - "05" => "Haut-Mbomou", - "06" => "Kemo", - "07" => "Lobaye", - "08" => "Mbomou", - "09" => "Nana-Mambere", - "11" => "Ouaka", - "12" => "Ouham", - "13" => "Ouham-Pende", - "14" => "Cuvette-Ouest", - "15" => "Nana-Grebizi", - "16" => "Sangha-Mbaere", - "17" => "Ombella-Mpoko", - "18" => "Bangui"), -"CG" => array( - "01" => "Bouenza", - "03" => "Cuvette", - "04" => "Kouilou", - "05" => "Lekoumou", - "06" => "Likouala", - "07" => "Niari", - "08" => "Plateaux", - "10" => "Sangha", - "11" => "Pool", - "12" => "Brazzaville"), -"CH" => array( - "01" => "Aargau", - "02" => "Ausser-Rhoden", - "03" => "Basel-Landschaft", - "04" => "Basel-Stadt", - "05" => "Bern", - "06" => "Fribourg", - "07" => "Geneve", - "08" => "Glarus", - "09" => "Graubunden", - "10" => "Inner-Rhoden", - "11" => "Luzern", - "12" => "Neuchatel", - "13" => "Nidwalden", - "14" => "Obwalden", - "15" => "Sankt Gallen", - "16" => "Schaffhausen", - "17" => "Schwyz", - "18" => "Solothurn", - "19" => "Thurgau", - "20" => "Ticino", - "21" => "Uri", - "22" => "Valais", - "23" => "Vaud", - "24" => "Zug", - "25" => "Zurich", - "26" => "Jura"), -"CI" => array( - "05" => "Atacama", - "06" => "Biobio", - "51" => "Sassandra", - "61" => "Abidjan", - "74" => "Agneby", - "75" => "Bafing", - "76" => "Bas-Sassandra", - "77" => "Denguele", - "78" => "Dix-Huit Montagnes", - "79" => "Fromager", - "80" => "Haut-Sassandra", - "81" => "Lacs", - "82" => "Lagunes", - "83" => "Marahoue", - "84" => "Moyen-Cavally", - "85" => "Moyen-Comoe", - "86" => "N'zi-Comoe", - "87" => "Savanes", - "88" => "Sud-Bandama", - "89" => "Sud-Comoe", - "90" => "Vallee du Bandama", - "91" => "Worodougou", - "92" => "Zanzan"), -"CL" => array( - "01" => "Valparaiso", - "02" => "Aisen del General Carlos Ibanez del Campo", - "03" => "Antofagasta", - "04" => "Araucania", - "05" => "Atacama", - "06" => "Bio-Bio", - "07" => "Coquimbo", - "08" => "Libertador General Bernardo O'Higgins", - "09" => "Los Lagos", - "10" => "Magallanes y de la Antartica Chilena", - "11" => "Maule", - "12" => "Region Metropolitana", - "13" => "Tarapaca"), -"CM" => array( - "04" => "Est", - "05" => "Littoral", - "07" => "Nord-Ouest", - "08" => "Ouest", - "09" => "Sud-Ouest", - "10" => "Adamaoua", - "11" => "Centre", - "12" => "Extreme-Nord", - "13" => "Nord", - "14" => "Sud"), -"CN" => array( - "01" => "Anhui", - "02" => "Zhejiang", - "03" => "Jiangxi", - "04" => "Jiangsu", - "05" => "Jilin", - "06" => "Qinghai", - "07" => "Fujian", - "08" => "Heilongjiang", - "09" => "Henan", - "10" => "Hebei", - "11" => "Hunan", - "12" => "Hubei", - "13" => "Xinjiang", - "14" => "Xizang", - "15" => "Gansu", - "16" => "Guangxi", - "18" => "Guizhou", - "19" => "Liaoning", - "20" => "Nei Mongol", - "21" => "Ningxia", - "22" => "Beijing", - "23" => "Shanghai", - "24" => "Shanxi", - "25" => "Shandong", - "26" => "Shaanxi", - "28" => "Tianjin", - "29" => "Yunnan", - "30" => "Guangdong", - "31" => "Hainan", - "32" => "Sichuan", - "33" => "Chongqing"), -"CO" => array( - "01" => "Amazonas", - "02" => "Antioquia", - "03" => "Arauca", - "04" => "Atlantico", - "05" => "Bolivar Department", - "06" => "Boyaca Department", - "07" => "Caldas Department", - "08" => "Caqueta", - "09" => "Cauca", - "10" => "Cesar", - "11" => "Choco", - "12" => "Cordoba", - "14" => "Guaviare", - "15" => "Guainia", - "16" => "Huila", - "17" => "La Guajira", - "18" => "Magdalena Department", - "19" => "Meta", - "20" => "Narino", - "21" => "Norte de Santander", - "22" => "Putumayo", - "23" => "Quindio", - "24" => "Risaralda", - "25" => "San Andres y Providencia", - "26" => "Santander", - "27" => "Sucre", - "28" => "Tolima", - "29" => "Valle del Cauca", - "30" => "Vaupes", - "31" => "Vichada", - "32" => "Casanare", - "33" => "Cundinamarca", - "34" => "Distrito Especial", - "35" => "Bolivar", - "36" => "Boyaca", - "37" => "Caldas", - "38" => "Magdalena"), -"CR" => array( - "01" => "Alajuela", - "02" => "Cartago", - "03" => "Guanacaste", - "04" => "Heredia", - "06" => "Limon", - "07" => "Puntarenas", - "08" => "San Jose"), -"CU" => array( - "01" => "Pinar del Rio", - "02" => "Ciudad de la Habana", - "03" => "Matanzas", - "04" => "Isla de la Juventud", - "05" => "Camaguey", - "07" => "Ciego de Avila", - "08" => "Cienfuegos", - "09" => "Granma", - "10" => "Guantanamo", - "11" => "La Habana", - "12" => "Holguin", - "13" => "Las Tunas", - "14" => "Sancti Spiritus", - "15" => "Santiago de Cuba", - "16" => "Villa Clara"), -"CV" => array( - "01" => "Boa Vista", - "02" => "Brava", - "04" => "Maio", - "05" => "Paul", - "07" => "Ribeira Grande", - "08" => "Sal", - "10" => "Sao Nicolau", - "11" => "Sao Vicente", - "13" => "Mosteiros", - "14" => "Praia", - "15" => "Santa Catarina", - "16" => "Santa Cruz", - "17" => "Sao Domingos", - "18" => "Sao Filipe", - "19" => "Sao Miguel", - "20" => "Tarrafal"), -"CY" => array( - "01" => "Famagusta", - "02" => "Kyrenia", - "03" => "Larnaca", - "04" => "Nicosia", - "05" => "Limassol", - "06" => "Paphos"), -"CZ" => array( - "03" => "Blansko", - "04" => "Breclav", - "20" => "Hradec Kralove", - "21" => "Jablonec nad Nisou", - "23" => "Jicin", - "24" => "Jihlava", - "30" => "Kolin", - "33" => "Liberec", - "36" => "Melnik", - "37" => "Mlada Boleslav", - "39" => "Nachod", - "41" => "Nymburk", - "45" => "Pardubice", - "52" => "Hlavni mesto Praha", - "61" => "Semily", - "70" => "Trutnov", - "78" => "Jihomoravsky kraj", - "79" => "Jihocesky kraj", - "80" => "Vysocina", - "81" => "Karlovarsky kraj", - "82" => "Kralovehradecky kraj", - "83" => "Liberecky kraj", - "84" => "Olomoucky kraj", - "85" => "Moravskoslezsky kraj", - "86" => "Pardubicky kraj", - "87" => "Plzensky kraj", - "88" => "Stredocesky kraj", - "89" => "Ustecky kraj", - "90" => "Zlinsky kraj"), -"DE" => array( - "01" => "Baden-Wurttemberg", - "02" => "Bayern", - "03" => "Bremen", - "04" => "Hamburg", - "05" => "Hessen", - "06" => "Niedersachsen", - "07" => "Nordrhein-Westfalen", - "08" => "Rheinland-Pfalz", - "09" => "Saarland", - "10" => "Schleswig-Holstein", - "11" => "Brandenburg", - "12" => "Mecklenburg-Vorpommern", - "13" => "Sachsen", - "14" => "Sachsen-Anhalt", - "15" => "Thuringen", - "16" => "Berlin"), -"DJ" => array( - "01" => "Ali Sabieh", - "04" => "Obock", - "05" => "Tadjoura", - "06" => "Dikhil", - "07" => "Djibouti", - "08" => "Arta"), -"DK" => array( - "01" => "Arhus", - "02" => "Bornholm", - "03" => "Frederiksborg", - "04" => "Fyn", - "05" => "Kobenhavn", - "06" => "Staden Kobenhavn", - "07" => "Nordjylland", - "08" => "Ribe", - "09" => "Ringkobing", - "10" => "Roskilde", - "11" => "Sonderjylland", - "12" => "Storstrom", - "13" => "Vejle", - "14" => "Vestsjalland", - "15" => "Viborg", - "17" => "Hovedstaden", - "18" => "Midtjyllen", - "19" => "Nordjylland", - "20" => "Sjelland", - "21" => "Syddanmark"), -"DM" => array( - "02" => "Saint Andrew", - "03" => "Saint David", - "04" => "Saint George", - "05" => "Saint John", - "06" => "Saint Joseph", - "07" => "Saint Luke", - "08" => "Saint Mark", - "09" => "Saint Patrick", - "10" => "Saint Paul", - "11" => "Saint Peter"), -"DO" => array( - "01" => "Azua", - "02" => "Baoruco", - "03" => "Barahona", - "04" => "Dajabon", - "05" => "Distrito Nacional", - "06" => "Duarte", - "08" => "Espaillat", - "09" => "Independencia", - "10" => "La Altagracia", - "11" => "Elias Pina", - "12" => "La Romana", - "14" => "Maria Trinidad Sanchez", - "15" => "Monte Cristi", - "16" => "Pedernales", - "17" => "Peravia", - "18" => "Puerto Plata", - "19" => "Salcedo", - "20" => "Samana", - "21" => "Sanchez Ramirez", - "23" => "San Juan", - "24" => "San Pedro De Macoris", - "25" => "Santiago", - "26" => "Santiago Rodriguez", - "27" => "Valverde", - "28" => "El Seibo", - "29" => "Hato Mayor", - "30" => "La Vega", - "31" => "Monsenor Nouel", - "32" => "Monte Plata", - "33" => "San Cristobal", - "34" => "Distrito Nacional", - "35" => "Peravia", - "36" => "San Jose de Ocoa", - "37" => "Santo Domingo"), -"DZ" => array( - "01" => "Alger", - "03" => "Batna", - "04" => "Constantine", - "06" => "Medea", - "07" => "Mostaganem", - "09" => "Oran", - "10" => "Saida", - "12" => "Setif", - "13" => "Tiaret", - "14" => "Tizi Ouzou", - "15" => "Tlemcen", - "18" => "Bejaia", - "19" => "Biskra", - "20" => "Blida", - "21" => "Bouira", - "22" => "Djelfa", - "23" => "Guelma", - "24" => "Jijel", - "25" => "Laghouat", - "26" => "Mascara", - "27" => "M'sila", - "29" => "Oum el Bouaghi", - "30" => "Sidi Bel Abbes", - "31" => "Skikda", - "33" => "Tebessa", - "34" => "Adrar", - "35" => "Ain Defla", - "36" => "Ain Temouchent", - "37" => "Annaba", - "38" => "Bechar", - "39" => "Bordj Bou Arreridj", - "40" => "Boumerdes", - "41" => "Chlef", - "42" => "El Bayadh", - "43" => "El Oued", - "44" => "El Tarf", - "45" => "Ghardaia", - "46" => "Illizi", - "47" => "Khenchela", - "48" => "Mila", - "49" => "Naama", - "50" => "Ouargla", - "51" => "Relizane", - "52" => "Souk Ahras", - "53" => "Tamanghasset", - "54" => "Tindouf", - "55" => "Tipaza", - "56" => "Tissemsilt"), -"EC" => array( - "01" => "Galapagos", - "02" => "Azuay", - "03" => "Bolivar", - "04" => "Canar", - "05" => "Carchi", - "06" => "Chimborazo", - "07" => "Cotopaxi", - "08" => "El Oro", - "09" => "Esmeraldas", - "10" => "Guayas", - "11" => "Imbabura", - "12" => "Loja", - "13" => "Los Rios", - "14" => "Manabi", - "15" => "Morona-Santiago", - "17" => "Pastaza", - "18" => "Pichincha", - "19" => "Tungurahua", - "20" => "Zamora-Chinchipe", - "22" => "Sucumbios", - "23" => "Napo", - "24" => "Orellana"), -"EE" => array( - "01" => "Harjumaa", - "02" => "Hiiumaa", - "03" => "Ida-Virumaa", - "04" => "Jarvamaa", - "05" => "Jogevamaa", - "06" => "Kohtla-Jarve", - "07" => "Laanemaa", - "08" => "Laane-Virumaa", - "09" => "Narva", - "10" => "Parnu", - "11" => "Parnumaa", - "12" => "Polvamaa", - "13" => "Raplamaa", - "14" => "Saaremaa", - "15" => "Sillamae", - "16" => "Tallinn", - "17" => "Tartu", - "18" => "Tartumaa", - "19" => "Valgamaa", - "20" => "Viljandimaa", - "21" => "Vorumaa"), -"EG" => array( - "01" => "Ad Daqahliyah", - "02" => "Al Bahr al Ahmar", - "03" => "Al Buhayrah", - "04" => "Al Fayyum", - "05" => "Al Gharbiyah", - "06" => "Al Iskandariyah", - "07" => "Al Isma'iliyah", - "08" => "Al Jizah", - "09" => "Al Minufiyah", - "10" => "Al Minya", - "11" => "Al Qahirah", - "12" => "Al Qalyubiyah", - "13" => "Al Wadi al Jadid", - "14" => "Ash Sharqiyah", - "15" => "As Suways", - "16" => "Aswan", - "17" => "Asyut", - "18" => "Bani Suwayf", - "19" => "Bur Sa'id", - "20" => "Dumyat", - "21" => "Kafr ash Shaykh", - "22" => "Matruh", - "23" => "Qina", - "24" => "Suhaj", - "26" => "Janub Sina'", - "27" => "Shamal Sina'"), -"ER" => array( - "01" => "Anseba", - "02" => "Debub", - "03" => "Debubawi K'eyih Bahri", - "04" => "Gash Barka", - "05" => "Ma'akel", - "06" => "Semenawi K'eyih Bahri"), -"ES" => array( - "07" => "Islas Baleares", - "27" => "La Rioja", - "29" => "Madrid", - "31" => "Murcia", - "32" => "Navarra", - "34" => "Asturias", - "39" => "Cantabria", - "51" => "Andalucia", - "52" => "Aragon", - "53" => "Canarias", - "54" => "Castilla-La Mancha", - "55" => "Castilla y Leon", - "56" => "Catalonia", - "57" => "Extremadura", - "58" => "Galicia", - "59" => "Pais Vasco", - "60" => "Comunidad Valenciana"), -"ET" => array( - "02" => "Amhara", - "07" => "Somali", - "08" => "Gambella", - "10" => "Addis Abeba", - "11" => "Southern", - "12" => "Tigray", - "13" => "Benishangul", - "14" => "Afar", - "44" => "Adis Abeba", - "45" => "Afar", - "46" => "Amara", - "47" => "Binshangul Gumuz", - "48" => "Dire Dawa", - "49" => "Gambela Hizboch", - "50" => "Hareri Hizb", - "51" => "Oromiya", - "52" => "Sumale", - "53" => "Tigray", - "54" => "YeDebub Biheroch Bihereseboch na Hizboch"), -"FI" => array( - "01" => "Aland", - "06" => "Lapland", - "08" => "Oulu", - "13" => "Southern Finland", - "14" => "Eastern Finland", - "15" => "Western Finland"), -"FJ" => array( - "01" => "Central", - "02" => "Eastern", - "03" => "Northern", - "04" => "Rotuma", - "05" => "Western"), -"FM" => array( - "01" => "Kosrae", - "02" => "Pohnpei", - "03" => "Chuuk", - "04" => "Yap"), -"FR" => array( - "97" => "Aquitaine", - "98" => "Auvergne", - "99" => "Basse-Normandie", - "A1" => "Bourgogne", - "A2" => "Bretagne", - "A3" => "Centre", - "A4" => "Champagne-Ardenne", - "A5" => "Corse", - "A6" => "Franche-Comte", - "A7" => "Haute-Normandie", - "A8" => "Ile-de-France", - "A9" => "Languedoc-Roussillon", - "B1" => "Limousin", - "B2" => "Lorraine", - "B3" => "Midi-Pyrenees", - "B4" => "Nord-Pas-de-Calais", - "B5" => "Pays de la Loire", - "B6" => "Picardie", - "B7" => "Poitou-Charentes", - "B8" => "Provence-Alpes-Cote d'Azur", - "B9" => "Rhone-Alpes", - "C1" => "Alsace"), -"GA" => array( - "01" => "Estuaire", - "02" => "Haut-Ogooue", - "03" => "Moyen-Ogooue", - "04" => "Ngounie", - "05" => "Nyanga", - "06" => "Ogooue-Ivindo", - "07" => "Ogooue-Lolo", - "08" => "Ogooue-Maritime", - "09" => "Woleu-Ntem"), -"GB" => array( - "01" => "Avon", - "03" => "Berkshire", - "07" => "Cleveland", - "17" => "Greater London", - "18" => "Greater Manchester", - "20" => "Hereford and Worcester", - "22" => "Humberside", - "28" => "Merseyside", - "37" => "South Yorkshire", - "41" => "Tyne and Wear", - "43" => "West Midlands", - "45" => "West Yorkshire", - "79" => "Central", - "82" => "Grampian", - "84" => "Lothian", - "87" => "Strathclyde", - "88" => "Tayside", - "90" => "Clwyd", - "91" => "Dyfed", - "92" => "Gwent", - "94" => "Mid Glamorgan", - "96" => "South Glamorgan", - "97" => "West Glamorgan", - "A1" => "Barking and Dagenham", - "A2" => "Barnet", - "A3" => "Barnsley", - "A4" => "Bath and North East Somerset", - "A5" => "Bedfordshire", - "A6" => "Bexley", - "A7" => "Birmingham", - "A8" => "Blackburn with Darwen", - "A9" => "Blackpool", - "B1" => "Bolton", - "B2" => "Bournemouth", - "B3" => "Bracknell Forest", - "B4" => "Bradford", - "B5" => "Brent", - "B6" => "Brighton and Hove", - "B7" => "Bristol, City of", - "B8" => "Bromley", - "B9" => "Buckinghamshire", - "C1" => "Bury", - "C2" => "Calderdale", - "C3" => "Cambridgeshire", - "C4" => "Camden", - "C5" => "Cheshire", - "C6" => "Cornwall", - "C7" => "Coventry", - "C8" => "Croydon", - "C9" => "Cumbria", - "D1" => "Darlington", - "D2" => "Derby", - "D3" => "Derbyshire", - "D4" => "Devon", - "D5" => "Doncaster", - "D6" => "Dorset", - "D7" => "Dudley", - "D8" => "Durham", - "D9" => "Ealing", - "E1" => "East Riding of Yorkshire", - "E2" => "East Sussex", - "E3" => "Enfield", - "E4" => "Essex", - "E5" => "Gateshead", - "E6" => "Gloucestershire", - "E7" => "Greenwich", - "E8" => "Hackney", - "E9" => "Halton", - "F1" => "Hammersmith and Fulham", - "F2" => "Hampshire", - "F3" => "Haringey", - "F4" => "Harrow", - "F5" => "Hartlepool", - "F6" => "Havering", - "F7" => "Herefordshire", - "F8" => "Hertford", - "F9" => "Hillingdon", - "G1" => "Hounslow", - "G2" => "Isle of Wight", - "G3" => "Islington", - "G4" => "Kensington and Chelsea", - "G5" => "Kent", - "G6" => "Kingston upon Hull, City of", - "G7" => "Kingston upon Thames", - "G8" => "Kirklees", - "G9" => "Knowsley", - "H1" => "Lambeth", - "H2" => "Lancashire", - "H3" => "Leeds", - "H4" => "Leicester", - "H5" => "Leicestershire", - "H6" => "Lewisham", - "H7" => "Lincolnshire", - "H8" => "Liverpool", - "H9" => "London, City of", - "I1" => "Luton", - "I2" => "Manchester", - "I3" => "Medway", - "I4" => "Merton", - "I5" => "Middlesbrough", - "I6" => "Milton Keynes", - "I7" => "Newcastle upon Tyne", - "I8" => "Newham", - "I9" => "Norfolk", - "J1" => "Northamptonshire", - "J2" => "North East Lincolnshire", - "J3" => "North Lincolnshire", - "J4" => "North Somerset", - "J5" => "North Tyneside", - "J6" => "Northumberland", - "J7" => "North Yorkshire", - "J8" => "Nottingham", - "J9" => "Nottinghamshire", - "K1" => "Oldham", - "K2" => "Oxfordshire", - "K3" => "Peterborough", - "K4" => "Plymouth", - "K5" => "Poole", - "K6" => "Portsmouth", - "K7" => "Reading", - "K8" => "Redbridge", - "K9" => "Redcar and Cleveland", - "L1" => "Richmond upon Thames", - "L2" => "Rochdale", - "L3" => "Rotherham", - "L4" => "Rutland", - "L5" => "Salford", - "L6" => "Shropshire", - "L7" => "Sandwell", - "L8" => "Sefton", - "L9" => "Sheffield", - "M1" => "Slough", - "M2" => "Solihull", - "M3" => "Somerset", - "M4" => "Southampton", - "M5" => "Southend-on-Sea", - "M6" => "South Gloucestershire", - "M7" => "South Tyneside", - "M8" => "Southwark", - "M9" => "Staffordshire", - "N1" => "St. Helens", - "N2" => "Stockport", - "N3" => "Stockton-on-Tees", - "N4" => "Stoke-on-Trent", - "N5" => "Suffolk", - "N6" => "Sunderland", - "N7" => "Surrey", - "N8" => "Sutton", - "N9" => "Swindon", - "O1" => "Tameside", - "O2" => "Telford and Wrekin", - "O3" => "Thurrock", - "O4" => "Torbay", - "O5" => "Tower Hamlets", - "O6" => "Trafford", - "O7" => "Wakefield", - "O8" => "Walsall", - "O9" => "Waltham Forest", - "P1" => "Wandsworth", - "P2" => "Warrington", - "P3" => "Warwickshire", - "P4" => "West Berkshire", - "P5" => "Westminster", - "P6" => "West Sussex", - "P7" => "Wigan", - "P8" => "Wiltshire", - "P9" => "Windsor and Maidenhead", - "Q1" => "Wirral", - "Q2" => "Wokingham", - "Q3" => "Wolverhampton", - "Q4" => "Worcestershire", - "Q5" => "York", - "Q6" => "Antrim", - "Q7" => "Ards", - "Q8" => "Armagh", - "Q9" => "Ballymena", - "R1" => "Ballymoney", - "R2" => "Banbridge", - "R3" => "Belfast", - "R4" => "Carrickfergus", - "R5" => "Castlereagh", - "R6" => "Coleraine", - "R7" => "Cookstown", - "R8" => "Craigavon", - "R9" => "Down", - "S1" => "Dungannon", - "S2" => "Fermanagh", - "S3" => "Larne", - "S4" => "Limavady", - "S5" => "Lisburn", - "S6" => "Derry", - "S7" => "Magherafelt", - "S8" => "Moyle", - "S9" => "Newry and Mourne", - "T1" => "Newtownabbey", - "T2" => "North Down", - "T3" => "Omagh", - "T4" => "Strabane", - "T5" => "Aberdeen City", - "T6" => "Aberdeenshire", - "T7" => "Angus", - "T8" => "Argyll and Bute", - "T9" => "Scottish Borders, The", - "U1" => "Clackmannanshire", - "U2" => "Dumfries and Galloway", - "U3" => "Dundee City", - "U4" => "East Ayrshire", - "U5" => "East Dunbartonshire", - "U6" => "East Lothian", - "U7" => "East Renfrewshire", - "U8" => "Edinburgh, City of", - "U9" => "Falkirk", - "V1" => "Fife", - "V2" => "Glasgow City", - "V3" => "Highland", - "V4" => "Inverclyde", - "V5" => "Midlothian", - "V6" => "Moray", - "V7" => "North Ayrshire", - "V8" => "North Lanarkshire", - "V9" => "Orkney", - "W1" => "Perth and Kinross", - "W2" => "Renfrewshire", - "W3" => "Shetland Islands", - "W4" => "South Ayrshire", - "W5" => "South Lanarkshire", - "W6" => "Stirling", - "W7" => "West Dunbartonshire", - "W8" => "Eilean Siar", - "W9" => "West Lothian", - "X1" => "Isle of Anglesey", - "X2" => "Blaenau Gwent", - "X3" => "Bridgend", - "X4" => "Caerphilly", - "X5" => "Cardiff", - "X6" => "Ceredigion", - "X7" => "Carmarthenshire", - "X8" => "Conwy", - "X9" => "Denbighshire", - "Y1" => "Flintshire", - "Y2" => "Gwynedd", - "Y3" => "Merthyr Tydfil", - "Y4" => "Monmouthshire", - "Y5" => "Neath Port Talbot", - "Y6" => "Newport", - "Y7" => "Pembrokeshire", - "Y8" => "Powys", - "Y9" => "Rhondda Cynon Taff", - "Z1" => "Swansea", - "Z2" => "Torfaen", - "Z3" => "Vale of Glamorgan, The", - "Z4" => "Wrexham"), -"GD" => array( - "01" => "Saint Andrew", - "02" => "Saint David", - "03" => "Saint George", - "04" => "Saint John", - "05" => "Saint Mark", - "06" => "Saint Patrick"), -"GE" => array( - "01" => "Abashis Raioni", - "02" => "Abkhazia", - "03" => "Adigenis Raioni", - "04" => "Ajaria", - "05" => "Akhalgoris Raioni", - "06" => "Akhalk'alak'is Raioni", - "07" => "Akhalts'ikhis Raioni", - "08" => "Akhmetis Raioni", - "09" => "Ambrolauris Raioni", - "10" => "Aspindzis Raioni", - "11" => "Baghdat'is Raioni", - "12" => "Bolnisis Raioni", - "13" => "Borjomis Raioni", - "14" => "Chiat'ura", - "15" => "Ch'khorotsqus Raioni", - "16" => "Ch'okhatauris Raioni", - "17" => "Dedop'listsqaros Raioni", - "18" => "Dmanisis Raioni", - "19" => "Dushet'is Raioni", - "20" => "Gardabanis Raioni", - "21" => "Gori", - "22" => "Goris Raioni", - "23" => "Gurjaanis Raioni", - "24" => "Javis Raioni", - "25" => "K'arelis Raioni", - "26" => "Kaspis Raioni", - "27" => "Kharagaulis Raioni", - "28" => "Khashuris Raioni", - "29" => "Khobis Raioni", - "30" => "Khonis Raioni", - "31" => "K'ut'aisi", - "32" => "Lagodekhis Raioni", - "33" => "Lanch'khut'is Raioni", - "34" => "Lentekhis Raioni", - "35" => "Marneulis Raioni", - "36" => "Martvilis Raioni", - "37" => "Mestiis Raioni", - "38" => "Mts'khet'is Raioni", - "39" => "Ninotsmindis Raioni", - "40" => "Onis Raioni", - "41" => "Ozurget'is Raioni", - "42" => "P'ot'i", - "43" => "Qazbegis Raioni", - "44" => "Qvarlis Raioni", - "45" => "Rust'avi", - "46" => "Sach'kheris Raioni", - "47" => "Sagarejos Raioni", - "48" => "Samtrediis Raioni", - "49" => "Senakis Raioni", - "50" => "Sighnaghis Raioni", - "51" => "T'bilisi", - "52" => "T'elavis Raioni", - "53" => "T'erjolis Raioni", - "54" => "T'et'ritsqaros Raioni", - "55" => "T'ianet'is Raioni", - "56" => "Tqibuli", - "57" => "Ts'ageris Raioni", - "58" => "Tsalenjikhis Raioni", - "59" => "Tsalkis Raioni", - "60" => "Tsqaltubo", - "61" => "Vanis Raioni", - "62" => "Zestap'onis Raioni", - "63" => "Zugdidi", - "64" => "Zugdidis Raioni"), -"GH" => array( - "01" => "Greater Accra", - "02" => "Ashanti", - "03" => "Brong-Ahafo", - "04" => "Central", - "05" => "Eastern", - "06" => "Northern", - "08" => "Volta", - "09" => "Western", - "10" => "Upper East", - "11" => "Upper West"), -"GL" => array( - "01" => "Nordgronland", - "02" => "Ostgronland", - "03" => "Vestgronland"), -"GM" => array( - "01" => "Banjul", - "02" => "Lower River", - "03" => "Central River", - "04" => "Upper River", - "05" => "Western", - "07" => "North Bank"), -"GN" => array( - "01" => "Beyla", - "02" => "Boffa", - "03" => "Boke", - "04" => "Conakry", - "05" => "Dabola", - "06" => "Dalaba", - "07" => "Dinguiraye", - "09" => "Faranah", - "10" => "Forecariah", - "11" => "Fria", - "12" => "Gaoual", - "13" => "Gueckedou", - "15" => "Kerouane", - "16" => "Kindia", - "17" => "Kissidougou", - "18" => "Koundara", - "19" => "Kouroussa", - "21" => "Macenta", - "22" => "Mali", - "23" => "Mamou", - "25" => "Pita", - "27" => "Telimele", - "28" => "Tougue", - "29" => "Yomou", - "30" => "Coyah", - "31" => "Dubreka", - "32" => "Kankan", - "33" => "Koubia", - "34" => "Labe", - "35" => "Lelouma", - "36" => "Lola", - "37" => "Mandiana", - "38" => "Nzerekore", - "39" => "Siguiri"), -"GQ" => array( - "03" => "Annobon", - "04" => "Bioko Norte", - "05" => "Bioko Sur", - "06" => "Centro Sur", - "07" => "Kie-Ntem", - "08" => "Litoral", - "09" => "Wele-Nzas"), -"GR" => array( - "01" => "Evros", - "02" => "Rodhopi", - "03" => "Xanthi", - "04" => "Drama", - "05" => "Serrai", - "06" => "Kilkis", - "07" => "Pella", - "08" => "Florina", - "09" => "Kastoria", - "10" => "Grevena", - "11" => "Kozani", - "12" => "Imathia", - "13" => "Thessaloniki", - "14" => "Kavala", - "15" => "Khalkidhiki", - "16" => "Pieria", - "17" => "Ioannina", - "18" => "Thesprotia", - "19" => "Preveza", - "20" => "Arta", - "21" => "Larisa", - "22" => "Trikala", - "23" => "Kardhitsa", - "24" => "Magnisia", - "25" => "Kerkira", - "26" => "Levkas", - "27" => "Kefallinia", - "28" => "Zakinthos", - "29" => "Fthiotis", - "30" => "Evritania", - "31" => "Aitolia kai Akarnania", - "32" => "Fokis", - "33" => "Voiotia", - "34" => "Evvoia", - "35" => "Attiki", - "36" => "Argolis", - "37" => "Korinthia", - "38" => "Akhaia", - "39" => "Ilia", - "40" => "Messinia", - "41" => "Arkadhia", - "42" => "Lakonia", - "43" => "Khania", - "44" => "Rethimni", - "45" => "Iraklion", - "46" => "Lasithi", - "47" => "Dhodhekanisos", - "48" => "Samos", - "49" => "Kikladhes", - "50" => "Khios", - "51" => "Lesvos"), -"GT" => array( - "01" => "Alta Verapaz", - "02" => "Baja Verapaz", - "03" => "Chimaltenango", - "04" => "Chiquimula", - "05" => "El Progreso", - "06" => "Escuintla", - "07" => "Guatemala", - "08" => "Huehuetenango", - "09" => "Izabal", - "10" => "Jalapa", - "11" => "Jutiapa", - "12" => "Peten", - "13" => "Quetzaltenango", - "14" => "Quiche", - "15" => "Retalhuleu", - "16" => "Sacatepequez", - "17" => "San Marcos", - "18" => "Santa Rosa", - "19" => "Solola", - "20" => "Suchitepequez", - "21" => "Totonicapan", - "22" => "Zacapa"), -"GW" => array( - "01" => "Bafata", - "02" => "Quinara", - "04" => "Oio", - "05" => "Bolama", - "06" => "Cacheu", - "07" => "Tombali", - "10" => "Gabu", - "11" => "Bissau", - "12" => "Biombo"), -"GY" => array( - "10" => "Barima-Waini", - "11" => "Cuyuni-Mazaruni", - "12" => "Demerara-Mahaica", - "13" => "East Berbice-Corentyne", - "14" => "Essequibo Islands-West Demerara", - "15" => "Mahaica-Berbice", - "16" => "Pomeroon-Supenaam", - "17" => "Potaro-Siparuni", - "18" => "Upper Demerara-Berbice", - "19" => "Upper Takutu-Upper Essequibo"), -"HN" => array( - "01" => "Atlantida", - "02" => "Choluteca", - "03" => "Colon", - "04" => "Comayagua", - "05" => "Copan", - "06" => "Cortes", - "07" => "El Paraiso", - "08" => "Francisco Morazan", - "09" => "Gracias a Dios", - "10" => "Intibuca", - "11" => "Islas de la Bahia", - "12" => "La Paz", - "13" => "Lempira", - "14" => "Ocotepeque", - "15" => "Olancho", - "16" => "Santa Barbara", - "17" => "Valle", - "18" => "Yoro"), -"HR" => array( - "01" => "Bjelovarsko-Bilogorska", - "02" => "Brodsko-Posavska", - "03" => "Dubrovacko-Neretvanska", - "04" => "Istarska", - "05" => "Karlovacka", - "06" => "Koprivnicko-Krizevacka", - "07" => "Krapinsko-Zagorska", - "08" => "Licko-Senjska", - "09" => "Medimurska", - "10" => "Osjecko-Baranjska", - "11" => "Pozesko-Slavonska", - "12" => "Primorsko-Goranska", - "13" => "Sibensko-Kninska", - "14" => "Sisacko-Moslavacka", - "15" => "Splitsko-Dalmatinska", - "16" => "Varazdinska", - "17" => "Viroviticko-Podravska", - "18" => "Vukovarsko-Srijemska", - "19" => "Zadarska", - "20" => "Zagrebacka", - "21" => "Grad Zagreb"), -"HT" => array( - "03" => "Nord-Ouest", - "06" => "Artibonite", - "07" => "Centre", - "09" => "Nord", - "10" => "Nord-Est", - "11" => "Ouest", - "12" => "Sud", - "13" => "Sud-Est", - "14" => "Grand' Anse", - "15" => "Nippes"), -"HU" => array( - "01" => "Bacs-Kiskun", - "02" => "Baranya", - "03" => "Bekes", - "04" => "Borsod-Abauj-Zemplen", - "05" => "Budapest", - "06" => "Csongrad", - "07" => "Debrecen", - "08" => "Fejer", - "09" => "Gyor-Moson-Sopron", - "10" => "Hajdu-Bihar", - "11" => "Heves", - "12" => "Komarom-Esztergom", - "13" => "Miskolc", - "14" => "Nograd", - "15" => "Pecs", - "16" => "Pest", - "17" => "Somogy", - "18" => "Szabolcs-Szatmar-Bereg", - "19" => "Szeged", - "20" => "Jasz-Nagykun-Szolnok", - "21" => "Tolna", - "22" => "Vas", - "23" => "Veszprem", - "24" => "Zala", - "25" => "Gyor", - "26" => "Bekescsaba", - "27" => "Dunaujvaros", - "28" => "Eger", - "29" => "Hodmezovasarhely", - "30" => "Kaposvar", - "31" => "Kecskemet", - "32" => "Nagykanizsa", - "33" => "Nyiregyhaza", - "34" => "Sopron", - "35" => "Szekesfehervar", - "36" => "Szolnok", - "37" => "Szombathely", - "38" => "Tatabanya", - "39" => "Veszprem", - "40" => "Zalaegerszeg", - "41" => "Salgotarjan", - "42" => "Szekszard"), -"ID" => array( - "01" => "Aceh", - "02" => "Bali", - "03" => "Bengkulu", - "04" => "Jakarta Raya", - "05" => "Jambi", - "06" => "Jawa Barat", - "07" => "Jawa Tengah", - "08" => "Jawa Timur", - "09" => "Papua", - "10" => "Yogyakarta", - "11" => "Kalimantan Barat", - "12" => "Kalimantan Selatan", - "13" => "Kalimantan Tengah", - "14" => "Kalimantan Timur", - "15" => "Lampung", - "16" => "Maluku", - "17" => "Nusa Tenggara Barat", - "18" => "Nusa Tenggara Timur", - "19" => "Riau", - "20" => "Sulawesi Selatan", - "21" => "Sulawesi Tengah", - "22" => "Sulawesi Tenggara", - "23" => "Sulawesi Utara", - "24" => "Sumatera Barat", - "25" => "Sumatera Selatan", - "26" => "Sumatera Utara", - "28" => "Maluku", - "29" => "Maluku Utara", - "30" => "Jawa Barat", - "31" => "Sulawesi Utara", - "32" => "Sumatera Selatan", - "33" => "Banten", - "34" => "Gorontalo", - "35" => "Kepulauan Bangka Belitung", - "36" => "Papua", - "37" => "Riau", - "38" => "Sulawesi Selatan", - "39" => "Irian Jaya Barat", - "40" => "Kepulauan Riau", - "41" => "Sulawesi Barat"), -"IE" => array( - "01" => "Carlow", - "02" => "Cavan", - "03" => "Clare", - "04" => "Cork", - "06" => "Donegal", - "07" => "Dublin", - "10" => "Galway", - "11" => "Kerry", - "12" => "Kildare", - "13" => "Kilkenny", - "14" => "Leitrim", - "15" => "Laois", - "16" => "Limerick", - "18" => "Longford", - "19" => "Louth", - "20" => "Mayo", - "21" => "Meath", - "22" => "Monaghan", - "23" => "Offaly", - "24" => "Roscommon", - "25" => "Sligo", - "26" => "Tipperary", - "27" => "Waterford", - "29" => "Westmeath", - "30" => "Wexford", - "31" => "Wicklow"), -"IL" => array( - "01" => "HaDarom", - "02" => "HaMerkaz", - "03" => "HaZafon", - "04" => "Hefa", - "05" => "Tel Aviv", - "06" => "Yerushalayim"), -"IN" => array( - "01" => "Andaman and Nicobar Islands", - "02" => "Andhra Pradesh", - "03" => "Assam", - "05" => "Chandigarh", - "06" => "Dadra and Nagar Haveli", - "07" => "Delhi", - "09" => "Gujarat", - "10" => "Haryana", - "11" => "Himachal Pradesh", - "12" => "Jammu and Kashmir", - "13" => "Kerala", - "14" => "Lakshadweep", - "16" => "Maharashtra", - "17" => "Manipur", - "18" => "Meghalaya", - "19" => "Karnataka", - "20" => "Nagaland", - "21" => "Orissa", - "22" => "Puducherry", - "23" => "Punjab", - "24" => "Rajasthan", - "25" => "Tamil Nadu", - "26" => "Tripura", - "28" => "West Bengal", - "29" => "Sikkim", - "30" => "Arunachal Pradesh", - "31" => "Mizoram", - "32" => "Daman and Diu", - "33" => "Goa", - "34" => "Bihar", - "35" => "Madhya Pradesh", - "36" => "Uttar Pradesh", - "37" => "Chhattisgarh", - "38" => "Jharkhand", - "39" => "Uttarakhand"), -"IQ" => array( - "01" => "Al Anbar", - "02" => "Al Basrah", - "03" => "Al Muthanna", - "04" => "Al Qadisiyah", - "05" => "As Sulaymaniyah", - "06" => "Babil", - "07" => "Baghdad", - "08" => "Dahuk", - "09" => "Dhi Qar", - "10" => "Diyala", - "11" => "Arbil", - "12" => "Karbala'", - "13" => "At Ta'mim", - "14" => "Maysan", - "15" => "Ninawa", - "16" => "Wasit", - "17" => "An Najaf", - "18" => "Salah ad Din"), -"IR" => array( - "01" => "Azarbayjan-e Bakhtari", - "02" => "Azarbayjan-e Khavari", - "03" => "Chahar Mahall va Bakhtiari", - "04" => "Sistan va Baluchestan", - "05" => "Kohkiluyeh va Buyer Ahmadi", - "07" => "Fars", - "08" => "Gilan", - "09" => "Hamadan", - "10" => "Ilam", - "11" => "Hormozgan", - "12" => "Kerman", - "13" => "Bakhtaran", - "15" => "Khuzestan", - "16" => "Kordestan", - "17" => "Mazandaran", - "18" => "Semnan Province", - "19" => "Markazi", - "21" => "Zanjan", - "22" => "Bushehr", - "23" => "Lorestan", - "24" => "Markazi", - "25" => "Semnan", - "26" => "Tehran", - "27" => "Zanjan", - "28" => "Esfahan", - "29" => "Kerman", - "30" => "Khorasan", - "31" => "Yazd", - "32" => "Ardabil", - "33" => "East Azarbaijan", - "34" => "Markazi", - "35" => "Mazandaran", - "36" => "Zanjan", - "37" => "Golestan", - "38" => "Qazvin", - "39" => "Qom", - "40" => "Yazd", - "41" => "Khorasan-e Janubi", - "42" => "Khorasan-e Razavi", - "43" => "Khorasan-e Shemali"), -"IS" => array( - "03" => "Arnessysla", - "05" => "Austur-Hunavatnssysla", - "06" => "Austur-Skaftafellssysla", - "07" => "Borgarfjardarsysla", - "09" => "Eyjafjardarsysla", - "10" => "Gullbringusysla", - "15" => "Kjosarsysla", - "17" => "Myrasysla", - "20" => "Nordur-Mulasysla", - "21" => "Nordur-Tingeyjarsysla", - "23" => "Rangarvallasysla", - "28" => "Skagafjardarsysla", - "29" => "Snafellsnes- og Hnappadalssysla", - "30" => "Strandasysla", - "31" => "Sudur-Mulasysla", - "32" => "Sudur-Tingeyjarsysla", - "34" => "Vestur-Bardastrandarsysla", - "35" => "Vestur-Hunavatnssysla", - "36" => "Vestur-Isafjardarsysla", - "37" => "Vestur-Skaftafellssysla", - "40" => "Norourland Eystra", - "41" => "Norourland Vestra", - "42" => "Suourland", - "43" => "Suournes", - "44" => "Vestfiroir", - "45" => "Vesturland"), -"IT" => array( - "01" => "Abruzzi", - "02" => "Basilicata", - "03" => "Calabria", - "04" => "Campania", - "05" => "Emilia-Romagna", - "06" => "Friuli-Venezia Giulia", - "07" => "Lazio", - "08" => "Liguria", - "09" => "Lombardia", - "10" => "Marche", - "11" => "Molise", - "12" => "Piemonte", - "13" => "Puglia", - "14" => "Sardegna", - "15" => "Sicilia", - "16" => "Toscana", - "17" => "Trentino-Alto Adige", - "18" => "Umbria", - "19" => "Valle d'Aosta", - "20" => "Veneto"), -"JM" => array( - "01" => "Clarendon", - "02" => "Hanover", - "04" => "Manchester", - "07" => "Portland", - "08" => "Saint Andrew", - "09" => "Saint Ann", - "10" => "Saint Catherine", - "11" => "Saint Elizabeth", - "12" => "Saint James", - "13" => "Saint Mary", - "14" => "Saint Thomas", - "15" => "Trelawny", - "16" => "Westmoreland", - "17" => "Kingston"), -"JO" => array( - "02" => "Al Balqa'", - "07" => "Ma", - "09" => "Al Karak", - "10" => "Al Mafraq", - "11" => "Amman Governorate", - "12" => "At Tafilah", - "13" => "Az Zarqa", - "14" => "Irbid", - "16" => "Amman"), -"JP" => array( - "01" => "Aichi", - "02" => "Akita", - "03" => "Aomori", - "04" => "Chiba", - "05" => "Ehime", - "06" => "Fukui", - "07" => "Fukuoka", - "08" => "Fukushima", - "09" => "Gifu", - "10" => "Gumma", - "11" => "Hiroshima", - "12" => "Hokkaido", - "13" => "Hyogo", - "14" => "Ibaraki", - "15" => "Ishikawa", - "16" => "Iwate", - "17" => "Kagawa", - "18" => "Kagoshima", - "19" => "Kanagawa", - "20" => "Kochi", - "21" => "Kumamoto", - "22" => "Kyoto", - "23" => "Mie", - "24" => "Miyagi", - "25" => "Miyazaki", - "26" => "Nagano", - "27" => "Nagasaki", - "28" => "Nara", - "29" => "Niigata", - "30" => "Oita", - "31" => "Okayama", - "32" => "Osaka", - "33" => "Saga", - "34" => "Saitama", - "35" => "Shiga", - "36" => "Shimane", - "37" => "Shizuoka", - "38" => "Tochigi", - "39" => "Tokushima", - "40" => "Tokyo", - "41" => "Tottori", - "42" => "Toyama", - "43" => "Wakayama", - "44" => "Yamagata", - "45" => "Yamaguchi", - "46" => "Yamanashi", - "47" => "Okinawa"), -"KE" => array( - "01" => "Central", - "02" => "Coast", - "03" => "Eastern", - "05" => "Nairobi Area", - "06" => "North-Eastern", - "07" => "Nyanza", - "08" => "Rift Valley", - "09" => "Western"), -"KG" => array( - "01" => "Bishkek", - "02" => "Chuy", - "03" => "Jalal-Abad", - "04" => "Naryn", - "05" => "Osh", - "06" => "Talas", - "07" => "Ysyk-Kol", - "08" => "Osh", - "09" => "Batken"), -"KH" => array( - "00" => "Banteay Meanchey", - "01" => "Batdambang", - "02" => "Kampong Cham", - "03" => "Kampong Chhnang", - "04" => "Kampong Speu", - "05" => "Kampong Thum", - "06" => "Kampot", - "07" => "Kandal", - "08" => "Koh Kong", - "09" => "Kracheh", - "10" => "Mondulkiri", - "11" => "Phnum Penh", - "12" => "Pursat", - "13" => "Preah Vihear", - "14" => "Prey Veng", - "15" => "Ratanakiri Kiri", - "16" => "Siem Reap", - "17" => "Stung Treng", - "18" => "Svay Rieng", - "19" => "Takeo", - "29" => "Batdambang", - "30" => "Pailin"), -"KI" => array( - "01" => "Gilbert Islands", - "02" => "Line Islands", - "03" => "Phoenix Islands"), -"KM" => array( - "01" => "Anjouan", - "02" => "Grande Comore", - "03" => "Moheli"), -"KN" => array( - "01" => "Christ Church Nichola Town", - "02" => "Saint Anne Sandy Point", - "03" => "Saint George Basseterre", - "04" => "Saint George Gingerland", - "05" => "Saint James Windward", - "06" => "Saint John Capisterre", - "07" => "Saint John Figtree", - "08" => "Saint Mary Cayon", - "09" => "Saint Paul Capisterre", - "10" => "Saint Paul Charlestown", - "11" => "Saint Peter Basseterre", - "12" => "Saint Thomas Lowland", - "13" => "Saint Thomas Middle Island", - "15" => "Trinity Palmetto Point"), -"KP" => array( - "01" => "Chagang-do", - "03" => "Hamgyong-namdo", - "06" => "Hwanghae-namdo", - "07" => "Hwanghae-bukto", - "08" => "Kaesong-si", - "09" => "Kangwon-do", - "11" => "P'yongan-bukto", - "12" => "P'yongyang-si", - "13" => "Yanggang-do", - "14" => "Namp'o-si", - "15" => "P'yongan-namdo", - "17" => "Hamgyong-bukto", - "18" => "Najin Sonbong-si"), -"KR" => array( - "01" => "Cheju-do", - "03" => "Cholla-bukto", - "05" => "Ch'ungch'ong-bukto", - "06" => "Kangwon-do", - "10" => "Pusan-jikhalsi", - "11" => "Seoul-t'ukpyolsi", - "12" => "Inch'on-jikhalsi", - "13" => "Kyonggi-do", - "14" => "Kyongsang-bukto", - "15" => "Taegu-jikhalsi", - "16" => "Cholla-namdo", - "17" => "Ch'ungch'ong-namdo", - "18" => "Kwangju-jikhalsi", - "19" => "Taejon-jikhalsi", - "20" => "Kyongsang-namdo", - "21" => "Ulsan-gwangyoksi"), -"KW" => array( - "01" => "Al Ahmadi", - "02" => "Al Kuwayt", - "05" => "Al Jahra", - "07" => "Al Farwaniyah", - "08" => "Hawalli", - "09" => "Mubarak al Kabir"), -"KY" => array( - "01" => "Creek", - "02" => "Eastern", - "03" => "Midland", - "04" => "South Town", - "05" => "Spot Bay", - "06" => "Stake Bay", - "07" => "West End", - "08" => "Western"), -"KZ" => array( - "01" => "Almaty", - "02" => "Almaty City", - "03" => "Aqmola", - "04" => "Aqtobe", - "05" => "Astana", - "06" => "Atyrau", - "07" => "West Kazakhstan", - "08" => "Bayqonyr", - "09" => "Mangghystau", - "10" => "South Kazakhstan", - "11" => "Pavlodar", - "12" => "Qaraghandy", - "13" => "Qostanay", - "14" => "Qyzylorda", - "15" => "East Kazakhstan", - "16" => "North Kazakhstan", - "17" => "Zhambyl"), -"LA" => array( - "01" => "Attapu", - "02" => "Champasak", - "03" => "Houaphan", - "04" => "Khammouan", - "05" => "Louang Namtha", - "07" => "Oudomxai", - "08" => "Phongsali", - "09" => "Saravan", - "10" => "Savannakhet", - "11" => "Vientiane", - "13" => "Xaignabouri", - "14" => "Xiangkhoang", - "17" => "Louangphrabang"), -"LB" => array( - "01" => "Beqaa", - "02" => "Al Janub", - "03" => "Liban-Nord", - "04" => "Beyrouth", - "05" => "Mont-Liban", - "06" => "Liban-Sud", - "07" => "Nabatiye", - "08" => "Beqaa", - "09" => "Liban-Nord", - "10" => "Aakk,r", - "11" => "Baalbek-Hermel"), -"LC" => array( - "01" => "Anse-la-Raye", - "02" => "Dauphin", - "03" => "Castries", - "04" => "Choiseul", - "05" => "Dennery", - "06" => "Gros-Islet", - "07" => "Laborie", - "08" => "Micoud", - "09" => "Soufriere", - "10" => "Vieux-Fort", - "11" => "Praslin"), -"LI" => array( - "01" => "Balzers", - "02" => "Eschen", - "03" => "Gamprin", - "04" => "Mauren", - "05" => "Planken", - "06" => "Ruggell", - "07" => "Schaan", - "08" => "Schellenberg", - "09" => "Triesen", - "10" => "Triesenberg", - "11" => "Vaduz", - "21" => "Gbarpolu", - "22" => "River Gee"), -"LK" => array( - "01" => "Amparai", - "02" => "Anuradhapura", - "03" => "Badulla", - "04" => "Batticaloa", - "06" => "Galle", - "07" => "Hambantota", - "09" => "Kalutara", - "10" => "Kandy", - "11" => "Kegalla", - "12" => "Kurunegala", - "14" => "Matale", - "15" => "Matara", - "16" => "Moneragala", - "17" => "Nuwara Eliya", - "18" => "Polonnaruwa", - "19" => "Puttalam", - "20" => "Ratnapura", - "21" => "Trincomalee", - "23" => "Colombo", - "24" => "Gampaha", - "25" => "Jaffna", - "26" => "Mannar", - "27" => "Mullaittivu", - "28" => "Vavuniya", - "29" => "Central", - "30" => "North Central", - "31" => "Northern", - "32" => "North Western", - "33" => "Sabaragamuwa", - "34" => "Southern", - "35" => "Uva", - "36" => "Western"), -"LR" => array( - "01" => "Bong", - "04" => "Grand Cape Mount", - "05" => "Lofa", - "06" => "Maryland", - "07" => "Monrovia", - "09" => "Nimba", - "10" => "Sino", - "11" => "Grand Bassa", - "12" => "Grand Cape Mount", - "13" => "Maryland", - "14" => "Montserrado", - "17" => "Margibi", - "18" => "River Cess", - "19" => "Grand Gedeh", - "20" => "Lofa", - "21" => "Gbarpolu", - "22" => "River Gee"), -"LS" => array( - "10" => "Berea", - "11" => "Butha-Buthe", - "12" => "Leribe", - "13" => "Mafeteng", - "14" => "Maseru", - "15" => "Mohales Hoek", - "16" => "Mokhotlong", - "17" => "Qachas Nek", - "18" => "Quthing", - "19" => "Thaba-Tseka"), -"LT" => array( - "56" => "Alytaus Apskritis", - "57" => "Kauno Apskritis", - "58" => "Klaipedos Apskritis", - "59" => "Marijampoles Apskritis", - "60" => "Panevezio Apskritis", - "61" => "Siauliu Apskritis", - "62" => "Taurages Apskritis", - "63" => "Telsiu Apskritis", - "64" => "Utenos Apskritis", - "65" => "Vilniaus Apskritis"), -"LU" => array( - "01" => "Diekirch", - "02" => "Grevenmacher", - "03" => "Luxembourg"), -"LV" => array( - "01" => "Aizkraukles", - "02" => "Aluksnes", - "03" => "Balvu", - "04" => "Bauskas", - "05" => "Cesu", - "06" => "Daugavpils", - "07" => "Daugavpils", - "08" => "Dobeles", - "09" => "Gulbenes", - "10" => "Jekabpils", - "11" => "Jelgava", - "12" => "Jelgavas", - "13" => "Jurmala", - "14" => "Kraslavas", - "15" => "Kuldigas", - "16" => "Liepaja", - "17" => "Liepajas", - "18" => "Limbazu", - "19" => "Ludzas", - "20" => "Madonas", - "21" => "Ogres", - "22" => "Preilu", - "23" => "Rezekne", - "24" => "Rezeknes", - "25" => "Riga", - "26" => "Rigas", - "27" => "Saldus", - "28" => "Talsu", - "29" => "Tukuma", - "30" => "Valkas", - "31" => "Valmieras", - "32" => "Ventspils", - "33" => "Ventspils"), -"LY" => array( - "03" => "Al Aziziyah", - "05" => "Al Jufrah", - "08" => "Al Kufrah", - "13" => "Ash Shati'", - "30" => "Murzuq", - "34" => "Sabha", - "41" => "Tarhunah", - "42" => "Tubruq", - "45" => "Zlitan", - "47" => "Ajdabiya", - "48" => "Al Fatih", - "49" => "Al Jabal al Akhdar", - "50" => "Al Khums", - "51" => "An Nuqat al Khams", - "52" => "Awbari", - "53" => "Az Zawiyah", - "54" => "Banghazi", - "55" => "Darnah", - "56" => "Ghadamis", - "57" => "Gharyan", - "58" => "Misratah", - "59" => "Sawfajjin", - "60" => "Surt", - "61" => "Tarabulus", - "62" => "Yafran"), -"MA" => array( - "01" => "Agadir", - "02" => "Al Hoceima", - "03" => "Azilal", - "04" => "Ben Slimane", - "05" => "Beni Mellal", - "06" => "Boulemane", - "07" => "Casablanca", - "08" => "Chaouen", - "09" => "El Jadida", - "10" => "El Kelaa des Srarhna", - "11" => "Er Rachidia", - "12" => "Essaouira", - "13" => "Fes", - "14" => "Figuig", - "15" => "Kenitra", - "16" => "Khemisset", - "17" => "Khenifra", - "18" => "Khouribga", - "19" => "Marrakech", - "20" => "Meknes", - "21" => "Nador", - "22" => "Ouarzazate", - "23" => "Oujda", - "24" => "Rabat-Sale", - "25" => "Safi", - "26" => "Settat", - "27" => "Tanger", - "29" => "Tata", - "30" => "Taza", - "32" => "Tiznit", - "33" => "Guelmim", - "34" => "Ifrane", - "35" => "Laayoune", - "36" => "Tan-Tan", - "37" => "Taounate", - "38" => "Sidi Kacem", - "39" => "Taroudannt", - "40" => "Tetouan", - "41" => "Larache", - "45" => "Grand Casablanca", - "46" => "Fes-Boulemane", - "47" => "Marrakech-Tensift-Al Haouz", - "48" => "Meknes-Tafilalet", - "49" => "Rabat-Sale-Zemmour-Zaer", - "50" => "Chaouia-Ouardigha", - "51" => "Doukkala-Abda", - "52" => "Gharb-Chrarda-Beni Hssen", - "53" => "Guelmim-Es Smara", - "54" => "Oriental", - "55" => "Souss-Massa-Dr,a", - "56" => "Tadla-Azilal", - "57" => "Tanger-Tetouan", - "58" => "Taza-Al Hoceima-Taounate", - "59" => "La,youne-Boujdour-Sakia El Hamra"), -"MC" => array( - "01" => "La Condamine", - "02" => "Monaco", - "03" => "Monte-Carlo"), -"MD" => array( - "46" => "Balti", - "47" => "Cahul", - "48" => "Chisinau", - "49" => "Stinga Nistrului", - "50" => "Edinet", - "51" => "Gagauzia", - "52" => "Lapusna", - "53" => "Orhei", - "54" => "Soroca", - "55" => "Tighina", - "56" => "Ungheni", - "58" => "Stinga Nistrului", - "59" => "Anenii Noi", - "60" => "Balti", - "61" => "Basarabeasca", - "62" => "Bender", - "63" => "Briceni", - "64" => "Cahul", - "65" => "Cantemir", - "66" => "Calarasi", - "67" => "Causeni", - "68" => "Cimislia", - "69" => "Criuleni", - "70" => "Donduseni", - "71" => "Drochia", - "72" => "Dubasari", - "73" => "Edinet", - "74" => "Falesti", - "75" => "Floresti", - "76" => "Glodeni", - "77" => "Hincesti", - "78" => "Ialoveni", - "79" => "Leova", - "80" => "Nisporeni", - "81" => "Ocnita", - "83" => "Rezina", - "84" => "Riscani", - "85" => "Singerei", - "86" => "Soldanesti", - "87" => "Soroca", - "88" => "Stefan-Voda", - "89" => "Straseni", - "90" => "Taraclia", - "91" => "Telenesti", - "92" => "Ungheni"), -"MG" => array( - "01" => "Antsiranana", - "02" => "Fianarantsoa", - "03" => "Mahajanga", - "04" => "Toamasina", - "05" => "Antananarivo", - "06" => "Toliara"), -"MK" => array( - "01" => "Aracinovo", - "02" => "Bac", - "03" => "Belcista", - "04" => "Berovo", - "05" => "Bistrica", - "06" => "Bitola", - "07" => "Blatec", - "08" => "Bogdanci", - "09" => "Bogomila", - "10" => "Bogovinje", - "11" => "Bosilovo", - "12" => "Brvenica", - "13" => "Cair", - "14" => "Capari", - "15" => "Caska", - "16" => "Cegrane", - "17" => "Centar", - "18" => "Centar Zupa", - "19" => "Cesinovo", - "20" => "Cucer-Sandevo", - "21" => "Debar", - "22" => "Delcevo", - "23" => "Delogozdi", - "24" => "Demir Hisar", - "25" => "Demir Kapija", - "26" => "Dobrusevo", - "27" => "Dolna Banjica", - "28" => "Dolneni", - "29" => "Dorce Petrov", - "30" => "Drugovo", - "31" => "Dzepciste", - "32" => "Gazi Baba", - "33" => "Gevgelija", - "34" => "Gostivar", - "35" => "Gradsko", - "36" => "Ilinden", - "37" => "Izvor", - "38" => "Jegunovce", - "39" => "Kamenjane", - "40" => "Karbinci", - "41" => "Karpos", - "42" => "Kavadarci", - "43" => "Kicevo", - "44" => "Kisela Voda", - "45" => "Klecevce", - "46" => "Kocani", - "47" => "Konce", - "48" => "Kondovo", - "49" => "Konopiste", - "50" => "Kosel", - "51" => "Kratovo", - "52" => "Kriva Palanka", - "53" => "Krivogastani", - "54" => "Krusevo", - "55" => "Kuklis", - "56" => "Kukurecani", - "57" => "Kumanovo", - "58" => "Labunista", - "59" => "Lipkovo", - "60" => "Lozovo", - "61" => "Lukovo", - "62" => "Makedonska Kamenica", - "63" => "Makedonski Brod", - "64" => "Mavrovi Anovi", - "65" => "Meseista", - "66" => "Miravci", - "67" => "Mogila", - "68" => "Murtino", - "69" => "Negotino", - "70" => "Negotino-Polosko", - "71" => "Novaci", - "72" => "Novo Selo", - "73" => "Oblesevo", - "74" => "Ohrid", - "75" => "Orasac", - "76" => "Orizari", - "77" => "Oslomej", - "78" => "Pehcevo", - "79" => "Petrovec", - "80" => "Plasnica", - "81" => "Podares", - "82" => "Prilep", - "83" => "Probistip", - "84" => "Radovis", - "85" => "Rankovce", - "86" => "Resen", - "87" => "Rosoman", - "88" => "Rostusa", - "89" => "Samokov", - "90" => "Saraj", - "91" => "Sipkovica", - "92" => "Sopiste", - "93" => "Sopotnica", - "94" => "Srbinovo", - "95" => "Staravina", - "96" => "Star Dojran", - "97" => "Staro Nagoricane", - "98" => "Stip", - "99" => "Struga", - "A1" => "Strumica", - "A2" => "Studenicani", - "A3" => "Suto Orizari", - "A4" => "Sveti Nikole", - "A5" => "Tearce", - "A6" => "Tetovo", - "A7" => "Topolcani", - "A8" => "Valandovo", - "A9" => "Vasilevo", - "B1" => "Veles", - "B2" => "Velesta", - "B3" => "Vevcani", - "B4" => "Vinica", - "B5" => "Vitoliste", - "B6" => "Vranestica", - "B7" => "Vrapciste", - "B8" => "Vratnica", - "B9" => "Vrutok", - "C1" => "Zajas", - "C2" => "Zelenikovo", - "C3" => "Zelino", - "C4" => "Zitose", - "C5" => "Zletovo", - "C6" => "Zrnovci"), -"ML" => array( - "01" => "Bamako", - "03" => "Kayes", - "04" => "Mopti", - "05" => "Segou", - "06" => "Sikasso", - "07" => "Koulikoro", - "08" => "Tombouctou", - "09" => "Gao", - "10" => "Kidal"), -"MM" => array( - "01" => "Rakhine State", - "02" => "Chin State", - "03" => "Irrawaddy", - "04" => "Kachin State", - "05" => "Karan State", - "06" => "Kayah State", - "07" => "Magwe", - "08" => "Mandalay", - "09" => "Pegu", - "10" => "Sagaing", - "11" => "Shan State", - "12" => "Tenasserim", - "13" => "Mon State", - "14" => "Rangoon", - "17" => "Yangon"), -"MN" => array( - "01" => "Arhangay", - "02" => "Bayanhongor", - "03" => "Bayan-Olgiy", - "05" => "Darhan", - "06" => "Dornod", - "07" => "Dornogovi", - "08" => "Dundgovi", - "09" => "Dzavhan", - "10" => "Govi-Altay", - "11" => "Hentiy", - "12" => "Hovd", - "13" => "Hovsgol", - "14" => "Omnogovi", - "15" => "Ovorhangay", - "16" => "Selenge", - "17" => "Suhbaatar", - "18" => "Tov", - "19" => "Uvs", - "20" => "Ulaanbaatar", - "21" => "Bulgan", - "22" => "Erdenet", - "23" => "Darhan-Uul", - "24" => "Govisumber", - "25" => "Orhon"), -"MO" => array( - "01" => "Ilhas", - "02" => "Macau"), -"MR" => array( - "01" => "Hodh Ech Chargui", - "02" => "Hodh El Gharbi", - "03" => "Assaba", - "04" => "Gorgol", - "05" => "Brakna", - "06" => "Trarza", - "07" => "Adrar", - "08" => "Dakhlet Nouadhibou", - "09" => "Tagant", - "10" => "Guidimaka", - "11" => "Tiris Zemmour", - "12" => "Inchiri"), -"MS" => array( - "01" => "Saint Anthony", - "02" => "Saint Georges", - "03" => "Saint Peter"), -"MU" => array( - "12" => "Black River", - "13" => "Flacq", - "14" => "Grand Port", - "15" => "Moka", - "16" => "Pamplemousses", - "17" => "Plaines Wilhems", - "18" => "Port Louis", - "19" => "Riviere du Rempart", - "20" => "Savanne", - "21" => "Agalega Islands", - "22" => "Cargados Carajos", - "23" => "Rodrigues"), -"MV" => array( - "01" => "Seenu", - "02" => "Aliff", - "03" => "Laviyani", - "04" => "Waavu", - "05" => "Laamu", - "07" => "Haa Aliff", - "08" => "Thaa", - "12" => "Meemu", - "13" => "Raa", - "14" => "Faafu", - "17" => "Daalu", - "20" => "Baa", - "23" => "Haa Daalu", - "24" => "Shaviyani", - "25" => "Noonu", - "26" => "Kaafu", - "27" => "Gaafu Aliff", - "28" => "Gaafu Daalu", - "29" => "Naviyani", - "40" => "Male"), -"MW" => array( - "02" => "Chikwawa", - "03" => "Chiradzulu", - "04" => "Chitipa", - "05" => "Thyolo", - "06" => "Dedza", - "07" => "Dowa", - "08" => "Karonga", - "09" => "Kasungu", - "11" => "Lilongwe", - "12" => "Mangochi", - "13" => "Mchinji", - "15" => "Mzimba", - "16" => "Ntcheu", - "17" => "Nkhata Bay", - "18" => "Nkhotakota", - "19" => "Nsanje", - "20" => "Ntchisi", - "21" => "Rumphi", - "22" => "Salima", - "23" => "Zomba", - "24" => "Blantyre", - "25" => "Mwanza", - "26" => "Balaka", - "27" => "Likoma", - "28" => "Machinga", - "29" => "Mulanje", - "30" => "Phalombe"), -"MX" => array( - "01" => "Aguascalientes", - "02" => "Baja California", - "03" => "Baja California Sur", - "04" => "Campeche", - "05" => "Chiapas", - "06" => "Chihuahua", - "07" => "Coahuila de Zaragoza", - "08" => "Colima", - "09" => "Distrito Federal", - "10" => "Durango", - "11" => "Guanajuato", - "12" => "Guerrero", - "13" => "Hidalgo", - "14" => "Jalisco", - "15" => "Mexico", - "16" => "Michoacan de Ocampo", - "17" => "Morelos", - "18" => "Nayarit", - "19" => "Nuevo Leon", - "20" => "Oaxaca", - "21" => "Puebla", - "22" => "Queretaro de Arteaga", - "23" => "Quintana Roo", - "24" => "San Luis Potosi", - "25" => "Sinaloa", - "26" => "Sonora", - "27" => "Tabasco", - "28" => "Tamaulipas", - "29" => "Tlaxcala", - "30" => "Veracruz-Llave", - "31" => "Yucatan", - "32" => "Zacatecas"), -"MY" => array( - "01" => "Johor", - "02" => "Kedah", - "03" => "Kelantan", - "04" => "Melaka", - "05" => "Negeri Sembilan", - "06" => "Pahang", - "07" => "Perak", - "08" => "Perlis", - "09" => "Pulau Pinang", - "11" => "Sarawak", - "12" => "Selangor", - "13" => "Terengganu", - "14" => "Kuala Lumpur", - "15" => "Labuan", - "16" => "Sabah", - "17" => "Putrajaya"), -"MZ" => array( - "01" => "Cabo Delgado", - "02" => "Gaza", - "03" => "Inhambane", - "04" => "Maputo", - "05" => "Sofala", - "06" => "Nampula", - "07" => "Niassa", - "08" => "Tete", - "09" => "Zambezia", - "10" => "Manica", - "11" => "Maputo"), -"NA" => array( - "01" => "Bethanien", - "02" => "Caprivi Oos", - "03" => "Boesmanland", - "04" => "Gobabis", - "05" => "Grootfontein", - "06" => "Kaokoland", - "07" => "Karibib", - "08" => "Keetmanshoop", - "09" => "Luderitz", - "10" => "Maltahohe", - "11" => "Okahandja", - "12" => "Omaruru", - "13" => "Otjiwarongo", - "14" => "Outjo", - "15" => "Owambo", - "16" => "Rehoboth", - "17" => "Swakopmund", - "18" => "Tsumeb", - "20" => "Karasburg", - "21" => "Windhoek", - "22" => "Damaraland", - "23" => "Hereroland Oos", - "24" => "Hereroland Wes", - "25" => "Kavango", - "26" => "Mariental", - "27" => "Namaland", - "28" => "Caprivi", - "29" => "Erongo", - "30" => "Hardap", - "31" => "Karas", - "32" => "Kunene", - "33" => "Ohangwena", - "34" => "Okavango", - "35" => "Omaheke", - "36" => "Omusati", - "37" => "Oshana", - "38" => "Oshikoto", - "39" => "Otjozondjupa"), -"NE" => array( - "01" => "Agadez", - "02" => "Diffa", - "03" => "Dosso", - "04" => "Maradi", - "05" => "Niamey", - "06" => "Tahoua", - "07" => "Zinder", - "08" => "Niamey"), -"NG" => array( - "05" => "Lagos", - "10" => "Rivers", - "11" => "Federal Capital Territory", - "12" => "Gongola", - "16" => "Ogun", - "17" => "Ondo", - "18" => "Oyo", - "21" => "Akwa Ibom", - "22" => "Cross River", - "23" => "Kaduna", - "24" => "Katsina", - "25" => "Anambra", - "26" => "Benue", - "27" => "Borno", - "28" => "Imo", - "29" => "Kano", - "30" => "Kwara", - "31" => "Niger", - "32" => "Oyo", - "35" => "Adamawa", - "36" => "Delta", - "37" => "Edo", - "39" => "Jigawa", - "40" => "Kebbi", - "41" => "Kogi", - "42" => "Osun", - "43" => "Taraba", - "44" => "Yobe", - "45" => "Abia", - "46" => "Bauchi", - "47" => "Enugu", - "48" => "Ondo", - "49" => "Plateau", - "50" => "Rivers", - "51" => "Sokoto", - "52" => "Bayelsa", - "53" => "Ebonyi", - "54" => "Ekiti", - "55" => "Gombe", - "56" => "Nassarawa", - "57" => "Zamfara"), -"NI" => array( - "01" => "Boaco", - "02" => "Carazo", - "03" => "Chinandega", - "04" => "Chontales", - "05" => "Esteli", - "06" => "Granada", - "07" => "Jinotega", - "08" => "Leon", - "09" => "Madriz", - "10" => "Managua", - "11" => "Masaya", - "12" => "Matagalpa", - "13" => "Nueva Segovia", - "14" => "Rio San Juan", - "15" => "Rivas", - "16" => "Zelaya", - "17" => "Autonoma Atlantico Norte", - "18" => "Region Autonoma Atlantico Sur"), -"NL" => array( - "01" => "Drenthe", - "02" => "Friesland", - "03" => "Gelderland", - "04" => "Groningen", - "05" => "Limburg", - "06" => "Noord-Brabant", - "07" => "Noord-Holland", - "08" => "Overijssel", - "09" => "Utrecht", - "10" => "Zeeland", - "11" => "Zuid-Holland", - "12" => "Dronten", - "13" => "Zuidelijke IJsselmeerpolders", - "14" => "Lelystad", - "15" => "Overijssel", - "16" => "Flevoland"), -"NO" => array( - "01" => "Akershus", - "02" => "Aust-Agder", - "04" => "Buskerud", - "05" => "Finnmark", - "06" => "Hedmark", - "07" => "Hordaland", - "08" => "More og Romsdal", - "09" => "Nordland", - "10" => "Nord-Trondelag", - "11" => "Oppland", - "12" => "Oslo", - "13" => "Ostfold", - "14" => "Rogaland", - "15" => "Sogn og Fjordane", - "16" => "Sor-Trondelag", - "17" => "Telemark", - "18" => "Troms", - "19" => "Vest-Agder", - "20" => "Vestfold"), -"NP" => array( - "01" => "Bagmati", - "02" => "Bheri", - "03" => "Dhawalagiri", - "04" => "Gandaki", - "05" => "Janakpur", - "06" => "Karnali", - "07" => "Kosi", - "08" => "Lumbini", - "09" => "Mahakali", - "10" => "Mechi", - "11" => "Narayani", - "12" => "Rapti", - "13" => "Sagarmatha", - "14" => "Seti"), -"NR" => array( - "01" => "Aiwo", - "02" => "Anabar", - "03" => "Anetan", - "04" => "Anibare", - "05" => "Baiti", - "06" => "Boe", - "07" => "Buada", - "08" => "Denigomodu", - "09" => "Ewa", - "10" => "Ijuw", - "11" => "Meneng", - "12" => "Nibok", - "13" => "Uaboe", - "14" => "Yaren"), -"NZ" => array( - "10" => "Chatham Islands", - "85" => "Waikato", - "E7" => "Auckland", - "E8" => "Bay of Plenty", - "E9" => "Canterbury", - "F1" => "Gisborne", - "F2" => "Hawke's Bay", - "F3" => "Manawatu-Wanganui", - "F4" => "Marlborough", - "F5" => "Nelson", - "F6" => "Northland", - "F7" => "Otago", - "F8" => "Southland", - "F9" => "Taranaki", - "G1" => "Waikato", - "G2" => "Wellington", - "G3" => "West Coast"), -"OM" => array( - "01" => "Ad Dakhiliyah", - "02" => "Al Batinah", - "03" => "Al Wusta", - "04" => "Ash Sharqiyah", - "05" => "Az Zahirah", - "06" => "Masqat", - "07" => "Musandam", - "08" => "Zufar"), -"PA" => array( - "01" => "Bocas del Toro", - "02" => "Chiriqui", - "03" => "Cocle", - "04" => "Colon", - "05" => "Darien", - "06" => "Herrera", - "07" => "Los Santos", - "08" => "Panama", - "09" => "San Blas", - "10" => "Veraguas"), -"PE" => array( - "01" => "Amazonas", - "02" => "Ancash", - "03" => "Apurimac", - "04" => "Arequipa", - "05" => "Ayacucho", - "06" => "Cajamarca", - "07" => "Callao", - "08" => "Cusco", - "09" => "Huancavelica", - "10" => "Huanuco", - "11" => "Ica", - "12" => "Junin", - "13" => "La Libertad", - "14" => "Lambayeque", - "15" => "Lima", - "16" => "Loreto", - "17" => "Madre de Dios", - "18" => "Moquegua", - "19" => "Pasco", - "20" => "Piura", - "21" => "Puno", - "22" => "San Martin", - "23" => "Tacna", - "24" => "Tumbes", - "25" => "Ucayali"), -"PG" => array( - "01" => "Central", - "02" => "Gulf", - "03" => "Milne Bay", - "04" => "Northern", - "05" => "Southern Highlands", - "06" => "Western", - "07" => "North Solomons", - "08" => "Chimbu", - "09" => "Eastern Highlands", - "10" => "East New Britain", - "11" => "East Sepik", - "12" => "Madang", - "13" => "Manus", - "14" => "Morobe", - "15" => "New Ireland", - "16" => "Western Highlands", - "17" => "West New Britain", - "18" => "Sandaun", - "19" => "Enga", - "20" => "National Capital"), -"PH" => array( - "01" => "Abra", - "02" => "Agusan del Norte", - "03" => "Agusan del Sur", - "04" => "Aklan", - "05" => "Albay", - "06" => "Antique", - "07" => "Bataan", - "08" => "Batanes", - "09" => "Batangas", - "10" => "Benguet", - "11" => "Bohol", - "12" => "Bukidnon", - "13" => "Bulacan", - "14" => "Cagayan", - "15" => "Camarines Norte", - "16" => "Camarines Sur", - "17" => "Camiguin", - "18" => "Capiz", - "19" => "Catanduanes", - "20" => "Cavite", - "21" => "Cebu", - "22" => "Basilan", - "23" => "Eastern Samar", - "24" => "Davao", - "25" => "Davao del Sur", - "26" => "Davao Oriental", - "27" => "Ifugao", - "28" => "Ilocos Norte", - "29" => "Ilocos Sur", - "30" => "Iloilo", - "31" => "Isabela", - "32" => "Kalinga-Apayao", - "33" => "Laguna", - "34" => "Lanao del Norte", - "35" => "Lanao del Sur", - "36" => "La Union", - "37" => "Leyte", - "38" => "Marinduque", - "39" => "Masbate", - "40" => "Mindoro Occidental", - "41" => "Mindoro Oriental", - "42" => "Misamis Occidental", - "43" => "Misamis Oriental", - "44" => "Mountain", - "45" => "Negros Occidental", - "46" => "Negros Oriental", - "47" => "Nueva Ecija", - "48" => "Nueva Vizcaya", - "49" => "Palawan", - "50" => "Pampanga", - "51" => "Pangasinan", - "53" => "Rizal", - "54" => "Romblon", - "55" => "Samar", - "56" => "Maguindanao", - "57" => "North Cotabato", - "58" => "Sorsogon", - "59" => "Southern Leyte", - "60" => "Sulu", - "61" => "Surigao del Norte", - "62" => "Surigao del Sur", - "63" => "Tarlac", - "64" => "Zambales", - "65" => "Zamboanga del Norte", - "66" => "Zamboanga del Sur", - "67" => "Northern Samar", - "68" => "Quirino", - "69" => "Siquijor", - "70" => "South Cotabato", - "71" => "Sultan Kudarat", - "72" => "Tawitawi", - "A1" => "Angeles", - "A2" => "Bacolod", - "A3" => "Bago", - "A4" => "Baguio", - "A5" => "Bais", - "A6" => "Basilan City", - "A7" => "Batangas City", - "A8" => "Butuan", - "A9" => "Cabanatuan", - "B1" => "Cadiz", - "B2" => "Cagayan de Oro", - "B3" => "Calbayog", - "B4" => "Caloocan", - "B5" => "Canlaon", - "B6" => "Cavite City", - "B7" => "Cebu City", - "B8" => "Cotabato", - "B9" => "Dagupan", - "C1" => "Danao", - "C2" => "Dapitan", - "C3" => "Davao City", - "C4" => "Dipolog", - "C5" => "Dumaguete", - "C6" => "General Santos", - "C7" => "Gingoog", - "C8" => "Iligan", - "C9" => "Iloilo City", - "D1" => "Iriga", - "D2" => "La Carlota", - "D3" => "Laoag", - "D4" => "Lapu-Lapu", - "D5" => "Legaspi", - "D6" => "Lipa", - "D7" => "Lucena", - "D8" => "Mandaue", - "D9" => "Manila", - "E1" => "Marawi", - "E2" => "Naga", - "E3" => "Olongapo", - "E4" => "Ormoc", - "E5" => "Oroquieta", - "E6" => "Ozamis", - "E7" => "Pagadian", - "E8" => "Palayan", - "E9" => "Pasay", - "F1" => "Puerto Princesa", - "F2" => "Quezon City", - "F3" => "Roxas", - "F4" => "San Carlos", - "F5" => "San Carlos", - "F6" => "San Jose", - "F7" => "San Pablo", - "F8" => "Silay", - "F9" => "Surigao", - "G1" => "Tacloban", - "G2" => "Tagaytay", - "G3" => "Tagbilaran", - "G4" => "Tangub", - "G5" => "Toledo", - "G6" => "Trece Martires", - "G7" => "Zamboanga", - "G8" => "Aurora", - "H2" => "Quezon", - "H3" => "Negros Occidental"), -"PK" => array( - "01" => "Federally Administered Tribal Areas", - "02" => "Balochistan", - "03" => "North-West Frontier", - "04" => "Punjab", - "05" => "Sindh", - "06" => "Azad Kashmir", - "07" => "Northern Areas", - "08" => "Islamabad"), -"PL" => array( - "23" => "Biala Podlaska", - "24" => "Bialystok", - "25" => "Bielsko", - "26" => "Bydgoszcz", - "27" => "Chelm", - "28" => "Ciechanow", - "29" => "Czestochowa", - "30" => "Elblag", - "31" => "Gdansk", - "32" => "Gorzow", - "33" => "Jelenia Gora", - "34" => "Kalisz", - "35" => "Katowice", - "36" => "Kielce", - "37" => "Konin", - "38" => "Koszalin", - "39" => "Krakow", - "40" => "Krosno", - "41" => "Legnica", - "42" => "Leszno", - "43" => "Lodz", - "44" => "Lomza", - "45" => "Lublin", - "46" => "Nowy Sacz", - "47" => "Olsztyn", - "48" => "Opole", - "49" => "Ostroleka", - "50" => "Pila", - "51" => "Piotrkow", - "52" => "Plock", - "53" => "Poznan", - "54" => "Przemysl", - "55" => "Radom", - "56" => "Rzeszow", - "57" => "Siedlce", - "58" => "Sieradz", - "59" => "Skierniewice", - "60" => "Slupsk", - "61" => "Suwalki", - "62" => "Szczecin", - "63" => "Tarnobrzeg", - "64" => "Tarnow", - "65" => "Torun", - "66" => "Walbrzych", - "67" => "Warszawa", - "68" => "Wloclawek", - "69" => "Wroclaw", - "70" => "Zamosc", - "71" => "Zielona Gora", - "72" => "Dolnoslaskie", - "73" => "Kujawsko-Pomorskie", - "74" => "Lodzkie", - "75" => "Lubelskie", - "76" => "Lubuskie", - "77" => "Malopolskie", - "78" => "Mazowieckie", - "79" => "Opolskie", - "80" => "Podkarpackie", - "81" => "Podlaskie", - "82" => "Pomorskie", - "83" => "Slaskie", - "84" => "Swietokrzyskie", - "85" => "Warminsko-Mazurskie", - "86" => "Wielkopolskie", - "87" => "Zachodniopomorskie"), -"PS" => array( - "GZ" => "Gaza", - "WE" => "West Bank"), -"PT" => array( - "02" => "Aveiro", - "03" => "Beja", - "04" => "Braga", - "05" => "Braganca", - "06" => "Castelo Branco", - "07" => "Coimbra", - "08" => "Evora", - "09" => "Faro", - "10" => "Madeira", - "11" => "Guarda", - "13" => "Leiria", - "14" => "Lisboa", - "16" => "Portalegre", - "17" => "Porto", - "18" => "Santarem", - "19" => "Setubal", - "20" => "Viana do Castelo", - "21" => "Vila Real", - "22" => "Viseu", - "23" => "Azores"), -"PY" => array( - "01" => "Alto Parana", - "02" => "Amambay", - "03" => "Boqueron", - "04" => "Caaguazu", - "05" => "Caazapa", - "06" => "Central", - "07" => "Concepcion", - "08" => "Cordillera", - "10" => "Guaira", - "11" => "Itapua", - "12" => "Misiones", - "13" => "Neembucu", - "15" => "Paraguari", - "16" => "Presidente Hayes", - "17" => "San Pedro", - "19" => "Canindeyu", - "20" => "Chaco", - "21" => "Nueva Asuncion", - "23" => "Alto Paraguay"), -"QA" => array( - "01" => "Ad Dawhah", - "02" => "Al Ghuwariyah", - "03" => "Al Jumaliyah", - "04" => "Al Khawr", - "05" => "Al Wakrah Municipality", - "06" => "Ar Rayyan", - "08" => "Madinat ach Shamal", - "09" => "Umm Salal", - "10" => "Al Wakrah", - "11" => "Jariyan al Batnah", - "12" => "Umm Sa'id"), -"RO" => array( - "01" => "Alba", - "02" => "Arad", - "03" => "Arges", - "04" => "Bacau", - "05" => "Bihor", - "06" => "Bistrita-Nasaud", - "07" => "Botosani", - "08" => "Braila", - "09" => "Brasov", - "10" => "Bucuresti", - "11" => "Buzau", - "12" => "Caras-Severin", - "13" => "Cluj", - "14" => "Constanta", - "15" => "Covasna", - "16" => "Dambovita", - "17" => "Dolj", - "18" => "Galati", - "19" => "Gorj", - "20" => "Harghita", - "21" => "Hunedoara", - "22" => "Ialomita", - "23" => "Iasi", - "25" => "Maramures", - "26" => "Mehedinti", - "27" => "Mures", - "28" => "Neamt", - "29" => "Olt", - "30" => "Prahova", - "31" => "Salaj", - "32" => "Satu Mare", - "33" => "Sibiu", - "34" => "Suceava", - "35" => "Teleorman", - "36" => "Timis", - "37" => "Tulcea", - "38" => "Vaslui", - "39" => "Valcea", - "40" => "Vrancea", - "41" => "Calarasi", - "42" => "Giurgiu", - "43" => "Ilfov"), -"RS" => array( - "01" => "Kosovo", - "02" => "Vojvodina"), -"RU" => array( - "01" => "Adygeya, Republic of", - "02" => "Aginsky Buryatsky AO", - "03" => "Gorno-Altay", - "04" => "Altaisky krai", - "05" => "Amur", - "06" => "Arkhangel'sk", - "07" => "Astrakhan'", - "08" => "Bashkortostan", - "09" => "Belgorod", - "10" => "Bryansk", - "11" => "Buryat", - "12" => "Chechnya", - "13" => "Chelyabinsk", - "14" => "Chita", - "15" => "Chukot", - "16" => "Chuvashia", - "17" => "Dagestan", - "18" => "Evenk", - "19" => "Ingush", - "20" => "Irkutsk", - "21" => "Ivanovo", - "22" => "Kabardin-Balkar", - "23" => "Kaliningrad", - "24" => "Kalmyk", - "25" => "Kaluga", - "26" => "Kamchatka", - "27" => "Karachay-Cherkess", - "28" => "Karelia", - "29" => "Kemerovo", - "30" => "Khabarovsk", - "31" => "Khakass", - "32" => "Khanty-Mansiy", - "33" => "Kirov", - "34" => "Komi", - "35" => "Komi-Permyak", - "36" => "Koryak", - "37" => "Kostroma", - "38" => "Krasnodar", - "39" => "Krasnoyarsk", - "40" => "Kurgan", - "41" => "Kursk", - "42" => "Leningrad", - "43" => "Lipetsk", - "44" => "Magadan", - "45" => "Mariy-El", - "46" => "Mordovia", - "47" => "Moskva", - "48" => "Moscow City", - "49" => "Murmansk", - "50" => "Nenets", - "51" => "Nizhegorod", - "52" => "Novgorod", - "53" => "Novosibirsk", - "54" => "Omsk", - "55" => "Orenburg", - "56" => "Orel", - "57" => "Penza", - "58" => "Perm'", - "59" => "Primor'ye", - "60" => "Pskov", - "61" => "Rostov", - "62" => "Ryazan'", - "63" => "Sakha", - "64" => "Sakhalin", - "65" => "Samara", - "66" => "Saint Petersburg City", - "67" => "Saratov", - "68" => "North Ossetia", - "69" => "Smolensk", - "70" => "Stavropol'", - "71" => "Sverdlovsk", - "72" => "Tambovskaya oblast", - "73" => "Tatarstan", - "74" => "Taymyr", - "75" => "Tomsk", - "76" => "Tula", - "77" => "Tver'", - "78" => "Tyumen'", - "79" => "Tuva", - "80" => "Udmurt", - "81" => "Ul'yanovsk", - "82" => "Ust-Orda Buryat", - "83" => "Vladimir", - "84" => "Volgograd", - "85" => "Vologda", - "86" => "Voronezh", - "87" => "Yamal-Nenets", - "88" => "Yaroslavl'", - "89" => "Yevrey", - "90" => "Permskiy Kray", - "91" => "Krasnoyarskiy Kray", - "CI" => "Chechnya Republic"), -"RW" => array( - "01" => "Butare", - "06" => "Gitarama", - "07" => "Kibungo", - "09" => "Kigali", - "11" => "Est", - "12" => "Kigali", - "13" => "Nord", - "14" => "Ouest", - "15" => "Sud"), -"SA" => array( - "02" => "Al Bahah", - "03" => "Al Jawf", - "05" => "Al Madinah", - "06" => "Ash Sharqiyah", - "08" => "Al Qasim", - "09" => "Al Qurayyat", - "10" => "Ar Riyad", - "13" => "Ha'il", - "14" => "Makkah", - "15" => "Al Hudud ash Shamaliyah", - "16" => "Najran", - "17" => "Jizan", - "19" => "Tabuk", - "20" => "Al Jawf"), -"SB" => array( - "03" => "Malaita", - "06" => "Guadalcanal", - "07" => "Isabel", - "08" => "Makira", - "09" => "Temotu", - "10" => "Central", - "11" => "Western", - "12" => "Choiseul", - "13" => "Rennell and Bellona"), -"SC" => array( - "01" => "Anse aux Pins", - "02" => "Anse Boileau", - "03" => "Anse Etoile", - "04" => "Anse Louis", - "05" => "Anse Royale", - "06" => "Baie Lazare", - "07" => "Baie Sainte Anne", - "08" => "Beau Vallon", - "09" => "Bel Air", - "10" => "Bel Ombre", - "11" => "Cascade", - "12" => "Glacis", - "13" => "Grand' Anse", - "14" => "Grand' Anse", - "15" => "La Digue", - "16" => "La Riviere Anglaise", - "17" => "Mont Buxton", - "18" => "Mont Fleuri", - "19" => "Plaisance", - "20" => "Pointe La Rue", - "21" => "Port Glaud", - "22" => "Saint Louis", - "23" => "Takamaka"), -"SD" => array( - "27" => "Al Wusta", - "28" => "Al Istiwa'iyah", - "29" => "Al Khartum", - "30" => "Ash Shamaliyah", - "31" => "Ash Sharqiyah", - "32" => "Bahr al Ghazal", - "33" => "Darfur", - "34" => "Kurdufan", - "35" => "Upper Nile", - "40" => "Al Wahadah State", - "44" => "Central Equatoria State"), -"SE" => array( - "01" => "Alvsborgs Lan", - "02" => "Blekinge Lan", - "03" => "Gavleborgs Lan", - "04" => "Goteborgs och Bohus Lan", - "05" => "Gotlands Lan", - "06" => "Hallands Lan", - "07" => "Jamtlands Lan", - "08" => "Jonkopings Lan", - "09" => "Kalmar Lan", - "10" => "Dalarnas Lan", - "11" => "Kristianstads Lan", - "12" => "Kronobergs Lan", - "13" => "Malmohus Lan", - "14" => "Norrbottens Lan", - "15" => "Orebro Lan", - "16" => "Ostergotlands Lan", - "17" => "Skaraborgs Lan", - "18" => "Sodermanlands Lan", - "21" => "Uppsala Lan", - "22" => "Varmlands Lan", - "23" => "Vasterbottens Lan", - "24" => "Vasternorrlands Lan", - "25" => "Vastmanlands Lan", - "26" => "Stockholms Lan", - "27" => "Skane Lan", - "28" => "Vastra Gotaland"), -"SH" => array( - "01" => "Ascension", - "02" => "Saint Helena", - "03" => "Tristan da Cunha"), -"SI" => array( - "01" => "Ajdovscina", - "02" => "Beltinci", - "03" => "Bled", - "04" => "Bohinj", - "05" => "Borovnica", - "06" => "Bovec", - "07" => "Brda", - "08" => "Brezice", - "09" => "Brezovica", - "11" => "Celje", - "12" => "Cerklje na Gorenjskem", - "13" => "Cerknica", - "14" => "Cerkno", - "15" => "Crensovci", - "16" => "Crna na Koroskem", - "17" => "Crnomelj", - "19" => "Divaca", - "20" => "Dobrepolje", - "22" => "Dol pri Ljubljani", - "24" => "Dornava", - "25" => "Dravograd", - "26" => "Duplek", - "27" => "Gorenja Vas-Poljane", - "28" => "Gorisnica", - "29" => "Gornja Radgona", - "30" => "Gornji Grad", - "31" => "Gornji Petrovci", - "32" => "Grosuplje", - "34" => "Hrastnik", - "35" => "Hrpelje-Kozina", - "36" => "Idrija", - "37" => "Ig", - "38" => "Ilirska Bistrica", - "39" => "Ivancna Gorica", - "40" => "Izola-Isola", - "42" => "Jursinci", - "44" => "Kanal", - "45" => "Kidricevo", - "46" => "Kobarid", - "47" => "Kobilje", - "49" => "Komen", - "50" => "Koper-Capodistria", - "51" => "Kozje", - "52" => "Kranj", - "53" => "Kranjska Gora", - "54" => "Krsko", - "55" => "Kungota", - "57" => "Lasko", - "61" => "Ljubljana", - "62" => "Ljubno", - "64" => "Logatec", - "66" => "Loski Potok", - "68" => "Lukovica", - "71" => "Medvode", - "72" => "Menges", - "73" => "Metlika", - "74" => "Mezica", - "76" => "Mislinja", - "77" => "Moravce", - "78" => "Moravske Toplice", - "79" => "Mozirje", - "80" => "Murska Sobota", - "81" => "Muta", - "82" => "Naklo", - "83" => "Nazarje", - "84" => "Nova Gorica", - "86" => "Odranci", - "87" => "Ormoz", - "88" => "Osilnica", - "89" => "Pesnica", - "91" => "Pivka", - "92" => "Podcetrtek", - "94" => "Postojna", - "97" => "Puconci", - "98" => "Racam", - "99" => "Radece", - "A1" => "Radenci", - "A2" => "Radlje ob Dravi", - "A3" => "Radovljica", - "A6" => "Rogasovci", - "A7" => "Rogaska Slatina", - "A8" => "Rogatec", - "B1" => "Semic", - "B2" => "Sencur", - "B3" => "Sentilj", - "B4" => "Sentjernej", - "B6" => "Sevnica", - "B7" => "Sezana", - "B8" => "Skocjan", - "B9" => "Skofja Loka", - "C1" => "Skofljica", - "C2" => "Slovenj Gradec", - "C4" => "Slovenske Konjice", - "C5" => "Smarje pri Jelsah", - "C6" => "Smartno ob Paki", - "C7" => "Sostanj", - "C8" => "Starse", - "C9" => "Store", - "D1" => "Sveti Jurij", - "D2" => "Tolmin", - "D3" => "Trbovlje", - "D4" => "Trebnje", - "D5" => "Trzic", - "D6" => "Turnisce", - "D7" => "Velenje", - "D8" => "Velike Lasce", - "E1" => "Vipava", - "E2" => "Vitanje", - "E3" => "Vodice", - "E5" => "Vrhnika", - "E6" => "Vuzenica", - "E7" => "Zagorje ob Savi", - "E9" => "Zavrc", - "F1" => "Zelezniki", - "F2" => "Ziri", - "F3" => "Zrece", - "G4" => "Dobrova-Horjul-Polhov Gradec", - "G7" => "Domzale", - "H4" => "Jesenice", - "H6" => "Kamnik", - "H7" => "Kocevje", - "I2" => "Kuzma", - "I3" => "Lenart", - "I5" => "Litija", - "I6" => "Ljutomer", - "I7" => "Loska Dolina", - "I9" => "Luce", - "J1" => "Majsperk", - "J2" => "Maribor", - "J5" => "Miren-Kostanjevica", - "J7" => "Novo Mesto", - "J9" => "Piran", - "K5" => "Preddvor", - "K7" => "Ptuj", - "L1" => "Ribnica", - "L3" => "Ruse", - "L7" => "Sentjur pri Celju", - "L8" => "Slovenska Bistrica", - "N2" => "Videm", - "N3" => "Vojnik", - "N5" => "Zalec"), -"SK" => array( - "01" => "Banska Bystrica", - "02" => "Bratislava", - "03" => "Kosice", - "04" => "Nitra", - "05" => "Presov", - "06" => "Trencin", - "07" => "Trnava", - "08" => "Zilina"), -"SL" => array( - "01" => "Eastern", - "02" => "Northern", - "03" => "Southern", - "04" => "Western Area"), -"SM" => array( - "01" => "Acquaviva", - "02" => "Chiesanuova", - "03" => "Domagnano", - "04" => "Faetano", - "05" => "Fiorentino", - "06" => "Borgo Maggiore", - "07" => "San Marino", - "08" => "Monte Giardino", - "09" => "Serravalle"), -"SN" => array( - "01" => "Dakar", - "03" => "Diourbel", - "04" => "Saint-Louis", - "05" => "Tambacounda", - "07" => "Thies", - "08" => "Louga", - "09" => "Fatick", - "10" => "Kaolack", - "11" => "Kolda", - "12" => "Ziguinchor", - "13" => "Louga", - "14" => "Saint-Louis", - "15" => "Matam"), -"SO" => array( - "01" => "Bakool", - "02" => "Banaadir", - "03" => "Bari", - "04" => "Bay", - "05" => "Galguduud", - "06" => "Gedo", - "07" => "Hiiraan", - "08" => "Jubbada Dhexe", - "09" => "Jubbada Hoose", - "10" => "Mudug", - "11" => "Nugaal", - "12" => "Sanaag", - "13" => "Shabeellaha Dhexe", - "14" => "Shabeellaha Hoose", - "16" => "Woqooyi Galbeed", - "18" => "Nugaal", - "19" => "Togdheer", - "20" => "Woqooyi Galbeed", - "21" => "Awdal", - "22" => "Sool"), -"SR" => array( - "10" => "Brokopondo", - "11" => "Commewijne", - "12" => "Coronie", - "13" => "Marowijne", - "14" => "Nickerie", - "15" => "Para", - "16" => "Paramaribo", - "17" => "Saramacca", - "18" => "Sipaliwini", - "19" => "Wanica"), -"ST" => array( - "01" => "Principe", - "02" => "Sao Tome"), -"SV" => array( - "01" => "Ahuachapan", - "02" => "Cabanas", - "03" => "Chalatenango", - "04" => "Cuscatlan", - "05" => "La Libertad", - "06" => "La Paz", - "07" => "La Union", - "08" => "Morazan", - "09" => "San Miguel", - "10" => "San Salvador", - "11" => "Santa Ana", - "12" => "San Vicente", - "13" => "Sonsonate", - "14" => "Usulutan"), -"SY" => array( - "01" => "Al Hasakah", - "02" => "Al Ladhiqiyah", - "03" => "Al Qunaytirah", - "04" => "Ar Raqqah", - "05" => "As Suwayda'", - "06" => "Dar", - "07" => "Dayr az Zawr", - "08" => "Rif Dimashq", - "09" => "Halab", - "10" => "Hamah", - "11" => "Hims", - "12" => "Idlib", - "13" => "Dimashq", - "14" => "Tartus"), -"SZ" => array( - "01" => "Hhohho", - "02" => "Lubombo", - "03" => "Manzini", - "04" => "Shiselweni", - "05" => "Praslin"), -"TD" => array( - "01" => "Batha", - "02" => "Biltine", - "03" => "Borkou-Ennedi-Tibesti", - "04" => "Chari-Baguirmi", - "05" => "Guera", - "06" => "Kanem", - "07" => "Lac", - "08" => "Logone Occidental", - "09" => "Logone Oriental", - "10" => "Mayo-Kebbi", - "11" => "Moyen-Chari", - "12" => "Ouaddai", - "13" => "Salamat", - "14" => "Tandjile"), -"TG" => array( - "09" => "Lama-Kara", - "18" => "Tsevie", - "22" => "Centrale", - "23" => "Kara", - "24" => "Maritime", - "25" => "Plateaux", - "26" => "Savanes"), -"TH" => array( - "01" => "Mae Hong Son", - "02" => "Chiang Mai", - "03" => "Chiang Rai", - "04" => "Nan", - "05" => "Lamphun", - "06" => "Lampang", - "07" => "Phrae", - "08" => "Tak", - "09" => "Sukhothai", - "10" => "Uttaradit", - "11" => "Kamphaeng Phet", - "12" => "Phitsanulok", - "13" => "Phichit", - "14" => "Phetchabun", - "15" => "Uthai Thani", - "16" => "Nakhon Sawan", - "17" => "Nong Khai", - "18" => "Loei", - "20" => "Sakon Nakhon", - "21" => "Nakhon Phanom", - "22" => "Khon Kaen", - "23" => "Kalasin", - "24" => "Maha Sarakham", - "25" => "Roi Et", - "26" => "Chaiyaphum", - "27" => "Nakhon Ratchasima", - "28" => "Buriram", - "29" => "Surin", - "30" => "Sisaket", - "31" => "Narathiwat", - "32" => "Chai Nat", - "33" => "Sing Buri", - "34" => "Lop Buri", - "35" => "Ang Thong", - "36" => "Phra Nakhon Si Ayutthaya", - "37" => "Saraburi", - "38" => "Nonthaburi", - "39" => "Pathum Thani", - "40" => "Krung Thep", - "41" => "Phayao", - "42" => "Samut Prakan", - "43" => "Nakhon Nayok", - "44" => "Chachoengsao", - "45" => "Prachin Buri", - "46" => "Chon Buri", - "47" => "Rayong", - "48" => "Chanthaburi", - "49" => "Trat", - "50" => "Kanchanaburi", - "51" => "Suphan Buri", - "52" => "Ratchaburi", - "53" => "Nakhon Pathom", - "54" => "Samut Songkhram", - "55" => "Samut Sakhon", - "56" => "Phetchaburi", - "57" => "Prachuap Khiri Khan", - "58" => "Chumphon", - "59" => "Ranong", - "60" => "Surat Thani", - "61" => "Phangnga", - "62" => "Phuket", - "63" => "Krabi", - "64" => "Nakhon Si Thammarat", - "65" => "Trang", - "66" => "Phatthalung", - "67" => "Satun", - "68" => "Songkhla", - "69" => "Pattani", - "70" => "Yala", - "71" => "Ubon Ratchathani", - "72" => "Yasothon", - "73" => "Nakhon Phanom", - "75" => "Ubon Ratchathani", - "76" => "Udon Thani", - "77" => "Amnat Charoen", - "78" => "Mukdahan", - "79" => "Nong Bua Lamphu", - "80" => "Sa Kaeo"), -"TJ" => array( - "01" => "Kuhistoni Badakhshon", - "02" => "Khatlon", - "03" => "Sughd"), -"TM" => array( - "01" => "Ahal", - "02" => "Balkan", - "03" => "Dashoguz", - "04" => "Lebap", - "05" => "Mary"), -"TN" => array( - "02" => "Kasserine", - "03" => "Kairouan", - "06" => "Jendouba", - "14" => "El Kef", - "15" => "Al Mahdia", - "16" => "Al Munastir", - "17" => "Bajah", - "18" => "Bizerte", - "19" => "Nabeul", - "22" => "Siliana", - "23" => "Sousse", - "26" => "Ariana", - "27" => "Ben Arous", - "28" => "Madanin", - "29" => "Gabes", - "30" => "Gafsa", - "31" => "Kebili", - "32" => "Sfax", - "33" => "Sidi Bou Zid", - "34" => "Tataouine", - "35" => "Tozeur", - "36" => "Tunis", - "37" => "Zaghouan"), -"TO" => array( - "01" => "Ha", - "02" => "Tongatapu", - "03" => "Vava"), -"TR" => array( - "02" => "Adiyaman", - "03" => "Afyonkarahisar", - "04" => "Agri", - "05" => "Amasya", - "07" => "Antalya", - "08" => "Artvin", - "09" => "Aydin", - "10" => "Balikesir", - "11" => "Bilecik", - "12" => "Bingol", - "13" => "Bitlis", - "14" => "Bolu", - "15" => "Burdur", - "16" => "Bursa", - "17" => "Canakkale", - "19" => "Corum", - "20" => "Denizli", - "21" => "Diyarbakir", - "22" => "Edirne", - "23" => "Elazig", - "24" => "Erzincan", - "25" => "Erzurum", - "26" => "Eskisehir", - "28" => "Giresun", - "31" => "Hatay", - "32" => "Icel", - "33" => "Isparta", - "34" => "Istanbul", - "35" => "Izmir", - "37" => "Kastamonu", - "38" => "Kayseri", - "39" => "Kirklareli", - "40" => "Kirsehir", - "41" => "Kocaeli", - "43" => "Kutahya", - "44" => "Malatya", - "45" => "Manisa", - "46" => "Kahramanmaras", - "48" => "Mugla", - "49" => "Mus", - "50" => "Nevsehir", - "52" => "Ordu", - "53" => "Rize", - "54" => "Sakarya", - "55" => "Samsun", - "57" => "Sinop", - "58" => "Sivas", - "59" => "Tekirdag", - "60" => "Tokat", - "61" => "Trabzon", - "62" => "Tunceli", - "63" => "Sanliurfa", - "64" => "Usak", - "65" => "Van", - "66" => "Yozgat", - "68" => "Ankara", - "69" => "Gumushane", - "70" => "Hakkari", - "71" => "Konya", - "72" => "Mardin", - "73" => "Nigde", - "74" => "Siirt", - "75" => "Aksaray", - "76" => "Batman", - "77" => "Bayburt", - "78" => "Karaman", - "79" => "Kirikkale", - "80" => "Sirnak", - "81" => "Adana", - "82" => "Cankiri", - "83" => "Gaziantep", - "84" => "Kars", - "85" => "Zonguldak", - "86" => "Ardahan", - "87" => "Bartin", - "88" => "Igdir", - "89" => "Karabuk", - "90" => "Kilis", - "91" => "Osmaniye", - "92" => "Yalova", - "93" => "Duzce"), -"TT" => array( - "01" => "Arima", - "02" => "Caroni", - "03" => "Mayaro", - "04" => "Nariva", - "05" => "Port-of-Spain", - "06" => "Saint Andrew", - "07" => "Saint David", - "08" => "Saint George", - "09" => "Saint Patrick", - "10" => "San Fernando", - "11" => "Tobago", - "12" => "Victoria"), -"TW" => array( - "01" => "Fu-chien", - "02" => "Kao-hsiung", - "03" => "T'ai-pei", - "04" => "T'ai-wan"), -"TZ" => array( - "02" => "Pwani", - "03" => "Dodoma", - "04" => "Iringa", - "05" => "Kigoma", - "06" => "Kilimanjaro", - "07" => "Lindi", - "08" => "Mara", - "09" => "Mbeya", - "10" => "Morogoro", - "11" => "Mtwara", - "12" => "Mwanza", - "13" => "Pemba North", - "14" => "Ruvuma", - "15" => "Shinyanga", - "16" => "Singida", - "17" => "Tabora", - "18" => "Tanga", - "19" => "Kagera", - "20" => "Pemba South", - "21" => "Zanzibar Central", - "22" => "Zanzibar North", - "23" => "Dar es Salaam", - "24" => "Rukwa", - "25" => "Zanzibar Urban", - "26" => "Arusha", - "27" => "Manyara"), -"UA" => array( - "01" => "Cherkas'ka Oblast'", - "02" => "Chernihivs'ka Oblast'", - "03" => "Chernivets'ka Oblast'", - "04" => "Dnipropetrovs'ka Oblast'", - "05" => "Donets'ka Oblast'", - "06" => "Ivano-Frankivs'ka Oblast'", - "07" => "Kharkivs'ka Oblast'", - "08" => "Khersons'ka Oblast'", - "09" => "Khmel'nyts'ka Oblast'", - "10" => "Kirovohrads'ka Oblast'", - "11" => "Krym", - "12" => "Kyyiv", - "13" => "Kyyivs'ka Oblast'", - "14" => "Luhans'ka Oblast'", - "15" => "L'vivs'ka Oblast'", - "16" => "Mykolayivs'ka Oblast'", - "17" => "Odes'ka Oblast'", - "18" => "Poltavs'ka Oblast'", - "19" => "Rivnens'ka Oblast'", - "20" => "Sevastopol'", - "21" => "Sums'ka Oblast'", - "22" => "Ternopil's'ka Oblast'", - "23" => "Vinnyts'ka Oblast'", - "24" => "Volyns'ka Oblast'", - "25" => "Zakarpats'ka Oblast'", - "26" => "Zaporiz'ka Oblast'", - "27" => "Zhytomyrs'ka Oblast'"), -"UG" => array( - "05" => "Busoga", - "08" => "Karamoja", - "12" => "South Buganda", - "18" => "Central", - "20" => "Eastern", - "21" => "Nile", - "22" => "North Buganda", - "23" => "Northern", - "24" => "Southern", - "25" => "Western", - "33" => "Jinja", - "36" => "Kalangala", - "37" => "Kampala", - "42" => "Kiboga", - "52" => "Mbarara", - "56" => "Mubende", - "65" => "Adjumani", - "66" => "Bugiri", - "67" => "Busia", - "69" => "Katakwi", - "71" => "Masaka", - "73" => "Nakasongola", - "74" => "Sembabule", - "77" => "Arua", - "78" => "Iganga", - "79" => "Kabarole", - "80" => "Kaberamaido", - "81" => "Kamwenge", - "82" => "Kanungu", - "83" => "Kayunga", - "84" => "Kitgum", - "85" => "Kyenjojo", - "86" => "Mayuge", - "87" => "Mbale", - "88" => "Moroto", - "89" => "Mpigi", - "90" => "Mukono", - "91" => "Nakapiripirit", - "92" => "Pader", - "93" => "Rukungiri", - "94" => "Sironko", - "95" => "Soroti", - "96" => "Wakiso", - "97" => "Yumbe"), -"US" => array( - "AA" => "Armed Forces Americas", - "AE" => "Armed Forces Europe, Middle East, & Canada", - "AK" => "Alaska", - "AL" => "Alabama", - "AP" => "Armed Forces Pacific", - "AR" => "Arkansas", - "AS" => "American Samoa", - "AZ" => "Arizona", - "CA" => "California", - "CO" => "Colorado", - "CT" => "Connecticut", - "DC" => "District of Columbia", - "DE" => "Delaware", - "FL" => "Florida", - "FM" => "Federated States of Micronesia", - "GA" => "Georgia", - "GU" => "Guam", - "HI" => "Hawaii", - "IA" => "Iowa", - "ID" => "Idaho", - "IL" => "Illinois", - "IN" => "Indiana", - "KS" => "Kansas", - "KY" => "Kentucky", - "LA" => "Louisiana", - "MA" => "Massachusetts", - "MD" => "Maryland", - "ME" => "Maine", - "MH" => "Marshall Islands", - "MI" => "Michigan", - "MN" => "Minnesota", - "MO" => "Missouri", - "MP" => "Northern Mariana Islands", - "MS" => "Mississippi", - "MT" => "Montana", - "NC" => "North Carolina", - "ND" => "North Dakota", - "NE" => "Nebraska", - "NH" => "New Hampshire", - "NJ" => "New Jersey", - "NM" => "New Mexico", - "NV" => "Nevada", - "NY" => "New York", - "OH" => "Ohio", - "OK" => "Oklahoma", - "OR" => "Oregon", - "PA" => "Pennsylvania", - "PR" => "Puerto Rico", - "PW" => "Palau", - "RI" => "Rhode Island", - "SC" => "South Carolina", - "SD" => "South Dakota", - "TN" => "Tennessee", - "TX" => "Texas", - "UT" => "Utah", - "VA" => "Virginia", - "VI" => "Virgin Islands", - "VT" => "Vermont", - "WA" => "Washington", - "WI" => "Wisconsin", - "WV" => "West Virginia", - "WY" => "Wyoming"), -"UY" => array( - "01" => "Artigas", - "02" => "Canelones", - "03" => "Cerro Largo", - "04" => "Colonia", - "05" => "Durazno", - "06" => "Flores", - "07" => "Florida", - "08" => "Lavalleja", - "09" => "Maldonado", - "10" => "Montevideo", - "11" => "Paysandu", - "12" => "Rio Negro", - "13" => "Rivera", - "14" => "Rocha", - "15" => "Salto", - "16" => "San Jose", - "17" => "Soriano", - "18" => "Tacuarembo", - "19" => "Treinta y Tres"), -"UZ" => array( - "01" => "Andijon", - "02" => "Bukhoro", - "03" => "Farghona", - "04" => "Jizzakh", - "05" => "Khorazm", - "06" => "Namangan", - "07" => "Nawoiy", - "08" => "Qashqadaryo", - "09" => "Qoraqalpoghiston", - "10" => "Samarqand", - "11" => "Sirdaryo", - "12" => "Surkhondaryo", - "13" => "Toshkent", - "14" => "Toshkent"), -"VC" => array( - "01" => "Charlotte", - "02" => "Saint Andrew", - "03" => "Saint David", - "04" => "Saint George", - "05" => "Saint Patrick", - "06" => "Grenadines"), -"VE" => array( - "01" => "Amazonas", - "02" => "Anzoategui", - "03" => "Apure", - "04" => "Aragua", - "05" => "Barinas", - "06" => "Bolivar", - "07" => "Carabobo", - "08" => "Cojedes", - "09" => "Delta Amacuro", - "11" => "Falcon", - "12" => "Guarico", - "13" => "Lara", - "14" => "Merida", - "15" => "Miranda", - "16" => "Monagas", - "17" => "Nueva Esparta", - "18" => "Portuguesa", - "19" => "Sucre", - "20" => "Tachira", - "21" => "Trujillo", - "22" => "Yaracuy", - "23" => "Zulia", - "24" => "Dependencias Federales", - "25" => "Distrito Federal", - "26" => "Vargas"), -"VN" => array( - "01" => "An Giang", - "02" => "Bac Thai", - "03" => "Ben Tre", - "04" => "Binh Tri Thien", - "05" => "Cao Bang", - "06" => "Cuu Long", - "07" => "Dac Lac", - "09" => "Dong Thap", - "11" => "Ha Bac", - "12" => "Hai Hung", - "13" => "Hai Phong", - "14" => "Ha Nam Ninh", - "15" => "Ha Noi", - "16" => "Ha Son Binh", - "17" => "Ha Tuyen", - "19" => "Hoang Lien Son", - "20" => "Ho Chi Minh", - "21" => "Kien Giang", - "22" => "Lai Chau", - "23" => "Lam Dong", - "24" => "Long An", - "25" => "Minh Hai", - "26" => "Nghe Tinh", - "27" => "Nghia Binh", - "28" => "Phu Khanh", - "29" => "Quang Nam-Da Nang", - "30" => "Quang Ninh", - "31" => "Song Be", - "32" => "Son La", - "33" => "Tay Ninh", - "34" => "Thanh Hoa", - "35" => "Thai Binh", - "36" => "Thuan Hai", - "37" => "Tien Giang", - "38" => "Vinh Phu", - "39" => "Lang Son", - "40" => "Dong Nai", - "43" => "An Giang", - "44" => "Dac Lac", - "45" => "Dong Nai", - "46" => "Dong Thap", - "47" => "Kien Giang", - "48" => "Minh Hai", - "49" => "Song Be", - "50" => "Vinh Phu", - "51" => "Ha Noi", - "52" => "Ho Chi Minh", - "53" => "Ba Ria-Vung Tau", - "54" => "Binh Dinh", - "55" => "Binh Thuan", - "56" => "Can Tho", - "57" => "Gia Lai", - "58" => "Ha Giang", - "59" => "Ha Tay", - "60" => "Ha Tinh", - "61" => "Hoa Binh", - "62" => "Khanh Hoa", - "63" => "Kon Tum", - "64" => "Quang Tri", - "65" => "Nam Ha", - "66" => "Nghe An", - "67" => "Ninh Binh", - "68" => "Ninh Thuan", - "69" => "Phu Yen", - "70" => "Quang Binh", - "71" => "Quang Ngai", - "72" => "Quang Tri", - "73" => "Soc Trang", - "74" => "Thua Thien", - "75" => "Tra Vinh", - "76" => "Tuyen Quang", - "77" => "Vinh Long", - "78" => "Da Nang", - "79" => "Hai Duong", - "80" => "Ha Nam", - "81" => "Hung Yen", - "82" => "Nam Dinh", - "83" => "Phu Tho", - "84" => "Quang Nam", - "85" => "Thai Nguyen", - "86" => "Vinh Puc Province", - "87" => "Can Tho", - "88" => "Dak Lak", - "89" => "Lai Chau", - "90" => "Lao Cai", - "91" => "Dak Nong", - "92" => "Dien Bien", - "93" => "Hau Giang"), -"VU" => array( - "05" => "Ambrym", - "06" => "Aoba", - "07" => "Torba", - "08" => "Efate", - "09" => "Epi", - "10" => "Malakula", - "11" => "Paama", - "12" => "Pentecote", - "13" => "Sanma", - "14" => "Shepherd", - "15" => "Tafea", - "16" => "Malampa", - "17" => "Penama", - "18" => "Shefa"), -"WS" => array( - "02" => "Aiga-i-le-Tai", - "03" => "Atua", - "04" => "Fa", - "05" => "Gaga", - "06" => "Va", - "07" => "Gagaifomauga", - "08" => "Palauli", - "09" => "Satupa", - "10" => "Tuamasaga", - "11" => "Vaisigano"), -"YE" => array( - "01" => "Abyan", - "02" => "Adan", - "03" => "Al Mahrah", - "04" => "Hadramawt", - "05" => "Shabwah", - "06" => "Al Ghaydah", - "08" => "Al Hudaydah", - "10" => "Al Mahwit", - "11" => "Dhamar", - "14" => "Ma'rib", - "15" => "Sa", - "16" => "San", - "20" => "Al Bayda'", - "21" => "Al Jawf", - "22" => "Hajjah", - "23" => "Ibb", - "24" => "Lahij", - "25" => "Ta"), -"ZA" => array( - "01" => "North-Western Province", - "02" => "KwaZulu-Natal", - "03" => "Free State", - "05" => "Eastern Cape", - "06" => "Gauteng", - "07" => "Mpumalanga", - "08" => "Northern Cape", - "09" => "Limpopo", - "10" => "North-West", - "11" => "Western Cape"), -"ZM" => array( - "01" => "Western", - "02" => "Central", - "03" => "Eastern", - "04" => "Luapula", - "05" => "Northern", - "06" => "North-Western", - "07" => "Southern", - "08" => "Copperbelt", - "09" => "Lusaka"), -"ZW" => array( - "01" => "Manicaland", - "02" => "Midlands", - "03" => "Mashonaland Central", - "04" => "Mashonaland East", - "05" => "Mashonaland West", - "06" => "Matabeleland North", - "07" => "Matabeleland South", - "08" => "Masvingo", - "09" => "Bulawayo", - "10" => "Harare") -); -?> \ No newline at end of file diff --git a/lib/geoip/readme_moodle.txt b/lib/geoip/readme_moodle.txt deleted file mode 100644 index d2f2812cf04..00000000000 --- a/lib/geoip/readme_moodle.txt +++ /dev/null @@ -1,49 +0,0 @@ -20 Jul 2010 -MDL-20876 - replaced deprecated split() with explode() - -diff --git a/lib/geoip/geoipcity.inc b/lib/geoip/geoipcity.inc -index 2297745..4e7b397 100644 ---- a/lib/geoip/geoipcity.inc -+++ b/lib/geoip/geoipcity.inc -@@ -67,9 +67,9 @@ class geoipdnsrecord { - - function getrecordwithdnsservice($str){ - $record = new geoipdnsrecord; -- $keyvalue = split(";",$str); -+ $keyvalue = explode(";",$str); - foreach ($keyvalue as $keyvalue2){ -- list($key,$value) = split("=",$keyvalue2); -+ list($key,$value) = explode("=",$keyvalue2); - if ($key == "co"){ - $record->country_code = $value; - } -@@ -214,4 +214,4 @@ function GeoIP_record_by_addr ($gi,$addr){ - return _get_record($gi, $ipnum); - } - --?> -\ No newline at end of file -+?> - - - -18 Nov 2009 -Description of geoip modifications to remove ereg related functions deprecated as of php 5.3. Patch below. - -Index: geoip.inc -=================================================================== -RCS file: /cvsroot/moodle/moodle/lib/geoip/geoip.inc,v -retrieving revision 1.2 -diff -u -r1.2 geoip.inc ---- geoip.inc 19 Jul 2009 13:54:11 -0000 1.2 -+++ geoip.inc 18 Nov 2009 04:03:48 -0000 -@@ -493,7 +493,7 @@ - $r->nameservers = array("ws1.maxmind.com"); - $p = $r->search($l."." . $ip .".s.maxmind.com","TXT","IN"); - $str = is_object($p->answer[0])?$p->answer[0]->string():''; -- ereg("\"(.*)\"",$str,$regs); -+ preg_match("#\"(.*)\"#",$str,$regs); - $str = $regs[1]; - return $str; - } - diff --git a/lib/pear/Net/GeoIP.php b/lib/pear/Net/GeoIP.php new file mode 100644 index 00000000000..f2cb3e75fe7 --- /dev/null +++ b/lib/pear/Net/GeoIP.php @@ -0,0 +1,904 @@ + (original Maxmind version) | + * | Hans Lellelid | + * +----------------------------------------------------------------------+ + * + * @category Net + * @package Net_GeoIP + * @author Jim Winstead (original Maxmind PHP API) + * @author Hans Lellelid + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @link http://pear.php.net/package/Net_GeoIp + * $Id$ + */ + +require_once 'PEAR/Exception.php'; + +/** + * GeoIP class provides an API for performing geo-location lookups based on IP + * address. + * + * To use this class you must have a [binary version] GeoIP database. There is + * a free GeoIP country database which can be obtained from Maxmind: + * {@link http://www.maxmind.com/app/geoip_country} + * + * + * SIMPLE USE + * + * + * Create an instance: + * + * + * $geoip = Net_GeoIP::getInstance('/path/to/geoipdb.dat', Net_GeoIP::SHARED_MEMORY); + * + * + * Depending on which database you are using (free, or one of paid versions) + * you must use appropriate lookup method: + * + * + * // for free country db: + * $country_name = $geoip->lookupCountryName($_SERVER['REMOTE_ADDR']); + * $country_code = $geoip->lookupCountryCode($_SERVER['REMOTE_ADDR']); + * + * // for [non-free] region db: + * list($ctry_code, $region) = $geoip->lookupRegion($_SERVER['REMOTE_ADDR']); + * + * // for [non-free] city db: + * $location = $geoip->lookupLocation($_SERVER['REMOTE_ADDR']); + * print "city: " . $location->city . ", " . $location->region; + * print "lat: " . $location->latitude . ", long: " . $location->longitude; + * + * // for organization or ISP db: + * $org_or_isp_name = $geoip->lookupOrg($_SERVER['REMOTE_ADDR']); + * + * + * + * MULTIPLE INSTANCES + * + * + * You can have several instances of this class, one for each database file + * you are using. You should use the static getInstance() singleton method + * to save on overhead of setting up database segments. Note that only one + * instance is stored per filename, and any flags will be ignored if an + * instance already exists for the specifiedfilename. + * + * Special note on using SHARED_MEMORY flag + * + * If you are using SHARED_MEMORY (shmop) you can only use SHARED_MEMORY for + * one (1) instance (i.e. for one database). Any subsequent attempts to + * instantiate using SHARED_MEMORY will read the same shared memory block + * already initialized, and therefore will cause problems since the expected + * database format won't match the database in the shared memory block. + * + * Note that there is no easy way to flag "nice errors" to prevent attempts + * to create new instances using SHARED_MEMORY flag and it is also not posible + * (in a safe way) to allow new instances to overwrite the shared memory block. + * + * In short, is you are using multiple databses, use the SHARED_MEMORY flag + * with care. + * + * + * LOOKUPS ON HOSTNAMES + * + * + * Note that this PHP API does NOT support lookups on hostnames. This is so + * that the public API can be kept simple and so that the lookup functions + * don't need to try name lookups if IP lookup fails (which would be the only + * way to keep the API simple and support name-based lookups). + * + * If you do not know the IP address, you can convert an name to IP very + * simply using PHP native functions or other libraries: + * + * + * $geoip->lookupCountryName(gethostbyname('www.sunset.se')); + * + * + * Or, if you don't know whether an address is a name or ip address, use + * application-level logic: + * + * + * if (ip2long($ip_or_name) === false) { + * $ip = gethostbyname($ip_or_name); + * } else { + * $ip = $ip_or_name; + * } + * $ctry = $geoip->lookupCountryName($ip); + * + * + * @category Net + * @package Net_GeoIP + * @author Jim Winstead (original Maxmind PHP API) + * @author Hans Lellelid + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @link http://pear.php.net/package/Net_GeoIp + */ +class Net_GeoIP +{ + /** + * Exception error code used for invalid IP address. + */ + const ERR_INVALID_IP = 218624992; // crc32('Net_GeoIP::ERR_INVALID_IP') + + /** + * Exception error code when there is a DB-format-related error. + */ + const ERR_DB_FORMAT = 866184008; // crc32('Net_GeoIP::ERR_DB_FORMAT') + + public static $COUNTRY_CODES = array( + "", "AP", "EU", "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AN", "AO", "AQ", + "AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", + "BI", "BJ", "BM", "BN", "BO", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", + "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", + "CV", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", + "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "FX", "GA", "GB", + "GD", "GE", "GF", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", + "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", + "IO", "IQ", "IR", "IS", "IT", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", + "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", + "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MH", "MK", "ML", "MM", "MN", + "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", + "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", + "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", + "QA", "RE", "RO", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", + "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "ST", "SV", "SY", "SZ", "TC", "TD", + "TF", "TG", "TH", "TJ", "TK", "TM", "TN", "TO", "TL", "TR", "TT", "TV", "TW", + "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", + "VU", "WF", "WS", "YE", "YT", "RS", "ZA", "ZM", "ME", "ZW", "A1", "A2", "O1", + "AX", "GG", "IM", "JE", "BL", "MF" + ); + + public static $COUNTRY_CODES3 = array( + "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG", + "ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI", + "BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC", + "COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV", + "CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH", + "ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD", + "GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM", + "GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO", + "IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA", + "PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU", + "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC", + "MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL", + "NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER", + "PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT", + "REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM", + "SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF", + "TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA", + "UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT", + "WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1", + "ALA","GGY","IMN","JEY","BLM","MAF" + ); + + public static $COUNTRY_NAMES = array( + "", "Asia/Pacific Region", "Europe", "Andorra", "United Arab Emirates", + "Afghanistan", "Antigua and Barbuda", "Anguilla", "Albania", "Armenia", + "Netherlands Antilles", "Angola", "Antarctica", "Argentina", "American Samoa", + "Austria", "Australia", "Aruba", "Azerbaijan", "Bosnia and Herzegovina", + "Barbados", "Bangladesh", "Belgium", "Burkina Faso", "Bulgaria", "Bahrain", + "Burundi", "Benin", "Bermuda", "Brunei Darussalam", "Bolivia", "Brazil", + "Bahamas", "Bhutan", "Bouvet Island", "Botswana", "Belarus", "Belize", + "Canada", "Cocos (Keeling) Islands", "Congo, The Democratic Republic of the", + "Central African Republic", "Congo", "Switzerland", "Cote D'Ivoire", "Cook Islands", + "Chile", "Cameroon", "China", "Colombia", "Costa Rica", "Cuba", "Cape Verde", + "Christmas Island", "Cyprus", "Czech Republic", "Germany", "Djibouti", + "Denmark", "Dominica", "Dominican Republic", "Algeria", "Ecuador", "Estonia", + "Egypt", "Western Sahara", "Eritrea", "Spain", "Ethiopia", "Finland", "Fiji", + "Falkland Islands (Malvinas)", "Micronesia, Federated States of", "Faroe Islands", + "France", "France, Metropolitan", "Gabon", "United Kingdom", + "Grenada", "Georgia", "French Guiana", "Ghana", "Gibraltar", "Greenland", + "Gambia", "Guinea", "Guadeloupe", "Equatorial Guinea", "Greece", "South Georgia and the South Sandwich Islands", + "Guatemala", "Guam", "Guinea-Bissau", + "Guyana", "Hong Kong", "Heard Island and McDonald Islands", "Honduras", + "Croatia", "Haiti", "Hungary", "Indonesia", "Ireland", "Israel", "India", + "British Indian Ocean Territory", "Iraq", "Iran, Islamic Republic of", + "Iceland", "Italy", "Jamaica", "Jordan", "Japan", "Kenya", "Kyrgyzstan", + "Cambodia", "Kiribati", "Comoros", "Saint Kitts and Nevis", "Korea, Democratic People's Republic of", + "Korea, Republic of", "Kuwait", "Cayman Islands", + "Kazakstan", "Lao People's Democratic Republic", "Lebanon", "Saint Lucia", + "Liechtenstein", "Sri Lanka", "Liberia", "Lesotho", "Lithuania", "Luxembourg", + "Latvia", "Libyan Arab Jamahiriya", "Morocco", "Monaco", "Moldova, Republic of", + "Madagascar", "Marshall Islands", "Macedonia", + "Mali", "Myanmar", "Mongolia", "Macau", "Northern Mariana Islands", + "Martinique", "Mauritania", "Montserrat", "Malta", "Mauritius", "Maldives", + "Malawi", "Mexico", "Malaysia", "Mozambique", "Namibia", "New Caledonia", + "Niger", "Norfolk Island", "Nigeria", "Nicaragua", "Netherlands", "Norway", + "Nepal", "Nauru", "Niue", "New Zealand", "Oman", "Panama", "Peru", "French Polynesia", + "Papua New Guinea", "Philippines", "Pakistan", "Poland", "Saint Pierre and Miquelon", + "Pitcairn Islands", "Puerto Rico", "Palestinian Territory", + "Portugal", "Palau", "Paraguay", "Qatar", "Reunion", "Romania", + "Russian Federation", "Rwanda", "Saudi Arabia", "Solomon Islands", + "Seychelles", "Sudan", "Sweden", "Singapore", "Saint Helena", "Slovenia", + "Svalbard and Jan Mayen", "Slovakia", "Sierra Leone", "San Marino", "Senegal", + "Somalia", "Suriname", "Sao Tome and Principe", "El Salvador", "Syrian Arab Republic", + "Swaziland", "Turks and Caicos Islands", "Chad", "French Southern Territories", + "Togo", "Thailand", "Tajikistan", "Tokelau", "Turkmenistan", + "Tunisia", "Tonga", "Timor-Leste", "Turkey", "Trinidad and Tobago", "Tuvalu", + "Taiwan", "Tanzania, United Republic of", "Ukraine", + "Uganda", "United States Minor Outlying Islands", "United States", "Uruguay", + "Uzbekistan", "Holy See (Vatican City State)", "Saint Vincent and the Grenadines", + "Venezuela", "Virgin Islands, British", "Virgin Islands, U.S.", + "Vietnam", "Vanuatu", "Wallis and Futuna", "Samoa", "Yemen", "Mayotte", + "Serbia", "South Africa", "Zambia", "Montenegro", "Zimbabwe", + "Anonymous Proxy","Satellite Provider","Other", + "Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin" + ); + + // storage / caching flags + const STANDARD = 0; + const MEMORY_CACHE = 1; + const SHARED_MEMORY = 2; + + // Database structure constants + const COUNTRY_BEGIN = 16776960; + const STATE_BEGIN_REV0 = 16700000; + const STATE_BEGIN_REV1 = 16000000; + + const STRUCTURE_INFO_MAX_SIZE = 20; + const DATABASE_INFO_MAX_SIZE = 100; + const COUNTRY_EDITION = 106; + const REGION_EDITION_REV0 = 112; + const REGION_EDITION_REV1 = 3; + const CITY_EDITION_REV0 = 111; + const CITY_EDITION_REV1 = 2; + const ORG_EDITION = 110; + const SEGMENT_RECORD_LENGTH = 3; + const STANDARD_RECORD_LENGTH = 3; + const ORG_RECORD_LENGTH = 4; + const MAX_RECORD_LENGTH = 4; + const MAX_ORG_RECORD_LENGTH = 300; + const FULL_RECORD_LENGTH = 50; + + const US_OFFSET = 1; + const CANADA_OFFSET = 677; + const WORLD_OFFSET = 1353; + const FIPS_RANGE = 360; + + // SHMOP memory address + const SHM_KEY = 0x4f415401; + + /** + * @var int + */ + private $flags = 0; + + /** + * @var resource + */ + private $filehandle; + + /** + * @var string + */ + private $memoryBuffer; + + /** + * @var int + */ + private $databaseType; + + /** + * @var int + */ + private $databaseSegments; + + /** + * @var int + */ + private $recordLength; + + /** + * The memory addr "id" for use with SHMOP. + * @var int + */ + private $shmid; + + /** + * Support for singleton pattern. + * @var array + */ + private static $instances = array(); + + /** + * Construct a Net_GeoIP instance. + * You should use the getInstance() method if you plan to use multiple databases or + * the same database from several different places in your script. + * + * @param string $filename Path to binary geoip database. + * @param int $flags Flags + * + * @see getInstance() + */ + public function __construct($filename = null, $flags = null) + { + if ($filename !== null) { + $this->open($filename, $flags); + } + // store the instance, so that it will be returned by a call to + // getInstance() (with the same db filename). + self::$instances[$filename] = $this; + } + + /** + * Calls the close() function to free any resources. + * @see close() + * + * COMMENTED OUT TO ADDRESS BUG IN PHP 5.0.4, 5.0.5dev. THIS RESOURCE + * SHOULD AUTOMATICALLY BE FREED AT SCRIPT CLOSE, SO A DESTRUCTOR + * IS A GOOD IDEA BUT NOT NECESSARILY A NECESSITY. + public function __destruct() + { + $this->close(); + } + */ + + /** + * Singleton method, use this to get an instance and avoid re-parsing the db. + * + * Unique instances are instantiated based on the filename of the db. The flags + * are ignored -- in that requests to for instance with same filename but different + * flags will return the already-instantiated instance. For example: + * + * // create new instance with memory_cache enabled + * $geoip = Net_GeoIP::getInstance('C:\mydb.dat', Net_GeoIP::MEMORY_CACHE); + * .... + * + * // later in code, request instance with no flags specified. + * $geoip = Net_GeoIP::getInstance('C:\mydb.dat'); + * + * // Normally this means no MEMORY_CACHE but since an instance + * // with memory cache enabled has already been created for 'C:\mydb.dat', the + * // existing instance (with memory cache) will be returned. + * + * + * NOTE: You can only use SHARED_MEMORY flag for one instance! Any subsquent instances + * that attempt to use the SHARED_MEMORY will use the *same* shared memory, which will break + * your script. + * + * @param string $filename Filename + * @param int $flags Flags that control class behavior. + * + Net_GeoIp::SHARED_MEMORY + * Use SHMOP to share a db among multiple PHP instances. + * NOTE: ONLY ONE GEOIP INSTANCE CAN USE SHARED MEMORY!!! + * + Net_GeoIp::MEMORY_CACHE + * Store the full contents of the database in memory for current script. + * This is useful if you access the database several times in a script. + * + Net_GeoIp::STANDARD + * [default] standard no-cache version. + * + * @return Net_GeoIP + */ + public static function getInstance($filename = null, $flags = null) + { + if (!isset(self::$instances[$filename])) { + self::$instances[$filename] = new Net_GeoIP($filename, $flags); + } + return self::$instances[$filename]; + } + + /** + * Opens geoip database at filename and with specified flags. + * + * @param string $filename File to open + * @param int $flags Flags + * + * @return void + * + * @throws PEAR_Exception if unable to open specified file or shared memory. + */ + public function open($filename, $flags = null) + { + if ($flags !== null) { + $this->flags = $flags; + } + if ($this->flags & self::SHARED_MEMORY) { + $this->shmid = @shmop_open(self::SHM_KEY, "a", 0, 0); + if ($this->shmid === false) { + $this->loadSharedMemory($filename); + $this->shmid = @shmop_open(self::SHM_KEY, "a", 0, 0); + if ($this->shmid === false) { // should never be false as loadSharedMemory() will throw Exc if cannot create + throw new PEAR_Exception("Unable to open shared memory at key: " . dechex(self::SHM_KEY)); + } + } + } else { + $this->filehandle = fopen($filename, "rb"); + if (!$this->filehandle) { + throw new PEAR_Exception("Unable to open file: $filename"); + } + if ($this->flags & self::MEMORY_CACHE) { + $s_array = fstat($this->filehandle); + $this->memoryBuffer = fread($this->filehandle, $s_array['size']); + } + } + $this->setupSegments(); + } + + /** + * Loads the database file into shared memory. + * + * @param string $filename Path to database file to read into shared memory. + * + * @return void + * + * @throws PEAR_Exception - if unable to read the db file. + */ + protected function loadSharedMemory($filename) + { + $fp = fopen($filename, "rb"); + if (!$fp) { + throw new PEAR_Exception("Unable to open file: $filename"); + } + $s_array = fstat($fp); + $size = $s_array['size']; + + if ($shmid = @shmop_open(self::SHM_KEY, "w", 0, 0)) { + shmop_delete($shmid); + shmop_close($shmid); + } + + if ($shmid = @shmop_open(self::SHM_KEY, "c", 0644, $size)) { + $offset = 0; + while ($offset < $size) { + $buf = fread($fp, 524288); + shmop_write($shmid, $buf, $offset); + $offset += 524288; + } + shmop_close($shmid); + } + + fclose($fp); + } + + /** + * Parses the database file to determine what kind of database is being used and setup + * segment sizes and start points that will be used by the seek*() methods later. + * + * @return void + */ + protected function setupSegments() + { + + $this->databaseType = self::COUNTRY_EDITION; + $this->recordLength = self::STANDARD_RECORD_LENGTH; + + if ($this->flags & self::SHARED_MEMORY) { + + $offset = shmop_size($this->shmid) - 3; + for ($i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++) { + $delim = shmop_read($this->shmid, $offset, 3); + $offset += 3; + if ($delim == (chr(255).chr(255).chr(255))) { + $this->databaseType = ord(shmop_read($this->shmid, $offset, 1)); + $offset++; + if ($this->databaseType === self::REGION_EDITION_REV0) { + $this->databaseSegments = self::STATE_BEGIN_REV0; + } elseif ($this->databaseType === self::REGION_EDITION_REV1) { + $this->databaseSegments = self::STATE_BEGIN_REV1; + } elseif (($this->databaseType === self::CITY_EDITION_REV0) + || ($this->databaseType === self::CITY_EDITION_REV1) + || ($this->databaseType === self::ORG_EDITION)) { + $this->databaseSegments = 0; + $buf = shmop_read($this->shmid, $offset, self::SEGMENT_RECORD_LENGTH); + for ($j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++) { + $this->databaseSegments += (ord($buf[$j]) << ($j * 8)); + } + if ($this->databaseType === self::ORG_EDITION) { + $this->recordLength = self::ORG_RECORD_LENGTH; + } + } + break; + } else { + $offset -= 4; + } + } + if ($this->databaseType == self::COUNTRY_EDITION) { + $this->databaseSegments = self::COUNTRY_BEGIN; + } + + } else { + + $filepos = ftell($this->filehandle); + fseek($this->filehandle, -3, SEEK_END); + for ($i = 0; $i < self::STRUCTURE_INFO_MAX_SIZE; $i++) { + $delim = fread($this->filehandle, 3); + if ($delim == (chr(255).chr(255).chr(255))) { + $this->databaseType = ord(fread($this->filehandle, 1)); + if ($this->databaseType === self::REGION_EDITION_REV0) { + $this->databaseSegments = self::STATE_BEGIN_REV0; + } elseif ($this->databaseType === self::REGION_EDITION_REV1) { + $this->databaseSegments = self::STATE_BEGIN_REV1; + } elseif ($this->databaseType === self::CITY_EDITION_REV0 + || $this->databaseType === self::CITY_EDITION_REV1 + || $this->databaseType === self::ORG_EDITION) { + $this->databaseSegments = 0; + $buf = fread($this->filehandle, self::SEGMENT_RECORD_LENGTH); + for ($j = 0; $j < self::SEGMENT_RECORD_LENGTH; $j++) { + $this->databaseSegments += (ord($buf[$j]) << ($j * 8)); + } + if ($this->databaseType === self::ORG_EDITION) { + $this->recordLength = self::ORG_RECORD_LENGTH; + } + } + break; + } else { + fseek($this->filehandle, -4, SEEK_CUR); + } + } + if ($this->databaseType === self::COUNTRY_EDITION) { + $this->databaseSegments = self::COUNTRY_BEGIN; + } + fseek($this->filehandle, $filepos, SEEK_SET); + + } + } + + /** + * Closes the geoip database. + * + * @return int Status of close command. + */ + public function close() + { + if ($this->flags & self::SHARED_MEMORY) { + return shmop_close($this->shmid); + } else { + // right now even if file was cached in RAM the file was not closed + // so it's safe to expect no error w/ fclose() + return fclose($this->filehandle); + } + } + + /** + * Get the country index. + * + * This method is called by the lookupCountryCode() and lookupCountryName() + * methods. It lookups up the index ('id') for the country which is the key + * for the code and name. + * + * @param string $addr IP address (hostname not allowed) + * + * @throws PEAR_Exception - if IP address is invalid. + * - if database type is incorrect + * + * @return string ID for the country + */ + protected function lookupCountryId($addr) + { + $ipnum = ip2long($addr); + if ($ipnum === false) { + throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP); + } + if ($this->databaseType !== self::COUNTRY_EDITION) { + throw new PEAR_Exception("Invalid database type; lookupCountry*() methods expect Country database."); + } + return $this->seekCountry($ipnum) - self::COUNTRY_BEGIN; + } + + /** + * Returns 2-letter country code (e.g. 'CA') for specified IP address. + * Use this method if you have a Country database. + * + * @param string $addr IP address (hostname not allowed). + * + * @return string 2-letter country code + * + * @throws PEAR_Exception (see lookupCountryId()) + * @see lookupCountryId() + */ + public function lookupCountryCode($addr) + { + return self::$COUNTRY_CODES[$this->lookupCountryId($addr)]; + } + + /** + * Returns full country name for specified IP address. + * Use this method if you have a Country database. + * + * @param string $addr IP address (hostname not allowed). + * + * @return string Country name + * @throws PEAR_Exception (see lookupCountryId()) + * @see lookupCountryId() + */ + public function lookupCountryName($addr) + { + return self::$COUNTRY_NAMES[$this->lookupCountryId($addr)]; + } + + /** + * Using the record length and appropriate start points, seek to the country that corresponds + * to the converted IP address integer. + * + * @param int $ipnum Result of ip2long() conversion. + * + * @return int Offset of start of record. + * @throws PEAR_Exception - if fseek() fails on the file or no results after traversing the database (indicating corrupt db). + */ + protected function seekCountry($ipnum) + { + $offset = 0; + for ($depth = 31; $depth >= 0; --$depth) { + if ($this->flags & self::MEMORY_CACHE) { + $buf = substr($this->memoryBuffer, 2 * $this->recordLength * $offset, 2 * $this->recordLength); + } elseif ($this->flags & self::SHARED_MEMORY) { + $buf = shmop_read($this->shmid, 2 * $this->recordLength * $offset, 2 * $this->recordLength); + } else { + if (fseek($this->filehandle, 2 * $this->recordLength * $offset, SEEK_SET) !== 0) { + throw new PEAR_Exception("fseek failed"); + } + $buf = fread($this->filehandle, 2 * $this->recordLength); + } + $x = array(0,0); + for ($i = 0; $i < 2; ++$i) { + for ($j = 0; $j < $this->recordLength; ++$j) { + $x[$i] += ord($buf[$this->recordLength * $i + $j]) << ($j * 8); + } + } + if ($ipnum & (1 << $depth)) { + if ($x[1] >= $this->databaseSegments) { + return $x[1]; + } + $offset = $x[1]; + } else { + if ($x[0] >= $this->databaseSegments) { + return $x[0]; + } + $offset = $x[0]; + } + } + throw new PEAR_Exception("Error traversing database - perhaps it is corrupt?"); + } + + /** + * Lookup the organization (or ISP) for given IP address. + * Use this method if you have an Organization/ISP database. + * + * @param string $addr IP address (hostname not allowed). + * + * @throws PEAR_Exception - if IP address is invalid. + * - if database is of wrong type + * + * @return string The organization + */ + public function lookupOrg($addr) + { + $ipnum = ip2long($addr); + if ($ipnum === false) { + throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP); + } + if ($this->databaseType !== self::ORG_EDITION) { + throw new PEAR_Exception("Invalid database type; lookupOrg() method expects Org/ISP database.", self::ERR_DB_FORMAT); + } + return $this->getOrg($ipnum); + } + + /** + * Lookup the region for given IP address. + * Use this method if you have a Region database. + * + * @param string $addr IP address (hostname not allowed). + * + * @return array Array containing country code and region: array($country_code, $region) + * + * @throws PEAR_Exception - if IP address is invalid. + */ + public function lookupRegion($addr) + { + $ipnum = ip2long($addr); + if ($ipnum === false) { + throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP); + } + if ($this->databaseType !== self::REGION_EDITION_REV0 && $this->databaseType !== self::REGION_EDITION_REV1) { + throw new PEAR_Exception("Invalid database type; lookupRegion() method expects Region database.", self::ERR_DB_FORMAT); + } + return $this->getRegion($ipnum); + } + + /** + * Lookup the location record for given IP address. + * Use this method if you have a City database. + * + * @param string $addr IP address (hostname not allowed). + * + * @return Net_GeoIP_Location The full location record. + * + * @throws PEAR_Exception - if IP address is invalid. + */ + public function lookupLocation($addr) + { + include_once 'Net/GeoIP/Location.php'; + $ipnum = ip2long($addr); + if ($ipnum === false) { + throw new PEAR_Exception("Invalid IP address: " . var_export($addr, true), self::ERR_INVALID_IP); + } + if ($this->databaseType !== self::CITY_EDITION_REV0 && $this->databaseType !== self::CITY_EDITION_REV1) { + throw new PEAR_Exception("Invalid database type; lookupLocation() method expects City database."); + } + return $this->getRecord($ipnum); + } + + /** + * Seek and return organization (or ISP) name for converted IP addr. + * + * @param int $ipnum Converted IP address. + * + * @return string The organization + */ + protected function getOrg($ipnum) + { + $seek_org = $this->seekCountry($ipnum); + if ($seek_org == $this->databaseSegments) { + return null; + } + $record_pointer = $seek_org + (2 * $this->recordLength - 1) * $this->databaseSegments; + if ($this->flags & self::SHARED_MEMORY) { + $org_buf = shmop_read($this->shmid, $record_pointer, self::MAX_ORG_RECORD_LENGTH); + } else { + fseek($this->filehandle, $record_pointer, SEEK_SET); + $org_buf = fread($this->filehandle, self::MAX_ORG_RECORD_LENGTH); + } + $org_buf = substr($org_buf, 0, strpos($org_buf, 0)); + return $org_buf; + } + + /** + * Seek and return the region info (array containing country code and region name) for converted IP addr. + * + * @param int $ipnum Converted IP address. + * + * @return array Array containing country code and region: array($country_code, $region) + */ + protected function getRegion($ipnum) + { + if ($this->databaseType == self::REGION_EDITION_REV0) { + $seek_region = $this->seekCountry($ipnum) - self::STATE_BEGIN_REV0; + if ($seek_region >= 1000) { + $country_code = "US"; + $region = chr(($seek_region - 1000)/26 + 65) . chr(($seek_region - 1000)%26 + 65); + } else { + $country_code = self::$COUNTRY_CODES[$seek_region]; + $region = ""; + } + return array($country_code, $region); + } elseif ($this->databaseType == self::REGION_EDITION_REV1) { + $seek_region = $this->seekCountry($ipnum) - self::STATE_BEGIN_REV1; + //print $seek_region; + if ($seek_region < self::US_OFFSET) { + $country_code = ""; + $region = ""; + } elseif ($seek_region < self::CANADA_OFFSET) { + $country_code = "US"; + $region = chr(($seek_region - self::US_OFFSET)/26 + 65) . chr(($seek_region - self::US_OFFSET)%26 + 65); + } elseif ($seek_region < self::WORLD_OFFSET) { + $country_code = "CA"; + $region = chr(($seek_region - self::CANADA_OFFSET)/26 + 65) . chr(($seek_region - self::CANADA_OFFSET)%26 + 65); + } else { + $country_code = self::$COUNTRY_CODES[($seek_region - self::WORLD_OFFSET) / self::FIPS_RANGE]; + $region = ""; + } + return array ($country_code,$region); + } + } + + /** + * Seek and populate Net_GeoIP_Location object for converted IP addr. + * Note: this + * + * @param int $ipnum Converted IP address. + * + * @return Net_GeoIP_Location + */ + protected function getRecord($ipnum) + { + $seek_country = $this->seekCountry($ipnum); + if ($seek_country == $this->databaseSegments) { + return null; + } + + $record_pointer = $seek_country + (2 * $this->recordLength - 1) * $this->databaseSegments; + + if ($this->flags & self::SHARED_MEMORY) { + $record_buf = shmop_read($this->shmid, $record_pointer, self::FULL_RECORD_LENGTH); + } else { + fseek($this->filehandle, $record_pointer, SEEK_SET); + $record_buf = fread($this->filehandle, self::FULL_RECORD_LENGTH); + } + + $record = new Net_GeoIP_Location(); + + $record_buf_pos = 0; + $char = ord(substr($record_buf, $record_buf_pos, 1)); + + $record->countryCode = self::$COUNTRY_CODES[$char]; + $record->countryCode3 = self::$COUNTRY_CODES3[$char]; + $record->countryName = self::$COUNTRY_NAMES[$char]; + $record_buf_pos++; + $str_length = 0; + + //get region + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + } + if ($str_length > 0) { + $record->region = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + + //get city + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + } + if ($str_length > 0) { + $record->city = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + + //get postal code + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos+$str_length, 1)); + } + if ($str_length > 0) { + $record->postalCode = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; + $latitude = 0; + $longitude = 0; + for ($j = 0;$j < 3; ++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $latitude += ($char << ($j * 8)); + } + $record->latitude = ($latitude/10000) - 180; + + for ($j = 0;$j < 3; ++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $longitude += ($char << ($j * 8)); + } + $record->longitude = ($longitude/10000) - 180; + + if ($this->databaseType === self::CITY_EDITION_REV1) { + $dmaarea_combo = 0; + if ($record->countryCode == "US") { + for ($j = 0;$j < 3;++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $dmaarea_combo += ($char << ($j * 8)); + } + $record->dmaCode = floor($dmaarea_combo/1000); + $record->areaCode = $dmaarea_combo%1000; + } + } + + return $record; + } + +} + diff --git a/lib/pear/Net/GeoIP/DMA.php b/lib/pear/Net/GeoIP/DMA.php new file mode 100644 index 00000000000..412254df088 --- /dev/null +++ b/lib/pear/Net/GeoIP/DMA.php @@ -0,0 +1,315 @@ + (original Maxmind version) | + * | Hans Lellelid | + * +----------------------------------------------------------------------+ + * + * @category Net + * @package Net_GeoIP + * @author Hans Lellelid + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @link http://pear.php.net/package/Net_GeoIp + * $Id$ + */ + +/** + * Static class to handle mapping of DMA codes to metro regions. + * + * Use this class with the dmaCode property of the Net_GeoIpLocation object. + * + * + * $region = Net_GeoIPDMA::getMetroRegion($record->dmaCode); + * + * + * @category Net + * @package Net_GeoIP + * @author Hans Lellelid + * @author Dmitri Snytkine + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @version $Revision$ + * @link http://pear.php.net/package/Net_GeoIp + */ +class Net_GeoIP_DMA +{ + /** + * Holds DMA -> Metro mapping. + * @var array + */ + private static $dmaMap; + + /** + * Initialize + * + * @return void + */ + public static function initialize() + { + self::$dmaMap = array( + 500 => 'Portland-Auburn, ME', + 501 => 'New York, NY', + 502 => 'Binghamton, NY', + 503 => 'Macon, GA', + 504 => 'Philadelphia, PA', + 505 => 'Detroit, MI', + 506 => 'Boston, MA', + 507 => 'Savannah, GA', + 508 => 'Pittsburgh, PA', + 509 => 'Ft Wayne, IN', + 510 => 'Cleveland, OH', + 511 => 'Washington, DC', + 512 => 'Baltimore, MD', + 513 => 'Flint, MI', + 514 => 'Buffalo, NY', + 515 => 'Cincinnati, OH', + 516 => 'Erie, PA', + 517 => 'Charlotte, NC', + 518 => 'Greensboro, NC', + 519 => 'Charleston, SC', + 520 => 'Augusta, GA', + 521 => 'Providence, RI', + 522 => 'Columbus, GA', + 523 => 'Burlington, VT', + 524 => 'Atlanta, GA', + 525 => 'Albany, GA', + 526 => 'Utica-Rome, NY', + 527 => 'Indianapolis, IN', + 528 => 'Miami, FL', + 529 => 'Louisville, KY', + 530 => 'Tallahassee, FL', + 531 => 'Tri-Cities, TN', + 532 => 'Albany-Schenectady-Troy, NY', + 533 => 'Hartford, CT', + 534 => 'Orlando, FL', + 535 => 'Columbus, OH', + 536 => 'Youngstown-Warren, OH', + 537 => 'Bangor, ME', + 538 => 'Rochester, NY', + 539 => 'Tampa, FL', + 540 => 'Traverse City-Cadillac, MI', + 541 => 'Lexington, KY', + 542 => 'Dayton, OH', + 543 => 'Springfield-Holyoke, MA', + 544 => 'Norfolk-Portsmouth, VA', + 545 => 'Greenville-New Bern-Washington, NC', + 546 => 'Columbia, SC', + 547 => 'Toledo, OH', + 548 => 'West Palm Beach, FL', + 549 => 'Watertown, NY', + 550 => 'Wilmington, NC', + 551 => 'Lansing, MI', + 552 => 'Presque Isle, ME', + 553 => 'Marquette, MI', + 554 => 'Wheeling, WV', + 555 => 'Syracuse, NY', + 556 => 'Richmond-Petersburg, VA', + 557 => 'Knoxville, TN', + 558 => 'Lima, OH', + 559 => 'Bluefield-Beckley-Oak Hill, WV', + 560 => 'Raleigh-Durham, NC', + 561 => 'Jacksonville, FL', + 563 => 'Grand Rapids, MI', + 564 => 'Charleston-Huntington, WV', + 565 => 'Elmira, NY', + 566 => 'Harrisburg-Lancaster-Lebanon-York, PA', + 567 => 'Greenville-Spartenburg, SC', + 569 => 'Harrisonburg, VA', + 570 => 'Florence-Myrtle Beach, SC', + 571 => 'Ft Myers, FL', + 573 => 'Roanoke-Lynchburg, VA', + 574 => 'Johnstown-Altoona, PA', + 575 => 'Chattanooga, TN', + 576 => 'Salisbury, MD', + 577 => 'Wilkes Barre-Scranton, PA', + 581 => 'Terre Haute, IN', + 582 => 'Lafayette, IN', + 583 => 'Alpena, MI', + 584 => 'Charlottesville, VA', + 588 => 'South Bend, IN', + 592 => 'Gainesville, FL', + 596 => 'Zanesville, OH', + 597 => 'Parkersburg, WV', + 598 => 'Clarksburg-Weston, WV', + 600 => 'Corpus Christi, TX', + 602 => 'Chicago, IL', + 603 => 'Joplin-Pittsburg, MO', + 604 => 'Columbia-Jefferson City, MO', + 605 => 'Topeka, KS', + 606 => 'Dothan, AL', + 609 => 'St Louis, MO', + 610 => 'Rockford, IL', + 611 => 'Rochester-Mason City-Austin, MN', + 612 => 'Shreveport, LA', + 613 => 'Minneapolis-St Paul, MN', + 616 => 'Kansas City, MO', + 617 => 'Milwaukee, WI', + 618 => 'Houston, TX', + 619 => 'Springfield, MO', + 620 => 'Tuscaloosa, AL', + 622 => 'New Orleans, LA', + 623 => 'Dallas-Fort Worth, TX', + 624 => 'Sioux City, IA', + 625 => 'Waco-Temple-Bryan, TX', + 626 => 'Victoria, TX', + 627 => 'Wichita Falls, TX', + 628 => 'Monroe, LA', + 630 => 'Birmingham, AL', + 631 => 'Ottumwa-Kirksville, IA', + 632 => 'Paducah, KY', + 633 => 'Odessa-Midland, TX', + 634 => 'Amarillo, TX', + 635 => 'Austin, TX', + 636 => 'Harlingen, TX', + 637 => 'Cedar Rapids-Waterloo, IA', + 638 => 'St Joseph, MO', + 639 => 'Jackson, TN', + 640 => 'Memphis, TN', + 641 => 'San Antonio, TX', + 642 => 'Lafayette, LA', + 643 => 'Lake Charles, LA', + 644 => 'Alexandria, LA', + 646 => 'Anniston, AL', + 647 => 'Greenwood-Greenville, MS', + 648 => 'Champaign-Springfield-Decatur, IL', + 649 => 'Evansville, IN', + 650 => 'Oklahoma City, OK', + 651 => 'Lubbock, TX', + 652 => 'Omaha, NE', + 656 => 'Panama City, FL', + 657 => 'Sherman, TX', + 658 => 'Green Bay-Appleton, WI', + 659 => 'Nashville, TN', + 661 => 'San Angelo, TX', + 662 => 'Abilene-Sweetwater, TX', + 669 => 'Madison, WI', + 670 => 'Ft Smith-Fay-Springfield, AR', + 671 => 'Tulsa, OK', + 673 => 'Columbus-Tupelo-West Point, MS', + 675 => 'Peoria-Bloomington, IL', + 676 => 'Duluth, MN', + 678 => 'Wichita, KS', + 679 => 'Des Moines, IA', + 682 => 'Davenport-Rock Island-Moline, IL', + 686 => 'Mobile, AL', + 687 => 'Minot-Bismarck-Dickinson, ND', + 691 => 'Huntsville, AL', + 692 => 'Beaumont-Port Author, TX', + 693 => 'Little Rock-Pine Bluff, AR', + 698 => 'Montgomery, AL', + 702 => 'La Crosse-Eau Claire, WI', + 705 => 'Wausau-Rhinelander, WI', + 709 => 'Tyler-Longview, TX', + 710 => 'Hattiesburg-Laurel, MS', + 711 => 'Meridian, MS', + 716 => 'Baton Rouge, LA', + 717 => 'Quincy, IL', + 718 => 'Jackson, MS', + 722 => 'Lincoln-Hastings, NE', + 724 => 'Fargo-Valley City, ND', + 725 => 'Sioux Falls, SD', + 734 => 'Jonesboro, AR', + 736 => 'Bowling Green, KY', + 737 => 'Mankato, MN', + 740 => 'North Platte, NE', + 743 => 'Anchorage, AK', + 744 => 'Honolulu, HI', + 745 => 'Fairbanks, AK', + 746 => 'Biloxi-Gulfport, MS', + 747 => 'Juneau, AK', + 749 => 'Laredo, TX', + 751 => 'Denver, CO', + 752 => 'Colorado Springs, CO', + 753 => 'Phoenix, AZ', + 754 => 'Butte-Bozeman, MT', + 755 => 'Great Falls, MT', + 756 => 'Billings, MT', + 757 => 'Boise, ID', + 758 => 'Idaho Falls-Pocatello, ID', + 759 => 'Cheyenne, WY', + 760 => 'Twin Falls, ID', + 762 => 'Missoula, MT', + 764 => 'Rapid City, SD', + 765 => 'El Paso, TX', + 766 => 'Helena, MT', + 767 => 'Casper-Riverton, WY', + 770 => 'Salt Lake City, UT', + 771 => 'Yuma, AZ', + 773 => 'Grand Junction, CO', + 789 => 'Tucson, AZ', + 790 => 'Albuquerque, NM', + 798 => 'Glendive, MT', + 800 => 'Bakersfield, CA', + 801 => 'Eugene, OR', + 802 => 'Eureka, CA', + 803 => 'Los Angeles, CA', + 804 => 'Palm Springs, CA', + 807 => 'San Francisco, CA', + 810 => 'Yakima-Pasco, WA', + 811 => 'Reno, NV', + 813 => 'Medford-Klamath Falls, OR', + 819 => 'Seattle-Tacoma, WA', + 820 => 'Portland, OR', + 821 => 'Bend, OR', + 825 => 'San Diego, CA', + 828 => 'Monterey-Salinas, CA', + 839 => 'Las Vegas, NV', + 855 => 'Santa Barbara, CA', + 862 => 'Sacramento, CA', + 866 => 'Fresno, CA', + 868 => 'Chico-Redding, CA', + 881 => 'Spokane, WA'); + } + + /** + * Lookup the metro region based on the provided DMA code. + * + * @param int $dmaCode The DMA code + * + * @return string Metro region name. + */ + public static function getMetroRegion($dmaCode) + { + if ($dmaCode === null) { + return null; + } + if (self::$dmaMap === null) { + self::initialize(); + } + return self::$dmaMap[$dmaCode]; + } + + /** + * Reverse lookup of DMA code if [exact] metro region name is known. + * + * @param string $metro Metro region name. + * + * @return int DMA code, or false if not found. + */ + public static function getDMACode($metro) + { + if (self::$dmaMap === null) { + self::initialize(); + } + return array_search($metro, self::$dmaMap); + } + +} \ No newline at end of file diff --git a/lib/pear/Net/GeoIP/Location.php b/lib/pear/Net/GeoIP/Location.php new file mode 100644 index 00000000000..2b70f6d3a57 --- /dev/null +++ b/lib/pear/Net/GeoIP/Location.php @@ -0,0 +1,201 @@ + (original Maxmind version) | + * | Hans Lellelid | + * +----------------------------------------------------------------------+ + * + * @category Net + * @package Net_GeoIP + * @author Hans Lellelid + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @link http://pear.php.net/package/Net_GeoIp + * $Id$ + */ + +/** + * This class represents a location record as returned by Net_GeoIP::lookupLocation(). + * + * This class is primarily a collection of values (the public properties of the class), but + * there is also a distance() method to calculate the km distance between two points. + * + * @category Net + * @package Net_GeoIP + * @author Hans Lellelid + * @author Dmitri Snytkine + * @license LGPL http://www.gnu.org/licenses/lgpl.txt + * @version $Revision$ + * @link http://pear.php.net/package/Net_GeoIp + * @see Net_GeoIP::lookupLocation() + */ +class Net_GeoIP_Location implements Serializable +{ + protected $aData = array( + 'countryCode' => null, + 'countryCode3' => null, + 'countryName' => null, + 'region' => null, + 'city' => null, + 'postalCode' => null, + 'latitude' => null, + 'longitude' => null, + 'areaCode' => null, + 'dmaCode' => null + ); + + + /** + * Calculate the distance in km between two points. + * + * @param Net_GeoIP_Location $loc The other point to which distance will be calculated. + * + * @return float The number of km between two points on the globe. + */ + public function distance(Net_GeoIP_Location $loc) + { + // ideally these should be class constants, but class constants + // can't be operations. + $RAD_CONVERT = M_PI / 180; + $EARTH_DIAMETER = 2 * 6378.2; + + $lat1 = $this->latitude; + $lon1 = $this->longitude; + $lat2 = $loc->latitude; + $lon2 = $loc->longitude; + + // convert degrees to radians + $lat1 *= $RAD_CONVERT; + $lat2 *= $RAD_CONVERT; + + // find the deltas + $delta_lat = $lat2 - $lat1; + $delta_lon = ($lon2 - $lon1) * $RAD_CONVERT; + + // Find the great circle distance + $temp = pow(sin($delta_lat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($delta_lon/2), 2); + return $EARTH_DIAMETER * atan2(sqrt($temp), sqrt(1-$temp)); + } + + /** + * magic method to make it possible + * to store this object in cache when + * automatic serialization is on + * Specifically it makes it possible to store + * this object in memcache + * + * @return array + */ + public function serialize() + { + return serialize($this->aData); + } + + /** + * unserialize a representation of the object + * + * @param array $serialized The serialized representation of the location + * + * @return void + */ + public function unserialize($serialized) + { + $this->aData = unserialize($serialized); + } + + + /** + * Setter for elements of $this->aData array + * + * @param string $name The variable to set + * @param string $val The value + * + * @return object $this object + */ + public function set($name, $val) + { + if (array_key_exists($name, $this->aData)) { + $this->aData[$name] = $val; + } + + return $this; + } + + public function __set($name, $val) + { + return $this->set($name, $val); + } + + /** + * Getter for $this->aData array + * + * @return array + */ + public function getData() + { + return $this->aData; + } + + + /** + * Magic method to get value from $this->aData array + * + * @param string $name The var to get + * + * @return mixed string if value exists or null if it is empty of + * just does not exist + */ + public function __get($name) + { + if (array_key_exists($name, $this->aData)) { + return $this->aData[$name]; + } + + return null; + } + + + /** + * String representation of the object + * + * @return string text and result of print_r of $this->aData array + */ + public function __toString() + { + return 'object of type '.__CLASS__.'. data: '.implode(',', $this->aData); + } + + + /** + * Magic method + * makes it possible to check if specific record exists + * and also makes it possible to use empty() on any property + * + * @param strign $name The name of the var to check + * + * @return bool + */ + public function __isset($name) + { + return (null !== $this->__get($name)); + } + +} diff --git a/lib/thirdpartylibs.xml b/lib/thirdpartylibs.xml index 58cb6a8af21..f77c52ad291 100644 --- a/lib/thirdpartylibs.xml +++ b/lib/thirdpartylibs.xml @@ -57,10 +57,10 @@ - geoip + PEAR_GeoIP GeoIP LGPL - 1.8 + 1.0.0RC3 2.1+