+
+
+
-
{`v${current}`}
+
{`v${current}`}
);
diff --git a/components/layout/Footer.module.css b/components/layout/Footer.module.css
index 7c671d7e..a83c8c3c 100644
--- a/components/layout/Footer.module.css
+++ b/components/layout/Footer.module.css
@@ -4,4 +4,15 @@
align-items: center;
font-size: var(--font-size-small);
min-height: 100px;
+ text-align: center;
+}
+
+.version {
+ text-align: right;
+}
+
+@media only screen and (max-width: 768px) {
+ .version {
+ text-align: center;
+ }
}
diff --git a/components/metrics/MetricsBar.module.css b/components/metrics/MetricsBar.module.css
index 4546f893..b13e974f 100644
--- a/components/metrics/MetricsBar.module.css
+++ b/components/metrics/MetricsBar.module.css
@@ -1,6 +1,7 @@
.bar {
display: flex;
cursor: pointer;
+ min-height: 80px;
}
.bar > div + div {
diff --git a/components/settings/LanguageButton.module.css b/components/settings/LanguageButton.module.css
index da909df5..e1f840d5 100644
--- a/components/settings/LanguageButton.module.css
+++ b/components/settings/LanguageButton.module.css
@@ -8,5 +8,18 @@
.menu div {
border-radius: 5px;
- min-width: 33%;
+ min-width: calc(100% / 3);
+}
+
+@media only screen and (max-width: 992px) {
+ .menu {
+ min-width: 90vw;
+ transform: translateX(calc(40vw));
+ }
+}
+
+@media only screen and (max-width: 768px) {
+ .menu div {
+ min-width: 50%;
+ }
}
diff --git a/lang/id-ID.json b/lang/id-ID.json
new file mode 100644
index 00000000..8099cd75
--- /dev/null
+++ b/lang/id-ID.json
@@ -0,0 +1,97 @@
+{
+ "button.add-account": "Tambah akun",
+ "button.add-website": "Tambah situs web",
+ "button.back": "Kembali",
+ "button.cancel": "Batal",
+ "button.change-password": "Ganti password",
+ "button.copy-to-clipboard": "Salin ke papan klip",
+ "button.date-range": "Rentang tanggal",
+ "button.delete": "Hapus",
+ "button.dismiss": "Tutup",
+ "button.edit": "Sunting",
+ "button.login": "Masuk",
+ "button.more": "Lebih banyak",
+ "button.refresh": "Segarkan",
+ "button.reset": "Atur ulang",
+ "button.save": "Simpan",
+ "button.single-day": "Sehari",
+ "button.view-details": "Lihat Detil",
+ "label.accounts": "Akun",
+ "label.administrator": "Pengelola",
+ "label.confirm-password": "Konfirmasi kata sandi",
+ "label.current-password": "Kata sandi sekarang",
+ "label.custom-range": "Rentang khusus",
+ "label.dashboard": "Dasbor",
+ "label.default-date-range": "Rentang tanggal default",
+ "label.domain": "Domain",
+ "label.enable-share-url": "Aktifkan URL berbagi",
+ "label.invalid": "Tidak valid",
+ "label.invalid-domain": "Domain tidak valid",
+ "label.last-days": "{x} hari terakhir",
+ "label.last-hours": "{x} jam terakhir",
+ "label.logged-in-as": "Masuk sebagai {username}",
+ "label.logout": "Keluar",
+ "label.name": "Nama",
+ "label.new-password": "Kata sandi baru",
+ "label.password": "Kata sandi",
+ "label.passwords-dont-match": "Kata sandi tidak cocok",
+ "label.profile": "Profil",
+ "label.required": "Wajib",
+ "label.settings": "Pengaturan",
+ "label.this-month": "Bulan ini",
+ "label.this-week": "Minggu ini",
+ "label.this-year": "Tahun ini",
+ "label.timezone": "Zona waktu",
+ "label.today": "Hari ini",
+ "label.unknown": "Tidak diketahui",
+ "label.username": "Nama pengguna",
+ "label.websites": "Situs web",
+ "message.active-users": "{x} pengunjung saat ini",
+ "message.confirm-delete": "Apakah kamu yakin ingin menghapus {target}?",
+ "message.copied": "Tersalin!",
+ "message.delete-warning": "Semua data terkait juga akan dihapus.",
+ "message.failure": "Ada yang salah.",
+ "message.get-share-url": "Dapatkan URL berbagi",
+ "message.get-tracking-code": "Dapatkan kode pelacakan",
+ "message.go-to-settings": "Pergi ke pengaturan",
+ "message.incorrect-username-password": "Nama pengguna/kata sandi salah.",
+ "message.new-version-available": "Versi terbaru umami {version} telah tersedia!",
+ "message.no-data-available": "Tidak ada data.",
+ "message.no-websites-configured": "Anda tidak memiliki situs web yang dikonfigurasi.",
+ "message.page-not-found": "Halaman tidak ditemukan.",
+ "message.powered-by": "Didukung oleh {name}",
+ "message.save-success": "Berhasil disimpan.",
+ "message.share-url": "Ini adalah URL yang dibagikan secara publik untuk {target}.",
+ "message.track-stats": "Untuk melacak statistik {target}, tempatkan kode berikut di bagian {head} situs web anda.",
+ "message.type-delete": "Ketikkan {delete} pada kotak di bawah untuk konfirmasi.",
+ "metrics.actions": "Aksi",
+ "metrics.average-visit-time": "Waktu kunjungan rata-rata",
+ "metrics.bounce-rate": "Tingkat bouncing",
+ "metrics.browsers": "Browser",
+ "metrics.countries": "Negara",
+ "metrics.device.desktop": "Desktop",
+ "metrics.device.laptop": "Laptop",
+ "metrics.device.mobile": "Ponsel",
+ "metrics.device.tablet": "Tablet",
+ "metrics.devices": "Perangkat",
+ "metrics.events": "Perihal",
+ "metrics.filter.combined": "Gabungan",
+ "metrics.filter.domain-only": "Hanya domain",
+ "metrics.filter.raw": "Raw",
+ "metrics.operating-systems": "Sistem Operasi",
+ "metrics.page-views": "Tampilan halaman",
+ "metrics.pages": "Halaman",
+ "metrics.referrers": "Perujuk",
+ "metrics.unique-visitors": "Pengunjung unik",
+ "metrics.views": "Tampilan",
+ "metrics.visitors": "Pengunjung",
+ "title.add-account": "Tambah akun",
+ "title.add-website": "Tambah situs web",
+ "title.change-password": "Ganti kata sandi",
+ "title.delete-account": "Hapus akun",
+ "title.delete-website": "Hapus situs web",
+ "title.edit-account": "Sunting akun",
+ "title.edit-website": "Sunting situs web",
+ "title.share-url": "Bagikan URL",
+ "title.tracking-code": "Kode lacak"
+}
diff --git a/lang/uk-UA.json b/lang/uk-UA.json
new file mode 100644
index 00000000..9c5065bf
--- /dev/null
+++ b/lang/uk-UA.json
@@ -0,0 +1,97 @@
+{
+ "button.add-account": "Додати обліковий запис",
+ "button.add-website": "Додати веб-сайт",
+ "button.back": "Назад",
+ "button.cancel": "Відмінити",
+ "button.change-password": "Змінити пароль",
+ "button.copy-to-clipboard": "Копіювати до буферу обміну",
+ "button.date-range": "Діапазон дат",
+ "button.delete": "Видалити",
+ "button.dismiss": "Відхилити",
+ "button.edit": "Редагувати",
+ "button.login": "Увійти",
+ "button.more": "Більше",
+ "button.refresh": "Оновити",
+ "button.reset": "Скинути",
+ "button.save": "Зберегти",
+ "button.single-day": "Один день",
+ "button.view-details": "Переглянути деталі",
+ "label.accounts": "Облікові записи",
+ "label.administrator": "Адміністратор",
+ "label.confirm-password": "Підтвердити пароль",
+ "label.current-password": "Поточний пароль",
+ "label.custom-range": "Довільний період",
+ "label.dashboard": "Інформаційна панель",
+ "label.default-date-range": "Діапазон дат за умовчанням",
+ "label.domain": "Домен",
+ "label.enable-share-url": "Дозволити ділитися посиланням",
+ "label.invalid": "Некоректний",
+ "label.invalid-domain": "Некоректний домен",
+ "label.last-days": "Останні {x} днів",
+ "label.last-hours": "Останні {x} годин",
+ "label.logged-in-as": "Ви увійшли як {username}",
+ "label.logout": "Вийти",
+ "label.name": "Ім'я",
+ "label.new-password": "Новий пароль",
+ "label.password": "Пароль",
+ "label.passwords-dont-match": "Паролі не співпадають",
+ "label.profile": "Профіль",
+ "label.required": "Обов'язкове",
+ "label.settings": "Налаштування",
+ "label.this-month": "Поточний місяць",
+ "label.this-week": "Поточний тиждень",
+ "label.this-year": "Поточний рік",
+ "label.timezone": "Часовий пояс",
+ "label.today": "Сьогодні",
+ "label.unknown": "Невідомо",
+ "label.username": "Ім'я користувача",
+ "label.websites": "Веб-сайти",
+ "message.active-users": "{x} поточних відвідувачів",
+ "message.confirm-delete": "Ви впевнені, що бажаєте видалити {target}?",
+ "message.copied": "Скопійовано!",
+ "message.delete-warning": "Усі пов'язані дані будуть видалені також.",
+ "message.failure": "Щось пішло не так.",
+ "message.get-share-url": "Отримати публічне посилання",
+ "message.get-tracking-code": "Отримати код для відслідковування",
+ "message.go-to-settings": "Перейти до налаштувань",
+ "message.incorrect-username-password": "Невірне ім'я користувача або пароль.",
+ "message.new-version-available": "Нова версія umami {version} доступна!",
+ "message.no-data-available": "Немає даних.",
+ "message.no-websites-configured": "У вас немає налаштованих веб-сайтів.",
+ "message.page-not-found": "Сторінку не знайдено.",
+ "message.powered-by": "На базі {name}",
+ "message.save-success": "Збережено успішно.",
+ "message.share-url": "Це публічне посилання для {target}.",
+ "message.track-stats": "Або відслідковувати статистику для {target}, розмістіть наступний код у {head} секції вашого веб-сайту.",
+ "message.type-delete": "Введіть {delete} у полі нижче щоб підтвердити.",
+ "metrics.actions": "Дії",
+ "metrics.average-visit-time": "Середній час візиту",
+ "metrics.bounce-rate": "Показник відмов",
+ "metrics.browsers": "Браузери",
+ "metrics.countries": "Країни",
+ "metrics.device.desktop": "Настільний комп'ютер",
+ "metrics.device.laptop": "Ноутбук",
+ "metrics.device.mobile": "Мобільний",
+ "metrics.device.tablet": "Планшет",
+ "metrics.devices": "Пристрої",
+ "metrics.events": "Події",
+ "metrics.filter.combined": "Об'єднані",
+ "metrics.filter.domain-only": "Лише домен",
+ "metrics.filter.raw": "Сирі дані",
+ "metrics.operating-systems": "Операційна система",
+ "metrics.page-views": "Перегляди сторінок",
+ "metrics.pages": "Сторінки",
+ "metrics.referrers": "Джерела",
+ "metrics.unique-visitors": "Унікальні відвідувачі",
+ "metrics.views": "Перегляди",
+ "metrics.visitors": "Відвідувачі",
+ "title.add-account": "Додати обліковий запис",
+ "title.add-website": "Додати website",
+ "title.change-password": "Змінити пароль",
+ "title.delete-account": "Видалити обліковий запис",
+ "title.delete-website": "Видалити веб-сайт",
+ "title.edit-account": "Редагувати обліковий запис",
+ "title.edit-website": "Редагувати веб-сайт",
+ "title.share-url": "Поділитися посилання",
+ "title.tracking-code": "Код для відслідковування"
+}
diff --git a/lib/lang.js b/lib/lang.js
index 388c58e5..200ac893 100644
--- a/lib/lang.js
+++ b/lib/lang.js
@@ -1,5 +1,23 @@
import { format } from 'date-fns';
-import { enUS, nl, zhCN, tr, ru, de, ja, es, fr, da, sv, el, pt, ro, nb } from 'date-fns/locale';
+import {
+ enUS,
+ nl,
+ zhCN,
+ tr,
+ ru,
+ de,
+ ja,
+ es,
+ fr,
+ da,
+ sv,
+ el,
+ pt,
+ ro,
+ nb,
+ id,
+ uk,
+} from 'date-fns/locale';
import enMessages from 'lang-compiled/en-US.json';
import nlMessages from 'lang-compiled/nl-NL.json';
import zhCNMessages from 'lang-compiled/zh-CN.json';
@@ -17,6 +35,8 @@ import foMessages from 'lang-compiled/fo-FO.json';
import ptMessages from 'lang-compiled/pt-PT.json';
import roMessages from 'lang-compiled/ro-RO.json';
import nbNOMessages from 'lang-compiled/nb-NO.json';
+import idMessages from 'lang-compiled/id-ID.json';
+import ukMessages from 'lang-compiled/uk-UA.json';
export const messages = {
'en-US': enMessages,
@@ -36,6 +56,8 @@ export const messages = {
'pt-PT': ptMessages,
'ro-RO': roMessages,
'nb-NO': nbNOMessages,
+ 'id-ID': idMessages,
+ 'uk-UA': ukMessages,
};
export const dateLocales = {
@@ -56,6 +78,8 @@ export const dateLocales = {
'pt-PT': pt,
'ro-RO': ro,
'nb-NO': nb,
+ 'id-ID': id,
+ 'uk-UA': uk,
};
export const menuOptions = [
@@ -67,6 +91,7 @@ export const menuOptions = [
{ label: 'Føroyskt', value: 'fo-FO', display: 'fo' },
{ label: 'Français', value: 'fr-FR', display: 'fr' },
{ label: 'Ελληνικά', value: 'el-GR', display: 'el' },
+ { label: 'Bahasa Indonesia', value: 'id-ID', display: 'id' },
{ label: '日本語', value: 'ja-JP', display: 'ja' },
{ label: 'Монгол', value: 'mn-MN', display: 'mn' },
{ label: 'Nederlands', value: 'nl-NL', display: 'nl' },
@@ -76,6 +101,7 @@ export const menuOptions = [
{ label: 'Română', value: 'ro-RO', display: 'ro' },
{ label: 'Svenska', value: 'sv-SE', display: 'sv' },
{ label: 'Türkçe', value: 'tr-TR', display: 'tr' },
+ { label: 'українська', value: 'uk-UA', display: 'uk' },
];
export function dateFormat(date, str, locale) {
diff --git a/lib/session.js b/lib/session.js
index 0488b730..3d2fc7bc 100644
--- a/lib/session.js
+++ b/lib/session.js
@@ -1,6 +1,6 @@
import { getWebsiteByUuid, getSessionByUuid, createSession } from 'lib/queries';
import { getClientInfo } from 'lib/request';
-import { uuid, isValidUuid } from 'lib/crypto';
+import { uuid, isValidUuid, parseToken } from 'lib/crypto';
export async function getSession(req) {
const { payload } = req.body;
@@ -9,7 +9,15 @@ export async function getSession(req) {
throw new Error('Invalid request');
}
- const { website: website_uuid, hostname, screen, language } = payload;
+ const { website: website_uuid, hostname, screen, language, cache } = payload;
+
+ if (cache) {
+ const result = await parseToken(cache);
+
+ if (result) {
+ return result;
+ }
+ }
if (!isValidUuid(website_uuid)) {
throw new Error(`Invalid website: ${website_uuid}`);
diff --git a/package.json b/package.json
index df40306e..9c6e899e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.72.0",
+ "version": "0.74.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao
",
"license": "MIT",
@@ -32,6 +32,7 @@
"format-lang": "node scripts/format-lang.js",
"compile-lang": "formatjs compile-folder --ast build lang-compiled",
"check-lang": "node scripts/check-lang.js",
+ "download-country-names": "node scripts/download-country-names.js",
"loadtest": "node scripts/loadtest.js",
"loadtest:medium": "node scripts/loadtest.js --weight=medium",
"loadtest:heavy": "node scripts/loadtest.js --weight=heavy --verbose"
diff --git a/pages/api/collect.js b/pages/api/collect.js
index 399e88e9..e6b3e0ca 100644
--- a/pages/api/collect.js
+++ b/pages/api/collect.js
@@ -1,7 +1,8 @@
+import isBot from 'isbot-fast';
import { savePageView, saveEvent } from 'lib/queries';
import { useCors, useSession } from 'lib/middleware';
import { ok, badRequest } from 'lib/response';
-import isBot from 'isbot-fast';
+import { createToken } from 'lib/crypto';
export default async (req, res) => {
if (isBot(req.headers['user-agent'])) {
@@ -28,5 +29,7 @@ export default async (req, res) => {
return badRequest(res);
}
- return ok(res);
+ const token = await createToken({ website_id, session_id });
+
+ return ok(res, token);
};
diff --git a/public/country/id-ID.json b/public/country/id-ID.json
new file mode 100644
index 00000000..13a6220a
--- /dev/null
+++ b/public/country/id-ID.json
@@ -0,0 +1 @@
+{"AF":"Afganistan","ZA":"Afrika Selatan","AL":"Albania","DZ":"Aljazair","US":"Amerika Serikat","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktika","AG":"Antigua dan Barbuda","SA":"Arab Saudi","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaijan","BS":"Bahama","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","NL":"Belanda","BQ":"Belanda Karibia","BY":"Belarus","BE":"Belgia","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia dan Herzegovina","BW":"Botswana","BR":"Brasil","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","TD":"Cad","CZ":"Ceko","CL":"Cile","CI":"C\u00f4te d\u2019Ivoire","CW":"Cura\u00e7ao","DK":"Denmark","DM":"Dominika","EC":"Ekuador","SV":"El Salvador","ER":"Eritrea","EE":"Estonia","SZ":"eSwatini","ET":"Etiopia","FJ":"Fiji","PH":"Filipina","FI":"Finlandia","GA":"Gabon","GM":"Gambia","GE":"Georgia","GS":"Georgia Selatan & Kep. Sandwich Selatan","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GL":"Grinlandia","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GQ":"Guinea Ekuatorial","GW":"Guinea-Bissau","GY":"Guyana","GF":"Guyana Prancis","HT":"Haiti","HN":"Honduras","HK":"Hong Kong DAK Tiongkok","HU":"Hungaria","IN":"India","ID":"Indonesia","GB":"Inggris Raya","IQ":"Irak","IR":"Iran","IE":"Irlandia","IS":"Islandia","IL":"Israel","IT":"Italia","JM":"Jamaika","JP":"Jepang","DE":"Jerman","JE":"Jersey","DJ":"Jibuti","NC":"Kaledonia Baru","KH":"Kamboja","CM":"Kamerun","CA":"Kanada","KZ":"Kazakstan","KE":"Kenya","AX":"Kepulauan Aland","KY":"Kepulauan Cayman","CC":"Kepulauan Cocos (Keeling)","CK":"Kepulauan Cook","FK":"Kepulauan Falkland","FO":"Kepulauan Faroe","MP":"Kepulauan Mariana Utara","MH":"Kepulauan Marshall","NF":"Kepulauan Norfolk","PN":"Kepulauan Pitcairn","SB":"Kepulauan Solomon","SJ":"Kepulauan Svalbard dan Jan Mayen","UM":"Kepulauan Terluar A.S.","TC":"Kepulauan Turks dan Caicos","VI":"Kepulauan Virgin Amerika Serikat","VG":"Kepulauan Virgin Britania Raya","WF":"Kepulauan Wallis dan Futuna","KG":"Kirgistan","KI":"Kiribati","CO":"Kolombia","KM":"Komoro","CG":"Kongo - Brazzaville","CD":"Kongo - Kinshasa","KR":"Korea Selatan","KP":"Korea Utara","CR":"Kosta Rika","HR":"Kroasia","CU":"Kuba","KW":"Kuwait","LA":"Laos","LV":"Latvia","LB":"Lebanon","LS":"Lesotho","LR":"Liberia","LY":"Libia","LI":"Liechtenstein","LT":"Lituania","LU":"Luksemburg","MG":"Madagaskar","MO":"Makau DAK Tiongkok","MK":"Makedonia Utara","MV":"Maladewa","MW":"Malawi","MY":"Malaysia","ML":"Mali","MT":"Malta","MA":"Maroko","MQ":"Martinik","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Meksiko","EG":"Mesir","FM":"Mikronesia","MD":"Moldova","MC":"Monako","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NE":"Niger","NG":"Nigeria","NI":"Nikaragua","NU":"Niue","NO":"Norwegia","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Nugini","PY":"Paraguay","PE":"Peru","PL":"Polandia","PF":"Polinesia Prancis","PT":"Portugal","FR":"Prancis","PR":"Puerto Riko","BV":"Pulau Bouvet","HM":"Pulau Heard dan Kepulauan McDonald","IM":"Pulau Man","CX":"Pulau Natal","QA":"Qatar","CF":"Republik Afrika Tengah","DO":"Republik Dominika","RE":"R\u00e9union","RO":"Rumania","RU":"Rusia","RW":"Rwanda","EH":"Sahara Barat","BL":"Saint Barth\u00e9lemy","SH":"Saint Helena","KN":"Saint Kitts dan Nevis","LC":"Saint Lucia","MF":"Saint Martin","PM":"Saint Pierre dan Miquelon","VC":"Saint Vincent dan Grenadine","WS":"Samoa","AS":"Samoa Amerika","SM":"San Marino","ST":"Sao Tome dan Principe","NZ":"Selandia Baru","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapura","SX":"Sint Maarten","CY":"Siprus","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","ES":"Spanyol","LK":"Sri Lanka","SD":"Sudan","SS":"Sudan Selatan","SY":"Suriah","SR":"Suriname","SE":"Swedia","CH":"Swiss","TW":"Taiwan","TJ":"Tajikistan","CV":"Tanjung Verde","TZ":"Tanzania","TH":"Thailand","TL":"Timor Leste","CN":"Tiongkok","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad dan Tobago","TN":"Tunisia","TR":"Turki","TM":"Turkimenistan","TV":"Tuvalu","UG":"Uganda","UA":"Ukraina","AE":"Uni Emirat Arab","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VA":"Vatikan","VE":"Venezuela","VN":"Vietnam","IO":"Wilayah Inggris di Samudra Hindia","PS":"Wilayah Palestina","TF":"Wilayah Selatan Perancis","YE":"Yaman","JO":"Yordania","GR":"Yunani","ZM":"Zambia","ZW":"Zimbabwe"}
\ No newline at end of file
diff --git a/public/country/uk-UA.json b/public/country/uk-UA.json
new file mode 100644
index 00000000..b2605d87
--- /dev/null
+++ b/public/country/uk-UA.json
@@ -0,0 +1 @@
+{"AU":"\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0456\u044f","AT":"\u0410\u0432\u0441\u0442\u0440\u0456\u044f","AZ":"\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d","AX":"\u0410\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","AL":"\u0410\u043b\u0431\u0430\u043d\u0456\u044f","DZ":"\u0410\u043b\u0436\u0438\u0440","AS":"\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0435 \u0421\u0430\u043c\u043e\u0430","AO":"\u0410\u043d\u0433\u043e\u043b\u0430","AI":"\u0410\u043d\u0491\u0456\u043b\u044c\u044f","AD":"\u0410\u043d\u0434\u043e\u0440\u0440\u0430","AQ":"\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u043a\u0430","AG":"\u0410\u043d\u0442\u0438\u0491\u0443\u0430 \u0456 \u0411\u0430\u0440\u0431\u0443\u0434\u0430","AR":"\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430","AW":"\u0410\u0440\u0443\u0431\u0430","AF":"\u0410\u0444\u0433\u0430\u043d\u0456\u0441\u0442\u0430\u043d","BS":"\u0411\u0430\u0433\u0430\u043c\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","BD":"\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448","BB":"\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441","BH":"\u0411\u0430\u0445\u0440\u0435\u0439\u043d","BZ":"\u0411\u0435\u043b\u0456\u0437","BE":"\u0411\u0435\u043b\u044c\u0491\u0456\u044f","BJ":"\u0411\u0435\u043d\u0456\u043d","BM":"\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","BY":"\u0411\u0456\u043b\u043e\u0440\u0443\u0441\u044c","BG":"\u0411\u043e\u043b\u0433\u0430\u0440\u0456\u044f","BO":"\u0411\u043e\u043b\u0456\u0432\u0456\u044f","BA":"\u0411\u043e\u0441\u043d\u0456\u044f \u0456 \u0413\u0435\u0440\u0446\u0435\u0491\u043e\u0432\u0438\u043d\u0430","BW":"\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0430","BR":"\u0411\u0440\u0430\u0437\u0456\u043b\u0456\u044f","IO":"\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u0430 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0456\u044f \u0432 \u0406\u043d\u0434\u0456\u0439\u0441\u044c\u043a\u043e\u043c\u0443 \u041e\u043a\u0435\u0430\u043d\u0456","VG":"\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u044c\u043a\u0456 \u0412\u0456\u0440\u0433\u0456\u043d\u0441\u044c\u043a\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438","BN":"\u0411\u0440\u0443\u043d\u0435\u0439","BF":"\u0411\u0443\u0440\u043a\u0456\u043d\u0430-\u0424\u0430\u0441\u043e","BI":"\u0411\u0443\u0440\u0443\u043d\u0434\u0456","BT":"\u0411\u0443\u0442\u0430\u043d","VU":"\u0412\u0430\u043d\u0443\u0430\u0442\u0443","VA":"\u0412\u0430\u0442\u0438\u043a\u0430\u043d","GB":"\u0412\u0435\u043b\u0438\u043a\u0430 \u0411\u0440\u0438\u0442\u0430\u043d\u0456\u044f","VE":"\u0412\u0435\u043d\u0435\u0441\u0443\u0435\u043b\u0430","UM":"\u0412\u0456\u0434\u0434\u0430\u043b\u0435\u043d\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438 \u0421\u0428\u0410","VI":"\u0412\u0456\u0440\u0433\u0456\u043d\u0441\u044c\u043a\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438, \u0421\u0428\u0410","AM":"\u0412\u0456\u0440\u043c\u0435\u043d\u0456\u044f","VN":"\u0412\u02bc\u0454\u0442\u043d\u0430\u043c","GA":"\u0413\u0430\u0431\u043e\u043d","HT":"\u0413\u0430\u0457\u0442\u0456","GM":"\u0413\u0430\u043c\u0431\u0456\u044f","GH":"\u0413\u0430\u043d\u0430","GN":"\u0413\u0432\u0456\u043d\u0435\u044f","GW":"\u0413\u0432\u0456\u043d\u0435\u044f-\u0411\u0456\u0441\u0430\u0443","HN":"\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441","HK":"\u0413\u043e\u043d\u043a\u043e\u043d\u0433, \u041e.\u0410.\u0420. \u041a\u0438\u0442\u0430\u044e","GR":"\u0413\u0440\u0435\u0446\u0456\u044f","GE":"\u0413\u0440\u0443\u0437\u0456\u044f","GY":"\u0490\u0430\u0439\u0430\u043d\u0430","GP":"\u0490\u0432\u0430\u0434\u0435\u043b\u0443\u043f\u0430","GT":"\u0490\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430","GG":"\u0490\u0435\u0440\u043d\u0441\u0456","GI":"\u0490\u0456\u0431\u0440\u0430\u043b\u0442\u0430\u0440","GD":"\u0490\u0440\u0435\u043d\u0430\u0434\u0430","GL":"\u0490\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0456\u044f","GU":"\u0490\u0443\u0430\u043c","DK":"\u0414\u0430\u043d\u0456\u044f","JE":"\u0414\u0436\u0435\u0440\u0441\u0456","DJ":"\u0414\u0436\u0438\u0431\u0443\u0442\u0456","DM":"\u0414\u043e\u043c\u0456\u043d\u0456\u043a\u0430","DO":"\u0414\u043e\u043c\u0456\u043d\u0456\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0430","EC":"\u0415\u043a\u0432\u0430\u0434\u043e\u0440","GQ":"\u0415\u043a\u0432\u0430\u0442\u043e\u0440\u0456\u0430\u043b\u044c\u043d\u0430 \u0413\u0432\u0456\u043d\u0435\u044f","ER":"\u0415\u0440\u0438\u0442\u0440\u0435\u044f","SZ":"\u0415\u0441\u0432\u0430\u0442\u0456\u043d\u0456","EE":"\u0415\u0441\u0442\u043e\u043d\u0456\u044f","ET":"\u0415\u0444\u0456\u043e\u043f\u0456\u044f","EG":"\u0404\u0433\u0438\u043f\u0435\u0442","YE":"\u0404\u043c\u0435\u043d","ZM":"\u0417\u0430\u043c\u0431\u0456\u044f","EH":"\u0417\u0430\u0445\u0456\u0434\u043d\u0430 \u0421\u0430\u0445\u0430\u0440\u0430","ZW":"\u0417\u0456\u043c\u0431\u0430\u0431\u0432\u0435","IL":"\u0406\u0437\u0440\u0430\u0457\u043b\u044c","IN":"\u0406\u043d\u0434\u0456\u044f","ID":"\u0406\u043d\u0434\u043e\u043d\u0435\u0437\u0456\u044f","IQ":"\u0406\u0440\u0430\u043a","IR":"\u0406\u0440\u0430\u043d","IE":"\u0406\u0440\u043b\u0430\u043d\u0434\u0456\u044f","IS":"\u0406\u0441\u043b\u0430\u043d\u0434\u0456\u044f","ES":"\u0406\u0441\u043f\u0430\u043d\u0456\u044f","IT":"\u0406\u0442\u0430\u043b\u0456\u044f","JO":"\u0419\u043e\u0440\u0434\u0430\u043d\u0456\u044f","CV":"\u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435","KZ":"\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d","KY":"\u041a\u0430\u0439\u043c\u0430\u043d\u043e\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","KH":"\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0430","CM":"\u041a\u0430\u043c\u0435\u0440\u0443\u043d","CA":"\u041a\u0430\u043d\u0430\u0434\u0430","QA":"\u041a\u0430\u0442\u0430\u0440","KE":"\u041a\u0435\u043d\u0456\u044f","KG":"\u041a\u0438\u0440\u0433\u0438\u0437\u0441\u0442\u0430\u043d","CN":"\u041a\u0438\u0442\u0430\u0439","CY":"\u041a\u0456\u043f\u0440","KI":"\u041a\u0456\u0440\u0456\u0431\u0430\u0442\u0456","CC":"\u041a\u043e\u043a\u043e\u0441\u043e\u0432\u0456 (\u041a\u0456\u043b\u0456\u043d\u0491) \u041e\u0441\u0442\u0440\u043e\u0432\u0438","CO":"\u041a\u043e\u043b\u0443\u043c\u0431\u0456\u044f","KM":"\u041a\u043e\u043c\u043e\u0440\u0438","CG":"\u041a\u043e\u043d\u0433\u043e \u2013 \u0411\u0440\u0430\u0437\u0437\u0430\u0432\u0456\u043b\u044c","CD":"\u041a\u043e\u043d\u0433\u043e \u2013 \u041a\u0456\u043d\u0448\u0430\u0441\u0430","CR":"\u041a\u043e\u0441\u0442\u0430-\u0420\u0456\u043a\u0430","CI":"\u041a\u043e\u0442-\u0434\u02bc\u0406\u0432\u0443\u0430\u0440","CU":"\u041a\u0443\u0431\u0430","KW":"\u041a\u0443\u0432\u0435\u0439\u0442","CW":"\u041a\u044e\u0440\u0430\u0441\u0430\u043e","LA":"\u041b\u0430\u043e\u0441","LV":"\u041b\u0430\u0442\u0432\u0456\u044f","LS":"\u041b\u0435\u0441\u043e\u0442\u043e","LT":"\u041b\u0438\u0442\u0432\u0430","LR":"\u041b\u0456\u0431\u0435\u0440\u0456\u044f","LB":"\u041b\u0456\u0432\u0430\u043d","LY":"\u041b\u0456\u0432\u0456\u044f","LI":"\u041b\u0456\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d","LU":"\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0491","MR":"\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0456\u044f","MU":"\u041c\u0430\u0432\u0440\u0456\u043a\u0456\u0439","MG":"\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440","YT":"\u041c\u0430\u0439\u043e\u0442\u0442\u0430","MO":"\u041c\u0430\u043a\u0430\u043e, \u041e.\u0410.\u0420 \u041a\u0438\u0442\u0430\u044e","MW":"\u041c\u0430\u043b\u0430\u0432\u0456","MY":"\u041c\u0430\u043b\u0430\u0439\u0437\u0456\u044f","ML":"\u041c\u0430\u043b\u0456","MV":"\u041c\u0430\u043b\u044c\u0434\u0456\u0432\u0438","MT":"\u041c\u0430\u043b\u044c\u0442\u0430","MA":"\u041c\u0430\u0440\u043e\u043a\u043a\u043e","MQ":"\u041c\u0430\u0440\u0442\u0456\u043d\u0456\u043a\u0430","MH":"\u041c\u0430\u0440\u0448\u0430\u043b\u043b\u043e\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","MX":"\u041c\u0435\u043a\u0441\u0438\u043a\u0430","FM":"\u041c\u0456\u043a\u0440\u043e\u043d\u0435\u0437\u0456\u044f","MZ":"\u041c\u043e\u0437\u0430\u043c\u0431\u0456\u043a","MD":"\u041c\u043e\u043b\u0434\u043e\u0432\u0430","MC":"\u041c\u043e\u043d\u0430\u043a\u043e","MN":"\u041c\u043e\u043d\u0433\u043e\u043b\u0456\u044f","MS":"\u041c\u043e\u043d\u0442\u0441\u0435\u0440\u0440\u0430\u0442","MM":"\u041c\u02bc\u044f\u043d\u043c\u0430 (\u0411\u0456\u0440\u043c\u0430)","NA":"\u041d\u0430\u043c\u0456\u0431\u0456\u044f","NR":"\u041d\u0430\u0443\u0440\u0443","NP":"\u041d\u0435\u043f\u0430\u043b","NE":"\u041d\u0456\u0433\u0435\u0440","NG":"\u041d\u0456\u0433\u0435\u0440\u0456\u044f","NL":"\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0438","BQ":"\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0456 \u041a\u0430\u0440\u0438\u0431\u0441\u044c\u043a\u0456 \u043e\u0441\u0442\u0440\u043e\u0432\u0438","NI":"\u041d\u0456\u043a\u0430\u0440\u0430\u0491\u0443\u0430","DE":"\u041d\u0456\u043c\u0435\u0447\u0447\u0438\u043d\u0430","NU":"\u041d\u0456\u0443\u0435","NZ":"\u041d\u043e\u0432\u0430 \u0417\u0435\u043b\u0430\u043d\u0434\u0456\u044f","NC":"\u041d\u043e\u0432\u0430 \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0456\u044f","NO":"\u041d\u043e\u0440\u0432\u0435\u0491\u0456\u044f","AE":"\u041e\u0431\u02bc\u0454\u0434\u043d\u0430\u043d\u0456 \u0410\u0440\u0430\u0431\u0441\u044c\u043a\u0456 \u0415\u043c\u0456\u0440\u0430\u0442\u0438","OM":"\u041e\u043c\u0430\u043d","BV":"\u041e\u0441\u0442\u0440\u0456\u0432 \u0411\u0443\u0432\u0435","IM":"\u041e\u0441\u0442\u0440\u0456\u0432 \u041c\u0435\u043d","NF":"\u041e\u0441\u0442\u0440\u0456\u0432 \u041d\u043e\u0440\u0444\u043e\u043b\u043a","CX":"\u041e\u0441\u0442\u0440\u0456\u0432 \u0420\u0456\u0437\u0434\u0432\u0430","SH":"\u041e\u0441\u0442\u0440\u0456\u0432 \u0421\u0432\u044f\u0442\u043e\u0457 \u0404\u043b\u0435\u043d\u0438","HM":"\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u0413\u0435\u0440\u0434 \u0456 \u041c\u0430\u043a\u0434\u043e\u043d\u0430\u043b\u0434","CK":"\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041a\u0443\u043a\u0430","PN":"\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u041f\u0456\u0442\u043a\u0435\u0440\u043d","TC":"\u041e\u0441\u0442\u0440\u043e\u0432\u0438 \u0422\u0435\u0440\u043a\u0441 \u0456 \u041a\u0430\u0439\u043a\u043e\u0441","PK":"\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d","PW":"\u041f\u0430\u043b\u0430\u0443","PS":"\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u044c\u043a\u0456 \u0442\u0435\u0440\u0438\u0442\u043e\u0440\u0456\u0457","PA":"\u041f\u0430\u043d\u0430\u043c\u0430","PG":"\u041f\u0430\u043f\u0443\u0430-\u041d\u043e\u0432\u0430 \u0490\u0432\u0456\u043d\u0435\u044f","PY":"\u041f\u0430\u0440\u0430\u0491\u0432\u0430\u0439","PE":"\u041f\u0435\u0440\u0443","GS":"\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u0414\u0436\u043e\u0440\u0434\u0436\u0456\u044f \u0442\u0430 \u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0456 \u0421\u0430\u043d\u0434\u0432\u0456\u0447\u0435\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","KR":"\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0430 \u041a\u043e\u0440\u0435\u044f","SS":"\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0438\u0439 \u0421\u0443\u0434\u0430\u043d","ZA":"\u041f\u0456\u0432\u0434\u0435\u043d\u043d\u043e-\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0430","KP":"\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u041a\u043e\u0440\u0435\u044f","MK":"\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0430 \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0456\u044f","MP":"\u041f\u0456\u0432\u043d\u0456\u0447\u043d\u0456 \u041c\u0430\u0440\u0456\u0430\u043d\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","PL":"\u041f\u043e\u043b\u044c\u0449\u0430","PT":"\u041f\u043e\u0440\u0442\u0443\u0491\u0430\u043b\u0456\u044f","PR":"\u041f\u0443\u0435\u0440\u0442\u043e-\u0420\u0456\u043a\u043e","RE":"\u0420\u0435\u044e\u043d\u044c\u0439\u043e\u043d","RU":"\u0420\u043e\u0441\u0456\u044f","RW":"\u0420\u0443\u0430\u043d\u0434\u0430","RO":"\u0420\u0443\u043c\u0443\u043d\u0456\u044f","SV":"\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440","WS":"\u0421\u0430\u043c\u043e\u0430","SM":"\u0421\u0430\u043d-\u041c\u0430\u0440\u0456\u043d\u043e","ST":"\u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0456 \u041f\u0440\u0456\u043d\u0441\u0456\u043f\u0456","SA":"\u0421\u0430\u0443\u0434\u0456\u0432\u0441\u044c\u043a\u0430 \u0410\u0440\u0430\u0432\u0456\u044f","SC":"\u0421\u0435\u0439\u0448\u0435\u043b\u044c\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","BL":"\u0421\u0435\u043d-\u0411\u0430\u0440\u0442\u0435\u043b\u044c\u043c\u0456","MF":"\u0421\u0435\u043d-\u041c\u0430\u0440\u0442\u0435\u043d","PM":"\u0421\u0435\u043d-\u041f\u02bc\u0454\u0440 \u0456 \u041c\u0456\u043a\u0435\u043b\u043e\u043d","SN":"\u0421\u0435\u043d\u0435\u0433\u0430\u043b","VC":"\u0421\u0435\u043d\u0442-\u0412\u0456\u043d\u0441\u0435\u043d\u0442 \u0456 \u0490\u0440\u0435\u043d\u0430\u0434\u0456\u043d\u0438","KN":"\u0421\u0435\u043d\u0442-\u041a\u0456\u0442\u0441 \u0456 \u041d\u0435\u0432\u0456\u0441","LC":"\u0421\u0435\u043d\u0442-\u041b\u044e\u0441\u0456\u044f","RS":"\u0421\u0435\u0440\u0431\u0456\u044f","SY":"\u0421\u0438\u0440\u0456\u044f","SG":"\u0421\u0456\u043d\u0433\u0430\u043f\u0443\u0440","SX":"\u0421\u0456\u043d\u0442-\u041c\u0430\u0440\u0442\u0435\u043d","SK":"\u0421\u043b\u043e\u0432\u0430\u0447\u0447\u0438\u043d\u0430","SI":"\u0421\u043b\u043e\u0432\u0435\u043d\u0456\u044f","SB":"\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","SO":"\u0421\u043e\u043c\u0430\u043b\u0456","US":"\u0421\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0456 \u0428\u0442\u0430\u0442\u0438","SD":"\u0421\u0443\u0434\u0430\u043d","SR":"\u0421\u0443\u0440\u0456\u043d\u0430\u043c","SL":"\u0421\u044c\u0454\u0440\u0440\u0430-\u041b\u0435\u043e\u043d\u0435","TJ":"\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d","TH":"\u0422\u0430\u0457\u043b\u0430\u043d\u0434","TW":"\u0422\u0430\u0439\u0432\u0430\u043d\u044c","TZ":"\u0422\u0430\u043d\u0437\u0430\u043d\u0456\u044f","TL":"\u0422\u0456\u043c\u043e\u0440-\u041b\u0435\u0448\u0442\u0456","TG":"\u0422\u043e\u0433\u043e","TK":"\u0422\u043e\u043a\u0435\u043b\u0430\u0443","TO":"\u0422\u043e\u043d\u0491\u0430","TT":"\u0422\u0440\u0456\u043d\u0456\u0434\u0430\u0434 \u0456 \u0422\u043e\u0431\u0430\u0491\u043e","TV":"\u0422\u0443\u0432\u0430\u043b\u0443","TN":"\u0422\u0443\u043d\u0456\u0441","TR":"\u0422\u0443\u0440\u0435\u0447\u0447\u0438\u043d\u0430","TM":"\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0456\u0441\u0442\u0430\u043d","UG":"\u0423\u0433\u0430\u043d\u0434\u0430","HU":"\u0423\u0433\u043e\u0440\u0449\u0438\u043d\u0430","UZ":"\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d","UA":"\u0423\u043a\u0440\u0430\u0457\u043d\u0430","WF":"\u0423\u043e\u043b\u043b\u0456\u0441 \u0456 \u0424\u0443\u0442\u0443\u043d\u0430","UY":"\u0423\u0440\u0443\u0491\u0432\u0430\u0439","FO":"\u0424\u0430\u0440\u0435\u0440\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","FJ":"\u0424\u0456\u0434\u0436\u0456","PH":"\u0424\u0456\u043b\u0456\u043f\u043f\u0456\u043d\u0438","FI":"\u0424\u0456\u043d\u043b\u044f\u043d\u0434\u0456\u044f","FK":"\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u044c\u043a\u0456 \u041e\u0441\u0442\u0440\u043e\u0432\u0438","FR":"\u0424\u0440\u0430\u043d\u0446\u0456\u044f","GF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430 \u0490\u0432\u0456\u0430\u043d\u0430","PF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430 \u041f\u043e\u043b\u0456\u043d\u0435\u0437\u0456\u044f","TF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0456 \u041f\u0456\u0432\u0434\u0435\u043d\u043d\u0456 \u0422\u0435\u0440\u0438\u0442\u043e\u0440\u0456\u0457","HR":"\u0425\u043e\u0440\u0432\u0430\u0442\u0456\u044f","CF":"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0430\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u044c\u043a\u0430 \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0456\u043a\u0430","TD":"\u0427\u0430\u0434","CZ":"\u0427\u0435\u0445\u0456\u044f","CL":"\u0427\u0456\u043b\u0456","ME":"\u0427\u043e\u0440\u043d\u043e\u0433\u043e\u0440\u0456\u044f","CH":"\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0456\u044f","SE":"\u0428\u0432\u0435\u0446\u0456\u044f","SJ":"\u0428\u043f\u0456\u0446\u0431\u0435\u0440\u0433\u0435\u043d \u0442\u0430 \u042f\u043d-\u041c\u0430\u0454\u043d","LK":"\u0428\u0440\u0456-\u041b\u0430\u043d\u043a\u0430","JM":"\u042f\u043c\u0430\u0439\u043a\u0430","JP":"\u042f\u043f\u043e\u043d\u0456\u044f"}
\ No newline at end of file
diff --git a/scripts/download-country-names.js b/scripts/download-country-names.js
new file mode 100644
index 00000000..4ee90cd4
--- /dev/null
+++ b/scripts/download-country-names.js
@@ -0,0 +1,39 @@
+const fs = require('fs');
+const path = require('path');
+const https = require('https');
+const chalk = require('chalk');
+
+const src = path.resolve(__dirname, '../lang');
+const dest = path.resolve(__dirname, '../public/country');
+const files = fs.readdirSync(src);
+
+const getUrl = locale =>
+ `https://raw.githubusercontent.com/umpirsky/country-list/master/data/${locale}/country.json`;
+
+const asyncForEach = async (array, callback) => {
+ for (let index = 0; index < array.length; index++) {
+ await callback(array[index], index, array);
+ }
+};
+
+if (!fs.existsSync(dest)) {
+ fs.mkdirSync(dest);
+}
+
+const download = async files => {
+ await asyncForEach(files, async file => {
+ const locale = file.replace('-', '_').replace('.json', '');
+
+ const filename = path.join(dest, file);
+ if (!fs.existsSync(filename)) {
+ await new Promise(resolve => {
+ https.get(getUrl(locale), res => {
+ console.log('Downloaded', chalk.greenBright('->'), filename);
+ resolve(res.pipe(fs.createWriteStream(filename)));
+ });
+ });
+ }
+ });
+};
+
+download(files);
diff --git a/tracker/index.js b/tracker/index.js
index 12119298..154e0034 100644
--- a/tracker/index.js
+++ b/tracker/index.js
@@ -6,6 +6,7 @@ import { removeTrailingSlash } from '../lib/url';
screen: { width, height },
navigator: { language },
location: { hostname, pathname, search },
+ sessionStorage,
document,
history,
} = window;
@@ -16,7 +17,8 @@ import { removeTrailingSlash } from '../lib/url';
const website = attr('data-website-id');
const hostUrl = attr('data-host-url');
const autoTrack = attr('data-auto-track') !== 'false';
- const dnt = attr('data-do-not-track') === 'true';
+ const dnt = attr('data-do-not-track');
+ const useCache = attr('data-cache');
if (!script || (dnt && doNotTrack())) return;
@@ -37,7 +39,7 @@ import { removeTrailingSlash } from '../lib/url';
req.onreadystatechange = () => {
if (req.readyState === 4) {
- callback && callback();
+ callback && callback(req.response);
}
};
@@ -45,11 +47,14 @@ import { removeTrailingSlash } from '../lib/url';
};
const collect = (type, params, uuid) => {
+ const key = 'umami.cache';
+
const payload = {
website: uuid,
hostname,
screen,
language,
+ cache: useCache && sessionStorage.getItem(key),
};
if (params) {
@@ -58,10 +63,14 @@ import { removeTrailingSlash } from '../lib/url';
});
}
- return post(`${root}/api/collect`, {
- type,
- payload,
- });
+ return post(
+ `${root}/api/collect`,
+ {
+ type,
+ payload,
+ },
+ res => useCache && sessionStorage.setItem(key, res),
+ );
};
const trackView = (url = currentUrl, referrer = currentRef, uuid = website) =>