6 Commits

Author SHA1 Message Date
soraefir
084953fd42 [m] Metadata 2024-04-04 00:24:17 +02:00
soraefir
65be3526a6 [m] Prepare Release 2024-04-04 00:14:33 +02:00
soraefir
ce2055ee97 [m] Fix clear 2024-04-03 08:42:28 +02:00
soraefir
822a46236d [m] isRegional handling & more 2024-04-03 08:31:17 +02:00
4e232e572e Delete out0.txt 2024-04-03 01:36:07 +02:00
fbced16fa4 Delete out.txt 2024-04-03 01:36:00 +02:00
39 changed files with 601 additions and 5574 deletions

BIN
.github/images/apk.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
.github/images/izzy.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

64
.github/workflow/build.yml vendored Normal file
View File

@@ -0,0 +1,64 @@
#file: noinspection SpellCheckingInspection
name: CI-Android APK
env:
main_project_module: app
playstore_name: Beans
on:
push:
branches: [ main ]
tags:
- '**'
pull_request:
branches: [ main ]
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: set up secrets
run: |
echo "${{ secrets.RELEASE_KEYSTORE }}" > keystore.asc
echo "${{ secrets.RELEASE_KEY}}" > key.asc
gpg -d --passphrase "${{ secrets.RELEASE_KEYSTORE_PASSWORD }}" --batch keystore.asc > app/keystore.properties
gpg -d --passphrase "${{ secrets.RELEASE_KEYSTORE_PASSWORD }}" --batch key.asc > app/key.jks
- uses: gradle/wrapper-validation-action@v2
- name: create and checkout branch
if: github.event_name == 'pull_request'
env:
BRANCH: ${{ github.head_ref }}
run: git checkout -B "$BRANCH"
- name: set up JDK
uses: actions/setup-java@v4
with:
java-version: 17
distribution: "temurin"
cache: 'gradle'
- name: Build APK
run: ./gradlew assemble
# - name: Upload APK
# uses: actions/upload-artifact@v4
# with:
# name: app.apk
# path: app/build/outputs/apk/release/app-release.apk
- name: Release
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
app/build/outputs/apk/release/app-release.apk

8
.gitignore vendored
View File

@@ -16,4 +16,12 @@ temp/
.externalNativeBuild
.cxx
.yarn
app/build/
app/debug/
app/release/
captures/
.externalNativeBuild
.cxx
local.properties
keystore.properties
key.jks

View File

@@ -0,0 +1,67 @@
<!--suppress ALL -->
<div align="center">
<h1>Beans</h1>
<img width="100px" src="./metadata/en-US/images/icon.png" alt="Logo">
<p>A virtual scratchmap of the world</p>
<img src="https://forthebadge.com/images/badges/built-for-android.svg" alt="Built for Android">
<img src="https://forthebadge.com/images/badges/built-with-love.svg" alt="Built with love">
<br>
<a href="https://github.com/choelzl/beans/actions/workflows/build.yml">
<img src="https://github.com/choelzl/beans/actions/workflows/build.yml/badge.svg?branch=main" alt="Build Status">
</a>
</div>
## 🌄 Screenshots
<div align="center">
<table>
<tr>
<td style="width: 33%; height: 100px;"><img src="./metadata/en-US/images/phoneScreenshots/launcher.jpg" alt="Launcher" style="width: 100%; height: 100%;"></td>
<td style="width: 33%; height: 100px;"><img src="./metadata/en-US/images/phoneScreenshots/view.jpg" alt="View" style="width: 100%; height: 100%;"></td>
<td style="width: 33%; height: 100px;"><img src="./metadata/en-US/images/phoneScreenshots/edit.jpg" alt="Edit" style="width: 100%; height: 100%;"></td>
</tr>
</table>
</div>
## ⭐ Features
- Color a map of places based on custom labels
- Country/State based coloring
- Single/Multi color modes
- Small & Fast
- Statistics (WIP)
## 📳 Installation
<div style="display: flex; justify-content: center; align-items: center; flex-direction: row;">
<a href="https://github.com/choelzl/beans/releases/latest">
<img width="200" height="84" alt="APK Download" src=".github/images/apk.png">
</a>
</div>
## ⚙️ Permissions
None
## 📝 Contribute
Beans is a user-driven project. We welcome any contribution, big or small.
- **🖥️ Development:** Fix bugs, implement features, or research issues. Open a PR for review.
- **🍥 Design:** Improve interfaces, including accessibility and usability.
- **📂 Issue Reporting:** Report bugs and edge cases with relevant info.
- **🌍 Localization:** Translate if it doesn't support your language.
## ✏️ Acknowledgements
Thanks to all contributors, the developers of our dependencies, and our users.
## 📝 License
```
Copyright (C) 2024 Helcel
Licensed under ???
```

View File

@@ -14,15 +14,25 @@ android {
minSdk 28
targetSdk 34
versionCode 1
versionName "1.0"
versionName "0.1a"
}
signingConfigs {
create("release") {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
signingConfig = signingConfigs.getByName("release")
}
}
compileOptions {
@@ -49,6 +59,9 @@ android {
}
}
aboutLibraries {
exclusionPatterns = [~"androidx.*", ~"com.google.android.*", ~"org.jetbrains.*"]
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.4'

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.5 MiB

View File

@@ -1291,7 +1291,7 @@ IRL_WD|IRL|Waterford|1857
IRL_WH|IRL|Westmeath|1835
IRL_WX|IRL|Wexford|2367
IRL_WW|IRL|Wicklow|2022
IRL_CK|IRL|NA|7488
IRL_CK|IRL|Cork|7488
IMN_AY|IMN|Ramsey|4
IMN_RU|IMN|Port Saint Mary|2
IMN_MC|IMN|Michael|34
@@ -1931,7 +1931,7 @@ MMR_SA|MMR|Sagaing|96034
MMR_SH|MMR|Shan|156514
MMR_TN|MMR|Tanintharyi|41535
MMR_YA|MMR|Yangon|9607
NAM_KA|NAM|!Karas|161821
NAM_KA|NAM|Karas|161821
NAM_ER|NAM|Erongo|63918
NAM_HA|NAM|Hardap|110185
NAM_OK|NAM|Kavango|48945
@@ -1968,7 +1968,7 @@ NLD_FL|NLD|Flevoland|1466
NLD_FR|NLD|Fryslân|3573
NLD_GE|NLD|Gelderland|5102
NLD_GR|NLD|Groningen|2370
NLD_NA|NLD|NA|3143
NLD_SH|NLD|Zuid-Holland|3143
NLD_LI|NLD|Limburg|2159
NLD_NB|NLD|Noord-Brabant|5082
NLD_NH|NLD|Noord-Holland|2872
@@ -3532,4 +3532,4 @@ Z05_UT|IND|Uttarakhand|259
Z09_UT|IND|Uttarakhand|987
Z06_JK|PAK|Azad Kashmir|13931
Z06_NA|PAK|Gilgit-Baltistan|68053
NA_NA|GBR|NA|417
GBR_EN|GBR|England|417

View File

@@ -4,36 +4,31 @@ import android.os.Bundle
import android.view.MenuItem
import androidx.activity.addCallback
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import net.helcel.beans.R
import net.helcel.beans.activity.adapter.ViewPagerAdapter
import net.helcel.beans.activity.fragment.EditPlaceFragment
import net.helcel.beans.countries.World
import net.helcel.beans.databinding.ActivityEditBinding
import net.helcel.beans.helper.Theme.createActionBar
class EditActivity : AppCompatActivity() {
private lateinit var viewPager: ViewPager2
private lateinit var tabLayout: TabLayout
private lateinit var _binding: ActivityEditBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = ActivityEditBinding.inflate(layoutInflater)
setContentView(R.layout.activity_edit)
setContentView(_binding.root)
createActionBar(this, getString(R.string.action_edit))
viewPager = findViewById(R.id.pager)
tabLayout = findViewById(R.id.tab)
val adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, viewPager)
viewPager.adapter = adapter
val adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, _binding.pager)
_binding.pager.adapter = adapter
adapter.addFragment(null, EditPlaceFragment(World.WWW, adapter))
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
TabLayoutMediator(_binding.tab, _binding.pager) { tab, position ->
tab.text = adapter.getLabel(position)
}.attach()

View File

@@ -1,19 +1,16 @@
package net.helcel.beans.activity
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.drawable.PictureDrawable
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MenuProvider
import com.caverock.androidsvg.RenderOptions
import com.github.chrisbanes.photoview.PhotoView
import net.helcel.beans.R
import net.helcel.beans.countries.GeoLocImporter
import net.helcel.beans.helper.Data.loadData
import net.helcel.beans.databinding.ActivityMainBinding
import net.helcel.beans.helper.Data
import net.helcel.beans.helper.Settings
import net.helcel.beans.helper.Theme.colorWrapper
import net.helcel.beans.svg.CSSWrapper
@@ -21,10 +18,7 @@ import net.helcel.beans.svg.SVGWrapper
class MainActivity : AppCompatActivity() {
private lateinit var sharedPreferences: SharedPreferences
private lateinit var photoView: PhotoView
private lateinit var _binding: ActivityMainBinding
private lateinit var psvg: SVGWrapper
private lateinit var css: CSSWrapper
@@ -34,55 +28,36 @@ class MainActivity : AppCompatActivity() {
super.onRestart()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val d = when (item.itemId) {
R.id.action_edit -> EditActivity::class.java
R.id.action_stats -> StatActivity::class.java
R.id.action_settings -> SettingsActivity::class.java
else -> throw Exception("Non Existent Menu Item")
}
startActivity(Intent(this@MainActivity, d))
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Create action bar
_binding = ActivityMainBinding.inflate(layoutInflater)
Settings.start(this)
supportActionBar?.setBackgroundDrawable(colorWrapper(this, android.R.attr.colorPrimary))
// Fetch shared preferences to restore app theme upon startup
Settings.start(this)
// Create menu in action bar
addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_main, menu)
}
setContentView(_binding.root)
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
R.id.action_edit -> {
startActivity(Intent(this@MainActivity, EditActivity::class.java))
true
}
_binding.photoView.minimumScale = 1f
_binding.photoView.maximumScale = 40f
R.id.action_stats -> {
startActivity(Intent(this@MainActivity, StatActivity::class.java))
true
}
R.id.action_settings -> {
startActivity(Intent(this@MainActivity, SettingsActivity::class.java))
true
}
else -> {
false
}
}
}
})
// Populate map from list of countries
setContentView(R.layout.activity_main)
photoView = findViewById(R.id.photo_view)
photoView.minimumScale = 1f
photoView.maximumScale = 40f
GeoLocImporter.importState(this)
loadData(this, Int.MIN_VALUE)
GeoLocImporter.importStates(this)
Data.loadData(this, Int.MIN_VALUE)
psvg = SVGWrapper(this)
css = CSSWrapper(this)
@@ -91,9 +66,8 @@ class MainActivity : AppCompatActivity() {
private fun refreshMap() {
val opt: RenderOptions = RenderOptions.create()
css.refresh()
opt.css(css.get())
photoView.setImageDrawable(PictureDrawable(psvg.get()?.renderToPicture(opt)))
_binding.photoView.setImageDrawable(PictureDrawable(psvg.get()?.renderToPicture(opt)))
}
}

View File

@@ -4,36 +4,30 @@ import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.Typeface
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.checkbox.MaterialCheckBox
import net.helcel.beans.R
import net.helcel.beans.activity.fragment.EditPlaceColorFragment
import net.helcel.beans.activity.fragment.EditPlaceFragment
import net.helcel.beans.countries.GeoLoc
import net.helcel.beans.helper.Data.groups
import net.helcel.beans.helper.Data.saveData
import net.helcel.beans.helper.Data.selected_geoloc
import net.helcel.beans.helper.Data.selected_group
import net.helcel.beans.helper.Data.visits
import net.helcel.beans.databinding.ItemListGeolocBinding
import net.helcel.beans.helper.Data
import net.helcel.beans.helper.Settings
import net.helcel.beans.helper.Theme.colorWrapper
class GeolocListAdapter(
private val ctx: EditPlaceFragment, val l: GeoLoc, private val pager: ViewPagerAdapter
private val ctx: EditPlaceFragment, private val l: GeoLoc, private val pager: ViewPagerAdapter
) : RecyclerView.Adapter<GeolocListAdapter.FoldingListViewHolder>() {
private lateinit var view: View
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): FoldingListViewHolder {
view = LayoutInflater
.from(viewGroup.context)
.inflate(R.layout.item_list_geoloc, viewGroup, false)
return FoldingListViewHolder(ctx.requireActivity(), view)
val binding = ItemListGeolocBinding.inflate(
LayoutInflater.from(viewGroup.context),
viewGroup,
false
)
return FoldingListViewHolder(ctx.requireActivity(), binding)
}
override fun onBindViewHolder(holder: FoldingListViewHolder, position: Int) {
@@ -50,72 +44,61 @@ class GeolocListAdapter(
return l.children.size
}
class FoldingListViewHolder(private val ctx: FragmentActivity, itemView: View) :
RecyclerView.ViewHolder(itemView) {
private val textView: TextView = itemView.findViewById(R.id.textView)
private val progressView: TextView = itemView.findViewById(R.id.name)
private val checkBox: MaterialCheckBox = itemView.findViewById(R.id.checkBox)
class FoldingListViewHolder(
private val ctx: FragmentActivity,
private val _binding: ItemListGeolocBinding
) : RecyclerView.ViewHolder(_binding.root) {
private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx)
private val statsPref = sharedPreferences.getString(
ctx.getString(R.string.key_stats),
ctx.getString(R.string.counters)
)
private fun bindGroup(el: GeoLoc) {
val numerator = el.children.map { Data.visits.getVisited(it) != 0 }.count { it }
val denominator = el.children.size
_binding.count.text = when (Settings.getStatPref(ctx)) {
ctx.getString(R.string.percentages) -> ctx.getString(
R.string.percentage,
(100 * (numerator.toFloat() / denominator.toFloat())).toInt()
)
else -> ctx.getString(R.string.rate, numerator, denominator)
}
_binding.textView.setTypeface(null, Typeface.BOLD)
_binding.textView.backgroundTintList = ColorStateList.valueOf(
colorWrapper(
ctx,
android.R.attr.panelColorBackground
).color
).withAlpha(64)
}
fun bind(el: GeoLoc) {
textView.text = el.fullName
if (el.children.isEmpty() || (el.type == GeoLoc.LocType.COUNTRY && !Settings.isRegional(
ctx
))
) {
textView.backgroundTintList =
ColorStateList.valueOf(colorWrapper(ctx, android.R.attr.colorBackground).color)
} else {
textView.setTypeface(null, Typeface.BOLD)
_binding.textView.text = el.fullName
_binding.textView.backgroundTintList =
ColorStateList.valueOf(colorWrapper(ctx, android.R.attr.colorBackground).color)
val numerator = el.children.map { visits.getVisited(it) != 0 }.count { it }
val denominator = el.children.size
if (el.shouldShowChildren(ctx))
bindGroup(el)
progressView.text = when (statsPref) {
ctx.getString(R.string.percentages) -> ctx.getString(
R.string.percentage,
(100 * (numerator.toFloat() / denominator.toFloat())).toInt()
)
else -> ctx.getString(R.string.rate, numerator, denominator)
}
textView.backgroundTintList = ColorStateList.valueOf(
colorWrapper(
ctx,
android.R.attr.panelColorBackground
).color
).withAlpha(128)
textView.parent.parent.requestChildFocus(textView, textView)
}
refreshCheck(el)
}
fun addListeners(el: GeoLoc, expandLambda: () -> Boolean) {
if (el.children.isNotEmpty() && (el.type != GeoLoc.LocType.COUNTRY || Settings.isRegional(
ctx
))
) {
textView.setOnClickListener { expandLambda() }
if (el.shouldShowChildren(ctx)) {
_binding.textView.setOnClickListener { expandLambda() }
}
checkBox.setOnClickListener {
selected_geoloc = el
if (groups.size() == 1 && Settings.isSingleGroup(ctx)) {
if (checkBox.isChecked) {
_binding.checkBox.setOnClickListener {
Data.selected_geoloc = el
if (Data.groups.size() == 1 && Settings.isSingleGroup(ctx)) {
if (_binding.checkBox.isChecked) {
// If one has just checked the box (assign unique group)
selected_group = groups.getUniqueEntry()
Data.selected_group = Data.groups.getUniqueEntry()
onColorDialogDismiss(false)
} else {
// If one has just unchecked the box (unassign unique group)
selected_group = null
Data.selected_group = null
onColorDialogDismiss(true)
}
} else {
selected_group = null
Data.selected_group = null
EditPlaceColorFragment(this).show(
ctx.supportFragmentManager,
"AddColorDialogFragment"
@@ -126,34 +109,33 @@ class GeolocListAdapter(
fun onColorDialogDismiss(clear: Boolean) {
if (clear) {
visits.setVisited(selected_geoloc!!, 0)
saveData()
Data.visits.setVisited(Data.selected_geoloc, 0)
Data.saveData()
}
if (selected_group != null && selected_geoloc != null) {
visits.setVisited(selected_geoloc!!, selected_group!!.key)
saveData()
if (Data.selected_group != null && Data.selected_geoloc != null) {
Data.visits.setVisited(Data.selected_geoloc, Data.selected_group?.key ?: 0)
Data.saveData()
}
selected_geoloc?.let { refreshCheck(it) }
selected_geoloc = null
selected_group = null
Data.selected_geoloc?.let { refreshCheck(it) }
Data.selected_geoloc = null
Data.selected_group = null
}
private fun refreshCheck(geoLoc: GeoLoc) {
var col = groups.getGroupFromKey(visits.getVisited(geoLoc)).color.color
if (col == Color.TRANSPARENT)
col = Color.GRAY
checkBox.checkedState =
if (visits.getVisited(geoLoc) != 0) MaterialCheckBox.STATE_CHECKED
else if (geoLoc.children.any { visits.getVisited(it) != 0 }) MaterialCheckBox.STATE_INDETERMINATE
var col = Data.groups.getGroupFromKey(Data.visits.getVisited(geoLoc)).color
if (col.color == Color.TRANSPARENT) {
col = colorWrapper(
ctx,
android.R.attr.panelColorBackground
)
col.alpha = 64
}
_binding.checkBox.checkedState =
if (Data.visits.getVisited(geoLoc) != 0) MaterialCheckBox.STATE_CHECKED
else if (geoLoc.children.any { Data.visits.getVisited(it) != 0 }) MaterialCheckBox.STATE_INDETERMINATE
else MaterialCheckBox.STATE_UNCHECKED
checkBox.buttonTintList = ColorStateList(
arrayOf(
intArrayOf(-android.R.attr.state_checked),
intArrayOf(android.R.attr.state_checked)
),
intArrayOf(col, col)
)
_binding.checkBox.buttonTintList = ColorStateList.valueOf(col.color)
}
}

View File

@@ -1,15 +1,12 @@
package net.helcel.beans.activity.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import net.helcel.beans.R
import net.helcel.beans.activity.fragment.EditGroupAddFragment
import net.helcel.beans.databinding.ItemListGroupBinding
import net.helcel.beans.helper.Data
import net.helcel.beans.helper.Groups
import net.helcel.beans.helper.Theme.getContrastColor
@@ -20,9 +17,9 @@ class GroupListAdapter(
) : RecyclerView.Adapter<GroupListAdapter.GroupViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GroupViewHolder {
val view: View =
LayoutInflater.from(parent.context).inflate(R.layout.item_list_group, parent, false)
return GroupViewHolder(view, activity, selectDialog)
val binding =
ItemListGroupBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return GroupViewHolder(binding, activity, selectDialog)
}
override fun onBindViewHolder(holder: GroupViewHolder, pos: Int) {
@@ -34,41 +31,39 @@ class GroupListAdapter(
}
inner class GroupViewHolder(
itemView: View,
private val _binding: ItemListGroupBinding,
private val activity: FragmentActivity,
private val selectDialog: DialogFragment
) : RecyclerView.ViewHolder(itemView) {
private val color: Button = itemView.findViewById(R.id.group_color)
private val entries: TextView = itemView.findViewById(R.id.name)
) : RecyclerView.ViewHolder(_binding.root) {
private lateinit var dialogFragment: EditGroupAddFragment
fun bind(entry: Pair<Int, Groups.Group>) {
color.text = entry.second.name
_binding.groupColor.text = entry.second.name
dialogFragment = EditGroupAddFragment(entry.first, {
val newEntry = Data.groups.getGroupFromKey(entry.first)
color.text = newEntry.name
_binding.groupColor.text = newEntry.name
val newEntryColor = newEntry.color.color
val contrastNewEntryColor =
getContrastColor(newEntryColor)
color.setBackgroundColor(newEntryColor)
color.setTextColor(contrastNewEntryColor)
entries.setTextColor(contrastNewEntryColor)
entries.text = "0"
_binding.groupColor.setBackgroundColor(newEntryColor)
_binding.groupColor.setTextColor(contrastNewEntryColor)
_binding.name.setTextColor(contrastNewEntryColor)
_binding.name.text = "0"
}, {
notifyItemRemoved(it)
})
val entryColor = entry.second.color.color
val contrastEntryColor = getContrastColor(entryColor)
color.setBackgroundColor(entryColor)
color.setTextColor(contrastEntryColor)
entries.setTextColor(contrastEntryColor)
entries.text = Data.visits.countVisited(entry.first).toString()
_binding.groupColor.setBackgroundColor(entryColor)
_binding.groupColor.setTextColor(contrastEntryColor)
_binding.name.setTextColor(contrastEntryColor)
_binding.name.text = Data.visits.countVisited(entry.first).toString()
color.setOnClickListener {
_binding.groupColor.setOnClickListener {
Data.selected_group = entry.second
selectDialog.dismiss()
}
color.setOnLongClickListener {
_binding.groupColor.setOnLongClickListener {
dialogFragment.show(
activity.supportFragmentManager,
"AddColorDialogFragment"

View File

@@ -7,8 +7,6 @@ import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.core.graphics.blue
import androidx.core.graphics.green
import androidx.core.graphics.red
@@ -17,6 +15,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.slider.Slider
import com.google.android.material.textfield.TextInputEditText
import net.helcel.beans.R
import net.helcel.beans.databinding.FragmentEditGroupsAddBinding
import net.helcel.beans.helper.Data
import net.helcel.beans.helper.Groups
import net.helcel.beans.helper.Theme.colorToHex6
@@ -26,51 +25,28 @@ class EditGroupAddFragment(
private val key: Int = 0,
val onAddCb: (Int) -> Unit,
val onDelCb: (Int) -> Unit
) :
DialogFragment() {
private lateinit var colorNameEditText: TextInputEditText
private lateinit var colorEditText: TextInputEditText
private lateinit var colorView: View
private lateinit var colorEditR: Slider
private lateinit var colorEditG: Slider
private lateinit var colorEditB: Slider
private lateinit var btnDelete: AppCompatButton
private lateinit var btnCancel: AppCompatButton
private lateinit var btnOk: AppCompatButton
) : DialogFragment() {
private lateinit var _binding: FragmentEditGroupsAddBinding
private val grp = Data.groups.getGroupFromKey(key)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(requireActivity())
val inflater = requireActivity().layoutInflater
val view: View = inflater.inflate(R.layout.fragment_edit_groups_add, null)
val builder = MaterialAlertDialogBuilder(requireContext())
_binding = FragmentEditGroupsAddBinding.inflate(layoutInflater)
colorNameEditText = view.findViewById(R.id.group_name)
colorEditText = view.findViewById(R.id.group_color)
colorView = view.findViewById(R.id.colorView)
colorEditR = view.findViewById(R.id.colorR)
colorEditG = view.findViewById(R.id.colorG)
colorEditB = view.findViewById(R.id.colorB)
setupSlider(_binding.colorR, grp.color.color.red / 255F)
setupSlider(_binding.colorG, grp.color.color.green / 255F)
setupSlider(_binding.colorB, grp.color.color.blue / 255F)
setupText(_binding.groupColor, grp)
setupSlider(colorEditR, grp.color.color.red / 255F)
setupSlider(colorEditG, grp.color.color.green / 255F)
setupSlider(colorEditB, grp.color.color.blue / 255F)
_binding.colorView.background = ColorDrawable(grp.color.color)
setupText(colorEditText, grp)
colorView.background = ColorDrawable(grp.color.color)
btnDelete = view.findViewById(R.id.btnDelete)
btnCancel = view.findViewById(R.id.btnCancel)
btnOk = view.findViewById(R.id.btnOk)
if (key == 0) {
btnDelete.visibility = View.INVISIBLE
btnDelete.isEnabled = false
_binding.btnDelete.visibility = View.INVISIBLE
_binding.btnDelete.isEnabled = false
}
btnDelete.setOnClickListener {
_binding.btnDelete.setOnClickListener {
MaterialAlertDialogBuilder(requireActivity())
.setMessage(R.string.delete_group)
.setPositiveButton(android.R.string.ok) { _, _ ->
@@ -87,9 +63,9 @@ class EditGroupAddFragment(
.show()
}
btnOk.setOnClickListener {
val name = colorNameEditText.text.toString()
val color = colorEditText.text.toString()
_binding.btnOk.setOnClickListener {
val name = _binding.groupName.text.toString()
val color = _binding.groupColor.text.toString()
val key = (if (key != 0) key else Data.groups.genKey())
Data.groups.setGroup(key, name, ColorDrawable(Color.parseColor("#$color")))
Data.saveData()
@@ -97,12 +73,12 @@ class EditGroupAddFragment(
dialog?.dismiss()
}
btnCancel.setOnClickListener {
_binding.btnCancel.setOnClickListener {
dialog?.cancel()
}
colorNameEditText.setText(grp.name)
builder.setView(view)
_binding.groupName.setText(grp.name)
builder.setView(_binding.root)
return builder.create()
}
@@ -110,11 +86,11 @@ class EditGroupAddFragment(
s.setText(colorToHex6(ColorDrawable(grp?.color?.color ?: 0)).substring(1))
s.addTextChangedListener(
EditTextListener(
colorEditR,
colorEditG,
colorEditB,
colorEditText,
colorView
_binding.colorR,
_binding.colorG,
_binding.colorB,
_binding.groupColor,
_binding.colorView
)
)
}
@@ -125,11 +101,11 @@ class EditGroupAddFragment(
s.value = v
s.addOnChangeListener(
SliderOnChangeListener(
colorEditR,
colorEditG,
colorEditB,
colorEditText,
colorView
_binding.colorR,
_binding.colorG,
_binding.colorB,
_binding.groupColor,
_binding.colorView
)
)
}

View File

@@ -3,48 +3,41 @@ package net.helcel.beans.activity.fragment
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatButton
import androidx.fragment.app.DialogFragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import net.helcel.beans.R
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import net.helcel.beans.activity.adapter.GeolocListAdapter
import net.helcel.beans.activity.adapter.GroupListAdapter
import net.helcel.beans.databinding.FragmentEditPlacesColorsBinding
import net.helcel.beans.helper.Data
class EditPlaceColorFragment(private val parent: GeolocListAdapter.FoldingListViewHolder) :
DialogFragment() {
private lateinit var _binding: FragmentEditPlacesColorsBinding
private lateinit var listAdapt: GroupListAdapter
private lateinit var list: RecyclerView
private var clear: Boolean = false
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(
requireActivity()
)
val inflater = requireActivity().layoutInflater
val view: View = inflater.inflate(R.layout.fragment_edit_places_colors, null)
val btnAdd: AppCompatButton = view.findViewById(R.id.btnAdd)
val btnClear: AppCompatButton = view.findViewById(R.id.btnClear)
btnAdd.setOnClickListener {
val builder = MaterialAlertDialogBuilder(requireContext())
_binding = FragmentEditPlacesColorsBinding.inflate(layoutInflater)
_binding.btnAdd.setOnClickListener {
EditGroupAddFragment(0, {
listAdapt.notifyItemInserted(Data.groups.findGroupPos(it))
}, {}).show(requireActivity().supportFragmentManager, "AddColorDialogFragment")
}
btnClear.setOnClickListener {
_binding.btnClear.setOnClickListener {
clear = true
dialog?.dismiss()
}
val dialog = builder.setView(view).create()
val dialog = builder.setView(_binding.root).create()
listAdapt = GroupListAdapter(requireActivity(), this)
list = view.findViewById(R.id.groups_color)!!
list.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
list.adapter = listAdapt
_binding.groupsColor.layoutManager =
LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
_binding.groupsColor.adapter = listAdapt
return dialog
}

View File

@@ -6,23 +6,30 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import net.helcel.beans.R
import net.helcel.beans.countries.GeoLocImporter
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.fragment_settings, rootKey)
val ctx = requireContext()
findPreference<Preference>(getString(R.string.key_regional))?.setOnPreferenceChangeListener { _, key ->
when (key as String) {
ctx.getString(R.string.off) -> GeoLocImporter.clearStates()
ctx.getString(R.string.on) -> GeoLocImporter.importStates(ctx)
else -> GeoLocImporter.clearStates()
}
true
}
// Select Light/Dark/System Mode
val themePreference = findPreference<Preference>(getString(R.string.key_theme))
themePreference?.setOnPreferenceChangeListener { _, key ->
setTheme(requireContext(), key as String)
findPreference<Preference>(getString(R.string.key_theme))?.setOnPreferenceChangeListener { _, key ->
setTheme(ctx, key as String)
}
// Open license fragment
val licensesPreference = findPreference<Preference>(getString(R.string.licenses))
licensesPreference?.setOnPreferenceClickListener {
findPreference<Preference>(getString(R.string.licenses))?.setOnPreferenceClickListener {
requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.fragment_view, LicenseFragment(), getString(R.string.licenses))
.commit()
@@ -30,12 +37,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
// Open about fragment
val aboutPreference = findPreference<Preference>(getString(R.string.about))
aboutPreference?.setOnPreferenceClickListener {
findPreference<Preference>(getString(R.string.about))?.setOnPreferenceClickListener {
requireActivity().supportFragmentManager.beginTransaction()
.replace(R.id.fragment_view, AboutFragment(), getString(R.string.about))
.commit()
true
}

View File

@@ -1,5 +1,8 @@
package net.helcel.beans.countries
import android.content.Context
import net.helcel.beans.helper.Settings
interface GeoLoc {
@@ -14,6 +17,14 @@ interface GeoLoc {
val type: LocType
val children: List<GeoLoc>
fun shouldShowChildren(ctx: Context): Boolean {
if (children.isEmpty())
return false
if (type == LocType.COUNTRY && !Settings.isRegional(ctx))
return false
return true
}
}

View File

@@ -7,7 +7,7 @@ import java.io.InputStreamReader
object GeoLocImporter {
fun importState(ctx: Context) {
fun importStates(ctx: Context) {
if (!Settings.isRegional(ctx)) {
return
}
@@ -18,4 +18,8 @@ object GeoLocImporter {
Country.entries.find { it.code == line[1] }?.children?.add(state)
}
}
fun clearStates() {
Country.entries.forEach { it.children.clear() }
}
}

View File

@@ -12,11 +12,12 @@ import kotlin.random.Random
private const val randSeed = 0
private val rnd = Random(randSeed)
@Serializable
class Groups(val id: Int, private val grps: HashMap<Int,Group>) {
class Groups(val id: Int, private val grps: HashMap<Int, Group>) {
fun setGroup(key: Int, name: String, col: ColorDrawable) {
grps[key] = Group(key,name,col)
grps[key] = Group(key, name, col)
}
fun deleteGroup(key: Int) {
@@ -24,12 +25,12 @@ class Groups(val id: Int, private val grps: HashMap<Int,Group>) {
}
fun getGroupFromKey(key: Int): Group {
return grps.getOrDefault(key,EmptyGroup())
return grps.getOrDefault(key, EmptyGroup())
}
fun genKey(): Int {
val key = rnd.nextInt()
if(grps.containsKey(key) || key == 0) return genKey()
if (grps.containsKey(key) || key == 0) return genKey()
return key
}
@@ -46,32 +47,38 @@ class Groups(val id: Int, private val grps: HashMap<Int,Group>) {
}
}
fun getGroupFromPos(pos: Int): Pair<Int,Group> {
fun getGroupFromPos(pos: Int): Pair<Int, Group> {
val key = grps.keys.toList()[pos]
return Pair(key,getGroupFromKey(key))
return Pair(key, getGroupFromKey(key))
}
fun findGroupPos(key: Int): Int {
return grps.keys.toList().indexOf(key)
}
class EmptyGroup: Group(0,"")
class EmptyGroup : Group(0, "")
@Serializable
open class Group(val key: Int, val name: String, @Serializable(with = ColorDrawableSerializer::class) val color: ColorDrawable = ColorDrawable(Color.TRANSPARENT))
open class Group(
val key: Int,
val name: String,
@Serializable(with = Theme.ColorDrawableSerializer::class) val color: ColorDrawable = ColorDrawable(
Color.TRANSPARENT
)
)
@OptIn(ExperimentalSerializationApi::class)
@Serializer(Groups::class)
class GroupsSerializer{
class GroupsSerializer {
val defaultValue: Groups
get() = Groups(Int.MIN_VALUE,hashMapOf())
get() = Groups(Int.MIN_VALUE, hashMapOf())
fun readFrom(input: InputStream): Groups {
return Json.decodeFromString(serializer(),input.readBytes().decodeToString())
return Json.decodeFromString(serializer(), input.readBytes().decodeToString())
}
fun writeTo(t: Groups): String {
return Json.encodeToString(serializer(),t).encodeToByteArray().decodeToString()
return Json.encodeToString(serializer(), t).encodeToByteArray().decodeToString()
}
}

View File

@@ -30,6 +30,13 @@ object Settings {
)
}
fun getStatPref(ctx: Context): String? {
return sp.getString(
ctx.getString(R.string.key_stats),
ctx.getString(R.string.counters)
)
}
private fun getBooleanValue(ctx: Context, key: String?): Boolean {
return when (key) {
ctx.getString(R.string.on) -> true

View File

@@ -6,6 +6,11 @@ import android.graphics.drawable.ColorDrawable
import android.util.TypedValue
import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.ColorUtils
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
object Theme {
fun colorWrapper(ctx: Context, res: Int): ColorDrawable {
@@ -34,4 +39,17 @@ object Theme {
val blackContrast = ColorUtils.calculateContrast(Color.BLACK, color)
return if (whiteContrast > blackContrast) Color.WHITE else Color.BLACK
}
}
object ColorDrawableSerializer : KSerializer<ColorDrawable> {
override val descriptor = PrimitiveSerialDescriptor("ColorDrawable", PrimitiveKind.INT)
override fun deserialize(decoder: Decoder): ColorDrawable {
return ColorDrawable(decoder.decodeInt())
}
override fun serialize(encoder: Encoder, value: ColorDrawable) {
encoder.encodeInt(value.color)
}
}
}

View File

@@ -1,20 +0,0 @@
package net.helcel.beans.helper
import android.graphics.drawable.ColorDrawable
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
object ColorDrawableSerializer : KSerializer<ColorDrawable> {
override val descriptor = PrimitiveSerialDescriptor("ColorDrawable", PrimitiveKind.INT)
override fun deserialize(decoder: Decoder): ColorDrawable {
return ColorDrawable(decoder.decodeInt())
}
override fun serialize(encoder: Encoder, value: ColorDrawable) {
encoder.encodeInt(value.color)
}
}

View File

@@ -9,9 +9,11 @@ import java.io.InputStream
@Serializable
class Visits(val id: Int, private val locs: HashMap<String,Int>) {
class Visits(val id: Int, private val locs: HashMap<String, Int>) {
fun setVisited(key: GeoLoc, b: Int) {
fun setVisited(key: GeoLoc?, b: Int) {
if (key == null)
return
locs[key.code] = b
}
@@ -25,10 +27,11 @@ class Visits(val id: Int, private val locs: HashMap<String,Int>) {
}
fun getVisited(key: GeoLoc): Int {
return locs.getOrDefault(key.code,0)
return locs.getOrDefault(key.code, 0)
}
private fun getVisited(key: String): Int {
return locs.getOrDefault(key,0)
return locs.getOrDefault(key, 0)
}
fun countVisited(key: Int): Int {
@@ -43,14 +46,14 @@ class Visits(val id: Int, private val locs: HashMap<String,Int>) {
@Serializer(Visits::class)
class VisitsSerializer {
val defaultValue: Visits
get() = Visits(Int.MIN_VALUE,hashMapOf())
get() = Visits(Int.MIN_VALUE, hashMapOf())
fun readFrom(input: InputStream): Visits {
return Json.decodeFromString(serializer(),input.readBytes().decodeToString())
return Json.decodeFromString(serializer(), input.readBytes().decodeToString())
}
fun writeTo(t: Visits): String {
return Json.encodeToString(serializer(),t).encodeToByteArray().decodeToString()
fun writeTo(t: Visits): String {
return Json.encodeToString(serializer(), t).encodeToByteArray().decodeToString()
}
}

View File

@@ -18,13 +18,12 @@ class CSSWrapper(ctx: Context) {
private var customCSS: String = ""
init {
val www = World.WWW.children.joinToString(",") { "#${it.code}2" }
val ccc =
World.WWW.children.joinToString(",") { itt -> itt.children.joinToString(",") { "#${it.code}2" } }
baseCSS =
"svg{fill:$colorForeground;stroke:$colorBackground;stroke-width:0.01;}" +
"$www,$ccc{stroke-width:0.1;fill:none}"
val ccc = World.WWW.children.joinToString(",") { itt ->
itt.children.joinToString(",") { "#${it.code}2" }
}
baseCSS = "svg{fill:$colorForeground;stroke:$colorBackground;stroke-width:0.01;}" +
"$www,$ccc{stroke:$colorBackground;stroke-width:0.1;fill:none}"
refresh()
}

View File

@@ -0,0 +1,41 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="72dp"
android:height="72dp"
android:viewportWidth="72"
android:viewportHeight="72">
<path
android:pathData="M31,16l0,-4l10,0l0,4"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M51,25v31c0,2.209 -1.791,4 -4,4H25c-2.209,0 -4,-1.791 -4,-4V25"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M17,16h38v4h-38z"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M41,28.25L41,55"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
<path
android:pathData="M31,28.25L31,55"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:strokeLineCap="round"/>
</vector>

View File

@@ -1,13 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:theme="@style/Theme.Beans"
android:layout_width="match_parent"
android:layout_height="match_parent">
tools:context=".activity.EditActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"

View File

@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:theme="@style/Theme.Beans"
android:layout_width="match_parent"
android:layout_height="match_parent">
tools:context=".activity.MainActivity">
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/photo_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -1,13 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:theme="@style/Theme.Beans"
android:layout_width="match_parent"
android:layout_height="match_parent">
tools:context=".activity.StatActivity">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -9,9 +9,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >
android:orientation="vertical">
<ImageView
<com.google.android.material.imageview.ShapeableImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_marginTop="40dp"
@@ -19,46 +19,46 @@
android:contentDescription="@string/logo"
android:src="@mipmap/ic_launcher_round" />
<TextView
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="@string/app_name"
android:textStyle="bold"
android:textAlignment="center"
android:textSize="30sp"
android:textAlignment="center" />
android:textStyle="bold" />
<TextView
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="0dp"
android:layout_marginBottom="15dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="15dp"
android:text="@string/app_version"
android:textSize="25sp"
android:textAlignment="center" />
android:textAlignment="center"
android:textSize="25sp" />
<TextView
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:layout_marginStart="10dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="15dp"
android:text="@string/beans_is_foss"
android:textAlignment="center" />
<TextView
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"
android:layout_marginStart="10dp"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="15dp"
android:autoLink="web"
android:text="@string/beans_repo"
android:textAlignment="center" />

View File

@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
android:padding="16dp"
tools:context=".activity.fragment.EditGroupAddFragment">
<com.google.android.material.textfield.TextInputEditText
@@ -92,29 +94,39 @@
android:layout_height="match_parent"
android:layout_marginTop="10dp">
<androidx.appcompat.widget.AppCompatButton
<com.google.android.material.button.MaterialButton
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_width="52dp"
android:layout_height="wrap_content"
android:text="@string/delete"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:tooltipText="@string/delete"
app:icon="@drawable/delete"
app:iconGravity="textStart"
app:iconPadding="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
<com.google.android.material.button.MaterialButton
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_marginEnd="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/cancel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnOk"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
<com.google.android.material.button.MaterialButton
android:id="@+id/btnOk"
android:layout_width="wrap_content"
android:layout_width="52dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
tools:context=".activity.fragment.EditPlaceFragment">
<androidx.core.widget.NestedScrollView

View File

@@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
android:padding="4dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/groups_color"
@@ -24,20 +24,24 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<androidx.appcompat.widget.AppCompatButton
<com.google.android.material.button.MaterialButton
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_width="64dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/add"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatButton
<com.google.android.material.button.MaterialButton
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_width="64dp"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:text="@string/clear"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"

View File

@@ -7,8 +7,7 @@
<androidx.fragment.app.FragmentContainerView
android:id="@+id/license_fragment_view"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,57 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="50dp"
android:clickable="true"
android:focusable="true"
android:gravity="start|center_vertical"
android:insetTop="4dp"
android:insetBottom="4dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textAllCaps="false"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?attr/colorOnBackground"
<com.google.android.material.button.MaterialButton
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="50dp"
android:clickable="true"
android:focusable="true"
android:gravity="start|center_vertical"
android:insetTop="4dp"
android:insetBottom="4dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textAllCaps="false"
android:textAppearance="?attr/textAppearanceBody2"
android:textColor="?attr/colorOnBackground"
app:cornerRadius="0dp"
app:layout_constraintBottom_toBottomOf="@id/checkBox"
app:layout_constraintEnd_toStartOf="@id/checkBox"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:cornerRadius="4dp"
app:layout_constraintBottom_toBottomOf="@id/checkBox"
app:layout_constraintEnd_toStartOf="@id/checkBox"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="start|center_vertical"
android:paddingStart="20dp"
android:paddingEnd="20dp"
app:layout_constraintBottom_toBottomOf="@id/checkBox"
app:layout_constraintEnd_toStartOf="@id/checkBox"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/count"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="start|center_vertical"
android:paddingStart="20dp"
android:paddingEnd="20dp"
app:layout_constraintBottom_toBottomOf="@id/checkBox"
app:layout_constraintEnd_toStartOf="@id/checkBox"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkBox"
android:layout_width="50dp"
android:layout_height="50dp"
app:checkedState="indeterminate"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@id/textView"
app:layout_constraintTop_toTopOf="@id/textView"
app:layout_constraintVertical_bias="0.5" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkBox"
android:layout_width="50dp"
android:layout_height="50dp"
app:checkedState="indeterminate"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@id/textView"
app:layout_constraintTop_toTopOf="@id/textView"
app:layout_constraintVertical_bias="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,41 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton
android:id="@+id/group_color"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="2dp"
android:textAlignment="textStart"
android:textColor="?attr/colorOnPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/group_color"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="2dp"
android:textAlignment="textStart"
android:textColor="?attr/colorOnPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="start|center_vertical"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textColor="?attr/colorOnPrimary"
app:layout_constraintBottom_toBottomOf="@id/group_color"
app:layout_constraintEnd_toEndOf="@id/group_color"
app:layout_constraintTop_toTopOf="@id/group_color" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="start|center_vertical"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textColor="?attr/colorOnPrimary"
app:layout_constraintTop_toTopOf="@id/group_color"
app:layout_constraintBottom_toBottomOf="@id/group_color"
app:layout_constraintEnd_toEndOf="@id/group_color" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -32,6 +32,16 @@
app:key="@string/key_stats"
app:title="@string/key_stats"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="@string/system"
app:enabled="true"
app:entries="@array/entries_theme"
app:entryValues="@array/entries_theme"
app:icon="@drawable/palette"
app:key="@string/key_theme"
app:title="@string/key_theme"
app:useSimpleSummaryProvider="true" />
<Preference
android:summary="@string/foss_licenses"

View File

@@ -0,0 +1 @@
<p><i>Beans</i> is a scratchmap of the world for android. You can color in a single or many custom colors. You can color on a country or state basis.</p>

View File

@@ -0,0 +1 @@
A virtual scratchmap of the world

View File

251
out0.txt
View File

@@ -1,251 +0,0 @@
AFG("Afghanistan",645487,listOf(AFG_BD,AFG_BG,AFG_BL,AFG_BK,AFG_BM,AFG_DK,AFG_FH,AFG_FB,AFG_GZ,AFG_GR,AFG_HM,AFG_HR,AFG_JW,AFG_KB,AFG_KD,AFG_KP,AFG_KT,AFG_KR,AFG_KZ,AFG_LA,AFG_LW,AFG_NG,AFG_NM,AFG_NR,AFG_PK,AFG_PT,AFG_PJ,AFG_PV,AFG_SM,AFG_SP,AFG_TK,AFG_OZ,AFG_VR,AFG_ZB)),
XAD("Akrotiriand Dhekelia",234,listOf(XAD_NA,XAD_NA)),
ALA("Åland",1483,listOf(ALA_AR,ALA_CO,ALA_MH)),
ALB("Albania",28755,listOf(ALB_BE,ALB_DB,ALB_DU,ALB_EB,ALB_FI,ALB_GK,ALB_KE,ALB_KK,ALB_LZ,ALB_SD,ALB_TI,ALB_VR)),
DZA("Algeria",2316624,listOf(DZA_AR,DZA_AD,DZA_AT,DZA_AL,DZA_AN,DZA_BT,DZA_BC,DZA_BJ,DZA_BS,DZA_BL,DZA_BB,DZA_BU,DZA_BM,DZA_CH,DZA_CO,DZA_DJ,DZA_EB,DZA_EO,DZA_ET,DZA_GR,DZA_GL,DZA_IL,DZA_JJ,DZA_KH,DZA_LG,DZA_MS,DZA_MC,DZA_MD,DZA_ML,DZA_MG,DZA_NA,DZA_OR,DZA_OG,DZA_OB,DZA_RE,DZA_SD,DZA_SF,DZA_SB,DZA_SK,DZA_SA,DZA_TM,DZA_TB,DZA_TR,DZA_TN,DZA_TP,DZA_TS,DZA_TO,DZA_TL)),
ASM("American Samoa",205,listOf(ASM_ET,ASM_MA,ASM_UU,ASM_WT)),
AND("Andorra",451,listOf(AND_AN,AND_CA,AND_EN,AND_EE,AND_MA,AND_OR,AND_JL)),
AGO("Angola",1254492,listOf(AGO_BO,AGO_BG,AGO_BI,AGO_CB,AGO_CC,AGO_CN,AGO_CS,AGO_CU,AGO_HM,AGO_HL,AGO_LU,AGO_LN,AGO_LS,AGO_ML,AGO_MX,AGO_NA,AGO_UI,AGO_ZA)),
AIA("Anguilla",80,listOf(AIA_BP,AIA_NA,AIA_EE,AIA_GH,AIA_IH,AIA_NH,AIA_NS,AIA_NA,AIA_SG,AIA_SH,AIA_NA,AIA_NA,AIA_SO,AIA_ST,AIA_TF,AIA_TQ,AIA_TV,AIA_WE)),
ATG("Antiguaand Barbuda",438,listOf(ATG_BB,ATG_RD,ATG_GE,ATG_JO,ATG_MA,ATG_PA,ATG_PE,ATG_PH)),
ARG("Argentina",2785500,listOf(ARG_BA,ARG_CT,ARG_CC,ARG_CH,ARG_DF,ARG_CB,ARG_CN,ARG_ER,ARG_FM,ARG_JY,ARG_LP,ARG_LR,ARG_MZ,ARG_MN,ARG_NQ,ARG_RN,ARG_SA,ARG_SJ,ARG_SL,ARG_SC,ARG_SF,ARG_SE,ARG_TF,ARG_TM)),
ARM("Armenia",29724,listOf(ARM_AG,ARM_AR,ARM_AV,ARM_ER,ARM_GR,ARM_KT,ARM_LO,ARM_SH,ARM_SU,ARM_TV,ARM_VD)),
ABW("Aruba",183,emptyList()),
AUS("Australia",7720095,listOf(AUS_AS,AUS_AC,AUS_CR,AUS_JB,AUS_NS,AUS_NT,AUS_QL,AUS_SA,AUS_TS,AUS_VI,AUS_WA)),
AUT("Austria",83897,listOf(AUT_BU,AUT_KA,AUT_NO,AUT_OO,AUT_SZ,AUT_ST,AUT_TR,AUT_VO,AUT_WI)),
AZE("Azerbaijan",86331,listOf(AZE_NA,AZE_NA,AZE_NA,AZE_NA,AZE_NA,AZE_LA,AZE_NA,AZE_NA,AZE_NA,AZE_NA)),
BHS("Bahamas",13437,listOf(BHS_AK,BHS_BR,BHS_BI,BHS_BP,BHS_CI,BHS_CB,BHS_CN,BHS_CE,BHS_FP,BHS_CK,BHS_EB,BHS_EM,BHS_GC,BHS_HB,BHS_HT,BHS_IN,BHS_LI,BHS_MC,BHS_MG,BHS_MI,BHS_NW,BHS_NB,BHS_NN,BHS_NE,BHS_RI,BHS_RC,BHS_SS,BHS_SB,BHS_SN,BHS_SE,BHS_SW,BHS_WB)),
BHR("Bahrain",718,listOf(BHR_CA,BHR_MU,BHR_NO,BHR_SO)),
BGD("Bangladesh",140002,listOf(BGD_BA,BGD_CG,BGD_DH,BGD_KH,BGD_MM,BGD_RS,BGD_RP,BGD_SY)),
BRB("Barbados",437,listOf(BRB_CC,BRB_AN,BRB_GE,BRB_JM,BRB_JN,BRB_JS,BRB_LU,BRB_MI,BRB_PE,BRB_PH,BRB_TH)),
BLR("Belarus",206665,listOf(BLR_BR,BLR_HO,BLR_HR,BLR_MI,BLR_MI,BLR_MA,BLR_VI)),
BEL("Belgium",30668,listOf(BEL_NA,BEL_NA,BEL_NA)),
BLZ("Belize",22164,listOf(BLZ_BZ,BLZ_CY,BLZ_CZ,BLZ_OW,BLZ_SC,BLZ_TO)),
BEN("Benin",116014,listOf(BEN_AL,BEN_AK,BEN_AQ,BEN_BO,BEN_CL,BEN_DO,BEN_CF,BEN_LI,BEN_MO,BEN_OU,BEN_PL,BEN_ZO)),
BMU("Bermuda",68,listOf(BMU_DE,BMU_HA,BMU_HC,BMU_PA,BMU_PE,BMU_SC,BMU_SG,BMU_SA,BMU_SM,BMU_SO,BMU_WA)),
BTN("Bhutan",38913,listOf(BTN_BU,BTN_CK,BTN_DA,BTN_GA,BTN_HA,BTN_LH,BTN_MO,BTN_PR,BTN_PM,BTN_PN,BTN_SJ,BTN_SM,BTN_GE,BTN_TM,BTN_TY,BTN_TA,BTN_TO,BTN_CR,BTN_WP,BTN_SG)),
BOL("Bolivia",1090425,listOf(BOL_EB,BOL_CQ,BOL_CB,BOL_LP,BOL_OR,BOL_PA,BOL_PO,BOL_SC,BOL_TR)),
BES("Bonaire, Sint Eustatiusand Saba",325,listOf(BES_BO,BES_SA,BES_SE)),
BIH("Bosniaand Herzegovina",51081,listOf(BIH_BR,BIH_BF,BIH_SR)),
BWA("Botswana",580648,listOf(BWA_CE,BWA_CH,BWA_FR,BWA_GB,BWA_GH,BWA_JW,BWA_KG,BWA_KL,BWA_KW,BWA_LB,BWA_NE,BWA_NC,BWA_SP,BWA_SR,BWA_SO,BWA_ST)),
BVT("Bouvet Island",77,emptyList()),
BRA("Brazil",8560656,listOf(BRA_AC,BRA_AL,BRA_AP,BRA_AM,BRA_BA,BRA_CE,BRA_DF,BRA_ES,BRA_GO,BRA_MA,BRA_MT,BRA_MS,BRA_MG,BRA_PA,BRA_PB,BRA_PR,BRA_PE,BRA_PI,BRA_RJ,BRA_RN,BRA_RS,BRA_RO,BRA_RR,BRA_SC,BRA_SP,BRA_SE,BRA_TO)),
IOT("British Indian Ocean Territory",65,emptyList()),
VGB("British Virgin Islands",169,listOf(VGB_NA,VGB_NA,VGB_NA,VGB_NA,VGB_NA)),
BRN("Brunei",5815,listOf(BRN_BE,BRN_BM,BRN_TE,BRN_TU)),
BGR("Bulgaria",111647,listOf(BGR_BL,BGR_BR,BGR_DO,BGR_GB,BGR_SG,BGR_KK,BGR_KZ,BGR_KY,BGR_LV,BGR_MT,BGR_PZ,BGR_PN,BGR_PV,BGR_PD,BGR_RG,BGR_RS,BGR_SH,BGR_SI,BGR_SL,BGR_SM,BGR_SF,BGR_SZ,BGR_TU,BGR_VN,BGR_VT,BGR_VD,BGR_VR,BGR_YA)),
BFA("Burkina Faso",274620,listOf(BFA_BO,BFA_CD,BFA_CT,BFA_CE,BFA_CN,BFA_CO,BFA_CS,BFA_ES,BFA_HB,BFA_NO,BFA_PC,BFA_SA,BFA_SO)),
BDI("Burundi",27113,listOf(BDI_BB,BDI_BM,BDI_BU,BDI_BR,BDI_CA,BDI_CI,BDI_GI,BDI_KR,BDI_KY,BDI_KI,BDI_MA,BDI_MV,BDI_MY,BDI_MW,BDI_NG,BDI_RT,BDI_RY)),
KHM("Cambodia",182800,listOf(KHM_OM,KHM_BA,KHM_KM,KHM_KG,KHM_KS,KHM_KT,KHM_KP,KHM_KN,KHM_KK,KHM_,KHM_KH,KHM_PL,KHM_KA,KHM_MK,KHM_OC,KHM_PP,KHM_PO,KHM_PH,KHM_PY,KHM_RO,KHM_SI,KHM_ST,KHM_SR,KHM_TA,KHM_TB)),
CMR("Cameroon",469101,listOf(CMR_AD,CMR_CE,CMR_ES,CMR_EN,CMR_LT,CMR_NO,CMR_NW,CMR_OU,CMR_SU,CMR_SW)),
CAN("Canada",9925768,listOf(CAN_AB,CAN_BC,CAN_MB,CAN_NB,CAN_NF,CAN_NT,CAN_NS,CAN_NU,CAN_ON,CAN_PE,CAN_QC,CAN_SK,CAN_YT)),
CPV("Cabo Verde",4115,listOf(CPV_BV,CPV_BR,CPV_MA,CPV_MO,CPV_PA,CPV_PN,CPV_PC,CPV_RB,CPV_RG,CPV_RS,CPV_SL,CPV_CT,CPV_CT,CPV_CZ,CPV_SD,CPV_FP,CPV_LO,CPV_SM,CPV_SS,CPV_SV,CPV_TF,CPV_TS)),
XCA("Caspian Sea",371885,emptyList()),
CYM("Cayman Islands",282,listOf(CYM_BT,CYM_EE,CYM_GT,CYM_NS,CYM_SI,CYM_WB)),
CAF("Central African Republic",624264,listOf(CAF_BB,CAF_BG,CAF_BK,CAF_HM,CAF_HK,CAF_KG,CAF_LB,CAF_HS,CAF_MB,CAF_KB,CAF_NM,CAF_MP,CAF_UK,CAF_AC,CAF_OP,CAF_SE,CAF_VK)),
TCD("Chad",1277250,listOf(TCD_BG,TCD_BA,TCD_BR,TCD_CB,TCD_EE,TCD_EO,TCD_GR,TCD_HD,TCD_KM,TCD_LC,TCD_LO,TCD_LR,TCD_MA,TCD_ME,TCD_MW,TCD_MC,TCD_OA,TCD_SA,TCD_SI,TCD_TA,TCD_TI,TCD_NJ,TCD_BI)),
CHL("Chile",753785,listOf(CHL_AN,CHL_AR,CHL_AP,CHL_AT,CHL_AI,CHL_BI,CHL_CO,CHL_LI,CHL_LL,CHL_LR,CHL_MA,CHL_ML,CHL_NB,CHL_RM,CHL_TA,CHL_VS)),
CHN("China",9405272,listOf(CHN_AH,CHN_BJ,CHN_CQ,CHN_FJ,CHN_GS,CHN_GD,CHN_GX,CHN_GZ,CHN_HA,CHN_HB,CHN_HL,CHN_HE,CHN_,CHN_HU,CHN_HN,CHN_JS,CHN_JX,CHN_JL,CHN_LN,CHN_,CHN_NM,CHN_NX,CHN_QH,CHN_SA,CHN_SD,CHN_SH,CHN_SX,CHN_SC,CHN_TJ,CHN_XJ,Z02_XJ,Z03_XJ,CHN_XZ,Z03_XZ,Z08_XZ,CHN_YN,CHN_ZJ)),
CXR("Christmas Island",140,emptyList()),
XCL("Clipperton Island",10,emptyList()),
CCK("Cocos Islands",14,emptyList()),
COL("Colombia",1144791,listOf(COL_AM,COL_AN,COL_AR,COL_AT,COL_DC,COL_BL,COL_BY,COL_CL,COL_CQ,COL_CS,COL_CA,COL_CE,COL_CH,COL_CO,COL_CU,COL_GN,COL_GV,COL_HU,COL_LG,COL_MA,COL_ME,COL_NA,COL_NS,COL_PU,COL_QD,COL_RI,COL_SA,COL_ST,COL_SU,COL_TO,COL_VC,COL_VP,COL_VD)),
COM("Comoros",1684,listOf(COM_MO,COM_GC,COM_AN)),
COK("Cook Islands",281,listOf(COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA,COK_NA)),
CRI("Costa Rica",51511,listOf(CRI_AL,CRI_CA,CRI_GU,CRI_HE,CRI_LI,CRI_PU,CRI_SJ)),
CIV("Côted'Ivoire",323636,listOf(CIV_AB,CIV_BA,CIV_CM,CIV_DE,CIV_GD,CIV_LA,CIV_LN,CIV_MN,CIV_SM,CIV_SV,CIV_VB,CIV_WB,CIV_YM,CIV_ZA)),
HRV("Croatia",57065,listOf(HRV_BB,HRV_SP,HRV_DN,HRV_GZ,HRV_IS,HRV_KA,HRV_KK,HRV_KZ,HRV_LS,HRV_ME,HRV_OB,HRV_PS,HRV_PG,HRV_SB,HRV_SM,HRV_SD,HRV_VA,HRV_VP,HRV_VS,HRV_ZD,HRV_ZG)),
CUB("Cuba",111255,listOf(CUB_CM,CUB_CA,CUB_CF,CUB_CH,CUB_GR,CUB_GU,CUB_HO,CUB_IJ,CUB_LH,CUB_LT,CUB_MA,CUB_MQ,CUB_PR,CUB_SS,CUB_SC,CUB_VC)),
CUW("Curaçao",440,emptyList()),
CYP("Cyprus",5733,listOf(CYP_FA,CYP_LA,CYP_LI,CYP_NI,CYP_PA)),
CZE("Czechia",78754,listOf(CZE_CK,CZE_BK,CZE_KK,CZE_JK,CZE_HK,CZE_LK,CZE_VK,CZE_OK,CZE_EK,CZE_PK,CZE_SK,CZE_SK,CZE_UK,CZE_ZK)),
COD("Democratic Republicofthe Congo",2344314,listOf(COD_BU,COD_ET,COD_HK,COD_HL,COD_HU,COD_IT,COD_KS,COD_LL,COD_KO,COD_KN,COD_BC,COD_KG,COD_KU,COD_LM,COD_LB,COD_MA,COD_MN,COD_MO,COD_NK,COD_NU,COD_SN,COD_SK,COD_SU,COD_TG,COD_TO,COD_TP)),
DNK("Denmark",43034,listOf(DNK_HS,DNK_MJ,DNK_ND,DNK_SL,DNK_SD)),
DJI("Djibouti",22509,listOf(DJI_AS,DJI_AR,DJI_DK,DJI_DB,DJI_OB,DJI_TA)),
DMA("Dominica",759,listOf(DMA_AN,DMA_DA,DMA_GO,DMA_JN,DMA_JH,DMA_LU,DMA_MA,DMA_PK,DMA_PL,DMA_PR)),
DOM("Dominican Republic",48348,listOf(DOM_AZ,DOM_BR,DOM_BH,DOM_DA,DOM_NC,DOM_DU,DOM_SE,DOM_ES,DOM_HM,DOM_IN,DOM_AL,DOM_EP,DOM_RO,DOM_VE,DOM_MT,DOM_MN,DOM_MC,DOM_MP,DOM_PN,DOM_PV,DOM_PP,DOM_SC,DOM_SM,DOM_CR,DOM_JO,DOM_JU,DOM_PM,DOM_SZ,DOM_ST,DOM_SR,DOM_SD,DOM_VA)),
ECU("Ecuador",258071,listOf(ECU_AZ,ECU_BO,ECU_CN,ECU_CR,ECU_CB,ECU_CT,ECU_EO,ECU_ES,ECU_GA,ECU_GU,ECU_IM,ECU_LJ,ECU_LR,ECU_MN,ECU_MS,ECU_NA,ECU_OR,ECU_PA,ECU_PI,ECU_SE,ECU_SD,ECU_SU,ECU_TU,ECU_ZC)),
EGY("Egypt",987766,listOf(EGY_DQ,EGY_BA,EGY_BH,EGY_FY,EGY_GH,EGY_IK,EGY_IS,EGY_JZ,EGY_MF,EGY_MN,EGY_QH,EGY_QL,EGY_UQ,EGY_WJ,EGY_SW,EGY_SQ,EGY_AN,EGY_AT,EGY_BN,EGY_BS,EGY_DT,EGY_JS,EGY_KS,EGY_MT,EGY_QN,EGY_SS,EGY_SJ)),
SLV("El Salvador",20545,listOf(SLV_AH,SLV_CA,SLV_CH,SLV_CU,SLV_LI,SLV_PA,SLV_UN,SLV_MO,SLV_SM,SLV_SS,SLV_SV,SLV_SA,SLV_SO,SLV_US)),
GNQ("Equatorial Guinea",27138,listOf(GNQ_AN,GNQ_BN,GNQ_BS,GNQ_CS,GNQ_KN,GNQ_LI,GNQ_WN)),
ERI("Eritrea",121150,listOf(ERI_AN,ERI_DU,ERI_DK,ERI_GB,ERI_MA,ERI_SK)),
EST("Estonia",45354,listOf(EST_HA,EST_HI,EST_IV,EST_JR,EST_JN,EST_LN,EST_LV,EST_PR,EST_NA,EST_PL,EST_RA,EST_SA,EST_TA,EST_VG,EST_VD,EST_VR)),
ETH("Ethiopia",1136255,listOf(ETH_AA,ETH_AF,ETH_AM,ETH_BE,ETH_DD,ETH_GA,ETH_HA,ETH_OR,ETH_SO,ETH_SN,ETH_TI)),
FLK("Falkland Islands",12370,emptyList()),
FRO("Faroe Islands",1434,listOf(FRO_OS,FRO_NO,FRO_SA,FRO_ST,FRO_SN|FO,FRO_VG)),
FJI("Fiji",19057,listOf(FJI_CE,FJI_EA,FJI_NO,FJI_RO,FJI_W)),
FIN("Finland",335489,listOf(FIN_IS,FIN_LP,FIN_OU,FIN_ES,FIN_LS)),
FRA("France",549335,listOf(FRA_AR,FRA_BF,FRA_BT,FRA_CN,FRA_CE,FRA_AO,FRA_NC,FRA_IF,FRA_ND,FRA_AC,FRA_LP,FRA_PL,FRA_PR)),
GUF("French Guiana",83856,listOf(GUF_CY,GUF_SL)),
PYF("French Polynesia",4053,listOf(PYF_TI,PYF_WI,PYF_MI,PYF_LI,PYF_TG)),
ATF("French Southern Territories",7852,listOf(ATF_CR,ATF_NA,ATF_AS,ATF_KG)),
GAB("Gabon",266332,listOf(GAB_ES,GAB_HO,GAB_MO,GAB_NG,GAB_NY,GAB_OI,GAB_OL,GAB_OM,GAB_WN)),
GMB("Gambia",10731,listOf(GMB_BJ,GMB_LR,GMB_MC,GMB_NB,GMB_UR,GMB_WE)),
GEO("Georgia",69893,listOf(GEO_AB,GEO_AJ,GEO_GU,GEO_IM,GEO_KA,GEO_KK,GEO_MM,GEO_RK,GEO_SZ,GEO_SJ,GEO_SD,GEO_TB)),
DEU("Germany",357324,listOf(DEU_BW,DEU_BY,DEU_BE,DEU_BR,DEU_HB,DEU_HH,DEU_HE,DEU_MV,DEU_NI,DEU_NW,DEU_RP,DEU_SL,DEU_SN,DEU_ST,DEU_SH,DEU_TH)),
GHA("Ghana",241025,listOf(GHA_AF,GHA_AH,GHA_BO,GHA_BE,GHA_CP,GHA_EP,GHA_AA,GHA_NE,GHA_NP,GHA_OT,GHA_SV,GHA_UE,GHA_UW,GHA_TV,GHA_WP,GHA_WN)),
GIB("Gibraltar",7,emptyList()),
GRC("Greece",132751,listOf(GRC_AI,GRC_MA,GRC_AT,GRC_CR,GRC_EM,GRC_MH,GRC_PW,GRC_TC)),
GRL("Greenland",2139125,listOf(GRL_KU,GRL_UO,GRL_QS,GRL_QT,GRL_SE)),
GRD("Grenada",362,listOf(GRD_CA,GRD_AN,GRD_DA,GRD_GE,GRD_JO,GRD_MA,GRD_PA)),
GLP("Guadeloupe",1658,listOf(GLP_BT,GLP_PP)),
GUM("Guam",554,listOf(GUM_AH,GUM_AT,GUM_AS,GUM_BA,GUM_CP,GUM_DD,GUM_AN,GUM_IN,GUM_MA,GUM_ME,GUM_MT,GUM_PI,GUM_SR,GUM_SJ,GUM_TF,GUM_TM,GUM_UM,GUM_YG,GUM_YN)),
GTM("Guatemala",109777,listOf(GTM_AV,GTM_BV,GTM_CM,GTM_CQ,GTM_PR,GTM_ES,GTM_GU,GTM_HU,GTM_IZ,GTM_JA,GTM_JU,GTM_PE,GTM_QZ,GTM_QC,GTM_RE,GTM_SA,GTM_SM,GTM_SR,GTM_SO,GTM_SU,GTM_TO,GTM_ZA)),
GGY("Guernsey",88,listOf(GGY_AL,GGY_CA,GGY_FO,GGY_AN,GGY_MA,GGY_PP,GGY_SB,GGY_SM,GGY_SV,GGY_SK,GGY_TV,GGY_VA)),
GIN("Guinea",246356,listOf(GIN_NA,GIN_C,GIN_NA,GIN_K,GIN_NA,GIN_NA,GIN_NA,GIN_NA)),
GNB("Guinea-Bissau",34088,listOf(GNB_BA,GNB_BM,GNB_BS,GNB_BL,GNB_CA,GNB_GA,GNB_OI,GNB_QU,GNB_TO)),
GUY("Guyana",211133,listOf(GUY_BA,GUY_CU,GUY_DE,GUY_EB,GUY_ES,GUY_MA,GUY_PM,GUY_PT,GUY_UD,GUY_UT)),
HTI("Haiti",27258,listOf(HTI_CE,HTI_GR,HTI_AR,HTI_NI,HTI_ND,HTI_NE,HTI_NO,HTI_OU,HTI_SD,HTI_SE)),
HMD("Heard Islandand Mc Donald Island",362,emptyList()),
HND("Honduras",112950,listOf(HND_AT,HND_CH,HND_CL,HND_CM,HND_CP,HND_CR,HND_EP,HND_FM,HND_GD,HND_IN,HND_IB,HND_LP,HND_LE,HND_OC,HND_OL,HND_CP,HND_VA,HND_YO)),
HUN("Hungary",92993,listOf(HUN_BK,HUN_BA,HUN_BE,HUN_BZ,HUN_BU,HUN_CS,HUN_FE,HUN_GS,HUN_HB,HUN_HE,HUN_JN,HUN_KE,HUN_NO,HUN_PE,HUN_SO,HUN_SZ,HUN_TO,HUN_VA,HUN_VE,HUN_ZA)),
ISL("Iceland",101781,listOf(ISL_AL,ISL_HO,ISL_NE,ISL_NV,ISL_SL,ISL_SU,ISL_VF,ISL_VL)),
IND("India",3166019,listOf(IND_AN,IND_AP,IND_AR,Z07_AR,IND_AS,IND_BR,IND_CH,IND_CT,IND_DN,IND_DD,IND_GA,IND_GJ,IND_HR,IND_HP,Z04_HP,Z09_HP,Z01_JK,IND_JH,IND_KA,IND_KL,IND_LD,IND_MP,IND_MH,IND_MN,IND_ML,IND_MZ,IND_NL,IND_DL,IND_OR,IND_PY,IND_PB,IND_RJ,IND_SK,IND_TN,IND_TG,IND_TR,IND_UP,IND_UT,Z05_UT,Z09_UT,IND_WB)),
IDN("Indonesia",1902704,listOf(IDN_AC,IDN_BA,IDN_BB,IDN_BT,IDN_BE,IDN_GO,IDN_JK,IDN_JA,IDN_JR,IDN_JT,IDN_JI,IDN_KB,IDN_KS,IDN_KT,IDN_KM,IDN_KU,IDN_KR,IDN_LA,IDN_MA,IDN_MU,IDN_NB,IDN_NT,IDN_PA,IDN_IB,IDN_RI,IDN_SR,IDN_SE,IDN_ST,IDN_SG,IDN_SW,IDN_SB,IDN_SL,IDN_SU,IDN_YO)),
IRN("Iran",1626366,listOf(IRN_AL,IRN_AR,IRN_BS,IRN_CM,IRN_EA,IRN_ES,IRN_FA,IRN_GI,IRN_GO,IRN_HD,IRN_HG,IRN_IL,IRN_KE,IRN_BK,IRN_KZ,IRN_KB,IRN_KD,IRN_LO,IRN_MK,IRN_MN,IRN_KS,IRN_QZ,IRN_QM,IRN_KV,IRN_SM,IRN_SB,IRN_KJ,IRN_TH,IRN_WA,IRN_YA,IRN_ZA)),
IRQ("Iraq",437670,listOf(IRQ_AN,IRQ_BA,IRQ_MU,IRQ_QA,IRQ_NA,IRQ_AR,IRQ_SU,IRQ_TS,IRQ_BB,IRQ_BG,IRQ_DQ,IRQ_DA,IRQ_DI,IRQ_KA,IRQ_MA,IRQ_NI,IRQ_SD,IRQ_WA)),
IRL("Ireland",70131,listOf(IRL_CW,IRL_CN,IRL_CE,IRL_DL,IRL_DN,IRL_GY,IRL_KY,IRL_KE,IRL_KK,IRL_LS,IRL_LM,IRL_LK,IRL_LD,IRL_LH,IRL_MO,IRL_MH,IRL_MN,IRL_OY,IRL_RN,IRL_SO,IRL_TY,IRL_WD,IRL_WH,IRL_WX,IRL_WW,IRL_CK)),
IMN("Isleof Man",578,listOf(IMN_AY,IMN_RU,IMN_MC,IMN_MD,IMN_AY,IMN_RU,IMN_MD,IMN_GR,IMN_GB,IMN_MC,IMN_AY,IMN_RU,IMN_MD,IMN_MC,IMN_MD,IMN_GB,IMN_GB,IMN_RU,IMN_RU,IMN_AY,IMN_MD)),
ISR("Israel",22226,listOf(ISR_NA,ISR_HD,ISR_HA,ISR_HM,ISR_HZ,ISR_JM,ISR_TA)),
ITA("Italy",300894,listOf(ITA_65,ITA_16,ITA_77,ITA_78,ITA_72,ITA_45,ITA_36,ITA_62,ITA_42,ITA_25,ITA_57,ITA_67,ITA_21,ITA_88,ITA_19,ITA_52,ITA_32,ITA_55,ITA_23,ITA_34)),
JAM("Jamaica",11061,listOf(JAM_CL,JAM_HA,JAM_KI,JAM_MA,JAM_PO,JAM_SD,JAM_SN,JAM_SC,JAM_SE,JAM_SJ,JAM_SM,JAM_ST,JAM_TR,JAM_WE)),
JPN("Japan",373106,listOf(JPN_AI,JPN_AK,JPN_AO,JPN_CH,JPN_EH,JPN_FI,JPN_FO,JPN_FS,JPN_GF,JPN_GM,JPN_HS,JPN_HK,JPN_HG,JPN_IB,JPN_IS,JPN_IW,JPN_KG,JPN_KS,JPN_KN,JPN_KC,JPN_KM,JPN_KY,JPN_ME,JPN_MG,JPN_MZ,JPN_NN,JPN_NS,JPN_NR,JPN_NI,JPN_OT,JPN_OY,JPN_ON,JPN_OS,JPN_SG,JPN_ST,JPN_SH,JPN_SM,JPN_SZ,JPN_TC,JPN_TS,JPN_TK,JPN_TT,JPN_TY,JPN_WK,JPN_YT,JPN_YC,JPN_YN)),
JEY("Jersey",125,listOf(JEY_GR,JEY_BR,JEY_CL,JEY_HE,JEY_JO,JEY_LA,JEY_MT,JEY_MY,JEY_OU,JEY_PE,JEY_SA,JEY_TR)),
JOR("Jordan",89464,listOf(JOR_AJ,JOR_AM,JOR_AQ,JOR_BA,JOR_IR,JOR_JA,JOR_KA,JOR_MN,JOR_MD,JOR_MA,JOR_AT,JOR_AZ)),
KAZ("Kazakhstan",2728680,listOf(KAZ_AA,KAZ_AM,KAZ_AT,KAZ_AR,KAZ_EK,KAZ_MG,KAZ_NK,KAZ_PA,KAZ_QG,KAZ_QS,KAZ_QO,KAZ_SK,KAZ_WK,KAZ_ZM)),
KEN("Kenya",589936,listOf(KEN_BA,KEN_BO,KEN_BN,KEN_BS,KEN_EM,KEN_EB,KEN_GA,KEN_HB,KEN_IS,KEN_KJ,KEN_KK,KEN_KR,KEN_KB,KEN_KF,KEN_KY,KEN_KI,KEN_KU,KEN_KT,KEN_KW,KEN_LK,KEN_LM,KEN_MC,KEN_MK,KEN_MD,KEN_MB,KEN_ME,KEN_MG,KEN_MM,KEN_MU,KEN_NB,KEN_NK,KEN_ND,KEN_NR,KEN_NM,KEN_NN,KEN_NI,KEN_SA,KEN_SI,KEN_TT,KEN_TR,KEN_NT,KEN_TN,KEN_TU,KEN_UG,KEN_VI,KEN_WJ,KEN_WP)),
KIR("Kiribati",1017,emptyList()),
XKO("Kosovo",10843,listOf(XKO_NA,XKO_NA,XKO_KM,XKO_PE,XKO_NA,XKO_PZ,XKO_NA)),
KWT("Kuwait",17486,listOf(KWT_AH,KWT_FA,KWT_JA,KWT_KU,KWT_HW,KWT_MU)),
KGZ("Kyrgyzstan",197618,listOf(KGZ_BA,KGZ_GB,KGZ_CU,KGZ_DA,KGZ_NA,KGZ_OS,KGZ_OS,KGZ_TL,KGZ_YK)),
LAO("Laos",231104,listOf(LAO_AT,LAO_BK,LAO_BL,LAO_CH,LAO_HO,LAO_KH,LAO_LM,LAO_LP,LAO_OU,LAO_PH,LAO_SL,LAO_SV,LAO_VI,LAO_VT,LAO_XA,LAO_XS,LAO_XE,LAO_XI)),
LVA("Latvia",64537,listOf(LVA_,LVA_,LVA_,LVA_,LVA_)),
LBN("Lebanon",10265,listOf(LBN_NA,LBN_NA,LBN_NA,LBN_NA,LBN_NA,LBN_NA,LBN_NA,LBN_NA)),
LSO("Lesotho",30653,listOf(LSO_BE,LSO_BB,LSO_LE,LSO_MF,LSO_MS,LSO_MH,LSO_MK,LSO_QN,LSO_QT,LSO_TT)),
LBR("Liberia",96550,listOf(LBR_BM,LBR_BG,LBR_GP,LBR_GB,LBR_CM,LBR_GD,LBR_GK,LBR_LF,LBR_MG,LBR_MY,LBR_MO,LBR_NI,LBR_RG,LBR_RI,LBR_SI)),
LBY("Libya",1622430,listOf(LBY_BN,LBY_JK,LBY_JG,LBY_JR,LBY_JF,LBY_KU,LBY_MA,LBY_MR,LBY_AW,LBY_NK,LBY_ZW,LBY_BG,LBY_DA,LBY_GH,LBY_MS,LBY_MU,LBY_NT,LBY_SA,LBY_ST,LBY_TR,LBY_WH,LBY_WS)),
LIE("Liechtenstein",159,listOf(LIE_BA,LIE_ES,LIE_GA,LIE_MA,LIE_PL,LIE_RU,LIE_SN,LIE_SB,LIE_TN,LIE_TB,LIE_VA)),
LTU("Lithuania",64862,listOf(LTU_AS,LTU_KS,LTU_KP,LTU_MA,LTU_PA,LTU_SH,LTU_TG,LTU_TL,LTU_UN,LTU_VI)),
LUX("Luxembourg",2579,listOf(LUX_DI,LUX_GR,LUX_LU)),
SXM("Sint Maarten",38,emptyList()),
MKD("North Macedonia",24930,listOf(MKD_AD,MKD_AR,MKD_BR,MKD_TL,MKD_BG,MKD_VJ,MKD_BS,MKD_BN,MKD_BU,MKD_CI,MKD_CA,MKD_CE,MKD_CZ,MKD_CH,MKD_CS,MKD_DB,MKD_DA,MKD_DL,MKD_DM,MKD_DK,MKD_DE,MKD_GB,MKD_GV,MKD_GP,MKD_GT,MKD_GR,MKD_IL,MKD_JG,MKD_KB,MKD_KX,MKD_AV,MKD_KH,MKD_VD,MKD_OC,MKD_KN,MKD_KY,MKD_KZ,MKD_KG,MKD_KS,MKD_UM,MKD_NA,MKD_LI,MKD_LO,MKD_MK,MKD_MD,MKD_MR,MKD_MG,MKD_NG,MKD_NV,MKD_NS,MKD_OD,MKD_PH,MKD_PE,MKD_PN,MKD_PP,MKD_PT,MKD_RV,MKD_RN,MKD_RE,MKD_RM,MKD_AJ,MKD_SS,MKD_SD,MKD_NA,MKD_ST,MKD_UG,MKD_RU,MKD_SU,MKD_SO,MKD_SL,MKD_TR,MKD_ET,MKD_VA,MKD_VL,MKD_VE,MKD_VV,MKD_NI,MKD_VH,MKD_ZK,MKD_ZE,MKD_ZR)),
MDG("Madagascar",594538,listOf(MDG_T,MDG_D,MDG_F,MDG_M,MDG_A,MDG_NA)),
MWI("Malawi",118637,listOf(MWI_BA,MWI_BL,MWI_CK,MWI_CR,MWI_CT,MWI_DE,MWI_DO,MWI_KR,MWI_KS,MWI_LK,MWI_LI,MWI_MA,MWI_MG,MWI_MC,MWI_MJ,MWI_MN,MWI_MZ,MWI_NN,MWI_NA,MWI_NK,MWI_NS,MWI_NU,MWI_NI,MWI_PH,MWI_RU,MWI_SA,MWI_TH,MWI_ZO)),
MYS("Malaysia",331770,listOf(MYS_JH,MYS_KH,MYS_KN,MYS_KL,MYS_LA,MYS_ME,MYS_NS,MYS_PH,MYS_PK,MYS_PL,MYS_PG,MYS_PJ,MYS_SA,MYS_SK,MYS_SL,MYS_TE)),
MDV("Maldives",281,emptyList()),
MLI("Mali",1258093,listOf(MLI_BA,MLI_GA,MLI_KY,MLI_KD,MLI_KK,MLI_MO,MLI_SG,MLI_SK,MLI_TB)),
MLT("Malta",324,listOf(MLT_CE,MLT_GO,MLT_SO,MLT_NO,MLT_SE)),
MHL("Marshall Islands",285,listOf(MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_KWA,MHL_NA,MHL_NA,MHL_NA,MHL_MAJ,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA,MHL_NA)),
MTQ("Martinique",1124,listOf(MTQ_FF,MTQ_MA,MTQ_TR,MTQ_SP)),
MRT("Mauritania",1046483,listOf(MRT_AD,MRT_AS,MRT_BR,MRT_DN,MRT_GO,MRT_GD,MRT_HC,MRT_HG,MRT_IN,MRT_NO,MRT_TG,MRT_TZ,MRT_TR)),
MUS("Mauritius",2036,listOf(MUS_AG,MUS_BL,MUS_FL,MUS_GP,MUS_MO,MUS_PA,MUS_PW,MUS_PL,MUS_RR,MUS_RO,MUS_CC,MUS_SA)),
MYT("Mayotte",394,listOf(MYT_01,MYT_,MYT_,MYT_04,MYT_05,MYT_06,MYT_07,MYT_08,MYT_,MYT_10,MYT_13,MYT_,MYT_12,MYT_,MYT_,MYT_,MYT_17)),
MEX("México",1960059,listOf(MEX_AG,MEX_BN,MEX_BS,MEX_CM,MEX_CP,MEX_CH,MEX_CA,MEX_CL,MEX_DF,MEX_DU,MEX_GJ,MEX_GR,MEX_HI,MEX_JA,MEX_MX,MEX_MC,MEX_MR,MEX_NA,MEX_NL,MEX_OA,MEX_PU,MEX_QE,MEX_QR,MEX_SL,MEX_SI,MEX_SO,MEX_TB,MEX_TM,MEX_TL,MEX_VE,MEX_YU,MEX_ZA)),
FSM("Micronesia",770,listOf(FSM_CH,FSM_KO,FSM_PO,FSM_YA)),
MDA("Moldova",33889,listOf(MDA_AN,MDA_BT,MDA_BA,MDA_BD,MDA_BR,MDA_CH,MDA_CA,MDA_CN,MDA_CU,MDA_CV,MDA_CS,MDA_CR,MDA_DO,MDA_DR,MDA_DB,MDA_ED,MDA_FA,MDA_FL,MDA_GA,MDA_GL,MDA_HI,MDA_IA,MDA_LE,MDA_NI,MDA_OC,MDA_OH,MDA_RZ,MDA_RS,MDA_SI,MDA_SD,MDA_SO,MDA_SV,MDA_ST,MDA_TA,MDA_TE,MDA_DU,MDA_UG)),
MCO("Monaco",2,emptyList()),
MNG("Mongolia",1565638,listOf(MNG_AR,MNG_BO,MNG_BH,MNG_BU,MNG_DA,MNG_DD,MNG_DG,MNG_DU,MNG_DZ,MNG_GA,MNG_GS,MNG_HN,MNG_HD,MNG_HG,MNG_OG,MNG_ER,MNG_OH,MNG_SL,MNG_SB,MNG_TO,MNG_UB,MNG_UV)),
MNE("Montenegro",13342,listOf(MNE_AN,MNE_BA,MNE_BE,MNE_BP,MNE_BU,MNE_CE,MNE_DA,MNE_HN,MNE_KL,MNE_KT,MNE_MK,MNE_NK,MNE_PV,MNE_PL,MNE_PU,MNE_PG,MNE_RO,MNE_SA,MNE_TI,MNE_UL,MNE_ZA)),
MSR("Montserrat",101,listOf(MSR_SA,MSR_SG,MSR_SP)),
MAR("Morocco",414714,listOf(MAR_CO,MAR_DA,MAR_FB,MAR_GB,MAR_GC,MAR_GE,MAR_LB,MAR_MK,MAR_MT,MAR_OR,MAR_RZ,MAR_SM,MAR_TD,MAR_TO,MAR_TH)),
MOZ("Mozambique",791805,listOf(MOZ_CD,MOZ_GA,MOZ_IN,MOZ_MN,MOZ_MP,MOZ_MC,MOZ_NM,MOZ_NS,MOZ_SO,MOZ_TE,MOZ_ZA)),
MMR("Myanmar",672590,listOf(MMR_AY,MMR_BA,MMR_CH,MMR_KC,MMR_KH,MMR_KN,MMR_MG,MMR_MD,MMR_MO,MMR_NY,MMR_RA,MMR_SA,MMR_SH,MMR_TN,MMR_YA)),
NAM("Namibia",828017,listOf(NAM_KA,NAM_ER,NAM_HA,NAM_OK,NAM_KH,NAM_KU,NAM_OW,NAM_OH,NAM_OS,NAM_ON,NAM_OT,NAM_OD,NAM_CA)),
NRU("Nauru",22,listOf(NRU_AI,NRU_AB,NRU_AT,NRU_AR,NRU_BA,NRU_BO,NRU_BU,NRU_DE,NRU_EW,NRU_IJ,NRU_ME,NRU_NI,NRU_UA,NRU_YA)),
NPL("Nepal",148210,listOf(NPL_MM,NPL_PW,NPL_SP,NPL_MP,NPL_PM)),
NLD("Netherlands",37624,listOf(NLD_DR,NLD_FL,NLD_FR,NLD_GE,NLD_GR,NLD_NA,NLD_LI,NLD_NB,NLD_NH,NLD_OV,NLD_UT,NLD_ZE,NLD_NA,NLD_NA)),
NCL("New Caledonia",18916,listOf(NCL_IL,NCL_NO,NCL_SU)),
NZL("New Zealand",268937,listOf(NZL_AU,NZL_BP,NZL_CA,NZL_CI,NZL_GI,NZL_HB,NZL_MW,NZL_MA,NZL_NE,NZL_01,NZL_NO,NZL_OT,NZL_02,NZL_SO,NZL_TK,NZL_TS,NZL_WK,NZL_WG,NZL_WC)),
NIC("Nicaragua",128957,listOf(NIC_AN,NIC_AS,NIC_BO,NIC_CA,NIC_CI,NIC_CO,NIC_ES,NIC_GR,NIC_JI,NIC_,NIC_LE,NIC_MD,NIC_MN,NIC_MS,NIC_MT,NIC_NS,NIC_SJ,NIC_RI)),
NER("Niger",1190189,listOf(NER_AG,NER_DF,NER_DS,NER_MA,NER_NI,NER_TH,NER_TL,NER_ZI)),
NGA("Nigeria",914161,listOf(NGA_AB,NGA_AD,NGA_AK,NGA_AN,NGA_BA,NGA_BY,NGA_BE,NGA_BO,NGA_CR,NGA_DE,NGA_EB,NGA_ED,NGA_EK,NGA_EN,NGA_FC,NGA_GO,NGA_IM,NGA_JI,NGA_KD,NGA_KN,NGA_KT,NGA_KE,NGA_KO,NGA_KW,NGA_LA,NGA_NA,NGA_NI,NGA_OG,NGA_ON,NGA_OS,NGA_OY,NGA_PL,NGA_RI,NGA_SO,NGA_TA,NGA_YO,NGA_ZA)),
NIU("Niue",268,emptyList()),
NFK("Norfolk Island",41,emptyList()),
PRK("North Korea",122844,listOf(PRK_CH,PRK_HG,PRK_HN,PRK_WB,PRK_WN,PRK_KS,PRK_KW,PRK_NA,PRK_PB,PRK_PN,PRK_PY,PRK_NJ,PRK_YG,PRK_NA)),
ZNC("Northern Cyprus",3321,listOf(ZNC_NA,ZNC_NA,ZNC_NA,ZNC_NA,ZNC_NA)),
MNP("Northern Mariana Islands",506,listOf(MNP_NI,MNP_RO,MNP_SA,MNP_TI)),
NOR("Norway",323747,listOf(NOR_AK,NOR_OF,NOR_AA,NOR_BU,NOR_FI,NOR_HE,NOR_HO,NOR_MR,NOR_NT,NOR_NO,NOR_OP,NOR_OS,NOR_RO,NOR_SF,NOR_ST,NOR_TE,NOR_TR,NOR_VA,NOR_VF)),
OMN("Oman",310686,listOf(OMN_DA,OMN_BN,OMN_BS,OMN_DH,OMN_ZA,OMN_WU,OMN_SN,OMN_SS,OMN_JA,OMN_MU,OMN_MA)),
PAK("Pakistan",877139,listOf(Z06_JK,PAK_BA,PAK_TA,Z06_NA,PAK_IS,PAK_NW,PAK_PB,PAK_SD)),
PLW("Palau",484,listOf(PLW_AM,PLW_AR,PLW_PE,PLW_HA,PLW_KA,PLW_KO,PLW_ME,PLW_ND,PLW_NC,PLW_NM,PLW_NP,PLW_NS,PLW_NL,PLW_NW,PLW_PE,PLW_SO)),
PSE("Palestine",6238,listOf(PSE_GZ,PSE_WE)),
PAN("Panama",75933,listOf(PAN_BC,PAN_CH,PAN_CC,PAN_CL,PAN_DR,PAN_EM,PAN_HE,PAN_SB,PAN_LS,PAN_NB,PAN_PN,PAN_PO,PAN_VR)),
PNG("Papua New Guinea",466628,listOf(PNG_NS,PNG_CE,PNG_CH,PNG_EN,PNG_ES,PNG_EH,PNG_EG,PNG_GU,PNG_HE,PNG_JI,PNG_MD,PNG_MN,PNG_MB,PNG_MR,PNG_NC,PNG_NI,PNG_NO,PNG_SA,PNG_SL,PNG_WN,PNG_WE,PNG_WL)),
PRY("Paraguay",401148,listOf(PRY_AG,PRY_AA,PRY_AM,PRY_AS,PRY_BQ,PRY_CG,PRY_CZ,PRY_CY,PRY_CE,PRY_CN,PRY_CR,PRY_GU,PRY_IT,PRY_MI,PRY_NE,PRY_PG,PRY_PH,PRY_SP)),
PER("Peru",1300636,listOf(PER_AM,PER_AN,PER_AP,PER_AR,PER_AY,PER_CJ,PER_CL,PER_CS,PER_HV,PER_HC,PER_IC,PER_JU,PER_LL,PER_LB,PER_LR,PER_LP,PER_LO,PER_MD,PER_MQ,PER_PA,PER_PI,PER_PU,PER_SM,PER_TA,PER_TU,PER_UC)),
PHL("Philippines",297628,listOf(PHL_AB,PHL_AN,PHL_AS,PHL_AK,PHL_AL,PHL_AQ,PHL_AP,PHL_AU,PHL_BS,PHL_BA,PHL_BN,PHL_BT,PHL_BG,PHL_BI,PHL_BO,PHL_BK,PHL_BU,PHL_CG,PHL_CN,PHL_CS,PHL_CM,PHL_CP,PHL_CT,PHL_CV,PHL_CB,PHL_CL,PHL_DV,PHL_DS,PHL_DO,PHL_DI,PHL_ES,PHL_GU,PHL_IF,PHL_IN,PHL_IS,PHL_II,PHL_IB,PHL_KA,PHL_LU,PHL_LG,PHL_LN,PHL_LS,PHL_LE,PHL_MG,PHL_MQ,PHL_MB,PHL_MM,PHL_MD,PHL_MN,PHL_MT,PHL_ND,PHL_NR,PHL_NC,PHL_NS,PHL_NE,PHL_NV,PHL_MC,PHL_MR,PHL_PL,PHL_PM,PHL_PN,PHL_QZ,PHL_QR,PHL_RI,PHL_RO,PHL_SM,PHL_SG,PHL_SQ,PHL_SR,PHL_SC,PHL_SL,PHL_SK,PHL_SU,PHL_SN,PHL_SS,PHL_TR,PHL_TT,PHL_PN,PHL_ZN,PHL_ZS,PHL_ZY)),
PCN("Pitcairn Islands",54,emptyList()),
POL("Poland",311892,listOf(POL_02,POL_04,POL_10,POL_06,POL_08,POL_12,POL_14,POL_16,POL_18,POL_20,POL_22,POL_24,POL_26,POL_28,POL_30,POL_32)),
PRT("Portugal",91999,listOf(PRT_AV,PRT_AC,PRT_BE,PRT_BR,PRT_BA,PRT_CB,PRT_CO,PRT_EV,PRT_FA,PRT_GU,PRT_LE,PRT_LI,PRT_NA,PRT_PA,PRT_PO,PRT_SA,PRT_SE,PRT_VC,PRT_VR,PRT_VI)),
PRI("Puerto Rico",9019,listOf(PRI_AJ,PRI_AD,PRI_AL,PRI_AB,PRI_AI,PRI_AN,PRI_AC,PRI_AR,PRI_BC,PRI_BQ,PRI_BY,PRI_CR,PRI_CG,PRI_CA,PRI_CV,PRI_CN,PRI_CT,PRI_CY,PRI_CB,PRI_CL,PRI_CD,PRI_CO,PRI_CM,PRI_CZ,PRI_CU,PRI_DO,PRI_FJ,PRI_FL,PRI_GC,PRI_GM,PRI_GL,PRI_GB,PRI_GR,PRI_HA,PRI_HO,PRI_HU,PRI_IS,PRI_JY,PRI_JD,PRI_JC,PRI_LJ,PRI_LR,PRI_LM,PRI_LP,PRI_LZ,PRI_LQ,PRI_MT,PRI_MR,PRI_MB,PRI_MG,PRI_MC,PRI_MV,PRI_NG,PRI_NR,PRI_OR,PRI_PT,PRI_PN,PRI_PO,PRI_QB,PRI_RC,PRI_RG,PRI_SB,PRI_SA,PRI_SG,PRI_SJ,PRI_SL,PRI_SS,PRI_SI,PRI_TA,PRI_TB,PRI_TJ,PRI_UT,PRI_VA,PRI_VB,PRI_VQ,PRI_VL,PRI_YB,PRI_YU)),
QAT("Qatar",11633,listOf(QAT_DA,QAT_DY,QAT_KR,QAT_WA,QAT_RY,QAT_MS,QAT_SL)),
COG("Republicofthe Congo",344030,listOf(COG_BO,COG_BR,COG_CU,COG_CO,COG_KO,COG_LE,COG_LI,COG_NI,COG_PL,COG_PN,COG_PO,COG_SA)),
REU("Réunion",2526,listOf(REU_BN,REU_DN,REU_PL,REU_PR)),
ROU("Romania",238297,listOf(ROU_AB,ROU_AR,ROU_AG,ROU_BC,ROU_BH,ROU_BN,ROU_BT,ROU_BR,ROU_BV,ROU_BI,ROU_BZ,ROU_CL,ROU_CS,ROU_CJ,ROU_CT,ROU_CV,ROU_DB,ROU_DJ,ROU_GL,ROU_GR,ROU_GJ,ROU_HR,ROU_HD,ROU_IL,ROU_IS,ROU_IF,ROU_MM,ROU_MH,ROU_MS,ROU_NT,ROU_OT,ROU_PH,ROU_SJ,ROU_SM,ROU_SB,ROU_SV,ROU_TR,ROU_TM,ROU_TL,ROU_VL,ROU_VS,ROU_VN)),
RUS("Russia",16869756,listOf(RUS_AD,RUS_AL,RUS_AM,RUS_AR,RUS_AS,RUS_BK,RUS_BL,RUS_BR,RUS_BU,RUS_CN,RUS_CL,RUS_CK,RUS_CV,RUS_SP,RUS_DA,RUS_GA,RUS_IN,RUS_IK,RUS_IV,RUS_KB,RUS_KN,RUS_KL,RUS_KG,RUS_KQ,RUS_KC,RUS_KI,RUS_KE,RUS_KH,RUS_KK,RUS_KM,RUS_KV,RUS_KO,RUS_KT,RUS_KD,RUS_KX,RUS_KU,RUS_KS,RUS_LN,RUS_LP,RUS_MG,RUS_ME,RUS_MR,RUS_NA,RUS_MS,RUS_MM,RUS_NN,RUS_NZ,RUS_NO,RUS_NG,RUS_NS,RUS_OM,RUS_OL,RUS_OB,RUS_PZ,RUS_PE,RUS_PR,RUS_PS,RUS_RO,RUS_RZ,RUS_SK,RUS_SL,RUS_SA,RUS_SR,RUS_SM,RUS_ST,RUS_SV,RUS_TB,RUS_TT,RUS_TO,RUS_TL,RUS_TU,RUS_TV,RUS_TY,RUS_UD,RUS_UL,RUS_VL,RUS_VG,RUS_VO,RUS_VR,RUS_YN,RUS_YS,RUS_YV,RUS_ZB)),
RWA("Rwanda",25449,listOf(RWA_NO,RWA_SU,RWA_ES,RWA_OU,RWA_KV)),
BLM("Saint-Barthélemy",21,listOf(BLM_NA,BLM_NA)),
MAF("Saint-Martin",56,emptyList()),
SHN("Saint Helena, Ascensionand Tris",412,listOf(SHN_AC,SHN_SH,SHN_TA)),
KNA("Saint Kittsand Nevis",269,listOf(KNA_CC,KNA_AS,KNA_GB,KNA_GG,KNA_JW,KNA_JC,KNA_JF,KNA_MC,KNA_PP,KNA_PL,KNA_PB,KNA_TL,KNA_TM,KNA_TP)),
LCA("Saint Lucia",618,listOf(LCA_AR,LCA_CN,LCA_CS,LCA_CH,LCA_DE,LCA_GI,LCA_LB,LCA_MI,LCA_CO,LCA_VF)),
SPM("Saint Pierreand Miquelon",227,listOf(SPM_ML,SPM_SP)),
VCT("Saint Vincentandthe Grenadines",400,listOf(VCT_CH,VCT_GT,VCT_AN,VCT_DA,VCT_GE,VCT_PA)),
WSM("Samoa",2871,listOf(WSM_AA,WSM_AL,WSM_AT,WSM_FA,WSM_GE,WSM_GI,WSM_PA,WSM_SA,WSM_TU,WSM_VF,WSM_VS)),
SMR("San Marino",61,listOf(SMR_AC,SMR_BM,SMR_CH,SMR_DO,SMR_FA,SMR_FI,SMR_MG,SMR_SM,SMR_SE)),
STP("SãoToméand Príncipe",1009,listOf(STP_PR,STP_ST)),
SAU("Saudi Arabia",1931654,listOf(SAU_AS,SAU_BA,SAU_HS,SAU_JF,SAU_MD,SAU_QS,SAU_RI,SAU_SH,SAU_HA,SAU_JZ,SAU_MK,SAU_NJ,SAU_TB)),
SEN("Senegal",198056,listOf(SEN_DK,SEN_DB,SEN_FK,SEN_KF,SEN_KC,SEN_KG,SEN_KD,SEN_LG,SEN_MT,SEN_ST,SEN_SD,SEN_TB,SEN_TH,SEN_ZG)),
SRB("Serbia",78247,listOf(SRB_BO,SRB_BR,SRB_BG,SRB_JA,SRB_JC,SRB_JN,SRB_KB,SRB_MA,SRB_MR,SRB_NS,SRB_PC,SRB_PI,SRB_PD,SRB_PM,SRB_RN,SRB_RS,SRB_SC,SRB_SN,SRB_SD,SRB_SM,SRB_SU,SRB_TO,SRB_ZJ,SRB_ZC,SRB_ZL)),
SYC("Seychelles",492,listOf(SYC_PI,SYC_AB,SYC_ET,SYC_RO,SYC_LO,SYC_BL,SYC_BS,SYC_BV,SYC_BA,SYC_BO,SYC_CA,SYC_RA,SYC_GL,SYC_GM,SYC_GP,SYC_DI,SYC_LM,SYC_MB,SYC_MF,SYC_OI,SYC_PL,SYC_PR,SYC_PG,SYC_RC,SYC_SL,SYC_TA)),
SLE("Sierra Leone",73067,listOf(SLE_EA,SLE_NO,SLE_SO,SLE_WE)),
SGP("Singapore",700,listOf(SGP_NA,SGP_NA,SGP_NA,SGP_NA,SGP_NA)),
SVK("Slovakia",49055,listOf(SVK_BC,SVK_BL,SVK_KI,SVK_NI,SVK_PV,SVK_TC,SVK_TA,SVK_ZI)),
SVN("Slovenia",19951,listOf(SVN_GO,SVN_SP,SVN_NA,SVN_KO,SVN_NO,SVN_JP,SVN_LJ,SVN_PD,SVN_PM,SVN_SA,SVN_PS,SVN_ZS)),
SLB("Solomon Islands",28686,listOf(SLB_CN,SLB_CH,SLB_GU,SLB_CT,SLB_IS,SLB_MK,SLB_ML,SLB_RB,SLB_TE,SLB_WE)),
SOM("Somalia",637672,listOf(SOM_AW,SOM_BK,SOM_BN,SOM_BR,SOM_BY,SOM_GA,SOM_GE,SOM_HI,SOM_JD,SOM_JH,SOM_MU,SOM_NU,SOM_SA,SOM_SD,SOM_SH,SOM_SO,SOM_TO,SOM_WO)),
ZAF("South Africa",1224059,listOf(ZAF_EC,ZAF_FS,ZAF_GT,ZAF_NL,ZAF_NP,ZAF_MP,ZAF_NW,ZAF_NC,ZAF_WC)),
SGS("South Georgiaandthe South Sand",4085,emptyList()),
KOR("South Korea",100721,listOf(KOR_PU,KOR_GB,KOR_GN,KOR_TG,KOR_TJ,KOR_KW,KOR_KJ,KOR_KG,KOR_KB,KOR_KN,KOR_IN,KOR_CJ,KOR_CB,KOR_CN,KOR_SJ,KOR_SO,KOR_UL)),
SSD("South Sudan",632186,listOf(SSD_BG,SSD_EE,SSD_JG,SSD_EB,SSD_NB,SSD_WH,SSD_UN,SSD_WR,SSD_WB,SSD_WE)),
ESP("Spain",506617,listOf(ESP_AN,ESP_AR,ESP_CB,ESP_CM,ESP_CL,ESP_CT,ESP_ML,ESP_MD,ESP_NA,ESP_VC,ESP_EX,ESP_GA,ESP_PM,ESP_CN,ESP_LO,ESP_PV,ESP_AS,ESP_MU)),
LKA("Sri Lanka",66267,listOf(LKA_AP,LKA_AD,LKA_BD,LKA_BC,LKA_CO,LKA_GL,LKA_GQ,LKA_HB,LKA_JA,LKA_KT,LKA_KY,LKA_KE,LKA_KL,LKA_KG,LKA_MB,LKA_MT,LKA_MH,LKA_MJ,LKA_MP,LKA_NW,LKA_PR,LKA_PX,LKA_RN,LKA_TC,LKA_VA)),
SDN("Sudan",1882758,listOf(SDN_GZ,SDN_GD,SDN_BN,SDN_CD,SDN_ED,SDN_KA,SDN_KH,SDN_ND,SDN_KN,SDN_NO,SDN_RS,SDN_RN,SDN_SI,SDN_SD,SDN_KS,SDN_WD,SDN_KN,SDN_WN)),
SUR("Suriname",147402,listOf(SUR_BR,SUR_CM,SUR_CR,SUR_MA,SUR_NI,SUR_PR,SUR_PM,SUR_SA,SUR_SI,SUR_WA)),
SJM("Svalbardand Jan Mayen",59960,listOf(SJM_JN,SJM_SV)),
SWZ("Swaziland",17451,listOf(SWZ_HH,SWZ_LU,SWZ_MA,SWZ_SH)),
SWE("Sweden",448298,listOf(SWE_BL,SWE_KO,SWE_GV,SWE_GT,SWE_HA,SWE_JA,SWE_JO,SWE_KA,SWE_KR,SWE_NB,SWE_OR,SWE_OG,SWE_SN,SWE_SD,SWE_ST,SWE_UP,SWE_VR,SWE_VB,SWE_VN,SWE_VM,SWE_VG)),
CHE("Switzerland",41217,listOf(CHE_AG,CHE_AR,CHE_AI,CHE_BL,CHE_BS,CHE_BE,CHE_FR,CHE_GE,CHE_GL,CHE_GR,CHE_JU,CHE_LU,CHE_NE,CHE_NW,CHE_OW,CHE_SG,CHE_SH,CHE_SZ,CHE_SO,CHE_TG,CHE_TI,CHE_UR,CHE_VS,CHE_VD,CHE_ZG,CHE_ZH)),
SYR("Syria",187360,listOf(SYR_HA,SYR_HL,SYR_RA,SYR_SU,SYR_DI,SYR_DR,SYR_DY,SYR_HM,SYR_HI,SYR_ID,SYR_LA,SYR_QU,SYR_RD,SYR_TA)),
TWN("Taiwan",36571,listOf(TWN_FK,TWN_KH,TWN_NT,TWN_TG,TWN_TN,TWN_TP,TWN_TA)),
TJK("Tajikistan",142330,listOf(TJK_RR,TJK_DU,TJK_BK,TJK_KL,TJK_LE)),
TZA("Tanzania",946695,listOf(TZA_AS,TZA_DS,TZA_DO,TZA_GE,TZA_IG,TZA_KG,TZA_PN,TZA_ZN,TZA_KA,TZA_KM,TZA_KL,TZA_PS,TZA_ZS,TZA_LI,TZA_MY,TZA_MA,TZA_MB,TZA_ZW,TZA_MO,TZA_MT,TZA_MZ,TZA_NJ,TZA_PW,TZA_RU,TZA_RV,TZA_SY,TZA_SI,TZA_SD,TZA_SO,TZA_TB,TZA_TN)),
THA("Thailand",516901,listOf(THA_AC,THA_AT,THA_BM,THA_BK,THA_BR,THA_CC,THA_CN,THA_CY,THA_CT,THA_CM,THA_CR,THA_CB,THA_CP,THA_KL,THA_KP,THA_KN,THA_KK,THA_KR,THA_LG,THA_LN,THA_LE,THA_LB,THA_MH,THA_MS,THA_MD,THA_NN,THA_NP,THA_NF,THA_NR,THA_NS,THA_NT,THA_NA,THA_NW,THA_NB,THA_NK,THA_NO,THA_PT,THA_PI,THA_PG,THA_PL,THA_PY,THA_PH,THA_PE,THA_PC,THA_PS,THA_PA,THA_PR,THA_PU,THA_PB,THA_PK,THA_RN,THA_RT,THA_RY,THA_RE,THA_SK,THA_SN,THA_SP,THA_SS,THA_SM,THA_SR,THA_SA,THA_SI,THA_SB,THA_SG,THA_SO,THA_SH,THA_ST,THA_SU,THA_TK,THA_TG,THA_TT,THA_UR,THA_UN,THA_UT,THA_UD,THA_YL,THA_YS)),
TLS("Timor-Leste",15012,listOf(TLS_AL,TLS_AN,TLS_AM,TLS_BC,TLS_BB,TLS_CL,TLS_DL,TLS_ER,TLS_BT,TLS_LQ,TLS_MT,TLS_MF,TLS_VQ)),
TGO("Togo",57272,listOf(TGO_CE,TGO_KA,TGO_MA,TGO_PL,TGO_SA)),
TKL("Tokelau",15,listOf(TKL_AT,TKL_FA,TKL_NU)),
TON("Tonga",762,listOf(TON_EU,TON_HA,TON_NI,TON_TT,TON_VA)),
TTO("Trinidadand Tobago",5193,listOf(TTO_AR,TTO_CH,TTO_CT,TTO_DM,TTO_MR,TTO_PD,TTO_PF,TTO_PS,TTO_PT,TTO_SF,TTO_SL,TTO_SN,TTO_SI,TTO_TB,TTO_TP)),
TUN("Tunisia",155257,listOf(TUN_AN,TUN_BJ,TUN_BA,TUN_BZ,TUN_GB,TUN_GF,TUN_JE,TUN_KR,TUN_KS,TUN_KB,TUN_KF,TUN_MH,TUN_MN,TUN_ME,TUN_MS,TUN_NB,TUN_SF,TUN_SZ,TUN_SL,TUN_SS,TUN_TA,TUN_TO,TUN_TU,TUN_ZA)),
TUR("Turkey",781794,listOf(TUR_AA,TUR_AD,TUR_AF,TUR_AG,TUR_AK,TUR_AM,TUR_AN,TUR_AL,TUR_AR,TUR_AV,TUR_AY,TUR_BK,TUR_BR,TUR_BM,TUR_BB,TUR_BC,TUR_BG,TUR_BT,TUR_BL,TUR_BD,TUR_BU,TUR_CK,TUR_CI,TUR_CM,TUR_DN,TUR_DY,TUR_DU,TUR_ED,TUR_EG,TUR_EN,TUR_EM,TUR_ES,TUR_GA,TUR_GI,TUR_GU,TUR_HK,TUR_HT,TUR_IG,TUR_IP,TUR_IB,TUR_IZ,TUR_KM,TUR_KB,TUR_KR,TUR_KA,TUR_KS,TUR_KY,TUR_KI,TUR_KK,TUR_KL,TUR_KH,TUR_KC,TUR_KO,TUR_KU,TUR_ML,TUR_MN,TUR_MR,TUR_IC,TUR_MG,TUR_MS,TUR_NV,TUR_NG,TUR_OR,TUR_OS,TUR_RI,TUR_SK,TUR_SS,TUR_SU,TUR_SI,TUR_SP,TUR_SR,TUR_SV,TUR_TG,TUR_TT,TUR_TB,TUR_TC,TUR_US,TUR_VA,TUR_YL,TUR_YZ,TUR_ZO)),
TKM("Turkmenistan",490273,listOf(TKM_AL,TKM_AB,TKM_BA,TKM_DA,TKM_LE,TKM_MA)),
TCA("Turksand Caicos Islands",995,listOf(TCA_NA,TCA_NA,TCA_NA,TCA_NA,TCA_NA,TCA_NA)),
TUV("Tuvalu",40,listOf(TUV_FN,TUV_NG,TUV_NA,TUV_NK,TUV_NT,TUV_NU,TUV_NF,TUV_NL,TUV_VI)),
UGA("Uganda",243045,listOf(UGA_AD,UGA_AC,UGA_AW,UGA_BG,UGA_BN,UGA_BS,UGA_BU,UGA_GL,UGA_HO,UGA_IN,UGA_JI,UGA_KA,UGA_BR,UGA_KD,UGA_KN,UGA_KM,UGA_KX,UGA_KE,UGA_UU,UGA_KP,UGA_KS,UGA_KK,UGA_KY,UGA_KI,UGA_KG,UGA_KR,UGA_TG,UGA_KF,UGA_KU,UGA_KJ,UGA_NA,UGA_NA,UGA_LA,UGA_LW,UGA_MA,UGA_MC,UGA_MG,UGA_ME,UGA_RR,UGA_MT,UGA_MY,UGA_MI,UGA_MD,UGA_MN,UGA_NP,UGA_NA,UGA_NE,UGA_NT,UGA_PD,UGA_PL,UGA_RA,UGA_RK,UGA_SE,UGA_SI,UGA_SR,UGA_TR,UGA_WA,UGA_YU)),
UKR("Ukraine",600816,listOf(UKR_,UKR_CK,UKR_CH,UKR_CV,UKR_KR,UKR_DP,UKR_DT,UKR_IF,UKR_KK,UKR_KS,UKR_KM,UKR_KV,UKR_KC,UKR_KH,UKR_LV,UKR_LH,UKR_MY,UKR_OD,UKR_PL,UKR_RV,UKR_SC,UKR_SM,UKR_TP,UKR_VI,UKR_VO,UKR_ZK,UKR_ZP,UKR_ZT)),
ARE("United Arab Emirates",71429,listOf(ARE_AZ,ARE_AJ,ARE_DU,ARE_FU,ARE_RK,ARE_SH,ARE_UQ)),
GBR("United Kingdom",244732,listOf(GBR_NIR,GBR_SCT,GBR_WLS,GBR_NA,NA_NA)),
USA("United States",9477483,listOf(USA_AL,USA_AK,USA_AZ,USA_AR,USA_CA,USA_CO,USA_CT,USA_DE,USA_DC,USA_FL,USA_GA,USA_HI,USA_ID,USA_IL,USA_IN,USA_IA,USA_KS,USA_KY,USA_LA,USA_ME,USA_MD,USA_MA,USA_MI,USA_MN,USA_MS,USA_MO,USA_MT,USA_NE,USA_NV,USA_NH,USA_NJ,USA_NM,USA_NY,USA_NC,USA_ND,USA_OH,USA_OK,USA_OR,USA_PA,USA_RI,USA_SC,USA_SD,USA_TN,USA_TX,USA_UT,USA_VT,USA_VA,USA_WA,USA_WV,USA_WI,USA_WY)),
UMI("United States Minor Outlying Isl",47,listOf(UMI_NA,UMI_NA,UMI_NA,UMI_NA,UMI_NA,UMI_NA,UMI_NA,UMI_NA,UMI_NA)),
URY("Uruguay",178103,listOf(URY_AR,URY_CA,URY_CL,URY_CO,URY_DU,URY_FS,URY_FD,URY_LA,URY_MA,URY_MO,URY_PA,URY_RN,URY_RV,URY_RO,URY_SA,URY_SJ,URY_SO,URY_TA,URY_TT)),
UZB("Uzbekistan",447894,listOf(UZB_AN,UZB_BU,UZB_FA,UZB_JI,UZB_NG,UZB_NW,UZB_QR,UZB_QA,UZB_SA,UZB_SI,UZB_SU,UZB_TA,UZB_TK,UZB_KH)),
VUT("Vanuatu",12384,listOf(VUT_ML,VUT_PM,VUT_SN,VUT_SE,VUT_TF,VUT_TR)),
VAT("Vatican City",1,emptyList()),
VEN("Venezuela",918303,listOf(VEN_Z,VEN_NA,VEN_C,VEN_D,VEN_E,VEN_NA,VEN_G,VEN_H,VEN_Y,VEN_DP,VEN_A,VEN_NA,VEN_NA,VEN_K,VEN_NA,VEN_M,VEN_N,VEN_O,VEN_P,VEN_R,VEN_NA,VEN_T,VEN_NA,VEN_U,VEN_V)),
VNM("Vietnam",331121,listOf(VNM_AG,VNM_BV,VNM_BG,VNM_BK,VNM_BL,VNM_BN,VNM_BR,VNM_BD,VNM_BI,VNM_BP,VNM_BU,VNM_CM,VNM_CN,VNM_CB,VNM_DA,VNM_DC,VNM_DO,VNM_DB,VNM_DN,VNM_DT,VNM_GL,VNM_HG,VNM_HM,VNM_HI,VNM_HT,VNM_HD,VNM_HP,VNM_HU,VNM_HC,VNM_HO,VNM_HY,VNM_KH,VNM_KG,VNM_KT,VNM_LI,VNM_LD,VNM_LS,VNM_LO,VNM_LA,VNM_ND,VNM_NA,VNM_NB,VNM_NT,VNM_PT,VNM_PY,VNM_QB,VNM_QM,VNM_QG,VNM_QN,VNM_QT,VNM_ST,VNM_SL,VNM_TN,VNM_TB,VNM_TY,VNM_TH,VNM_TT,VNM_TG,VNM_TV,VNM_TQ,VNM_VL,VNM_VC,VNM_YB)),
VIR("Virgin Islands, U.S.",364,listOf(VIR_SC,VIR_SJ,VIR_ST)),
WLF("Wallisand Futuna",157,listOf(WLF_AL,WLF_SI,WLF_UV)),
ESH("Western Sahara",268500,listOf(ESH_BO,ESH_ES,ESH_LA,ESH_OD)),
YEM("Yemen",454747,listOf(YEM_AD,YEM_AB,YEM_BA,YEM_DL,YEM_HU,YEM_JA,YEM_MR,YEM_MW,YEM_13,YEM_AM,YEM_DH,YEM_HD,YEM_HJ,YEM_IB,YEM_LA,YEM_MA,YEM_31,YEM_SD,YEM_SN,YEM_SH,YEM_TA)),
ZMB("Zambia",755679,listOf(ZMB_CE,ZMB_CO,ZMB_EA,ZMB_LP,ZMB_LS,ZMB_MU,ZMB_NW,ZMB_NO,ZMB_SO,ZMB_WE)),
ZWE("Zimbabwe",392107,listOf(ZWE_BU,ZWE_HA,ZWE_MA,ZWE_MC,ZWE_ME,ZWE_MW,ZWE_MV,ZWE_MN,ZWE_MS,ZWE_MI)),