1/*
2 * Copyright (C) 2010 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.i18n.addressinput;
18
19import org.json.JSONException;
20import org.json.JSONObject;
21
22import java.util.HashMap;
23import java.util.Map;
24
25/**
26 * Initial data in JSON format for regions. This has some formatting information for some countries,
27 * and a list of all the regions that the widget can support. Data has been sorted below for ease of
28 * editing.
29 */
30class RegionDataConstants {
31
32    private static final Map<String, String> COUNTRY_FORMAT_MAP =
33            new HashMap<String, String>();
34
35    private enum RegionDataEnum {
36
37        AC(new String[]{
38            "name", "ASCENSION ISLAND",
39        }),
40        AD(new String[]{
41                "name", "ANDORRA",
42                "lang", "ca",
43                "languages", "ca",
44                "fmt", "%N%n%O%n%A%n%Z %S",
45                "require", "AS",
46                "upper", "S",
47                "state_name_type", "parish",
48        }),
49        AE(new String[]{
50                "name", "UNITED ARAB EMIRATES",
51                "fmt", "%N%n%O%n%A%n%C",
52                "require", "AC",
53        }),
54        AF(new String[]{
55                "name", "AFGHANISTAN",
56        }),
57        AG(new String[]{
58                "name", "ANTIGUA AND BARBUDA",
59                "require", "A",
60        }),
61        AI(new String[]{
62                "name", "ANGUILLA",
63        }),
64        AL(new String[]{
65                "name", "ALBANIA",
66        }),
67        AM(new String[]{
68                "name", "ARMENIA",
69                "lang", "hy",
70                "languages", "hy",
71                "fmt", "%N%n%O%n%A%n%Z%n%C%n%S",
72                "lfmt", "%N%n%O%n%A%n%Z%n%C%n%S",
73        }),
74        AN(new String[]{
75                "name", "NETHERLANDS ANTILLES",
76        }),
77        AO(new String[]{
78                "name", "ANGOLA",
79        }),
80        AQ(new String[]{
81                "name", "ANTARCTICA",
82        }),
83        AR(new String[]{
84                "name", "ARGENTINA",
85                "lang", "es",
86                "languages", "es",
87                "fmt", "%N%n%O%n%A%n%Z %C%n%S",
88                "upper", "ACZ",
89                "state_name_type", "state",
90        }),
91        AS(new String[]{
92                "name", "AMERICAN SAMOA",
93                "fmt", "%N%n%O%n%A%n%C %S %Z",
94                "require", "ACSZ",
95                "upper", "ACNOS",
96                "zip_name_type", "zip",
97                "state_name_type", "state",
98        }),
99        AT(new String[]{
100                "name", "AUSTRIA",
101                "fmt", "%O%n%N%n%A%n%Z %C",
102                "require", "ACZ",
103        }),
104        AU(new String[]{
105                "name", "AUSTRALIA",
106                "lang", "en",
107                "languages", "en",
108                "fmt", "%O%n%N%n%A%n%C %S %Z",
109                "require", "ACSZ",
110                "upper", "CS",
111                "state_name_type", "state",
112        }),
113        AW(new String[]{
114                "name", "ARUBA",
115        }),
116        AX(new String[]{
117                "name", "FINLAND",
118                "fmt", "%O%n%N%n%A%nAX-%Z %C%n\u00C5LAND",
119                "require", "ACZ",
120                "postprefix", "AX-",
121        }),
122        AZ(new String[]{
123                "name", "AZERBAIJAN",
124                "fmt", "%N%n%O%n%A%nAZ %Z %C",
125                "postprefix", "AZ ",
126        }),
127        BA(new String[]{
128                "name", "BOSNIA AND HERZEGOVINA",
129                "fmt", "%N%n%O%n%A%n%Z %C",
130        }),
131        BB(new String[]{
132                "name", "BARBADOS",
133                "state_name_type", "parish",
134        }),
135        BD(new String[]{
136                "name", "BANGLADESH",
137                "fmt", "%N%n%O%n%A%n%C - %Z",
138        }),
139        BE(new String[]{
140                "name", "BELGIUM",
141                "fmt", "%O%n%N%n%A%n%Z %C",
142                "require", "ACZ",
143        }),
144        BF(new String[]{
145                "name", "BURKINA FASO",
146                "fmt", "%N%n%O%n%A%n%C %X",
147        }),
148        BG(new String[]{
149                "name", "BULGARIA (REP.)",
150                "fmt", "%N%n%O%n%A%n%Z %C",
151        }),
152        BH(new String[]{
153                "name", "BAHRAIN",
154                "fmt", "%N%n%O%n%A%n%C %Z",
155        }),
156        BI(new String[]{
157                "name", "BURUNDI",
158        }),
159        BJ(new String[]{
160                "name", "BENIN",
161                "upper", "AC",
162        }),
163        BL(new String[]{
164                "name", "SAINT BARTHELEMY",
165                "fmt", "%O%n%N%n%A%n%Z %C %X",
166                "upper", "ACX",
167                "require", "ACZ",
168        }),
169        BM(new String[]{
170                "name", "BERMUDA",
171                "fmt", "%N%n%O%n%A%n%C %Z",
172        }),
173        BN(new String[]{
174                "name", "BRUNEI DARUSSALAM",
175                "fmt", "%N%n%O%n%A%n%C %Z",
176        }),
177        BO(new String[]{
178                "name", "BOLIVIA",
179                "upper", "AC",
180        }),
181        BR(new String[]{
182                "name", "BRAZIL",
183                "lang", "pt",
184                "languages", "pt",
185                "fmt", "%O%n%N%n%A%n%C-%S%n%Z",
186                "require", "ASCZ",
187                "upper", "CS",
188                "state_name_type", "state",
189        }),
190        BS(new String[]{
191                "name", "BAHAMAS",
192                "lang", "en",
193                "languages", "en",
194                "fmt", "%N%n%O%n%A%n%C, %S",
195                "state_name_type", "island",
196        }),
197        BT(new String[]{
198                "name", "BHUTAN",
199        }),
200        BV(new String[]{
201                "name", "BOUVET ISLAND",
202        }),
203        BW(new String[]{
204                "name", "BOTSWANA",
205        }),
206        BY(new String[]{
207                "name", "BELARUS",
208                "fmt", "%S%n%Z %C %X%n%A%n%O%n%N",
209        }),
210        BZ(new String[]{
211                "name", "BELIZE",
212        }),
213        CA(new String[]{
214                "name", "CANADA",
215                "lang", "en",
216                "languages", "en~fr",
217                "fmt", "%N%n%O%n%A%n%C %S %Z",
218                "require", "ACSZ",
219                "upper", "ACNOSZ",
220        }),
221        CC(new String[]{
222                "name", "COCOS (KEELING) ISLANDS",
223                "fmt", "%O%n%N%n%A%n%C %S %Z",
224                "upper", "CS",
225        }),
226        CD(new String[]{
227                "name", "CONGO (DEM. REP.)",
228                "fmt", "%N%n%O%n%A%n%C %X",
229        }),
230        CF(new String[]{
231                "name", "CENTRAL AFRICAN REPUBLIC",
232        }),
233        CG(new String[]{
234                "name", "CONGO (REP.)",
235        }),
236        CH(new String[]{
237                "name", "SWITZERLAND",
238                "lang", "de",
239                "languages", "de~fr~it",
240                "fmt", "%O%n%N%n%A%nCH-%Z %C",
241                "require", "ACZ",
242                "upper", "",
243                "postprefix", "CH-",
244        }),
245        CI(new String[]{
246                "name", "COTE D'IVOIRE",
247                "fmt", "%N%n%O%n%X %A %C %X",
248        }),
249        CK(new String[]{
250                "name", "COOK ISLANDS",
251                "fmt", "%N%n%O%n%A%n%C %Z",
252        }),
253        CL(new String[]{
254                "name", "CHILE",
255                "lang", "es",
256                "languages", "es",
257                "fmt", "%N%n%O%n%A%n%Z %C%n%S",
258                "state_name_type", "state",
259        }),
260        CM(new String[]{
261                "name", "CAMEROON",
262        }),
263        CN(new String[]{
264                "name", "P.R. CHINA",
265                "lang", "zh-hans",
266                "languages", "zh-hans",
267                "fmt", "%Z%n%S%C%D%n%A%n%O%n%N",
268                "lfmt", "%N%n%O%n%A%n%D%n%C%n%S, %Z",
269                "require", "ACSZ",
270                "upper", "S",
271        }),
272        CO(new String[]{
273                "name", "COLOMBIA",
274                "fmt", "%N%n%O%n%A%n%C, %S",
275        }),
276        CR(new String[]{
277                "name", "COSTA RICA",
278                "fmt", "%N%n%O%n%A%n%Z %C",
279        }),
280        CS(new String[]{
281                "name", "SERBIA AND MONTENEGRO",
282                "fmt", "%N%n%O%n%A%n%Z %C",
283        }),
284        CV(new String[]{
285                "name", "CAPE VERDE",
286                "lang", "pt",
287                "languages", "pt",
288                "fmt", "%N%n%O%n%A%n%Z %C%n%S",
289                "state_name_type", "island",
290        }),
291        CX(new String[]{
292                "name", "CHRISTMAS ISLAND",
293                "fmt", "%O%n%N%n%A%n%C %S %Z",
294                "upper", "CS",
295        }),
296        CY(new String[]{
297                "name", "CYPRUS",
298                "fmt", "%N%n%O%n%A%n%Z %C",
299        }),
300        CZ(new String[]{
301                "name", "CZECH REP.",
302                "fmt", "%N%n%O%n%A%n%Z %C",
303        }),
304        DE(new String[]{
305                "name", "GERMANY",
306                "fmt", "%N%n%O%n%A%n%Z %C",
307                "require", "ACZ",
308        }),
309        DJ(new String[]{
310                "name", "DJIBOUTI",
311        }),
312        DK(new String[]{
313                "name", "DENMARK",
314                "fmt", "%O%n%N%n%A%n%Z %C",
315                "require", "ACZ",
316        }),
317        DM(new String[]{
318                "name", "DOMINICA",
319        }),
320        DO(new String[]{
321                "name", "DOMINICAN REP.",
322                "fmt", "%N%n%O%n%A%n%Z %C",
323        }),
324        DZ(new String[]{
325                "name", "ALGERIA",
326                "fmt", "%N%n%O%n%A%n%Z %C",
327        }),
328        EC(new String[]{
329                "name", "ECUADOR",
330                "fmt", "%N%n%O%n%A%n%Z%n%C",
331                "upper", "CZ",
332        }),
333        EE(new String[]{
334                "name", "ESTONIA",
335                "fmt", "%N%n%O%n%A%n%Z %C",
336        }),
337        EG(new String[]{
338                "name", "EGYPT",
339                "fmt", "%N%n%O%n%A%n%C%n%S%n%Z",
340                "lfmt", "%N%n%O%n%A%n%C%n%S%n%Z",
341        }),
342        EH(new String[]{
343                "name", "WESTERN SAHARA",
344        }),
345        ER(new String[]{
346                "name", "ERITREA",
347        }),
348        ES(new String[]{
349                "name", "SPAIN",
350                "lang", "es",
351                "languages", "es",
352                "fmt", "%N%n%O%n%A%n%Z %C %S",
353                "require", "ACSZ",
354                "upper", "CS",
355        }),
356        ET(new String[]{
357                "name", "ETHIOPIA",
358                "fmt", "%N%n%O%n%A%n%Z %C",
359        }),
360        FI(new String[]{
361                "name", "FINLAND",
362                "fmt", "%O%n%N%n%A%nFI-%Z %C",
363                "require", "ACZ",
364                "postprefix", "FI-",
365        }),
366        FJ(new String[]{
367                "name", "FIJI",
368        }),
369        FK(new String[]{
370                "name", "FALKLAND ISLANDS (MALVINAS)",
371                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
372                "require", "ACZ",
373                "upper", "CZ",
374        }),
375        FM(new String[]{
376                "name", "MICRONESIA (Federated State of)",
377                "fmt", "%N%n%O%n%A%n%C %S %Z",
378                "require", "ACSZ",
379                "upper", "ACNOS",
380                "zip_name_type", "zip",
381                "state_name_type", "state",
382        }),
383        FO(new String[]{
384                "name", "FAROE ISLANDS",
385                "fmt", "%N%n%O%n%A%nFO%Z %C",
386                "postprefix", "FO",
387        }),
388        FR(new String[]{
389                "name", "FRANCE",
390                "fmt", "%O%n%N%n%A%n%Z %C %X",
391                "require", "ACZ",
392                "upper", "CX",
393        }),
394        GA(new String[]{
395                "name", "GABON",
396        }),
397        GB(new String[]{
398                "name", "UNITED KINGDOM",
399                "fmt", "%N%n%O%n%A%n%C%n%S%n%Z",
400                "require", "ACZ",
401                "upper", "CZ",
402                "state_name_type", "county",
403        }),
404        GD(new String[]{
405                "name", "GRENADA (WEST INDIES)",
406        }),
407        GE(new String[]{
408                "name", "GEORGIA",
409                "fmt", "%N%n%O%n%A%n%Z %C",
410        }),
411        GF(new String[]{
412                "name", "FRENCH GUIANA",
413                "fmt", "%O%n%N%n%A%n%Z %C %X",
414                "require", "ACZ",
415                "upper", "ACX",
416        }),
417        GG(new String[]{
418                "name", "CHANNEL ISLANDS",
419                "fmt", "%N%n%O%n%A%n%X%n%C%nGUERNSEY%n%Z",
420                "require", "ACZ",
421                "upper", "CZ",
422        }),
423        GH(new String[]{
424                "name", "GHANA",
425        }),
426        GI(new String[]{
427                "name", "GIBRALTAR",
428                "fmt", "%N%n%O%n%A",
429                "require", "A",
430        }),
431        GL(new String[]{
432                "name", "GREENLAND",
433                "fmt", "%N%n%O%n%A%n%Z %C",
434                "require", "ACZ",
435        }),
436        GM(new String[]{
437                "name", "GAMBIA",
438        }),
439        GN(new String[]{
440                "name", "GUINEA",
441                "fmt", "%N%n%O%n%Z %A %C",
442        }),
443        GP(new String[]{
444                "name", "GUADELOUPE",
445                "fmt", "%O%n%N%n%A%n%Z %C %X",
446                "require", "ACZ",
447                "upper", "ACX",
448        }),
449        GQ(new String[]{
450                "name", "EQUATORIAL GUINEA",
451        }),
452        GR(new String[]{
453                "name", "GREECE",
454                "fmt", "%N%n%O%n%A%n%Z %C",
455                "require", "ACZ",
456        }),
457        GS(new String[]{
458                "name", "SOUTH GEORGIA",
459                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
460                "require", "ACZ",
461                "upper", "CZ",
462        }),
463        GT(new String[]{
464                "name", "GUATEMALA",
465                "fmt", "%N%n%O%n%A%n%Z- %C",
466        }),
467        GU(new String[]{
468                "name", "GUAM",
469                "fmt", "%N%n%O%n%A%n%C %S %Z",
470                "require", "ACSZ",
471                "upper", "ACNOS",
472                "zip_name_type", "zip",
473                "state_name_type", "state",
474        }),
475        GW(new String[]{
476                "name", "GUINEA-BISSAU",
477                "fmt", "%N%n%O%n%A%n%Z %C",
478        }),
479        GY(new String[]{
480                "name", "GUYANA",
481        }),
482        HK(new String[]{
483                "name", "HONG KONG",
484                "lang", "zh",
485                "languages", "zh",
486                "fmt", "%S%n%A%n%O%n%N",
487                "lfmt", "%N%n%O%n%A%n%S",
488                "require", "AS",
489                "upper", "S",
490                "state_name_type", "area",
491        }),
492        HM(new String[]{
493                "name", "HEARD AND MCDONALD ISLANDS",
494                "fmt", "%O%n%N%n%A%n%C %S %Z",
495                "upper", "CS",
496        }),
497        HN(new String[]{
498                "name", "HONDURAS",
499                "fmt", "%N%n%O%n%A%n%C, %S%n%Z",
500                "require", "ACS",
501        }),
502        HR(new String[]{
503                "name", "CROATIA",
504                "fmt", "%N%n%O%n%A%nHR-%Z %C",
505                "postprefix", "HR-",
506        }),
507        HT(new String[]{
508                "name", "HAITI",
509                "fmt", "%N%n%O%n%A%nHT%Z %C %X",
510                "postprefix", "HT",
511        }),
512        HU(new String[]{
513                "name", "HUNGARY (Rep.)",
514                "fmt", "%N%n%O%n%C%n%A%n%Z",
515                "upper", "ACNO",
516        }),
517        ID(new String[]{
518                "name", "INDONESIA",
519                "fmt", "%N%n%O%n%A%n%C %Z%n%S",
520        }),
521        IE(new String[]{
522                "name", "IRELAND",
523                "lang", "en",
524                "languages", "en",
525                "fmt", "%N%n%O%n%A%n%C%n%S",
526                "state_name_type", "county",
527        }),
528        IL(new String[]{
529                "name", "ISRAEL",
530                "fmt", "%N%n%O%n%A%n%C %Z",
531        }),
532        IM(new String[]{
533                "name", "ISLE OF MAN",
534                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
535                "require", "ACZ",
536                "upper", "CZ",
537        }),
538        IN(new String[]{
539                "name", "INDIA",
540                "lang", "en",
541                "languages", "en",
542                "fmt", "%N%n%O%n%A%n%C %Z%n%S",
543                "require", "ACSZ",
544                "state_name_type", "state",
545        }),
546        IO(new String[]{
547                "name", "BRITISH INDIAN OCEAN TERRITORY",
548                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
549                "require", "ACZ",
550                "upper", "CZ",
551        }),
552        IQ(new String[]{
553                "name", "IRAQ",
554                "fmt", "%O%n%N%n%A%n%C, %S%n%Z",
555                "require", "ACS",
556                "upper", "CS",
557        }),
558        IS(new String[]{
559                "name", "ICELAND",
560                "fmt", "%N%n%O%n%A%n%Z %C",
561        }),
562        IT(new String[]{
563                "name", "ITALY",
564                "lang", "it",
565                "languages", "it",
566                "fmt", "%N%n%O%n%A%n%Z %C %S",
567                "require", "ACSZ",
568                "upper", "CS",
569        }),
570        JE(new String[]{
571                "name", "CHANNEL ISLANDS",
572                "fmt", "%N%n%O%n%A%n%X%n%C%nJERSEY%n%Z",
573                "require", "ACZ",
574                "upper", "CZ",
575        }),
576        JM(new String[]{
577                "name", "JAMAICA",
578                "lang", "en",
579                "languages", "en",
580                "fmt", "%N%n%O%n%A%n%C%n%S %X",
581                "require", "ACS",
582                "state_name_type", "parish",
583        }),
584        JO(new String[]{
585                "name", "JORDAN",
586                "fmt", "%N%n%O%n%A%n%C %Z",
587        }),
588        JP(new String[]{
589                "name", "JAPAN",
590                "lang", "ja",
591                "languages", "ja",
592                "fmt", "\u3012%Z%n%S%C%n%A%n%O%n%N",
593                "lfmt", "%N%n%O%n%A%n%C, %S%n%Z",
594                "require", "ACSZ",
595                "upper", "S",
596                "state_name_type", "prefecture",
597        }),
598        KE(new String[]{
599                "name", "KENYA",
600                "fmt", "%N%n%O%n%A%n%C%n%Z",
601        }),
602        KG(new String[]{
603                "name", "KYRGYZSTAN",
604                "fmt", "%Z %C %X%n%A%n%O%n%N",
605        }),
606        KH(new String[]{
607                "name", "CAMBODIA",
608                "fmt", "%N%n%O%n%A%n%C %Z",
609        }),
610        KI(new String[]{
611                "name", "KIRIBATI",
612                "fmt", "%N%n%O%n%A%n%S%n%C",
613                "upper", "ACNOS",
614                "state_name_type", "island",
615        }),
616        KM(new String[]{
617                "name", "COMOROS",
618                "upper", "AC",
619        }),
620        KN(new String[]{
621                "name", "SAINT KITTS AND NEVIS",
622                "lang", "en",
623                "languages", "en",
624                "fmt", "%N%n%O%n%A%n%C, %S",
625                "require", "ACS",
626                "state_name_type", "island",
627        }),
628        KR(new String[]{
629                "name", "KOREA (REP.)",
630                "lang", "ko",
631                "languages", "ko",
632                "fmt", "%S %C%D%n%A%n%O%n%N%nSEOUL %Z",
633                "lfmt", "%N%n%O%n%A%n%D%n%C%n%S%nSEOUL %Z",
634                "require", "ACSZ",
635                "upper", "Z",
636                "state_name_type", "do_si",
637        }),
638        KW(new String[]{
639                "name", "KUWAIT",
640                "fmt", "%N%n%O%n%A%n%Z %C",
641        }),
642        KY(new String[]{
643                "name", "CAYMAN ISLANDS",
644                "lang", "en",
645                "languages", "en",
646                "fmt", "%N%n%O%n%A%n%S",
647                "require", "AS",
648                "state_name_type", "island",
649        }),
650        KZ(new String[]{
651                "name", "KAZAKHSTAN",
652                "fmt", "%Z%n%S%n%C%n%A%n%O%n%N",
653        }),
654        LA(new String[]{
655                "name", "LAO (PEOPLE'S DEM. REP.)",
656                "fmt", "%N%n%O%n%A%n%Z %C",
657        }),
658        LB(new String[]{
659                "name", "LEBANON",
660                "fmt", "%N%n%O%n%A%n%C %Z",
661        }),
662        LC(new String[]{
663                "name", "SAINT LUCIA",
664        }),
665        LI(new String[]{
666                "name", "LIECHTENSTEIN",
667                "fmt", "%O%n%N%n%A%nFL-%Z %C",
668                "require", "ACZ",
669                "postprefix", "FL-",
670        }),
671        LK(new String[]{
672                "name", "SRI LANKA",
673                "fmt", "%N%n%O%n%A%n%C%n%Z",
674        }),
675        LR(new String[]{
676                "name", "LIBERIA",
677                "fmt", "%N%n%O%n%A%n%Z %C %X",
678        }),
679        LS(new String[]{
680                "name", "LESOTHO",
681                "fmt", "%N%n%O%n%A%n%C %Z",
682        }),
683        LT(new String[]{
684                "name", "LITHUANIA",
685                "fmt", "%O%n%N%n%A%nLT-%Z %C",
686                "postprefix", "LT-",
687        }),
688        LU(new String[]{
689                "name", "LUXEMBOURG",
690                "fmt", "%O%n%N%n%A%nL-%Z %C",
691                "require", "ACZ",
692                "postprefix", "L-",
693        }),
694        LV(new String[]{
695                "name", "LATVIA",
696                "fmt", "%N%n%O%n%A%n%C, %Z",
697        }),
698        LY(new String[]{
699                "name", "LIBYA",
700        }),
701        MA(new String[]{
702                "name", "MOROCCO",
703                "fmt", "%N%n%O%n%A%n%Z %C",
704        }),
705        MC(new String[]{
706                "name", "MONACO",
707                "fmt", "%N%n%O%n%A%nMC-%Z %C %X",
708                "postprefix", "MC-",
709        }),
710        MD(new String[]{
711                "name", "Rep. MOLDOVA",
712                "fmt", "%N%n%O%n%A%nMD-%Z %C",
713                "postprefix", "MD-",
714        }),
715        ME(new String[]{
716                "name", "MONTENEGRO",
717                "fmt", "%N%n%O%n%A%n%Z %C",
718        }),
719        MF(new String[]{
720                "name", "SAINT MARTIN",
721                "fmt", "%O%n%N%n%A%n%Z %C %X",
722                "upper", "ACX",
723                "require", "ACZ",
724        }),
725        MG(new String[]{
726                "name", "MADAGASCAR",
727                "fmt", "%N%n%O%n%A%n%Z %C",
728        }),
729        MH(new String[]{
730                "name", "MARSHALL ISLANDS",
731                "fmt", "%N%n%O%n%A%n%C %S %Z",
732                "require", "ACSZ",
733                "upper", "ACNOS",
734                "zip_name_type", "zip",
735                "state_name_type", "state",
736        }),
737        MK(new String[]{
738                "name", "MACEDONIA",
739                "fmt", "%N%n%O%n%A%n%Z %C",
740        }),
741        ML(new String[]{
742                "name", "MALI",
743        }),
744        MN(new String[]{
745                "name", "MONGOLIA",
746                "fmt", "%N%n%O%n%A%n%S %C-%X%n%Z",
747        }),
748        MO(new String[]{
749                "name", "MACAO",
750                "lang", "zh-hant",
751                "languages", "zh-hant",
752                "fmt", "%A%n%O%n%N",
753                "lfmt", "%N%n%O%n%A",
754                "require", "A",
755        }),
756        MP(new String[]{
757                "name", "NORTHERN MARIANA ISLANDS",
758                "fmt", "%N%n%O%n%A%n%C %S %Z",
759                "require", "ACSZ",
760                "upper", "ACNOS",
761                "zip_name_type", "zip",
762                "state_name_type", "state",
763        }),
764        MQ(new String[]{
765                "name", "MARTINIQUE",
766                "fmt", "%O%n%N%n%A%n%Z %C %X",
767                "require", "ACZ",
768                "upper", "ACX",
769        }),
770        MR(new String[]{
771                "name", "MAURITANIA",
772                "upper", "AC",
773        }),
774        MS(new String[]{
775                "name", "MONTSERRAT",
776        }),
777        MT(new String[]{
778                "name", "MALTA",
779                "fmt", "%N%n%O%n%A%n%C %Z",
780                "upper", "CZ",
781        }),
782        MU(new String[]{
783                "name", "MAURITIUS",
784                "fmt", "%N%n%O%n%A%n%Z%n%C",
785                "upper", "CZ",
786        }),
787        MV(new String[]{
788                "name", "MALDIVES",
789                "fmt", "%N%n%O%n%A%n%C %Z",
790        }),
791        MW(new String[]{
792                "name", "MALAWI",
793                "fmt", "%N%n%O%n%A%n%C %X",
794        }),
795        MX(new String[]{
796                "name", "MEXICO",
797                "lang", "es",
798                "languages", "es",
799                "fmt", "%N%n%O%n%A%n%Z %C, %S",
800                "require", "ACZ",
801                "upper", "CSZ",
802                "state_name_type", "state",
803        }),
804        MY(new String[]{
805                "name", "MALAYSIA",
806                "lang", "ms",
807                "languages", "ms",
808                "fmt", "%N%n%O%n%A%n%Z %C, %S",
809                "require", "ACZ",
810                "upper", "CS",
811                "state_name_type", "state",
812        }),
813        MZ(new String[]{
814                "name", "MOZAMBIQUE",
815                "fmt", "%N%n%O%n%A%n%C",
816        }),
817        NA(new String[]{
818                "name", "NAMIBIA",
819        }),
820        NC(new String[]{
821                "name", "NEW CALEDONIA",
822                "fmt", "%O%n%N%n%A%n%Z %C %X",
823                "require", "ACZ",
824                "upper", "ACX",
825        }),
826        NE(new String[]{
827                "name", "NIGER",
828                "fmt", "%N%n%O%n%A%n%Z %C",
829        }),
830        NF(new String[]{
831                "name", "NORFOLK ISLAND",
832                "fmt", "%O%n%N%n%A%n%C %S %Z",
833                "upper", "CS",
834        }),
835        NG(new String[]{
836                "name", "NIGERIA",
837                "lang", "fr",
838                "languages", "fr",
839                "fmt", "%N%n%O%n%A%n%C %Z%n%S",
840                "upper", "CS",
841                "state_name_type", "state",
842        }),
843        NI(new String[]{
844                "name", "NICARAGUA",
845                "lang", "es",
846                "languages", "es",
847                "fmt", "%N%n%O%n%A%n%Z%n%C, %S",
848                "upper", "CS",
849                "state_name_type", "department",
850        }),
851        NL(new String[]{
852                "name", "NETHERLANDS",
853                "fmt", "%O%n%N%n%A%n%Z %C",
854                "require", "ACZ",
855        }),
856        NO(new String[]{
857                "name", "NORWAY",
858                "fmt", "%N%n%O%n%A%n%Z %C",
859                "require", "ACZ",
860        }),
861        NP(new String[]{
862                "name", "NEPAL",
863                "fmt", "%N%n%O%n%A%n%C %Z",
864        }),
865        NR(new String[]{
866                "name", "NAURU CENTRAL PACIFIC",
867                "lang", "en",
868                "languages", "en",
869                "fmt", "%N%n%O%n%A%n%S",
870                "require", "AS",
871                "state_name_type", "district",
872        }),
873        NU(new String[]{
874                "name", "NIUE",
875        }),
876        NZ(new String[]{
877                "name", "NEW ZEALAND",
878                "fmt", "%N%n%O%n%A%n%C %Z",
879                "require", "ACZ",
880        }),
881        OM(new String[]{
882                "name", "OMAN",
883                "fmt", "%N%n%O%n%A%n%Z%n%C",
884        }),
885        PA(new String[]{
886                "name", "PANAMA (REP.)",
887                "fmt", "%N%n%O%n%A%n%C%n%S",
888                "upper", "CS",
889        }),
890        PE(new String[]{
891                "name", "PERU",
892        }),
893        PF(new String[]{
894                "name", "FRENCH POLYNESIA",
895                "fmt", "%N%n%O%n%A%n%Z %C %S",
896                "require", "ACSZ",
897                "upper", "CS",
898                "state_name_type", "island",
899        }),
900        PG(new String[]{
901                "name", "PAPUA NEW GUINEA",
902                "fmt", "%N%n%O%n%A%n%C %Z %S",
903                "require", "ACS",
904        }),
905        PH(new String[]{
906                "name", "PHILIPPINES",
907                "fmt", "%N%n%O%n%A%n%Z %C%n%S",
908                "require", "AC",
909        }),
910        PK(new String[]{
911                "name", "PAKISTAN",
912                "fmt", "%N%n%O%n%A%n%C-%Z",
913        }),
914        PL(new String[]{
915                "name", "POLAND",
916                "fmt", "%N%n%O%n%A%n%Z %C",
917                "require", "ACZ",
918        }),
919        PM(new String[]{
920                "name", "ST. PIERRE AND MIQUELON",
921                "fmt", "%O%n%N%n%A%n%Z %C %X",
922                "require", "ACZ",
923                "upper", "ACX",
924        }),
925        PN(new String[]{
926                "name", "PITCAIRN",
927                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
928                "require", "ACZ",
929                "upper", "CZ",
930        }),
931        PR(new String[]{
932                "name", "PUERTO RICO",
933                "fmt", "%N%n%O%n%A%n%C PR %Z",
934                "require", "ACZ",
935                "upper", "ACNO",
936                "zip_name_type", "zip",
937                "postprefix", "PR",
938        }),
939        PS(new String[]{
940                "name", "PALESTINIAN TERRITORY",
941        }),
942        PT(new String[]{
943                "name", "PORTUGAL",
944                "fmt", "%N%n%O%n%A%n%Z %C",
945                "require", "ACZ",
946        }),
947        PW(new String[]{
948                "name", "PALAU",
949                "fmt", "%N%n%O%n%A%n%C %S %Z",
950                "require", "ACSZ",
951                "upper", "ACNOS",
952                "zip_name_type", "zip",
953                "state_name_type", "state",
954        }),
955        PY(new String[]{
956                "name", "PARAGUAY",
957                "fmt", "%N%n%O%n%A%n%Z %C",
958        }),
959        QA(new String[]{
960                "name", "QATAR",
961                "upper", "AC",
962        }),
963        RE(new String[]{
964                "name", "REUNION",
965                "fmt", "%O%n%N%n%A%n%Z %C %X",
966                "require", "ACZ",
967                "upper", "ACX",
968        }),
969        RO(new String[]{
970                "name", "ROMANIA",
971                "fmt", "%N%n%O%n%A%n%Z %C",
972                "upper", "AC",
973        }),
974        RS(new String[]{
975                "name", "REPUBLIC OF SERBIA",
976                "fmt", "%N%n%O%n%A%n%Z %C",
977        }),
978        RU(new String[]{
979                "name", "RUSSIAN FEDERATION",
980                "fmt", "%Z %C  %n%A%n%O%n%N",
981                "require", "ACZ",
982                "upper", "AC",
983        }),
984        RW(new String[]{
985                "name", "RWANDA",
986                "upper", "AC",
987        }),
988        SA(new String[]{
989                "name", "SAUDI ARABIA",
990                "fmt", "%N%n%O%n%A%n%C %Z",
991        }),
992        SB(new String[]{
993                "name", "SOLOMON ISLANDS",
994        }),
995        SC(new String[]{
996                "name", "SEYCHELLES",
997                "fmt", "%N%n%O%n%A%n%C%n%S",
998                "upper", "S",
999                "state_name_type", "island",
1000        }),
1001        SE(new String[]{
1002                "name", "SWEDEN",
1003                "fmt", "%O%n%N%n%A%nSE-%Z %C",
1004                "require", "ACZ",
1005                "postprefix", "SE-",
1006        }),
1007        SG(new String[]{
1008                "name", "REP. OF SINGAPORE",
1009                "fmt", "%N%n%O%n%A%nSINGAPORE %Z",
1010                "require", "AZ",
1011        }),
1012        SH(new String[]{
1013                "name", "SAINT HELENA",
1014                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
1015                "require", "ACZ",
1016                "upper", "CZ",
1017        }),
1018        SI(new String[]{
1019                "name", "SLOVENIA",
1020                "fmt", "%N%n%O%n%A%nSI- %Z %C",
1021                "postprefix", "SI-",
1022        }),
1023        SJ(new String[]{
1024                "name", "SVALBARD AND JAN MAYEN ISLANDS",
1025                "fmt", "%N%n%O%n%A%n%Z %C",
1026                "require", "ACZ",
1027        }),
1028        SK(new String[]{
1029                "name", "SLOVAKIA",
1030                "fmt", "%N%n%O%n%A%n%Z %C",
1031        }),
1032        SL(new String[]{
1033                "name", "SIERRA LEONE",
1034        }),
1035        SM(new String[]{
1036                "name", "SAN MARINO",
1037                "fmt", "%N%n%O%n%A%n%Z %C",
1038                "require", "AZ",
1039        }),
1040        SN(new String[]{
1041                "name", "SENEGAL",
1042                "fmt", "%N%n%O%n%A%n%Z %C",
1043        }),
1044        SO(new String[]{
1045                "name", "SOMALIA",
1046                "lang", "so",
1047                "languages", "so",
1048                "fmt", "%N%n%O%n%A%n%C, %S %Z",
1049                "require", "ACS",
1050                "upper", "ACS",
1051        }),
1052        SR(new String[]{
1053                "name", "SURINAME",
1054                "lang", "nl",
1055                "languages", "nl",
1056                "fmt", "%N%n%O%n%A%n%C %X%n%S",
1057                "upper", "AS",
1058        }),
1059        ST(new String[]{
1060                "name", "SAO TOME AND PRINCIPE",
1061                "fmt", "%N%n%O%n%A%n%C %X",
1062        }),
1063        SV(new String[]{
1064                "name", "EL SALVADOR",
1065                "lang", "es",
1066                "languages", "es",
1067                "fmt", "%N%n%O%n%A%n%Z-%C%n%S",
1068                "require", "ACS",
1069                "upper", "CSZ",
1070        }),
1071        SZ(new String[]{
1072                "name", "SWAZILAND",
1073                "fmt", "%N%n%O%n%A%n%C%n%Z",
1074                "upper", "ACZ",
1075        }),
1076        TA(new String[]{
1077                "name", "TRISTAN DA CUNHA",
1078        }),
1079        TC(new String[]{
1080                "name", "TURKS AND CAICOS ISLANDS",
1081                "fmt", "%N%n%O%n%A%n%X%n%C%n%Z",
1082                "require", "ACZ",
1083                "upper", "CZ",
1084        }),
1085        TD(new String[]{
1086                "name", "CHAD",
1087        }),
1088        TF(new String[]{
1089                "name", "FRENCH SOUTHERN TERRITORIES",
1090        }),
1091        TG(new String[]{
1092                "name", "TOGO",
1093        }),
1094        TH(new String[]{
1095                "name", "THAILAND",
1096                "lang", "th",
1097                "languages", "th",
1098                "fmt", "%N%n%O%n%A%n%D %C%n%S %Z",
1099                "lfmt", "%N%n%O%n%A%n%D, %C%n%S %Z",
1100                "upper", "S",
1101        }),
1102        TJ(new String[]{
1103                "name", "TAJIKISTAN",
1104                "fmt", "%N%n%O%n%A%n%Z %C",
1105        }),
1106        TK(new String[]{
1107                "name", "TOKELAU",
1108        }),
1109        TL(new String[]{
1110                "name", "TIMOR-LESTE",
1111        }),
1112        TM(new String[]{
1113                "name", "TURKMENISTAN",
1114                "fmt", "%N%n%O%n%A%n%Z %C",
1115        }),
1116        TN(new String[]{
1117                "name", "TUNISIA",
1118                "fmt", "%N%n%O%n%A%n%Z %C",
1119        }),
1120        TO(new String[]{
1121                "name", "TONGA",
1122        }),
1123        TR(new String[]{
1124                "name", "TURKEY",
1125                "fmt", "%N%n%O%n%A%n%Z %C/%S",
1126                "require", "ACZ",
1127        }),
1128        TT(new String[]{
1129                "name", "TRINIDAD AND TOBAGO",
1130        }),
1131        TV(new String[]{
1132                "name", "TUVALU",
1133                "lang", "tyv",
1134                "languages", "tyv",
1135                "fmt", "%N%n%O%n%A%n%X%n%C%n%S",
1136                "upper", "ACS",
1137                "state_name_type", "island",
1138        }),
1139        TW(new String[]{
1140                "name", "TAIWAN",
1141                "lang", "zh-hant",
1142                "languages", "zh-hant",
1143                "fmt", "%Z%n%S%C%n%A%n%O%n%N",
1144                "lfmt", "%N%n%O%n%A%n%C, %S %Z",
1145                "require", "ACSZ",
1146                "state_name_type", "county",
1147        }),
1148        TZ(new String[]{
1149                "name", "TANZANIA (UNITED REP.)",
1150        }),
1151        UA(new String[]{
1152                "name", "UKRAINE",
1153                "fmt", "%Z %C%n%A%n%O%n%N",
1154        }),
1155        UG(new String[]{
1156                "name", "UGANDA",
1157        }),
1158        UM(new String[]{
1159                "name", "UNITED STATES MINOR OUTLYING ISLANDS",
1160                "fmt", "%N%n%O%n%A%n%C %S %Z",
1161                "require", "ACS",
1162                "upper", "ACNOS",
1163                "zip_name_type", "zip",
1164                "state_name_type", "state",
1165        }),
1166        US(new String[]{
1167                "name", "UNITED STATES",
1168                "lang", "en",
1169                "languages", "en",
1170                "fmt", "%N%n%O%n%A%n%C %S %Z",
1171                "require", "ACSZ",
1172                "upper", "CS",
1173                "zip_name_type", "zip",
1174                "state_name_type", "state",
1175        }),
1176        UY(new String[]{
1177                "name", "URUGUAY",
1178                "lang", "es",
1179                "languages", "es",
1180                "fmt", "%N%n%O%n%A%n%Z %C %S",
1181                "upper", "CS",
1182        }),
1183        UZ(new String[]{
1184                "name", "UZBEKISTAN",
1185                "fmt", "%N%n%O%n%A%n%Z %C%n%S",
1186                "upper", "CS",
1187        }),
1188        VA(new String[]{
1189                "name", "VATICAN",
1190                "fmt", "%N%n%O%n%A%n%Z %C",
1191        }),
1192        VC(new String[]{
1193                "name", "SAINT VINCENT AND THE GRENADINES (ANTILLES)",
1194        }),
1195        VE(new String[]{
1196                "name", "VENEZUELA",
1197                "lang", "es",
1198                "languages", "es",
1199                "fmt", "%N%n%O%n%A%n%C %Z, %S",
1200                "require", "ACS",
1201                "upper", "CS",
1202        }),
1203        VG(new String[]{
1204                "name", "VIRGIN ISLANDS (BRITISH)",
1205                "require", "A",
1206        }),
1207        VI(new String[]{
1208                "name", "VIRGIN ISLANDS (U.S.)",
1209                "fmt", "%N%n%O%n%A%n%C %S %Z",
1210                "require", "ACSZ",
1211                "upper", "ACNOS",
1212                "zip_name_type", "zip",
1213                "state_name_type", "state",
1214        }),
1215        VN(new String[]{
1216                "name", "VIET NAM",
1217                "lang", "vi",
1218                "languages", "vi",
1219                "fmt", "%N%n%O%n%A%n%C%n%S",
1220                "lfmt", "%N%n%O%n%A%n%C%n%S",
1221                "require", "AC",
1222        }),
1223        VU(new String[]{
1224                "name", "VANUATU",
1225        }),
1226        WF(new String[]{
1227                "name", "WALLIS AND FUTUNA ISLANDS",
1228                "fmt", "%O%n%N%n%A%n%Z %C %X",
1229                "require", "ACZ",
1230                "upper", "ACX",
1231        }),
1232        WS(new String[]{
1233                "name", "SAMOA",
1234        }),
1235        XK(new String[]{
1236                "name", "KOSOVO",
1237                "fmt", "%N%n%O%n%A%n%Z %C"
1238        }),
1239        YE(new String[]{
1240                "name", "YEMEN",
1241                "require", "AC",
1242        }),
1243        YT(new String[]{
1244                "name", "MAYOTTE",
1245                "fmt", "%O%n%N%n%A%n%Z %C %X",
1246                "require", "ACZ",
1247                "upper", "ACX",
1248        }),
1249        YU(new String[]{
1250                "name", "SERBIA AND MONTENEGRO",
1251                "fmt", "%N%n%O%n%A%n%Z %C",
1252        }),
1253        ZA(new String[]{
1254                "name", "SOUTH AFRICA",
1255                "fmt", "%N%n%O%n%A%n%C%n%Z",
1256                "require", "ACZ",
1257        }),
1258        ZM(new String[]{
1259                "name", "ZAMBIA",
1260                "fmt", "%N%n%O%n%A%n%Z %C",
1261                "require", "AC",
1262        }),
1263        ZW(new String[]{
1264                "name", "ZIMBABWE",
1265        }),
1266        ZZ(new String[]{
1267                "fmt", "%N%n%O%n%A%n%C",
1268                "require", "AC",
1269                "upper", "C",
1270                "zip_name_type", "postal",
1271                "state_name_type", "province",
1272        });
1273
1274        private String jsonString;
1275
1276        private RegionDataEnum(String[] inputArray) {
1277            jsonString = convertArrayToJsonString(inputArray);
1278        }
1279
1280        String getJsonString() {
1281            return jsonString;
1282        }
1283    }
1284
1285    static {
1286        for (RegionDataEnum region : RegionDataEnum.values()) {
1287            COUNTRY_FORMAT_MAP.put(region.toString(), region.getJsonString());
1288        }
1289    }
1290
1291    static Map<String, String> getCountryFormatMap() {
1292        return COUNTRY_FORMAT_MAP;
1293    }
1294
1295    /**
1296     * Assumes the array is a well-formed array - i.e., there are no unmatched keys in the input.
1297     * Package-private so it can be accessed by tests.
1298     */
1299    static String convertArrayToJsonString(String[] input) {
1300        JSONObject object = new JSONObject();
1301        for (int i = 0; i < input.length; i += 2) {
1302            try {
1303                object.put(input[i], input[i + 1]);
1304            } catch (JSONException e) {
1305                // Ignore for now.
1306            }
1307        }
1308        return object.toString();
1309    }
1310}
1311