# *   Copyright (C) 1998-2012, International Business Machines
# *   Corporation and others.  All Rights Reserved.
CURR_CLDR_VERSION = 22.1.1
# 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 'reslocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'reslocal.mk' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  CURR_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  CURR_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)
CURR_SYNTHETIC_ALIAS = az_AZ.txt az_Latn_AZ.txt bs_BA.txt bs_Latn_BA.txt\
 en_NH.txt en_RH.txt en_VU.txt en_ZW.txt fil_PH.txt\
 ha_GH.txt ha_Latn_GH.txt ha_Latn_NE.txt ha_Latn_NG.txt ha_NE.txt\
 ha_NG.txt he_IL.txt id_ID.txt in.txt in_ID.txt\
 iw.txt iw_IL.txt ja_JP.txt ja_JP_TRADITIONAL.txt kk_Cyrl_KZ.txt\
 kk_KZ.txt ks_Arab_IN.txt ks_IN.txt mo.txt nb_NO.txt\
 nn_NO.txt no.txt no_NO.txt no_NO_NY.txt pa_Arab_PK.txt\
 pa_Guru_IN.txt pa_IN.txt pa_PK.txt ro_MD.txt sh.txt\
 sh_BA.txt sh_CS.txt sh_YU.txt shi_Latn_MA.txt shi_MA.txt\
 sr_BA.txt sr_CS.txt sr_Cyrl_CS.txt sr_Cyrl_RS.txt sr_Cyrl_YU.txt\
 sr_Latn_BA.txt sr_Latn_CS.txt sr_Latn_ME.txt sr_Latn_RS.txt sr_Latn_YU.txt\
 sr_ME.txt sr_RS.txt sr_YU.txt th_TH.txt th_TH_TRADITIONAL.txt\
 tl.txt tl_PH.txt tzm_Latn_MA.txt tzm_MA.txt uz_AF.txt\
 uz_Arab_AF.txt uz_Cyrl_UZ.txt uz_UZ.txt vai_LR.txt vai_Vaii_LR.txt\
 zh_CN.txt zh_HK.txt zh_Hans_CN.txt zh_Hant_MO.txt zh_Hant_TW.txt\
 zh_MO.txt zh_SG.txt zh_TW.txt


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


# Ordinary resources
CURR_SOURCE = af.txt af_NA.txt agq.txt ak.txt\
 am.txt ar.txt as.txt asa.txt az.txt\
 az_Cyrl.txt az_Latn.txt bas.txt be.txt bem.txt\
 bez.txt bg.txt bm.txt bn.txt bn_IN.txt\
 bo.txt br.txt brx.txt bs.txt bs_Cyrl.txt\
 bs_Latn.txt ca.txt cgg.txt chr.txt cs.txt\
 cy.txt da.txt dav.txt de.txt de_LU.txt\
 dje.txt dua.txt dyo.txt dz.txt ebu.txt\
 ee.txt el.txt en.txt en_AU.txt en_BB.txt\
 en_BM.txt en_BW.txt en_BZ.txt en_CA.txt en_GB.txt\
 en_HK.txt en_JM.txt en_MT.txt en_NA.txt en_NZ.txt\
 en_PH.txt en_PK.txt en_SG.txt en_TT.txt en_ZA.txt\
 eo.txt es.txt es_AR.txt es_BO.txt es_CL.txt\
 es_CO.txt es_CR.txt es_DO.txt es_EC.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_US.txt es_UY.txt es_VE.txt\
 et.txt eu.txt ewo.txt fa.txt fa_AF.txt\
 ff.txt fi.txt fil.txt fo.txt fr.txt\
 fr_BI.txt fr_CA.txt fr_DJ.txt fr_GN.txt fr_KM.txt\
 fr_LU.txt ga.txt gl.txt gsw.txt gu.txt\
 guz.txt gv.txt ha.txt ha_Latn.txt haw.txt\
 he.txt hi.txt hr.txt hu.txt hy.txt\
 id.txt ig.txt ii.txt is.txt it.txt\
 ja.txt jgo.txt jmc.txt ka.txt kab.txt\
 kam.txt kde.txt kea.txt khq.txt ki.txt\
 kk.txt kk_Cyrl.txt kl.txt kln.txt km.txt\
 kn.txt ko.txt kok.txt ks.txt ks_Arab.txt\
 ksb.txt ksf.txt kw.txt lag.txt lg.txt\
 ln.txt lo.txt lt.txt lu.txt luo.txt\
 luy.txt lv.txt mas.txt mas_TZ.txt mer.txt\
 mfe.txt mg.txt mgh.txt mgo.txt mk.txt\
 ml.txt mr.txt ms.txt ms_BN.txt mt.txt\
 mua.txt my.txt naq.txt nb.txt nd.txt\
 ne.txt ne_IN.txt nl.txt nl_AW.txt nl_CW.txt\
 nl_SX.txt nmg.txt nn.txt nus.txt nyn.txt\
 om.txt om_KE.txt or.txt pa.txt pa_Arab.txt\
 pa_Guru.txt pl.txt ps.txt pt.txt pt_AO.txt\
 pt_MZ.txt pt_PT.txt pt_ST.txt rm.txt rn.txt\
 ro.txt rof.txt ru.txt rw.txt rwk.txt\
 saq.txt sbp.txt seh.txt ses.txt sg.txt\
 shi.txt shi_Latn.txt shi_Tfng.txt si.txt sk.txt\
 sl.txt sn.txt so.txt so_DJ.txt so_ET.txt\
 so_KE.txt sq.txt sr.txt sr_Cyrl.txt sr_Cyrl_BA.txt\
 sr_Latn.txt sv.txt sw.txt swc.txt ta.txt\
 ta_LK.txt ta_MY.txt ta_SG.txt te.txt teo.txt\
 teo_KE.txt th.txt ti.txt ti_ER.txt to.txt\
 tr.txt twq.txt tzm.txt tzm_Latn.txt uk.txt\
 ur.txt uz.txt uz_Arab.txt uz_Cyrl.txt uz_Latn.txt\
 vai.txt vai_Latn.txt vai_Vaii.txt vi.txt vun.txt\
 xog.txt yav.txt yo.txt zh.txt zh_Hans.txt\
 zh_Hans_HK.txt zh_Hans_MO.txt zh_Hans_SG.txt zh_Hant.txt zh_Hant_HK.txt\
 zu.txt

