UNPKG

tldts-icann

Version:

Library to work against complex domain names, subdomains and URIs. Only contains ICANN section.

563 lines (553 loc) 130 kB
'use strict'; /** * Check if `vhost` is a valid suffix of `hostname` (top-domain) * * It means that `vhost` needs to be a suffix of `hostname` and we then need to * make sure that: either they are equal, or the character preceding `vhost` in * `hostname` is a '.' (it should not be a partial label). * * * hostname = 'not.evil.com' and vhost = 'vil.com' => not ok * * hostname = 'not.evil.com' and vhost = 'evil.com' => ok * * hostname = 'not.evil.com' and vhost = 'not.evil.com' => ok */ function shareSameDomainSuffix(hostname, vhost) { if (hostname.endsWith(vhost)) { return (hostname.length === vhost.length || hostname[hostname.length - vhost.length - 1] === '.'); } return false; } /** * Given a hostname and its public suffix, extract the general domain. */ function extractDomainWithSuffix(hostname, publicSuffix) { // Locate the index of the last '.' in the part of the `hostname` preceding // the public suffix. // // examples: // 1. not.evil.co.uk => evil.co.uk // ^ ^ // | | start of public suffix // | index of the last dot // // 2. example.co.uk => example.co.uk // ^ ^ // | | start of public suffix // | // | (-1) no dot found before the public suffix const publicSuffixIndex = hostname.length - publicSuffix.length - 2; const lastDotBeforeSuffixIndex = hostname.lastIndexOf('.', publicSuffixIndex); // No '.' found, then `hostname` is the general domain (no sub-domain) if (lastDotBeforeSuffixIndex === -1) { return hostname; } // Extract the part between the last '.' return hostname.slice(lastDotBeforeSuffixIndex + 1); } /** * Detects the domain based on rules and upon and a host string */ function getDomain$1(suffix, hostname, options) { // Check if `hostname` ends with a member of `validHosts`. if (options.validHosts !== null) { const validHosts = options.validHosts; for (const vhost of validHosts) { if ( /*@__INLINE__*/shareSameDomainSuffix(hostname, vhost)) { return vhost; } } } let numberOfLeadingDots = 0; if (hostname.startsWith('.')) { while (numberOfLeadingDots < hostname.length && hostname[numberOfLeadingDots] === '.') { numberOfLeadingDots += 1; } } // If `hostname` is a valid public suffix, then there is no domain to return. // Since we already know that `getPublicSuffix` returns a suffix of `hostname` // there is no need to perform a string comparison and we only compare the // size. if (suffix.length === hostname.length - numberOfLeadingDots) { return null; } // To extract the general domain, we start by identifying the public suffix // (if any), then consider the domain to be the public suffix with one added // level of depth. (e.g.: if hostname is `not.evil.co.uk` and public suffix: // `co.uk`, then we take one more level: `evil`, giving the final result: // `evil.co.uk`). return /*@__INLINE__*/ extractDomainWithSuffix(hostname, suffix); } /** * Return the part of domain without suffix. * * Example: for domain 'foo.com', the result would be 'foo'. */ function getDomainWithoutSuffix$1(domain, suffix) { // Note: here `domain` and `suffix` cannot have the same length because in // this case we set `domain` to `null` instead. It is thus safe to assume // that `suffix` is shorter than `domain`. return domain.slice(0, -suffix.length - 1); } /** * @param url - URL we want to extract a hostname from. * @param urlIsValidHostname - hint from caller; true if `url` is already a valid hostname. */ function extractHostname(url, urlIsValidHostname) { let start = 0; let end = url.length; let hasUpper = false; // If url is not already a valid hostname, then try to extract hostname. if (!urlIsValidHostname) { // Special handling of data URLs if (url.startsWith('data:')) { return null; } // Trim leading spaces while (start < url.length && url.charCodeAt(start) <= 32) { start += 1; } // Trim trailing spaces while (end > start + 1 && url.charCodeAt(end - 1) <= 32) { end -= 1; } // Skip scheme. if (url.charCodeAt(start) === 47 /* '/' */ && url.charCodeAt(start + 1) === 47 /* '/' */) { start += 2; } else { const indexOfProtocol = url.indexOf(':/', start); if (indexOfProtocol !== -1) { // Implement fast-path for common protocols. We expect most protocols // should be one of these 4 and thus we will not need to perform the // more expansive validity check most of the time. const protocolSize = indexOfProtocol - start; const c0 = url.charCodeAt(start); const c1 = url.charCodeAt(start + 1); const c2 = url.charCodeAt(start + 2); const c3 = url.charCodeAt(start + 3); const c4 = url.charCodeAt(start + 4); if (protocolSize === 5 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */ && c4 === 115 /* 's' */) ; else if (protocolSize === 4 && c0 === 104 /* 'h' */ && c1 === 116 /* 't' */ && c2 === 116 /* 't' */ && c3 === 112 /* 'p' */) ; else if (protocolSize === 3 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */ && c2 === 115 /* 's' */) ; else if (protocolSize === 2 && c0 === 119 /* 'w' */ && c1 === 115 /* 's' */) ; else { // Check that scheme is valid for (let i = start; i < indexOfProtocol; i += 1) { const lowerCaseCode = url.charCodeAt(i) | 32; if (!(((lowerCaseCode >= 97 && lowerCaseCode <= 122) || // [a, z] (lowerCaseCode >= 48 && lowerCaseCode <= 57) || // [0, 9] lowerCaseCode === 46 || // '.' lowerCaseCode === 45 || // '-' lowerCaseCode === 43) // '+' )) { return null; } } } // Skip 0, 1 or more '/' after ':/' start = indexOfProtocol + 2; while (url.charCodeAt(start) === 47 /* '/' */) { start += 1; } } } // Detect first occurrence of '/', '?' or '#'. We also keep track of the // last occurrence of '@', ']' or ':' to speed-up subsequent parsing of // (respectively), identifier, ipv6 or port. let indexOfIdentifier = -1; let indexOfClosingBracket = -1; let indexOfPort = -1; for (let i = start; i < end; i += 1) { const code = url.charCodeAt(i); if (code === 35 || // '#' code === 47 || // '/' code === 63 // '?' ) { end = i; break; } else if (code === 64) { // '@' indexOfIdentifier = i; } else if (code === 93) { // ']' indexOfClosingBracket = i; } else if (code === 58) { // ':' indexOfPort = i; } else if (code >= 65 && code <= 90) { hasUpper = true; } } // Detect identifier: '@' if (indexOfIdentifier !== -1 && indexOfIdentifier > start && indexOfIdentifier < end) { start = indexOfIdentifier + 1; } // Handle ipv6 addresses if (url.charCodeAt(start) === 91 /* '[' */) { if (indexOfClosingBracket !== -1) { return url.slice(start + 1, indexOfClosingBracket).toLowerCase(); } return null; } else if (indexOfPort !== -1 && indexOfPort > start && indexOfPort < end) { // Detect port: ':' end = indexOfPort; } } // Trim trailing dots while (end > start + 1 && url.charCodeAt(end - 1) === 46 /* '.' */) { end -= 1; } const hostname = start !== 0 || end !== url.length ? url.slice(start, end) : url; if (hasUpper) { return hostname.toLowerCase(); } return hostname; } /** * Check if a hostname is an IP. You should be aware that this only works * because `hostname` is already garanteed to be a valid hostname! */ function isProbablyIpv4(hostname) { // Cannot be shorted than 1.1.1.1 if (hostname.length < 7) { return false; } // Cannot be longer than: 255.255.255.255 if (hostname.length > 15) { return false; } let numberOfDots = 0; for (let i = 0; i < hostname.length; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { numberOfDots += 1; } else if (code < 48 /* '0' */ || code > 57 /* '9' */) { return false; } } return (numberOfDots === 3 && hostname.charCodeAt(0) !== 46 /* '.' */ && hostname.charCodeAt(hostname.length - 1) !== 46 /* '.' */); } /** * Similar to isProbablyIpv4. */ function isProbablyIpv6(hostname) { if (hostname.length < 3) { return false; } let start = hostname.startsWith('[') ? 1 : 0; let end = hostname.length; if (hostname[end - 1] === ']') { end -= 1; } // We only consider the maximum size of a normal IPV6. Note that this will // fail on so-called "IPv4 mapped IPv6 addresses" but this is a corner-case // and a proper validation library should be used for these. if (end - start > 39) { return false; } let hasColon = false; for (; start < end; start += 1) { const code = hostname.charCodeAt(start); if (code === 58 /* ':' */) { hasColon = true; } else if (!(((code >= 48 && code <= 57) || // 0-9 (code >= 97 && code <= 102) || // a-f (code >= 65 && code <= 90)) // A-F )) { return false; } } return hasColon; } /** * Check if `hostname` is *probably* a valid ip addr (either ipv6 or ipv4). * This *will not* work on any string. We need `hostname` to be a valid * hostname. */ function isIp(hostname) { return isProbablyIpv6(hostname) || isProbablyIpv4(hostname); } /** * Implements fast shallow verification of hostnames. This does not perform a * struct check on the content of labels (classes of Unicode characters, etc.) * but instead check that the structure is valid (number of labels, length of * labels, etc.). * * If you need stricter validation, consider using an external library. */ function isValidAscii(code) { return ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code > 127); } /** * Check if a hostname string is valid. It's usually a preliminary check before * trying to use getDomain or anything else. * * Beware: it does not check if the TLD exists. */ function isValidHostname (hostname) { if (hostname.length > 255) { return false; } if (hostname.length === 0) { return false; } if ( /*@__INLINE__*/ !isValidAscii(hostname.charCodeAt(0)) && hostname.charCodeAt(0) !== 46 && // '.' (dot) hostname.charCodeAt(0) !== 95 // '_' (underscore) ) { return false; } // Validate hostname according to RFC let lastDotIndex = -1; let lastCharCode = -1; const len = hostname.length; for (let i = 0; i < len; i += 1) { const code = hostname.charCodeAt(i); if (code === 46 /* '.' */) { if ( // Check that previous label is < 63 bytes long (64 = 63 + '.') i - lastDotIndex > 64 || // Check that previous character was not already a '.' lastCharCode === 46 || // Check that the previous label does not end with a '-' (dash) lastCharCode === 45 || // Check that the previous label does not end with a '_' (underscore) lastCharCode === 95) { return false; } lastDotIndex = i; } else if (!( /*@__INLINE__*/(isValidAscii(code) || code === 45 || code === 95))) { // Check if there is a forbidden character in the label return false; } lastCharCode = code; } return ( // Check that last label is shorter than 63 chars len - lastDotIndex - 1 <= 63 && // Check that the last character is an allowed trailing label character. // Since we already checked that the char is a valid hostname character, // we only need to check that it's different from '-'. lastCharCode !== 45); } function setDefaultsImpl({ allowIcannDomains = true, allowPrivateDomains = false, detectIp = true, extractHostname = true, mixedInputs = true, validHosts = null, validateHostname = true, }) { return { allowIcannDomains, allowPrivateDomains, detectIp, extractHostname, mixedInputs, validHosts, validateHostname, }; } const DEFAULT_OPTIONS = /*@__INLINE__*/ setDefaultsImpl({}); function setDefaults(options) { if (options === undefined) { return DEFAULT_OPTIONS; } return /*@__INLINE__*/ setDefaultsImpl(options); } /** * Returns the subdomain of a hostname string */ function getSubdomain$1(hostname, domain) { // If `hostname` and `domain` are the same, then there is no sub-domain if (domain.length === hostname.length) { return ''; } return hostname.slice(0, -domain.length - 1); } /** * Implement a factory allowing to plug different implementations of suffix * lookup (e.g.: using a trie or the packed hashes datastructures). This is used * and exposed in `tldts.ts` and `tldts-experimental.ts` bundle entrypoints. */ function getEmptyResult() { return { domain: null, domainWithoutSuffix: null, hostname: null, isIcann: null, isIp: null, isPrivate: null, publicSuffix: null, subdomain: null, }; } function resetResult(result) { result.domain = null; result.domainWithoutSuffix = null; result.hostname = null; result.isIcann = null; result.isIp = null; result.isPrivate = null; result.publicSuffix = null; result.subdomain = null; } function parseImpl(url, step, suffixLookup, partialOptions, result) { const options = /*@__INLINE__*/ setDefaults(partialOptions); // Very fast approximate check to make sure `url` is a string. This is needed // because the library will not necessarily be used in a typed setup and // values of arbitrary types might be given as argument. if (typeof url !== 'string') { return result; } // Extract hostname from `url` only if needed. This can be made optional // using `options.extractHostname`. This option will typically be used // whenever we are sure the inputs to `parse` are already hostnames and not // arbitrary URLs. // // `mixedInput` allows to specify if we expect a mix of URLs and hostnames // as input. If only hostnames are expected then `extractHostname` can be // set to `false` to speed-up parsing. If only URLs are expected then // `mixedInputs` can be set to `false`. The `mixedInputs` is only a hint // and will not change the behavior of the library. if (!options.extractHostname) { result.hostname = url; } else if (options.mixedInputs) { result.hostname = extractHostname(url, isValidHostname(url)); } else { result.hostname = extractHostname(url, false); } if (step === 0 /* FLAG.HOSTNAME */ || result.hostname === null) { return result; } // Check if `hostname` is a valid ip address if (options.detectIp) { result.isIp = isIp(result.hostname); if (result.isIp) { return result; } } // Perform optional hostname validation. If hostname is not valid, no need to // go further as there will be no valid domain or sub-domain. if (options.validateHostname && options.extractHostname && !isValidHostname(result.hostname)) { result.hostname = null; return result; } // Extract public suffix suffixLookup(result.hostname, options, result); if (step === 2 /* FLAG.PUBLIC_SUFFIX */ || result.publicSuffix === null) { return result; } // Extract domain result.domain = getDomain$1(result.publicSuffix, result.hostname, options); if (step === 3 /* FLAG.DOMAIN */ || result.domain === null) { return result; } // Extract subdomain result.subdomain = getSubdomain$1(result.hostname, result.domain); if (step === 4 /* FLAG.SUB_DOMAIN */) { return result; } // Extract domain without suffix result.domainWithoutSuffix = getDomainWithoutSuffix$1(result.domain, result.publicSuffix); return result; } function fastPathLookup (hostname, options, out) { // Fast path for very popular suffixes; this allows to by-pass lookup // completely as well as any extra allocation or string manipulation. if (!options.allowPrivateDomains && hostname.length > 3) { const last = hostname.length - 1; const c3 = hostname.charCodeAt(last); const c2 = hostname.charCodeAt(last - 1); const c1 = hostname.charCodeAt(last - 2); const c0 = hostname.charCodeAt(last - 3); if (c3 === 109 /* 'm' */ && c2 === 111 /* 'o' */ && c1 === 99 /* 'c' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'com'; return true; } else if (c3 === 103 /* 'g' */ && c2 === 114 /* 'r' */ && c1 === 111 /* 'o' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'org'; return true; } else if (c3 === 117 /* 'u' */ && c2 === 100 /* 'd' */ && c1 === 101 /* 'e' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'edu'; return true; } else if (c3 === 118 /* 'v' */ && c2 === 111 /* 'o' */ && c1 === 103 /* 'g' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'gov'; return true; } else if (c3 === 116 /* 't' */ && c2 === 101 /* 'e' */ && c1 === 110 /* 'n' */ && c0 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'net'; return true; } else if (c3 === 101 /* 'e' */ && c2 === 100 /* 'd' */ && c1 === 46 /* '.' */) { out.isIcann = true; out.isPrivate = false; out.publicSuffix = 'de'; return true; } } return false; } const exceptions = (function () { const _62 = [1, {}], _63 = [0, { "city": _62 }]; const exceptions = [0, { "ck": [0, { "www": _62 }], "jp": [0, { "kawasaki": _63, "kitakyushu": _63, "kobe": _63, "nagoya": _63, "sapporo": _63, "sendai": _63, "yokohama": _63 }] }]; return exceptions; })(); const rules = (function () { const _64 = [1, {}], _65 = [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "org": _64 }], _66 = [1, { "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], _67 = [1, { "gov": _64 }], _68 = [0, { "*": _64 }], _69 = [1, { "co": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], _70 = [1, { "com": _64, "edu": _64, "net": _64, "org": _64 }], _71 = [1, { "co": _64, "net": _64, "org": _64 }], _72 = [1, { "co": _64, "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "nom": _64, "org": _64 }], _73 = [1, { "biz": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "net": _64, "org": _64 }], _74 = [1, { "gs": _64 }], _75 = [0, { "nes": _64 }], _76 = [1, { "k12": _64, "cc": _64, "lib": _64 }], _77 = [1, { "cc": _64 }], _78 = [1, { "cc": _64, "lib": _64 }]; const rules = [0, { "ac": _65, "ad": _64, "ae": [1, { "ac": _64, "co": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "sch": _64 }], "aero": [1, { "airline": _64, "airport": _64, "accident-investigation": _64, "accident-prevention": _64, "aerobatic": _64, "aeroclub": _64, "aerodrome": _64, "agents": _64, "air-surveillance": _64, "air-traffic-control": _64, "aircraft": _64, "airtraffic": _64, "ambulance": _64, "association": _64, "author": _64, "ballooning": _64, "broker": _64, "caa": _64, "cargo": _64, "catering": _64, "certification": _64, "championship": _64, "charter": _64, "civilaviation": _64, "club": _64, "conference": _64, "consultant": _64, "consulting": _64, "control": _64, "council": _64, "crew": _64, "design": _64, "dgca": _64, "educator": _64, "emergency": _64, "engine": _64, "engineer": _64, "entertainment": _64, "equipment": _64, "exchange": _64, "express": _64, "federation": _64, "flight": _64, "freight": _64, "fuel": _64, "gliding": _64, "government": _64, "groundhandling": _64, "group": _64, "hanggliding": _64, "homebuilt": _64, "insurance": _64, "journal": _64, "journalist": _64, "leasing": _64, "logistics": _64, "magazine": _64, "maintenance": _64, "marketplace": _64, "media": _64, "microlight": _64, "modelling": _64, "navigation": _64, "parachuting": _64, "paragliding": _64, "passenger-association": _64, "pilot": _64, "press": _64, "production": _64, "recreation": _64, "repbody": _64, "res": _64, "research": _64, "rotorcraft": _64, "safety": _64, "scientist": _64, "services": _64, "show": _64, "skydiving": _64, "software": _64, "student": _64, "taxi": _64, "trader": _64, "trading": _64, "trainer": _64, "union": _64, "workinggroup": _64, "works": _64 }], "af": _66, "ag": [1, { "co": _64, "com": _64, "net": _64, "nom": _64, "org": _64 }], "ai": [1, { "com": _64, "net": _64, "off": _64, "org": _64 }], "al": _65, "am": [1, { "co": _64, "com": _64, "commune": _64, "net": _64, "org": _64 }], "ao": [1, { "co": _64, "ed": _64, "edu": _64, "gov": _64, "gv": _64, "it": _64, "og": _64, "org": _64, "pb": _64 }], "aq": _64, "ar": [1, { "bet": _64, "com": _64, "coop": _64, "edu": _64, "gob": _64, "gov": _64, "int": _64, "mil": _64, "musica": _64, "mutual": _64, "net": _64, "org": _64, "senasa": _64, "tur": _64 }], "arpa": [1, { "e164": _64, "home": _64, "in-addr": _64, "ip6": _64, "iris": _64, "uri": _64, "urn": _64 }], "as": _67, "asia": _64, "at": [1, { "ac": [1, { "sth": _64 }], "co": _64, "gv": _64, "or": _64 }], "au": [1, { "asn": _64, "com": _64, "edu": [1, { "act": _64, "catholic": _64, "nsw": [1, { "schools": _64 }], "nt": _64, "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "gov": [1, { "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "id": _64, "net": _64, "org": _64, "conf": _64, "oz": _64, "act": _64, "nsw": _64, "nt": _64, "qld": _64, "sa": _64, "tas": _64, "vic": _64, "wa": _64 }], "aw": [1, { "com": _64 }], "ax": _64, "az": [1, { "biz": _64, "co": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "int": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "pp": _64, "pro": _64 }], "ba": _65, "bb": [1, { "biz": _64, "co": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "net": _64, "org": _64, "store": _64, "tv": _64 }], "bd": _68, "be": [1, { "ac": _64 }], "bf": _67, "bg": [1, { "0": _64, "1": _64, "2": _64, "3": _64, "4": _64, "5": _64, "6": _64, "7": _64, "8": _64, "9": _64, "a": _64, "b": _64, "c": _64, "d": _64, "e": _64, "f": _64, "g": _64, "h": _64, "i": _64, "j": _64, "k": _64, "l": _64, "m": _64, "n": _64, "o": _64, "p": _64, "q": _64, "r": _64, "s": _64, "t": _64, "u": _64, "v": _64, "w": _64, "x": _64, "y": _64, "z": _64 }], "bh": _66, "bi": [1, { "co": _64, "com": _64, "edu": _64, "or": _64, "org": _64 }], "biz": _64, "bj": [1, { "africa": _64, "agro": _64, "architectes": _64, "assur": _64, "avocats": _64, "co": _64, "com": _64, "eco": _64, "econo": _64, "edu": _64, "info": _64, "loisirs": _64, "money": _64, "net": _64, "org": _64, "ote": _64, "restaurant": _64, "resto": _64, "tourism": _64, "univ": _64 }], "bm": _66, "bn": _66, "bo": [1, { "com": _64, "edu": _64, "gob": _64, "int": _64, "mil": _64, "net": _64, "org": _64, "tv": _64, "web": _64, "academia": _64, "agro": _64, "arte": _64, "blog": _64, "bolivia": _64, "ciencia": _64, "cooperativa": _64, "democracia": _64, "deporte": _64, "ecologia": _64, "economia": _64, "empresa": _64, "indigena": _64, "industria": _64, "info": _64, "medicina": _64, "movimiento": _64, "musica": _64, "natural": _64, "nombre": _64, "noticias": _64, "patria": _64, "plurinacional": _64, "politica": _64, "profesional": _64, "pueblo": _64, "revista": _64, "salud": _64, "tecnologia": _64, "tksat": _64, "transporte": _64, "wiki": _64 }], "br": [1, { "9guacu": _64, "abc": _64, "adm": _64, "adv": _64, "agr": _64, "aju": _64, "am": _64, "anani": _64, "aparecida": _64, "app": _64, "arq": _64, "art": _64, "ato": _64, "b": _64, "barueri": _64, "belem": _64, "bet": _64, "bhz": _64, "bib": _64, "bio": _64, "blog": _64, "bmd": _64, "boavista": _64, "bsb": _64, "campinagrande": _64, "campinas": _64, "caxias": _64, "cim": _64, "cng": _64, "cnt": _64, "com": _64, "contagem": _64, "coop": _64, "coz": _64, "cri": _64, "cuiaba": _64, "curitiba": _64, "def": _64, "des": _64, "det": _64, "dev": _64, "ecn": _64, "eco": _64, "edu": _64, "emp": _64, "enf": _64, "eng": _64, "esp": _64, "etc": _64, "eti": _64, "far": _64, "feira": _64, "flog": _64, "floripa": _64, "fm": _64, "fnd": _64, "fortal": _64, "fot": _64, "foz": _64, "fst": _64, "g12": _64, "geo": _64, "ggf": _64, "goiania": _64, "gov": [1, { "ac": _64, "al": _64, "am": _64, "ap": _64, "ba": _64, "ce": _64, "df": _64, "es": _64, "go": _64, "ma": _64, "mg": _64, "ms": _64, "mt": _64, "pa": _64, "pb": _64, "pe": _64, "pi": _64, "pr": _64, "rj": _64, "rn": _64, "ro": _64, "rr": _64, "rs": _64, "sc": _64, "se": _64, "sp": _64, "to": _64 }], "gru": _64, "imb": _64, "ind": _64, "inf": _64, "jab": _64, "jampa": _64, "jdf": _64, "joinville": _64, "jor": _64, "jus": _64, "leg": _64, "leilao": _64, "lel": _64, "log": _64, "londrina": _64, "macapa": _64, "maceio": _64, "manaus": _64, "maringa": _64, "mat": _64, "med": _64, "mil": _64, "morena": _64, "mp": _64, "mus": _64, "natal": _64, "net": _64, "niteroi": _64, "nom": _68, "not": _64, "ntr": _64, "odo": _64, "ong": _64, "org": _64, "osasco": _64, "palmas": _64, "poa": _64, "ppg": _64, "pro": _64, "psc": _64, "psi": _64, "pvh": _64, "qsl": _64, "radio": _64, "rec": _64, "recife": _64, "rep": _64, "ribeirao": _64, "rio": _64, "riobranco": _64, "riopreto": _64, "salvador": _64, "sampa": _64, "santamaria": _64, "santoandre": _64, "saobernardo": _64, "saogonca": _64, "seg": _64, "sjc": _64, "slg": _64, "slz": _64, "sorocaba": _64, "srv": _64, "taxi": _64, "tc": _64, "tec": _64, "teo": _64, "the": _64, "tmp": _64, "trd": _64, "tur": _64, "tv": _64, "udi": _64, "vet": _64, "vix": _64, "vlog": _64, "wiki": _64, "zlg": _64 }], "bs": _66, "bt": _66, "bv": _64, "bw": [1, { "ac": _64, "co": _64, "gov": _64, "net": _64, "org": _64 }], "by": [1, { "gov": _64, "mil": _64, "com": _64, "of": _64 }], "bz": _69, "ca": [1, { "ab": _64, "bc": _64, "mb": _64, "nb": _64, "nf": _64, "nl": _64, "ns": _64, "nt": _64, "nu": _64, "on": _64, "pe": _64, "qc": _64, "sk": _64, "yk": _64, "gc": _64 }], "cat": _64, "cc": _64, "cd": _67, "cf": _64, "cg": _64, "ch": _64, "ci": [1, { "ac": _64, "xn--aroport-bya": _64, "aéroport": _64, "asso": _64, "co": _64, "com": _64, "ed": _64, "edu": _64, "go": _64, "gouv": _64, "int": _64, "net": _64, "or": _64, "org": _64 }], "ck": _68, "cl": [1, { "co": _64, "gob": _64, "gov": _64, "mil": _64 }], "cm": [1, { "co": _64, "com": _64, "gov": _64, "net": _64 }], "cn": [1, { "ac": _64, "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "xn--55qx5d": _64, "公司": _64, "xn--od0alg": _64, "網絡": _64, "xn--io0a7i": _64, "网络": _64, "ah": _64, "bj": _64, "cq": _64, "fj": _64, "gd": _64, "gs": _64, "gx": _64, "gz": _64, "ha": _64, "hb": _64, "he": _64, "hi": _64, "hk": _64, "hl": _64, "hn": _64, "jl": _64, "js": _64, "jx": _64, "ln": _64, "mo": _64, "nm": _64, "nx": _64, "qh": _64, "sc": _64, "sd": _64, "sh": _64, "sn": _64, "sx": _64, "tj": _64, "tw": _64, "xj": _64, "xz": _64, "yn": _64, "zj": _64 }], "co": [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "net": _64, "nom": _64, "org": _64 }], "com": _64, "coop": _64, "cr": [1, { "ac": _64, "co": _64, "ed": _64, "fi": _64, "go": _64, "or": _64, "sa": _64 }], "cu": [1, { "com": _64, "edu": _64, "gob": _64, "inf": _64, "nat": _64, "net": _64, "org": _64 }], "cv": [1, { "com": _64, "edu": _64, "id": _64, "int": _64, "net": _64, "nome": _64, "org": _64, "publ": _64 }], "cw": _70, "cx": _67, "cy": [1, { "ac": _64, "biz": _64, "com": _64, "ekloges": _64, "gov": _64, "ltd": _64, "mil": _64, "net": _64, "org": _64, "press": _64, "pro": _64, "tm": _64 }], "cz": _64, "de": _64, "dj": _64, "dk": _64, "dm": _69, "do": [1, { "art": _64, "com": _64, "edu": _64, "gob": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "sld": _64, "web": _64 }], "dz": [1, { "art": _64, "asso": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64, "pol": _64, "soc": _64, "tm": _64 }], "ec": [1, { "com": _64, "edu": _64, "fin": _64, "gob": _64, "gov": _64, "info": _64, "k12": _64, "med": _64, "mil": _64, "net": _64, "org": _64, "pro": _64 }], "edu": _64, "ee": [1, { "aip": _64, "com": _64, "edu": _64, "fie": _64, "gov": _64, "lib": _64, "med": _64, "org": _64, "pri": _64, "riik": _64 }], "eg": [1, { "ac": _64, "com": _64, "edu": _64, "eun": _64, "gov": _64, "info": _64, "me": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "sci": _64, "sport": _64, "tv": _64 }], "er": _68, "es": [1, { "com": _64, "edu": _64, "gob": _64, "nom": _64, "org": _64 }], "et": [1, { "biz": _64, "com": _64, "edu": _64, "gov": _64, "info": _64, "name": _64, "net": _64, "org": _64 }], "eu": _64, "fi": [1, { "aland": _64 }], "fj": [1, { "ac": _64, "biz": _64, "com": _64, "gov": _64, "info": _64, "mil": _64, "name": _64, "net": _64, "org": _64, "pro": _64 }], "fk": _68, "fm": _70, "fo": _64, "fr": [1, { "asso": _64, "com": _64, "gouv": _64, "nom": _64, "prd": _64, "tm": _64, "avoues": _64, "cci": _64, "greta": _64, "huissier-justice": _64 }], "ga": _64, "gb": _64, "gd": [1, { "edu": _64, "gov": _64 }], "ge": [1, { "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64, "pvt": _64, "school": _64 }], "gf": _64, "gg": _71, "gh": [1, { "com": _64, "edu": _64, "gov": _64, "mil": _64, "org": _64 }], "gi": [1, { "com": _64, "edu": _64, "gov": _64, "ltd": _64, "mod": _64, "org": _64 }], "gl": [1, { "co": _64, "com": _64, "edu": _64, "net": _64, "org": _64 }], "gm": _64, "gn": [1, { "ac": _64, "com": _64, "edu": _64, "gov": _64, "net": _64, "org": _64 }], "gov": _64, "gp": [1, { "asso": _64, "com": _64, "edu": _64, "mobi": _64, "net": _64, "org": _64 }], "gq": _64, "gr": _66, "gs": _64, "gt": [1, { "com": _64, "edu": _64, "gob": _64, "ind": _64, "mil": _64, "net": _64, "org": _64 }], "gu": [1, { "com": _64, "edu": _64, "gov": _64, "guam": _64, "info": _64, "net": _64, "org": _64, "web": _64 }], "gw": _64, "gy": _69, "hk": [1, { "com": _64, "edu": _64, "gov": _64, "idv": _64, "net": _64, "org": _64, "xn--ciqpn": _64, "个人": _64, "xn--gmqw5a": _64, "個人": _64, "xn--55qx5d": _64, "公司": _64, "xn--mxtq1m": _64, "政府": _64, "xn--lcvr32d": _64, "敎育": _64, "xn--wcvs22d": _64, "教育": _64, "xn--gmq050i": _64, "箇人": _64, "xn--uc0atv": _64, "組織": _64, "xn--uc0ay4a": _64, "組织": _64, "xn--od0alg": _64, "網絡": _64, "xn--zf0avx": _64, "網络": _64, "xn--mk0axi": _64, "组織": _64, "xn--tn0ag": _64, "组织": _64, "xn--od0aq3b": _64, "网絡": _64, "xn--io0a7i": _64, "网络": _64 }], "hm": _64, "hn": [1, { "com": _64, "edu": _64, "gob": _64, "mil": _64, "net": _64, "org": _64 }], "hr": [1, { "com": _64, "from": _64, "iz": _64, "name": _64 }], "ht": [1, { "adult": _64, "art": _64, "asso": _64, "com": _64, "coop": _64, "edu": _64, "firm": _64, "gouv": _64, "info": _64, "med": _64, "net": _64, "org": _64, "perso": _64, "pol": _64, "pro": _64, "rel": _64, "shop": _64 }], "hu": [1, { "2000": _64, "agrar": _64, "bolt": _64, "casino": _64, "city": _64, "co": _64, "erotica": _64, "erotika": _64, "film": _64, "forum": _64, "games": _64, "hotel": _64, "info": _64, "ingatlan": _64, "jogasz": _64, "konyvelo": _64, "lakas": _64, "media": _64, "news": _64, "org": _64, "priv": _64, "reklam": _64, "sex": _64, "shop": _64, "sport": _64, "suli": _64, "szex": _64, "tm": _64, "tozsde": _64, "utazas": _64, "video": _64 }], "id": [1, { "ac": _64, "biz": _64, "co": _64, "desa": _64, "go": _64, "mil": _64, "my": _64, "net": _64, "or": _64, "ponpes": _64, "sch": _64, "web": _64 }], "ie": _67, "il": [1, { "ac": _64, "co": _64, "gov": _64, "idf": _64, "k12": _64, "muni": _64, "net": _64, "org": _64 }], "xn--4dbrk0ce": [1, { "xn--4dbgdty6c": _64, "xn--5dbhl8d": _64, "xn--8dbq2a": _64, "xn--hebda8b": _64 }], "ישראל": [1, { "אקדמיה": _64, "ישוב": _64, "צהל": _64, "ממשל": _64 }], "im": [1, { "ac": _64, "co": [1, { "ltd": _64, "plc": _64 }], "com": _64, "net": _64, "org": _64, "tt": _64, "tv": _64 }], "in": [1, { "5g": _64, "6g": _64, "ac": _64, "ai": _64, "am": _64, "bihar": _64, "biz": _64, "business": _64, "ca": _64, "cn": _64, "co": _64, "com": _64, "coop": _64, "cs": _64, "delhi": _64, "dr": _64, "edu": _64, "er": _64, "firm": _64, "gen": _64, "gov": _64, "gujarat": _64, "ind": _64, "info": _64, "int": _64, "internet": _64, "io": _64, "me": _64, "mil": _64, "net": _64, "nic": _64, "org": _64, "pg": _64, "post": _64, "pro": _64, "res": _64, "travel": _64, "tv": _64, "uk": _64, "up": _64, "us": _64 }], "info": _64, "int": [1, { "eu": _64 }], "io": _72, "iq": _65, "ir": [1, { "ac": _64, "co": _64, "gov": _64, "id": _64, "net": _64, "org": _64, "sch": _64, "xn--mgba3a4f16a": _64, "ایران": _64, "xn--mgba3a4fra": _64, "ايران": _64 }], "is": _64, "it": [1, { "edu": _64, "gov": _64, "abr": _64, "abruzzo": _64, "aosta-valley": _64, "aostavalley": _64, "bas": _64, "basilicata": _64, "cal": _64, "calabria": _64, "cam": _64, "campania": _64, "emilia-romagna": _64, "emiliaromagna": _64, "emr": _64, "friuli-v-giulia": _64, "friuli-ve-giulia": _64, "friuli-vegiulia": _64, "friuli-venezia-giulia": _64, "friuli-veneziagiulia": _64, "friuli-vgiulia": _64, "friuliv-giulia": _64, "friulive-giulia": _64, "friulivegiulia": _64, "friulivenezia-giulia": _64, "friuliveneziagiulia": _64, "friulivgiulia": _64, "fvg": _64, "laz": _64, "lazio": _64, "lig": _64, "liguria": _64, "lom": _64, "lombardia": _64, "lombardy": _64, "lucania": _64, "mar": _64, "marche": _64, "mol": _64, "molise": _64, "piedmont": _64, "piemonte": _64, "pmn": _64, "pug": _64, "puglia": _64, "sar": _64, "sardegna": _64, "sardinia": _64, "sic": _64, "sicilia": _64, "sicily": _64, "taa": _64, "tos": _64, "toscana": _64, "trentin-sud-tirol": _64, "xn--trentin-sd-tirol-rzb": _64, "trentin-süd-tirol": _64, "trentin-sudtirol": _64, "xn--trentin-sdtirol-7vb": _64, "trentin-südtirol": _64, "trentin-sued-tirol": _64, "trentin-suedtirol": _64, "trentino": _64, "trentino-a-adige": _64, "trentino-aadige": _64, "trentino-alto-adige": _64, "trentino-altoadige": _64, "trentino-s-tirol": _64, "trentino-stirol": _64, "trentino-sud-tirol": _64, "xn--trentino-sd-tirol-c3b": _64, "trentino-süd-tirol": _64, "trentino-sudtirol": _64, "xn--trentino-sdtirol-szb": _64, "trentino-südtirol": _64, "trentino-sued-tirol": _64, "trentino-suedtirol": _64, "trentinoa-adige": _64, "trentinoaadige": _64, "trentinoalto-adige": _64, "trentinoaltoadige": _64, "trentinos-tirol": _64, "trentinostirol": _64, "trentinosud-tirol": _64, "xn--trentinosd-tirol-rzb": _64, "trentinosüd-tirol": _64, "trentinosudtirol": _64, "xn--trentinosdtirol-7vb": _64, "trentinosüdtirol": _64, "trentinosued-tirol": _64, "trentinosuedtirol": _64, "trentinsud-tirol": _64, "xn--trentinsd-tirol-6vb": _64, "trentinsüd-tirol": _64, "trentinsudtirol": _64, "xn--trentinsdtirol-nsb": _64, "trentinsüdtirol": _64, "trentinsued-tirol": _64, "trentinsuedtirol": _64, "tuscany": _64, "umb": _64, "umbria": _64, "val-d-aosta": _64, "val-daosta": _64, "vald-aosta": _64, "valdaosta": _64, "valle-aosta": _64, "valle-d-aosta": _64, "valle-daosta": _64, "valleaosta": _64, "valled-aosta": _64, "valledaosta": _64, "vallee-aoste": _64, "xn--valle-aoste-ebb": _64, "vallée-aoste": _64, "vallee-d-aoste": _64, "xn--valle-d-aoste-ehb": _64, "vallée-d-aoste": _64, "valleeaoste": _64, "xn--valleaoste-e7a": _64, "valléeaoste": _64, "valleedaoste": _64, "xn--valledaoste-ebb": _64, "valléedaoste": _64, "vao": _64, "vda": _64, "ven": _64, "veneto": _64, "ag": _64, "agrigento": _64, "al": _64, "alessandria": _64, "alto-adige": _64, "altoadige": _64, "an": _64, "ancona": _64, "andria-barletta-trani": _64, "andria-trani-barletta": _64, "andriabarlettatrani": _64, "andriatranibarletta": _64, "ao": _64, "aosta": _64, "aoste": _64, "ap": _64, "aq": _64, "aquila": _64, "ar": _64, "arezzo": _64, "ascoli-piceno": _64, "ascolipiceno": _64, "asti": _64, "at": _64, "av": _64, "avellino": _64, "ba": _64, "balsan": _64, "balsan-sudtirol": _64, "xn--balsan-sdtirol-nsb": _64, "balsan-südtirol": _64, "balsan-suedtirol": _64, "bari": _64, "barletta-trani-andria": _64, "barlettatraniandria": _64, "belluno": _64, "benevento": _64, "bergamo": _64, "bg": _64, "bi": _64, "biella": _64, "bl": _64, "bn": _64, "bo": _64, "bologna": _64, "bolzano": _64, "bolzano-altoadige": _64, "bozen": _64, "bozen-sudtirol": _64, "xn--bozen-sdtirol-2ob": _64, "bozen-südtirol": _64, "bozen-suedtirol": _64, "br": _64, "brescia": _64, "brindisi": _64, "bs": _64, "bt": _64, "bulsan": _64, "bulsan-sudtirol": _64, "xn--bulsan-sdtirol-nsb": _64, "bulsan-südtirol": _64, "bulsan-suedtirol": _64, "bz": _64, "ca": _64, "cagliari": _64, "caltanissetta": _64, "campidano-medio": _64, "campidanomedio": _64, "campobasso": _64, "carbonia-iglesias": _64, "carboniaiglesias": _64, "carrara-massa": _64, "carraramassa": _64, "caserta": _64, "catania": _64, "catanzaro": _64, "cb": _64, "ce": _64, "cesena-forli": _64, "xn--cesena-forl-mcb": _64, "cesena-forlì": _64, "cesenaforli": _64, "xn--cesenaforl-i8a": _64, "cesenaforlì": _64, "ch": _64, "chieti": _64, "ci": _64, "cl": _64, "cn": _64, "co": _64, "como": _64, "cosenza": _64, "cr": _64, "cremona": _64, "crotone": _64, "cs": _64, "ct": _64, "cuneo": _64, "cz": _64, "dell-ogliastra": _64, "dellogliastra": _64, "en": _64, "enna": _64, "fc": _64, "fe": _64, "fermo": _64, "ferrara": _64, "fg": _64, "fi": _64, "firenze": _64, "florence": _64, "fm": _64, "foggia": _64, "forli-cesena": _64, "xn--forl-cesena-fcb": _64, "forlì-cesena": _64, "forlicesena": _64, "xn--forlcesena-c8a": _64, "forlìcesena": _64, "fr": _64, "frosinone": _64, "ge": _64, "genoa": _64, "genova": _64, "go": _64, "gorizia": _64, "gr": _64, "grosseto": _64, "iglesias-carbonia": _64, "iglesiascarbonia": _64, "im": _64, "imperia": _64, "is": _64, "isernia": _64, "kr": _64, "la-spezia": _64, "laquila": _64, "laspezia": _64, "latina": _64, "lc": _64, "le": _64, "lecce": _64, "lecco": _64, "li": _64, "livorno": _64, "lo": _64, "lodi": _64, "lt": _64, "lu": _64, "lucca": _64, "macerata": _64, "mantova": _64, "massa-carrara": _64, "massacarrara": _64, "matera": _64, "mb": _64, "mc": _64, "me": _64, "medio-campidano": _64, "mediocampidano": _64, "messina": _64, "mi": _64, "milan": _64, "milano": _64, "mn": _64, "mo": _64, "modena": _64, "monza": _64, "monza-brianza": _64, "monza-e-della-brianza": _64, "monzabrianza": _64, "monzaebrianza": _64, "monzaedellabrianza": _64, "ms": _64, "mt": _64, "na": _64, "naples": _64, "napoli": _64, "no": _64, "novara": _64, "nu": _64, "nuoro": _64, "og": _64, "ogliastra": _64, "olbia-tempio": _64, "olbiatempio": _64, "or": _64, "oristano": _64, "ot": _64, "pa": _64, "padova": _64, "padua": _64, "palermo": _64, "parma": _64, "pavia": _64, "pc": _64, "pd": _64, "pe": _64, "perugia": _64, "pesaro-urbino": _64, "pesarourbino": _64, "pescara": _64, "pg": _64, "pi": _64, "piacenza": _64, "pisa": _64, "pistoia": _64, "pn": _64, "po": _64, "pordenone": _64, "potenza": _64, "pr": _64, "prato": _64, "pt": _64, "pu": _64, "pv": _64, "pz": _64, "ra": _64, "ragusa": _64, "ravenna": _64, "rc": _64, "re": _64, "reggio-calabria": _64, "reggio-emilia": _64, "reggiocalabria": _64, "reggioemilia": _64, "rg": _64, "ri": _64, "rieti": _64, "rimini": _64, "rm": _64, "rn": _64, "ro": _64, "roma": _64, "rome": _64, "rovigo": _64, "sa": _64, "salerno": _64, "sassari": _64, "savona": _64, "si": _64, "siena": _64, "siracusa": _64, "so": _64, "sondrio": _64, "sp": _64, "sr": _64, "ss": _64, "xn--sdtirol-n2a": _64, "südtirol": _64, "suedtirol": _64, "sv": _64, "ta": _64, "taranto": _64, "te": _64, "tempio-olbia": _64, "tempioolbia": _64, "teramo": _64, "terni": _64, "tn": _64, "to": _64, "torino": _64, "tp": _64, "tr": _64, "trani-andria-barletta": _64, "trani-barletta-andria": _64, "traniandriabarletta": _64, "tranibarlettaandria": _64, "trapani": _64, "trento": _64, "treviso": _64, "trieste": _64, "ts": _64, "turin": _64, "tv": _64, "ud": _64, "udine": _64, "urbino-pesaro": _64, "urbinopesaro": _64, "va": _64, "varese": _64, "vb": _64, "vc": _64, "ve": _64, "venezia": _64, "venice": _64, "verbania": _64, "vercelli": _64, "verona": _64, "vi": _64, "vibo-valentia": _64, "vibovalentia": _64, "vicenza": _64, "viterbo": _64, "vr": _64, "vs": _64, "vt": _64, "vv": _64 }], "je": _71, "jm": _68, "jo": [1, { "agri": _64, "ai": _64, "com": _64, "edu": _64, "eng": _64, "fm": _64, "gov": _64, "mil": _64, "net": _64, "org": _64, "per": _64, "phd": _64, "sch": _64, "tv": _64 }], "jobs": _64, "jp": [1, { "ac": _64, "ad": _64, "co": _64, "ed": _64, "go": _64, "gr": _64, "lg": _64, "ne": _64, "or": _64, "aichi": [1, { "aisai": _64, "ama": _64, "anjo": _64, "asuke": _64, "chiryu": _64, "chita": _64, "fuso": _64, "gamagori": _64, "handa": _64, "hazu": _64, "hekinan": _64, "higashiura": _64, "ichinomiya": _64, "inazawa": _64, "inuyama": _64, "isshiki": _64, "iwakura": _64, "kanie": _64, "kariya": _64, "kasugai": _64, "kira": _64, "kiyosu": _64, "komaki": _64, "konan": _64, "kota": _64, "mihama": _64, "miyoshi": _64, "nishio": _64, "nisshin": _64, "obu": _64, "oguchi": _64, "oharu": _64, "okazaki": _64, "owariasahi": _64, "seto": _64, "shikatsu": _64, "shinshiro": _64, "shitara": _64, "tahara": _64, "takahama": _64, "tobishima": _64, "toei": _64, "togo": _64, "tokai": _64, "tokoname": _64, "toyoake": _64, "toyohashi": _64, "toyokawa": _64, "toyone": _64, "toyota": _64, "tsushima": _64, "yatomi": _64 }], "akita": [1, { "akita": _64, "daisen": _64, "fujisato": _64, "gojome": _64, "hachirogata": _64, "happou": _64, "higashinaruse": _64, "honjo": _64, "honjyo": _64, "ikawa": _64, "kamikoani": _64, "kamioka": _64, "katagami": _64, "kazuno": _64, "kitaakita": _64, "kosaka": _64, "kyowa": _64, "misato": _64, "mitane": _64, "moriyoshi": _64, "nikaho": _64, "noshiro": _64, "odate": _64, "oga": _64, "ogata": _64, "semboku": _64, "yokote": _64, "yurihonjo": _64 }], "aomori": [1, { "aomori": _64, "gonohe": _64, "hachinohe": _64, "hashikami": _64, "hiranai": _64, "hirosaki": _64, "itayanagi": _64, "kuroishi": _64, "misawa": _64, "mutsu": _64, "nakadomari": _64, "noheji": _64, "oirase": _64, "owani": _64, "rokunohe": _64, "sannohe": _64, "shichinohe": _64, "shingo": _64, "takko": _64, "towada": _64, "tsugaru": _64, "tsuruta": _64 }], "chiba": [1, { "abiko": _64, "asahi": _64, "chonan": _64, "chosei": _64, "choshi": _64, "chuo": _64, "funabashi": _64, "futtsu": _64, "hanamigawa": _64, "ichihara": _64, "ichikawa": _64, "ichinomiya": _64, "inzai": _64, "isumi": _64, "kamagaya": _64, "kamogawa": _64, "kashiwa": _64, "katori": _64, "katsuura": _64, "kimitsu": _64, "kisarazu": _64, "kozaki": _64, "kujukuri": _64, "kyonan": _64, "matsudo": _64, "midori": _64, "mihama": _64, "minamiboso": _64, "mobara": _64, "mutsuzawa": _64, "nagara": _64, "nagareyama": _64, "narashino": _64, "narita": _64, "noda": _64, "oamishirasato": _64, "omigawa": _64, "onjuku": _64, "otaki": _64, "sakae": _64, "sakura": _64, "shimofusa": _64, "shirako": _64, "shiroi": _64, "shisui": _64, "sodegaura": _64, "sosa": _64, "tako": _64, "tateyama": _64, "togane": _64, "tohnosho": _64, "tomisato": _64, "urayasu": _64, "yachimata": _64, "yachiyo": _64, "yokaichiba": _64, "yokoshibahikari": _64, "yotsukaido": _64 }], "ehime": [1, { "ainan": _64, "honai": _64, "ikata": _64, "imabari": _64, "iyo": _64, "kamijima": _64, "kihoku": _64, "kumakogen": _64, "masaki": _64, "matsuno": _64, "matsuyama": _64, "namikata": _64, "niihama": _64, "ozu": _64, "saijo": _64, "seiyo": _64, "shikokuchuo": _64, "tobe": _64, "toon": _64, "uchiko": _64, "uwajima": _64, "yawatahama": _64 }], "fukui": [1, { "echizen": _64, "eiheiji": _64, "fukui": _64, "ikeda": _64, "katsuyama": _64, "mihama": _64, "minamiechizen": _64, "obama": _64, "ohi": _64, "ono": _64, "sabae": _64, "sakai": _64, "takahama": _64, "tsuruga": _64, "wakasa": _64 }], "fukuoka": [1, { "ashiya": _64, "buzen": _64, "chikugo": _64, "chikuho": _64, "chikujo": _64, "chikushino": _64, "chikuzen": _64, "chuo": _64, "dazaifu": _64, "fukuchi": _64, "hakata": _64, "higashi": _64, "hirokawa": _64, "hisayama": _64, "iizuka": _64, "inatsuki": _64, "kaho": _64, "kasuga": _64, "kasuya": _64, "kawara": _64, "keisen": _64, "koga": _64, "kurate": _64, "kurogi": _64, "kurume": _64, "minami": _64, "miyako": _64, "miyama": _64, "miyawaka": _64, "mizumaki": _64, "munakata": _64, "nakagawa": _64, "nakama": _64, "nishi": _64, "nogata": _64, "ogori": _64, "okagaki": _64, "okawa": _64, "oki": _64, "omuta": _64, "onga": _64, "onojo": _64, "oto": _64, "saigawa": _64, "sasaguri": _64, "shingu": _64, "shinyoshitomi": _64, "shonai": _64, "soeda": _64, "sue": _64, "tachiarai": _64, "tagawa": _64, "takata": _64, "toho": _64, "toyotsu": _64, "tsuiki": _64, "ukiha": _64, "umi": _64, "usui": _64, "yamada": _64, "yame": _64, "yanagawa": _64, "yukuhashi": _64 }], "fukushima": [1, { "aizubange": _64, "aizumisato": _64, "aizuwakamatsu": _64, "asakawa": _64, "bandai": _64, "date": _64, "fukushima": _64, "furudono": _64, "futaba": _64, "hanawa": _64, "higashi": _64, "hirata": _64, "hirono": _64, "iitate": _64, "inawashiro": _64, "ishikawa": _64, "iwaki": _64, "izumizaki": _64, "kagamiishi": _64, "kaneyama": _64, "kawamata": _64, "kitakata": _64, "kitashiobara": _64, "koori": _64, "koriyama": _64, "kunimi": _64, "miharu": _64, "mishima": _64, "namie": _64, "nango": _64, "nishiaizu": _64, "nishigo": _64, "okuma": _64, "omotego": _64, "ono": _64, "otama": _64, "samegawa": _64, "shimogo": _64, "shirakawa": _64, "showa": _64, "soma": _64, "sukagawa": _64, "taishin": _64, "tamakawa": _64, "tanagura": _64, "tenei": _64, "yabuki": _64, "yamato": _64, "yamatsuri": _64, "yanaizu": _64, "yugawa": _64 }], "gifu": [1, { "anpachi": _64, "ena": _64, "gifu": _64, "ginan": _64, "godo": _64, "gujo": _64, "hashima": _64, "hichiso": _64, "hida": _64, "higashishirakawa": _64, "ibigawa": _64, "ikeda": _64, "kakamigahara": _64, "kani": _64, "kasahara": _64, "kasamatsu": _64, "kawaue": _64, "kitagata": _64, "mino": _64, "minokamo": _64, "mitake": _64, "mizunami": _64, "motosu": _64, "nakatsugawa": _64, "ogaki": _64, "sakahogi": _64, "seki": _64, "sekigahara": _64, "shirakawa": _64, "tajimi": _64, "takayama": _64, "tarui": _64, "toki": _64, "tomika": _64, "wanouchi": _64, "yamagata": _64, "yaotsu": _64, "yoro": _64 }], "gunma": [1, { "annaka": _64, "chiyoda": _64, "fujioka": _64, "higashiagatsuma": _64, "isesaki": _64, "itakura": _64, "kanna": _64, "kanra": _64, "katashina": _64, "kawaba": _64, "kiryu": _64, "kusatsu": _64, "maebashi": _64, "meiwa": _64, "midori": _64, "minakami": _64, "naganohara": _64, "nakanojo": _64, "nanmoku": _64, "numata": _64, "oizumi": _64, "ora": _64, "ota": _64, "shibukawa": _64, "shimonita": _64, "shinto": _64, "showa": _64, "takasaki": _64, "takayama": _64, "tamamura": _64, "tatebayashi": _64, "tomioka": _64, "tsukiyono": _64, "tsumagoi": _64, "ueno": _64, "yoshioka": _64 }], "hiroshima": [1, { "asaminami": _64, "daiwa": _64, "etajima": _64, "fuchu": _64, "fukuyama": _64, "hatsukaichi": _64, "higashihiroshima": _64, "hongo": _64, "jinsekikogen": _64, "kaita": _64, "kui": _64, "kumano": _64, "kure": _64, "mihara": _64, "miyoshi": _64, "naka": _64, "onomichi": _64, "osakikamijima": _64, "otake": _64, "saka": _64, "sera": _64, "seranishi": _64, "shinichi": _64, "shobara": _64, "takehara": _64 }], "hokkaido": [1, { "abashiri": _64, "abira": _64, "aibetsu": _64, "akabira": _64, "akkeshi": _64, "asahikawa": _64, "ashibetsu": _64, "ashoro": _64, "assabu": _64, "atsuma": _64, "bibai": _64, "biei": _64, "bifuka": _64, "bihoro": _64, "biratori": _64, "chippubetsu": _64, "chitose": _64, "date": _64, "ebetsu": _64, "embetsu": _64, "eniwa": _64, "erimo": _64, "esan": _64, "esashi": _64, "fukagawa": _64, "fukushima": _64, "furano": _64, "furubira": _64, "haboro": _64, "hakodate": _64, "hamatonbetsu": _64, "hidaka": _64, "higashikagura": _64, "higashikawa": _64, "hiroo": _64, "hokuryu": _64, "hokut