{"version":3,"sources":["../src/index.ts","../src/lib/countries/andorra.ts","../src/lib/countries/australia.ts","../src/lib/countries/austria.ts","../src/lib/countries/belgium.ts","../src/lib/countries/brazil.ts","../src/lib/countries/bulgaria.ts","../src/lib/countries/croatiat.ts","../src/lib/countries/cyprus.ts","../src/lib/countries/czechRepublic.ts","../src/lib/countries/denmark.ts","../src/lib/countries/estonia.ts","../src/lib/countries/europe.ts","../src/lib/countries/finland.ts","../src/lib/countries/france.ts","../src/lib/countries/germany.ts","../src/lib/countries/greece.ts","../src/lib/countries/hungary.ts","../src/lib/countries/ireland.ts","../src/lib/countries/italy.ts","../src/lib/countries/latvia.ts","../src/lib/countries/lithuania.ts","../src/lib/countries/luxembourg.ts","../src/lib/countries/malta.ts","../src/lib/countries/netherlands.ts","../src/lib/countries/norway.ts","../src/lib/countries/poland.ts","../src/lib/countries/portugal.ts","../src/lib/countries/romania.ts","../src/lib/countries/russia.ts","../src/lib/countries/serbia.ts","../src/lib/countries/singapore.ts","../src/lib/countries/slovakiaRepublic.ts","../src/lib/countries/slovenia.ts","../src/lib/countries/spain.ts","../src/lib/countries/sweden.ts","../src/lib/countries/switzerland.ts","../src/lib/countries/unitedKingdom.ts","../src/lib/vat-validation.ts"],"sourcesContent":["import {\n  andorra,\n  australia,\n  austria,\n  belgium,\n  brazil,\n  bulgaria,\n  croatia,\n  cyprus,\n  czechRepublic,\n  denmark,\n  estonia,\n  europe,\n  finland,\n  france,\n  germany,\n  greece,\n  hungary,\n  ireland,\n  italy,\n  latvia,\n  lithuania,\n  luxembourg,\n  malta,\n  netherlands,\n  norway,\n  poland,\n  portugal,\n  romania,\n  russia,\n  serbia,\n  singapore,\n  slovakiaRepublic,\n  slovenia,\n  spain,\n  sweden,\n  switzerland,\n  unitedKingdom\n} from './lib/countries';\nimport { Country } from './lib/vat-validation';\n\nexport const countries: ReadonlyArray<Country> = [\n  andorra,\n  australia,\n  austria,\n  belgium,\n  brazil,\n  bulgaria,\n  croatia,\n  cyprus,\n  czechRepublic,\n  denmark,\n  estonia,\n  europe,\n  finland,\n  france,\n  germany,\n  greece,\n  hungary,\n  ireland,\n  italy,\n  latvia,\n  lithuania,\n  luxembourg,\n  malta,\n  netherlands,\n  norway,\n  poland,\n  portugal,\n  romania,\n  russia,\n  serbia,\n  singapore,\n  slovakiaRepublic,\n  slovenia,\n  spain,\n  sweden,\n  switzerland,\n  unitedKingdom\n];\n\nexport {\n  andorra,\n  australia,\n  austria,\n  belgium,\n  brazil,\n  bulgaria,\n  croatia,\n  cyprus,\n  czechRepublic,\n  denmark,\n  estonia,\n  europe,\n  finland,\n  france,\n  germany,\n  greece,\n  hungary,\n  ireland,\n  italy,\n  latvia,\n  lithuania,\n  luxembourg,\n  malta,\n  netherlands,\n  norway,\n  poland,\n  portugal,\n  romania,\n  russia,\n  serbia,\n  singapore,\n  slovakiaRepublic,\n  slovenia,\n  spain,\n  sweden,\n  switzerland,\n  unitedKingdom\n} from './lib/countries';\n\nexport { checkVAT, Rules, Country, Multipliers, VatCheckResult, CheckVATOptions } from './lib/vat-validation';\n","import { Country } from '../vat-validation';\n\nexport const andorra: Country = {\n  name: 'Andorra',\n  codes: ['AD', 'AND', '020'],\n  calcFn: (vat: string): boolean => {\n    if (vat.length !== 8) return false;\n    const firstChar = vat[0].toUpperCase();\n    const lastChar = vat[7].toUpperCase();\n    // First and last characters must be from the allowed set\n    const allowedChars = 'FEALECDGOPU';\n    return allowedChars.includes(firstChar) && allowedChars.includes(lastChar);\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(AD)([fealecdgopuFEALECDGOPU]\\d{6}[fealecdgopuFEALECDGOPU])$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const australia: Country = {\n  name: 'Australia',\n  codes: ['AU', 'AUS', '036'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n    for (let i = 0; i < 11; i++) {\n      let digit = Number(vat.charAt(i));\n      if (i === 0) digit -= 1;\n      total += digit * australia.rules.multipliers.common[i];\n    }\n\n    return total % 89 === 0;\n  },\n  rules: {\n    multipliers: {\n      common: [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]\n    },\n    regex: [/^(AU)?(\\d{11})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const austria: Country = {\n  name: 'Austria',\n  codes: ['AT', 'AUT', '040'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    for (let i: number = 0; i < 7; i++) {\n      const temp = Number(vat.charAt(i)) * austria.rules.multipliers.common[i];\n\n      if (temp > 9) {\n        total += Math.floor(temp / 10) + (temp % 10);\n      } else {\n        total += temp;\n      }\n    }\n\n    total = 10 - ((total + 4) % 10);\n    if (total === 10) total = 0;\n\n    return total === Number(vat.slice(7, 8));\n  },\n  rules: {\n    multipliers: {\n      common: [1, 2, 1, 2, 1, 2, 1]\n    },\n    regex: [/^(AT)U(\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const belgium: Country = {\n  name: 'Belgium',\n  codes: ['BE', 'BEL', '056'],\n  calcFn: (vat: string): boolean => {\n    const newVat = vat.length === 9 ? '0' + vat : vat;\n    if (newVat[0] === '0' && newVat[1] === '0') return false;\n\n    const check = 97 - (Number(newVat.slice(0, 8)) % 97);\n    return check === Number(newVat.slice(8, 10));\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(BE)([01]?\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\n/**\n * Numbers used to check a document or something containing numbers.\n */\ntype CheckSums = ReadonlyArray<number>;\n\n/**\n * Generate check sums. Multiply numbers to validators and sum them to generate\n * check sums, they're used to check if numbers are valid.\n * @param numbers - Numbers used to generate checkers.\n * @param validators - Validators used to generate checkers.\n */\nconst generateCheckSums = (numbers: ReadonlyArray<number>, validators: ReadonlyArray<number>): CheckSums => {\n  const initialCheckSums: CheckSums = [0, 0];\n\n  return validators.reduce(\n    ([checkerA, checkerB], validator, index) =>\n      [index === 0 ? 0 : checkerA + numbers[index - 1] * validator, checkerB + numbers[index] * validator] as CheckSums,\n    initialCheckSums\n  );\n};\n\nconst isRepeatedArray = (varNumbers: ReadonlyArray<number>) =>\n  varNumbers.every((varNumber) => varNumbers[0] === varNumber);\n\n/**\n * Get remaining of 11 or `0` if lower than 2.\n * @param value - Value used remaining.\n */\nconst getRemaining = (value: number): number => (value % 11 < 2 ? 0 : 11 - (value % 11));\n\nfunction validateCNPJ(vat: string): boolean {\n  const numbers = vat.split('').map(Number);\n  if (isRepeatedArray(numbers)) {\n    return false;\n  }\n  const validators: ReadonlyArray<number> = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n  const checkers = generateCheckSums(numbers, validators);\n  return numbers[12] === getRemaining(checkers[0]) && numbers[13] === getRemaining(checkers[1]);\n}\n\nfunction validateCPF(vat: string): boolean {\n  const numbers = vat.split('').map(Number);\n  if (isRepeatedArray(numbers)) {\n    return false;\n  }\n\n  // First check digit: multiply first 9 digits by 10..2, then mod 11\n  let sum = 0;\n  for (let i = 0; i < 9; i++) {\n    sum += numbers[i] * (10 - i);\n  }\n  const first = getRemaining(sum);\n  if (numbers[9] !== first) return false;\n\n  // Second check digit: multiply first 10 digits by 11..2, then mod 11\n  sum = 0;\n  for (let i = 0; i < 10; i++) {\n    sum += numbers[i] * (11 - i);\n  }\n  const second = getRemaining(sum);\n  return numbers[10] === second;\n}\n\nexport const brazil: Country = {\n  name: 'Brazil',\n  codes: ['BR', 'BRA', '076'],\n  calcFn: (vat: string): boolean => {\n    if (vat.length === 11) return validateCPF(vat);\n    return validateCNPJ(vat);\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(BR)?(\\d{14}|\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}-\\d{2}|\\d{11}|\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const bulgaria: Country = {\n  name: 'Bulgaria',\n  codes: ['BG', 'BGR', '100'],\n  calcFn: (vat: string): boolean => {\n    if (vat.length === 9) return _checkNineLengthVat(vat);\n\n    const { multipliers } = bulgaria.rules;\n    return (\n      _isPhysicalPerson(vat, multipliers.physical) ||\n      _isForeigner(vat, multipliers) ||\n      _miscellaneousVAT(vat, multipliers)\n    );\n  },\n  rules: {\n    multipliers: {\n      physical: [2, 4, 8, 5, 10, 9, 7, 3, 6],\n      foreigner: [21, 19, 17, 13, 11, 9, 7, 3, 1],\n      miscellaneous: [4, 3, 2, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [/^(BG)(\\d{9,10})$/]\n  }\n};\n\nfunction _increase(value: number, vat: string, from: number, to: number, incr: number): number {\n  let result = value;\n  for (let i = from; i < to; i++) {\n    result += Number(vat.charAt(i)) * (i + incr);\n  }\n  return result;\n}\n\nfunction _increase2(value: number, vat: string, from: number, to: number, multipliers: ReadonlyArray<number>): number {\n  let result = value;\n  for (let i = from; i < to; i++) {\n    result += Number(vat.charAt(i)) * multipliers[i];\n  }\n  return result;\n}\n\nfunction _checkNineLengthVat(vat: string): boolean {\n  let total;\n  let temp = _increase(0, vat, 0, 8, 1);\n  const expect = Number(vat.slice(8));\n\n  total = temp % 11;\n  if (total !== 10) return total === expect;\n\n  temp = _increase(0, vat, 0, 8, 3);\n\n  total = temp % 11;\n  if (total === 10) total = 0;\n\n  return total === expect;\n}\n\nfunction _isPhysicalPerson(vat: string, physicalMultipliers: ReadonlyArray<number>): boolean {\n  // 10 digit VAT code - see if it relates to a standard physical person\n  if (/^\\d\\d[0-5]\\d[0-3]\\d\\d{4}$/.test(vat)) {\n    // Check month\n    const month = Number(vat.slice(2, 4));\n    if ((month > 0 && month < 13) || (month > 20 && month < 33) || (month > 40 && month < 53)) {\n      let total = _increase2(0, vat, 0, 9, physicalMultipliers);\n      // Establish check digit.\n      total = total % 11;\n      if (total === 10) total = 0;\n      // Check to see if the check digit given is correct, If not, try next type of person\n      if (total === Number(vat.substr(9, 1))) return true;\n    }\n  }\n\n  return false;\n}\n\nfunction _isForeigner(vat: string, multipliers: { readonly [key: string]: ReadonlyArray<number> }): boolean {\n  // Extract the next digit and multiply by the counter.\n  const total = _increase2(0, vat, 0, 9, multipliers.foreigner);\n\n  // Check to see if the check digit given is correct, If not, try next type of person\n  return total % 10 === Number(vat.substr(9, 1));\n}\n\nfunction _miscellaneousVAT(vat: string, multipliers: { readonly [key: string]: ReadonlyArray<number> }): boolean {\n  // Finally, if not yet identified, see if it conforms to a miscellaneous VAT number\n  let total = _increase2(0, vat, 0, 9, multipliers.miscellaneous);\n\n  // Establish check digit.\n  total = 11 - (total % 11);\n  if (total === 10) return false;\n  if (total === 11) total = 0;\n\n  // Check to see if the check digit given is correct, If not, we have an error with the VAT number\n  const expect = Number(vat.substr(9, 1));\n  return total === expect;\n}\n","import { Country } from '../vat-validation';\n\nexport const croatia: Country = {\n  name: 'Croatia',\n  codes: ['HR', 'HRV', '191'],\n  calcFn: (vat: string): boolean => {\n    // Checks the check digits of a Croatian VAT number using ISO 7064, MOD 11-10 for check digit.\n    let product = 10;\n    let sum = 0;\n\n    for (let i = 0; i < 10; i++) {\n      // Extract the next digit and implement the algorithm\n      sum = (Number(vat.charAt(i)) + product) % 10;\n      if (sum === 0) {\n        sum = 10;\n      }\n\n      product = (2 * sum) % 11;\n    }\n\n    // Now check that we have the right check digit\n    const expect = Number(vat.slice(10, 11));\n    return (product + expect) % 10 === 1;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(HR)(\\d{11})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const cyprus: Country = {\n  name: 'Cyprus',\n  codes: ['CY', 'CYP', '196'],\n  calcFn: (vat: string): boolean => {\n    // Not allowed to start with '12'\n    if (Number(vat.slice(0, 2)) === 12) return false;\n\n    // Extract the next digit and multiply by the counter.\n    let total: string | number = extractAndMultiplyByCounter(vat, 0);\n\n    // Establish check digit using modulus 26, and translate to char. equivalent.\n    total = total % 26;\n    total = String.fromCharCode(total + 65);\n\n    // Check to see if the check digit given is correct\n    const expect = vat.substr(8, 1);\n    return total === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(CY)(\\d{8}[A-Z])$/]\n  }\n};\n\nfunction extractAndMultiplyByCounter(vat: string, total: number): number {\n  let result = total;\n  for (let i = 0; i < 8; i++) {\n    let temp = Number(vat.charAt(i));\n    if (i % 2 === 0) {\n      switch (temp) {\n        case 0:\n          temp = 1;\n          break;\n        case 1:\n          temp = 0;\n          break;\n        case 2:\n          temp = 5;\n          break;\n        case 3:\n          temp = 7;\n          break;\n        case 4:\n          temp = 9;\n          break;\n        default:\n          temp = temp * 2 + 3;\n      }\n    }\n    result += temp;\n  }\n\n  return result;\n}\n","import { Country } from '../vat-validation';\n\nexport const czechRepublic: Country = {\n  name: 'Czech Republic',\n  codes: ['CZ', 'CZE', '203'],\n  calcFn: (vat: string): boolean => {\n    const { rules } = czechRepublic;\n    const { multipliers, additional, lookup } = rules;\n    if (!additional) return false;\n\n    return (\n      isLegalEntities(vat, multipliers.common, additional) ||\n      isIndividualType2(vat, multipliers.common, additional, lookup) ||\n      isIndividualType3(vat, additional) ||\n      isIndividualType1(vat, additional)\n    );\n  },\n  rules: {\n    multipliers: {\n      common: [8, 7, 6, 5, 4, 3, 2]\n    },\n    lookup: [8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8],\n    regex: [/^(CZ)(\\d{8,10})(\\d{3})?$/],\n    additional: [/^\\d{8}$/, /^[0-5][0-9][0|1|5|6]\\d[0-3]\\d\\d{3}$/, /^6\\d{8}$/, /^\\d{2}[0-3|5-8]\\d[0-3]\\d\\d{4}$/]\n  }\n};\n\nfunction isLegalEntities(vat: string, multipliers: ReadonlyArray<number>, additional: ReadonlyArray<RegExp>): boolean {\n  let total = 0;\n  if (additional[0].test(vat)) {\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 7; i++) {\n      total += Number(vat.charAt(i)) * multipliers[i];\n    }\n\n    // Establish check digit.\n    total = 11 - (total % 11);\n    if (total === 10) total = 0;\n    if (total === 11) total = 1;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(7, 8));\n    return total === expect;\n  }\n\n  return false;\n}\n\nfunction isIndividualType1(vat: string, additional: ReadonlyArray<RegExp>): boolean {\n  if (additional[1].test(vat)) {\n    return Number(vat.slice(0, 2)) <= 62;\n  }\n\n  return false;\n}\n\nfunction isIndividualType2(\n  vat: string,\n  multipliers: ReadonlyArray<number>,\n  additional: ReadonlyArray<RegExp>,\n  lookup?: ReadonlyArray<number>\n): boolean {\n  let total = 0;\n\n  if (additional[2].test(vat)) {\n    // Extract the next digit and multiply by the counter.\n    for (let j = 0; j < 7; j++) {\n      total += Number(vat.charAt(j + 1)) * multipliers[j];\n    }\n\n    // Establish check digit.\n    let a;\n\n    if (total % 11 === 0) {\n      a = total + 11;\n    } else {\n      a = Math.ceil(total / 11) * 11;\n    }\n\n    const pointer = a - total - 1;\n\n    // Convert calculated check digit according to a lookup table\n    const expect = Number(vat.slice(8, 9));\n    if (!lookup) return false;\n    return lookup[pointer] === expect;\n  }\n\n  return false;\n}\n\nfunction isIndividualType3(vat: string, additional: ReadonlyArray<RegExp>): boolean {\n  if (additional[3].test(vat)) {\n    const temp: number =\n      Number(vat.slice(0, 2)) +\n      Number(vat.slice(2, 4)) +\n      Number(vat.slice(4, 6)) +\n      Number(vat.slice(6, 8)) +\n      Number(vat.slice(8));\n    const expect: boolean = Number(vat) % 11 === 0;\n    return !!(temp % 11 === 0 && expect);\n  }\n  return false;\n}\n","import { Country } from '../vat-validation';\n\nexport const denmark: Country = {\n  name: 'Denmark',\n  codes: ['DK', 'DNK', '208'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    for (let i = 0; i < 8; i++) {\n      total += Number(vat.charAt(i)) * denmark.rules.multipliers.common[i];\n    }\n\n    return total % 11 === 0;\n  },\n  rules: {\n    multipliers: {\n      common: [2, 7, 6, 5, 4, 3, 2, 1]\n    },\n    regex: [/^(DK)(\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const estonia: Country = {\n  name: 'Estonia',\n  codes: ['EE', 'EST', '233'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 8; i++) {\n      total += Number(vat.charAt(i)) * estonia.rules.multipliers.common[i];\n    }\n\n    // Establish check digits using modulus 10.\n    total = 10 - (total % 10);\n    if (total === 10) total = 0;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(8, 9));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [3, 7, 1, 3, 7, 1, 3, 7]\n    },\n    regex: [/^(EE)(10\\d{7})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const europe: Country = {\n  name: 'Europe',\n  codes: ['EU', 'EUR', '000'], // TODO (S.Panfilov) that's not a real codes\n  calcFn: (): boolean => {\n    // We know little about EU numbers apart from the fact that the first 3 digits represent the\n    // country, and that there are nine digits in total.\n    return true;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(EU)(\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const finland: Country = {\n  name: 'Finland',\n  codes: ['FI', 'FIN', '246'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 7; i++) total += Number(vat.charAt(i)) * finland.rules.multipliers.common[i];\n\n    // Establish check digit.\n    total = 11 - (total % 11);\n    if (total > 9) {\n      total = 0;\n    }\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(7, 8));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [7, 9, 10, 5, 8, 4, 2]\n    },\n    regex: [/^(FI)(\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const france: Country = {\n  name: 'France',\n  codes: ['FR', 'FRA', '250'],\n  calcFn: (vat: string): boolean => {\n    let total;\n\n    // Checks the check digits of a French VAT number.\n    if (!/^\\d{11}$/.test(vat)) return true;\n\n    // Extract the last nine digits as an integer.\n    total = Number(vat.substring(2));\n\n    // Establish check digit.\n    total = (total * 100 + 12) % 97;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(0, 2));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(FR)(\\d{11})$/, /^(FR)([A-HJ-NP-Z]\\d{10})$/, /^(FR)(\\d[A-HJ-NP-Z]\\d{9})$/, /^(FR)([A-HJ-NP-Z]{2}\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const germany: Country = {\n  name: 'Germany',\n  codes: ['DE', 'DEU', '276'],\n  calcFn: (vat: string): boolean => {\n    // Checks the check digits of a German VAT number.\n    let product = 10;\n    let sum = 0;\n    let checkDigit = 0;\n\n    for (let i = 0; i < 8; i++) {\n      // Extract the next digit and implement peculiar algorithm!.\n      sum = (Number(vat.charAt(i)) + product) % 10;\n      if (sum === 0) {\n        sum = 10;\n      }\n      product = (2 * sum) % 11;\n    }\n\n    // Establish check digit.\n    if (11 - product === 10) {\n      checkDigit = 0;\n    } else {\n      checkDigit = 11 - product;\n    }\n\n    // Compare it with the last two characters of the VAT number. If the same, then it is a valid\n    // check digit.\n    const expect = Number(vat.slice(8, 9));\n    return checkDigit === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(DE)([1-9]\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const greece: Country = {\n  name: 'Greece',\n  codes: ['GR', 'GRC', '300'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // eight character numbers should be prefixed with an 0.\n    const newVat = vat.length === 8 ? '0' + vat : vat;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 8; i++) {\n      total += Number(newVat.charAt(i)) * greece.rules.multipliers.common[i];\n    }\n\n    // Establish check digit.\n    total = total % 11;\n    total = total > 9 ? 0 : total;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(newVat.slice(8, 9));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [256, 128, 64, 32, 16, 8, 4, 2]\n    },\n    regex: [/^(EL)(\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const hungary: Country = {\n  name: 'Hungary',\n  codes: ['HU', 'HUN', '348'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 7; i++) {\n      total += Number(vat.charAt(i)) * hungary.rules.multipliers.common[i];\n    }\n\n    // Establish check digit.\n    total = 10 - (total % 10);\n    if (total === 10) total = 0;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(7, 8));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [9, 7, 3, 1, 9, 7, 3]\n    },\n    regex: [/^(HU)(\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const ireland: Country = {\n  name: 'Ireland',\n  codes: ['IE', 'IRL', '372'],\n  calcFn: (vat: string): boolean => {\n    const { typeFormats, multipliers } = ireland.rules;\n    if (!typeFormats || !typeFormats.first) return false;\n    let total: string | number = 0;\n\n    let newVat = vat;\n    // If the code is type 1 format, we need to convert it to the new before performing the validation.\n    if (typeFormats.first.test(vat)) {\n      newVat = '0' + vat.substring(2, 7) + vat.substring(0, 1) + vat.substring(7, 8);\n    }\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 7; i++) {\n      total += Number(newVat.charAt(i)) * multipliers.common[i];\n    }\n\n    // If the number is type 3 then we need to include the trailing A or H in the calculation\n    if (typeFormats.third.test(newVat)) {\n      // Add in a multiplier for the character A (1*9=9) or H (8*9=72)\n      total += newVat.charAt(8) === 'H' ? 72 : 9;\n    }\n\n    // Establish check digit using modulus 23, and translate to char. equivalent.\n    total = total % 23;\n    total = total === 0 ? 'W' : String.fromCharCode(total + 64);\n\n    // Compare it with the eighth character of the VAT number. If it's the same, then it's valid.\n    const expect = newVat.slice(7, 8);\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [8, 7, 6, 5, 4, 3, 2]\n    },\n    typeFormats: {\n      first: /^\\d[A-Z*+]/,\n      third: /^\\d{7}[A-Z][AH]$/\n    },\n    regex: [/^(IE)(\\d{7}[A-W])$/, /^(IE)([7-9][A-Z*+)]\\d{5}[A-W])$/, /^(IE)(\\d{7}[A-W][AH])$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const italy: Country = {\n  name: 'Italy',\n  codes: ['IT', 'ITA', '380'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n    let temp;\n\n    // The last three digits are the issuing office, and cannot exceed more 201, unless 999 or 888\n    if (Number(vat.slice(0, 7)) === 0) {\n      return false;\n    }\n\n    temp = Number(vat.slice(7, 10));\n    if (temp < 1 || (temp > 201 && temp !== 999 && temp !== 888)) {\n      return false;\n    }\n\n    // Extract the next digit and multiply by the appropriate\n    for (let i = 0; i < 10; i++) {\n      temp = Number(vat.charAt(i)) * italy.rules.multipliers.common[i];\n      if (temp > 9) total += Math.floor(temp / 10) + (temp % 10);\n      else total += temp;\n    }\n\n    // Establish check digit.\n    total = 10 - (total % 10);\n    if (total > 9) {\n      total = 0;\n    }\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(10, 11));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [1, 2, 1, 2, 1, 2, 1, 2, 1, 2]\n    },\n    regex: [/^(IT)(\\d{11})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const latvia: Country = {\n  name: 'Latvia',\n  codes: ['LV', 'LVA', '428'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Differentiate between legal entities and natural bodies. For the latter we simply check that\n    // the first six digits correspond to valid DDMMYY dates.\n    if (/^[0-3]/.test(vat)) {\n      return Boolean(/^[0-3][0-9][0-1][0-9]/.test(vat));\n    } else {\n      // Extract the next digit and multiply by the counter.\n      for (let i = 0; i < 10; i++) {\n        total += Number(vat.charAt(i)) * latvia.rules.multipliers.common[i];\n      }\n\n      // Establish check digits by getting modulus 11.\n      if (total % 11 === 4 && Number(vat[0]) === 9) total = total - 45;\n\n      if (total % 11 === 4) {\n        total = 4 - (total % 11);\n      } else if (total % 11 > 4) {\n        total = 14 - (total % 11);\n      } else if (total % 11 < 4) {\n        total = 3 - (total % 11);\n      }\n\n      // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n      const expect = Number(vat.slice(10, 11));\n      return total === expect;\n    }\n  },\n  rules: {\n    multipliers: {\n      common: [9, 1, 4, 8, 3, 10, 2, 5, 7, 6]\n    },\n    regex: [/^(LV)(\\d{11})$/]\n  }\n};\n","import { Country, Rules } from '../vat-validation';\n\nexport const lithuania: Country = {\n  name: 'Lithuania',\n  codes: ['LT', 'LTU', '440'],\n  calcFn: (vat: string): boolean => {\n    return _check9DigitVat(vat, lithuania.rules) || _check12DigitVat(vat, lithuania.rules);\n  },\n  rules: {\n    multipliers: {\n      short: [3, 4, 5, 6, 7, 8, 9, 1],\n      med: [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2],\n      alt: [3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4]\n    },\n    check: /^\\d{10}1/,\n    regex: [/^(LT)(\\d{9}|\\d{12})$/]\n  }\n};\n\nfunction _extractDigit(vat: string, multiplierList: ReadonlyArray<number>, key: number): number {\n  return Number(vat.charAt(key)) * multiplierList[key];\n}\n\nfunction _doubleCheckCalculation(vat: string, total: number, rules: Rules): number {\n  let result = total;\n  if (result % 11 === 10) {\n    result = 0;\n    for (let i = 0; i < 8; i++) {\n      result += _extractDigit(vat, rules.multipliers.short, i);\n    }\n  }\n\n  return result;\n}\n\nfunction extractDigit(vat: string, total: number): number {\n  let result = total;\n  for (let i = 0; i < 8; i++) {\n    result += Number(vat.charAt(i)) * (i + 1);\n  }\n  return result;\n}\n\nfunction checkDigit(total: number): number {\n  let result = total % 11;\n  if (result === 10) {\n    result = 0;\n  }\n\n  return result;\n}\n\nfunction _check9DigitVat(vat: string, rules: Rules): boolean {\n  // 9 character VAT numbers are for legal persons\n  let total = 0;\n  if (vat.length === 9) {\n    // 8th character must be one\n    if (!/^\\d{7}1/.test(vat)) return false;\n\n    // Extract the next digit and multiply by the counter+1.\n    total = extractDigit(vat, total);\n\n    // Can have a double check digit calculation!\n    total = _doubleCheckCalculation(vat, total, rules);\n\n    // Establish check digit.\n    total = checkDigit(total);\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(8, 9));\n    return total === expect;\n  }\n  return false;\n}\n\nfunction extractDigit12(vat: string, total: number, rules: Rules): number {\n  let result = total;\n  for (let k = 0; k < 11; k++) {\n    result += _extractDigit(vat, rules.multipliers.med, k);\n  }\n\n  return result;\n}\n\nfunction _doubleCheckCalculation12(vat: string, total: number, rules: Rules): number {\n  let result = total;\n  if (total % 11 === 10) {\n    result = 0;\n    for (let l = 0; l < 11; l++) {\n      result += _extractDigit(vat, rules.multipliers.alt, l);\n    }\n  }\n\n  return result;\n}\n\nfunction _check12DigitVat(vat: string, rules: Rules): boolean {\n  let total = 0;\n  // 12 character VAT numbers are for temporarily registered taxpayers\n  if (vat.length === 12) {\n    if (!rules.check) return false;\n    // 11th character must be one\n    if (!rules.check.test(vat)) return false;\n\n    // Extract the next digit and multiply by the counter+1.\n    total = extractDigit12(vat, total, rules);\n\n    // Can have a double check digit calculation!\n    total = _doubleCheckCalculation12(vat, total, rules);\n\n    // Establish check digit.\n    total = checkDigit(total);\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(11, 12));\n    return total === expect;\n  }\n\n  return false;\n}\n","import { Country } from '../vat-validation';\n\nexport const luxembourg: Country = {\n  name: 'Luxembourg',\n  codes: ['LU', 'LUX', '442'],\n  calcFn: (vat: string): boolean => {\n    const expect = Number(vat.slice(6, 8));\n    const checkDigit = Number(vat.slice(0, 6)) % 89;\n    // Checks the check digits of a Luxembourg VAT number.\n\n    return checkDigit === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(LU)(\\d{8})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const malta: Country = {\n  name: 'Malta',\n  codes: ['MT', 'MLT', '470'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 6; i++) {\n      total += Number(vat.charAt(i)) * malta.rules.multipliers.common[i];\n    }\n\n    // Establish check digits by getting modulus 37.\n    total = 37 - (total % 37);\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(6, 8));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [3, 4, 6, 7, 8, 9]\n    },\n    regex: [/^(MT)([1-9]\\d{7})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const netherlands: Country = {\n  name: 'Netherlands',\n  codes: ['NL', 'NLD', '528'],\n  calcFn: (input: string): boolean => {\n    const vat = input.replace(/[ \\-_]/g, '').toUpperCase();\n\n    const { additional, multipliers } = netherlands.rules;\n    if (!additional) return false;\n\n    const match = vat.match(additional[0]);\n    if (!match || !match[1]) return false;\n\n    const numb = match[1];\n\n    const characterValues = `NL${vat}`.split('').map(getCharValue);\n\n    let total = 0;\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 8; i++) {\n      total += Number(numb.charAt(i)) * multipliers.common[i];\n    }\n\n    // Establish check digits by getting modulus 11.\n    total = total % 11;\n    if (total > 9) {\n      total = 0;\n    }\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(numb.slice(8, 9));\n\n    // is either 11 proof or 97 mod proof.\n    return total === expect || isNinetySevenMod(characterValues.join(''));\n  },\n  rules: {\n    multipliers: {\n      common: [9, 8, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [/^(NL)(\\d{9}B\\d{2})$/],\n    additional: [/^(\\d{9})B\\d{2}$/]\n  }\n};\n\nfunction getCharValue(char: string): number {\n  // if one of these set values\n  if (char === '+') return 36;\n  if (char === '*') return 37;\n\n  // if A...Z return code VAL -55\n  const code = char.charCodeAt(0) - 55;\n  if (code > 9 && code < 91) return code;\n\n  return parseInt(char, 10);\n}\n\nfunction isNinetySevenMod(value: string): boolean {\n  const remainder = mod(value, 97);\n  return remainder === 1;\n}\n\n// custom module function, to check module on values above Number limit\nfunction mod(value: string, divisor: number): number {\n  // Initialize result\n  let res: number = 0;\n\n  for (const char of value.split('')) {\n    res = (res * 10 + +char) % divisor;\n  }\n\n  return res;\n}\n","import { Country } from '../vat-validation';\n\nexport const norway: Country = {\n  name: 'Norway',\n  codes: ['NO', 'NOR', '578'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n    // See http://www.brreg.no/english/coordination/number.html\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 8; i++) {\n      total += Number(vat.charAt(i)) * norway.rules.multipliers.common[i];\n    }\n\n    // Establish check digits by getting modulus 11. Check digits > 9 are invalid\n    total = 11 - (total % 11);\n\n    if (total === 11) {\n      total = 0;\n    }\n\n    if (total < 10) {\n      // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n      const expect = Number(vat.slice(8, 9));\n      return total === expect;\n    }\n\n    return false;\n  },\n  rules: {\n    multipliers: {\n      common: [3, 2, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [/^(NO)(\\d{9})(MVA)?$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const poland: Country = {\n  name: 'Poland',\n  codes: ['PL', 'POL', '616'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 9; i++) {\n      total += Number(vat.charAt(i)) * poland.rules.multipliers.common[i];\n    }\n\n    // Establish check digits subtracting modulus 11 from 11.\n    total = total % 11;\n    if (total > 9) {\n      return false;\n    }\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(9, 10));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [6, 5, 7, 2, 3, 4, 5, 6, 7]\n    },\n    regex: [/^(PL)(\\d{10})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const portugal: Country = {\n  name: 'Portugal',\n  codes: ['PT', 'PRT', '620'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 8; i++) {\n      total += Number(vat.charAt(i)) * portugal.rules.multipliers.common[i];\n    }\n\n    // Establish check digits subtracting modulus 11 from 11.\n    total = 11 - (total % 11);\n    if (total > 9) {\n      total = 0;\n    }\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(8, 9));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [9, 8, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [/^(PT)(\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const romania: Country = {\n  name: 'Romania',\n  codes: ['RO', 'ROU', '642'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    const vatLength = vat.length;\n    const multipliers = romania.rules.multipliers.common.slice(10 - vatLength);\n\n    for (let i = 0; i < vat.length - 1; i++) {\n      total += Number(vat.charAt(i)) * multipliers[i];\n    }\n\n    // Establish check digits by getting modulus 11.\n    total = (10 * total) % 11;\n    if (total === 10) total = 0;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(vat.length - 1, vat.length));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [7, 5, 3, 2, 1, 7, 5, 3, 2]\n    },\n    regex: [/^(RO)([1-9]\\d{1,9})$/]\n  }\n};\n","import { Country, Rules } from '../vat-validation';\n\nexport const russia: Country = {\n  name: 'Russian Federation',\n  codes: ['RU', 'RUS', '643'],\n  calcFn: (vat: string): boolean => {\n    // See http://russianpartner.biz/test_inn.html for algorithm\n    return _check10DigitINN(vat, russia.rules) || _check12DigitINN(vat, russia.rules);\n  },\n  rules: {\n    multipliers: {\n      m_1: [2, 4, 10, 3, 5, 9, 4, 6, 8, 0],\n      m_2: [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],\n      m_3: [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0]\n    },\n    regex: [/^(RU)(\\d{10}|\\d{12})$/]\n  }\n};\n\nfunction _check10DigitINN(vat: string, rules: Rules): boolean {\n  let total = 0;\n\n  if (vat.length === 10) {\n    for (let i = 0; i < 10; i++) {\n      total += Number(vat.charAt(i)) * rules.multipliers.m_1[i];\n    }\n\n    total = total % 11;\n    if (total > 9) {\n      total = total % 10;\n    }\n\n    // Compare it with the last character of the VAT number. If it is the same, then it's valid\n    const expect = Number(vat.slice(9, 10));\n    return total === expect;\n  }\n\n  return false;\n}\n\nfunction _check12DigitINN(vat: string, rules: Rules): boolean {\n  let total1 = 0;\n  let total2 = 0;\n\n  if (vat.length === 12) {\n    for (let j = 0; j < 11; j++) {\n      total1 += Number(vat.charAt(j)) * rules.multipliers.m_2[j];\n    }\n\n    total1 = total1 % 11;\n\n    if (total1 > 9) {\n      total1 = total1 % 10;\n    }\n\n    for (let k = 0; k < 11; k++) {\n      total2 += Number(vat.charAt(k)) * rules.multipliers.m_3[k];\n    }\n\n    total2 = total2 % 11;\n    if (total2 > 9) {\n      total2 = total2 % 10;\n    }\n\n    // Compare the first check with the 11th character and the second check with the 12th and last\n    // character of the VAT number. If they're both the same, then it's valid\n    const expect = total1 === Number(vat.slice(10, 11));\n    const expect2 = total2 === Number(vat.slice(11, 12));\n    return expect && expect2;\n  }\n\n  return false;\n}\n","import { Country } from '../vat-validation';\n\nexport const serbia: Country = {\n  name: 'Serbia',\n  codes: ['RS', 'SRB', '688'],\n  calcFn: (vat: string): boolean => {\n    // Checks the check digits of a Serbian VAT number using ISO 7064, MOD 11-10 for check digit.\n\n    let product = 10;\n    let sum = 0;\n\n    for (let i = 0; i < 8; i++) {\n      // Extract the next digit and implement the algorithm\n      sum = (Number(vat.charAt(i)) + product) % 10;\n      if (sum === 0) {\n        sum = 10;\n      }\n      product = (2 * sum) % 11;\n    }\n\n    // Now check that we have the right check digit\n    const expect = 1;\n    const checkDigit = (product + Number(vat.slice(8, 9))) % 10;\n    return checkDigit === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(RS)(\\d{9})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const singapore: Country = {\n  name: 'Singapore',\n  codes: ['SG', 'SGP', '702'],\n  calcFn: (): boolean => {\n    // Singapore UEN check digit algorithm is not publicly well-documented.\n    // Only format validation is performed.\n    return true;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(SG)(\\d{8,9}[A-Z])$/, /^(SG)([TSRF]\\d{2}[A-Z]{2}\\d{4}[A-Z])$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const slovakiaRepublic: Country = {\n  name: 'Slovakia Republic',\n  codes: ['SK', 'SVK', '703'],\n  calcFn: (vat: string): boolean => {\n    const expect = 0;\n    const checkDigit = Number(vat) % 11;\n    return checkDigit === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(SK)([1-9]\\d[2346-9]\\d{7})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const slovenia: Country = {\n  name: 'Slovenia',\n  codes: ['SI', 'SVN', '705'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n\n    // Extract the next digit and multiply by the counter.\n    for (let i = 0; i < 7; i++) {\n      total += Number(vat.charAt(i)) * slovenia.rules.multipliers.common[i];\n    }\n\n    // Establish check digits using modulus 11\n    total = 11 - (total % 11);\n    if (total === 10) {\n      total = 0;\n    }\n\n    // Compare the number with the last character of the VAT number. If it is the\n    // same, then it's a valid check digit.\n    const expect = Number(vat.slice(7, 8));\n    return !!(total !== 11 && total === expect);\n  },\n  rules: {\n    multipliers: {\n      common: [8, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [/^(SI)([1-9]\\d{7})$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const spain: Country = {\n  name: 'Spain',\n  codes: ['ES', 'ESP', '724'],\n  calcFn: (vat: string): boolean => {\n    const { additional, multipliers } = spain.rules;\n    if (!additional) return false;\n\n    // National juridical entities\n    if (additional[0].test(vat)) return isNationalJuridicalEntities(vat, multipliers.common);\n\n    // Juridical entities other than national ones\n    if (additional[1].test(vat)) return isNonNationalJuridical(vat, multipliers.common);\n\n    // Personal number (NIF) (starting with numeric of Y or Z)\n    if (additional[2].test(vat)) return isPersonalYtoZ(vat);\n\n    // Personal number (NIF) (starting with K, L, M, or X)\n    if (additional[3].test(vat)) return isPersonalKtoX(vat);\n\n    return false;\n  },\n  rules: {\n    multipliers: {\n      common: [2, 1, 2, 1, 2, 1, 2]\n    },\n    regex: [\n      /^(ES)([A-Z]\\d{8})$/,\n      /^(ES)([A-HN-SW]\\d{7}[A-J])$/,\n      /^(ES)([0-9YZ]\\d{7}[A-Z])$/,\n      /^(ES)([KLMX]\\d{7}[A-Z])$/\n    ],\n    additional: [/^[A-H|J|U|V]\\d{8}$/, /^[A-H|N-S|W]\\d{7}[A-J]$/, /^[0-9|Y|Z]\\d{7}[A-Z]$/, /^[K|L|M|X]\\d{7}[A-Z]$/]\n  }\n};\n\nfunction extractDigitAndMultiplyByCounter(vat: string, multipliers: ReadonlyArray<number>, total: number): number {\n  let temp: number;\n  let result = total;\n  for (let i = 0; i < 7; i++) {\n    temp = Number(vat.charAt(i + 1)) * multipliers[i];\n    if (temp > 9) {\n      result += Math.floor(temp / 10) + (temp % 10);\n    } else {\n      result += temp;\n    }\n  }\n  return result;\n}\n\nfunction isNationalJuridicalEntities(vat: string, multipliers: ReadonlyArray<number>): boolean {\n  let total = extractDigitAndMultiplyByCounter(vat, multipliers, 0);\n  // Now calculate the check digit itself.\n  total = 10 - (total % 10);\n  if (total === 10) {\n    total = 0;\n  }\n\n  // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n  const expect = Number(vat.slice(8, 9));\n  return total === expect;\n}\n\nfunction isNonNationalJuridical(vat: string, multipliers: ReadonlyArray<number>): boolean {\n  let total = extractDigitAndMultiplyByCounter(vat, multipliers, 0);\n\n  // Now calculate the check digit itself.\n  total = 10 - (total % 10);\n  const totalStr = String.fromCharCode(total + 64);\n\n  // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n  const expect = vat.slice(8, 9);\n  return totalStr === expect;\n}\n\nfunction isPersonalYtoZ(vat: string): boolean {\n  let tempNumber = vat;\n  if (tempNumber.substring(0, 1) === 'Y') tempNumber = tempNumber.replace(/Y/, '1');\n  if (tempNumber.substring(0, 1) === 'Z') tempNumber = tempNumber.replace(/Z/, '2');\n  const expect = 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(+tempNumber.substring(0, 8) % 23);\n  return tempNumber.charAt(8) === expect;\n}\n\nfunction isPersonalKtoX(vat: string): boolean {\n  const expect = 'TRWAGMYFPDXBNJZSQVHLCKE'.charAt(Number(vat.substring(1, 8)) % 23);\n  return vat.charAt(8) === expect;\n}\n","import { Country } from '../vat-validation';\n\nexport const sweden: Country = {\n  name: 'Sweden',\n  codes: ['SE', 'SWE', '752'],\n  calcFn: (vat: string): boolean => {\n    // Calculate R where R = R1 + R3 + R5 + R7 + R9, and Ri = INT(Ci/5) + (Ci*2) modulo 10\n    let R = 0;\n    for (let i = 0; i < 9; i = i + 2) {\n      const digit = Number(vat.charAt(i));\n      R += Math.floor(digit / 5) + ((digit * 2) % 10);\n    }\n\n    // Calculate S where S = C2 + C4 + C6 + C8\n    let S = 0;\n    for (let j = 1; j < 9; j = j + 2) {\n      S += Number(vat.charAt(j));\n    }\n\n    const checkDigit = (10 - ((R + S) % 10)) % 10;\n\n    // Compare it with the last character of the VAT number. If it's the same, then it's valid.\n    const expect = Number(vat.slice(9, 10));\n\n    return checkDigit === expect;\n  },\n  rules: {\n    multipliers: {},\n    regex: [/^(SE)(\\d{10}01)$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const switzerland: Country = {\n  name: 'Switzerland',\n  codes: ['CH', 'CHE', '756'],\n  calcFn: (vat: string): boolean => {\n    let total = 0;\n    for (let i = 0; i < 8; i++) {\n      total += Number(vat.charAt(i)) * switzerland.rules.multipliers.common[i];\n    }\n\n    // Establish check digit.s\n    total = 11 - (total % 11);\n    if (total === 10) return false;\n    if (total === 11) total = 0;\n\n    // Check to see if the check digit given is correct, If not, we have an error with the VAT number\n    const expect = Number(vat.substr(8, 1));\n    return total === expect;\n  },\n  rules: {\n    multipliers: {\n      common: [5, 4, 3, 2, 7, 6, 5, 4]\n    },\n    regex: [/^(CHE)(\\d{9})(MWST|TVA|IVA)?$/]\n  }\n};\n","import { Country } from '../vat-validation';\n\nexport const unitedKingdom: Country = {\n  name: 'United Kingdom',\n  codes: ['GB', 'GBR', '826', 'XI'],\n  calcFn: (vat: string): boolean => {\n    // Government departments\n    if (vat.substr(0, 2) === 'GD') return isGovernmentDepartment(vat);\n\n    // Health authorities\n    if (vat.substr(0, 2) === 'HA') return isHealthAuthorities(vat);\n\n    // Standard and commercial numbers\n    return isStandardOrCommercialNumber(vat, unitedKingdom.rules.multipliers.common);\n  },\n  rules: {\n    multipliers: {\n      common: [8, 7, 6, 5, 4, 3, 2]\n    },\n    regex: [\n      /^(GB)?(\\d{9})$/,\n      /^(GB)?(\\d{12})$/,\n      /^(GB)?(GD\\d{3})$/,\n      /^(GB)?(HA\\d{3})$/,\n      /^(XI)(\\d{9})$/,\n      /^(XI)(\\d{12})$/,\n      /^(XI)(GD\\d{3})$/,\n      /^(XI)(HA\\d{3})$/\n    ]\n  }\n};\n\nfunction isGovernmentDepartment(vat: string): boolean {\n  const expect = 500;\n  return Number(vat.substr(2, 3)) < expect;\n}\n\nfunction isHealthAuthorities(vat: string): boolean {\n  const expect = 499;\n  return Number(vat.substr(2, 3)) > expect;\n}\n\nfunction isStandardOrCommercialNumber(vat: string, multipliers: ReadonlyArray<number>): boolean {\n  let total = 0;\n\n  // 0 VAT numbers disallowed!\n  if (Number(vat.slice(0)) === 0) return false;\n\n  // Check range is OK for modulus 97 calculation\n  const no = Number(vat.slice(0, 7));\n\n  // Extract the next digit and multiply by the counter.\n  for (let i = 0; i < 7; i++) {\n    total += Number(vat.charAt(i)) * multipliers[i];\n  }\n\n  // Old numbers use a simple 97 modulus, but new numbers use an adaptation of that (less 55). Our\n  // VAT number could use either system, so we check it against both.\n\n  // Establish check digits by subtracting 97 from total until negative.\n  let checkDigit = total;\n  while (checkDigit > 0) {\n    checkDigit = checkDigit - 97;\n  }\n\n  // Get the absolute value and compare it with the last two characters of the VAT number. If the\n  // same, then it is a valid traditional check digit. However, even then the number must fit within\n  // certain specified ranges.\n  checkDigit = Math.abs(checkDigit);\n  if (\n    checkDigit === Number(vat.slice(7, 9)) &&\n    no < 9990001 &&\n    (no < 100000 || no > 999999) &&\n    (no < 9490001 || no > 9700000)\n  ) {\n    return true;\n  }\n  // Now try the new method by subtracting 55 from the check digit if we can - else add 42\n  if (checkDigit >= 55) {\n    checkDigit = checkDigit - 55;\n  } else {\n    checkDigit = checkDigit + 42;\n  }\n\n  const expect = Number(vat.slice(7, 9));\n  return Boolean(checkDigit === expect && no > 1000000);\n}\n","import { australia, brazil } from './countries';\n\nexport interface Multipliers {\n  readonly [key: string]: ReadonlyArray<number>;\n}\n\nexport interface Rules {\n  multipliers: Multipliers;\n  check?: RegExp;\n  regex: ReadonlyArray<RegExp>;\n  lookup?: ReadonlyArray<number>;\n  typeFormats?: { readonly [key: string]: RegExp };\n  additional?: ReadonlyArray<RegExp>;\n}\n\nexport interface Country {\n  name: string;\n  codes: ReadonlyArray<string>;\n  calcFn: (vat: string, options?: { readonly [key: string]: unknown }) => boolean;\n  rules: Rules;\n}\n\nexport interface VatCheckResult {\n  value?: string;\n  isValid: boolean;\n  isValidFormat: boolean;\n  isSupportedCountry: boolean;\n  country?: {\n    name: string;\n    isoCode: { short: string; long: string; numeric: string };\n  };\n}\n\nfunction makeResult(vat: string, isValid?: boolean, country?: Country): VatCheckResult {\n  return {\n    value: vat || undefined,\n    isValid: Boolean(isValid),\n    isValidFormat: country ? isVatValidToRegexp(vat, country.rules.regex).isValid : false,\n    isSupportedCountry: Boolean(country),\n    country: !country\n      ? undefined\n      : {\n          name: country.name,\n          isoCode: {\n            short: country.codes[0],\n            long: country.codes[1],\n            numeric: country.codes[2]\n          }\n        }\n  };\n}\n\nfunction removeExtraChars(vat: string = ''): string {\n  return vat\n    .toString()\n    .toUpperCase()\n    .replace(/(\\s|-|\\.|\\/)+/g, '');\n}\n\nfunction getCountryCodes(country: Country): ReadonlyArray<string> {\n  return [...country.codes, country.name === 'Greece' ? 'EL' : undefined].filter(Boolean) as ReadonlyArray<string>;\n}\n\nconst countriesVATDoesNotStartWithCountryCode: ReadonlyArray<string> = [australia.name, brazil.name];\n\nfunction isVATStartWithCountryCode(countryName: string): boolean {\n  return !countriesVATDoesNotStartWithCountryCode.includes(countryName);\n}\n\nfunction isVATStartWithNumber(vat: string): boolean {\n  return !!vat.match(/^\\d{2}/);\n}\n\nfunction getCountry(vat: string, countriesList: ReadonlyArray<Country>): Country | undefined {\n  for (const country of countriesList) {\n    if (startsWithCode(vat, country) || (!isVATStartWithCountryCode(country.name) && isVATStartWithNumber(vat))) {\n      return { ...country };\n    }\n  }\n  return undefined;\n}\n\nfunction startsWithCode(vat: string, country: Country): boolean {\n  const countryCodes = getCountryCodes(country);\n  return countryCodes.filter((code) => vat.startsWith(code)).length > 0;\n}\n\nfunction isVatValidToRegexp(vat: string, regexArr: ReadonlyArray<RegExp>): { isValid: boolean; regex?: RegExp } {\n  for (const regex of regexArr) {\n    const isValid = regex.test(vat);\n    if (isValid) return { isValid: true, regex: regex };\n  }\n\n  return { isValid: false, regex: undefined };\n}\n\nfunction isVatValid(vat: string, country: Country): boolean {\n  const regexpValidRes = isVatValidToRegexp(vat, country.rules.regex);\n  if (!regexpValidRes.isValid || !regexpValidRes.regex) return false;\n  const regexResult = regexpValidRes.regex.exec(vat);\n  if (!regexResult) return false;\n  return country.calcFn(regexResult[2]);\n}\n\nexport interface CheckVATOptions {\n  strict?: boolean;\n}\n\nexport function checkVAT(\n  vat: string,\n  countriesList: ReadonlyArray<Country> = [],\n  options?: CheckVATOptions\n): VatCheckResult {\n  if (!vat) return makeResult(vat, false);\n  const cleanVAT = options?.strict ? vat.toUpperCase() : removeExtraChars(vat);\n  const country = getCountry(cleanVAT, countriesList);\n  const isValid = country ? isVatValid(cleanVAT, country) : false;\n  return makeResult(cleanVAT, isValid, country);\n}\n"],"mappings":"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","names":["checkDigit","checkDigit","checkDigit","checkDigit","checkDigit","checkDigit"]}