WELL-FORMED
en-GB-oed
zh-cmn-Hans
no-bok
#zh-Hans-HK-SCOUSE-a-foobar-b-x-a-en@collation=phonebook;calendar=islamic
#i-default@abc=def
#x-foobar@abc=def
#zh-Hans-HK-SCOUSE-a-foobar-x-a-en@collation=phonebook;calendar=islamic
#zh@collation=phonebook
#zh@collation=phonebook;calendar=islamic
#zh-Hans-HK-SCOUSE-a-foobar-b-en-x-a-en@collation=phonebook;calendar=islamic

AaBbCcDd
AaBbCcDd-x-y-any-x
abcd-Latn
ab-x-abc-a-a   	 # ditto
ab-x-abc-a-a 	 # ditto
ab-x-abc-x-abc 	 # anything goes after x
ab-x-abc-x-abc 	 # anything goes after x
ax-TZ 	 # Not in the registry, but well-formed
az-Arab-x-AZE-derbend
de-a-value
de-CH-1996
de-Latg-1996
en
en-a-bbb-x-a-ccc
en-gb-oed
en-Latn
en-Latn-001
en-Latn-GB-boont-r-extended-sequence-x-private
en-Latn-US
en-Latn-US-lojban-gaulish
en-Latn-US-lojban-gaulish-a-12345678-ABCD-b-ABCDEFGH
en-Latn-US-lojban-gaulish-a-12345678-ABCD-b-ABCDEFGH-x-a-b-c-12345678
en-US
en-US
en-US-boont
en-x-US
es-419
es-Latn-CO-x-private
fr 
fra
fra-FX
fra-Latn 	 # ISO 639 can be 3-letters
fr-FR
fr-Latn
fr-Latn-419
fr-Latn-CA
fr-Latn-CA
fr-Latn-FR
fr-shadok 	 # Variant
fr-y-myext-myext2
i-default      	 # legacy (marked as “Type: grandfathered” in BCP 47)
i-default 	 # legacy
i-enochian 	 # legacy
i-klingon 	 # legacy
i-klingon 	 # legacy with singleton
mn-Cyrl-MN
mN-cYrL-Mn
no-bok 	 # legacy without singleton
sl-IT-nedis
sl-nedis
sr-Latn-CS
x-12345678-a
x-fr-CH

#all of the legacy codes (marked as “Type: grandfathered” in BCP 47); first the really goofy ones.
#Cased oddly for an extra test.
En-Gb-Oed
I-Ami
I-Bnn
I-Default
I-Enochian
I-Hak
I-Klingon
I-Lux
I-Mingo
I-Navajo
I-Pwn
I-Tao
I-Tay
I-Tsu
Sgn-Be-Fr
Sgn-Be-Nl
Sgn-Ch-De

#now the ones that are well-formed, but currently invalid
art-lojban
cel-gaulish
en-boont
en-scouse
no-bok
no-nyn
zh-cmn
zh-cmn-Hans
zh-cmn-Hant
zh-gan
zh-guoyu
zh-hakka
zh-min
zh-min-nan
zh-wuu
zh-xiang
zh-yue

# the following have multiple singletons -- well formed but invalid
ab-a-abc-a-abc
en-a-bbb-a-ccc   # 'a' appears twice 
ab-c-abc-r-toto-c-abc    # 'c' appears twice 

# Now some randomly generated correct names

zszLDm-sCVS-es-x-gn762vG-83-S-mlL
IIJdFI-cfZv
kbAxSgJ-685
tbutP
hDL-595
dUf-iUjq-0hJ4P-5YkF-WD8fk
FZAABA-FH
xZ-lh-4QfM5z9J-1eG4-x-K-R6VPr2z
Fyi
SeI-DbaG
ch-xwFn
OeC-GPVI
JLzvUSi
Fxh-hLAs
pKHzCP-sgaO-554
eytqeW-hfgH-uQ
ydn-zeOP-PR
uoWmBM-yHCf-JE
xwYem
zie
Re-wjSv-Ey-i-XE-E-JjWTEB8-f-DLSH-NVzLH-AtnFGWoH-SIDE
Ri-063-c-u6v-ZfhkToTB-C-IFfmv-XT-j-rdyYFMhK-h-pY-D5-Oh6FqBhL-hcXt-v-WdpNx71-K-c74m4-eBTT7-JdH7Q1Z
ji
IM-487
EPZ-zwcB
GauwEcwo
kDEP
FwDYt-TNvo
ottqP-KLES-x-9-i9
fcflR-grQQ
TvFwdu-kYhs
WE-336
MgxQa-ywEp-8lcW-7bvT-h-dP1Md-0h7-0Z3ir-K-Srkm-kA-7LXM-Z-whb2MiO-2mNsvbLm-W3O-4r-U-KceIxHdI-gvMVgUBV-2uRUni-J0-7C8yTK2
Hyr-B-evMtVoB1-mtsVZf-vQMV-gM-I-rr-kvLzg-f-lAUK-Qb36Ne-Z-7eFzOD-mv6kKf-l-miZ7U3-k-XDGtNQG
ybrlCpzy
PTow-w-cAQ51-8Xd6E-cumicgt-WpkZv3NY-q-ORYPRy-v-A4jL4A-iNEqQZZ-sjKn-W-N1F-pzyc-xP5eWz-LmsCiCcZ
ih-DlPR-PE
Krf-362
WzaD
EPaOnB-gHHn
XYta
NZ-RgOO-tR
at-FE
Tpc-693
YFp
gRQrQULo
pVomZ-585
laSu-ZcAq-338
gCW
PydSwHRI-TYfF
zKmWDD
X-bCrL5RL
HK
YMKGcLY
GDJ-nHYa-bw-X-ke-rohH5GfS-LdJKsGVe
tfOxdau-yjge-489-a-oB-I8Csb-1ESaK1v-VFNz-N-FT-ZQyn-On2-I-hu-vaW3-jIQb-vg0U-hUl-h-dO6KuJqB-U-tde2L-P3gHUY-vnl5c-RyO-H-gK1-zDPu-VF1oeh8W-kGzzvBbW-yuAJZ
LwDux
Zl-072
Ri-Ar
vocMSwo-cJnr-288
kUWq-gWfQ-794
YyzqKL-273
Xrw-ZHwH-841-9foT-ESSZF-6OqO-0knk-991U-9p3m-b-JhiV-0Kq7Y-h-cxphLb-cDlXUBOQ-X-4Ti-jty94yPp
en-GB-oed
LEuZl-so
HyvBvFi-cCAl-X-irMQA-Pzt-H
uDbsrAA-304
wTS
IWXS
XvDqNkSn-jRDR
gX-Ycbb-iLphEks-AQ1aJ5
FbSBz-VLcR-VL
JYoVQOP-Iytp
gDSoDGD-lq-v-7aFec-ag-k-Z4-0kgNxXC-7h
Bjvoayy-029
qSDJd
qpbQov
fYIll-516
GfgLyfWE-EHtB
Wc-ZMtk
cgh-VEYK
WRZs-AaFd-yQ
eSb-CpsZ-788
YVwFU
JSsHiQhr-MpjT-381
LuhtJIQi-JKYt
vVTvS-RHcP
SY
fSf-EgvQfI-ktWoG-8X5z-63PW
NOKcy
OjJb-550
KB
qzKBv-zDKk-589
Jr
Acw-GPXf-088
WAFSbos
HkgnmerM-x-e5-zf-VdDjcpz-1V6
UAfYflJU-uXDc-YV
x-CHsHx-VDcOUAur-FqagDTx-H-V0e74R
uZIAZ-Xmbh-pd

ILL-FORMED

-a
a-
a1-Hant-ZH
aabbccddE
a--b
ab-123-abc
ab-123-abc
ab-123-abcd
ab-123-abcd
ab-1abc-abc
ab-1abc-abc
ab-1abc-abcd
ab-1abc-abcd
ab--ab
ab--ab
ab-a-b
ab-a-b
ab-ab-abc
ab-ab-abc
ab-ab-abcd
ab-ab-abcd
-ab-abc
-ab-abc
ab-abc-
ab-abc-
ab-abc-abc-abc-abc
ab-abc-abc-abc-abc
ab-abcd-abc
ab-abcd-abc
ab-abcde-abc
ab-abcde-abc
ab-abcde-abcd
ab-abcde-abcd
ab-a-x
ab-a-x
abcd-efg
abcdefghi-012345678
abcdefghi-012345678
a-foo
a-Hant-ZH
a-value
a-x
b-fish
en-enx-eny-enz-enw
en-UK-oed
en-US-Latn
f
f-Latn
fr-Latn-F
overlongone
tlh-a-b-foo

i-notexist          	 # legacy but not registered: invalid, even if we only test well-formedness

en-enx                    # Extended tag
en-enx-eny-enz-latn-us    # Extended tag
fr-fra     # Extended tag
fr-Lat     # Extended

#mechanically generated ill-formed items

EdY-z_H791Xx6_m_kj
qWt85_8S0-L_rbBDq0gl_m_O_zsAx_nRS
VzyL2
T_VFJq-L-0JWuH_u2_VW-hK-kbE
u-t
Q-f_ZVJXyc-doj_k-i
JWB7gNa_K-5GB-25t_W-s-ZbGVwDu1-H3E
b-2T-Qob_L-C9v_2CZxK86
fQTpX_0_4Vg_L3L_g7VtALh2
S-Z-E_J
f6wsq-02_i-F
9_GcUPq_G
QjsIy_9-0-7_Dv2yPV09_D-JXWXM
D_se-f-k
ON47Wv1_2_W
f-z-R_s-ha
N3APeiw_195_Bx2-mM-pf-Z-Ip5lXWa-5r
IRjxU-E_6kS_D_b1b_H
NB-3-5-AyW_FQ-9hB-TrRJg3JV_3C
yF-3a_V_FoJQAHeL_Z-Mc-u
n_w_bbunOG_1-s-tJMT5je
Q-AEWE_X
57b1O_k_R6MU_sb
hK_65J_i-o_SI-Y
wB4B7u_5I2_I_NZPI
J24Nb_q_d-zE
v6-dHjJmvPS_IEb-x_A-O-i
8_8_dl-ZgBr84u-P-E
nIn-xD7EVhe_C
5_N-6P_x7Of_Lo_6_YX_R
0_46Oo0sZ-YNwiU8Wr_d-M-pg1OriV
laiY-5
K-8Mdd-j_ila0sSpo_aO8_J
wNATtSL-Cp4_gPa_fD41_9z
H_FGz5V8_n6rrcoz0_1O6d-kH-7-N
wDOrnHU-odqJ_vWl
gP_qO-I-jH
h
dJ0hX-o_csBykEhU-F
L-Vf7_BV_eRJ5goSF_Kp
y-oF-chnavU-H
9FkG-8Q-8_v
W_l_NDQqI-O_SFSAOVq
kDG3fzXw
t-nsSp-7-t-mUK2
Yw-F
1-S_3_l
u-v_brn-Y
4_ft_3ZPZC5lA_D
n_dR-QodsqJnh_e
Hwvt-bSwZwj_KL-hxg0m-3_hUG
mQHzvcV-UL-o2O_1KhUJQo_G2_uryk3-a
b-UTn33HF
r-Ep-jY-aFM_N_H
K-k-krEZ0gwD_k_ua-9dm3Oy-s_v
XS_oS-p
EIx_h-zf5
p_z-0_i-omQCo3B
1_q0N_jo_9
0Ai-6-S
L-LZEp_HtW
Zj-A4JD_2A5Aj7_b-m3
x
p-qPuXQpp_d-jeKifB-c-7_G-X
X94cvJ_A
F2D25R_qk_W-w_Okf_kx
rc-f
D
gD_WrDfxmF-wu-E-U4t
Z_BN9O4_D9-D_0E_KnCwZF-84b-19
T-8_g-u-0_E
lXTtys9j_X_A_m-vtNiNMw_X_b-C6Nr
V_Ps-4Y-S
X5wGEA
mIbHFf_ALu4_Jo1Z1
ET-TacYx_c
Z-Lm5cAP_ri88-d_q_fi8-x
rTi2ah-4j_j_4AlxTs6m_8-g9zqncIf-N5
FBaLB85_u-0NxhAy-ZU_9c
x_j_l-5_aV95_s_tY_jp4
PL768_D-m7jNWjfD-Nl_7qvb_bs_8_Vg
9-yOc-gbh
6DYxZ_SL-S_Ye
ZCa-U-muib-6-d-f_oEh_O
Qt-S-o8340F_f_aGax-c-jbV0gfK_p
WE_SzOI_OGuoBDk-gDp
cs-Y_9
m1_uj
Y-ob_PT
li-B
f-2-7-9m_f8den_J_T_d
p-Os0dua-H_o-u
L
rby-w