# *   Copyright (C) 1998-2011, International Business Machines
# *   Corporation and others.  All Rights Reserved.
COLLATION_CLDR_VERSION = 2.0
# A list of txt's to build
# Note:
#
#   If you are thinking of modifying this file, READ THIS.
#
# Instead of changing this file [unless you want to check it back in],
# you should consider creating a 'collocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'collocal.mk' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  COLLATION_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files.

# Aliases without a corresponding xx.xml file (see icu-config.xml & build.xml)
COLLATION_SYNTHETIC_ALIAS = de_.txt de__PHONEBOOK.txt es_.txt es__TRADITIONAL.txt\
 hi_.txt hi__DIRECT.txt in.txt in_ID.txt iw.txt\
 iw_IL.txt mo.txt no.txt no_NO.txt pa_IN.txt\
 sh.txt sh_BA.txt sh_YU.txt sr_BA.txt sr_ME.txt\
 sr_RS.txt zh_.txt zh_CN.txt zh_HK.txt zh_MO.txt\
 zh_SG.txt zh_TW.txt zh_TW_STROKE.txt zh__PINYIN.txt


# All aliases (to not be included under 'installed'), but not including root.
COLLATION_ALIAS_SOURCE = $(COLLATION_SYNTHETIC_ALIAS)


# Empty locales, used for validSubLocale fallback.
COLLATION_EMPTY_SOURCE = af_NA.txt af_ZA.txt ar_AE.txt ar_BH.txt\
 ar_DZ.txt ar_EG.txt ar_IQ.txt ar_JO.txt ar_KW.txt\
 ar_LB.txt ar_LY.txt ar_MA.txt ar_OM.txt ar_QA.txt\
 ar_SA.txt ar_SD.txt ar_SY.txt ar_TN.txt ar_YE.txt\
 as_IN.txt az_Latn.txt az_Latn_AZ.txt be_BY.txt bg_BG.txt\
 bn_BD.txt bn_IN.txt bs_BA.txt ca_ES.txt chr.txt\
 chr_US.txt cs_CZ.txt cy_GB.txt da_DK.txt de_AT.txt\
 de_BE.txt de_CH.txt de_DE.txt de_LI.txt de_LU.txt\
 ee.txt ee_GH.txt ee_TG.txt el_CY.txt el_GR.txt\
 en_AS.txt en_AU.txt en_BB.txt en_BE.txt en_BM.txt\
 en_BW.txt en_BZ.txt en_CA.txt en_GB.txt en_GU.txt\
 en_HK.txt en_IE.txt en_IN.txt en_JM.txt en_MH.txt\
 en_MP.txt en_MT.txt en_MU.txt en_NA.txt en_NZ.txt\
 en_PH.txt en_PK.txt en_SG.txt en_TT.txt en_UM.txt\
 en_VI.txt en_ZA.txt en_ZW.txt es_419.txt es_AR.txt\
 es_BO.txt es_CL.txt es_CO.txt es_CR.txt es_DO.txt\
 es_EC.txt es_ES.txt es_GQ.txt es_GT.txt es_HN.txt\
 es_MX.txt es_NI.txt es_PA.txt es_PE.txt es_PR.txt\
 es_PY.txt es_SV.txt es_US.txt es_UY.txt es_VE.txt\
 et_EE.txt fa_IR.txt fi_FI.txt fil_PH.txt fo_FO.txt\
 fr_BE.txt fr_BF.txt fr_BI.txt fr_BJ.txt fr_BL.txt\
 fr_CD.txt fr_CF.txt fr_CG.txt fr_CH.txt fr_CI.txt\
 fr_CM.txt fr_DJ.txt fr_FR.txt fr_GA.txt fr_GN.txt\
 fr_GP.txt fr_GQ.txt fr_KM.txt fr_LU.txt fr_MC.txt\
 fr_MF.txt fr_MG.txt fr_ML.txt fr_MQ.txt fr_NE.txt\
 fr_RE.txt fr_RW.txt fr_SN.txt fr_TD.txt fr_TG.txt\
 ga.txt ga_IE.txt gu_IN.txt ha_Latn.txt ha_Latn_GH.txt\
 ha_Latn_NE.txt ha_Latn_NG.txt he_IL.txt hi_IN.txt hr_HR.txt\
 hu_HU.txt hy_AM.txt id.txt id_ID.txt ig_NG.txt\
 is_IS.txt it.txt it_CH.txt it_IT.txt ja_JP.txt\
 ka.txt ka_GE.txt kk_KZ.txt kl_GL.txt kn_IN.txt\
 ko_KR.txt kok_IN.txt ln_CD.txt ln_CG.txt lt_LT.txt\
 lv_LV.txt mk_MK.txt ml_IN.txt mr_IN.txt ms.txt\
 ms_BN.txt ms_MY.txt mt_MT.txt my_MM.txt nb_NO.txt\
 nl.txt nl_AW.txt nl_BE.txt nl_NL.txt nn_NO.txt\
 om_ET.txt om_KE.txt or_IN.txt pa_Arab.txt pa_Arab_PK.txt\
 pa_Guru.txt pa_Guru_IN.txt pl_PL.txt ps_AF.txt pt.txt\
 pt_AO.txt pt_BR.txt pt_GW.txt pt_MZ.txt pt_PT.txt\
 pt_ST.txt ro_MD.txt ro_RO.txt ru_MD.txt ru_RU.txt\
 ru_UA.txt si_LK.txt sk_SK.txt sl_SI.txt sq_AL.txt\
 sr_Cyrl.txt sr_Cyrl_BA.txt sr_Cyrl_ME.txt sr_Cyrl_RS.txt sr_Latn_BA.txt\
 sr_Latn_ME.txt sr_Latn_RS.txt sv_FI.txt sv_SE.txt sw.txt\
 sw_KE.txt sw_TZ.txt ta_IN.txt ta_LK.txt te_IN.txt\
 th_TH.txt tr_TR.txt uk_UA.txt ur_IN.txt ur_PK.txt\
 vi_VN.txt yo_NG.txt zh_Hans.txt zh_Hans_CN.txt zh_Hans_SG.txt\
 zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt zu.txt zu_ZA.txt


# Ordinary resources
COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) af.txt ar.txt as.txt az.txt\
 be.txt bg.txt bn.txt bs.txt ca.txt\
 cs.txt cy.txt da.txt de.txt el.txt\
 en.txt en_US.txt en_US_POSIX.txt eo.txt es.txt\
 et.txt fa.txt fa_AF.txt fi.txt fil.txt\
 fo.txt fr.txt fr_CA.txt gu.txt ha.txt\
 haw.txt he.txt hi.txt hr.txt hu.txt\
 hy.txt ig.txt is.txt ja.txt kk.txt\
 kl.txt km.txt kn.txt ko.txt kok.txt\
 ln.txt lt.txt lv.txt mk.txt ml.txt\
 mr.txt mt.txt my.txt nb.txt nn.txt\
 om.txt or.txt pa.txt pl.txt ps.txt\
 ro.txt ru.txt si.txt sk.txt sl.txt\
 sq.txt sr.txt sr_Latn.txt sv.txt ta.txt\
 te.txt th.txt to.txt tr.txt uk.txt\
 ur.txt vi.txt yo.txt zh.txt zh_Hant.txt

