# Copyright 2012 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.

#
# The key is an ISO4217 currency code, and the value is of the form:
#   display name|symbol|decimal digits|not-used-flag|rounding
# If a symbol is not supplied, the currency code will be used
# If # of decimal digits is omitted, 2 is used
# If a currency is not generally used, not-used-flag=1
# If a currency should be rounded to a multiple of of the least significant
#   digit, rounding will be present
# Trailing empty fields can be omitted

# DO NOT EDIT - GENERATED FROM CLDR DATA
AED = AED
AFN = AFN||0
ALL = ALL||0
AMD = AMD||0
ANG = ANG
AOA = AOA
ARA = ARA|||1
ARL = ARL|||1
ARM = ARM|||1
ARP = ARP|||1
ARS = ARS
AUD = AUD|A$
AWG = AWG
AZN = AZN
BAM = BAM
BBD = BBD
BDT = BDT
BGN = BGN
BHD = BHD||3
BIF = BIF||0
BMD = BMD
BND = BND
BOB = BOB
BOL = BOL|||1
BOP = BOP|||1
BOV = BOV|||1
BRB = BRB|||1
BRC = BRC|||1
BRE = BRE|||1
BRL = BRL|R$
BRN = BRN|||1
BRR = BRR|||1
BRZ = BRZ|||1
BSD = BSD
BTN = BTN
BWP = BWP
BYN = BYN
BYR = BYR||0|1
BZD = BZD
CAD = CAD|CA$
CDF = CDF
CHF = CHF
CLP = CLP||0
CNH = CNH|||1
CNY = CNY|CN¥
COP = COP||0
CRC = CRC
CUC = CUC
CUP = CUP
CVE = CVE
CZK = CZK
DEM = DEM|||1
DJF = DJF||0
DKK = DKK
DOP = DOP
DZD = DZD
EGP = EGP
ERN = ERN
ETB = ETB
EUR = يورو|€
FJD = FJD
FKP = FKP
GBP = GBP|£
GEL = GEL
GHS = GHS
GIP = GIP
GMD = GMD
GNF = GNF||0
GTQ = GTQ
GYD = GYD||0
HKD = HKD|HK$
HNL = HNL
HRK = HRK
HTG = HTG
HUF = HUF
IDR = IDR||0
IEP = IEP|||1
ILP = ILP|||1
ILS = ILS|₪
INR = روپئیہ [INR]|₹
IQD = IQD||0
IRR = IRR||0
ISK = ISK||0
JMD = JMD
JOD = JOD||3
JPY = JPY|JP¥|0
KES = KES
KGS = KGS
KHR = KHR
KMF = KMF||0
KPW = KPW||0
KRW = KRW|₩|0
KWD = KWD||3
KYD = KYD
KZT = KZT
LAK = LAK||0
LBP = LBP||0
LKR = LKR
LRD = LRD
LTL = LTL|||1
LVL = LVL|||1
LYD = LYD||3
MAD = MAD
MDL = MDL
MGA = MGA||0
MKD = MKD
MMK = MMK||0
MNT = MNT||0
MOP = MOP
MRO = MRO||0
MUR = MUR||0
MVR = MVR
MWK = MWK
MXN = MXN|MX$
MYR = MYR
MZN = MZN
NAD = NAD
NGN = NGN
NIO = NIO
NOK = NOK
NPR = NPR
NZD = NZD|NZ$
OMR = OMR||3
PAB = PAB
PEN = PEN
PGK = PGK
PHP = PHP
PKR = روپئیہ|ر|0
PLN = PLN
PYG = PYG||0
QAR = QAR
RON = RON
RSD = RSD||0
RUB = RUB
RWF = RWF||0
SAR = SAR
SBD = SBD
SCR = SCR
SDG = SDG
SEK = SEK
SGD = SGD
SHP = SHP
SLL = SLL||0
SOS = SOS||0
SRD = SRD
SSP = SSP
STD = STD||0|1
SUR = SUR|||1
SYP = SYP||0
SZL = SZL
THB = THB
TJS = TJS
TMT = TMT
TND = TND||3
TOP = TOP
TRY = TRY|TL
TTD = TTD
TWD = TWD|NT$
TZS = TZS||0
UAH = UAH
UGX = UGX||0
USD = USD|US$
UYP = UYP|||1
UYU = UYU
UZS = UZS||0
VEB = VEB|||1
VEF = VEF
VND = VND|₫|0
VNN = VNN|||1
VUV = VUV||0
WST = WST
XAF = XAF|FCFA|0
XAG = XAG|||1
XAU = XAU|||1
XBB = XBB|||1
XCD = XCD|EC$
XEU = XEU|||1
XOF = XOF|CFA|0
XPF = XPF|CFPF|0
XXX = XXX|||1
YER = YER||0
ZAR = ZAR
ZMW = ZMW
