# Copyright 2008 Google Inc.
# 
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

# This file contains additional data about currencies which are not included in
# the CLDR data.  Currently, this file contains four fields separated by "|".
# Empty trailing fields can be omitted along with their separators.
#
# The first field is a "portable" currency symbol, which is intended to be
# recognized in most locales.
#
# The second field contains zero or more flags separated by spaces.
#
# At most one of the following:
#   SymPrefix     The currency symbol goes before the number, regardless of the
#                 normal position for this locale.
#   SymSuffix     The currency symbol goes after the number, regardless of the
#                 normal position for this locale.
#
# At most one of the following:
#   ForceSpace    Always add a space between the currency symbol and the number.
#   ForceNoSpace  Never add a space after the currency symbol and the number
#
# The third field overrides the CLDR-derived currency symbol if present.
#
# The fourth field is the simple currency symbol, if present.
#
# The following were set to 10 originally, which is POSITION_FLAG without
# POS_FIXED_FLAG.  As I understand the code, this would have no effect.
#  CZK DKK EUR ILS ISK NOK RUB SEK
AED = DH|||dh
AFN = |||Af.
ALL = |||Lek
AMD = |||Dram
AOA = |||Kz
ARS = AR$|||$
AUD = AU$|||$
AWG = |||Afl.
AZN = |||man.
BAM = |||KM
BBD = |||$
BDT = Tk|||\u09F3
BIF = |||FBu
BGN = |||lev
BHD = |||din
BMD = |||$
BND = |||$
BOB = |||Bs
BRL = R$|||R$
BSD = |||$
BTN = |||Nu.
BWP = |||P
BYR = |||BYR
BZD = |||$
CAD = C$|||$
CDF = |||FrCD
CHF = CHF|||CHF
CLP = CL$|||$
CNY = RMB¥|||¥
COP = COL$|||$
CRC = CR₡|||\u20A1
CUC = |||$
CUP = $MN|||$
CVE = |||CVE
CZK = Kč|||K\u010D
DJF = Fdj
DKK = kr|||kr
DOP = RD$|||$
DZD = |||din
EGP = LE|||E£
ERN = |||Nfk
ETB = |||Birr
EUR = €|||\u20AC
FJD = |||$
FKP = |||£
GBP = GB£|||£
GEL = |||GEL
GHS = |||GHS
GIP = |||£
GMD = |||GMD
GNF = |||FG
GTQ = |||Q
GYD = |||$
HKD = HK$|||$
HNL = ||L
HRK = |||kn
HTG = |||HTG
HUF = |||Ft
IDR = |||Rp
ILS = IL₪|||\u20AA
INR = Rs|||\u20B9
IQD = |||din
IRR = |||Rial
ISK = kr|||kr
JMD = JA$|||$
JOD = |||din
JPY = JP¥|||¥
KES = Ksh
KGS = |||KGS
KHR = |||Riel
KMF = |||CF
KPW = |||\u20A9
KRW = KR₩|||\u20A9
KWD = |||din
KYD = |||$
KZT = |||\u20B8
LAK = |||\u20AD
LBP = |||L£
LKR = SLRs|||Rs
LRD = |||$
LSL = |||LSL
LTL = |||Lt
LVL = |||Ls
LYD = |||din
MDL = |||MDL
MKD = |||dh
MGA = |||Ar
MKD = |||din
MMK = |||K
MNT = MN₮|||\u20AE
MOP = |||MOP
MRO = |||MRO
MUR = |||Rs
MWK = |||MWK
MXN = Mex$|||$
MYR = RM|||RM
MZN = |||MTn
NAD = |||$
NIO = |||C$
NGN = |||\u20A6
NOK = NOkr|||kr
NPR = |||Rs
NZD = |||$
OMR = |||Rial
PAB = B/.|||B/.
PEN = S/.|||S/.
PHP = PHP|||\u20B1
PKR = PKRs.|||Rs
PLN = |||z\u0142
PYG = |||Gs
QAR = |||Rial
RON = |||RON
RSD = |||din
RUB = руб.|||руб.
RWF = |||RF
SAR = SR|||Rial
SBD = |||$
SCR = |||SCR
SDG = |||SDG
SEK = kr|||kr
SGD = S$|||$
SHP = |||£
SLL = |||SLL
SOS = |||SOS
SRD = |||$
STD = |||Db
SYP = |||£
SZL = |||SZL
THB = THB|||\u0E3F
TJS = |||Som
TND = |||din
TOP = |||T$
TRY = YTL
TTD = |||$
TWD = NT$|||NT$
TZS = |||TSh
UAH = |||\u20B4
UGX = |||UGX
USD = US$|||$
UYU = UY$|||$
UZS = |||so\u02BCm
VEF = |||Bs
VND = ₫|SymSuffix||\u20AB
VUV = |||VUV
WST = |||WST
XAF = |||FCFA
XCD = |||$
XOF = |||CFA
XPF = |||FCFP
YER = YER|||Rial
ZAR = ZAR|||R
ZMK = |||ZWK
