Metadata changes, new countries, small code changes.
authorlararennie@google.com <lararennie@google.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Thu, 20 Jan 2011 14:26:34 +0000 (14:26 +0000)
committerlararennie@google.com <lararennie@google.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Thu, 20 Jan 2011 14:26:34 +0000 (14:26 +0000)
git-svn-id: http://libphonenumber.googlecode.com/svn/trunk@66 ee073f10-1060-11df-b6a4-87a95322a99c

47 files changed:
java/release_notes.txt
java/resources/com/google/i18n/phonenumbers/BuildMetadataFromXml.java
java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml
java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java

index 860189c..4206e3a 100644 (file)
@@ -1,3 +1,23 @@
+Jan 20th, 2011
+* Code improvements:
+  - Handle null phone-numbers when parsing by throwing a NumberParseException.
+  - Handle extension written with an accented "o", as per Spanish, when parsing.
+  - Handle U+30FC dashes as phone-number punctuation.
+  - Allow "ZZ" or null regions to be specified for numbers starting with a full-width "+" symbol, or
+    with other characters (such as whitespace) before the leading +.
+  - new getLengthOfNationalDestinationCode function
+* Metadata changes:
+  - New types of numbers introduced: UAN (universal or "company" numbers) and short codes. Note that
+    "generalDesc" patterns do not encompass short-codes.  No code-support for these has been
+    introduced as of yet. We are also now enabling the collection of data for information such as
+    area-code-optional, and no-international-dialling ranges.
+  - Data updates as per ITU notifications/bug fixes for the following countries: AM, BH, CD, CG, CR,
+    DE, DJ, EE, GB, GN, HU, IE, JO, JP, LB, LR, MA, MK, MN, MR, NA, PG, SC, SG, SO, SZ, VN, ZA, ZW
+  - Data added for the following countries: BZ, CU, EC, FO, GI, HN, HT, LK, MT, MV, NU, PS, SD
+  - Indentation fixes in reg-exes for the following countries: BG, GB
+  - Allow nationalPrefixForParsing to be specified for countries with no national prefix, to handle
+    possible carrier prefixes
+
 Jan 3rd, 2011
 * Metadata changes:
   - Updates to JE
index 1f2b77b..5c2ef7a 100644 (file)
@@ -126,20 +126,21 @@ public class BuildMetadataFromXml {
     String nationalPrefix = "";
     String nationalPrefixFormattingRule = "";
     String carrierCodeFormattingRule = "";
+    if (element.hasAttribute("nationalPrefixForParsing")) {
+      metadata.setNationalPrefixForParsing(
+          validateRE(element.getAttribute("nationalPrefixForParsing")));
+      if (element.hasAttribute("nationalPrefixTransformRule")) {
+        metadata.setNationalPrefixTransformRule(
+            validateRE(element.getAttribute("nationalPrefixTransformRule")));
+      }
+    }
     if (element.hasAttribute("nationalPrefix")) {
       nationalPrefix = element.getAttribute("nationalPrefix");
       metadata.setNationalPrefix(nationalPrefix);
       nationalPrefixFormattingRule =
           validateRE(getNationalPrefixFormattingRuleFromElement(element, nationalPrefix));
 
-      if (element.hasAttribute("nationalPrefixForParsing")) {
-        metadata.setNationalPrefixForParsing(
-            validateRE(element.getAttribute("nationalPrefixForParsing")));
-        if (element.hasAttribute("nationalPrefixTransformRule")) {
-          metadata.setNationalPrefixTransformRule(
-              validateRE(element.getAttribute("nationalPrefixTransformRule")));
-        }
-      } else {
+      if (!metadata.hasNationalPrefixForParsing()) {
         metadata.setNationalPrefixForParsing(nationalPrefix);
       }
     }
index abf008a..fb011b2 100644 (file)
      @author: Lara Rennie
 
      MetaData on Phone Number Plan and formatting rules
-     Note: Territories are in alphabetical order by their IDs, which are
-           based on ISO 3166-1 two-letter country codes. The country names
-           in the comments are the official short names in English according
-           to ISO 3166-1.
+     Note: Territories are in alphabetical order by their IDs, which are based on ISO 3166-1
+           two-letter country codes. The country names in the comments are the official short names
+           in English according to ISO 3166-1.
 
      For more information on what each element represents, see
      java/com/google/i18n/phonenumbers/phonemetadata.proto
 
-     Note that if you want to add validation metadata, the generalDesc
-     nationalNumberPattern and possibleNumberPattern must be provided.
-     If this is missing, then the country will be considered to have no more
-     specific phone-number type metadata (fixedLine, mobile etc) and hence only
-     basic validation rules (numbers should be between 3 and 15 digits long)
-     will be applied.
+     Note that if you want to add validation metadata, the generalDesc nationalNumberPattern and
+     possibleNumberPattern must be provided. If this is missing, then the country will be
+     considered to have no more specific phone-number type metadata (fixedLine, mobile etc) and
+     hence only basic validation rules (numbers should be between 3 and 15 digits long) will be
+     applied.
+
+     Country code, international and national prefix information main source:
+     http://www.itu.int/publ/T-SP-E.164C-2010/en
 -->
 
 <!DOCTYPE phoneNumberMetadata [
     <!ELEMENT phoneNumberMetadata (territories)>
     <!ELEMENT territories (territory+)>
-    <!ELEMENT territory (availableFormats?, generalDesc?, fixedLine?, mobile?, pager?, tollFree?,
-        premiumRate?, sharedCost?, personalNumber?, voip?)>
+    <!ELEMENT territory (availableFormats?, generalDesc?, noInternationalDialling?,
+        areaCodeOptional?, fixedLine?, mobile?, pager?, tollFree?, premiumRate?,
+        sharedCost?, personalNumber?, voip?, uan?, shortCode?)>
     <!ELEMENT generalDesc (nationalNumberPattern, possibleNumberPattern)>
+    <!ELEMENT noInternationalDialling (nationalNumberPattern, possibleNumberPattern,
+        exampleNumber?)>
+    <!ELEMENT areaCodeOptional (nationalNumberPattern, possibleNumberPattern, exampleNumber?)>
     <!ELEMENT fixedLine (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
     <!ELEMENT mobile (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
     <!ELEMENT pager (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
@@ -46,6 +51,8 @@
     <!ELEMENT sharedCost (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
     <!ELEMENT personalNumber (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
     <!ELEMENT voip (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
+    <!ELEMENT uan (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
+    <!ELEMENT shortCode (nationalNumberPattern?, possibleNumberPattern?, exampleNumber?)>
     <!ELEMENT availableFormats (numberFormat+, intlNumberFormat*)>
     <!ELEMENT nationalNumberPattern (#PCDATA)>
     <!ELEMENT possibleNumberPattern (#PCDATA)>
@@ -72,7 +79,7 @@
     <!ATTLIST numberFormat pattern CDATA #REQUIRED>
     <!ATTLIST intlNumberFormat pattern CDATA #REQUIRED>
     <!ATTLIST intlNumberFormat carrierCodeFormattingRule CDATA #IMPLIED>
-    ]>
+]>
 
 <phoneNumberMetadata>
   <territories>
         <numberFormat pattern="(\d{2})(\d{6})">
           <leadingDigits>
             [17]|
-            9[1-49]
+            9[1-469]
           </leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
         <nationalNumberPattern>
           (?:
             77|
-            9[1-49]
+            9[1-469]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>80112345</exampleNumber>
       </sharedCost>
+      <shortCode>
+        <nationalNumberPattern>
+          8[1-7]\d{2}|
+          1\d{2}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{3,4}</possibleNumberPattern>
+        <exampleNumber>8711</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Netherlands Antilles -->
       </generalDesc>
       <fixedLine>
         <nationalNumberPattern>
-          (?:2\d|[36]\d|5[1-9]|8[1-6]|9[1-7])\d{5,6}|
-          (?:4(?:[124-7]\d|3[1-6])|7(?:0[1-9]|[1-9]\d))\d{4,5}
+          (?:
+            2\d|
+            [36]\d|
+            5[1-9]|
+            8[1-6]|
+            9[1-7]
+          )\d{5,6}|
+          (?:
+            4(?:
+              [124-7]\d|
+              3[1-6]
+            )|
+            7(?:
+              0[1-9]|
+              [1-9]\d
+            )
+          )\d{4,5}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
         <exampleNumber>2123456</exampleNumber>
 
     <!-- Bahrain -->
     <!-- http://www.itu.int/oth/T0202000011/en -->
+    <!-- http://www.tra.org.bh/en/pdf/National_Numbering_Plan_2.pdf -->
     <territory id="BH" countryCode="973" internationalPrefix="00">
       <availableFormats>
         <numberFormat pattern="(\d{4})(\d{4})">
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[1367]\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>[136-9]\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
       </generalDesc>
       <!-- Universal Service numbers are under both Mobile and Fixed-Line, as they can be assigned
         </nationalNumberPattern>
         <exampleNumber>36001234</exampleNumber>
       </mobile>
+      <tollFree>
+        <nationalNumberPattern>80\d{6}</nationalNumberPattern>
+        <exampleNumber>80123456</exampleNumber>
+      </tollFree>
+      <!-- 87 numbers are "wholly paid by the caller", so they are slotted under premium-rate for
+           now. -->
+      <premiumRate>
+        <nationalNumberPattern>
+          (?:
+            87|
+            9[014578]
+          )\d{6}
+        </nationalNumberPattern>
+        <exampleNumber>90123456</exampleNumber>
+      </premiumRate>
+      <sharedCost>
+        <nationalNumberPattern>84\d{6}</nationalNumberPattern>
+        <exampleNumber>84123456</exampleNumber>
+      </sharedCost>
     </territory>
 
     <!-- Burundi -->
     </territory>
 
     <!-- Belize -->
-    <territory id="BZ" countryCode="501" internationalPrefix="00"
-               nationalPrefix="0">
+    <!-- http://www.itu.int/oth/T0202000016/en -->
+    <!-- The trunk prefix, formally 0, was dropped in the last reorganisation of the numbering plan.
+         -->
+    <territory id="BZ" countryCode="501" internationalPrefix="00">
+      <availableFormats>
+        <numberFormat pattern="(\d{3})(\d{4})">
+          <leadingDigits>[2-8]</leadingDigits>
+          <!-- Adding hyphen following the Belize Telemedia formatting rules. -->
+          <format>$1-$2</format>
+        </numberFormat>
+        <numberFormat pattern="(0)(800)(\d{4})(\d{3})">
+          <leadingDigits>0</leadingDigits>
+          <format>$1-$2-$3-$4</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>
+          [2-8]\d{6}|
+          0\d{10}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{7}(?:\d{4})?</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>[234578][02]\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <exampleNumber>2221234</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          6(?:
+            [01]\d|
+            2[0-5]|
+            [67][01])\d{4}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <exampleNumber>6221234</exampleNumber>
+      </mobile>
+      <!-- We don't know how these would be dialled internationally - it is possible that they can't
+           be dialled internationally at all - so we represent the leading 0 as part of the number.
+           Information from www.belizetelemedia.net. -->
+      <tollFree>
+        <nationalNumberPattern>0800\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{11}</possibleNumberPattern>
+        <exampleNumber>08001234123</exampleNumber>
+      </tollFree>
     </territory>
 
     <!-- Canada -->
       <mobile>
         <nationalNumberPattern>
           (?:
-            8[0149]|
+            8[0-2489]|
             9[7-9]
           )\d{7}
         </nationalNumberPattern>
     <!-- http://www.itu.int/oth/T020200002E/en -->
     <territory id="CG" countryCode="242" internationalPrefix="00">
       <availableFormats>
-        <numberFormat pattern="(\d{3})(\d{4})">
-          <format>$1 $2</format>
+        <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+          <leadingDigits>[02]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <numberFormat pattern="(\d)(\d{4})(\d{4})">
+          <leadingDigits>8</leadingDigits>
+          <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[24-68]\d{6}</nationalNumberPattern>
-        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <nationalNumberPattern>[028]\d{8}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
-        <!-- Revision to plan in December 2009 says that the prefix '8' is to be used temporarily
-             for fixed-line numbers while awaiting revision of the plan. -->
-        <nationalNumberPattern>
-          (?:
-            2[1-589]|
-            8\d
-          )\d{5}
-        </nationalNumberPattern>
-        <exampleNumber>2123456</exampleNumber>
+        <nationalNumberPattern>222[1-589]\d{5}</nationalNumberPattern>
+        <exampleNumber>222123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>[4-6]\d{6}</nationalNumberPattern>
-        <exampleNumber>5012345</exampleNumber>
+        <nationalNumberPattern>0[14-6]\d{7}</nationalNumberPattern>
+        <exampleNumber>061234567</exampleNumber>
       </mobile>
+      <!-- Referred to as a "Green number" in the telephone plan. -->
+      <tollFree>
+        <nationalNumberPattern>800\d{6}</nationalNumberPattern>
+        <exampleNumber>800123456</exampleNumber>
+      </tollFree>
     </territory>
 
     <!-- Switzerland -->
     <!-- http://www.itu.int/oth/T0202000030/en -->
     <territory id="CR" countryCode="506" internationalPrefix="00">
       <availableFormats>
-        <numberFormat pattern="([28]\d{3})(\d{4})">
+        <numberFormat pattern="(\d{4})(\d{4})">
+          <leadingDigits>
+            2|
+            8[389]
+          </leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
+        <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+          <leadingDigits>[89]0</leadingDigits>
+          <format>$1-$2-$3</format>
+        </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[28]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <nationalNumberPattern>[289]\d{7,9}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8,10}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <nationalNumberPattern>2[24-7]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>22123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>8[38]\d{6}</nationalNumberPattern>
+        <nationalNumberPattern>8[389]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>83123456</exampleNumber>
       </mobile>
+      <tollFree>
+          <nationalNumberPattern>800\d{7}</nationalNumberPattern>
+          <possibleNumberPattern>\d{10}</possibleNumberPattern>
+          <exampleNumber>8001234567</exampleNumber>
+      </tollFree>
+      <premiumRate>
+          <!-- Includes "mass calls" numbers with prefix 905. -->
+          <nationalNumberPattern>90[059]\d{7}</nationalNumberPattern>
+          <possibleNumberPattern>\d{10}</possibleNumberPattern>
+          <exampleNumber>9001234567</exampleNumber>
+      </premiumRate>
     </territory>
 
     <!-- Cuba -->
+    <!-- www.itu.int/oth/T0202000033/en -->
     <territory id="CU" countryCode="53" internationalPrefix="119"
-               nationalPrefix="0">
+               nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
+      <availableFormats>
+        <numberFormat pattern="(\d)(\d{6,7})">
+          <leadingDigits>7</leadingDigits>
+          <format>$1 $2</format>
+        </numberFormat>
+        <numberFormat pattern="(\d{2})(\d{4,6})">
+          <leadingDigits>[2-4]</leadingDigits>
+          <format>$1 $2</format>
+        </numberFormat>
+        <numberFormat pattern="(\d)(\d{7})" nationalPrefixFormattingRule="$NP$FG">
+          <leadingDigits>5</leadingDigits>
+          <format>$1 $2</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[2-57]\d{5,7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{4,8}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          (?:
+            2[1-4]\d{5,6}|
+            3(?:
+              1\d{6}|
+              [23]\d{4,6})|
+            4(?:
+              [125]\d{5,6}|
+              [36]\d{6}|
+              [78]\d{4,6})|
+            7\d{6,7})
+        </nationalNumberPattern>
+        <exampleNumber>71234567</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>5\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>51234567</exampleNumber>
+      </mobile>
     </territory>
 
     <!-- Cape Verde -->
     </territory>
 
     <!-- Germany -->
-    <!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000510001XLSE.xls -->
+    <!-- http://www.itu.int/oth/T0202000051/en -->
     <territory id="DE" countryCode="49" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
              stricter for numbers starting with 49, to try and remove the country code if the number
              begins with 49 whenever possible. -->
         <nationalNumberPattern>
-          (?:
-            4[0-8]|
-            [1-35-9]\d
-          )\d{4,12}|
-          49(?:
-            4[1-8]|
-            [0-35-7]\d
-          )\d{2,7}
+          [1-35-9]\d{3,13}|
+          4(?:
+            [0-8]\d{4,12}|
+            9(?:
+              4[1-8]|
+              [0-35-7]\d
+            )\d{2,7}
+          )
         </nationalNumberPattern>
         <possibleNumberPattern>\d{2,14}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
+        <!-- The numbering plan defines rather optimistic longest-number limits - online numbers
+             don't seem to respect this. The max-length is hence extended. -->
         <nationalNumberPattern>
-          (?:
-            [246]\d{2}|
-            3[02-9]\d|
-            5(?:
-              0[2-8]|
-              [38][0-8]|
-              [124-6]\d|
-              [79][0-7]
-            )|
-            [789](?:
-              [1-9]\d|
-              0[2-9]
-            )
+          [246]\d{5,13}|
+          3(?:
+            [03-9]\d{4,11}|
+            2\d{9}
+          )|
+          5(?:
+            0[2-8]|
+            [38][0-8]|
+            [124-6]\d|
+            [79][0-7]
+          )\d{3,10}|
+          7(?:
+            0[2-8]|
+            [1-9]\d
+          )\d{3,10}|
+          8(?:
+            0[2-9]|
+            [1-9]\d
+          )\d{3,10}|
+          9(?:
+            0[6-9]|
+            [1-9]\d
           )\d{3,10}
         </nationalNumberPattern>
         <exampleNumber>30123456</exampleNumber>
               [0-57-9]|
               6\d
             )\d{7}|
-            6[02]\d{7,8}|
-            63\d{7}
+            6(?:
+              [02]\d{7,8}|
+              3\d{7}
+            )
           )
         </nationalNumberPattern>
         <possibleNumberPattern>\d{10,11}</possibleNumberPattern>
         <exampleNumber>15123456789</exampleNumber>
       </mobile>
+      <pager>
+        <nationalNumberPattern>
+          16(?:
+            4\d{1,10}|
+            [89]\d{1,11}
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{4,14}</possibleNumberPattern>
+        <exampleNumber>16412345</exampleNumber>
+      </pager>
       <tollFree>
         <nationalNumberPattern>800\d{7,9}</nationalNumberPattern>
         <possibleNumberPattern>\d{10,12}</possibleNumberPattern>
         <!-- The number format here is suggested in the plan and used online,
         although the phone numbers of the national numbering authority itself on
         the plan do not follow this. -->
-        <numberFormat pattern="([2-8]\d)(\d{2})(\d{2})">
+        <numberFormat pattern="(\d{2})(\d{2})(\d{2})">
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[2-8]\d{5}</nationalNumberPattern>
+        <nationalNumberPattern>[1-8]\d{5}</nationalNumberPattern>
         <possibleNumberPattern>\d{6}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
-        <!-- 32 and 33 are not mentioned in the plan, but seem to be in use. 32
-        is the prefix of the phone number for the Télécom company itself. -->
+        <!-- Includes "Numéro long CDMA fixe" numbers starting with the digit 5. -->
         <nationalNumberPattern>
           (?:
-            25|
-            3[0-6]|
-            42
+            1[05]|
+            [2-5]\d
           )\d{4}
         </nationalNumberPattern>
         <exampleNumber>251234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- 86 and 87 have been added as prefixes since them seem to be widely used in numbers
-             found online. -->
-        <nationalNumberPattern>
-          (?:
-            [5-7]\d|
-            8[0-7]
-          )\d{4}
-        </nationalNumberPattern>
+        <nationalNumberPattern>[6-8]\d{5}</nationalNumberPattern>
         <exampleNumber>601234</exampleNumber>
       </mobile>
     </territory>
     </territory>
 
     <!-- Ecuador -->
+    <!-- http://en.wikipedia.org/wiki/+593 -->
+    <!-- http://www.conatel.gov.ec -->
+    <!-- http://www.itu.int/oth/T020200003D/en -->
+    <!-- A new plan has been prepared, but no implementation date has yet been stated. -->
     <territory id="EC" countryCode="593" internationalPrefix="00"
-               nationalPrefix="0">
+               nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
+      <availableFormats>
+        <numberFormat pattern="(\d)(\d{3})(\d{4})">
+          <leadingDigits>[2-7]</leadingDigits>
+          <format>$1 $2-$3</format>
+        </numberFormat>
+        <intlNumberFormat pattern="(\d)(\d{3})(\d{4})">
+          <leadingDigits>[2-7]</leadingDigits>
+          <format>$1-$2-$3</format>
+        </intlNumberFormat>
+        <numberFormat pattern="(\d{2})(\d{3})(\d{3})"
+          nationalPrefixFormattingRule="$NP$FG">
+          <leadingDigits>[89]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <intlNumberFormat pattern="(\d{2})(\d{3})(\d{3})">
+          <leadingDigits>[89]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </intlNumberFormat>
+        <numberFormat pattern="(1800)(\d{3})(\d{3,4})"
+          nationalPrefixFormattingRule="$FG">
+          <leadingDigits>1</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <intlNumberFormat pattern="(1800)(\d{3})(\d{3,4})">
+          <leadingDigits>1</leadingDigits>
+          <format>$1 $2 $3</format>
+        </intlNumberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[2-9]\d{7}|1\d{9,10}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7,11}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>[2-7][2-7]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
+        <exampleNumber>22123456</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>[89]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>99123456</exampleNumber>
+      </mobile>
+      <tollFree>
+        <nationalNumberPattern>1800\d{6,7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{10,11}</possibleNumberPattern>
+        <exampleNumber>18001234567</exampleNumber>
+      </tollFree>
     </territory>
 
     <!-- Estonia -->
+    <!-- http://www.itu.int/oth/T0202000043/en -->
     <!-- http://www.tja.ee/public/Legislation_side/Numbering_/Estonian_NP_eng.htm -->
     <territory id="EE" countryCode="372" internationalPrefix="00">
       <availableFormats>
+        <!-- When 7-digit 70 numbers are phased out, they should be removed from this formatting
+             pattern and only 7[1-9] left. -->
         <numberFormat pattern="([34-79]\d{2})(\d{4})">
           <leadingDigits>
-            [34679]|
+            [3679]|
+            4[3-8]|
             5(?:
               [0-2]|
               5[0-478]|
             )
           </leadingDigits>
           <leadingDigits>
-            [34679]|
+            [3679]|
+            4[3-8]|
             5(?:
               [02]|
               1(?:
           </leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
+        <numberFormat pattern="(70)(\d{2})(\d{4})">
+          <leadingDigits>70</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
         <numberFormat pattern="(8000)(\d{3})(\d{3})">
           <leadingDigits>800</leadingDigits>
           <leadingDigits>8000</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="([58]\d{3})(\d{3,4})">
+        <numberFormat pattern="([458]\d{3})(\d{3,4})">
           <leadingDigits>
+            40|
             5|
             8(?:
               00|
             )
           </leadingDigits>
           <leadingDigits>
+            40|
             5|
             8(?:
               00[1-9]|
         </nationalNumberPattern>
         <possibleNumberPattern>\d{6,10}</possibleNumberPattern>
       </generalDesc>
+      <noInternationalDialling>
+        <nationalNumberPattern>800[2-9]\d{3}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <exampleNumber>8002123</exampleNumber>
+      </noInternationalDialling>
       <fixedLine>
+        <!-- Supporting eFax numbers here as well. -->
         <nationalNumberPattern>
           (?:
             3[23589]|
-            4[3-8]|
+            4(?:
+              0\d|
+              [3-8]
+            )|
             6\d|
             7[1-9]|
             88
           )\d{5}
         </nationalNumberPattern>
-        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
         <exampleNumber>3212345</exampleNumber>
       </fixedLine>
       <mobile>
         <exampleNumber>9001234</exampleNumber>
       </premiumRate>
       <personalNumber>
-        <nationalNumberPattern>70\d{5}</nationalNumberPattern>
-        <possibleNumberPattern>\d{7}</possibleNumberPattern>
-        <exampleNumber>7012345</exampleNumber>
+        <!-- The third digit is optional until Jan 1st 2011, when numbers will have been changed to
+             the new 8 digit series. -->
+        <nationalNumberPattern>70[0-2]?\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
+        <exampleNumber>70012345</exampleNumber>
       </personalNumber>
+      <shortCode>
+        <nationalNumberPattern>1[1-9]\d</nationalNumberPattern>
+        <possibleNumberPattern>\d{3}</possibleNumberPattern>
+        <exampleNumber>112</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Egypt -->
     </territory>
 
     <!-- Faroe Islands -->
-    <territory id="FO" countryCode="298" internationalPrefix="00">
+    <!-- http://www.itu.int/oth/T0202000047/en -->
+    <territory id="FO" countryCode="298" internationalPrefix="00"
+         nationalPrefixForParsing="10(?:01|[12]0|88)">
+      <generalDesc>
+        <nationalNumberPattern>[2-9]\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{6}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          (?:
+            20|
+            [3-4]\d|
+            8[19]
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>201234</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          (?:
+            2[1-9]|
+            5\d|
+            7[1-79]
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>211234</exampleNumber>
+      </mobile>
+      <tollFree>
+        <nationalNumberPattern>80[257-9]\d{3}</nationalNumberPattern>
+        <exampleNumber>802123</exampleNumber>
+      </tollFree>
+      <premiumRate>
+        <nationalNumberPattern>
+          90(?:
+            [1345][15-7]|
+            2[125-7]|
+            99
+            )\d{2}
+        </nationalNumberPattern>
+        <exampleNumber>901123</exampleNumber>
+      </premiumRate>
+      <voip>
+        <nationalNumberPattern>
+          (?:
+            6[0-36]|
+            88
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>601234</exampleNumber>
+      </voip>
+      <shortCode>
+        <!-- Includes special numbers, special services and universal services.  -->
+        <nationalNumberPattern>
+          1(?:
+            1[248]|
+            4[124]\d|
+            71\d|
+            8[7-9]\d
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{3,4}</possibleNumberPattern>
+        <exampleNumber>211234</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- France -->
         <nationalNumberPattern>\d{7,10}</nationalNumberPattern>
         <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
       </generalDesc>
-      <fixedLine>
+      <areaCodeOptional>
+        <!-- These are a subset of the fixed-line rules, with digits 2-9 as the leading digit of the
+             subscriber number. There are patterns for 2+8, 3+7 and a combined pattern for all
+             4+6/4+5 and 5+5/5+4 numbers. Note that numbers matching this pattern are not
+             necessarily valid numbers. -->
+        <nationalNumberPattern>
+          2\d[2-9]\d{7}|
+          1(?:
+            1\d|
+            \d1
+          )[2-9]\d{6}|
+          1(?:
+            [248][02-9]\d[2-9]\d{4,5}|
+            (?:
+              3(?:
+                [02-79]\d|
+                8[0-69]
+              )|
+              5(?:
+                [04-9]\d|
+                2[0-35-9]|
+                3[0-8]
+              )|
+              6(?:
+                [02-8]\d|
+                9[0-689]
+              )|
+              7(?:
+                [02-5789]\d|
+                6[0-79]
+              )|
+              9(?:
+                [0235-9]\d|
+                4[0-5789]
+              )
+            )[2-9]\d{4,5}|
+            (?:
+              387(?:
+                3[2-9]|
+                [24-9]\d
+              )|
+              5(?:
+                24(?:
+                  2[2-9]|
+                  [3-9]\d
+                )|
+                39(?:
+                  [4-6][2-9]|
+                  [237-9]\d
+                )
+              )|
+              697(?:
+                [347][2-9]|
+                [25689]\d
+              )|
+              768(?:
+                [347][2-9]|
+                [25679]\d
+              )|
+              946(?:
+                7[2-9]|
+                [2-689]\d
+              )
+            )\d{3,4}
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{9,10}</possibleNumberPattern>
+        <exampleNumber>1332456789</exampleNumber>
+      </areaCodeOptional>
+      <fixedLine>
         <!-- http://en.wikipedia.org/wiki/List_of_United_Kingdom_dialling_codes -->
-        <!-- Pattern matches all area codes with NSN=10, and all area code and local number initial
-             digits with NSN=9; excluding ranges used in GG, IM, JE. -->
-        <nationalNumberPattern>1(?:1[3-8]|[2-69]1)\d{7}|
-          1(?:2(?:0[024-9]|2[3-9]|3[3-79]|4[1-689]|[58][02-9]|6[0-4789]|7[013-9]|9\d)|
-              3(?:0\d|[25][02-9]|3[02-579]|[468][0-46-9]|7[1235679]|9[24578])|
-              4(?:0[03-9]|2[02-5789]|[37]\d|4[02-69]|5[0-8]|[69][0-79]|8[02-5789])|
-              5(?:0[1235-9]|2[024-9]|3[015689]|4[02-9]|5[03-9]|6\d|7[0-35-9]|8[0-468]|9[0-5789])|
-              6(?:0[034689]|2[0-35689]|3[013-9]|4[1-467]|5[0-69]|6[13-9]|7[0-8]|8[013-9]|9[0124578])|
-              7(?:0[0246-9]|2\d|3[023678]|4[03-9]|5[0-46-9]|6[013-9]|7[0-35-9]|8[024-9]|9[02-9])|
-              8(?:0[35-9]|2[1-5789]|3[02-578]|4[0-578]|5[124-9]|6[2-69]|7\d|8[02-9]|9[02569])|
-              9(?:0[02-589]|2[02-689]|3[1-5789]|4[2-9]|5[0-579]|6[234789]|7[0124578]|8\d|9[2-57]))\d{6}|
-          1(?:2(?:0(?:46[1-4]|87[2-9])|545[1-79]|76(?:2\d|3[1-8]|6[1-6])|9(?:7(?:2[0-4]|3[2-5])|8(?:2[2-8]|7[0-4789]|8[345])))|
-              3(?:638[2-5]|647[23]|8(?:47[04-9]|64[015789]))|
-              4(?:044[1-7]|20(?:2[23]|8\d)|6(?:0(?:30|5[2-57]|6[1-8]|7[2-8])|140)|8(?:052|87[123]))|
-              5(?:24(?:3[2-79]|6\d)|276\d|6(?:26[06-9]|686))|
-              6(?:06(?:4\d|7[4-79])|295[567]|35[34]\d|47(?:24|61)|59(?:5[08]|6[67]|74)|955[0-4])|
-              7(?:26(?:6[13-9]|7[0-7])|442\d|50(?:2[0-3]|[3-68]2|76))|
-              8(?:27[56]\d|37(?:5[2-5]|8[239])|84(?:3[2-58]))|
-              9(?:0(?:0(?:6[1-8]|85)|52\d)|3583|4(?:66[1-8]|9(?:2[01]|81))|63(?:23|3[1-4])|9561))\d{3}|
+        <!-- Pattern matches geographic NSN=10 numbers as follows:
+             - area code and local number first digit for 2+8
+             - area code and local number first digit for 3+7
+             - area code only for 4+6 (including areas with embedded 5+5).
+             Pattern matches geographic NSN=9 numbers as follows:
+             - area code and local number first two digits for 4+5,
+             - area code and local number first three digits for 4+5 special case (01768) 88Ddd,
+             - area code and local number first digit for 5+4 special case (016977) Dddd.
+             All patterns exclude ranges used in GG, IM, JE.
+             Includes UAN numbers. -->
+        <nationalNumberPattern>
+          2(?:
+            0[01378]|
+            3[0189]|
+            4[017]|
+            8[0-46-9]|
+            9[012]
+          )\d{7}|
+          1(?:
+            (?:1
+              (?:3[0-48]|
+                 [46][0-4]|
+                 5[012789]|
+                 7[0-39]|
+                 8[01349]
+              )|
+              21[0-7]|
+              31[0-8]|
+              [459]1\d|
+              61[01246-9]
+            )
+          )\d{6}|
+          1(?:
+            2(?:
+              0[024-9]|
+              2[3-9]|
+              3[3-79]|
+              4[1-689]|
+              [58][02-9]|
+              6[0-4789]|
+              7[013-9]|
+              9\d
+            )|
+            3(?:
+              0\d|
+              [25][02-9]|
+              3[02-579]|
+              [468][0-46-9]|
+              7[1235679]|
+              9[24578]
+            )|
+            4(?:
+              0[03-9]|
+              [28][02-5789]|
+              [37]\d|
+              4[02-69]|
+              5[0-8]|
+              [69][0-79]
+            )|
+            5(?:
+              0[1235-9]|
+              2[024-9]|
+              3[015689]|
+              4[02-9]|
+              5[03-9]|
+              6\d|
+              7[0-35-9]|
+              8[0-468]|
+              9[0-5789]
+            )|
+            6(?:
+              0[034689]|
+              2[0-35689]|
+              [38][013-9]|
+              4[1-467]|
+              5[0-69]|
+              6[13-9]|
+              7[0-8]|
+              9[0124578]
+            )|
+            7(?:
+              0[0246-9]|
+              2\d|
+              3[023678]|
+              4[03-9]|
+              5[0-46-9]|
+              6[013-9]|
+              7[0-35-9]|
+              8[024-9]|
+              9[02-9]
+            )|
+            8(?:
+              0[35-9]|
+              2[1-5789]|
+              3[02-578]|
+              4[0-578]|
+              5[124-9]|
+              6[2-69]|
+              7\d|
+              8[02-9]|
+              9[02569]
+            )|
+            9(?:
+              0[02-589]|
+              2[02-689]|
+              3[1-5789]|
+              4[2-9]|
+              5[0-579]|
+              6[234789]|
+              7[0124578]|
+              8\d|
+              9[2-57]
+            )
+          )\d{6}|
+          1(?:
+            2(?:
+              0(?:
+                46[1-4]|
+                87[2-9]
+              )|
+              545[1-79]|
+              76(?:
+                2\d|
+                3[1-8]|
+                6[1-6]
+              )|
+              9(?:
+                7(?:
+                  2[0-4]|
+                  3[2-5]
+                )|
+                8(?:
+                  2[2-8]|
+                  7[0-4789]|
+                  8[345]
+                )
+              )
+            )|
+            3(?:
+              638[2-5]|
+              647[23]|
+              8(?:
+                47[04-9]|
+                64[015789]
+              )
+            )|
+            4(?:
+              044[1-7]|
+              20(?:
+                2[23]|
+                8\d
+              )|
+              6(?:
+                0(?:
+                  30|
+                  5[2-57]|
+                  6[1-8]|
+                  7[2-8]
+                )|
+                140
+              )|
+              8(?:
+                052|
+                87[123]
+              )
+            )|
+            5(?:
+              24(?:
+                3[2-79]|
+                6\d
+              )|
+              276\d|
+              6(?:
+                26[06-9]|
+                686
+              )
+            )|
+            6(?:
+              06(?:
+                4\d|
+                7[4-79]
+              )|
+              295[567]|
+              35[34]\d|
+              47(?:
+                24|
+                61
+              )|
+              59(?:
+                5[08]|
+                6[67]|
+                74
+              )|
+              955[0-4]
+            )|
+            7(?:
+              26(?:
+                6[13-9]|
+                7[0-7]
+              )|
+              442\d|
+              50(?:
+                2[0-3]|
+                [3-68]2|
+                76
+              )
+            )|
+            8(?:
+              27[56]\d|
+              37(?:
+                5[2-5]|
+                8[239]
+              )|
+              84(?:
+                3[2-58]
+              )
+            )|
+            9(?:
+              0(?:
+                0(?:
+                  6[1-8]|
+                  85
+                )|
+                52\d
+              )|
+              3583|
+              4(?:
+                66[1-8]|
+                9(?:
+                  2[01]|
+                  81
+                )
+              )|
+              63(?:
+                23|
+                3[1-4]
+              )|
+              9561
+            )
+          )\d{3}|
           176888[234678]\d{2}|
           16977[23]\d{3}|
-          2(?:0[01378]|3[0189]|4[017]|8[0-46-9]|9[012])\d{7}|
-          (?:3[0347]|55)\d{8}</nationalNumberPattern>
+          (?:
+            3[0347]|
+            55
+          )\d{8}
+        </nationalNumberPattern>
         <exampleNumber>1212345678</exampleNumber>
       </fixedLine>
       <mobile>
         <possibleNumberPattern>\d{10}</possibleNumberPattern>
         <exampleNumber>5612345678</exampleNumber>
       </voip>
+      <uan>
+        <nationalNumberPattern>
+          (?:
+            3[0347]|
+            55
+          )\d{8}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{10}</possibleNumberPattern>
+        <exampleNumber>5512345678</exampleNumber>
+      </uan>
     </territory>
 
     <!-- Grenada -->
 
     <!-- Gibraltar -->
     <territory id="GI" countryCode="350" internationalPrefix="00">
+      <!-- No formatting rules - numbers are always formatted as a block. -->
+      <generalDesc>
+        <nationalNumberPattern>[2568]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          2(?:
+            00\d|
+            16[0-7]|
+            22[2457]
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>20012345</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          (?:
+            5[4-8]|
+            60
+          )\d{6}
+        </nationalNumberPattern>
+        <exampleNumber>57123456</exampleNumber>
+      </mobile>
+      <tollFree>
+        <nationalNumberPattern>80\d{6}</nationalNumberPattern>
+        <exampleNumber>80123456</exampleNumber>
+      </tollFree>
+      <premiumRate>
+        <nationalNumberPattern>8[1-689]\d{6}</nationalNumberPattern>
+        <exampleNumber>88123456</exampleNumber>
+      </premiumRate>
+      <sharedCost>
+        <nationalNumberPattern>87\d{6}</nationalNumberPattern>
+        <exampleNumber>87123456</exampleNumber>
+      </sharedCost>
+      <shortCode>
+        <nationalNumberPattern>
+          1(?:
+            00|
+            1(?:
+              2|
+              6(?:
+                00[06]|
+                11[17]
+              )|
+              8\d{2}
+            )|
+            23|
+            4(?:
+              1|
+              7[014]
+            )|
+            5[015]|
+            9[0349]
+          )|
+          8(?:
+            00|
+            4[0-2]|
+            8\d
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{3,6}</possibleNumberPattern>
+        <exampleNumber>116123</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Greenland -->
               3[3467]|
               5[2457-9]
             )|
-            [2457]\d{2}|
+            [24578]\d{2}|
             3(?:
               [14]0|
               35
     </territory>
 
     <!-- Honduras -->
-    <territory id="HN" countryCode="504" internationalPrefix="00"
-               nationalPrefix="0">
+    <!-- http://www.itu.int/oth/T020200005F/en -->
+    <!-- It seems there is no longer a trunk prefix in use, based on websites like
+         http://www.howtocallabroad.com/codes.html and on seeing how locals write their numbers in
+         national format. -->
+    <territory id="HN" countryCode="504" internationalPrefix="00" >
+      <availableFormats>
+       <numberFormat pattern="(\d{4})(\d{4})">
+         <format>$1-$2</format>
+       </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[237-9]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          2(?:
+            2(?:
+              0[019]|
+              1[1-36]|
+              [23]\d|
+              4[056]|
+              5[57]|
+              9[01]
+            )|
+            4(?:
+              2|3-59]|
+              3[13-689]|
+              4[0-68]|
+              5[1-35]
+            )|
+            5(?:
+              4[3-5]|
+              5\d|
+              6[56]|
+              74
+            )|
+            6(?:
+              4[0-378]|
+              [56]\d|
+              [78][0-8]|
+              9[01]
+            )|
+            7(?:
+              6[46-9]|
+              7[02-9]|
+              8[34]
+            )|
+            8(?:
+              79|
+              8[0-35789]|
+              9[1-57-9]
+            )
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>22123456</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>[37-9]\d{7}</nationalNumberPattern>
+        <exampleNumber>91234567</exampleNumber>
+      </mobile>
     </territory>
 
     <!-- Croatia -->
     </territory>
 
     <!-- Haiti -->
-    <territory id="HT" countryCode="509" internationalPrefix="00"
-               nationalPrefix="0">
+    <!-- http://www.itu.int/oth/T020200005E/en -->
+    <!-- http://www.numberingplans.com/ -->
+    <territory id="HT" countryCode="509" internationalPrefix="00">
+      <availableFormats>
+        <numberFormat pattern="(\d{2})(\d{2})(\d{4})">
+          <format>$1 $2 $3</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[2-489]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <!-- The prefix 24 seems to be also used, based on online searches. -->
+        <nationalNumberPattern>
+          2(?:
+            [24]\d|
+            5[1-5]|
+            94
+          )\d{5}
+        </nationalNumberPattern>
+        <exampleNumber>22453300</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          (?:
+            3[4-9]|
+            4\d
+          )\d{6}
+        </nationalNumberPattern>
+        <exampleNumber>34101234</exampleNumber>
+      </mobile>
+      <tollFree>
+        <!-- ITU document says numbers with prefix 8 are "value-added services and free numbers
+             without making any further distinction. However, http://www.numberingplans.com/ seems
+             to suggest they are free. -->
+        <nationalNumberPattern>8\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>80012345</exampleNumber>
+      </tollFree>
+      <voip>
+        <!-- ITU document suggests 98\d{6}, but http://www.numberingplans.com/ restricts it to
+             98[89]\d{5}. -->
+        <nationalNumberPattern>98[89]\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>98901234</exampleNumber>
+      </voip>
+      <shortCode>
+        <nationalNumberPattern>1\d{2}</nationalNumberPattern>
+        <possibleNumberPattern>\d{3}</possibleNumberPattern>
+        <exampleNumber>114</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Hungary -->
       <mobile>
         <nationalNumberPattern>
           (?:
-            [237]0|
-            31
+            [27]0|
+            3[01]
           )\d{7}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
           <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat nationalPrefixFormattingRule="$NP$FG"
-          pattern="([78]\d)(\d{3})(\d{4})">
+          pattern="([78]\d)(\d{3,4})(\d{4})">
           <leadingDigits>
             76|
             8[35-9]
              technically they are numbers for the UK. -->
         <nationalNumberPattern>
           1\d{7,8}|
-          (?:
-            2[24-9]|
-            4(?:
-              0[24]|
-              7
-            )|
-            5(?:
-              0[45]|
-              8
-            )|
-            6[237-9]|
-            9[3-9]
-          )\d{5}|
-          (?:
-            45|
-            [569]1|
-            818
-          )\d{6}|
-          (?:
-            4[12469]|
-            5[3679]|
-            6[56]|
-            7[14]|
-            9[04]
-          )\d{7}|
-          21\d{6,7}|
-          (?:
-            23|
-            4[34]|
-            52|
-            64
-          )\d{5,7}|
-          48\d{8}
+          2(?:
+            1\d{6,7}|
+            [24-9]\d{5}|
+            3\d{5,7}
+          )|
+          4(?:
+            0[24]\d{5}|
+            [1269]\d{7}|
+            [34]\d{5,7}|
+            5\d{6}|
+            7\d{5}|
+            8[0-46-9]\d{7}
+          )|
+          5(?:
+            0[45]\d{5}|
+            1\d{6}|
+            2\d{5,7}|
+            [3679]\d{7}|
+            8\d{5}
+          )|
+          6(?:
+            1\d{6}|
+            4\d{5,7}|
+            [237-9]\d{5}|
+            [56]\d{7}
+          )|
+          7[14]\d{7}|
+          818\d{6}|
+          9(?:
+            1\d{6}|
+            [04]\d{7}|
+            [3-9]\d{5}
+          )
         </nationalNumberPattern>
         <possibleNumberPattern>\d{5,10}</possibleNumberPattern>
         <exampleNumber>2212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>8[35-9]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <nationalNumberPattern>
+          8(?:
+            22\d{6}|
+            [35-9]\d{7,8}
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{9,10}</possibleNumberPattern>
         <exampleNumber>850123456</exampleNumber>
       </mobile>
       <tollFree>
     </territory>
 
     <!-- Jordan -->
-    <!-- http://www.trc.gov.jo/images/stories/pdf/National_Numbering_Plan_ar.pdf (In Arabic) -->
+    <!-- http://www.trc.gov.jo/images/stories/pdf/NNP_ver200[1].pdf?lang=english -->
     <!-- http://www.itu.int/oth/T020200006E/en -->
     <!-- http://en.wikipedia.org/wiki/%2B962 -->
     <territory id="JO" countryCode="962" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
         <numberFormat nationalPrefixFormattingRule="($NP$FG)"
-          pattern="([2356])(\d{3})(\d{4})">
-          <leadingDigits>[2356]</leadingDigits>
+          pattern="(\d)(\d{3})(\d{4})">
+          <leadingDigits>
+            [2356]
+          </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat pattern="(7)(\d{2})(\d{2})(\d{2})(\d{2})">
       </availableFormats>
       <generalDesc>
         <nationalNumberPattern>[235-9]\d{7,8}</nationalNumberPattern>
-        <possibleNumberPattern>\d{7,9}</possibleNumberPattern>
+        <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
+        <!-- Used the plan from www.trc.gov.jo since it is much more complete than the plan on the
+             ITU website. -->
         <nationalNumberPattern>[2356][2-8]\d{6}</nationalNumberPattern>
         <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
-        <exampleNumber>62345678</exampleNumber>
+        <exampleNumber>62001234</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 777, 799 prefixes as SMS messages could be successfully delivered to these
-             mobile numbers. -->
         <nationalNumberPattern>
           7(?:
-            4[5-7]|
-            55|
-            7[5-79]|
-            8[5-8]|
-            9[05-9]
+            [1-8]\d|
+            9[02-9]
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>80012345</exampleNumber>
       </tollFree>
       <premiumRate>
-        <nationalNumberPattern>90\d{6}</nationalNumberPattern>
+        <nationalNumberPattern>900\d{5}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>90012345</exampleNumber>
       </premiumRate>
       <sharedCost>
         <nationalNumberPattern>
-          (?:
-            8[57]\d|
-            810
-          )\d{5}
+          8(?:
+            10\d|
+            5\d{2}|
+            7(?:
+             [02]0|
+             7[08]|
+             9[09]
+            )
+          )\d{4}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>85012345</exampleNumber>
 
     <!-- Japan -->
     <!-- http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/fixed.html -->
+    <!-- http://www.numberingplans.com/?page=dialling&sub=areacodes&ac=JP -->
     <territory id="JP" countryCode="81" internationalPrefix="010"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
       <fixedLine>
         <nationalNumberPattern>
           (?:
-            1[1-9][1-9]|
-            9(?:
-              [3-9][1-9]|
-              2\d
+            1(?:
+              2[3-6]|
+              3[3-9]|
+              4[2-6]|
+              [58][2-8]|
+              6[2-7]|
+              7[2-9]|
+              9[1-578]
             )|
-            (?:
-              [36][1-9]|
-              [24578][2-9]
-            )\d
+            2[2-9]\d|
+            [36][1-9]\d|
+            4(?:
+              6[0235-8]|
+              [2-578]\d|
+              9[2-59]
+            )|
+            5(?:
+              6[1-9]|
+              7[2-8]|
+              [2-589]\d
+            )|
+            7(?:
+              3[4-9]|
+              4[02-9]|
+              [25-9]\d
+            )|
+            8(?:
+              3[2-9]|
+              4[5-9]|
+              5[1-9]|
+              8[03-9]|
+              [2679]\d
+            )|
+            9(?:
+              [679][1-9]|
+              [2-58]\d
+            )
           )\d{6}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
     <territory id="LB" countryCode="961" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
-        <numberFormat pattern="([13-6])(\d{3})(\d{3})">
-          <leadingDigits>[13-6]</leadingDigits>
-          <format>$1 $2 $3</format>
-        </numberFormat>
-        <numberFormat pattern="([7-9][01])(\d{3})(\d{3})">
-          <leadingDigits>[7-9][01]</leadingDigits>
+        <numberFormat pattern="(\d)(\d{3})(\d{3})">
+          <leadingDigits>
+            [13-6]|
+            7(?:
+              [2-57-9]|
+              62)|
+            [89][2-9]
+            </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="([7-9][2-9])(\d{2})(\d{3})">
-          <leadingDigits>[7-9][2-9]</leadingDigits>
+        <numberFormat pattern="([7-9]\d)(\d{3})(\d{3})">
+          <leadingDigits>
+            [89][01]|
+            7(?:
+              [01]|
+              66)
+          </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <fixedLine>
         <nationalNumberPattern>
           (?:
-            [14-6]\d|
-            [7-9][2-9]
-          )\d{5}
+            [14-6]\d{2}|
+            7(?:
+              [2-57-9]\d|
+              62)|
+            [89][2-9]\d
+          )\d{4}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{7}</possibleNumberPattern>
         <exampleNumber>1123456</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 71[67] prefixes as SMS messages could be successfully delivered to these mobile
-             numbers. -->
         <nationalNumberPattern>
           (?:
             3\d|
             7(?:
-              0\d|
-              1[167]
+              [01]\d|
+              66
             )
           )\d{5}
         </nationalNumberPattern>
     </territory>
 
     <!-- Sri Lanka -->
+    <!-- http://en.wikipedia.org/wiki/%2B94 -->
+    <!-- http://www.itu.int/oth/T02020000C3/en -->
     <territory id="LK" countryCode="94" internationalPrefix="00"
-               nationalPrefix="0">
+               nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+      <availableFormats>
+        <numberFormat pattern="(\d{2})(\d{1})(\d{6})">
+          <leadingDigits>[1-689]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+          <leadingDigits>7</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[1-9]\d{8}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7,9}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          (?:
+            [189]1|
+            2[13-7]|
+            3[1-8]|
+            4[157]|
+            5[12457]|
+            6[35-7]
+          )[2-57]\d{6}
+        </nationalNumberPattern>
+        <exampleNumber>112345678</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>7[12578]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <exampleNumber>712345678</exampleNumber>
+      </mobile>
     </territory>
 
     <!-- Liberia -->
       <availableFormats>
         <!-- Formatting from Ministry of Agriculture,
         http://www.moa.gov.lr/content.php?sub=Email&?related=Contacts -->
-        <numberFormat pattern="([27]\d)(\d{3})(\d{3})">
-          <leadingDigits>[27]</leadingDigits>
+        <numberFormat pattern="([279]\d)(\d{3})(\d{3})">
+          <leadingDigits>[279]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat pattern="([4-6])(\d{3})(\d{3})">
       <generalDesc>
         <nationalNumberPattern>
           (?:
-            [27]\d|
+            [279]\d|
             [4-6]
           )\d{6}
         </nationalNumberPattern>
           (?:
             4[67]|
             5\d|
-            7\d{2}|
-            6[4-8]
+            6[4-8]|
+            7\d{2}
           )\d{5}
         </nationalNumberPattern>
         <exampleNumber>4612345</exampleNumber>
       </mobile>
+      <premiumRate>
+        <!-- Telemedia service is listed under premium rate. -->
+        <nationalNumberPattern>90\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>90123456</exampleNumber>
+      </premiumRate>
     </territory>
 
     <!-- Lesotho -->
         <nationalNumberPattern>
           5(?:
             2(?:
-              [015-7]\d{2}|
               (?:
-                [28][2-9]|
-                3[2-7]|
-                4[2-8]
+                [015-7]\d|
+                2[2-9]|
+                3[2-57]|
+                4[2-8]|
+                8[235-9]|
               )\d|
               9(?:
                 0\d|
               )
             )|
             3(?:
-              [0-4]\d{2}|
               (?:
+                [0-4]\d|
                 [57][2-9]|
-                6[2-8]|
+                6[235-8]|
                 9[3-9]
               )\d|
               8(?:
       <mobile>
         <nationalNumberPattern>
           6(?:
-            00|
+            0[06]|
+            [14-7]\d|
+            2[236]|
             33|
-            [15-7]\d|
-            4[0-8]|
             99
           )\d{6}
         </nationalNumberPattern>
       <fixedLine>
         <nationalNumberPattern>
           (?:
-            2\d|
-            3[1-4]|
-            4[2-8]
-          )\d{6}
+            2(?:
+              [23]\d|
+              5[125]|
+              61
+            )|
+            3(?:
+              1[3-6]|
+              2[2-6]|
+              3[2-5]|
+              4[235]
+            )|
+            4(?:
+              [23][2-6]|
+              4[3-6]|
+              5[25]|
+              6[25-8]|
+              7[24-6]|
+              8[4-6]
+            )
+          )\d{5}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{6,8}</possibleNumberPattern>
         <exampleNumber>22212345</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>7\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>7[0-25-8]\d{6}</nationalNumberPattern>
         <exampleNumber>72345678</exampleNumber>
       </mobile>
       <tollFree>
     <territory id="MN" countryCode="976" internationalPrefix="001"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
-        <numberFormat pattern="([127-9]\d)(\d{2})(\d{4})">
-          <leadingDigits>
-            [12]1|
-            [7-9]
-          </leadingDigits>
+        <numberFormat pattern="([12]\d)(\d{2})(\d{4})">
+          <leadingDigits>[12]1</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="([12]2\d)(\d{5})">
+        <numberFormat pattern="([12]2\d)(\d{5,6})">
           <leadingDigits>[12]2[1-3]</leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
-        <numberFormat pattern="([12]\d{3})(\d{4})">
+        <numberFormat pattern="([12]\d{3})(\d{5})">
           <leadingDigits>
             [12](?:
               27|
           </leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
-        <numberFormat pattern="([12]\d{4})(\d{3})">
+        <!-- It seems from online formatting that the national prefix is not written (or perhaps
+             needed?) for numbers in these ranges. -->
+        <numberFormat pattern="(\d{4})(\d{4})"
+          nationalPrefixFormattingRule="$FG">
+          <leadingDigits>[57-9]</leadingDigits>
+          <format>$1 $2</format>
+        </numberFormat>
+        <numberFormat pattern="([12]\d{4})(\d{4,5})">
           <leadingDigits>
             [12](?:
               27|
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[127-9]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <nationalNumberPattern>
+          [12]\d{7,9}|
+          [57-9]\d{7}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{8,10}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <!-- Note the leading digit is the access code: 1 is used by Mongolia Telecom subscribers
              and 2 is used by Mongolian Railway subscribers. The area code then follows the access
-             code, and could be 1 to 4 digits long. -->
+             code, and could be 1 to 4 digits long. We also cover wireless local loop numbers here
+             as well, even though we are not certain whether they are in fact fixed or mobile in
+             this country. 5-digit subscriber numbers for 4-digit area codes have been added due to
+             online numbers being found. -->
         <nationalNumberPattern>
-          (?:
-            [12](?:
-              1\d|
-              2[1-37]|
-              3[2-8]|
-              4[2-68]|
-              5[1-4689]
+          [12](?:
+            1\d|
+            2(?:
+              [1-3]\d?|
+              7\d
             )|
+            3[2-8]\d{1,2}|
+            4[2-68]\d{1,2}|
+            5[1-4689]\d{1,2}
+          )\d{5}|
+          (?:
+            5[0568]|
             70
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>70123456</exampleNumber>
       </fixedLine>
       <mobile>
+        <!-- Adding prefix 98 from numbers found on the internet. -->
         <nationalNumberPattern>
           (?:
-            88|
-            9[1569]
+            8[89]|
+            9[15689]
           )\d{6}
         </nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>88123456</exampleNumber>
       </mobile>
       <!-- No tollFree or premiumRate information can be found. -->
+      <voip>
+        <nationalNumberPattern>7[569]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>75123456</exampleNumber>
+      </voip>
     </territory>
 
     <!-- Macao, China -->
     <!-- Mauritania -->
     <!-- http://www.itu.int/oth/T0202000087/en -->
     <!-- http://www.are.mr/com-1-4-1.html -->
+    <!-- New number plan to be in official use from January 1st 2011. During this change-over
+         period, both the new and the old number plans are supported. -->
     <territory id="MR" countryCode="222" internationalPrefix="00" >
       <availableFormats>
+        <numberFormat pattern="([2-48]\d)(\d{2})(\d{2})(\d{2})">
+          <leadingDigits>[2-48]</leadingDigits>
+          <format>$1 $2 $3 $4</format>
+        </numberFormat>
         <numberFormat pattern="([2-7]\d{2})(\d{2})(\d{2})">
+          <leadingDigits>[2-7]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[2-7]\d{6}</nationalNumberPattern>
-        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+        <nationalNumberPattern>
+          [2-4]\d{6,7}|
+          [5-7]\d{6}|
+          8\d{7}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <nationalNumberPattern>
             5[02-467]|
             6[39]|
             7[4-69]
-          )\d{4}
+          )\d{4}|
+          [2-4]5\d{6}
         </nationalNumberPattern>
-        <exampleNumber>5131234</exampleNumber>
+        <exampleNumber>35123456</exampleNumber>
       </fixedLine>
       <mobile>
         <nationalNumberPattern>
             4[3-5]|
             6\d|
             7[0-7]
-          )\d{5}
+          )\d{5}|
+          (?:
+            2[27]|
+            3[367]|
+            4[467]
+          )\d{6}
         </nationalNumberPattern>
-        <exampleNumber>3123456</exampleNumber>
+        <exampleNumber>22123456</exampleNumber>
       </mobile>
+      <tollFree>
+        <nationalNumberPattern>800\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>80012345</exampleNumber>
+      </tollFree>
     </territory>
 
     <!-- Montserrat -->
     </territory>
 
     <!-- Malta -->
-    <territory id="MT" countryCode="356" internationalPrefix="00"
-               nationalPrefix="21">
+    <!-- www.itu.int/oth/T0202000084/en -->
+    <!-- www.mca.org.mt (Numbering link in the LHS menu - has more up-to-date allocations) -->
+    <territory id="MT" countryCode="356" internationalPrefix="00">
+      <availableFormats>
+        <numberFormat pattern="(\d{4})(\d{4})">
+          <format>$1 $2</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[2579]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          2(?:
+            0(?:
+              1[0-6]|
+              [69]\d
+            )|
+            [1-357]\d{2}
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>21001234</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          (?:
+            7(?:
+              210|
+              [79]\d{2}|
+            )|
+            9(?:
+              2[13]\d|
+              696|
+              8(?:
+                1[1-3]|
+                89|
+                97
+              )|
+              9\d{2}
+            )
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>96961234</exampleNumber>
+      </mobile>
+      <pager>
+        <nationalNumberPattern>7117\d{4}</nationalNumberPattern>
+        <exampleNumber>71171234</exampleNumber>
+      </pager>
+      <premiumRate>
+        <nationalNumberPattern>
+          50(?:
+            0(?:
+              3[1679]|
+              4\d
+            )|
+            [169]\d{2}|
+            7[06]\d
+          )\d{3}
+        </nationalNumberPattern>
+        <exampleNumber>50031234</exampleNumber>
+      </premiumRate>
     </territory>
 
     <!-- Mauritius -->
     </territory>
 
     <!-- Maldives -->
-    <territory id="MV" countryCode="960" internationalPrefix="020"
-               nationalPrefix="0">
+    <!-- http://www.itu.int/oth/T0202000082/en -->
+    <!-- www.dhiraagu.com.mv -->
+    <territory id="MV" countryCode="960" internationalPrefix="0(?:0|19)"
+      preferredInternationalPrefix="00">
+      <availableFormats>
+        <numberFormat pattern="(\d{3})(\d{4})">
+          <format>$1-$2</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[3679]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{7}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <!-- 300 and 330 have been added as prefixes from online searches, since the numbers seemed
+             to be diallable. -->
+        <nationalNumberPattern>
+          (?:
+            3(?:
+              00|
+              3[0-59]|
+            )|
+            6(?:
+              [567][02468]|
+              8[024689]
+            )
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>6701234</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>
+          (?:
+            7(?:
+              [679]\d|
+              8[02-9]
+            )|
+            9[6-9]\d
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>7712345</exampleNumber>
+      </mobile>
+      <pager>
+        <nationalNumberPattern>781\d{4}</nationalNumberPattern>
+        <exampleNumber>7812345</exampleNumber>
+      </pager>
+      <shortCode>
+        <nationalNumberPattern>
+          1(?:
+            [19]0|
+            23
+          )
+          </nationalNumberPattern>
+        <possibleNumberPattern>\d{3}</possibleNumberPattern>
+        <exampleNumber>123</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Malawi -->
 
     <!-- Namibia -->
     <!-- http://www.itu.int/oth/T0202000093/en -->
-    <territory id="NA" countryCode="264" internationalPrefix="00"
-               nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
-      <availableFormats>
-        <numberFormat pattern="(8\d)(\d{3})(\d{4})">
-          <leadingDigits>8[15]</leadingDigits>
-          <format>$1 $2 $3</format>
-        </numberFormat>
-        <!-- This overlaps with the next pattern so is listed first. -->
-        <numberFormat pattern="(632532)(\d{2,4})">
-          <leadingDigits>632</leadingDigits>
-          <leadingDigits>6325</leadingDigits>
-          <leadingDigits>63253</leadingDigits>
-          <leadingDigits>632532</leadingDigits>
-          <format>$1 $2</format>
-        </numberFormat>
-        <numberFormat pattern="(6\d)(\d{2,3})(\d{4})">
-          <leadingDigits>
-            6(?:
-              1|
-              [245][1-7]|
-              3[125-7]|
-              6[1256]|
-              7[1236]
-            )
-          </leadingDigits>
-          <format>$1 $2 $3</format>
-        </numberFormat>
-        <!-- Another overlap pattern - this one is for shorter numbers. -->
-        <numberFormat pattern="(6\d)(\d{4,5})">
-          <leadingDigits>
-            6(?:
-              3[12567]|
-              5[3-5]|
-              6[1256]|
-              7[1236]
-            )
-          </leadingDigits>
-          <format>$1 $2</format>
-        </numberFormat>
-        <numberFormat pattern="(6\d{2})(\d{4,6})">
-          <leadingDigits>6[2356]8</leadingDigits>
-          <format>$1 $2</format>
+    <territory id="NA" countryCode="264" internationalPrefix="00"
+               nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+      <availableFormats>
+        <numberFormat pattern="(8\d)(\d{3})(\d{4})">
+          <leadingDigits>8[125]</leadingDigits>
+          <format>$1 $2 $3</format>
         </numberFormat>
-        <numberFormat pattern="(6\d{3})(\d{4,5})">
-          <leadingDigits>
-            6(?:
-              34|
-              6[34]|
-              75
-            )
-          </leadingDigits>
-          <leadingDigits>
-            6(?:
-              342|
-              6[34]|
-              751
-            )
-          </leadingDigits>
-          <format>$1 $2</format>
+        <numberFormat pattern="(6\d)(\d{2,3})(\d{4})">
+          <leadingDigits>6</leadingDigits>
+          <format>$1 $2 $3</format>
         </numberFormat>
         <numberFormat pattern="(88)(\d{3})(\d{3})">
           <leadingDigits>88</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
+        <numberFormat pattern="(870)(\d{3})(\d{3})">
+          <leadingDigits>870</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[68]\d{5,9}</nationalNumberPattern>
-        <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
+        <nationalNumberPattern>[68]\d{7,8}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
+        <!-- Includes VSAT service. -->
         <nationalNumberPattern>
           6(?:
             1(?:
-              [136]|
-              2\d?
-            )\d|
+              17|
+              2(?:
+                [0189]\d|
+                [23-6]|
+                7\d?
+              )|
+              3(?:
+                2\d|
+                3[378]
+              )|
+              4[01]|
+              69|
+              7[014]
+            )|
             2(?:
-              [25]\d? |
-              [134678]
-            )\d|
+              17|
+              25|
+              5(?:
+                [0-36-8]|
+                4\d?
+              )|
+              69|
+              70
+            )|
             3(?:
-              2\d{0,3}|
-              4\d{1,2}|
-              [135-8]\d?
+              17|
+              2(?:
+                [0237]\d?|
+                [14-689]
+              )|
+              34|
+              6[29]|
+              7[01]|
+              81
             )|
             4(?:
-              [13-8]\d|
-              2\d{1,2}
-            )|
-            (?:
+              17|
+              2(?:
+                [012]|
+                7?
+              )|
+              4(?:
+                [06]|
+                1\d
+              )|
               5(?:
-                [16-7]\d|
-                [3-58]\d? |
-                2\d{1,2}
-              )
+                [01357]|
+                [25]\d?
+              )|
+              69|
+              7[01]
+            )|
+            5(?:
+              17|
+              2(?:
+                [0459]|
+                [23678]\d?
+              )|
+              69|
+              7[01]
             )|
-            6\d{0,4}|
-            7\d{0,3}
+            6(?:
+              17|
+              2(?:
+                5|
+                6\d?
+              )|
+              38|
+              42|
+              69|
+              7[01]
+            )|
+            7(?:
+              17|
+              2(?:
+                [569]|
+                [234]\d?
+              )|
+              3(?:
+                0\d?|
+                [13]
+              )|
+              69|
+              7[01]
+            )
           )\d{4}
         </nationalNumberPattern>
         <exampleNumber>612012345</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- The prefixes 8114, 814\d, 816[0-2] have been added after SMS messages have been
-             successfully delivered to these numbers. -->
+        <!-- Includes the Switch CDMA Service. -->
         <nationalNumberPattern>
-          8(?:
-            1(?:
-              1[0-24]|
-              [2-4]\d|
-              50|
-              6[0-2]
-            )|
-            5\d{2}
-          )\d{5}
+          (?:
+            60|
+            8[125]
+          )\d{7}
         </nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
-        <exampleNumber>811012345</exampleNumber>
+        <exampleNumber>811234567</exampleNumber>
       </mobile>
+      <premiumRate>
+        <nationalNumberPattern>8701\d{5}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <exampleNumber>870123456</exampleNumber>
+      </premiumRate>
       <voip>
-        <nationalNumberPattern>88\d{6}</nationalNumberPattern>
+        <nationalNumberPattern>886\d{5}</nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
-        <exampleNumber>88123456</exampleNumber>
+        <exampleNumber>88612345</exampleNumber>
       </voip>
+      <shortCode>
+        <nationalNumberPattern>
+          1(?:
+            0111|
+            \d{3}
+          )|
+          9(?:
+            3111|
+            \d{2}
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{3,5}</possibleNumberPattern>
+        <exampleNumber>93111</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- New Caledonia (Territoire français d'outre-mer) -->
     </territory>
 
     <!-- Niue -->
-    <territory id="NU" countryCode="683" internationalPrefix="00"
-               nationalPrefix="0">
+    <!-- http://www.itu.int/oth/T02020000EC/en -->
+    <territory id="NU" countryCode="683" internationalPrefix="00">
+      <!-- Numbers are always formatted as a block. -->
+      <generalDesc>
+        <nationalNumberPattern>[1-5]\d{3}</nationalNumberPattern>
+        <possibleNumberPattern>\d{4}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <!-- Putting FWT (fixed-wireless-terminals) numbers here too. -->
+        <nationalNumberPattern>[34]\d{3}</nationalNumberPattern>
+        <exampleNumber>4002</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>[125]\d{3}</nationalNumberPattern>
+        <exampleNumber>1234</exampleNumber>
+      </mobile>
     </territory>
 
     <!-- New Zealand -->
             68|
             7(?:
               [126]\d|
-              3[34689]
+              3[1-9]
             )
           )\d{5}
         </nationalNumberPattern>
         <exampleNumber>1801234</exampleNumber>
       </tollFree>
       <voip>
+        <!-- VSAT prefixes are here. -->
         <nationalNumberPattern>275\d{4}</nationalNumberPattern>
         <possibleNumberPattern>\d{7}</possibleNumberPattern>
         <exampleNumber>2751234</exampleNumber>
     </territory>
 
     <!-- Palestinian Authority -->
+    <!-- http://en.wikipedia.org/wiki/%2B970 -->
+    <!-- http://www.wtng.info/wtng-970-ps.html -->
+    <!-- http://www.paltel.ps -->
+    <!-- Palestinian phone numbers can be reached through the Israeli country code (972) in addition
+         to the Palestinian country code (970) and so Palestinian landlines and mobile lines are a
+         subset of the Israeli formats. -->
     <territory id="PS" countryCode="970" internationalPrefix="00"
-               nationalPrefix="0">
+               nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+      <availableFormats>
+        <numberFormat pattern="([2489])(2\d{2})(\d{4})">
+          <leadingDigits>[2489]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <numberFormat pattern="(5[69]\d)(\d{3})(\d{3})">
+          <leadingDigits>5</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <numberFormat nationalPrefixFormattingRule="$FG"
+          pattern="(1[78]00)(\d{3})(\d{3})">
+          <leadingDigits>1[78]</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
+        <!-- 4 and 5 digit premium numbers will be formatted as one block by default. -->
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>
+          (?:
+            [24589]\d{7,9}|
+            1(?:
+              [78]\d{8}|
+              [49]\d{2,3}
+            )
+          )
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <nationalNumberPattern>
+          (?:
+            22[2379]|
+            42[45]|
+            82[01458]|
+            92[369]
+          )\d{5}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
+        <exampleNumber>22234567</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>5[69]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <exampleNumber>599123456</exampleNumber>
+      </mobile>
+      <tollFree>
+        <nationalNumberPattern>1800\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{10}</possibleNumberPattern>
+        <exampleNumber>1800123456</exampleNumber>
+      </tollFree>
+      <premiumRate>
+        <!-- According to Paltel, premium numbers are 14xx and 19xxx -->
+        <nationalNumberPattern>
+          1(?:
+            4|
+            9\d
+           )\d{2}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{4,5}</possibleNumberPattern>
+        <exampleNumber>19123</exampleNumber>
+      </premiumRate>
+      <sharedCost>
+        <nationalNumberPattern>1700\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{10}</possibleNumberPattern>
+        <exampleNumber>1700123456</exampleNumber>
+      </sharedCost>
     </territory>
 
     <!-- Portugal -->
       preferredInternationalPrefix="00">
       <availableFormats>
         <numberFormat pattern="(\d{3})(\d{3})">
+          <leadingDigits>
+            [23578]|
+            [46][0-35-9]
+          </leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
+        <numberFormat pattern="(\d)(\d{3})(\d{3})">
+          <leadingDigits>[46]4</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[2-8]\d{5}</nationalNumberPattern>
-        <possibleNumberPattern>\d{6}</possibleNumberPattern>
+        <nationalNumberPattern>[2-8]\d{5,6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{6,7}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
         <!-- Includes Fixed Cellular. We are putting Fixed Services numbers here for now, as we
             78[0138]
           )\d{3}
         </nationalNumberPattern>
+        <possibleNumberPattern>\d{6}</possibleNumberPattern>
         <exampleNumber>217123</exampleNumber>
       </fixedLine>
       <mobile>
             )
           )\d{3}
         </nationalNumberPattern>
+        <possibleNumberPattern>\d{6}</possibleNumberPattern>
         <exampleNumber>510123</exampleNumber>
       </mobile>
       <tollFree>
         <nationalNumberPattern>8000\d{2}</nationalNumberPattern>
+        <possibleNumberPattern>\d{6}</possibleNumberPattern>
         <exampleNumber>800000</exampleNumber>
       </tollFree>
       <voip>
-        <nationalNumberPattern>4[1-37]\d{4}</nationalNumberPattern>
-        <exampleNumber>410123</exampleNumber>
+        <!-- The first digit is optional until the end of Feb 2011, when it will be compulsory. -->
+        <nationalNumberPattern>
+          (?:
+            4?4[1-3]|
+            6?47
+          )\d{4}
+        </nationalNumberPattern>
+        <exampleNumber>4410123</exampleNumber>
       </voip>
     </territory>
 
     <!-- Sudan -->
+    <!-- http://www.itu.int/oth/T02020000C4/en -->
     <territory id="SD" countryCode="249" internationalPrefix="00"
-               nationalPrefix="0">
+               nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+      <availableFormats>
+        <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+          <format>$1 $2 $3</format>
+        </numberFormat>
+      </availableFormats>
+      <generalDesc>
+        <nationalNumberPattern>[19]\d{8}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+      </generalDesc>
+      <fixedLine>
+        <!-- Retaining previous prefix as 18 since it seems still to be used. -->
+        <nationalNumberPattern>
+          1(?:
+            [25]\d|
+            8[3567]
+          )\d{6}
+        </nationalNumberPattern>
+        <exampleNumber>121231234</exampleNumber>
+      </fixedLine>
+      <mobile>
+        <nationalNumberPattern>9[1259]\d{7}</nationalNumberPattern>
+        <exampleNumber>911231234</exampleNumber>
+      </mobile>
     </territory>
 
     <!-- Sweden -->
           <leadingDigits>1[89]</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
+        <numberFormat pattern="(7000)(\d{4})(\d{3})">
+          <leadingDigits>70</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
         <numberFormat pattern="(800)(\d{3})(\d{4})">
           <leadingDigits>80</leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[13689]\d{7,10}</nationalNumberPattern>
+        <!-- We have a stricter national number pattern for numbers beginning with 6 to enable us to
+             easily strip off leading "65" country codes. -->
+        <nationalNumberPattern>
+          [36]\d{7}|
+          [17-9]\d{7,10}
+        </nationalNumberPattern>
         <possibleNumberPattern>\d{8,11}</possibleNumberPattern>
       </generalDesc>
       <fixedLine>
-        <nationalNumberPattern>[36]\d{7}</nationalNumberPattern>
-        <possibleNumberPattern>\d{8}</possibleNumberPattern>
-        <exampleNumber>31234567</exampleNumber>
+        <!-- Until UAN support is ready, 7000 numbers are also listed under FIXED_LINE for now. -->
+        <nationalNumberPattern>
+          6[1-8]\d{6}|
+          7000\d{7}
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{8,11}</possibleNumberPattern>
+        <exampleNumber>61234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>[89]\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>
+          (?:
+            8[1-5]|
+            9[0-8]
+          )\d{6}
+        </nationalNumberPattern>
         <possibleNumberPattern>\d{8}</possibleNumberPattern>
         <exampleNumber>81234567</exampleNumber>
       </mobile>
         <possibleNumberPattern>\d{11}</possibleNumberPattern>
         <exampleNumber>19001234567</exampleNumber>
       </premiumRate>
+      <voip>
+        <nationalNumberPattern>3[0-2]\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>31234567</exampleNumber>
+      </voip>
+      <uan>
+        <!-- Although not detailed in the plan beyond mentioning their existence, it seems 7000
+             numbers are used for companies. Most of the online examples are in fact alpha-numbers.
+             -->
+        <nationalNumberPattern>7000\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{11}</possibleNumberPattern>
+        <exampleNumber>70001234567</exampleNumber>
+      </uan>
+      <shortCode>
+        <nationalNumberPattern>
+          1(?:
+            [0136]\d{2}|
+            41\d|
+            [89](?:
+              [1-9]\d|
+              0[1-9]
+            )|
+            [57]\d{2,3})|
+          99\d
+        </nationalNumberPattern>
+        <possibleNumberPattern>\d{3,5}</possibleNumberPattern>
+        <exampleNumber>1312</exampleNumber>
+      </shortCode>
     </territory>
 
     <!-- Saint Helena -->
         <!-- Unfortunately numbers beginning with 1 are hard to format based on prefixes, since it
              depends on number length. -->
         <numberFormat pattern="([19]\d)(\d{6})">
-          <leadingDigits>[19]</leadingDigits>
+          <leadingDigits>15|9</leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
       </availableFormats>
           <format>$1 $2</format>
         </numberFormat>
         <numberFormat pattern="(\d{4})(\d{4})">
-          <leadingDigits>7</leadingDigits>
+          <leadingDigits>[027]</leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
       </availableFormats>
       <generalDesc>
-        <nationalNumberPattern>[2-7]\d{6,7}</nationalNumberPattern>
+        <nationalNumberPattern>[02-7]\d{6,7}</nationalNumberPattern>
         <possibleNumberPattern>\d{7,8}</possibleNumberPattern>
       </generalDesc>
+      <noInternationalDialling>
+        <nationalNumberPattern>0800\d{4}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>08001234</exampleNumber>
+      </noInternationalDialling>
       <fixedLine>
         <!-- The leading optional 2 is because future changes to the fixed-line plan will be made by
              prepending a two to fixed-line numbers. -->
         <nationalNumberPattern>
           (?:
             6|
-            7[67]
+            7[6-8]
           )\d{6}
         </nationalNumberPattern>
         <exampleNumber>76123456</exampleNumber>
       </mobile>
+      <tollFree>
+        <nationalNumberPattern>0800\d{4}</nationalNumberPattern>
+        <possibleNumberPattern>\d{8}</possibleNumberPattern>
+        <exampleNumber>08001234</exampleNumber>
+      </tollFree>
     </territory>
 
     <!-- Turks and Caicos Islands -->
           <leadingDigits>9</leadingDigits>
           <format>$1 $2 $3 $4</format>
         </numberFormat>
-        <numberFormat pattern="(1[269]\d)(\d{3})(\d{4})">
+        <numberFormat pattern="(1[2689]\d)(\d{3})(\d{4})">
           <leadingDigits>
             1(?:
               [26]|
+              88|
               99
             )
           </leadingDigits>
         </numberFormat>
         <numberFormat nationalPrefixFormattingRule="$FG"
           pattern="(1[89]00)(\d{4,6})">
-          <leadingDigits>
-            1(?:
-              8|
-              90
-            )
-          </leadingDigits>
+          <leadingDigits>1[89]0</leadingDigits>
           <format>$1 $2</format>
         </numberFormat>
       </availableFormats>
         <exampleNumber>2101234567</exampleNumber>
       </fixedLine>
       <mobile>
-        <!-- Adding 16[35] because SMS messages have been sent successfully to many numbers with
-             these prefixes. -->
         <nationalNumberPattern>
           (?:
             9\d|
             1(?:
-              2[1-35-9]|
+              2\d|
               6[3-9]|
+              88|
               99
             )
           )\d{7}
     <territory id="ZA" countryCode="27" internationalPrefix="00"
                nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
       <availableFormats>
+        <numberFormat pattern="(860)(\d{3})(\d{3})">
+          <leadingDigits>860</leadingDigits>
+          <format>$1 $2 $3</format>
+        </numberFormat>
         <numberFormat pattern="([1-578]\d)(\d{3})(\d{4})">
+          <leadingDigits>
+            [1-57]|
+            8(?:
+              [0-57-9]|
+              6[1-9]
+            )
+          </leadingDigits>
           <format>$1 $2 $3</format>
         </numberFormat>
       </availableFormats>
         <exampleNumber>801234567</exampleNumber>
       </tollFree>
       <premiumRate>
-        <nationalNumberPattern>86\d{7}</nationalNumberPattern>
+        <nationalNumberPattern>86[1-9]\d{6}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
         <exampleNumber>861234567</exampleNumber>
       </premiumRate>
+      <sharedCost>
+        <nationalNumberPattern>860\d{6}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <exampleNumber>860123456</exampleNumber>
+      </sharedCost>
       <voip>
         <nationalNumberPattern>87\d{7}</nationalNumberPattern>
         <possibleNumberPattern>\d{9}</possibleNumberPattern>
             9[2-8]
           )\d{4,7}
         </nationalNumberPattern>
-        <possibleNumberPattern>\d{3,10}</possibleNumberPattern>
         <exampleNumber>1312345</exampleNumber>
       </fixedLine>
       <mobile>
-        <nationalNumberPattern>
-          (?:
-            [19]1|
-            7[13]
-          )\d{6,7}
-        </nationalNumberPattern>
-        <possibleNumberPattern>\d{8,9}</possibleNumberPattern>
-        <exampleNumber>911234567</exampleNumber>
+        <nationalNumberPattern>7[137]\d{7}</nationalNumberPattern>
+        <possibleNumberPattern>\d{9}</possibleNumberPattern>
+        <exampleNumber>711234567</exampleNumber>
       </mobile>
       <!-- No tollFree or premiumRate information can be found. -->
       <voip>
index 4a176ce..5aae184 100644 (file)
@@ -169,7 +169,10 @@ public class PhoneNumberUtil {
     aSet.add(227);  // Niger
     aSet.add(228);  // Togo
     aSet.add(241);  // Gabon
+    aSet.add(242);  // Congo (Rep. of the)
+    aSet.add(268);  // Swaziland
     aSet.add(379);  // Vatican City
+    aSet.add(501);  // Belize
     LEADING_ZERO_COUNTRIES = Collections.unmodifiableSet(aSet);
   }
 
@@ -187,7 +190,7 @@ public class PhoneNumberUtil {
   // This consists of dash characters, white space characters, full stops, slashes,
   // square brackets, parentheses and tildes. It also includes the letter 'x' as that is found as a
   // placeholder for carrier information in some phone numbers.
-  private static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\uFF0D-\uFF0F " +
+  private static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " +
       "\u00A0\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E";
 
   // Digits accepted in phone numbers
@@ -255,7 +258,7 @@ public class PhoneNumberUtil {
   // the extension is written with a hash at the end, such as "- 503#".
   // Note that the only capturing groups should be around the digits that you want to capture as
   // part of the extension, or else parsing will fail!
-  private static final String KNOWN_EXTN_PATTERNS = "[ \u00A0\\t,]*(?:ext(?:ensio)?n?|" +
+  private static final String KNOWN_EXTN_PATTERNS = "[ \u00A0\\t,]*(?:ext(?:ensi[o\u00F3])?n?|" +
       "\uFF45\uFF58\uFF54\uFF4E?|[,x\uFF58#\uFF03~\uFF5E]|int|anexo|\uFF49\uFF4E\uFF54)" +
       "[:\\.\uFF0E]?[ \u00A0\\t,-]*([" + VALID_DIGITS + "]{1,7})#?|[- ]+([" + VALID_DIGITS +
       "]{1,5})#";
@@ -264,13 +267,13 @@ public class PhoneNumberUtil {
   // digits, for use when parsing.
   private static final Pattern EXTN_PATTERN =
       Pattern.compile("(?:" + KNOWN_EXTN_PATTERNS + ")$",
-                      Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
+                      Pattern.CANON_EQ | Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
 
   // We append optionally the extension pattern to the end here, as a valid phone number may
   // have an extension prefix appended, followed by 1 or more digits.
   private static final Pattern VALID_PHONE_NUMBER_PATTERN =
       Pattern.compile(VALID_PHONE_NUMBER + "(?:" + KNOWN_EXTN_PATTERNS + ")?",
-                      Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
+                      Pattern.CANON_EQ | Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
 
   private static final Pattern NON_DIGITS_PATTERN = Pattern.compile("(\\D+)");
   private static final Pattern FIRST_GROUP_PATTERN = Pattern.compile("(\\$1)");
@@ -533,9 +536,7 @@ public class PhoneNumberUtil {
       return 0;
     }
     PhoneMetadata metadata = getMetadataForRegion(regionCode);
-    // For NANPA countries, national prefix is the same as country code, but it is not stored in
-    // the metadata.
-    if (!metadata.hasNationalPrefix() && !isNANPACountry(regionCode)) {
+    if (!metadata.hasNationalPrefix()) {
       return 0;
     }
 
@@ -546,6 +547,39 @@ public class PhoneNumberUtil {
       return 0;
     }
 
+    return getLengthOfNationalDestinationCode(number);
+  }
+
+  /**
+   * Gets the length of the national destination code (NDC) from the PhoneNumber object passed in,
+   * so that clients could use it to split a national significant number into NDC and subscriber
+   * number. The NDC of a phone number is normally the first group of digit(s) right after the
+   * country code when the number is formatted in the international format, if there is a subscriber
+   * number part that follows. An example of how this could be used:
+   *
+   * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+   * PhoneNumber number = phoneUtil.parse("18002530000", "US");
+   * String nationalSignificantNumber = PhoneNumberUtil.getNationalSignificantNumber(number);
+   * String nationalDestinationCode;
+   * String subscriberNumber;
+   *
+   * int nationalDestinationCodeLength = phoneUtil.getLengthOfNationalDestinationCode(number);
+   * if (nationalDestinationCodeLength > 0) {
+   *   nationalDestinationCode = nationalSignificantNumber.substring(0,
+   *       nationalDestinationCodeLength);
+   *   subscriberNumber = nationalSignificantNumber.substring(nationalDestinationCodeLength);
+   * } else {
+   *   nationalDestinationCode = "";
+   *   subscriberNumber = nationalSignificantNumber;
+   * }
+   *
+   * Refer to the unittests to see the difference between this function and
+   * getLengthOfGeographicalAreaCode().
+   *
+   * @param number  the PhoneNumber object for which clients want to know the length of the NDC.
+   * @return  the length of NDC of the PhoneNumber object passed in.
+   */
+  public int getLengthOfNationalDestinationCode(PhoneNumber number) {
     PhoneNumber copiedProto;
     if (number.hasExtension()) {
       // We don't want to alter the proto given to us, but we don't want to include the extension
@@ -566,6 +600,17 @@ public class PhoneNumberUtil {
     if (numberGroups.length <= 3) {
       return 0;
     }
+
+    if (getRegionCodeForNumber(number).equals("AR") &&
+        getNumberType(number) == PhoneNumberType.MOBILE) {
+      // Argentinian mobile numbers, when formatted in the international format, are in the form of
+      // +54 9 NDC XXXX.... As a result, we take the length of the third group (NDC) and add 1 for
+      // the digit 9, which also forms part of the national significant number.
+      //
+      // TODO: Investigate the possibility of better modeling the metadata to make it
+      // easier to obtain the NDC.
+      return numberGroups[3].length() + 1;
+    }
     return numberGroups[2].length();
   }
 
@@ -1165,8 +1210,7 @@ public class PhoneNumberUtil {
    */
   public boolean isValidNumber(PhoneNumber number) {
     String regionCode = getRegionCodeForNumber(number);
-    return isValidRegionCode(regionCode)
-           && isValidNumberForRegion(number, regionCode);
+    return (isValidRegionCode(regionCode) && isValidNumberForRegion(number, regionCode));
   }
 
   /**
@@ -1604,12 +1648,12 @@ public class PhoneNumberUtil {
    * the resulting number, and indicates if an international prefix was present.
    *
    * @param number  the non-normalized telephone number that we wish to strip any international
-   *     dialing prefix from
+   *     dialing prefix from.
    * @param possibleIddPrefix  the international direct dialing prefix from the country we
    *     think this number may be dialed in
    * @return  the corresponding CountryCodeSource if an international dialing prefix could be
    *          removed from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if the
-   *          number did not seem to be in international format
+   *          number did not seem to be in international format.
    */
   CountryCodeSource maybeStripInternationalPrefixAndNormalize(
       StringBuffer number,
@@ -1713,6 +1757,21 @@ public class PhoneNumberUtil {
   }
 
   /**
+   * Checks to see that the region code used is valid, or if it is not valid, that the number to
+   * parse starts with a + symbol so that we can attempt to infer the country from the number.
+   * Returns false if it cannot use the region provided and the region cannot be inferred.
+   */
+  private boolean checkRegionForParsing(String numberToParse, String defaultCountry) {
+    if (!isValidRegionCode(defaultCountry)) {
+      if (numberToParse != null && !numberToParse.isEmpty() &&
+          !PLUS_CHARS_PATTERN.matcher(numberToParse).lookingAt()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
    * Parses a string and returns it in proto buffer format. This method will throw a
    * NumberParseException exception if the number is not considered to be a possible number. Note
    * that validation of whether the number is actually a valid number for a particular
@@ -1743,13 +1802,7 @@ public class PhoneNumberUtil {
   // decrease object creation when invoked many times.
   public void parse(String numberToParse, String defaultCountry, PhoneNumber phoneNumber)
       throws NumberParseException {
-    if (!isValidRegionCode(defaultCountry)) {
-      if (numberToParse.length() > 0 && numberToParse.charAt(0) != PLUS_SIGN) {
-        throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
-                                       "Missing or invalid default country.");
-      }
-    }
-    parseHelper(numberToParse, defaultCountry, false, phoneNumber);
+    parseHelper(numberToParse, defaultCountry, false, true, phoneNumber);
   }
 
   /**
@@ -1780,23 +1833,22 @@ public class PhoneNumberUtil {
   public void parseAndKeepRawInput(String numberToParse, String defaultCountry,
                                    PhoneNumber phoneNumber)
       throws NumberParseException {
-    if (!isValidRegionCode(defaultCountry)) {
-      if (numberToParse.length() > 0 && numberToParse.charAt(0) != PLUS_SIGN) {
-        throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
-                                       "Missing or invalid default country.");
-      }
-    }
-    parseHelper(numberToParse, defaultCountry, true, phoneNumber);
+    parseHelper(numberToParse, defaultCountry, true, true, phoneNumber);
   }
 
   /**
    * Parses a string and fills up the phoneNumber. This method is the same as the public
    * parse() method, with the exception that it allows the default country to be null, for use by
-   * isNumberMatch().
+   * isNumberMatch(). checkRegion should be set to false if it is permitted for the default country
+   * to be null or unknown ("ZZ").
    */
-  private void parseHelper(String numberToParse, String defaultCountry,
-                           boolean keepRawInput, PhoneNumber phoneNumber)
+  private void parseHelper(String numberToParse, String defaultCountry, boolean keepRawInput,
+                           boolean checkRegion, PhoneNumber phoneNumber)
       throws NumberParseException {
+    if (numberToParse == null) {
+      throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER,
+                                     "The phone number supplied was null.");
+    }
     // Extract a possible number from the string passed in (this strips leading characters that
     // could not be the start of a phone number.)
     String number = extractPossibleNumber(numberToParse);
@@ -1805,6 +1857,13 @@ public class PhoneNumberUtil {
                                      "The string supplied did not seem to be a phone number.");
     }
 
+    // Check the country supplied is valid, or that the extracted number starts with some sort of +
+    // sign so the number's region can be determined.
+    if (checkRegion && !checkRegionForParsing(number, defaultCountry)) {
+      throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+                                     "Missing or invalid default country.");
+    }
+
     if (keepRawInput) {
       phoneNumber.setRawInput(numberToParse);
     }
@@ -1969,9 +2028,9 @@ public class PhoneNumberUtil {
   public MatchType isNumberMatch(String firstNumber, String secondNumber)
       throws NumberParseException {
     PhoneNumber number1 = new PhoneNumber();
-    parseHelper(firstNumber, null, false, number1);
+    parseHelper(firstNumber, null, false, false, number1);
     PhoneNumber number2 = new PhoneNumber();
-    parseHelper(secondNumber, null, false, number2);
+    parseHelper(secondNumber, null, false, false, number2);
     return isNumberMatch(number1, number2);
   }
 
@@ -1990,7 +2049,7 @@ public class PhoneNumberUtil {
   public MatchType isNumberMatch(PhoneNumber firstNumber, String secondNumber)
       throws NumberParseException {
     PhoneNumber number2 = new PhoneNumber();
-    parseHelper(secondNumber, null, false, number2);
+    parseHelper(secondNumber, null, false, false, number2);
     return isNumberMatch(firstNumber, number2);
   }
 }
index 0fc855a..aa722df 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM differ
index 6559332..abef816 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH differ
index a890dcc..f5a494a 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ differ
index bfdfe3b..b248f9c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD differ
index 0ad281c..94f8cca 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG differ
index 699410d..5cb60ae 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR differ
index 6566563..ab458a3 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU differ
index a2fc820..5cec8ce 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE differ
index b9e8dc6..8df1bce 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ differ
index edb880d..1e125fc 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC differ
index dcb5b6c..8933370 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE differ
index b76288c..6f8ab3a 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO differ
index e3ab079..c6853de 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB differ
index b597b4b..89fad3e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI differ
index 284d882..919cd8d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN differ
index 305ac3f..c884ba6 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN differ
index 610a2d4..aac7351 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT differ
index e0b9d9b..14dcc1c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU differ
index 2edbe88..bcaef59 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE differ
index 45e5454..8d6edad 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO differ
index ab74bd8..1a8acdb 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP differ
index d04c407..8ec8d9d 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB differ
index 528b89a..aa92d0e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK differ
index a6d98d1..762883c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR differ
index 7781aeb..673f6bb 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA differ
index 5401cbb..9bf3754 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK differ
index 9fe3e04..d3c52c6 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN differ
index e7c1c5d..ce173e4 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR differ
index 8bae5e4..8e06f3f 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT differ
index ef2343e..77a73cc 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV differ
index b87e997..1e44cb9 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA differ
index fb8ea16..099065c 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU differ
index 5350b0c..05e8556 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG differ
index dc8b00f..16b2bed 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS differ
index 6a0ef37..79ee4c0 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC differ
index 05dafe7..8d70a39 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD differ
index 399191b..5c92a37 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG differ
index c58bcf3..f23197b 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO differ
index 2d43434..a9184ca 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ differ
index 81fbb02..79206df 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN differ
index f4a82cc..54877d9 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA differ
index 99b27ec..0c3990e 100644 (file)
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW differ
index 1e96cdb..723435e 100644 (file)
@@ -169,6 +169,49 @@ public class PhoneNumberUtilTest extends TestCase {
     assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number));
   }
 
+  public void testGetLengthOfNationalDestinationCode() {
+    PhoneNumber number = new PhoneNumber();
+    // Google MTV, which has national destination code (NDC) "650".
+    number.setCountryCode(1).setNationalNumber(6502530000L);
+    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // A North America toll-free number, which has NDC "800".
+    number.setCountryCode(1).setNationalNumber(8002530000L);
+    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // Google London, which has NDC "20".
+    number.setCountryCode(44).setNationalNumber(2070313000L);
+    assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // A UK mobile phone, which has NDC "7123".
+    number.setCountryCode(44).setNationalNumber(7123456789L);
+    assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // Google Buenos Aires, which has NDC "11".
+    number.setCountryCode(54).setNationalNumber(1155303000L);
+    assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // An Argentinian mobile which has NDC "911".
+    number.setCountryCode(54).setNationalNumber(91155303001L);
+    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // Google Sydney, which has NDC "2".
+    number.setCountryCode(61).setNationalNumber(293744000L);
+    assertEquals(1, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // Google Singapore, which has NDC "6521".
+    number.setCountryCode(65).setNationalNumber(65218000L);
+    assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // An invalid US number (1 digit shorter), which has no NDC.
+    number.setCountryCode(1).setNationalNumber(650253000L);
+    assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(number));
+
+    // A number containing an invalid country code, which shouldn't have any NDC.
+    number.setCountryCode(123).setNationalNumber(6502530000L);
+    assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(number));
+  }
+
   public void testGetNationalSignificantNumber() {
     PhoneNumber number = new PhoneNumber();
     number.setCountryCode(1).setNationalNumber(6502530000L);
@@ -1273,6 +1316,10 @@ public class PhoneNumberUtilTest extends TestCase {
     assertEquals(usNumber, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
                                            "\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10",
                                            "SG"));
+    // Using U+30FC dash instead.
+    assertEquals(usNumber, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
+                                           "\u3000\uFF13\uFF13\uFF13\u30FC\uFF16\uFF10\uFF10\uFF10",
+                                           "SG"));
   }
 
   public void testParseWithLeadingZero() throws Exception {
@@ -1481,6 +1528,31 @@ public class PhoneNumberUtilTest extends TestCase {
                    NumberParseException.ErrorType.NOT_A_NUMBER,
                    e.getErrorType());
     }
+    try {
+      String nullNumber = null;
+      // Invalid region.
+      phoneUtil.parse(nullNumber, "ZZ");
+      fail("Null string - should fail.");
+    } catch (NumberParseException e) {
+      // Expected this exception.
+      assertEquals("Wrong error type stored in exception.",
+                   NumberParseException.ErrorType.NOT_A_NUMBER,
+                   e.getErrorType());
+    } catch (NullPointerException e) {
+      fail("Null string - but should not throw a null pointer exception.");
+    }
+    try {
+      String nullNumber = null;
+      phoneUtil.parse(nullNumber, "US");
+      fail("Null string - should fail.");
+    } catch (NumberParseException e) {
+      // Expected this exception.
+      assertEquals("Wrong error type stored in exception.",
+                   NumberParseException.ErrorType.NOT_A_NUMBER,
+                   e.getErrorType());
+    } catch (NullPointerException e) {
+      fail("Null string - but should not throw a null pointer exception.");
+    }
   }
 
   public void testParseNumbersWithPlusWithNoRegion() throws Exception {
@@ -1489,6 +1561,10 @@ public class PhoneNumberUtilTest extends TestCase {
     // "ZZ" is allowed only if the number starts with a '+' - then the country code can be
     // calculated.
     assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", "ZZ"));
+    // Test with full-width plus.
+    assertEquals(nzNumber, phoneUtil.parse("\uFF0B64 3 331 6005", "ZZ"));
+    // Test with normal plus but leading characters that need to be stripped.
+    assertEquals(nzNumber, phoneUtil.parse("Tel: +64 3 331 6005", "ZZ"));
     assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", null));
     nzNumber.setRawInput("+64 3 331 6005").
         setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN);
@@ -1534,6 +1610,11 @@ public class PhoneNumberUtilTest extends TestCase {
     assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , ext 7246433", "US"));
     assertEquals(usWithExtension,
                  phoneUtil.parse("(800) 901-3355 ,extension 7246433", "US"));
+    assertEquals(usWithExtension,
+                 phoneUtil.parse("(800) 901-3355 ,extensi\u00F3n 7246433", "US"));
+    // Repeat with the small letter o with acute accent created by combining characters.
+    assertEquals(usWithExtension,
+                 phoneUtil.parse("(800) 901-3355 ,extension 7246433", "US"));
     assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , 7246433", "US"));
     assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 ext: 7246433", "US"));