commit 94756bb32400165084c399e426670e6a9cf92098 Author: Julya Date: Fri Jun 13 19:24:56 2025 +0500 создание репозитория diff --git a/.$Диаграмма прецедентов.drawio.bkp b/.$Диаграмма прецедентов.drawio.bkp new file mode 100644 index 0000000..bfd2f70 --- /dev/null +++ b/.$Диаграмма прецедентов.drawio.bkp @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.$Схема базы.drawio.bkp b/.$Схема базы.drawio.bkp new file mode 100644 index 0000000..d858c68 --- /dev/null +++ b/.$Схема базы.drawio.bkp @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a971a2c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5de9d57 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/Решение.iml b/.idea/Решение.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/Решение.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ERD.drawio b/ERD.drawio new file mode 100644 index 0000000..79ca93a --- /dev/null +++ b/ERD.drawio @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ERD.drawio.pdf b/ERD.drawio.pdf new file mode 100644 index 0000000..b6bafc8 Binary files /dev/null and b/ERD.drawio.pdf differ diff --git a/ERD.vsdx b/ERD.vsdx new file mode 100644 index 0000000..c136773 Binary files /dev/null and b/ERD.vsdx differ diff --git a/desktop/.idea/.gitignore b/desktop/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/desktop/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/desktop/.idea/desktop.iml b/desktop/.idea/desktop.iml new file mode 100644 index 0000000..d8b3f6c --- /dev/null +++ b/desktop/.idea/desktop.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/desktop/.idea/inspectionProfiles/profiles_settings.xml b/desktop/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/desktop/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/desktop/.idea/misc.xml b/desktop/.idea/misc.xml new file mode 100644 index 0000000..e60fd8a --- /dev/null +++ b/desktop/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/desktop/.idea/modules.xml b/desktop/.idea/modules.xml new file mode 100644 index 0000000..b2262e3 --- /dev/null +++ b/desktop/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/desktop/.idea/vcs.xml b/desktop/.idea/vcs.xml new file mode 100644 index 0000000..d843f34 --- /dev/null +++ b/desktop/.idea/vcs.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/desktop/db.py b/desktop/db.py new file mode 100644 index 0000000..adf2ebb --- /dev/null +++ b/desktop/db.py @@ -0,0 +1,116 @@ +from datetime import datetime + +from sqlalchemy import Column, Integer, DateTime, VARCHAR, DATE, TEXT, ForeignKey, create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, sessionmaker, Session + +__factory = None +base = declarative_base() + + +class BaseModel(base): + __abstract__ = True + + id = Column(Integer, primary_key=True, autoincrement=True) + + +class Role(BaseModel): + __tablename__ = 'roles' + + title = Column(VARCHAR(50), nullable=False) + + +class Gender(BaseModel): + __tablename__ = 'genders' + + title = Column(VARCHAR(50), nullable=False) + + +class Country(BaseModel): + __tablename__ = 'countries' + + title = Column(VARCHAR(250), nullable=False) + english_title = Column(VARCHAR(250), nullable=False) + code_alpha = Column(VARCHAR(10), nullable=False) + code_digits = Column(VARCHAR(10), nullable=False) + + cities = relationship('City', backref='country') + + +class City(BaseModel): + __tablename__ = 'cities' + + title = Column(VARCHAR(250), nullable=False) + + country_id = Column(Integer, ForeignKey('countries.id'), nullable=False) + + country = relationship('Country', backref='cities') + + events = relationship('Event', backref='city') + + +class User(BaseModel): + __tablename__ = 'users' + + last_name = Column(VARCHAR(50), nullable=False) + first_name = Column(VARCHAR(50), nullable=False) + patronym = Column(VARCHAR(50)) + email = Column(VARCHAR(150), nullable=False) + birthday = Column(DATE, nullable=False) + phone = Column(VARCHAR(50), nullable=False) + password = Column(TEXT, nullable=False) + photo = Column(TEXT, nullable=False) + + gender_id = Column(Integer, ForeignKey('genders.id'), nullable=False) + role_id = Column(Integer, ForeignKey('roles.id'), nullable=False) + country_id = Column(Integer, ForeignKey('countries.id'), nullable=False) + + moders = relationship('Moder', backref='user') + + +class Direction(BaseModel): + __tablename__ = 'directions' + + title = Column(VARCHAR(150), nullable=False) + + moders = relationship('Moder', backref='direction') + + +class Event(BaseModel): + __tablename__ = 'events' + + title = Column(VARCHAR(250), nullable=False) + date = Column(DATE, nullable=False) + days_count = Column(Integer, nullable=False) + + city_id = Column(Integer, ForeignKey('cities.id'), nullable=False) + + city = relationship('City', backref='events') + + moders = relationship('Moder', backref='event') + + +class Moder(BaseModel): + __tablename__ = 'moders' + + user_id = Column(Integer, ForeignKey('users.id'), nullable=False) + event_id = Column(Integer, ForeignKey('events.id'), nullable=False) + direction_id = Column(Integer, ForeignKey('directions.id'), nullable=False) + + user = relationship('User', backref='moders') + event = relationship('Event', backref='moders') + direction = relationship('Direction', backref='moders') + + +def init_db(): + global __factory + + eng = create_engine('postgresql+pg8000://postgres:2509@localhost:5432/demo_1') + __factory = sessionmaker(bind=eng) + + base.metadata.create_all(eng) + + +def connect() -> Session: + global __factory + return __factory() diff --git a/desktop/main.py b/desktop/main.py new file mode 100644 index 0000000..f1c8101 --- /dev/null +++ b/desktop/main.py @@ -0,0 +1,4 @@ +from db import init_db + +if __name__ == '__main__': + init_db() diff --git a/desktop/ui/login_window.ui b/desktop/ui/login_window.ui new file mode 100644 index 0000000..45edd08 --- /dev/null +++ b/desktop/ui/login_window.ui @@ -0,0 +1,138 @@ + + + MainWindow + + + + 0 + 0 + 800 + 582 + + + + ИС "Конференции" - Авторизация + + + + + + + + 27 + + + + Авторизация + + + Qt::AlignCenter + + + + + + + + + + Логин + + + + + + + Назад + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Пароль + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Войти + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/desktop/ui/main_menu.ui b/desktop/ui/main_menu.ui new file mode 100644 index 0000000..d3d82c3 --- /dev/null +++ b/desktop/ui/main_menu.ui @@ -0,0 +1,108 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + ИС "Конфренции" - Главное меню + + + + + + + + 0 + 0 + 0 + 2025 + 6 + 12 + + + + true + + + + + + + Фильтрация по дате + + + + + + + Фильтрация по направлению + + + + + + + Авторизация + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Выйти + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Регистрация жюри/модератора + + + + + + + + + + diff --git a/desktop/ui/oragnisator_window.ui b/desktop/ui/oragnisator_window.ui new file mode 100644 index 0000000..afcf1e5 --- /dev/null +++ b/desktop/ui/oragnisator_window.ui @@ -0,0 +1,175 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + ИС "Конференции" - Окно организатора + + + + + + + + 16 + 75 + true + + + + Доброе.... + + + Qt::AlignCenter + + + + + + + + 24 + + + + Окно организатора + + + Qt::AlignCenter + + + + + + + + 16 + 75 + true + + + + ФИО пользователя + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + Жюри + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Мой профиль + + + + + + + + 0 + 0 + + + + Участники + + + + + + + + 0 + 0 + + + + Мероприятия + + + + + + + Фото + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + + + + Назад + + + + + + + + + + diff --git a/desktop/ui/register_window.ui b/desktop/ui/register_window.ui new file mode 100644 index 0000000..37d3f9d --- /dev/null +++ b/desktop/ui/register_window.ui @@ -0,0 +1,199 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + ИС "Конференции" - Окно регистрации жюри/модераторов + + + + + + + + 17 + 75 + true + + + + Регистрация жюри/модератора + + + Qt::AlignCenter + + + + + + + + + ID number: + + + + + + + + + + ФИО: + + + + + + + + + + Пол: + + + + + + + + + + Роль: + + + + + + + + + + Email: + + + + + + + + + + Телефон: + + + + + + + +7(000)-000-00-00 + + + + + + + Направление + + + + + + + + + + Прикрепить к мероприятию + + + + + + + Мероприятие + + + + + + + + + + + + Фото + + + + + + + Пароль + + + + + + + Password + + + + + + + Повтор пароля + + + + + + + Re-enter password + + + + + + + Видимый пароль + + + + + + + Ок + + + + + + + Отмена + + + + + + + Назад + + + + + + + + + + diff --git a/Диаграмма прецедентов.drawio b/Диаграмма прецедентов.drawio new file mode 100644 index 0000000..7154f3b --- /dev/null +++ b/Диаграмма прецедентов.drawio @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Диаграмма прецедентов.zip b/Диаграмма прецедентов.zip new file mode 100644 index 0000000..0556ccf Binary files /dev/null and b/Диаграмма прецедентов.zip differ diff --git a/Диаграмма прецедентов/Диаграмма прецедентов.drawio.pdf b/Диаграмма прецедентов/Диаграмма прецедентов.drawio.pdf new file mode 100644 index 0000000..4d6a828 Binary files /dev/null and b/Диаграмма прецедентов/Диаграмма прецедентов.drawio.pdf differ diff --git a/Диаграмма прецедентов/Диаграмма прецедентов.vsdx b/Диаграмма прецедентов/Диаграмма прецедентов.vsdx new file mode 100644 index 0000000..6a8e006 Binary files /dev/null and b/Диаграмма прецедентов/Диаграмма прецедентов.vsdx differ diff --git a/Импорт/Cтраны.csv b/Импорт/Cтраны.csv new file mode 100644 index 0000000..f823121 --- /dev/null +++ b/Импорт/Cтраны.csv @@ -0,0 +1,252 @@ +title;english_title;code_alpha;code_digits +Абхазия;Abkhazia;AB;895 +Австралия;Australia;AU;36 +Австрия;Austria;AT;40 +Азербайджан;Azerbaijan;AZ;31 +Албания;Albania;AL;8 +Алжир;Algeria;DZ;12 +Американское Самоа;American Samoa;AS;16 +Ангилья;Anguilla;AI;660 +Ангола;Angola;AO;24 +Андорра;Andorra;AD;20 +Антарктида;Antarctica;AQ;10 +Антигуа и Барбуда;Antigua and Barbuda;AG;28 +Аргентина;Argentina;AR;32 +Армения;Armenia;AM;51 +Аруба;Aruba;AW;533 +Афганистан;Afghanistan;AF;4 +Багамы;Bahamas;BS;44 +Бангладеш;Bangladesh;BD;50 +Барбадос;Barbados;BB;52 +Бахрейн;Bahrain;BH;48 +Беларусь;Belarus;BY;112 +Белиз;Belize;BZ;84 +Бельгия;Belgium;BE;56 +Бенин;Benin;BJ;204 +Бермуды;Bermuda;BM;60 +Болгария;Bulgaria;BG;100 +"Боливия, Многонациональное Государство";"Bolivia, plurinational state of";BO;68 +"Бонайре, Саба и Синт-Эстатиус";"Bonaire, Sint Eustatius and Saba";BQ;535 +Босния и Герцеговина;Bosnia and Herzegovina;BA;70 +Ботсвана;Botswana;BW;72 +Бразилия;Brazil;BR;76 +Британская территория в Индийском океане;British Indian Ocean Territory;IO;86 +Бруней-Даруссалам;Brunei Darussalam;BN;96 +Буркина-Фасо;Burkina Faso;BF;854 +Бурунди;Burundi;BI;108 +Бутан;Bhutan;BT;64 +Вануату;Vanuatu;VU;548 +Венгрия;Hungary;HU;348 +Венесуэла Боливарианская Республика;Venezuela;VE;862 +"Виргинские острова, Британские";"Virgin Islands, British";VG;92 +"Виргинские острова, США";"Virgin Islands, U.S.";VI;850 +Вьетнам;Vietnam;VN;704 +Габон;Gabon;GA;266 +Гаити;Haiti;HT;332 +Гайана;Guyana;GY;328 +Гамбия;Gambia;GM;270 +Гана;Ghana;GH;288 +Гваделупа;Guadeloupe;GP;312 +Гватемала;Guatemala;GT;320 +Гвинея;Guinea;GN;324 +Гвинея-Бисау;Guinea-Bissau;GW;624 +Германия;Germany;DE;276 +Гернси;Guernsey;GG;831 +Гибралтар;Gibraltar;GI;292 +Гондурас;Honduras;HN;340 +Гонконг;Hong Kong;HK;344 +Гренада;Grenada;GD;308 +Гренландия;Greenland;GL;304 +Греция;Greece;GR;300 +Грузия;Georgia;GE;268 +Гуам;Guam;GU;316 +Дания;Denmark;DK;208 +Джерси;Jersey;JE;832 +Джибути;Djibouti;DJ;262 +Доминика;Dominica;DM;212 +Доминиканская Республика;Dominican Republic;DO;214 +Египет;Egypt;EG;818 +Замбия;Zambia;ZM;894 +Западная Сахара;Western Sahara;EH;732 +Зимбабве;Zimbabwe;ZW;716 +Израиль;Israel;IL;376 +Индия;India;IN;356 +Индонезия;Indonesia;ID;360 +Иордания;Jordan;JO;400 +Ирак;Iraq;IQ;368 +"Иран, Исламская Республика";"Iran, Islamic Republic of";IR;364 +Ирландия;Ireland;IE;372 +Исландия;Iceland;IS;352 +Испания;Spain;ES;724 +Италия;Italy;IT;380 +Йемен;Yemen;YE;887 +Кабо-Верде;Cape Verde;CV;132 +Казахстан;Kazakhstan;KZ;398 +Камбоджа;Cambodia;KH;116 +Камерун;Cameroon;CM;120 +Канада;Canada;CA;124 +Катар;Qatar;QA;634 +Кения;Kenya;KE;404 +Кипр;Cyprus;CY;196 +Киргизия;Kyrgyzstan;KG;417 +Кирибати;Kiribati;KI;296 +Китай;China;CN;156 +Кокосовые (Килинг) острова;Cocos (Keeling) Islands;CC;166 +Колумбия;Colombia;CO;170 +Коморы;Comoros;KM;174 +Конго;Congo;CG;178 +"Конго, Демократическая Республика";"Congo, Democratic Republic of the";CD;180 +"Корея, Народно-Демократическая Республика";"Korea, Democratic People's republic of";KP;408 +"Корея, Республика";"Korea, Republic of";KR;410 +Коста-Рика;Costa Rica;CR;188 +Кот д'Ивуар;Cote d'Ivoire;CI;384 +Куба;Cuba;CU;192 +Кувейт;Kuwait;KW;414 +Кюрасао;Curacao;CW;531 +Лаос;Lao People's Democratic Republic;LA;418 +Латвия;Latvia;LV;428 +Лесото;Lesotho;LS;426 +Ливан;Lebanon;LB;422 +Ливийская Арабская Джамахирия;Libyan Arab Jamahiriya;LY;434 +Либерия;Liberia;LR;430 +Лихтенштейн;Liechtenstein;LI;438 +Литва;Lithuania;LT;440 +Люксембург;Luxembourg;LU;442 +Маврикий;Mauritius;MU;480 +Мавритания;Mauritania;MR;478 +Мадагаскар;Madagascar;MG;450 +Майотта;Mayotte;YT;175 +Макао;Macao;MO;446 +Малави;Malawi;MW;454 +Малайзия;Malaysia;MY;458 +Мали;Mali;ML;466 +Малые Тихоокеанские отдаленные острова Соединенных Штатов;United States Minor Outlying Islands;UM;581 +Мальдивы;Maldives;MV;462 +Мальта;Malta;MT;470 +Марокко;Morocco;MA;504 +Мартиника;Martinique;MQ;474 +Маршалловы острова;Marshall Islands;MH;584 +Мексика;Mexico;MX;484 +"Микронезия, Федеративные Штаты";"Micronesia, Federated States of";FM;583 +Мозамбик;Mozambique;MZ;508 +"Молдова, Республика";Moldova;MD;498 +Монако;Monaco;MC;492 +Монголия;Mongolia;MN;496 +Монтсеррат;Montserrat;MS;500 +Мьянма;Myanmar;MM;104 +Намибия;Namibia;NA;516 +Науру;Nauru;NR;520 +Непал;Nepal;NP;524 +Нигер;Niger;NE;562 +Нигерия;Nigeria;NG;566 +Нидерланды;Netherlands;NL;528 +Никарагуа;Nicaragua;NI;558 +Ниуэ;Niue;NU;570 +Новая Зеландия;New Zealand;NZ;554 +Новая Каледония;New Caledonia;NC;540 +Норвегия;Norway;NO;578 +Объединенные Арабские Эмираты;United Arab Emirates;AE;784 +Оман;Oman;OM;512 +Остров Буве;Bouvet Island;BV;74 +Остров Мэн;Isle of Man;IM;833 +Остров Норфолк;Norfolk Island;NF;574 +Остров Рождества;Christmas Island;CX;162 +Остров Херд и острова Макдональд;Heard Island and McDonald Islands;HM;334 +Острова Кайман;Cayman Islands;KY;136 +Острова Кука;Cook Islands;CK;184 +Острова Теркс и Кайкос;Turks and Caicos Islands;TC;796 +Пакистан;Pakistan;PK;586 +Палау;Palau;PW;585 +"Палестинская территория, оккупированная";"Palestinian Territory, Occupied";PS;275 +Панама;Panama;PA;591 +Папский Престол (Государство — город Ватикан);Holy See (Vatican City State);VA;336 +Папуа-Новая Гвинея;Papua New Guinea;PG;598 +Парагвай;Paraguay;PY;600 +Перу;Peru;PE;604 +Питкерн;Pitcairn;PN;612 +Польша;Poland;PL;616 +Португалия;Portugal;PT;620 +Пуэрто-Рико;Puerto Rico;PR;630 +Республика Македония;"Macedonia, The Former Yugoslav Republic Of";MK;807 +Реюньон;Reunion;RE;638 +Россия;Russian Federation;RU;643 +Руанда;Rwanda;RW;646 +Румыния;Romania;RO;642 +Самоа;Samoa;WS;882 +Сан-Марино;San Marino;SM;674 +Сан-Томе и Принсипи;Sao Tome and Principe;ST;678 +Саудовская Аравия;Saudi Arabia;SA;682 +Свазиленд;Swaziland;SZ;748 +"Святая Елена, Остров вознесения, Тристан-да-Кунья";"Saint Helena, Ascension And Tristan Da Cunha";SH;654 +Северные Марианские острова;Northern Mariana Islands;MP;580 +Сен-Бартельми;Saint Barthelemy;BL;652 +Сен-Мартен;Saint Martin (French Part);MF;663 +Сенегал;Senegal;SN;686 +Сент-Винсент и Гренадины;Saint Vincent and the Grenadines;VC;670 +Сент-Люсия;Saint Lucia;LC;662 +Сент-Китс и Невис;Saint Kitts and Nevis;KN;659 +Сент-Пьер и Микелон;Saint Pierre and Miquelon;PM;666 +Сербия;Serbia;RS;688 +Сейшелы;Seychelles;SC;690 +Сингапур;Singapore;SG;702 +Синт-Мартен;Sint Maarten;SX;534 +Сирийская Арабская Республика;Syrian Arab Republic;SY;760 +Словакия;Slovakia;SK;703 +Словения;Slovenia;SI;705 +Соединенное Королевство;United Kingdom;GB;826 +Соединенные Штаты;United States;US;840 +Соломоновы острова;Solomon Islands;SB;90 +Сомали;Somalia;SO;706 +Судан;Sudan;SD;729 +Суринам;Suriname;SR;740 +Сьерра-Леоне;Sierra Leone;SL;694 +Таджикистан;Tajikistan;TJ;762 +Таиланд;Thailand;TH;764 +Тайвань (Китай);"Taiwan, Province of China";TW;158 +"Танзания, Объединенная Республика";"Tanzania, United Republic Of";TZ;834 +Тимор-Лесте;Timor-Leste;TL;626 +Того;Togo;TG;768 +Токелау;Tokelau;TK;772 +Тонга;Tonga;TO;776 +Тринидад и Тобаго;Trinidad and Tobago;TT;780 +Тувалу;Tuvalu;TV;798 +Тунис;Tunisia;TN;788 +Туркмения;Turkmenistan;TM;795 +Турция;Turkey;TR;792 +Уганда;Uganda;UG;800 +Узбекистан;Uzbekistan;UZ;860 +Украина;Ukraine;UA;804 +Уоллис и Футуна;Wallis and Futuna;WF;876 +Уругвай;Uruguay;UY;858 +Фарерские острова;Faroe Islands;FO;234 +Фиджи;Fiji;FJ;242 +Филиппины;Philippines;PH;608 +Финляндия;Finland;FI;246 +Фолклендские острова (Мальвинские);Falkland Islands (Malvinas);FK;238 +Франция;France;FR;250 +Французская Гвиана;French Guiana;GF;254 +Французская Полинезия;French Polynesia;PF;258 +Французские Южные территории;French Southern Territories;TF;260 +Хорватия;Croatia;HR;191 +Центрально-Африканская Республика;Central African Republic;CF;140 +Чад;Chad;TD;148 +Черногория;Montenegro;ME;499 +Чешская Республика;Czech Republic;CZ;203 +Чили;Chile;CL;152 +Швейцария;Switzerland;CH;756 +Швеция;Sweden;SE;752 +Шпицберген и Ян Майен;Svalbard and Jan Mayen;SJ;744 +Шри-Ланка;Sri Lanka;LK;144 +Эквадор;Ecuador;EC;218 +Экваториальная Гвинея;Equatorial Guinea;GQ;226 +Эландские острова;Aland Islands;AX;248 +Эль-Сальвадор;El Salvador;SV;222 +Эритрея;Eritrea;ER;232 +Эстония;Estonia;EE;233 +Эфиопия;Ethiopia;ET;231 +Южная Африка;South Africa;ZA;710 +Южная Джорджия и Южные Сандвичевы острова;South Georgia and the South Sandwich Islands;GS;239 +Южная Осетия;South Ossetia;OS;896 +Южный Судан;South Sudan;SS;728 +Ямайка;Jamaica;JM;388 +Япония;Japan;JP;392 diff --git a/Импорт/Города.csv b/Импорт/Города.csv new file mode 100644 index 0000000..7b8f757 --- /dev/null +++ b/Импорт/Города.csv @@ -0,0 +1,1118 @@ +country_id;title +171;Абаза +171;Абакан +171;Абдулино +171;Абинск +171;Агидель +171;Агрыз +171;Адыгейск +171;Азнакаево +171;Азов +171;Ак-Довурак +171;Аксай +171;Алагир +171;Алапаевск +171;Алатырь +171;Алдан +171;Алейск +171;Александров +171;Александровск +171;Александровск-Сахалинский +171;Алексеевка +171;Алексин +171;Алзамай +171;Алупкане призн. +171;Алуштане призн. +171;Альметьевск +171;Амурск +171;Анадырь +171;Анапа +171;Ангарск +171;Андреаполь +171;Анжеро-Судженск +171;Анива +171;Апатиты +171;Апрелевка +171;Апшеронск +171;Арамиль +171;Аргун +171;Ардатов +171;Ардон +171;Арзамас +171;Аркадак +171;Армавир +171;Армянскне призн. +171;Арсеньев +171;Арск +171;Артём +171;Артёмовск +171;Артёмовский +171;Архангельск +171;Асбест +171;Асино +171;Астрахань +171;Аткарск +171;Ахтубинск +171;Ачинск +171;Аша +171;Бабаево +171;Бабушкин +171;Бавлы +171;Багратионовск +171;Байкальск +171;Баймак +171;Бакал +171;Баксан +171;Балабаново +171;Балаково +171;Балахна +171;Балашиха +171;Балашов +171;Балей +171;Балтийск +171;Барабинск +171;Барнаул +171;Барыш +171;Батайск +171;Бахчисарайне призн. +171;Бежецк +171;Белая Калитва +171;Белая Холуница +171;Белгород +171;Белебей +171;Белёв +171;Белинский +171;Белово +171;Белогорск +171;Белогорскне призн. +171;Белозерск +171;Белокуриха +171;Беломорск +171;Белоозёрский +171;Белорецк +171;Белореченск +171;Белоусово +171;Белоярский +171;Белый +171;Бердск +171;Березники +171;Берёзовский +171;Берёзовский +171;Беслан +171;Бийск +171;Бикин +171;Билибино +171;Биробиджан +171;Бирск +171;Бирюсинск +171;Бирюч +171;Благовещенск +171;Благовещенск +171;Благодарный +171;Бобров +171;Богданович +171;Богородицк +171;Богородск +171;Боготол +171;Богучар +171;Бодайбо +171;Бокситогорск +171;Болгар +171;Бологое +171;Болотное +171;Болохово +171;Болхов +171;Большой Камень +171;Бор +171;Борзя +171;Борисоглебск +171;Боровичи +171;Боровск +171;Бородино +171;Братск +171;Бронницы +171;Брянск +171;Бугульма +171;Бугуруслан +171;Будённовск +171;Бузулук +171;Буинск +171;Буй +171;Буйнакск +171;Бутурлиновка +171;Валдай +171;Валуйки +171;Велиж +171;Великие Луки +171;Великий Новгород +171;Великий Устюг +171;Вельск +171;Венёв +171;Верещагино +171;Верея +171;Верхнеуральск +171;Верхний Тагил +171;Верхний Уфалей +171;Верхняя Пышма +171;Верхняя Салда +171;Верхняя Тура +171;Верхотурье +171;Верхоянск +171;Весьегонск +171;Ветлуга +171;Видное +171;Вилюйск +171;Вилючинск +171;Вихоревка +171;Вичуга +171;Владивосток +171;Владикавказ +171;Владимир +171;Волгоград +171;Волгодонск +171;Волгореченск +171;Волжск +171;Волжский +171;Вологда +171;Володарск +171;Волоколамск +171;Волосово +171;Волхов +171;Волчанск +171;Вольск +171;Воркута +171;Воронеж +171;Ворсма +171;Воскресенск +171;Воткинск +171;Всеволожск +171;Вуктыл +171;Выборг +171;Выкса +171;Высоковск +171;Высоцк +171;Вытегра +171;Вышний Волочёк +171;Вяземский +171;Вязники +171;Вязьма +171;Вятские Поляны +171;Гаврилов Посад +171;Гаврилов-Ям +171;Гагарин +171;Гаджиево +171;Гай +171;Галич +171;Гатчина +171;Гвардейск +171;Гдов +171;Геленджик +171;Георгиевск +171;Глазов +171;Голицыно +171;Горбатов +171;Горно-Алтайск +171;Горнозаводск +171;Горняк +171;Городец +171;Городище +171;Городовиковск +171;Гороховец +171;Горячий Ключ +171;Грайворон +171;Гремячинск +171;Грозный +171;Грязи +171;Грязовец +171;Губаха +171;Губкин +171;Губкинский +171;Гудермес +171;Гуково +171;Гулькевичи +171;Гурьевск +171;Гурьевск +171;Гусев +171;Гусиноозёрск +171;Гусь-Хрустальный +171;Давлеканово +171;Дагестанские Огни +171;Далматово +171;Дальнегорск +171;Дальнереченск +171;Данилов +171;Данков +171;Дегтярск +171;Дедовск +171;Демидов +171;Дербент +171;Десногорск +171;Джанкойне призн. +171;Дзержинск +171;Дзержинский +171;Дивногорск +171;Дигора +171;Димитровград +171;Дмитриев +171;Дмитров +171;Дмитровск +171;Дно +171;Добрянка +171;Долгопрудный +171;Долинск +171;Домодедово +171;Донецк +171;Донской +171;Дорогобуж +171;Дрезна +171;Дубна +171;Дубовка +171;Дудинка +171;Духовщина +171;Дюртюли +171;Дятьково +171;Евпаторияне призн. +171;Егорьевск +171;Ейск +171;Екатеринбург +171;Елабуга +171;Елец +171;Елизово +171;Ельня +171;Еманжелинск +171;Емва +171;Енисейск +171;Ермолино +171;Ершов +171;Ессентуки +171;Ефремов +171;Железноводск +171;Железногорск +171;Железногорск +171;Железногорск-Илимский +171;Жердевка +171;Жигулёвск +171;Жиздра +171;Жирновск +171;Жуков +171;Жуковка +171;Жуковский +171;Завитинск +171;Заводоуковск +171;Заволжск +171;Заволжье +171;Задонск +171;Заинск +171;Закаменск +171;Заозёрный +171;Заозёрск +171;Западная Двина +171;Заполярный +171;Зарайск +171;Заречный +171;Заречный +171;Заринск +171;Звенигово +171;Звенигород +171;Зверево +171;Зеленогорск +171;Зеленоградск +171;Зеленодольск +171;Зеленокумск +171;Зерноград +171;Зея +171;Зима +171;Златоуст +171;Злынка +171;Змеиногорск +171;Знаменск +171;Зубцов +171;Зуевка +171;Ивангород +171;Иваново +171;Ивантеевка +171;Ивдель +171;Игарка +171;Ижевск +171;Избербаш +171;Изобильный +171;Иланский +171;Инза +171;Иннополис +171;Инсар +171;Инта +171;Ипатово +171;Ирбит +171;Иркутск +171;Исилькуль +171;Искитим +171;Истра +171;Ишим +171;Ишимбай +171;Йошкар-Ола +171;Кадников +171;Казань +171;Калач +171;Калач-на-Дону +171;Калачинск +171;Калининград +171;Калининск +171;Калтан +171;Калуга +171;Калязин +171;Камбарка +171;Каменка +171;Каменногорск +171;Каменск-Уральский +171;Каменск-Шахтинский +171;Камень-на-Оби +171;Камешково +171;Камызяк +171;Камышин +171;Камышлов +171;Канаш +171;Кандалакша +171;Канск +171;Карабаново +171;Карабаш +171;Карабулак +171;Карасук +171;Карачаевск +171;Карачев +171;Каргат +171;Каргополь +171;Карпинск +171;Карталы +171;Касимов +171;Касли +171;Каспийск +171;Катав-Ивановск +171;Катайск +171;Качканар +171;Кашин +171;Кашира +171;Кедровый +171;Кемерово +171;Кемь +171;Керчьне призн. +171;Кизел +171;Кизилюрт +171;Кизляр +171;Кимовск +171;Кимры +171;Кингисепп +171;Кинель +171;Кинешма +171;Киреевск +171;Киренск +171;Киржач +171;Кириллов +171;Кириши +171;Киров +171;Киров +171;Кировград +171;Кирово-Чепецк +171;Кировск +171;Кировск +171;Кирс +171;Кирсанов +171;Киселёвск +171;Кисловодск +171;Клин +171;Клинцы +171;Княгинино +171;Ковдор +171;Ковров +171;Ковылкино +171;Когалым +171;Кодинск +171;Козельск +171;Козловка +171;Козьмодемьянск +171;Кола +171;Кологрив +171;Коломна +171;Колпашево +171;Кольчугино +171;Коммунар +171;Комсомольск +171;Комсомольск-на-Амуре +171;Конаково +171;Кондопога +171;Кондрово +171;Константиновск +171;Копейск +171;Кораблино +171;Кореновск +171;Коркино +171;Королёв +171;Короча +171;Корсаков +171;Коряжма +171;Костерёво +171;Костомукша +171;Кострома +171;Котельники +171;Котельниково +171;Котельнич +171;Котлас +171;Котово +171;Котовск +171;Кохма +171;Красавино +171;Красноармейск +171;Красноармейск +171;Красновишерск +171;Красногорск +171;Краснодар +171;Краснозаводск +171;Краснознаменск +171;Краснознаменск +171;Краснокаменск +171;Краснокамск +171;Красноперекопскне призн. +171;Краснослободск +171;Краснослободск +171;Краснотурьинск +171;Красноуральск +171;Красноуфимск +171;Красноярск +171;Красный Кут +171;Красный Сулин +171;Красный Холм +171;Кремёнки +171;Кропоткин +171;Крымск +171;Кстово +171;Кубинка +171;Кувандык +171;Кувшиново +171;Кудрово +171;Кудымкар +171;Кузнецк +171;Куйбышев +171;Кукмор +171;Кулебаки +171;Кумертау +171;Кунгур +171;Купино +171;Курган +171;Курганинск +171;Курильск +171;Курлово +171;Куровское +171;Курск +171;Куртамыш +171;Курчалой +171;Курчатов +171;Куса +171;Кушва +171;Кызыл +171;Кыштым +171;Кяхта +171;Лабинск +171;Лабытнанги +171;Лагань +171;Ладушкин +171;Лаишево +171;Лакинск +171;Лангепас +171;Лахденпохья +171;Лебедянь +171;Лениногорск +171;Ленинск +171;Ленинск-Кузнецкий +171;Ленск +171;Лермонтов +171;Лесной +171;Лесозаводск +171;Лесосибирск +171;Ливны +171;Ликино-Дулёво +171;Липецк +171;Липки +171;Лиски +171;Лихославль +171;Лобня +171;Лодейное Поле +171;Лосино-Петровский +171;Луга +171;Луза +171;Лукоянов +171;Луховицы +171;Лысково +171;Лысьва +171;Лыткарино +171;Льгов +171;Любань +171;Люберцы +171;Любим +171;Людиново +171;Лянтор +171;Магадан +171;Магас +171;Магнитогорск +171;Майкоп +171;Майский +171;Макаров +171;Макарьев +171;Макушино +171;Малая Вишера +171;Малгобек +171;Малмыж +171;Малоархангельск +171;Малоярославец +171;Мамадыш +171;Мамоново +171;Мантурово +171;Мариинск +171;Мариинский Посад +171;Маркс +171;Махачкала +171;Мглин +171;Мегион +171;Медвежьегорск +171;Медногорск +171;Медынь +171;Межгорье +171;Междуреченск +171;Мезень +171;Меленки +171;Мелеуз +171;Менделеевск +171;Мензелинск +171;Мещовск +171;Миасс +171;Микунь +171;Миллерово +171;Минеральные Воды +171;Минусинск +171;Миньяр +171;Мирный +171;Мирный +171;Михайлов +171;Михайловка +171;Михайловск +171;Михайловск +171;Мичуринск +171;Могоча +171;Можайск +171;Можга +171;Моздок +171;Мончегорск +171;Морозовск +171;Моршанск +171;Мосальск +171;Москва +171;Муравленко +171;Мураши +171;Мурино +171;Мурманск +171;Муром +171;Мценск +171;Мыски +171;Мытищи +171;Мышкин +171;Набережные Челны +171;Навашино +171;Наволоки +171;Надым +171;Назарово +171;Назрань +171;Называевск +171;Нальчик +171;Нариманов +171;Наро-Фоминск +171;Нарткала +171;Нарьян-Мар +171;Находка +171;Невель +171;Невельск +171;Невинномысск +171;Невьянск +171;Нелидово +171;Неман +171;Нерехта +171;Нерчинск +171;Нерюнгри +171;Нестеров +171;Нефтегорск +171;Нефтекамск +171;Нефтекумск +171;Нефтеюганск +171;Нея +171;Нижневартовск +171;Нижнекамск +171;Нижнеудинск +171;Нижние Серги +171;Нижний Ломов +171;Нижний Новгород +171;Нижний Тагил +171;Нижняя Салда +171;Нижняя Тура +171;Николаевск +171;Николаевск-на-Амуре +171;Никольск +171;Никольск +171;Никольское +171;Новая Ладога +171;Новая Ляля +171;Новоалександровск +171;Новоалтайск +171;Новоаннинский +171;Нововоронеж +171;Новодвинск +171;Новозыбков +171;Новокубанск +171;Новокузнецк +171;Новокуйбышевск +171;Новомичуринск +171;Новомосковск +171;Новопавловск +171;Новоржев +171;Новороссийск +171;Новосибирск +171;Новосиль +171;Новосокольники +171;Новотроицк +171;Новоузенск +171;Новоульяновск +171;Новоуральск +171;Новохопёрск +171;Новочебоксарск +171;Новочеркасск +171;Новошахтинск +171;Новый Оскол +171;Новый Уренгой +171;Ногинск +171;Нолинск +171;Норильск +171;Ноябрьск +171;Нурлат +171;Нытва +171;Нюрба +171;Нягань +171;Нязепетровск +171;Няндома +171;Облучье +171;Обнинск +171;Обоянь +171;Обь +171;Одинцово +171;Озёрск +171;Озёрск +171;Озёры +171;Октябрьск +171;Октябрьский +171;Окуловка +171;Олёкминск +171;Оленегорск +171;Олонец +171;Омск +171;Омутнинск +171;Онега +171;Опочка +171;Орёл +171;Оренбург +171;Орехово-Зуево +171;Орлов +171;Орск +171;Оса +171;Осинники +171;Осташков +171;Остров +171;Островной +171;Острогожск +171;Отрадное +171;Отрадный +171;Оха +171;Оханск +171;Очёр +171;Павлово +171;Павловск +171;Павловский Посад +171;Палласовка +171;Партизанск +171;Певек +171;Пенза +171;Первомайск +171;Первоуральск +171;Перевоз +171;Пересвет +171;Переславль-Залесский +171;Пермь +171;Пестово +171;Петров Вал +171;Петровск +171;Петровск-Забайкальский +171;Петрозаводск +171;Петропавловск-Камчатский +171;Петухово +171;Петушки +171;Печора +171;Печоры +171;Пикалёво +171;Пионерский +171;Питкяранта +171;Плавск +171;Пласт +171;Плёс +171;Поворино +171;Подольск +171;Подпорожье +171;Покачи +171;Покров +171;Покровск +171;Полевской +171;Полесск +171;Полысаево +171;Полярные Зори +171;Полярный +171;Поронайск +171;Порхов +171;Похвистнево +171;Почеп +171;Починок +171;Пошехонье +171;Правдинск +171;Приволжск +171;Приморск +171;Приморск +171;Приморско-Ахтарск +171;Приозерск +171;Прокопьевск +171;Пролетарск +171;Протвино +171;Прохладный +171;Псков +171;Пугачёв +171;Пудож +171;Пустошка +171;Пучеж +171;Пушкино +171;Пущино +171;Пыталово +171;Пыть-Ях +171;Пятигорск +171;Радужный +171;Радужный +171;Райчихинск +171;Раменское +171;Рассказово +171;Ревда +171;Реж +171;Реутов +171;Ржев +171;Родники +171;Рославль +171;Россошь +171;Ростов-на-Дону +171;Ростов +171;Рошаль +171;Ртищево +171;Рубцовск +171;Рудня +171;Руза +171;Рузаевка +171;Рыбинск +171;Рыбное +171;Рыльск +171;Ряжск +171;Рязань +171;Сакине призн. +171;Салават +171;Салаир +171;Салехард +171;Сальск +171;Самара +171;Санкт-Петербург +171;Саранск +171;Сарапул +171;Саратов +171;Саров +171;Сасово +171;Сатка +171;Сафоново +171;Саяногорск +171;Саянск +171;Светлогорск +171;Светлоград +171;Светлый +171;Светогорск +171;Свирск +171;Свободный +171;Себеж +171;Севастопольне призн. +171;Северо-Курильск +171;Северобайкальск +171;Северодвинск +171;Североморск +171;Североуральск +171;Северск +171;Севск +171;Сегежа +171;Сельцо +171;Семёнов +171;Семикаракорск +171;Семилуки +171;Сенгилей +171;Серафимович +171;Сергач +171;Сергиев Посад +171;Сердобск +171;Серов +171;Серпухов +171;Сертолово +171;Сибай +171;Сим +171;Симферопольне призн. +171;Сковородино +171;Скопин +171;Славгород +171;Славск +171;Славянск-на-Кубани +171;Сланцы +171;Слободской +171;Слюдянка +171;Смоленск +171;Снежинск +171;Снежногорск +171;Собинка +171;Советск +171;Советск +171;Советск +171;Советская Гавань +171;Советский +171;Сокол +171;Солигалич +171;Соликамск +171;Солнечногорск +171;Соль-Илецк +171;Сольвычегодск +171;Сольцы +171;Сорочинск +171;Сорск +171;Сортавала +171;Сосенский +171;Сосновка +171;Сосновоборск +171;Сосновый Бор +171;Сосногорск +171;Сочи +171;Спас-Деменск +171;Спас-Клепики +171;Спасск +171;Спасск-Дальний +171;Спасск-Рязанский +171;Среднеколымск +171;Среднеуральск +171;Сретенск +171;Ставрополь +171;Старая Купавна +171;Старая Русса +171;Старица +171;Стародуб +171;Старый Крымне призн. +171;Старый Оскол +171;Стерлитамак +171;Стрежевой +171;Строитель +171;Струнино +171;Ступино +171;Суворов +171;Судакне призн. +171;Суджа +171;Судогда +171;Суздаль +171;Сунжа +171;Суоярви +171;Сураж +171;Сургут +171;Суровикино +171;Сурск +171;Сусуман +171;Сухиничи +171;Сухой Лог +171;Сызрань +171;Сыктывкар +171;Сысерть +171;Сычёвка +171;Сясьстрой +171;Тавда +171;Таганрог +171;Тайга +171;Тайшет +171;Талдом +171;Талица +171;Тамбов +171;Тара +171;Тарко-Сале +171;Таруса +171;Татарск +171;Таштагол +171;Тверь +171;Теберда +171;Тейково +171;Темников +171;Темрюк +171;Терек +171;Тетюши +171;Тимашёвск +171;Тихвин +171;Тихорецк +171;Тобольск +171;Тогучин +171;Тольятти +171;Томари +171;Томмот +171;Томск +171;Топки +171;Торжок +171;Торопец +171;Тосно +171;Тотьма +171;Трёхгорный +171;Троицк +171;Трубчевск +171;Туапсе +171;Туймазы +171;Тула +171;Тулун +171;Туран +171;Туринск +171;Тутаев +171;Тында +171;Тырныауз +171;Тюкалинск +171;Тюмень +171;Уварово +171;Углегорск +171;Углич +171;Удачный +171;Удомля +171;Ужур +171;Узловая +171;Улан-Удэ +171;Ульяновск +171;Унеча +171;Урай +171;Урень +171;Уржум +171;Урус-Мартан +171;Урюпинск +171;Усинск +171;Усмань +171;Усолье-Сибирское +171;Усолье +171;Уссурийск +171;Усть-Джегута +171;Усть-Илимск +171;Усть-Катав +171;Усть-Кут +171;Усть-Лабинск +171;Устюжна +171;Уфа +171;Ухта +171;Учалы +171;Уяр +171;Фатеж +171;Феодосияне призн. +171;Фокино +171;Фокино +171;Фролово +171;Фрязино +171;Фурманов +171;Хабаровск +171;Хадыженск +171;Ханты-Мансийск +171;Харабали +171;Харовск +171;Хасавюрт +171;Хвалынск +171;Хилок +171;Химки +171;Холм +171;Холмск +171;Хотьково +171;Цивильск +171;Цимлянск +171;Циолковский +171;Чадан +171;Чайковский +171;Чапаевск +171;Чаплыгин +171;Чебаркуль +171;Чебоксары +171;Чегем +171;Чекалин +171;Челябинск +171;Чердынь +171;Черемхово +171;Черепаново +171;Череповец +171;Черкесск +171;Чёрмоз +171;Черноголовка +171;Черногорск +171;Чернушка +171;Черняховск +171;Чехов +171;Чистополь +171;Чита +171;Чкаловск +171;Чудово +171;Чулым +171;Чусовой +171;Чухлома +171;Шагонар +171;Шадринск +171;Шали +171;Шарыпово +171;Шарья +171;Шатура +171;Шахты +171;Шахунья +171;Шацк +171;Шебекино +171;Шелехов +171;Шенкурск +171;Шилка +171;Шимановск +171;Шиханы +171;Шлиссельбург +171;Шумерля +171;Шумиха +171;Шуя +171;Щёкино +171;Щёлкиноне призн. +171;Щёлково +171;Щигры +171;Щучье +171;Электрогорск +171;Электросталь +171;Электроугли +171;Элиста +171;Энгельс +171;Эртиль +171;Югорск +171;Южа +171;Южно-Сахалинск +171;Южно-Сухокумск +171;Южноуральск +171;Юрга +171;Юрьев-Польский +171;Юрьевец +171;Юрюзань +171;Юхнов +171;Ядрин +171;Якутск +171;Ялтане призн. +171;Ялуторовск +171;Янаул +171;Яранск +171;Яровое +171;Ярославль +171;Ярцево +171;Ясногорск +171;Ясный +171;Яхрома diff --git a/Схема базы.drawio b/Схема базы.drawio new file mode 100644 index 0000000..39a0970 --- /dev/null +++ b/Схема базы.drawio @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +